Compare commits

...

113 commits

Author SHA1 Message Date
vib 75113b3d4f Merge upstream for Peertube federation fix 2023-03-23 12:43:19 +02:00
Johann150 7821bbc28d
add more activitypub details to READING 2023-03-22 23:03:10 +01:00
Johann150 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
Johann150 48363a90ef
client: fix undefined variable in drive component
closes FoundKeyGang/FoundKey#360
2023-03-21 19:25:41 +01:00
Puniko 59da6063cb
client: fix download button in wavesurfer
closes FoundKeyGang/FoundKey#356
2023-03-19 13:05:05 +01:00
Johann150 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
Johann150 7e4148880b
server: improve comments in streaming API 2023-03-19 11:09:56 +01:00
Johann150 806f757cc8
client: remove unused import 2023-03-19 11:00:45 +01:00
Johann150 ed9b9210a9
server: remove some casting to any 2023-03-19 10:45:57 +01:00
Johann150 af49f811c1
client: refactor away a variable 2023-03-19 10:26:51 +01:00
Johann150 5391ae4a1b
client: list custom themes first 2023-03-19 10:26:37 +01:00
Johann150 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
Johann150 742fa37e2b
server: show worker mode in process name
Changelog: Added
2023-03-19 09:39:33 +01:00
Johann150 00332ed37f
client: fix drive file selection
closes FoundKeyGang/FoundKey#358
2023-03-19 09:28:31 +01:00
Johann150 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
Johann150 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
Johann150 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
Johann150 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
Johann150 383ea40704
server: add function to deliver multiple activities to a relay 2023-03-11 22:23:42 +01:00
Johann150 e52cf25489
server: use named export for deleteNote 2023-03-11 09:54:46 +01:00
Johann150 1bce487965
activitypub: allow to group elements for delivery 2023-03-11 09:42:14 +01:00
Johann150 78c93c5539
server: clean up activitypub deliver code 2023-03-11 09:42:14 +01:00
Johann150 2164fda2fb
server: do AP sent statistics in request function 2023-03-11 09:42:05 +01:00
Johann150 180a1c968d
remove unused locale string 2023-03-11 01:15:33 +01:00
Johann150 4f6d6b681e
client: remove unused assets 2023-03-08 22:34:24 +01:00
Johann150 0d470387dd
client: replace misskey icon 2023-03-08 22:32:05 +01:00
Johann150 d0a021c868
client: properly center instance information 2023-03-08 21:22:11 +01:00
Johann150 f455075efc
fixup: add missing import of copyToClipboard
This is a fixup for commit 74c2b79df1.
2023-03-06 00:50:01 +01:00
Johann150 95afbf11ab
client: show follow button when not logged in
Changelog: Added
2023-03-06 00:41:24 +01:00
Johann150 fbfbe4a72e
client: show remote interaction dialog for follow button
Changelog: Fixed
2023-03-06 00:41:16 +01:00
Johann150 57241cdffe
client: remove unused code 2023-03-05 23:35:18 +01:00
Johann150 ba1c4e76b9
client: give instructions on remote interaction
closes FoundKeyGang/FoundKey#279

Changelog: Added
2023-03-05 22:48:57 +01:00
Johann150 8e1adfa03a
reduce remote interact dialog width 2023-03-05 14:26:02 +01:00
Johann150 2759cd8174
fix formatting on remote url link 2023-03-05 14:15:24 +01:00
Johann150 74c2b79df1
remove key-value component from remote interaction dialog 2023-03-05 14:10:41 +01:00
Johann150 79ec44aa2c
fix variable name 2023-03-05 12:24:35 +01:00
Johann150 59a7f10fdc
client: change remote interaction dialog title 2023-03-05 12:15:15 +01:00
Johann150 f2350e6eba
client: add remote interaction dialog 2023-03-04 00:37:28 +01:00
Johann150 49ae56a9e9
client: refactor to pleaseLoginOrRemote 2023-03-04 00:08:12 +01:00
Johann150 5a263ec2c3
client: refactor pleaseLogin to pleaseLoginOrPage 2023-03-04 00:01:17 +01:00
Johann150 559a17cf26
add FIXME comment 2023-03-03 23:54:42 +01:00
Johann150 691c9d4972
fix typo 2023-03-03 23:47:31 +01:00
Johann150 ae1e7883e7
improve docs files 2023-03-03 23:46:45 +01:00
Johann150 ee2860e894
improve docs 2023-03-03 23:36:15 +01:00
Johann150 a750c7ad57
server: remove unused avgColor attribute from types 2023-03-03 21:36:21 +01:00
Johann150 5aa5344f2e
docs: fix schema definitions 2023-03-03 21:12:44 +01:00
Johann150 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
Jeder 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
Norm f68c41dd41 meta: Update Yarn to 3.4.1 2023-02-27 13:00:22 -05:00
Johann150 e2063f4ff9
fix: correctly parse quotes 2023-02-24 23:47:50 +01:00
Jeder a5b0f5cb65
translation: change Polish _lang_ 2023-02-24 21:19:00 +01:00
Johann150 145a949480
client: show own pages as first tab 2023-02-24 20:28:19 +01:00
Johann150 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
Chloe Kudryavtsev 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
Johann150 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
Johann150 c4c97f19b6
client: fix follow requests pagination
Changelog: Fixed
2023-02-24 19:47:52 +01:00
Johann150 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
Johann150 32f4bee5e8
server: fix return of visibilityQuery function 2023-02-21 21:04:38 +01:00
Johann150 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
Johann150 0a7352eda9
server: add diagnostics for failing visibility 2023-02-20 21:08:58 +01:00
Johann150 c777c2ed04
fix: perform visibility query in second stage 2023-02-20 21:08:58 +01:00
Johann150 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
Johann150 73d546372e
refactor: replace import paths containing ../ in API server
This is a big one...
2023-02-19 23:36:15 +01:00
Johann150 e701bdadbe
foundkey.js: adjust API endpoints for user administration 2023-02-19 23:36:14 +01:00
Johann150 2fda599a86
client: adjust API endpoints for user administration 2023-02-19 23:36:13 +01:00
Johann150 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
Johann150 41aa5cd18f
fix typo 2023-02-19 23:32:36 +01:00
Johann150 17c9a9374d
fixup: server: parse quote tag syntax
This is a fixup for commit 5893a44ff5.
2023-02-19 19:41:11 +01:00
Johann150 f207d839c4
fix changelog formatting 2023-02-19 16:55:37 +01:00
Johann150 f103c86d0a
client: show waveform on audio player
Reviewed-on: FoundKeyGang/FoundKey#345
Changelog: Added
2023-02-19 16:25:08 +01:00
Puniko a6461e74d6 yay typo 2023-02-19 15:38:29 +01:00
Puniko 5dd2b9ff61 fix duration format and add hours 2023-02-19 15:36:01 +01:00
Puniko 98acca0a31 instead of ref 2023-02-19 15:27:20 +01:00
Puniko b85e60df0f pause music while seeking 2023-02-19 15:22:53 +01:00
Puniko add309f189 v-else 2023-02-19 15:05:22 +01:00
Johann150 3acf127e1d
client: improved module tracker file detection
Reviewed-on: FoundKeyGang/FoundKey#344
Changelog: Fixed
2023-02-19 15:03:44 +01:00
Puniko 3152630f27 cleanup audioEl and volumechange 2023-02-19 15:03:40 +01:00
Puniko 4de0b4e4ca use includes instead of some 2023-02-19 15:01:23 +01:00
Puniko 2da92eb075 lets do some wavesurfin' :3c 2023-02-19 11:44:18 +01:00
Johann150 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
Puniko eb6dbca9fd additional detection with mime-types in module tracker 2023-02-19 10:29:20 +01:00
Johann150 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
Johann150 89757363f0
fixup: client: display post content behind UI
This is a fixup for commit 2525b59bb6.
2023-02-18 19:11:49 +01:00
Johann150 3e9dd7957d
server: dont error on generating empty RSS feed
Changelog: Fixed
2023-02-18 17:43:27 +01:00
Johann150 0cf8f78e23
client: fix attached files and account switcher combination
fixes FoundKeyGang/FoundKey#342

Changelog: Fixed
2023-02-18 12:30:45 +01:00
Johann150 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
Johann150 2525b59bb6
client: display post content behind UI 2023-02-18 11:17:42 +01:00
Johann150 8993d83114
replace more misskey & github branding 2023-02-17 12:49:04 +01:00
Johann150 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
Johann150 6aeb033507
client: change Misskey to Foundkey 2023-02-16 21:49:02 +01:00
Johann150 acaca35ff7
client: fix authentication error in RSS widgets
closes FoundKeyGang/FoundKey#341

Changelog: Fixed
2023-02-15 20:42:40 +01:00
Johann150 bf445964b5
improve documentation for fetch-rss endpoint
Changelog: Fixed
2023-02-15 20:42:24 +01:00
Johann150 1ffa4b08e0
client: reformat notification component
who the hell is supposed to read this
2023-02-11 19:25:51 +01:00
Johann150 c9d395961e
server: refactor packing User 2023-02-11 19:17:11 +01:00
Johann150 3a7e8cfe50
server: check instance description length limit
Changelog: Fixed
2023-02-11 19:16:28 +01:00
Johann150 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
Johann150 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
Johann150 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
Johann150 7c89e99243
fix registry migration
It can happen that registry items were created at exactly the same time for some reason.
2023-02-11 12:52:28 +01:00
Johann150 6ed13ea9a7
fix typo, the 2nd 2023-02-11 10:23:15 +01:00
Johann150 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
Johann150 d26e2588e3
client: combine selection of files & folders 2022-12-23 02:20:36 +01:00
Johann150 df9064c284
client: remove driveFolderBg theme color
Changelog: Removed
2022-12-23 02:02:20 +01:00
Johann150 f7c4107ca4
client: drive uses grid instead of flexbox 2022-12-22 18:55:06 +01:00
Johann150 c983c4860c
client: use combined drive endpoint 2022-12-22 17:55:13 +01:00
Johann150 d96070bc80
client: fix duplicate folder when creating new folder 2022-12-22 17:32:05 +01:00
Johann150 240cf98920
client: refactor drive drag&drop 2022-12-22 17:06:52 +01:00
Johann150 7b39483966
server: drive endpoint to fetch files and folders
Changelog: Added
2022-12-22 16:46:48 +01:00
436 changed files with 3149 additions and 2550 deletions

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 - path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
spec: "@yarnpkg/plugin-workspace-tools" 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: ### Removed:
- **BREAKING** server: remove Twitter, Github and Discord integrations - **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`, - **BREAKING** server: remove `api/admin/delete-account`,
You should use the API endpoint `admin/accounts/delete` instead. You should use the API endpoint `admin/accounts/delete` instead.
It has the same parameter and the same behaviour. 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/likes`
- `/api/i/gallery/posts` - `/api/i/gallery/posts`
- `/api/users/gallery/posts` - `/api/users/gallery/posts`
- server: remove bios and cli
- server: remove avatarColor and bannerColor properties
- server: remove application level websocket ping - server: remove application level websocket ping
This pinging mechanism was unused in `foundkey-js`, and we expect other usage to be low. 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. You can use the pinging mechanism built into the websocket protocol if you wish.

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). 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). 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. 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. 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/` 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/`. 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. 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/`. 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)`. 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. 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 ### 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. See the [changelog](./CHANGELOG.md) and [roadmap](./ROADMAP.md) for more on what's changed and future plans.
## Documentation ## 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 ## Contributing
If you're interested in helping out with the project, please read the [contributing guide](./CONTRIBUTING.md). 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.

View file

@ -64,6 +64,13 @@ adduser --disabled-password --disabled-login foundkey
- Make sure you set the PostgreSQL and Redis settings correctly. - 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. - 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
Build foundkey with the following: Build foundkey with the following:

View file

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

View file

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

View file

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

View file

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

View file

@ -194,8 +194,8 @@ blockedInstances: "Blockierte Instanzen"
blockedInstancesDescription: "Gib die Hostnamen der Instanzen, welche blockiert werden\ blockedInstancesDescription: "Gib die Hostnamen der Instanzen, welche blockiert werden\
\ sollen, durch Zeilenumbrüche getrennt an. Blockierte Instanzen können mit dieser\ \ sollen, durch Zeilenumbrüche getrennt an. Blockierte Instanzen können mit dieser\
\ Instanz nicht mehr kommunizieren. Hostnamen, die nicht-ASCII-Zeichen enthalten,\ \ Instanz nicht mehr kommunizieren. Hostnamen, die nicht-ASCII-Zeichen enthalten,\
\ müssen zuvor in Punycode umgewandelt werden. Ein Asterisk (*) kann als Platzhalter\ \ müssen zuvor in Punycode umgewandelt werden. Subdomains der aufgelisteten Hostnamen\
\ für beliebig viele Zeichen verwendet werden." \ werden ebenfalls blockiert."
muteAndBlock: "Stummschaltungen und Blockierungen" muteAndBlock: "Stummschaltungen und Blockierungen"
mutedUsers: "Stummgeschaltete Benutzer" mutedUsers: "Stummgeschaltete Benutzer"
blockedUsers: "Blockierte Benutzer" blockedUsers: "Blockierte Benutzer"
@ -337,9 +337,9 @@ pinnedUsers: "Angeheftete Benutzer"
pinnedUsersDescription: "Gib durch Leerzeichen getrennte Benutzer an, die an die \"\ pinnedUsersDescription: "Gib durch Leerzeichen getrennte Benutzer an, die an die \"\
Erkunden\"-Seite angeheftet werden sollen." Erkunden\"-Seite angeheftet werden sollen."
hcaptchaSiteKey: "Site key" hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key" hcaptchaSecretKey: "Geheimer Schlüssel"
recaptchaSiteKey: "Site key" recaptchaSiteKey: "Site-Schlüssel"
recaptchaSecretKey: "Secret key" recaptchaSecretKey: "Geheimer Schlüssel"
antennas: "Antennen" antennas: "Antennen"
manageAntennas: "Antennen verwalten" manageAntennas: "Antennen verwalten"
name: "Name" name: "Name"
@ -693,7 +693,6 @@ editCode: "Code bearbeiten"
apply: "Anwenden" apply: "Anwenden"
receiveAnnouncementFromInstance: "Benachrichtigungen von dieser Instanz empfangen" receiveAnnouncementFromInstance: "Benachrichtigungen von dieser Instanz empfangen"
emailNotification: "Email-Benachrichtigungen" emailNotification: "Email-Benachrichtigungen"
publish: "Veröffentlichen"
useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen" useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen"
typingUsers: "{users} ist/sind am schreiben …" typingUsers: "{users} ist/sind am schreiben …"
jumpToSpecifiedDate: "Zu bestimmtem Datum springen" jumpToSpecifiedDate: "Zu bestimmtem Datum springen"
@ -732,11 +731,7 @@ switch: "Wechseln"
noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert." noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert."
noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert." noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert."
configure: "Konfigurieren" configure: "Konfigurieren"
postToGallery: "Neuen Galeriebeitrag erstellen"
attachmentRequired: "Mindestens 1 Anhang ist erforderlich."
gallery: "Galerie"
recentPosts: "Neue Beiträge" recentPosts: "Neue Beiträge"
popularPosts: "Beliebte Beiträge"
shareWithNote: "Mit Notiz teilen" shareWithNote: "Mit Notiz teilen"
emailNotConfiguredWarning: "Keine Email-Adresse hinterlegt." emailNotConfiguredWarning: "Keine Email-Adresse hinterlegt."
ratio: "Verhältnis" ratio: "Verhältnis"
@ -851,11 +846,6 @@ _forgotPassword:
\ wende dich bitte an den Administrator." \ wende dich bitte an den Administrator."
contactAdmin: "Diese Instanz unterstützt die Verwendung von Email-Adressen nicht.\ contactAdmin: "Diese Instanz unterstützt die Verwendung von Email-Adressen nicht.\
\ Wende dich an den Administrator, um dein Passwort zurückzusetzen." \ 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: _email:
_follow: _follow:
title: "Du hast einen neuen Follower" title: "Du hast einen neuen Follower"
@ -979,9 +969,9 @@ _wordMute:
\ trennen." \ trennen."
muteWordsDescription2: "Umgib Schlüsselworter mit Schrägstrichen, um Reguläre Ausdrücke\ muteWordsDescription2: "Umgib Schlüsselworter mit Schrägstrichen, um Reguläre Ausdrücke\
\ zu verwenden." \ 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." \ 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\ \ der Chronik hinzugefügt werden. Zudem werden diese Notizen auch nicht der Chronik\
\ hinzugefügt, falls die Konditionen geändert werden." \ hinzugefügt, falls die Konditionen geändert werden."
soft: "Leicht" soft: "Leicht"
@ -1083,40 +1073,39 @@ _2fa:
\ deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels\ \ deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels\
\ einrichten." \ einrichten."
_permissions: _permissions:
"read:account": "Deine Benutzerkontoinformationen lesen" "read:account": "Benutzerkonto-Informationen lesen"
"write:account": "Deine Benutzerkontoinformationen bearbeiten" "write:account": "Benutzerkonto-Informationen bearbeiten"
"read:blocks": "Die Liste deiner blockierten Benutzer lesen" "read:blocks": "Liste der blockierten Benutzer lesen"
"write:blocks": "Die Liste deiner blockierten Benutzer bearbeiten" "write:blocks": "Liste der blockierten Benutzer bearbeiten"
"read:drive": "Deine Drive-Dateien und Ordner lesen" "read:drive": "Drive-Dateien und -Ordner auflisten"
"write:drive": "Deine Drive-Dateien und Ordner bearbeiten oder löschen" "write:drive": "Drive-Dateien und -Ordner erstellen, bearbeiten oder löschen"
"read:favorites": "Deine Favoriten-Liste lesen" "read:favorites": "Favorisierte Notizen auflisten"
"write:favorites": "Deine Favoriten-Liste bearbeiten" "write:favorites": "Favorisierung von Notizen hinzufügen oder entfernen"
"read:following": "Die Liste der Benutzer, denen du folgst, lesen" "read:following": "Gefolgte und folgende Benutzer auflisten"
"write:following": "Anderen Benutzern folgen oder entfolgen" "write:following": "Anderen Benutzern folgen oder entfolgen"
"read:messaging": "Chats lesen" "read:messaging": "Chats und Chatverläufe lesen"
"write:messaging": "Chats bedienen" "write:messaging": "Chatnachrichten erstellen oder löschen"
"read:mutes": "Stummschaltungen lesen" "read:mutes": "Stummschaltungen und Renote-Stummschaltungen auflisten"
"write:mutes": "Stummschaltungen bearbeiten" "write:mutes": "Stummschaltungen und Renote-Stummschaltungen bearbeiten"
"write:notes": "Notizen schreiben oder löschen" "write:notes": "Notizen schreiben oder löschen"
"read:notifications": "Benachrichtigungen lesen" "read:notifications": "Benachrichtigungen lesen"
"write:notifications": "Benachrichtigungen bedienen" "write:notifications": "Benachrichtigungen als gelesen markieren oder App-Benachrichtigungen\
"read:reactions": "Reaktionen lesen" \ erstellen"
"write:reactions": "Reaktionen bedienen" "write:reactions": "Reaktionen erstellen oder löschen"
"write:votes": "Umfragen bedienen" "write:votes": "In Umfragen abstimmen"
"read:pages": "Deine Seiten lesen" "read:pages": "Deine Seiten auflisten und lesen"
"write:pages": "Deine Seiten bearbeiten oder löschen" "write:pages": "Seiten erstellen, bearbeiten oder löschen"
"read:page-likes": "Liste der Seiten, die mir gefallen, lesen" "read:page-likes": "Seiten, die mir gefallen, auflisten und auslesen"
"write:page-likes": "Liste der Seiten, die mir gefallen, bearbeiten" "write:page-likes": "\"Gefällt mir\"-Markierung von Seiten bearbeiten"
"read:user-groups": "Benutzergruppen lesen" "read:user-groups": "beigetretene, erstellte und eingeladene Benutzergruppen auflisten\
"write:user-groups": "Benutzergruppen bearbeiten oder löschen" \ und lesen"
"read:channels": "Kanäle lesen" "write:user-groups": "Benutzergruppen erstellen, bearbeiten, löschen, übertragen,\
"write:channels": "Kanäle bedienen" \ zu diesen beitreten oder diese verlassen. Andere Benutzer zu diesen Einladen\
"read:gallery": "Beiträge deiner Galerie lesen" \ oder Benutzer aus diesen Bannen. Einladungen zu Benutzergruppen annehmen oder\
"write:gallery": "Deine Galerie bearbeiten" \ ablehnen."
"read:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge\ "read:channels": "gefolgte und beigetretene Kanäle auflisten und lesen"
\ lesen" "write:channels": "Kanäle erstellen, bearbeiten, diesen folgen und entfolgen"
"write:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge\ "read:reactions": Reaktionen ansehen
\ bearbeiten"
_auth: _auth:
shareAccess: "Möchtest du „{name}“ authorisieren, auf dieses Benutzerkonto zugreifen\ shareAccess: "Möchtest du „{name}“ authorisieren, auf dieses Benutzerkonto zugreifen\
\ zu können?" \ zu können?"
@ -1289,7 +1278,7 @@ _pages:
hideTitleWhenPinned: "Seitentitel wenn angeheftet ausblenden" hideTitleWhenPinned: "Seitentitel wenn angeheftet ausblenden"
font: "Schriftart" font: "Schriftart"
fontSerif: "Serif" fontSerif: "Serif"
fontSansSerif: "Sans Serif" fontSansSerif: "serifenlos"
eyeCatchingImageSet: "Vorschaubild festlegen" eyeCatchingImageSet: "Vorschaubild festlegen"
eyeCatchingImageRemove: "Vorschaubild entfernen" eyeCatchingImageRemove: "Vorschaubild entfernen"
_relayStatus: _relayStatus:
@ -1366,7 +1355,7 @@ confirmToUnclipAlreadyClippedNote: "Diese Notiz ist bereits im \"{name}\" Clip e
noEmailServerWarning: "Es ist kein Email-Server konfiguriert." noEmailServerWarning: "Es ist kein Email-Server konfiguriert."
thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Meldungen vor." thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Meldungen vor."
recommended: "Empfehlung" recommended: "Empfehlung"
check: "Check" check: "Überprüfen"
maxCustomEmojiPicker: Maximale Anzahl vorgeschlagener benutzerdefinierter Emoji maxCustomEmojiPicker: Maximale Anzahl vorgeschlagener benutzerdefinierter Emoji
maxUnicodeEmojiPicker: Maximale Anzahl vorgeschlagener Unicode-Emoji maxUnicodeEmojiPicker: Maximale Anzahl vorgeschlagener Unicode-Emoji
documentation: Dokumentation documentation: Dokumentation
@ -1399,3 +1388,16 @@ selectAll: Alle auswählen
renoteUnmute: Renotes zeigen renoteUnmute: Renotes zeigen
renoteMute: Renotes verstecken renoteMute: Renotes verstecken
externalCssSnippets: Einige CSS-Schnipsel zur Inspiration (nicht durch FoundKey verwaltet) 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.)

View file

@ -88,6 +88,7 @@ youShouldUpgradeClient: "To view this page, please refresh to update your client
enterListName: "Enter a name for the list" enterListName: "Enter a name for the list"
privacy: "Privacy" privacy: "Privacy"
makeFollowManuallyApprove: "Follow requests require approval" makeFollowManuallyApprove: "Follow requests require approval"
botFollowRequiresApproval: "Follow requests from accounts marked as bots require approval"
defaultNoteVisibility: "Default visibility" defaultNoteVisibility: "Default visibility"
follow: "Follow" follow: "Follow"
followRequest: "Send follow request" followRequest: "Send follow request"
@ -709,6 +710,8 @@ botProtection: "Bot Protection"
instanceBlocking: "Blocked Instances" instanceBlocking: "Blocked Instances"
selectAccount: "Select account" selectAccount: "Select account"
switchAccount: "Switch 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" enabled: "Enabled"
disabled: "Disabled" disabled: "Disabled"
quickAction: "Quick actions" quickAction: "Quick actions"
@ -1336,3 +1339,7 @@ _translationService:
_libreTranslate: _libreTranslate:
endpoint: "LibreTranslate API Endpoint" endpoint: "LibreTranslate API Endpoint"
authKey: "LibreTranslate Auth Key (optional)" 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

@ -471,7 +471,7 @@ objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión
objectStorageUseProxy: "Conectarse a través de Proxy" objectStorageUseProxy: "Conectarse a través de Proxy"
objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión\ objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión\
\ de Almacenamiento de objetos" \ 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" showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
newNoteRecived: "Tienes una nota nuevo" newNoteRecived: "Tienes una nota nuevo"
sounds: "Sonidos" sounds: "Sonidos"
@ -675,7 +675,6 @@ editCode: "Editar código"
apply: "Aplicar" apply: "Aplicar"
receiveAnnouncementFromInstance: "Recibir notificaciones de la instancia" receiveAnnouncementFromInstance: "Recibir notificaciones de la instancia"
emailNotification: "Notificaciones por correo electrónico" emailNotification: "Notificaciones por correo electrónico"
publish: "Publicar"
useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu\ useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu\
\ de reacciones" \ de reacciones"
typingUsers: "{users} está escribiendo" typingUsers: "{users} está escribiendo"
@ -713,10 +712,7 @@ switch: "Cambiar"
noMaintainerInformationWarning: "No se ha establecido la información del administrador" noMaintainerInformationWarning: "No se ha establecido la información del administrador"
noBotProtectionWarning: "La protección contra los bots no está configurada" noBotProtectionWarning: "La protección contra los bots no está configurada"
configure: "Configurar" configure: "Configurar"
postToGallery: "Crear una nueva publicación en la galería"
gallery: "Galería"
recentPosts: "Posts recientes" recentPosts: "Posts recientes"
popularPosts: "Más vistos"
shareWithNote: "Compartir con una nota" shareWithNote: "Compartir con una nota"
emailNotConfiguredWarning: "No se ha configurado una dirección de correo electrónico." emailNotConfiguredWarning: "No se ha configurado una dirección de correo electrónico."
ratio: "Proporción" ratio: "Proporción"
@ -768,11 +764,6 @@ _forgotPassword:
contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico,\ 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\ \ póngase en contacto con el administrador de la instancia para restablecer su\
\ contraseña" \ contraseña"
_gallery:
my: "Mi galería"
liked: "Publicaciones que me gustan"
like: "¡Muy bien!"
unlike: "Quitar me gusta"
_email: _email:
_follow: _follow:
title: "te ha seguido" title: "te ha seguido"
@ -794,7 +785,7 @@ _aboutMisskey:
source: "Código fuente" source: "Código fuente"
_nsfw: _nsfw:
respect: "Ocultar medios NSFW" respect: "Ocultar medios NSFW"
ignore: "No esconder medios NSFW " ignore: "No esconder medios NSFW"
force: "Ocultar todos los medios" force: "Ocultar todos los medios"
_mfm: _mfm:
cheatSheet: "Hoja de referencia de MFM" cheatSheet: "Hoja de referencia de MFM"
@ -960,7 +951,6 @@ _permissions:
"write:notes": "Crear/borrar notas" "write:notes": "Crear/borrar notas"
"read:notifications": "Ver notificaciones" "read:notifications": "Ver notificaciones"
"write:notifications": "Administrar notificaciones" "write:notifications": "Administrar notificaciones"
"read:reactions": "Ver reacciones"
"write:reactions": "Administrar reacciones" "write:reactions": "Administrar reacciones"
"write:votes": "Votar" "write:votes": "Votar"
"read:pages": "Ver páginas" "read:pages": "Ver páginas"

View file

@ -71,8 +71,8 @@ importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de t
lists: "Listes" lists: "Listes"
note: "Notes" note: "Notes"
notes: "Notes" notes: "Notes"
following: "Abonnements" following: "Suivis"
followers: "Abonné·e·s" followers: "Vous suivent"
followsYou: "Vous suit" followsYou: "Vous suit"
createList: "Créer une liste" createList: "Créer une liste"
manageLists: "Gérer les listes" manageLists: "Gérer les listes"
@ -88,15 +88,15 @@ youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la
\ mettre votre client à jour." \ mettre votre client à jour."
enterListName: "Nom de la liste" enterListName: "Nom de la liste"
privacy: "Confidentialité" privacy: "Confidentialité"
makeFollowManuallyApprove: "Accepter manuellement les demandes dabonnement" makeFollowManuallyApprove: "Accepter manuellement les demandes de suivi"
defaultNoteVisibility: "Visibilité des notes par défaut" defaultNoteVisibility: "Visibilité des notes par défaut"
follow: "Sabonner" follow: "Suivre"
followRequest: "Demande dabonnement" followRequest: "Demande de suivi"
followRequests: "Demandes dabonnement" followRequests: "Demandes de suivi"
unfollow: "Se désabonner" unfollow: "Ne plus suivre"
followRequestPending: "Demande d'abonnement en attente de confirmation" followRequestPending: "Demande de suivi en attente de confirmation"
renote: "Renoter" renote: "Renoter"
unrenote: "Annuler la Renote" unrenote: "Retirer la renote"
quote: "Citer" quote: "Citer"
pinnedNote: "Note épinglée" pinnedNote: "Note épinglée"
you: "Vous" you: "Vous"
@ -188,7 +188,9 @@ clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider tout le cache de f
\ distants ?" \ distants ?"
blockedInstances: "Instances bloquées" blockedInstances: "Instances bloquées"
blockedInstancesDescription: "Listez les instances que vous désirez bloquer, une par\ 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" muteAndBlock: "Masqué·e·s / Bloqué·e·s"
mutedUsers: "Utilisateur·rice·s en sourdine" mutedUsers: "Utilisateur·rice·s en sourdine"
blockedUsers: "Utilisateur·rice·s bloqué·e·s" blockedUsers: "Utilisateur·rice·s bloqué·e·s"
@ -683,7 +685,6 @@ editCode: "Modifier le code"
apply: "Appliquer" apply: "Appliquer"
receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance" receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance"
emailNotification: "Notifications par mail" emailNotification: "Notifications par mail"
publish: "Public"
useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions" useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions"
typingUsers: "{users} est en train d'écrire..." typingUsers: "{users} est en train d'écrire..."
jumpToSpecifiedDate: "Se rendre à la date" jumpToSpecifiedDate: "Se rendre à la date"
@ -722,10 +723,7 @@ switch: "Remplacer"
noMaintainerInformationWarning: "Informations administrateur non configurées." noMaintainerInformationWarning: "Informations administrateur non configurées."
noBotProtectionWarning: "La protection contre les bots n'est pas configurée." noBotProtectionWarning: "La protection contre les bots n'est pas configurée."
configure: "Configurer" configure: "Configurer"
postToGallery: "Publier dans la galerie"
gallery: "Galerie"
recentPosts: "Les plus récentes" recentPosts: "Les plus récentes"
popularPosts: "Les plus consultées"
shareWithNote: "Partager dans une note" shareWithNote: "Partager dans une note"
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail." emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
ratio: "Ratio" ratio: "Ratio"
@ -831,11 +829,6 @@ _forgotPassword:
contactAdmin: "Cette instance ne permettant pas l'utilisation d'adresses e-mail,\ contactAdmin: "Cette instance ne permettant pas l'utilisation d'adresses e-mail,\
\ prenez contact avec l'administrateur·rice pour procéder à la réinitialisation\ \ prenez contact avec l'administrateur·rice pour procéder à la réinitialisation\
\ de votre mot de passe." \ de votre mot de passe."
_gallery:
my: "Mes publications"
liked: "Publications que j'ai aimées"
like: "J'aime"
unlike: "Je naime pas"
_email: _email:
_follow: _follow:
title: "Vous suit" title: "Vous suit"
@ -1063,38 +1056,34 @@ _2fa:
step2Url: 'Vous pouvez aussi entrer cette URL si vous utilisez un client lourd sur step2Url: 'Vous pouvez aussi entrer cette URL si vous utilisez un client lourd sur
ordinateur :' ordinateur :'
_permissions: _permissions:
"read:account": "Afficher les informations du compte" "read:account": "Lire les informations du compte"
"write:account": "Mettre à jour les informations de votre compte" "write:account": "Mettre à jour les informations du compte"
"read:blocks": "Voir les comptes bloqués" "read:blocks": "Lire les utilisateurs bloqués"
"write:blocks": "Gérer les comptes bloqués" "write:blocks": "Bloquer et Débloquer des comptes"
"read:drive": "Parcourir le Drive" "read:drive": "Lister les fichiers et dossiers du drive"
"write:drive": "Écrire sur le Drive" "write:drive": "Créer, changer et supprimer des fichiers du drive"
"read:favorites": "Afficher les favoris" "read:favorites": "Lister les notes favorites"
"write:favorites": "Gérer les favoris" "write:favorites": "Gérer les notes favorites"
"read:following": "Voir les informations de vos abonnements" "read:following": "Lister les comptes suivis et les comptes qui vous suivent"
"write:following": "Abonnements/Se désabonner" "write:following": "Abonner et désabonner autres comptes"
"read:messaging": "Voir vos discussions" "read:messaging": "Voir vos discussions et leur historique"
"write:messaging": "Gérer les discussions" "write:messaging": "Créer et supprimer les messages des discussions"
"read:mutes": "Voir les comptes masqués" "read:mutes": "Lister les comptes desquels vous masquez les notes ou les renotes"
"write:mutes": "Gérer les comptes masqués" "write:mutes": "Masquer et démasquer les notes ou les renotes des comptes"
"write:notes": "Créer / supprimer des notes" "write:notes": "Gérer les notes"
"read:notifications": "Afficher les notifications" "read:notifications": "Lire vos notifications"
"write:notifications": "Gérer vos notifications" "write:notifications": "Gérer vos notifications et en créer"
"read:reactions": "Lire les réactions" "write:reactions": "Gérer les réactions"
"write:reactions": "Gérer vos réactions" "write:votes": "Voter dans les sondages"
"write:votes": "Voter" "read:pages": "Lister et lire les pages"
"read:pages": "Voir vos pages"
"write:pages": "Gérer les pages" "write:pages": "Gérer les pages"
"read:page-likes": "Voir les mentions « J'aime » des pages" "read:page-likes": "Voir les mentions « J'aime » des pages"
"write:page-likes": "Gérer les mentions « J'aime » sur les pages" "write:page-likes": "Gérer les mentions « J'aime » sur les pages"
"read:user-groups": "Voir les groupes d'utilisateur·rice·s" "read:user-groups": "Voir les groupes d'utilisateur·rice·s"
"write:user-groups": "Éditer les groupes des 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" "write:channels": "Gérer les canaux"
"read:gallery": "Voir la galerie" "read:reactions": Lister les réactions
"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"
_auth: _auth:
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?" shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\ shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\
@ -1393,6 +1382,19 @@ regexpErrorDescription: "Il y a une erreur dans l'expression régulière de la l
\ {line} de vos mots ignorées {tab} :" \ {line} de vos mots ignorées {tab} :"
forwardReportIsAnonymous: Un compte système anonyme sera affiché, à la place de votre forwardReportIsAnonymous: Un compte système anonyme sera affiché, à la place de votre
compte, lors du signalement à l'instance distante. 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 useDrawerReactionPickerForMobile: Sur mobile afficher un tiroir pour le panneau de
réaction 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

@ -495,7 +495,7 @@ ascendingOrder: "Urutkan naik"
descendingOrder: "Urutkan menurun" descendingOrder: "Urutkan menurun"
scratchpad: "Scratchpad" scratchpad: "Scratchpad"
scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScript.\ 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." \ FoundKey."
output: "Keluaran" output: "Keluaran"
updateRemoteUser: "Perbaharui informasi pengguna luar" updateRemoteUser: "Perbaharui informasi pengguna luar"
@ -678,7 +678,6 @@ editCode: "Sunting kode"
apply: "Terapkan" apply: "Terapkan"
receiveAnnouncementFromInstance: "Terima pemberitahuan surel dari instansi ini" receiveAnnouncementFromInstance: "Terima pemberitahuan surel dari instansi ini"
emailNotification: "Pemberitahuan surel" emailNotification: "Pemberitahuan surel"
publish: "Terbitkan"
useReactionPickerForContextMenu: "Buka pemilih reaksi dengan klik-kanan" useReactionPickerForContextMenu: "Buka pemilih reaksi dengan klik-kanan"
typingUsers: "{users} sedang mengetik..." typingUsers: "{users} sedang mengetik..."
jumpToSpecifiedDate: "Loncat ke tanggal spesifik" jumpToSpecifiedDate: "Loncat ke tanggal spesifik"
@ -717,10 +716,7 @@ switch: "Beralih"
noMaintainerInformationWarning: "Informasi pengelola belum disetel." noMaintainerInformationWarning: "Informasi pengelola belum disetel."
noBotProtectionWarning: "Proteksi bot belum disetel." noBotProtectionWarning: "Proteksi bot belum disetel."
configure: "Setel" configure: "Setel"
postToGallery: "Posting ke galeri"
gallery: "Galeri"
recentPosts: "Postingan terbaru" recentPosts: "Postingan terbaru"
popularPosts: "Postingan populer"
shareWithNote: "Bagikan dengan catatan" shareWithNote: "Bagikan dengan catatan"
emailNotConfiguredWarning: "Alamat surel tidak disetel." emailNotConfiguredWarning: "Alamat surel tidak disetel."
ratio: "Rasio" ratio: "Rasio"
@ -829,11 +825,6 @@ _forgotPassword:
\ admin segera." \ admin segera."
contactAdmin: "Instansi ini tidak mendukung menggunakan alamat surel, mohon kontak\ contactAdmin: "Instansi ini tidak mendukung menggunakan alamat surel, mohon kontak\
\ admin untuk mengatur ulang password kamu." \ admin untuk mengatur ulang password kamu."
_gallery:
my: "Postingan saya"
liked: "Postingan yang disukai"
like: "Suka"
unlike: "Hapus suka"
_email: _email:
_follow: _follow:
title: "Mengikuti kamu" title: "Mengikuti kamu"
@ -1076,7 +1067,6 @@ _permissions:
"write:notes": "Buat atau hapus catatan" "write:notes": "Buat atau hapus catatan"
"read:notifications": "Lihat pemberitahuan" "read:notifications": "Lihat pemberitahuan"
"write:notifications": "Sunting pemberitahuan" "write:notifications": "Sunting pemberitahuan"
"read:reactions": "Lihat reaksi"
"write:reactions": "Sunting reaksi" "write:reactions": "Sunting reaksi"
"write:votes": "Beri suara" "write:votes": "Beri suara"
"read:pages": "Lihat halaman" "read:pages": "Lihat halaman"
@ -1087,10 +1077,6 @@ _permissions:
"write:user-groups": "Sunting atau hapus grup pengguna" "write:user-groups": "Sunting atau hapus grup pengguna"
"read:channels": "Lihat saluran" "read:channels": "Lihat saluran"
"write:channels": "Sunting 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: _auth:
shareAccess: "Apakah kamu ingin mengijinkan \"{name}\" untuk mengakses akun ini?" shareAccess: "Apakah kamu ingin mengijinkan \"{name}\" untuk mengakses akun ini?"
shareAccessAsk: "Apakah kamu ingin mengijinkan aplikasi ini untuk mengakses akun\ shareAccessAsk: "Apakah kamu ingin mengijinkan aplikasi ini untuk mengakses akun\
@ -1239,7 +1225,7 @@ _pages:
editPage: "Sunting halaman" editPage: "Sunting halaman"
readPage: "Lihat sumber kode aktif" readPage: "Lihat sumber kode aktif"
created: "Halaman berhasil dibuat" created: "Halaman berhasil dibuat"
updated: "Halaman berhasil diperbaharui!" updated: "Halaman berhasil diperbaharui"
deleted: "Halaman telah dihapus" deleted: "Halaman telah dihapus"
pageSetting: "Pengaturan Halaman" pageSetting: "Pengaturan Halaman"
nameAlreadyExists: "URL Halaman yang ditentukan sudah ada" nameAlreadyExists: "URL Halaman yang ditentukan sudah ada"

View file

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

View file

@ -623,7 +623,6 @@ editCode: "コードを編集"
apply: "適用" apply: "適用"
receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る" receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る"
emailNotification: "メール通知" emailNotification: "メール通知"
publish: "公開"
useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開く" useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開く"
typingUsers: "{users}が入力中" typingUsers: "{users}が入力中"
jumpToSpecifiedDate: "特定の日付にジャンプ" jumpToSpecifiedDate: "特定の日付にジャンプ"
@ -661,10 +660,7 @@ switch: "切り替え"
noMaintainerInformationWarning: "管理者情報が設定されていません。" noMaintainerInformationWarning: "管理者情報が設定されていません。"
noBotProtectionWarning: "Botプロテクションが設定されていません。" noBotProtectionWarning: "Botプロテクションが設定されていません。"
configure: "設定する" configure: "設定する"
postToGallery: "ギャラリーへ投稿"
gallery: "ギャラリー"
recentPosts: "最近の投稿" recentPosts: "最近の投稿"
popularPosts: "人気の投稿"
shareWithNote: "ノートで共有" shareWithNote: "ノートで共有"
emailNotConfiguredWarning: "メールアドレスの設定がされていません。" emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
ratio: "比率" ratio: "比率"
@ -776,12 +772,6 @@ _forgotPassword:
ifNoEmail: "メールアドレスを登録していない場合は、管理者までお問い合わせください。" ifNoEmail: "メールアドレスを登録していない場合は、管理者までお問い合わせください。"
contactAdmin: "このインスタンスではメールがサポートされていないため、パスワードリセットを行う場合は管理者までお問い合わせください。" contactAdmin: "このインスタンスではメールがサポートされていないため、パスワードリセットを行う場合は管理者までお問い合わせください。"
_gallery:
my: "自分の投稿"
liked: "いいねした投稿"
like: "いいね!"
unlike: "いいね解除"
_email: _email:
_follow: _follow:
title: "フォローされました" title: "フォローされました"
@ -1006,7 +996,6 @@ _permissions:
"write:notes": "ノートを作成・削除する" "write:notes": "ノートを作成・削除する"
"read:notifications": "通知を見る" "read:notifications": "通知を見る"
"write:notifications": "通知を操作する" "write:notifications": "通知を操作する"
"read:reactions": "リアクションを見る"
"write:reactions": "リアクションを操作する" "write:reactions": "リアクションを操作する"
"write:votes": "投票する" "write:votes": "投票する"
"read:pages": "ページを見る" "read:pages": "ページを見る"
@ -1017,11 +1006,6 @@ _permissions:
"write:user-groups": "ユーザーグループを操作する" "write:user-groups": "ユーザーグループを操作する"
"read:channels": "チャンネルを見る" "read:channels": "チャンネルを見る"
"write:channels": "チャンネルを操作する" "write:channels": "チャンネルを操作する"
"read:gallery": "ギャラリーを見る"
"write:gallery": "ギャラリーを操作する"
"read:gallery-likes": "ギャラリーのいいねを見る"
"write:gallery-likes": "ギャラリーのいいねを操作する"
_auth: _auth:
shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?" shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?"
shareAccessAsk: "アカウントへのアクセスを許可しますか?" shareAccessAsk: "アカウントへのアクセスを許可しますか?"

View file

@ -74,10 +74,6 @@ somethingHappened: "なんかアカンことが起こったで"
retry: "もっぺんやる?" retry: "もっぺんやる?"
pageLoadError: "ページの読み込みに失敗してしもうたで…" pageLoadError: "ページの読み込みに失敗してしもうたで…"
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?" 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: "リスト名を入れてや" enterListName: "リスト名を入れてや"
privacy: "プライバシー" privacy: "プライバシー"
makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする" makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする"
@ -126,9 +122,6 @@ flagAsBot: "Botやで"
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、FoundKeyのシステム上での扱いがBotに合ったもんになるんやで。" flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、FoundKeyのシステム上での扱いがBotに合ったもんになるんやで。"
flagAsCat: "Catやで" flagAsCat: "Catやで"
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?" 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: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく" autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
addAccount: "アカウントを追加" addAccount: "アカウントを追加"
loginFailed: "ログインに失敗してしもうた…" loginFailed: "ログインに失敗してしもうた…"
@ -209,9 +202,6 @@ resetAreYouSure: "リセットしてええん?"
saved: "保存したで!" saved: "保存したで!"
messaging: "チャット" messaging: "チャット"
upload: "アップロード" 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: "ドライブから" fromDrive: "ドライブから"
fromUrl: "URLから" fromUrl: "URLから"
uploadFromUrl: "URLアップロード" uploadFromUrl: "URLアップロード"
@ -380,7 +370,7 @@ onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファ
signinRequired: "ログインしてくれへん?" signinRequired: "ログインしてくれへん?"
invitationCode: "招待コード" invitationCode: "招待コード"
checking: "確認しとるで" checking: "確認しとるで"
available: "利用できる\n" available: "利用できる"
unavailable: "利用できん" unavailable: "利用できん"
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで" usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで"
tooShort: "短すぎやろ!" tooShort: "短すぎやろ!"
@ -561,8 +551,6 @@ administration: "管理"
hashtags: "ハッシュタグ" hashtags: "ハッシュタグ"
hide: "隠す" hide: "隠す"
indefinitely: "無期限" indefinitely: "無期限"
_gallery:
unlike: "良くないわ"
_email: _email:
_follow: _follow:
title: "フォローされたで" title: "フォローされたで"
@ -656,7 +644,6 @@ _tutorial:
_2fa: _2fa:
alreadyRegistered: "もう設定終わっとるわ。" alreadyRegistered: "もう設定終わっとるわ。"
_permissions: _permissions:
"read:reactions": "リアクションを見る"
"write:votes": "投票する" "write:votes": "投票する"
"read:pages": "ページを見る" "read:pages": "ページを見る"
"read:page-likes": "ページのええやんを見る" "read:page-likes": "ページのええやんを見る"
@ -697,7 +684,7 @@ _widgets:
aiscript: "AiScriptコンソール" aiscript: "AiScriptコンソール"
_cw: _cw:
hide: "隠す" hide: "隠す"
show: "続き見して" show: "続き見して"
chars: "{count}文字" chars: "{count}文字"
files: "{count}ファイル" files: "{count}ファイル"
_poll: _poll:

View file

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

View file

@ -10,7 +10,7 @@ notifications: "Meldingen"
username: "Gebruikersnaam" username: "Gebruikersnaam"
password: "Wachtwoord" password: "Wachtwoord"
forgotPassword: "Wachtwoord vergeten" forgotPassword: "Wachtwoord vergeten"
fetchingAsApObject: "Ophalen vanuit de Fediverse" fetchingAsApObject: "Ophalen vanuit de Fediverse..."
ok: "Ok" ok: "Ok"
gotIt: "Begrepen" gotIt: "Begrepen"
cancel: "Annuleren" 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." \ Je verliest alle reacties, herdelingen en antwoorden erop."
addToList: "Aan lijst toevoegen" addToList: "Aan lijst toevoegen"
sendMessage: "Verstuur bericht" sendMessage: "Verstuur bericht"
copyUsername: "Kopiëren gebruikersnaam " copyUsername: "Kopiëren gebruikersnaam"
reply: "Antwoord" reply: "Antwoord"
loadMore: "Laad meer" loadMore: "Laad meer"
showMore: "Toon meer" showMore: "Toon meer"
@ -222,7 +222,7 @@ keepOriginalUploadingDescription: "Bewaar de originele versie bij het uploaden v
\ afbeeldingen. Indien uitgeschakeld, wordt bij het uploaden een alternatieve versie\ \ afbeeldingen. Indien uitgeschakeld, wordt bij het uploaden een alternatieve versie\
\ voor webpublicatie genereert." \ voor webpublicatie genereert."
fromDrive: "Van schijf" fromDrive: "Van schijf"
fromUrl: "Van URL" fromUrl: "Van URL"
uploadFromUrl: "Uploaden vanaf een URL" uploadFromUrl: "Uploaden vanaf een URL"
uploadFromUrlDescription: "URL van het bestand dat je wil uploaden" uploadFromUrlDescription: "URL van het bestand dat je wil uploaden"
uploadFromUrlRequested: "Uploadverzoek" uploadFromUrlRequested: "Uploadverzoek"
@ -294,7 +294,7 @@ smtpUser: "Gebruikersnaam"
smtpPass: "Wachtwoord" smtpPass: "Wachtwoord"
clearCache: "Cache opschonen" clearCache: "Cache opschonen"
user: "Gebruikers" user: "Gebruikers"
muteThread: "Discussies dempen " muteThread: "Discussies dempen"
unmuteThread: "Dempen van discussie ongedaan maken" unmuteThread: "Dempen van discussie ongedaan maken"
hide: "Verbergen" hide: "Verbergen"
cropImage: "Afbeelding bijsnijden" cropImage: "Afbeelding bijsnijden"

View file

@ -1,10 +1,9 @@
_lang_: "język polski" _lang_: "Polski"
headlineMisskey: "Sieć połączona wpisami" headlineMisskey: "Sieć połączona wpisami"
introMisskey: "FoundKey jest serwisem mikroblogowym typu open source.\nFoundKey to\ introMisskey: "Witaj! FoundKey jest otwartoźródłowym serwisem mikroblogowym.\nTwórz\
\ opensource'owy serwis mikroblogowy, w którym możesz tworzyć \"notatki\", aby dzielić\ \ \"wpisy\", aby dzielić się tym, co się dzieje i opowiadać wszystkim o sobie. \U0001F4E1\
\ się tym, co się dzieje i opowiadać wszystkim o sobie.\nMożesz również użyć funkcji\ \nMożesz również użyć \"reakcji\", aby szybko wyrazić swoje uczucia dotyczące wpisów\
\ \"Reakcje\", aby szybko dodać własne reakcje do notatek innych użytkowników\U0001F44D\ \ innych użytkowników. \U0001F44D\nOdkrywaj nowy świat! \U0001F680"
.\nOdkrywaj nowy świat\U0001F680!"
monthAndDay: "{month}-{day}" monthAndDay: "{month}-{day}"
search: "Szukaj" search: "Szukaj"
notifications: "Powiadomienia" notifications: "Powiadomienia"
@ -15,7 +14,7 @@ fetchingAsApObject: "Pobieranie z Fediwersum…"
ok: "OK" ok: "OK"
gotIt: "Rozumiem!" gotIt: "Rozumiem!"
cancel: "Anuluj" cancel: "Anuluj"
renotedBy: "Udostępniono przez {user}" renotedBy: "Podbito przez {user}"
noNotes: "Brak wpisów" noNotes: "Brak wpisów"
noNotifications: "Brak powiadomień" noNotifications: "Brak powiadomień"
instance: "Instancja" instance: "Instancja"
@ -43,7 +42,7 @@ copyLink: "Skopiuj odnośnik"
delete: "Usuń" delete: "Usuń"
deleteAndEdit: "Usuń i edytuj" deleteAndEdit: "Usuń i edytuj"
deleteAndEditConfirm: "Czy na pewno chcesz usunąć ten wpis i zedytować go? Utracisz\ 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" addToList: "Dodaj do listy"
sendMessage: "Wyślij wiadomość" sendMessage: "Wyślij wiadomość"
copyUsername: "Kopiuj nazwę użytkownika" copyUsername: "Kopiuj nazwę użytkownika"
@ -92,8 +91,8 @@ followRequest: "Poproś o możliwość obserwacji"
followRequests: "Prośby o możliwość obserwacji" followRequests: "Prośby o możliwość obserwacji"
unfollow: "Przestań obserwować" unfollow: "Przestań obserwować"
followRequestPending: "Oczekująca prośba o możliwość obserwacji" followRequestPending: "Oczekująca prośba o możliwość obserwacji"
renote: "Udostępnij" renote: "Podbij"
unrenote: "Cofnij udostępnienie" unrenote: "Cofnij podbicie"
quote: "Cytuj" quote: "Cytuj"
pinnedNote: "Przypięty wpis" pinnedNote: "Przypięty wpis"
you: "Ty" you: "Ty"
@ -128,7 +127,7 @@ emojis: "Emoji"
addEmoji: "Dodaj emoji" addEmoji: "Dodaj emoji"
cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej" cacheRemoteFiles: "Przechowuj zdalne pliki w pamięci podręcznej"
cacheRemoteFilesDescription: "Gdy ta opcja jest wyłączona, zdalne pliki są ładowane\ 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." \ dyskowej, ale zwiększy transfer, ponieważ miniaturki nie będą generowane."
flagAsBot: "To konto jest botem" flagAsBot: "To konto jest botem"
flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw\ flagAsBotDescription: "Jeżeli ten kanał jest kontrolowany przez jakiś program, ustaw\
@ -579,9 +578,9 @@ manageAccessTokens: "Zarządzaj tokenami dostępu"
accountInfo: "Informacje o koncie" accountInfo: "Informacje o koncie"
notesCount: "Liczba wpisów" notesCount: "Liczba wpisów"
repliesCount: "Liczba wysłanych odpowiedzi" repliesCount: "Liczba wysłanych odpowiedzi"
renotesCount: "Liczba wysłanych udostępnień" renotesCount: "Liczba wysłanych podbić"
repliedCount: "Liczba otrzymanych odpowiedzi" repliedCount: "Liczba otrzymanych odpowiedzi"
renotedCount: "Liczba otrzymanych udostępnień" renotedCount: "Liczba otrzymanych podbić"
followingCount: "Liczba obserwowanych kont" followingCount: "Liczba obserwowanych kont"
followersCount: "Liczba obserwujących" followersCount: "Liczba obserwujących"
sentReactionsCount: "Liczba wysłanych reakcji" sentReactionsCount: "Liczba wysłanych reakcji"
@ -639,7 +638,6 @@ editCode: "Edytuj kod"
apply: "Zastosuj" apply: "Zastosuj"
receiveAnnouncementFromInstance: "Otrzymuj powiadomienia e-mail z tej instancji" receiveAnnouncementFromInstance: "Otrzymuj powiadomienia e-mail z tej instancji"
emailNotification: "Powiadomienia e-mail" emailNotification: "Powiadomienia e-mail"
publish: "Publikuj"
useReactionPickerForContextMenu: "Otwórz wybornik reakcji prawym kliknięciem" useReactionPickerForContextMenu: "Otwórz wybornik reakcji prawym kliknięciem"
typingUsers: "{users} pisze(-ą)..." typingUsers: "{users} pisze(-ą)..."
jumpToSpecifiedDate: "Przejdź do określonej daty" jumpToSpecifiedDate: "Przejdź do określonej daty"
@ -677,10 +675,7 @@ switch: "Przełącz"
noMaintainerInformationWarning: "Informacje o administratorze nie są skonfigurowane." noMaintainerInformationWarning: "Informacje o administratorze nie są skonfigurowane."
noBotProtectionWarning: "Zabezpieczenie przed botami nie jest skonfigurowane." noBotProtectionWarning: "Zabezpieczenie przed botami nie jest skonfigurowane."
configure: "Skonfiguruj" configure: "Skonfiguruj"
postToGallery: "Opublikuj w galerii"
gallery: "Galeria"
recentPosts: "Ostatnie wpisy" recentPosts: "Ostatnie wpisy"
popularPosts: "Popularne wpisy"
shareWithNote: "Udostępnij z wpisem" shareWithNote: "Udostępnij z wpisem"
emailNotConfiguredWarning: "Nie podano adresu e-mail" emailNotConfiguredWarning: "Nie podano adresu e-mail"
ratio: "Stosunek" ratio: "Stosunek"
@ -700,11 +695,6 @@ _forgotPassword:
\ z administratorem zamiast tego." \ z administratorem zamiast tego."
contactAdmin: "Jeżeli Twoja instancja nie obsługuje adresów e-mail, skontaktuj się\ contactAdmin: "Jeżeli Twoja instancja nie obsługuje adresów e-mail, skontaktuj się\
\ zamiast tego z administratorem, aby zresetować hasło." \ zamiast tego z administratorem, aby zresetować hasło."
_gallery:
my: "Moja galeria"
liked: "Polubione wpisy"
like: "Polub"
unlike: "Cofnij polubienie"
_email: _email:
_follow: _follow:
title: "Zaobserwował(a) Cię" title: "Zaobserwował(a) Cię"
@ -859,7 +849,6 @@ _permissions:
"write:mutes": "Edycja listy osób, które wyciszyłeś(-aś)" "write:mutes": "Edycja listy osób, które wyciszyłeś(-aś)"
"read:notifications": "Wyświetlanie powiadomień" "read:notifications": "Wyświetlanie powiadomień"
"write:notifications": "Działanie na powiadomieniach" "write:notifications": "Działanie na powiadomieniach"
"read:reactions": "Wyświetlanie reakcji"
"write:reactions": "Edycja reakcji" "write:reactions": "Edycja reakcji"
"write:votes": "Głosowanie w ankiecie" "write:votes": "Głosowanie w ankiecie"
"read:pages": "Wyświetlanie Twoich stron" "read:pages": "Wyświetlanie Twoich stron"
@ -976,8 +965,8 @@ _pages:
newPage: "Utwórz stronę" newPage: "Utwórz stronę"
editPage: "Edytuj tę stronę" editPage: "Edytuj tę stronę"
readPage: "Aktywowano widok źródła" readPage: "Aktywowano widok źródła"
created: "Pomyślnie utworzono stronę!" created: "Pomyślnie utworzono stronę"
updated: "Pomyślnie zaktualizowano stronę!" updated: "Pomyślnie zaktualizowano stronę"
deleted: "Strona została usunięta" deleted: "Strona została usunięta"
pageSetting: "Ustawienia strony" pageSetting: "Ustawienia strony"
nameAlreadyExists: "Określony adres URL strony już istnieje" nameAlreadyExists: "Określony adres URL strony już istnieje"
@ -1056,3 +1045,12 @@ _deck:
mentions: "Wspomnienia" mentions: "Wspomnienia"
direct: "Bezpośredni" direct: "Bezpośredni"
_services: {} _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

View file

@ -341,7 +341,7 @@ connectedTo: "Вы подключены к следующим аккаунтам
notesAndReplies: "Заметки и ответы" notesAndReplies: "Заметки и ответы"
withFiles: "Заметки с файлами" withFiles: "Заметки с файлами"
silence: "Заглушить" silence: "Заглушить"
silenceConfirm: " Заглушить этого пользователя? Уверены?" silenceConfirm: "Заглушить этого пользователя? Уверены?"
unsilence: "Снять глушение" unsilence: "Снять глушение"
unsilenceConfirm: "Снять глушение с этого пользователя? Уверены?" unsilenceConfirm: "Снять глушение с этого пользователя? Уверены?"
popularUsers: "Популярные пользователи" popularUsers: "Популярные пользователи"
@ -668,7 +668,6 @@ editCode: "Редактировать исходный текст"
apply: "Применить" apply: "Применить"
receiveAnnouncementFromInstance: "Получать оповещения с инстанса" receiveAnnouncementFromInstance: "Получать оповещения с инстанса"
emailNotification: "Уведомления по электронной почте" emailNotification: "Уведомления по электронной почте"
publish: "Опубликовать"
useReactionPickerForContextMenu: "Открывать палитру реакций правой кнопкой" useReactionPickerForContextMenu: "Открывать палитру реакций правой кнопкой"
typingUsers: "Стук клавиш. Это {users}…" typingUsers: "Стук клавиш. Это {users}…"
jumpToSpecifiedDate: "Перейти к заданной дате" jumpToSpecifiedDate: "Перейти к заданной дате"
@ -707,10 +706,7 @@ switch: "Переключение"
noMaintainerInformationWarning: "Не заполнены сведения об администраторах" noMaintainerInformationWarning: "Не заполнены сведения об администраторах"
noBotProtectionWarning: "Ботозащита не настроена" noBotProtectionWarning: "Ботозащита не настроена"
configure: "Настроить" configure: "Настроить"
postToGallery: "Опубликовать в галерею"
gallery: "Галерея"
recentPosts: "Недавние публикации" recentPosts: "Недавние публикации"
popularPosts: "Популярные публикации"
shareWithNote: "Поделиться заметкой" shareWithNote: "Поделиться заметкой"
emailNotConfiguredWarning: "Не указан адрес электронной почты" emailNotConfiguredWarning: "Не указан адрес электронной почты"
ratio: "Соотношение" ratio: "Соотношение"
@ -805,11 +801,6 @@ _forgotPassword:
\ ресурса, чтобы сменить пароль." \ ресурса, чтобы сменить пароль."
contactAdmin: "Здесь не используются адреса электронной почты, так что свяжитесь\ contactAdmin: "Здесь не используются адреса электронной почты, так что свяжитесь\
\ с администратором, чтобы поменять пароль." \ с администратором, чтобы поменять пароль."
_gallery:
my: "Личная"
liked: "Понравившееся"
like: "Нравится!"
unlike: "Отменить «нравится»"
_email: _email:
_follow: _follow:
title: "Новый подписчик" title: "Новый подписчик"
@ -1004,7 +995,7 @@ _tutorial:
step5_3: "Чтобы подписаться на кого-нибудь, щёлкните по его аватару и в открывшемся\ step5_3: "Чтобы подписаться на кого-нибудь, щёлкните по его аватару и в открывшемся\
\ профиле нажмите кнопку «Подписаться»." \ профиле нажмите кнопку «Подписаться»."
step5_4: "Некоторые пользователи (около их имени «висит замок») вручную подтверждают\ step5_4: "Некоторые пользователи (около их имени «висит замок») вручную подтверждают\
\ чужие подписки. Так что иногда подписка начинает работать не сразу.\n" \ чужие подписки. Так что иногда подписка начинает работать не сразу."
step6_1: "Если теперь в ленте видны и чужие заметки, значит у вас получилось." step6_1: "Если теперь в ленте видны и чужие заметки, значит у вас получилось."
step6_2: "Здесь можно непринуждённо выразить свои чувства к чьей-то заметке, отметив\ step6_2: "Здесь можно непринуждённо выразить свои чувства к чьей-то заметке, отметив\
\ «реакцию» под ней." \ «реакцию» под ней."
@ -1044,7 +1035,6 @@ _permissions:
"write:notes": "Писать и удалять заметки" "write:notes": "Писать и удалять заметки"
"read:notifications": "Смотреть уведомления" "read:notifications": "Смотреть уведомления"
"write:notifications": "Изменять уведомления" "write:notifications": "Изменять уведомления"
"read:reactions": "Смотреть реакции"
"write:reactions": "Изменять реакции" "write:reactions": "Изменять реакции"
"write:votes": "Голосовать" "write:votes": "Голосовать"
"read:pages": "Смотреть страницы" "read:pages": "Смотреть страницы"
@ -1055,10 +1045,6 @@ _permissions:
"write:user-groups": "Изменять и удалять группы пользователей" "write:user-groups": "Изменять и удалять группы пользователей"
"read:channels": "Смотреть каналы" "read:channels": "Смотреть каналы"
"write:channels": "Изменять каналы" "write:channels": "Изменять каналы"
"read:gallery": "Просмотр галереи"
"write:gallery": "Редактирование галереи"
"read:gallery-likes": "Просмотр списка понравившегося в галерее"
"write:gallery-likes": "Изменение списка понравившегося в галерее"
_auth: _auth:
shareAccess: "Дать доступ для «{name}» к вашей учётной записи?" shareAccess: "Дать доступ для «{name}» к вашей учётной записи?"
shareAccessAsk: "Уверены, что хотите дать приложению доступ к своей учётной записи?" shareAccessAsk: "Уверены, что хотите дать приложению доступ к своей учётной записи?"
@ -1162,7 +1148,7 @@ _profile:
changeAvatar: "Поменять аватар" changeAvatar: "Поменять аватар"
changeBanner: "Поменять изображение в шапке" changeBanner: "Поменять изображение в шапке"
_exportOrImport: _exportOrImport:
allNotes: "Все записи\n" allNotes: "Все записи"
followingList: "Подписки" followingList: "Подписки"
muteList: "Скрытые" muteList: "Скрытые"
blockingList: "Заблокированные" blockingList: "Заблокированные"

View file

@ -661,7 +661,6 @@ editCode: "Upraviť kód"
apply: "Použiť" apply: "Použiť"
receiveAnnouncementFromInstance: "Prijať notifikácie z tohoto servera" receiveAnnouncementFromInstance: "Prijať notifikácie z tohoto servera"
emailNotification: "Emailové upozornenia" emailNotification: "Emailové upozornenia"
publish: "Zverejniť"
useReactionPickerForContextMenu: "Otvoriť výber reakcií na pravý klik" useReactionPickerForContextMenu: "Otvoriť výber reakcií na pravý klik"
typingUsers: "{users} píše/u" typingUsers: "{users} píše/u"
jumpToSpecifiedDate: "Skočiť na konkrétny dátum" jumpToSpecifiedDate: "Skočiť na konkrétny dátum"
@ -700,10 +699,7 @@ switch: "Prepnúť"
noMaintainerInformationWarning: "Informácie správcu nie sú nastavené." noMaintainerInformationWarning: "Informácie správcu nie sú nastavené."
noBotProtectionWarning: "Ochrana proti botom nie je nastavená." noBotProtectionWarning: "Ochrana proti botom nie je nastavená."
configure: "Konfigurovať" configure: "Konfigurovať"
postToGallery: "Vytvoriť nový príspevok v galérii"
gallery: "Galéria"
recentPosts: "Najnovšie príspevky" recentPosts: "Najnovšie príspevky"
popularPosts: "Populárne príspevky"
shareWithNote: "Zdieľať s poznámkou" shareWithNote: "Zdieľať s poznámkou"
emailNotConfiguredWarning: "Nie je nastavená emailová adresa." emailNotConfiguredWarning: "Nie je nastavená emailová adresa."
ratio: "Pomer" ratio: "Pomer"
@ -804,11 +800,6 @@ _forgotPassword:
ifNoEmail: "Ak ste pri registrácii nepoužili email, prosím kontaktujte administrátora." 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\ contactAdmin: "Tento server nepodporuje používanie emailových adries, prosím kontaktuje\
\ administrátor, ktorý vám resetuje heslo." \ 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: _email:
_follow: _follow:
title: "Máte nového sledujúceho" title: "Máte nového sledujúceho"
@ -1039,7 +1030,6 @@ _permissions:
"write:notes": "Písať alebo odstrániť poznámky" "write:notes": "Písať alebo odstrániť poznámky"
"read:notifications": "Vidieť vaše oznámenia" "read:notifications": "Vidieť vaše oznámenia"
"write:notifications": "Pracovať s vašimi notifikáciami" "write:notifications": "Pracovať s vašimi notifikáciami"
"read:reactions": "Vidieť vaše reakcie"
"write:reactions": "Upravovať vaše reakcie" "write:reactions": "Upravovať vaše reakcie"
"write:votes": "Hlasovať v hlasovaniach" "write:votes": "Hlasovať v hlasovaniach"
"read:pages": "Vidieť vaše stránky" "read:pages": "Vidieť vaše stránky"
@ -1050,10 +1040,6 @@ _permissions:
"write:user-groups": "Upraviť alebo odstrániť vaše skupiny" "write:user-groups": "Upraviť alebo odstrániť vaše skupiny"
"read:channels": "Čítať vaše kanály" "read:channels": "Čítať vaše kanály"
"write:channels": "Upravovať 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: _auth:
shareAccess: "Prajete si povoliť \"{name}\", aby mal prístup k tomuto účtu?" shareAccess: "Prajete si povoliť \"{name}\", aby mal prístup k tomuto účtu?"
shareAccessAsk: "Naozaj chcete povoliť tejto aplikácii prístup k tomuto účtu?" shareAccessAsk: "Naozaj chcete povoliť tejto aplikácii prístup k tomuto účtu?"
@ -1257,7 +1243,7 @@ _notification:
groupInvited: "Pozvánky do skupín" groupInvited: "Pozvánky do skupín"
app: "Oznámenia z prepojených aplikácií" app: "Oznámenia z prepojených aplikácií"
_actions: _actions:
followBack: "Sledovať späť\n" followBack: "Sledovať späť"
reply: "Odpovedať" reply: "Odpovedať"
renote: "Preposlať" renote: "Preposlať"
_deck: _deck:

View file

@ -74,7 +74,7 @@ followers: "Följare"
followsYou: "Följer dig" followsYou: "Följer dig"
createList: "Skapa lista" createList: "Skapa lista"
manageLists: "Hantera lista" manageLists: "Hantera lista"
error: "Fel!" error: "Fel"
somethingHappened: "Ett fel har uppstått" somethingHappened: "Ett fel har uppstått"
retry: "Försök igen" retry: "Försök igen"
pageLoadError: "Det gick inte att ladda sidan." 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" clearCachedFiles: "Rensa cache"
clearCachedFilesConfirm: "Är du säker att du vill radera alla cachade externa filer?" clearCachedFilesConfirm: "Är du säker att du vill radera alla cachade externa filer?"
blockedInstances: "Blockerade instanser" blockedInstances: "Blockerade instanser"
blockedInstancesDescription: "Lista adressnamn av instanser som du vill blockera.\ blockedInstancesDescription: "Skriv de instansernas domäner som du vill blockera.\
\ Listade instanser kommer inte längre kommunicera med denna instans." \ 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" muteAndBlock: "Tystningar och blockeringar"
mutedUsers: "Tystade användare" mutedUsers: "Tystade användare"
blockedUsers: "Blockerade användare" blockedUsers: "Blockerade användare"
noUsers: "Det finns inga användare" noUsers: "Det finns inga användare"
editProfile: "Redigera profil" editProfile: "Redigera profil"
noteDeleteConfirm: "Är du säker på att du vill ta bort denna not?" 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." intro: "FoundKey har installerats! Vänligen skapa en adminanvändare."
done: "Klar" done: "Klar"
processing: "Bearbetar..." processing: "Bearbetar..."
@ -208,7 +210,7 @@ publishing: "Publiceras"
notResponding: "Svarar inte" notResponding: "Svarar inte"
changePassword: "Ändra lösenord" changePassword: "Ändra lösenord"
security: "Säkerhet" security: "Säkerhet"
retypedNotMatch: "Inmatningen matchar inte" retypedNotMatch: "Inmatningen matchar inte."
currentPassword: "Nuvarande lösenord" currentPassword: "Nuvarande lösenord"
newPassword: "Nytt lösenord" newPassword: "Nytt lösenord"
newPasswordRetype: "Bekräfta lösenord" newPasswordRetype: "Bekräfta lösenord"
@ -284,3 +286,35 @@ _deck:
list: "Listor" list: "Listor"
mentions: "Omnämningar" mentions: "Omnämningar"
_services: {} _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" profile: "Profil"
timeline: "Zaman çizelgesi" timeline: "Zaman çizelgesi"
noAccountDescription: "Bu kullanıcı henüz biyografisini yazmadı" noAccountDescription: "Bu kullanıcı henüz biyografisini yazmadı"
login: "Giriş Yap " login: "Giriş Yap"
logout: ıkış Yap" logout: ıkış Yap"
signup: "Kayıt Ol" signup: "Kayıt Ol"
users: "Kullanıcı" users: "Kullanıcı"

View file

@ -183,14 +183,16 @@ clearCachedFiles: "Очистити кеш"
clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?" clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?"
blockedInstances: "Заблоковані інстанси" blockedInstances: "Заблоковані інстанси"
blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені\ blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені\
\ інстанси більше не зможуть спілкуватися з цим інстансом." \ інстанси більше не зможуть спілкуватися з цим інстансом. Назви доменів не в ASCII\
\ кодуванні мають бути вказані в кодуванні punycode. Піддомени вказаних доменів\
\ також будуть заблоковані."
muteAndBlock: "Заглушення і блокування" muteAndBlock: "Заглушення і блокування"
mutedUsers: "Заглушені користувачі" mutedUsers: "Заглушені користувачі"
blockedUsers: "Заблоковані користувачі" blockedUsers: "Заблоковані користувачі"
noUsers: "Немає користувачів" noUsers: "Немає користувачів"
editProfile: "Редагувати обліковий запис" editProfile: "Редагувати обліковий запис"
noteDeleteConfirm: "Ви дійсно хочете видалити цей запис?" noteDeleteConfirm: "Ви дійсно хочете видалити цей запис?"
pinLimitExceeded: "Більше записів не можна закріпити" pinLimitExceeded: "Більше записів закріпити не можна."
intro: "Встановлення FoundKey завершено! Будь ласка, створіть обліковий запис адміністратора." intro: "Встановлення FoundKey завершено! Будь ласка, створіть обліковий запис адміністратора."
done: "Готово" done: "Готово"
processing: "Обробка" processing: "Обробка"
@ -548,7 +550,7 @@ smtpPass: "Пароль"
emptyToDisableSmtpAuth: "Залиште назву користувача і пароль пустими для вимкнення\ emptyToDisableSmtpAuth: "Залиште назву користувача і пароль пустими для вимкнення\
\ підтвердження SMTP" \ підтвердження SMTP"
smtpSecure: "Використовувати безумовне шифрування SSL/TLS для з'єднань SMTP" smtpSecure: "Використовувати безумовне шифрування SSL/TLS для з'єднань SMTP"
smtpSecureInfo: "Вимкніть при використанні STARTTLS " smtpSecureInfo: "Вимкніть при використанні STARTTLS ."
testEmail: "Тестовий email" testEmail: "Тестовий email"
wordMute: "Блокування слів" wordMute: "Блокування слів"
regexpError: "Помилка регулярного виразу" regexpError: "Помилка регулярного виразу"
@ -580,7 +582,7 @@ abuseReports: "Скарги"
reportAbuse: "Поскаржитись" reportAbuse: "Поскаржитись"
reportAbuseOf: "Поскаржитись на {name}" reportAbuseOf: "Поскаржитись на {name}"
fillAbuseReportDescription: "Будь ласка вкажіть подробиці скарги." fillAbuseReportDescription: "Будь ласка вкажіть подробиці скарги."
abuseReported: "Дякуємо, вашу скаргу було відправлено. " abuseReported: "Дякуємо, вашу скаргу було відправлено."
reporter: "Репортер" reporter: "Репортер"
reporteeOrigin: "Про кого повідомлено" reporteeOrigin: "Про кого повідомлено"
reporterOrigin: "Хто повідомив" reporterOrigin: "Хто повідомив"
@ -666,7 +668,6 @@ editCode: "Редагувати вихідний текст"
apply: "Застосувати" apply: "Застосувати"
receiveAnnouncementFromInstance: "Отримувати оповіщення з інстансу" receiveAnnouncementFromInstance: "Отримувати оповіщення з інстансу"
emailNotification: "Сповіщення електронною поштою" emailNotification: "Сповіщення електронною поштою"
publish: "Опублікувати"
useReactionPickerForContextMenu: "Відкривати палітру реакцій правою кнопкою" useReactionPickerForContextMenu: "Відкривати палітру реакцій правою кнопкою"
typingUsers: "Стук клавіш. Це {users}…" typingUsers: "Стук клавіш. Це {users}…"
goBack: "Назад" goBack: "Назад"
@ -678,8 +679,6 @@ hide: "Сховати"
indefinitely: "Ніколи" indefinitely: "Ніколи"
_ffVisibility: _ffVisibility:
public: "Опублікувати" public: "Опублікувати"
_gallery:
unlike: "Не вподобати"
_email: _email:
_follow: _follow:
title: "Новий підписник" title: "Новий підписник"
@ -698,7 +697,7 @@ _nsfw:
ignore: "Не приховувати NSFW медіа" ignore: "Не приховувати NSFW медіа"
force: "Приховувати всі медіа файли" force: "Приховувати всі медіа файли"
_mfm: _mfm:
cheatSheet: " Довідка MFM" cheatSheet: "Довідка MFM"
intro: "MFM це ексклюзивна мова розмітки тексту в FoundKey, яку можна використовувати\ intro: "MFM це ексклюзивна мова розмітки тексту в FoundKey, яку можна використовувати\
\ в багатьох місцях. Тут ви можете переглянути приклади її синтаксису." \ в багатьох місцях. Тут ви можете переглянути приклади її синтаксису."
dummy: "FoundKey розширює світ Федіверсу" dummy: "FoundKey розширює світ Федіверсу"
@ -849,7 +848,7 @@ _tutorial:
step5_4: "Якщо користувач має замок при імені, то йому потрібно буде вручну підтвердити\ step5_4: "Якщо користувач має замок при імені, то йому потрібно буде вручну підтвердити\
\ вашу заявку на підписку." \ вашу заявку на підписку."
step6_1: "Тепер ви повинні бачити записи інших користувачів на вашій стрічці подій." step6_1: "Тепер ви повинні бачити записи інших користувачів на вашій стрічці подій."
step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших\ step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших\
\ користувачів." \ користувачів."
step6_3: "Щоб \"відреагувати\", нажміть на знак плюс \"+\" на записі і виберіть\ step6_3: "Щоб \"відреагувати\", нажміть на знак плюс \"+\" на записі і виберіть\
\ емоджі яким ви хочете \"відреагувати\"." \ емоджі яким ви хочете \"відреагувати\"."
@ -875,7 +874,6 @@ _permissions:
"write:mutes": "Змінювати список ігнорованих" "write:mutes": "Змінювати список ігнорованих"
"write:notes": "Писати і видаляти нотатки" "write:notes": "Писати і видаляти нотатки"
"read:notifications": "Переглядати сповіщення" "read:notifications": "Переглядати сповіщення"
"read:reactions": "Переглядати реакції"
"write:reactions": "Змінювати реакції" "write:reactions": "Змінювати реакції"
"write:votes": "Голосувати в опитуваннях" "write:votes": "Голосувати в опитуваннях"
"read:pages": "Переглядати сторінки" "read:pages": "Переглядати сторінки"
@ -918,7 +916,7 @@ _widgets:
button: "Кнопка" button: "Кнопка"
onlineUsers: "Користувачі онлайн" onlineUsers: "Користувачі онлайн"
jobQueue: "Черга завдань" jobQueue: "Черга завдань"
serverMetric: "Показники сервера " serverMetric: "Показники сервера"
aiscript: "Консоль AiScript" aiscript: "Консоль AiScript"
_cw: _cw:
hide: "Сховати" hide: "Сховати"
@ -1095,3 +1093,26 @@ _deck:
mentions: "Згадки" mentions: "Згадки"
direct: "Особисте" direct: "Особисте"
_services: {} _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

@ -528,7 +528,7 @@ large: "Lớn"
medium: "Vừa" medium: "Vừa"
small: "Nhỏ" small: "Nhỏ"
generateAccessToken: "Tạo mã truy cập" generateAccessToken: "Tạo mã truy cập"
permission: "Cho phép " permission: "Cho phép"
enableAll: "Bật toàn bộ" enableAll: "Bật toàn bộ"
disableAll: "Tắt toàn bộ" disableAll: "Tắt toàn bộ"
tokenRequested: "Cấp quyền truy cập vào tài khoản" tokenRequested: "Cấp quyền truy cập vào tài khoản"
@ -666,7 +666,6 @@ editCode: "Chỉnh sửa mã"
apply: "Áp dụng" apply: "Áp dụng"
receiveAnnouncementFromInstance: "Nhận thông báo từ máy chủ này" receiveAnnouncementFromInstance: "Nhận thông báo từ máy chủ này"
emailNotification: "Thông báo email" emailNotification: "Thông báo email"
publish: "Đăng"
useReactionPickerForContextMenu: "Nhấn chuột phải để mở bộ chọn biểu cảm" useReactionPickerForContextMenu: "Nhấn chuột phải để mở bộ chọn biểu cảm"
typingUsers: "{users} đang nhập…" typingUsers: "{users} đang nhập…"
jumpToSpecifiedDate: "Đến một ngày cụ thể" jumpToSpecifiedDate: "Đến một ngày cụ thể"
@ -704,10 +703,7 @@ switch: "Chuyển đổi"
noMaintainerInformationWarning: "Chưa thiết lập thông tin vận hành." 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." noBotProtectionWarning: "Bảo vệ Bot chưa thiết lập."
configure: "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" recentPosts: "Tút gần đây"
popularPosts: "Tút được xem nhiều nhất"
shareWithNote: "Chia sẻ kèm với tút" shareWithNote: "Chia sẻ kèm với tút"
emailNotConfiguredWarning: "Chưa đặt địa chỉ email." emailNotConfiguredWarning: "Chưa đặt địa chỉ email."
ratio: "Tỷ lệ" ratio: "Tỷ lệ"
@ -810,11 +806,6 @@ _forgotPassword:
\ viên." \ viên."
contactAdmin: "Máy chủ này không hỗ trợ sử dụng địa chỉ email, vui lòng liên hệ\ 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." \ 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: _email:
_follow: _follow:
title: "đã theo dõi bạn" title: "đã theo dõi bạn"
@ -942,7 +933,7 @@ _wordMute:
mutedNotes: "Những tút đã ẩn" mutedNotes: "Những tút đã ẩn"
_instanceMute: _instanceMute:
instanceMuteDescription: "Thao tác này sẽ ẩn mọi tút/lượt đăng lại từ các máy chủ\ 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" instanceMuteDescription2: "Tách bằng cách xuống dòng"
title: "Ẩn tút từ những máy chủ đã liệt kê." title: "Ẩn tút từ những máy chủ đã liệt kê."
heading: "Danh sách những máy chủ bị ẩn" heading: "Danh sách những máy chủ bị ẩn"
@ -1050,7 +1041,6 @@ _permissions:
"write:notes": "Soạn hoặc xóa tút" "write:notes": "Soạn hoặc xóa tút"
"read:notifications": "Xem thông báo của tôi" "read:notifications": "Xem thông báo của tôi"
"write:notifications": "Quản lý 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:reactions": "Sửa lượt biểu cảm của tôi"
"write:votes": "Bình chọn" "write:votes": "Bình chọn"
"read:pages": "Xem trang của tôi" "read:pages": "Xem trang của tôi"
@ -1061,10 +1051,6 @@ _permissions:
"write:user-groups": "Sửa hoặc xóa nhóm của tôi" "write:user-groups": "Sửa hoặc xóa nhóm của tôi"
"read:channels": "Xem kênh của tôi" "read:channels": "Xem kênh của tôi"
"write:channels": "Sửa 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: _auth:
shareAccess: "Bạn có muốn cho phép \"{name}\" truy cập vào tài khoản này không?" 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\ 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

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

View file

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

View file

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

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

@ -5,8 +5,8 @@ export class registryRemoveDomain1675375940759 {
await queryRunner.query(`DROP INDEX "public"."IDX_0a72bdfcdb97c0eca11fe7ecad"`); await queryRunner.query(`DROP INDEX "public"."IDX_0a72bdfcdb97c0eca11fe7ecad"`);
await queryRunner.query(`ALTER TABLE "registry_item" DROP COLUMN "domain"`); await queryRunner.query(`ALTER TABLE "registry_item" DROP COLUMN "domain"`);
await queryRunner.query(`ALTER TABLE "registry_item" ALTER COLUMN "key" TYPE text USING "key"::text`); await queryRunner.query(`ALTER TABLE "registry_item" ALTER COLUMN "key" TYPE text USING "key"::text`);
// delete existing duplicated entries, keeping the latest updated one // delete existing duplicated entries, keeping the latest created one
await queryRunner.query(`DELETE FROM "registry_item" AS "a" WHERE "updatedAt" != (SELECT MAX("updatedAt") FROM "registry_item" AS "b" WHERE "a"."userId" = "b"."userId" AND "a"."key" = "b"."key" AND "a"."scope" = "b"."scope" GROUP BY "userId", "key", "scope")`); await queryRunner.query(`DELETE FROM "registry_item" AS "a" WHERE "id" != (SELECT MAX("id") FROM "registry_item" AS "b" WHERE "a"."userId" = "b"."userId" AND "a"."key" = "b"."key" AND "a"."scope" = "b"."scope" GROUP BY "userId", "key", "scope")`);
await queryRunner.query(`ALTER TABLE "registry_item" ADD CONSTRAINT "UQ_b8d6509f847331273ab99daccc7" UNIQUE ("userId", "key", "scope")`); await queryRunner.query(`ALTER TABLE "registry_item" ADD CONSTRAINT "UQ_b8d6509f847331273ab99daccc7" UNIQUE ("userId", "key", "scope")`);
} }

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

@ -18,7 +18,13 @@ const ev = new Xev();
* Init process * Init process
*/ */
export async function boot(): Promise<void> { 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) { if (cluster.isPrimary || envOption.disableClustering) {
await masterMain(); await masterMain();

View file

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

View file

@ -78,7 +78,7 @@ export class DriveFile {
default: {}, default: {},
comment: 'The any properties of the DriveFile. For example, it includes image width/height.', 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') @Column('boolean')
public storedInternal: boolean; public storedInternal: boolean;

View file

@ -82,17 +82,6 @@ export class Meta {
}) })
public blockedHosts: string[]; 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', { @Column('varchar', {
length: 512, length: 512,
nullable: true, nullable: true,

View file

@ -11,6 +11,7 @@ import { NoteReaction } from '@/models/entities/note-reaction.js';
import { User } from '@/models/entities/user.js'; import { User } from '@/models/entities/user.js';
import { awaitAll } from '@/prelude/await-all.js'; import { awaitAll } from '@/prelude/await-all.js';
import { Users, PollVotes, DriveFiles, NoteReactions, Followings, Polls, Channels } from '../index.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) { async function populatePoll(note: Note, meId: User['id'] | null) {
const poll = await Polls.findOneByOrFail({ noteId: note.id }); 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({ export const NoteRepository = db.getRepository(Note).extend({
async isVisibleForMe(note: Note, meId: User['id'] | null): Promise<boolean> { 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 かつ自分が指定されていなかったら非表示 // visibility が specified かつ自分が指定されていなかったら非表示
if (note.visibility === 'specified') { if (note.visibility === 'specified') {
if (meId == null) { if (meId == null) {
@ -270,6 +271,13 @@ export const NoteRepository = db.getRepository(Note).extend({
}))); })));
// filter out rejected promises, only keep fulfilled values // 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

@ -270,16 +270,14 @@ export const UserRepository = db.getRepository(User).extend({
const followingCount = profile == null ? null : const followingCount = profile == null ? null :
(profile.ffVisibility === 'public') || isMe ? user.followingCount : (profile.ffVisibility === 'public') || isMe ? user.followingCount :
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followingCount : (profile.ffVisibility === 'followers') && relation?.isFollowing ? user.followingCount :
null; null;
const followersCount = profile == null ? null : const followersCount = profile == null ? null :
(profile.ffVisibility === 'public') || isMe ? user.followersCount : (profile.ffVisibility === 'public') || isMe ? user.followersCount :
(profile.ffVisibility === 'followers') && (relation && relation.isFollowing) ? user.followersCount : (profile.ffVisibility === 'followers') && relation?.isFollowing ? user.followersCount :
null; null;
const falsy = opts.detail ? false : undefined;
const packed = { const packed = {
id: user.id, id: user.id,
name: user.name, name: user.name,
@ -287,10 +285,10 @@ export const UserRepository = db.getRepository(User).extend({
host: user.host, host: user.host,
avatarUrl: this.getAvatarUrlSync(user), avatarUrl: this.getAvatarUrlSync(user),
avatarBlurhash: user.avatar?.blurhash || null, avatarBlurhash: user.avatar?.blurhash || null,
isAdmin: user.isAdmin || falsy, isAdmin: user.isAdmin,
isModerator: user.isModerator || falsy, isModerator: user.isModerator,
isBot: user.isBot || falsy, isBot: user.isBot,
isCat: user.isCat || falsy, isCat: user.isCat,
instance: !user.host ? undefined : userInstanceCache.fetch(user.host) instance: !user.host ? undefined : userInstanceCache.fetch(user.host)
.then(instance => !instance ? undefined : { .then(instance => !instance ? undefined : {
name: instance.name, name: instance.name,
@ -312,8 +310,8 @@ export const UserRepository = db.getRepository(User).extend({
bannerUrl: user.banner ? DriveFiles.getPublicUrl(user.banner, false) : null, bannerUrl: user.banner ? DriveFiles.getPublicUrl(user.banner, false) : null,
bannerBlurhash: user.banner?.blurhash || null, bannerBlurhash: user.banner?.blurhash || null,
isLocked: user.isLocked, isLocked: user.isLocked,
isSilenced: user.isSilenced || falsy, isSilenced: user.isSilenced,
isSuspended: user.isSuspended || falsy, isSuspended: user.isSuspended,
description: profile!.description, description: profile!.description,
location: profile!.location, location: profile!.location,
birthday: profile!.birthday, birthday: profile!.birthday,
@ -369,7 +367,7 @@ export const UserRepository = db.getRepository(User).extend({
mutedInstances: profile!.mutedInstances, mutedInstances: profile!.mutedInstances,
mutingNotificationTypes: profile!.mutingNotificationTypes, mutingNotificationTypes: profile!.mutingNotificationTypes,
emailNotificationTypes: profile!.emailNotificationTypes, emailNotificationTypes: profile!.emailNotificationTypes,
showTimelineReplies: user.showTimelineReplies || falsy, showTimelineReplies: user.showTimelineReplies,
federateBlocks: user!.federateBlocks, federateBlocks: user!.federateBlocks,
} : {}), } : {}),

View file

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

View file

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

View file

@ -48,6 +48,7 @@ export const packedNotificationSchema = {
}, },
invitation: { invitation: {
type: 'object', type: 'object',
ref: 'UserGroupInvitation',
optional: true, nullable: true, optional: true, nullable: true,
}, },
body: { 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', type: 'object',
properties: { properties: {
url: { url: {
description: 'URL to a presentation form intended for humans, if available',
type: 'string', type: 'string',
format: 'url', format: 'url',
nullable: true, optional: false, nullable: true, optional: false,
}, },
uri: { uri: {
description: 'ActivityPub `id` of this User',
type: 'string', type: 'string',
format: 'uri', format: 'uri',
nullable: true, optional: false, nullable: true, optional: false,
@ -403,6 +405,24 @@ export const packedMeDetailedOnlySchema = {
items: { items: {
type: 'object', type: 'object',
nullable: false, optional: false, 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 //#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 { registerOrFetchInstanceDoc } from '@/services/register-or-fetch-instance-doc.js';
import Logger from '@/services/logger.js'; import Logger from '@/services/logger.js';
import { Instances } from '@/models/index.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 { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
import { toPuny } from '@/misc/convert-host.js'; import { toPuny } from '@/misc/convert-host.js';
import { StatusError } from '@/misc/fetch.js'; import { StatusError } from '@/misc/fetch.js';
@ -13,8 +12,6 @@ import { DeliverJobData } from '@/queue/types.js';
const logger = new Logger('deliver'); const logger = new Logger('deliver');
let latest: string | null = null;
export default async (job: Bull.Job<DeliverJobData>) => { export default async (job: Bull.Job<DeliverJobData>) => {
const { host } = new URL(job.data.to); const { host } = new URL(job.data.to);
const puny = toPuny(host); const puny = toPuny(host);
@ -22,12 +19,14 @@ export default async (job: Bull.Job<DeliverJobData>) => {
if (await shouldSkipInstance(puny)) return 'skip'; if (await shouldSkipInstance(puny)) return 'skip';
try { try {
if (latest !== (latest = JSON.stringify(job.data.content, null, 2))) { if (Array.isArray(job.data.content)) {
logger.debug(`delivering ${latest}`); 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 // Update stats
registerOrFetchInstanceDoc(host).then(i => { registerOrFetchInstanceDoc(host).then(i => {
Instances.update(i.id, { Instances.update(i.id, {
@ -38,13 +37,7 @@ export default async (job: Bull.Job<DeliverJobData>) => {
}); });
fetchInstanceMetadata(i); fetchInstanceMetadata(i);
instanceChart.requestSent(i.host, true);
apRequestChart.deliverSucc();
federationChart.deliverd(i.host, true);
}); });
return 'Success';
} catch (res) { } catch (res) {
// Update stats // Update stats
registerOrFetchInstanceDoc(host).then(i => { registerOrFetchInstanceDoc(host).then(i => {
@ -53,10 +46,6 @@ export default async (job: Bull.Job<DeliverJobData>) => {
latestStatus: res instanceof StatusError ? res.statusCode : null, latestStatus: res instanceof StatusError ? res.statusCode : null,
isNotResponding: true, isNotResponding: true,
}); });
instanceChart.requestSent(i.host, false);
apRequestChart.deliverFail();
federationChart.deliverd(i.host, false);
}); });
if (res instanceof StatusError) { if (res instanceof StatusError) {
@ -67,7 +56,7 @@ export default async (job: Bull.Job<DeliverJobData>) => {
return `${res.statusCode} ${res.statusMessage}`; return `${res.statusCode} ${res.statusMessage}`;
} }
// 5xx etc. // 5xx etc., throwing an Error will make Bull retry
throw new Error(`${res.statusCode} ${res.statusMessage}`); throw new Error(`${res.statusCode} ${res.statusMessage}`);
} else { } else {
// DNS error, socket error, timeout ... // DNS error, socket error, timeout ...

View file

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

View file

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

View file

@ -1,6 +1,6 @@
import { Notes } from '@/models/index.js'; import { Notes } from '@/models/index.js';
import { CacheableRemoteUser } from '@/models/entities/user.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'; import { IAnnounce, getApId } from '@/remote/activitypub/type.js';
export const undoAnnounce = async (actor: CacheableRemoteUser, activity: IAnnounce): Promise<string> => { 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'; if (!note) return 'skip: no such Announce';
await deleteNote(actor, note); await deleteNotes([note], actor);
return 'ok: deleted'; 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')); 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 // check the urls sequentially and abort early to not do unnecessary HTTP requests
// picks the first one that works // picks the first one that works
for (const uri in uris) { for (const uri of uris) {
const res = await tryResolveNote(uri); const res = await tryResolveNote(uri);
if (res.status === 'ok') { if (res.status === 'ok') {
quote = res.res; quote = res.res;
break; break;
} else if (res.status === 'temperror') {
temperror = true;
} }
} }
if (!quote) { if (!quote && temperror) {
if (results.some(x => x.status === 'temperror')) { // could not resolve quote, try again later
throw new Error('quote resolve failed'); 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; let text: string | null = null;
if (note.source?.mediaType === 'text/x.misskeymarkdown' && typeof note.source.content === 'string') { if (note.source?.mediaType === 'text/x.misskeymarkdown' && typeof note.source.content === 'string') {
text = note.source.content; text = note.source.content;
} else if (typeof note._misskey_content !== 'undefined') {
text = note._misskey_content;
} else if (typeof note.content === 'string') { } else if (typeof note.content === 'string') {
text = fromHtml(note.content, quote?.uri); text = fromHtml(note.content, quote?.uri);
} }

View file

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

View file

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

View file

@ -15,7 +15,6 @@ export const renderLike = async (noteReaction: NoteReaction, note: Note) => {
object: note.uri ? note.uri : `${config.url}/notes/${noteReaction.noteId}`, object: note.uri ? note.uri : `${config.url}/notes/${noteReaction.noteId}`,
... (reaction !== '\u2b50' ? { ... (reaction !== '\u2b50' ? {
content: reaction, content: reaction,
_misskey_reaction: reaction,
} : {}), } : {}),
} as any; } as any;

View file

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

View file

@ -11,7 +11,6 @@ export default async function renderQuestion(user: { id: User['id'] }, note: Not
content: note.text || '', content: note.text || '',
[poll.multiple ? 'anyOf' : 'oneOf']: poll.choices.map((text, i) => ({ [poll.multiple ? 'anyOf' : 'oneOf']: poll.choices.map((text, i) => ({
name: text, name: text,
_misskey_votes: poll.votes[i],
replies: { replies: {
type: 'Collection', type: 'Collection',
totalItems: poll.votes[i], 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 { User } from '@/models/entities/user.js';
import { getResponse } from '@/misc/fetch.js'; import { getResponse } from '@/misc/fetch.js';
import { createSignedPost, createSignedGet } from './ap-request.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> { export async function request(user: { id: User['id'] }, url: string, object: any): Promise<void> {
const body = JSON.stringify(object); const body = JSON.stringify(object);
@ -22,14 +31,28 @@ export async function request(user: { id: User['id'] }, url: string, object: any
}, },
}); });
await getResponse({ const { host } = new URL(url);
url,
method: req.request.method, try {
headers: req.request.headers, await getResponse({
body, url,
// don't allow redirects on the inbox method: req.request.method,
redirect: 'error', 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 { export function getOneApId(value: ApObject): string {
if (Array.isArray(value)) { if (Array.isArray(value)) {
// find the first valid ID // find the first valid ID
for (const id of value) { for (const x of value) {
try { try {
return getApId(x); return getApId(x);
} catch { } catch {
@ -171,7 +171,6 @@ export const isQuestion = (object: IObject): object is IQuestion =>
interface IQuestionChoice { interface IQuestionChoice {
name?: string; name?: string;
replies?: ICollection; replies?: ICollection;
_misskey_votes?: number;
} }
export interface ITombstone extends IObject { export interface ITombstone extends IObject {
type: 'Tombstone'; type: 'Tombstone';
@ -282,7 +281,7 @@ export interface IRemove extends IActivity {
export interface ILike extends IActivity { export interface ILike extends IActivity {
type: 'Like' | 'EmojiReaction' | 'EmojiReact'; type: 'Like' | 'EmojiReaction' | 'EmojiReact';
_misskey_reaction?: string; content?: string;
} }
export interface IAnnounce extends IActivity { export interface IAnnounce extends IActivity {

View file

@ -1,42 +1,17 @@
import { Brackets, SelectQueryBuilder } from 'typeorm'; import { SelectQueryBuilder } from 'typeorm';
import { User } from '@/models/entities/user.js'; 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) { export function visibilityQuery(q: SelectQueryBuilder<Note>, meId?: User['id'] | null = null): SelectQueryBuilder<Note> {
// This code must always be synchronized with the checks in Notes.isVisibleForMe. const superQuery = Notes.createQueryBuilder()
if (me == null) { .from(() => q, 'note');
q.andWhere(new Brackets(qb => { qb
.where("note.visibility = 'public'") if (meId == null) {
.orWhere("note.visibility = 'home'"); superQuery.where('note_visible(note.id, null);');
}));
} else { } else {
const followingQuery = Followings.createQueryBuilder('following') superQuery.where('note_visible(note.id, :meId)', { meId });
.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 });
} }
return q;
} }

View file

@ -2,7 +2,8 @@ import { IdentifiableError } from '@/misc/identifiable-error.js';
import { User } from '@/models/entities/user.js'; import { User } from '@/models/entities/user.js';
import { Note } from '@/models/entities/note.js'; import { Note } from '@/models/entities/note.js';
import { Notes, Users } from '@/models/index.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';
/** /**
* Get note for API processing, taking into account visibility. * Get note for API processing, taking into account visibility.
@ -13,11 +14,10 @@ export async function getNote(noteId: Note['id'], me: { id: User['id'] } | null)
id: noteId, id: noteId,
}); });
generateVisibilityQuery(query, me); const note = await visibilityQuery(query, me).getOne();
const note = await query.getOne();
if (note == null) { 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.'); throw new IdentifiableError('9725d0ce-ba28-4dde-95a7-2cbb2c15de24', 'No such note.');
} }

View file

@ -2,14 +2,10 @@ import { Schema } from '@/misc/schema.js';
import { errors } from './error.js'; import { errors } from './error.js';
import * as ep___admin_meta from './endpoints/admin/meta.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_create from './endpoints/admin/announcements/create.js';
import * as ep___admin_announcements_delete from './endpoints/admin/announcements/delete.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_list from './endpoints/admin/announcements/list.js';
import * as ep___admin_announcements_update from './endpoints/admin/announcements/update.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_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_files from './endpoints/admin/drive/files.js';
import * as ep___admin_drive_showFile from './endpoints/admin/drive/show-file.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_add from './endpoints/admin/relays/add.js';
import * as ep___admin_relays_list from './endpoints/admin/relays/list.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_relays_remove from './endpoints/admin/relays/remove.js';
import * as ep___admin_resetPassword from './endpoints/admin/reset-password.js'; import * as ep___admin_reports_list from './endpoints/admin/reports/list.js';
import * as ep___admin_resolveAbuseUserReport from './endpoints/admin/resolve-abuse-user-report.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_sendEmail from './endpoints/admin/send-email.js';
import * as ep___admin_serverInfo from './endpoints/admin/server-info.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_showModerationLogs from './endpoints/admin/show-moderation-logs.js';
import * as ep___admin_showUser from './endpoints/admin/show-user.js'; import * as ep___admin_users from './endpoints/admin/users.js';
import * as ep___admin_showUsers from './endpoints/admin/show-users.js'; import * as ep___admin_users_create from './endpoints/admin/users/create.js';
import * as ep___admin_silenceUser from './endpoints/admin/silence-user.js'; import * as ep___admin_users_delete from './endpoints/admin/users/delete.js';
import * as ep___admin_suspendUser from './endpoints/admin/suspend-user.js'; import * as ep___admin_users_deleteAllFiles from './endpoints/admin/users/delete-all-files.js';
import * as ep___admin_unsilenceUser from './endpoints/admin/unsilence-user.js'; import * as ep___admin_users_resetPassword from './endpoints/admin/users/reset-password.js';
import * as ep___admin_unsuspendUser from './endpoints/admin/unsuspend-user.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_updateMeta from './endpoints/admin/update-meta.js';
import * as ep___admin_vacuum from './endpoints/admin/vacuum.js'; import * as ep___admin_vacuum from './endpoints/admin/vacuum.js';
import * as ep___announcements from './endpoints/announcements.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___clips_update from './endpoints/clips/update.js';
import * as ep___drive from './endpoints/drive.js'; import * as ep___drive from './endpoints/drive.js';
import * as ep___drive_files from './endpoints/drive/files.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_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_checkExistence from './endpoints/drive/files/check-existence.js';
import * as ep___drive_files_create from './endpoints/drive/files/create.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 = [ const eps = [
['admin/meta', ep___admin_meta], ['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/create', ep___admin_announcements_create],
['admin/announcements/delete', ep___admin_announcements_delete], ['admin/announcements/delete', ep___admin_announcements_delete],
['admin/announcements/list', ep___admin_announcements_list], ['admin/announcements/list', ep___admin_announcements_list],
['admin/announcements/update', ep___admin_announcements_update], ['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/clean-remote-files', ep___admin_drive_cleanRemoteFiles],
['admin/drive/files', ep___admin_drive_files], ['admin/drive/files', ep___admin_drive_files],
['admin/drive/show-file', ep___admin_drive_showFile], ['admin/drive/show-file', ep___admin_drive_showFile],
@ -337,17 +334,21 @@ const eps = [
['admin/relays/add', ep___admin_relays_add], ['admin/relays/add', ep___admin_relays_add],
['admin/relays/list', ep___admin_relays_list], ['admin/relays/list', ep___admin_relays_list],
['admin/relays/remove', ep___admin_relays_remove], ['admin/relays/remove', ep___admin_relays_remove],
['admin/reset-password', ep___admin_resetPassword], ['admin/reports/list', ep___admin_reports_list],
['admin/resolve-abuse-user-report', ep___admin_resolveAbuseUserReport], ['admin/reports/resolve', ep___admin_reports_resolve],
['admin/send-email', ep___admin_sendEmail], ['admin/send-email', ep___admin_sendEmail],
['admin/server-info', ep___admin_serverInfo], ['admin/server-info', ep___admin_serverInfo],
['admin/show-moderation-logs', ep___admin_showModerationLogs], ['admin/show-moderation-logs', ep___admin_showModerationLogs],
['admin/show-user', ep___admin_showUser], ['admin/users', ep___admin_users],
['admin/show-users', ep___admin_showUsers], ['admin/users/create', ep___admin_users_create],
['admin/silence-user', ep___admin_silenceUser], ['admin/users/delete', ep___admin_users_delete],
['admin/suspend-user', ep___admin_suspendUser], ['admin/users/delete-all-files', ep___admin_users_deleteAllFiles],
['admin/unsilence-user', ep___admin_unsilenceUser], ['admin/users/reset-password', ep___admin_users_resetPassword],
['admin/unsuspend-user', ep___admin_unsuspendUser], ['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/update-meta', ep___admin_updateMeta],
['admin/vacuum', ep___admin_vacuum], ['admin/vacuum', ep___admin_vacuum],
['announcements', ep___announcements], ['announcements', ep___announcements],
@ -400,6 +401,7 @@ const eps = [
['clips/update', ep___clips_update], ['clips/update', ep___clips_update],
['drive', ep___drive], ['drive', ep___drive],
['drive/files', ep___drive_files], ['drive/files', ep___drive_files],
['drive/show', ep___drive_show],
['drive/files/attached-notes', ep___drive_files_attachedNotes], ['drive/files/attached-notes', ep___drive_files_attachedNotes],
['drive/files/check-existence', ep___drive_files_checkExistence], ['drive/files/check-existence', ep___drive_files_checkExistence],
['drive/files/create', ep___drive_files_create], ['drive/files/create', ep___drive_files_create],

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -3,8 +3,8 @@ import { db } from '@/db/postgre.js';
import { Emojis, DriveFiles } from '@/models/index.js'; import { Emojis, DriveFiles } from '@/models/index.js';
import { genId } from '@/misc/gen-id.js'; import { genId } from '@/misc/gen-id.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], 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 { uploadFromUrl } from '@/services/drive/upload-from-url.js';
import { publishBroadcastStream } from '@/services/stream.js'; import { publishBroadcastStream } from '@/services/stream.js';
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

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

View file

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

View file

@ -1,5 +1,5 @@
import { createImportCustomEmojisJob } from '@/queue/index.js'; import { createImportCustomEmojisJob } from '@/queue/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
secure: true, secure: true,

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -1,6 +1,6 @@
import { deleteFile } from '@/services/drive/delete-file.js'; import { deleteFile } from '@/services/drive/delete-file.js';
import { DriveFiles } from '@/models/index.js'; import { DriveFiles } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -2,7 +2,7 @@ import { Instances } from '@/models/index.js';
import { toPuny } from '@/misc/convert-host.js'; import { toPuny } from '@/misc/convert-host.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js'; import { fetchInstanceMetadata } from '@/services/fetch-instance-metadata.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import deleteFollowing from '@/services/following/delete.js'; import deleteFollowing from '@/services/following/delete.js';
import { Followings, Users } from '@/models/index.js'; import { Followings, Users } from '@/models/index.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,7 +1,7 @@
import { Instances } from '@/models/index.js'; import { Instances } from '@/models/index.js';
import { toPuny } from '@/misc/convert-host.js'; import { toPuny } from '@/misc/convert-host.js';
import { ApiError } from '@/server/api/error.js'; import { ApiError } from '@/server/api/error.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,5 +1,5 @@
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
requireCredential: true, requireCredential: true,

View file

@ -1,5 +1,5 @@
import { db } from '@/db/postgre.js'; import { db } from '@/db/postgre.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
requireCredential: true, requireCredential: true,

View file

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

View file

@ -1,8 +1,8 @@
import config from '@/config/index.js'; import config from '@/config/index.js';
import { fetchMeta } from '@/misc/fetch-meta.js'; import { fetchMeta } from '@/misc/fetch-meta.js';
import { TranslationService } from '@/models/entities/meta.js'; import { TranslationService } from '@/models/entities/meta.js';
import { translatorAvailable } from '../../common/translator.js'; import { translatorAvailable } from '@/server/api/common/translator.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['meta'], tags: ['meta'],
@ -52,7 +52,7 @@ export const meta = {
}, },
bannerUrl: { bannerUrl: {
type: 'string', type: 'string',
optional: false, nullable: false, optional: false, nullable: true,
}, },
iconUrl: { iconUrl: {
type: 'string', type: 'string',
@ -288,8 +288,6 @@ export default define(meta, paramDef, async () => {
defaultLightTheme: instance.defaultLightTheme, defaultLightTheme: instance.defaultLightTheme,
defaultDarkTheme: instance.defaultDarkTheme, defaultDarkTheme: instance.defaultDarkTheme,
enableEmail: instance.enableEmail, enableEmail: instance.enableEmail,
pinnedPages: instance.pinnedPages,
pinnedClipId: instance.pinnedClipId,
cacheRemoteFiles: instance.cacheRemoteFiles, cacheRemoteFiles: instance.cacheRemoteFiles,
useStarForReactionFallback: instance.useStarForReactionFallback, useStarForReactionFallback: instance.useStarForReactionFallback,

View file

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

View file

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

View file

@ -1,6 +1,6 @@
import { destroy } from '@/queue/index.js'; import { destroy } from '@/queue/index.js';
import { insertModerationLog } from '@/services/insert-moderation-log.js'; import { insertModerationLog } from '@/services/insert-moderation-log.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { URL } from 'node:url'; import { URL } from 'node:url';
import { deliverQueue } from '@/queue/queues.js'; import { deliverQueue } from '@/queue/queues.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

@ -1,6 +1,6 @@
import { URL } from 'node:url'; import { URL } from 'node:url';
import { inboxQueue } from '@/queue/queues.js'; import { inboxQueue } from '@/queue/queues.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

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

View file

@ -1,7 +1,7 @@
import { URL } from 'node:url'; import { URL } from 'node:url';
import { addRelay } from '@/services/relay.js'; import { addRelay } from '@/services/relay.js';
import define from '../../../define.js'; import define from '@/server/api/define.js';
import { ApiError } from '../../../error.js'; import { ApiError } from '@/server/api/error.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

View file

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

View file

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

View file

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

View file

@ -3,7 +3,7 @@ import { getInstanceActor } from '@/services/instance-actor.js';
import { deliver } from '@/queue/index.js'; import { deliver } from '@/queue/index.js';
import { renderActivity } from '@/remote/activitypub/renderer/index.js'; import { renderActivity } from '@/remote/activitypub/renderer/index.js';
import { renderFlag } from '@/remote/activitypub/renderer/flag.js'; import { renderFlag } from '@/remote/activitypub/renderer/flag.js';
import define from '../../define.js'; import define from '@/server/api/define.js';
export const meta = { export const meta = {
tags: ['admin'], tags: ['admin'],

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