Compare commits

..

No commits in common. "main" and "main" have entirely different histories.
main ... main

849 changed files with 15539 additions and 12177 deletions

View File

@ -6,11 +6,10 @@
#───┘ URL └─────────────────────────────────────────────────────
# Final accessible URL seen by a user.
# Only the host part will be used.
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# URL SETTINGS AFTER THAT!
url: https://example.tld/
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# URL SETTINGS AFTER THAT!
# ┌───────────────────────┐
#───┘ Port and TLS settings └───────────────────────────────────
@ -46,7 +45,6 @@ db:
pass: example-foundkey-pass
# Whether to disable query caching
# Default is to cache, i.e. false.
#disableCache: true
# Extra connection options
@ -59,11 +57,7 @@ db:
redis:
host: localhost
port: 6379
# Address family to connect over.
# Can be either a number or string (0/dual, 4/ipv4, 6/ipv6)
# Default is "dual".
#family: dual
# The following properties are optional.
#family: dual # can be either a number or string (0/dual, 4/ipv4, 6/ipv6)
#pass: example-pass
#prefix: example-prefix
#db: 1
@ -71,7 +65,6 @@ redis:
# ┌─────────────────────────────┐
#───┘ Elasticsearch configuration └─────────────────────────────
# Elasticsearch is optional.
#elasticsearch:
# host: localhost
# port: 9200
@ -82,36 +75,35 @@ redis:
# ┌─────────────────────┐
#───┘ Other configuration └─────────────────────────────────────
# Whether to disable HSTS (not recommended)
# Default is to enable HSTS, i.e. false.
# Whether disable HSTS
#disableHsts: true
# Number of worker processes by type.
# The sum should not exceed the number of available cores.
# The sum must not exceed the number of available cores.
#clusterLimits:
# web: 1
# queue: 1
# Jobs each worker will try to work on at a time.
#deliverJobConcurrency: 128
#inboxJobConcurrency: 16
# Job concurrency per worker
# deliverJobConcurrency: 128
# inboxJobConcurrency: 16
# Rate limit for each Worker.
# Use -1 to disable.
# A rate limit for deliver jobs is not recommended as it comes with
# a big performance penalty due to overhead of rate limiting.
#deliverJobPerSec: -1
#inboxJobPerSec: 16
# Job rate limiter
# deliverJobPerSec: 128
# inboxJobPerSec: 16
# Number of times each job will be tried.
# 1 means only try once and don't retry.
#deliverJobMaxAttempts: 12
#inboxJobMaxAttempts: 8
# Job attempts
# deliverJobMaxAttempts: 12
# inboxJobMaxAttempts: 8
# Proxy for HTTP/HTTPS outgoing connections
# Syslog option
#syslog:
# host: localhost
# port: 514
# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128
# Hosts that should not be connected to through the proxy specified above
#proxyBypassHosts: [
# 'example.com',
# '192.0.2.8'
@ -125,8 +117,7 @@ redis:
# Media Proxy
#mediaProxy: https://example.com/proxy
# Proxy remote files
# Default is to not proxy remote files, i.e. false.
# Proxy remote files (default: false)
#proxyRemoteFiles: true
# Storage path for files if stored locally (absolute path)
@ -134,15 +125,11 @@ redis:
#internalStoragePath: '/etc/foundkey/files'
# Upload or download file size limits (bytes)
# default is 262144000 = 250MiB
#maxFileSize: 262144000
# Max note text length (in characters)
#maxNoteTextLength: 3000
# By default, Foundkey will fail when something tries to make it fetch something from private IPs.
# With the following setting you can explicitly allow some private CIDR subnets.
# Default is an empty list, i.e. none allowed.
#allowedPrivateNetworks: [
# '127.0.0.1/32'
#]
@ -153,9 +140,3 @@ redis:
# info: /twemoji/1f440.svg
# notFound: /twemoji/2049.svg
# error: /twemoji/1f480.svg
# Whether it should be allowed to fetch content in ActivityPub form without HTTP signatures.
# It is recommended to leave this as default to improve the effectiveness of instance blocks.s
# However, note that while this prevents fetching in ActivityPub form, it could still be scraped
# from the API or other representations if the other side is determined to do so.
#allowUnsignedFetches: false

3
.gitignore vendored
View File

@ -11,9 +11,6 @@
# nano
.swp
# vimlocal
.vimlocal
# Node.js
node_modules
report.*.json

View File

@ -1,12 +1,12 @@
Andreas Nedbal <git@pixelde.su> <andreas.nedbal@in2code.de>
Andreas Nedbal <git@pixelde.su> <github-bf215181b5140522137b3d4f6b73544a@desu.email>
Balazs Nadasdi <balazs@weave.works> <yitsushi@gmail.com>
Chloe Kudryavtsev <code@toast.bunkerlabs.net> <code@code.bunkerlabs.net>
Chloe Kudryavtsev <code@toast.bunkerlabs.net> <toast+git@toast.cafe>
Chloe Kudryavtsev <code@toast.bunkerlabs.net> <toast@toast.cafe>
Chloe Kudryavtsev <code@code.bunkerlabs.net> <code@toast.bunkerlabs.net>
Chloe Kudryavtsev <code@code.bunkerlabs.net> <toast+git@toast.cafe>
Chloe Kudryavtsev <code@code.bunkerlabs.net> <toast@toast.cafe>
Dr. Gutfuck LLC <40531868+gutfuckllc@users.noreply.github.com>
Ehsan Javadynia <31900907+ehsanjavadynia@users.noreply.github.com> <ehsan.javadynia@gmail.com>
Norm <normandy@biribiri.dev>
Francis Dinh <normandy@biribiri.dev>
Hakaba Hitoyo <tsukadayoshio@gmail.com> Hakaba Hitoyo <example@example.com>
Johann150 <johann.galle@protonmail.com> <johann@qwertqwefsday.eu>
Michcio <public+git@meekchopp.es> <michcio@noreply.akkoma>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

807
.yarn/releases/yarn-3.3.0.cjs vendored Executable file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

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

View File

@ -11,201 +11,6 @@ Unreleased changes should not be listed in this file.
Instead, run `git shortlog --format='%h %s' --group=trailer:changelog <last tag>..` to see unreleased changes; replace `<last tag>` with the tag you wish to compare from.
If you are a contributor, please read [CONTRIBUTING.md, section "Changelog Trailer"](./CONTRIBUTING.md#changelog-trailer) on what to do instead.
## 13.0.0-preview6 - 2023-07-02
## Added
- **BREAKING** activitypub: validate fetch signatures
Fetching the ActivityPub representation of something now requires a valid HTTP signature.
- client: add MFM functions `position`, `scale`, `fg`, `bg`
- server: add webhook stat to nodeinfo
- activitypub: handle incoming Update Note activities
## Changed
- client: change followers only icon to closed lock
- client: disable sound for received note by default
- client: always forbid MFM overflow
- make mutes case insensitive
- activitypub: improve JSON-LD context
The context now properly notes the `@type`s of defined attributes.
- docker: only publish port on localhost
## Fixed
- server: fix internal download in emoji import
- server: replace unzipper with decompress
## Removed
- migrate note favorites to clips
If you previously had favorites they will now be in a clip called "⭐".
If you want to add a note as a "favorite" you can use the menu item "Clip".
## 13.0.0-preview5 - 2023-05-23
This release contains 6 breaking changes and 1 security update.
### Security
- client: check input for aiscript
- server: validate filenames and emoji names on emoji import
- server: check URL schema of ActivityPub URIs
- server: check schema for URL previews
- server: update summaly dependency
### Added
- client: impolement filtering and sorting in drive
- client: add "nobody" follower/following visibility
- client: re-add flag to require approval for bot follows
- client: show waveform on audio player
- client: add new deepl languages
- client: add instructions on remote interaction (when signed out)
- client: show follow button when not logged in
- server: show worker mode in process names
- server: drive endpoint to fetch files and folders combined
- activitypub: implement receiving account moves
### Changed
- **BREAKING** server: restructure endpoints related to user administration
- **BREAKING** server: refactor streaming API data structures
- **BREAKING** server: rename configuration environment variables
The environment variables that could be used for configuration which were previously prefixed with `MK_`
are now prefixed with `FK_` instead.
- server: improve error message for invalidating follows
- server: add pagination to file attachment timeline
### Fixed
- **BREAKING** server: properly respect follower/following visibility setting on statistics endpoint
This affects the endpoint `/api/users/stats`.
- improve documentation for `fetch-rss` endpoint
- client: fix authentication error in RSS widget
- client: fix attached files and account switcher combination in new note form
- client: improved module tracker file detection
- client: fix follow requests pagination
- client: Theme creator breaks after creating a theme
- client: replace error UUIDs with error codes
- client: allow opening links in new tab
The usual 3rd button click (usually mouse wheel) or Ctrl+Click should now work to open a link in a new tab.
- client: fix drive item updates inserting duplicate entries
- client: improve error messages for failed uploads
- client: stop unnecessary network congestion by websocket ping mechanism
- server: don't fail if a system user was already created
- server: better matching for MFM mentions
- server: fix rate limit for adding reactions
- server: check instance description length limit
- server: dont error on generating RSS feeds for profiles without public posts
- server: group delivering `Delete` activities to improve performance
- server: fix drive quota for remote users
- server: user deletion race condition (again)
### Removed
- **BREAKING** server: remove unused API parameters `sinceId` and `untilId` from `/api/notes/reactions`.
- **BREAKING** server: remove syslog integration
If you used syslog before, the syslog protocoll will no longer be connected to.
The configuration entries for `syslog` will be ignored, you should remove them if they are set.
- client: remove `driveFolderBg` theme colour
- activitypub: remove `_misskey_content` attribute
- activitypub: remove `_misskey_reaction` attribute
- activitypub: remove `_misskey_votes` attribute
- foundkey-js: remove unused definitions for Ads and detailed instance metadata
## 13.0.0-preview4 - 2023-02-05
This release contains 6 breaking changes, including changes to the configuration file format.
### Added
- new Foundkey logo
- client: add button to unrenote/remove all own renotes
- client: add mod tracker
- client: add button to delete all files of a user for moderators
- server: implement OAuth 2.0 Authorization Code grant
- server: add config for error images
- server: expire notifications after 3 months
- server: start adding /api/v2 routes
- server: indicate Retry-After when rate limiting
- docs: show rate limit information
### Changed
- **BREAKING** server: implement separate web workers
The configuration file format has been changed: The `clusterLimit` item has been removed
and `clusterLimits` has been added instead. Check the example configuration file.
- **BREAKING** server: remove wildcard blocking and instead block subdomains (#269)
As an administrator you may need to check the list of blocked instances.
- **BREAKING** server: disable deliver rate limit by default
We found that the deliver rate limit causes a lot of load for no real benefit. Because of this,
it will be disabled by default. The default value of `deliverJobPerSec` is set to
disable this rate limit.
- server: adjust permissions for `/api/admin/accounts/delete`
The admin/accounts/delete endpoint now requries administrator privileges
instead of just moderator privileges.
- server: increase nodeinfo caching
- client: headlines in queue widget are links
- client: add tooltips to visibility icons
- server: improve error messages
- server: change default value for `/api/admin/show-users` origin param
- server: lower rate limit for deletion activities
Deleting things that result in federating a delete activity have a more strict rate limit.
This affects the following endpoints:
- `/api/notes/delete`
- `/api/notes/reactions/delete`
- `/api/notes/unrenote`
- server: improve OpenGraph data
- properly render note attachments as RDFa
- add more metadata about e.g. author
- proper OpenGraph data replaces custom `misskey:` RDFa tags
- activitypub: implement [FEP-e232](https://codeberg.org/fediverse/fep/src/branch/main/feps/fep-e232.md) qoutes
- activitypub: use `quoteUri` instead of `quoteUrl`
### Fixed
- client: fix layout of app authorization page
- client: unify different error dialogs
- client: set display name limit same as server
- client: dont display instance banner tooltip if software name is unknown
- client: fix 500 error in notifications
- client: fix some tooltips not closing
- client: fix issue of search only working once
- client: check `quoteId` for canPost computation
- client: fix quotes with only a CW
- server: fix thread mutes not applying to renotes
- server: fix ReferenceError: meta is undefined
- server: fix TypeError in registerOrFetchInstanceDoc
- server: fix ratelimit in `/api/i/import-following`
- server: handle redirects in signed get
- server: remove reversi database tables
- server: set file permissions after copy
- server: also use human readable URL in search
- server: fix user deletion race condition
- server: add websocket ping mechanism
This should help keep websocket connections alive even if there are no events for
prolonged time periods. This should also fix issues where the "connection has been lost"
dialog appeared despite the connection being fine.
- activitypub: properly parse incoming hashtags
- activitypub: Do block checks more globally
- activitypub: properly render CW only quotes
### Removed:
- **BREAKING** server: remove Twitter, Github and Discord integrations
- **BREAKING** server: remove `api/admin/delete-account`,
You should use the API endpoint `admin/accounts/delete` instead.
It has the same parameter and the same behaviour.
- **BREAKING** remove galleries
Galleries have been removed because low usage and duplication of other behaviour.
Existing gallery posts will be turned into ordinary notes.
If a user had any gallery posts, a new clip called "Gallery" will be created containing
all of the former gallery posts that are now notes.
This affects the following endpoints:
- `/api/gallery/featured`
- `/api/gallery/popular`
- `/api/gallery/posts`
- `/api/gallery/posts/create`
- `/api/gallery/posts/delete`
- `/api/gallery/posts/like`
- `/api/gallery/posts/show`
- `/api/gallery/posts/unlike`
- `/api/i/gallery/likes`
- `/api/i/gallery/posts`
- `/api/users/gallery/posts`
- server: remove bios and cli
- server: remove avatarColor and bannerColor properties
- server: remove application level websocket ping
This pinging mechanism was unused in `foundkey-js`, and we expect other usage to be low.
You can use the pinging mechanism built into the websocket protocol if you wish.
Note that the Server will now also send pings on its own (see *Fixed* section).
## 13.0.0-preview3 - 2022-12-02
This release contains 1 urgent security fix necessitated by `misskey-forkbomb`.
This release contains 1 breaking change.

View File

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

View File

@ -11,9 +11,13 @@ Please understand that in such cases we might edit your issue to translate it, t
## Development platform
FoundKey generally assumes that it is running on a Unix-like platform (e.g. Linux or macOS). If you are using Windows for development, we highly suggest using the Windows Subsystem for Linux (WSL) as the development environment.
## Roadmap
See [ROADMAP.md](./ROADMAP.md)
## Issues
Issues are intended for feature requests and bug tracking.
Please note that in general, we are not looking for completely new features to add, but quality of life improvements will be considered.
For technical support or if you are not sure if what you are experiencing is a bug you can talk to people on the [IRC server](https://irc.akkoma.dev) in the `#foundkey` channel first.
Please do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
@ -21,6 +25,7 @@ Please do not close issues that are about to be resolved. It should remain open
branch|what it's for
---|---
main|development branch
translate|managed by weblate, see [section about translation](#Translation)
For a production environment you might not want to follow the `main` branch directly but instead check out one of the git tags.
@ -29,7 +34,6 @@ For a production environment you might not want to follow the `main` branch dire
This project follows [Semantic Versioning 2.0.0](https://semver.org/spec/v2.0.0.html).
Significant changes should be listed in the changelog (i.e. the file called `CHANGELOG.md`, see also section "Changelog Trailer" below).
Although Semantic Versioning talks about "the API", changes to the user interface should also be tracked.
However, changes to translation files are not considered notable enough to be listed in the changelog.
Consider if any of the existing documentation has to be updated because of your contribution.
@ -149,6 +153,8 @@ Here is the step by step checklist:
<small>a.k.a. Localization (l10n) or Internationalization (i18n)</small>
To translate text used in Foundkey, we use weblate at <https://translate.akkoma.dev/projects/foundkey/>.
Localization files are found in `/locales/` and are YAML files using the `yml` file extension.
The file name consists of the [IETF BCP 47](https://www.rfc-editor.org/info/bcp47) language code.
@ -310,8 +316,8 @@ This does not apply when using the Composition API since reactivation is manual.
If you import json in TypeScript, the json file will be spit out together with the TypeScript file into the dist directory when compiling with tsc. This behavior may cause unintentional rewriting of files, so when importing json files, be sure to check whether the files are allowed to be rewritten or not. If you do not want the file to be rewritten, you should make sure that the file can be rewritten by importing the json file. If you do not want the file to be rewritten, use functions such as `fs.readFileSync` to read the file instead of importing it.
### Component style definitions do not have a `margin`
~~Setting the `margin` of a component may be confusing. Instead, it should always be the user of a component that sets a `margin`.~~
This was a philosophy used previously. Hoever it now seems a better idea to add a default margin to the top level element of a component which can be easily overwritten on the usage of that component with a `style` attribute.
Setting the `margin` of a component may be confusing.
Instead, it should always be the user of a component that sets a `margin`.
### Do not use the word "follow" in HTML class names
This has caused things to be blocked by an ad blocker in the past.

14
COPYING
View File

@ -1,6 +1,6 @@
Unless otherwise stated this repository is
Copyright © 2014-2022 syuilo and contributors
Copyright © 2022-2023 FoundKey contributors
Copyright © 2022 FoundKey contributors
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
(You may be able to run `git shortlog -se` to see a full list of authors.)
@ -13,15 +13,3 @@ https://github.com/muan/emojilib/blob/master/LICENSE
RsaSignature2017 implementation by Transmute Industries Inc
License: MIT
https://github.com/transmute-industries/RsaSignature2017/blob/master/LICENSE
Chiptune2.js by Simon Gündling
License: MIT
https://github.com/deskjet/chiptune2.js#license
libopenmpt (as part of openmpt) by OpenMPT
License: BSD 3-Clause
https://github.com/OpenMPT/openmpt/blob/master/LICENSE
The logo file (logo.svg) was created by Blinry
License: [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/)
https://blinry.org/

View File

@ -7,10 +7,6 @@ Look further up in the section to find the "base path" it is relative to.
All the backend code is in `/packages/backend/src`.
The backend is started via `index.ts` which in turn starts `boot/index.ts`.
In the "boot" code is where the process is forked from the main process into additional and separate worker and frontend processes.
If you look into your operating system's process overview or similar, you might be able to see that the processes rename themselves accordingly.
### Database
For connecting to the database an ORM (objectrelational mapping) is used.
@ -44,27 +40,15 @@ After that the actual endpoint code is run by `call.ts` after checking some more
ActivityPub related code is in `/packages/backend/src/remote/activitypub/`
Both incoming and outgoing ActivityPub request are handled through queues, to e.g. allow for retrying a request when it fails, or spikes of many incoming requests.
#### Incoming Activities
Remote ActivityPub implementations will HTTP POST to the resource `/user/:userId/inbox` or `/inbox` (the latter is also known as the "shared inbox").
The behaviour for these routes is exactly the same: They add all the received data into the inbox queue.
This is defined in `/packages/backend/src/server/activitypub.ts`.
The inbox processor will do some basic things like verify signatures.
Incoming ActivityPub requests are processed by the code in `kernel/`.
The files/directories are generally named the same as the Activities that they process, which should help with orientation.
The entry point for processing an activity is `processOneActivity` in the `kernel/index.ts` file in that directory.
Parts of incoming activities may also be processed by `models/`.
#### Outgoing Activities
Outgoing activities are usually initiated in the logic of the API endpoints.
The bodies of outgoing ActivityPub requests are "rendered" using `renderer/`.
The bodys of outgoing ActivityPub requests are "rendered" using `renderer/`.
These files define several functions that are meant to be used together, e.g. `renderCreate(await renderNote(note, false), note)`.
The invocation of these functions is placed either in the API endpoints directly or in the services code.
The rendered bodies of the functions and the recipients are put into the deliver queue to be delivered.
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.
### Services

View File

@ -1,21 +1,13 @@
<div align="center"><img src="./logo.svg" height="200" alt="Foundkey logo, an owl holding a key"/></div>
# FoundKey
FoundKey is a free and open source microblogging server compatible with ActivityPub.
It is currently under **LIMITED MAINTENANCE** and is not well suited for large instances.
No more than 20 users per instance are recommended.
Forked from Misskey, FoundKey improves on maintainability and behaviour, while also bringing in useful features.
FoundKey is a free and open source microblogging server compatible with ActivityPub. Forked from Misskey, FoundKey improves on maintainability and behaviour, while also bringing in useful features.
See the [changelog](./CHANGELOG.md) and [roadmap](./ROADMAP.md) for more on what's changed and future plans.
## Documentation
FoundKey's documentation is a work in progress, which can be found in the `docs/` folder.
Feel free to contribute some 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.
## Contributing
If you're interested in helping out with the project, please read the [contributing guide](./CONTRIBUTING.md).
## Sponsors
FoundKey is not interested in finanical sponsorships.
We welcome contributions in the forms of code, testing and bug reporting (see also section *Contributing* above).
FoundKey is not interested in sponsorships.

View File

@ -3,9 +3,9 @@ Note: this document is historical.
Everything starting with the next section is the original "idea" document that led to the foundation of FoundKey.
For the current status you should see the following:
* Issues labeled with [behaviour-fix](https://akkoma.dev/FoundKeyGang/FoundKey/issues?labels=44)
* Issues labeled with [upkeep](https://akkoma.dev/FoundKeyGang/FoundKey/issues?labels=43)
* Issues labeled with [feature](https://akkoma.dev/FoundKeyGang/FoundKey/issues?labels=42)
* The Behavioral Fixes [project](https://akkoma.dev/FoundKeyGang/FoundKey/projects/3)
* The Technological Upkeep [project](https://akkoma.dev/FoundKeyGang/FoundKey/projects/4)
* The Features [project](https://akkoma.dev/FoundKeyGang/FoundKey/projects/5)
## Misskey Goals
Ive been thinking about a community misskey fork for a while now. To some of you, this is not a surprise. Lets talk about that.

View File

@ -9,7 +9,7 @@ services:
- redis
# - es
ports:
- "127.0.0.1:3000:3000"
- "3000:3000"
networks:
- internal_network
- external_network

2
docs/default-reaction.md Normal file
View File

@ -0,0 +1,2 @@
# 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

@ -18,11 +18,12 @@ Please note that Emoji may be subject to copyright and you are responsible for c
If you have an image file that you would like to turn into a custom emoji you can import the image as an emoji.
This works just like attaching files to a note:
You can choose to upload a new file, pick a file from your Foundkey drive or upload a file from another URL.
You can choose to upload a new file, pick a file from your Misskey drive or upload a file from another URL.
**Warning:**
::: danger
When you import emoji from your drive, the file will remain inside your drive.
Foundkey does not make a copy of this file so if you delete it, the emoji will be broken.
Misskey does not make a copy of this file so if you delete it, the emoji will be broken.
:::
The emoji will be added to the instance and you will then be able to edit or delete it as usual.
@ -31,9 +32,10 @@ The emoji will be added to the instance and you will then be able to edit or del
Emojis can be imported in bulk as packed ZIP files with a special format.
This ability can be found in the three dots menu in the top right corner of the custom emoji menu.
**Warning:**
::: warning
Bulk emoji import may overwrite existing emoji or otherwise mess up your instance.
Be sure to only import emoji from trusted sources, ideally only ones you exported yourself.
:::
### Packed emoji format
@ -74,9 +76,6 @@ The fields of `Meta` are currently not used or checked when importing emoji, exc
For each `Emoji`:
- `downloaded`: should always be true. If the field is missing or not truthy, the emoji will not be imported.
- `fileName`: name of the image file inside the packed file.
The filename has to match the following ECMAScript RegExp: `/^[a-zA-Z0-9_]+?([a-zA-Z0-9\.]+)?$/`
(i.e. composed of latin letters, digits, underscores or dots, not starting with a dot and not ending with an underscore)
If the file does not match this RegExp, the respective emoji will not be imported!
- `emoji`: data associated with the emoji as it was stored in the database. Currently most of these fields are
not even checked for existence. The following are currently used:
- `name`: name of the emoji for the user, e.g. `blobfox` if a user should type in `:blobfox:` to get the emoji.
@ -90,9 +89,10 @@ The properties of an emoji can be edited by clicking it in the list of local emo
When you click on a custom emoji, a dialog for editing the properties will open.
This dialog will also allow you to delete an emoji.
**Warning:**
::: danger
When you delete a custom emoji, old notes that contain it will still have the text name of the emoji in it.
The emoji will no longer be rendered correctly.
:::
Note that remote emoji can not be edited or deleted.

View File

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

View File

@ -38,29 +38,22 @@ Create a separate non-root user to run FoundKey:
adduser --disabled-password --disabled-login foundkey
```
The following steps will require logging into the `foundkey` user, so do that now.
```sh
su - foundkey
```
## Install FoundKey
We recommend using a local branch and merging in upstream releases as they get tagged. This allows for easy local customization of your install.
1. Login to the `foundkey` user
First, clone the FoundKey repo:
```sh
git clone https://akkoma.dev/FoundKeyGang/FoundKey
cd FoundKey
```
`su - foundkey`
Now create your local branch. In this example, we'll be using `toast.cafe` as the local branch name and release `v13.0.0-preview1` as the tag to track. To create that branch:
```sh
git checkout tags/v13.0.0-preview1 -b toast.cafe
```
2. Clone the FoundKey repository
Updating will be covered in a later section. For now you'll want to install the dependencies using Yarn:
```sh
yarn install
```
`git clone --recursive https://akkoma.dev/FoundKeyGang/FoundKey foundkey`
3. Navigate to the repository
`cd foundkey`
4. Install FoundKey's dependencies
`yarn install`
## Configure FoundKey
1. Copy `.config/example.yml` to `.config/default.yml`.
@ -71,36 +64,12 @@ yarn install
- Make sure you set the PostgreSQL and Redis settings correctly.
- Use a strong password for the PostgreSQL user and take note of it since it'll be needed later.
### Reverse proxy
For production use and for HTTPS termination you will have to use a reverse proxy.
There are instructions for setting up [nginx](./nginx.md) for this purpose.
### Changing the default Reaction
You can change the default reaction that is used when an ActivityPub "Like" is received from '👍' to '⭐' by changing the boolean value `meta.useStarForReactionFallback` in the databse respectively.
### Environment variables
There are some behaviour changes which can be accomplished using environment variables.
|variable name|meaning|
|---|---|
|`FK_ONLY_QUEUE`|If set, only the queue processing will be run. The frontend will not be available. Cannot be combined with `FK_ONLY_SERVER` or `FK_DISABLE_CLUSTERING`.|
|`FK_ONLY_SERVER`|If set, only the frontend will be run. Queues will not be processed. Cannot be combined with `FK_ONLY_QUEUE` or `FK_DISABLE_CLUSTERING`.|
|`FK_NO_DAEMONS`|If set, the server statistics and queue statistics will not be run.|
|`FK_DISABLE_CLUSTERING`|If set, all work will be done in a single thread instead of different threads for frontend and queue. (not recommended)|
|`FK_WITH_LOG_TIME`|If set, a timestamp will be appended to all log messages.|
|`FK_SLOW`|If set, all requests will be delayed by 3s. (not recommended, useful for testing)|
|`FK_LOG_LEVEL`|Sets the log level. Messages below the set log level will be suppressed. Available log levels are `quiet` (suppress all), `error`, `warning`, `success`, `info`, `debug`.|
If the `NODE_ENV` environment variable is set to `testing`, then the flags `FK_DISABLE_CLUSTERING` and `FK_NO_DAEMONS` will always be set, and the log level will always be `quiet`.
## Build FoundKey
Build foundkey with the following:
`NODE_ENV=production yarn build`
If your system has at least 4GB of RAM, run `NODE_ENV=production yarn build-parallel` to speed up build times.
If you're still encountering errors about some modules, use node-gyp:
1. `npx node-gyp configure`
@ -134,7 +103,7 @@ Run `NODE_ENV=production npm start` to launch FoundKey manually. To stop the ser
### Launch with systemd
Run `systemctl edit --full --force foundkey.service`, and paste the following:
Run `systemctl --edit --full --force foundkey.service`, and paste the following:
```ini
[Unit]
@ -144,7 +113,7 @@ Description=FoundKey daemon
Type=simple
User=foundkey
ExecStart=/usr/bin/npm start
WorkingDirectory=/home/foundkey/FoundKey
WorkingDirectory=/home/foundkey/foundkey
Environment="NODE_ENV=production"
TimeoutSec=60
StandardOutput=syslog
@ -178,7 +147,7 @@ command_args="start"
command_user="foundkey"
supervisor="supervise-daemon"
supervise_daemon_args=" -d /home/foundkey/FoundKey -e NODE_ENV=\"production\""
supervise_daemon_args=" -d /home/foundkey/foundkey -e NODE_ENV=\"production\""
pidfile="/run/${RC_SVCNAME}.pid"
@ -207,22 +176,13 @@ rc-service foundkey start
You can check if the service is running with `rc-service foundkey status`.
### Updating FoundKey
When a new release comes out, simply fetch and merge in the new tag. If you plan on making additional changes on top of that tag, we suggest using the `--squash` option with `git merge`.
```sh
git fetch -t
git merge tags/v13.0.0-preview2
# you are now on the "next" release
```
Use git to pull in the latest changes and rerun the build and migration commands:
Now you'll want to update your dependencies and rebuild:
```sh
git pull
git submodule update --init
yarn install
# Use build-parallel if your system has 4GB or more RAM and want faster builds
NODE_ENV=production yarn build
```
Next, run the database migrations:
```sh
yarn migrate
```

View File

@ -20,13 +20,11 @@ cd packages/backend
LINE_NUM="$(npx typeorm migration:show -d ormconfig.js | grep -n nsfwDetection1655368940105 | cut -d ':' -f 1)"
NUM_MIGRATIONS="$(npx typeorm migration:show -d ormconfig.js | tail -n+"$LINE_NUM" | grep '\[X\]' | nl)"
for i in $(seq 1 $NUM_MIGRATIONS); do
npx typeorm migration:revert -d ormconfig.js || continue
for i in $(seq 1 $NUM_MIGRAIONS); do
npx typeorm migration:revert -d ormconfig.js
done
```
**Note:** TypeORM might hang when reverting a migration. If it says that the migration was reverted successfully, you can force close TypeORM using Ctrl-C. The script will continue until all of the migrations have been reverted.
## Switching repositories
To switch to the FoundKey repository, do the following in your Misskey install location:
```sh

View File

@ -1,103 +0,0 @@
# User moderation
A lot of the user moderation activities can be found on the `user-info` page. You can reach this page by going to a users profile page, open the three dot menu, select "About" and navigating to the "Moderation" section of the page that opens.
With the necessary privileges, this page will allow you to:
- Toggle whether a user is a moderator (administrators on local users only)
- Reset the users password (local users only)
- Delete a user (administrators only)
- Delete all files of a user
For remote users, cached files (if any) will be deleted.
- Silence a user
This disallows a user from making a note with `public` visibility.
If necessary the visibility of incoming notes or locally created notes will be lowered.
- Suspend a user
This will drop any incoming activities of this actor and hide them from public view on this instance.
# Administrator
When an instance is first set up, the initial user to be created will be made an administrator by default.
This means that typically the instance owner is the administrator.
It is also possible to have multiple administrators, however making a user an administrator is not implemented in the client.
To make a user an administrator, you will need access to the database.
This is intended for security reasons of
1. not exposing this very dangerous functionality via the API
2. making sure someone that has shell access to the server anyway "approves" this.
To make a user an administrator, you will first need the user's ID.
To get it you can go to the user's profile page, open the three dot menu, select "About" and copy the ID displayed there.
Then, go to the database and run the following query, replacing `<ID>` with the ID gotten above.
```sql
UPDATE "user" SET "isAdmin" = true WHERE "id" = '<ID>';
```
The user that was made administrator may need to reload their client to see the changes take effect.
To demote a user, you can do a similar operation, but instead with `... SET "isAdmin" = false ...`.
## Immunity
- Cannot be reported by local users.
- Cannot have their password reset.
To see how you can reset an administrator password, see below.
- Cannot have their account deleted.
- Cannot be suspended.
- Cannot be silenced.
- Cannot have their account details viewed by moderators.
- Cannot be made moderators.
## Abilities
- Create or delete user accounts.
- Add or remove moderators.
- View and change instance configuration (e.g. Translation API keys).
- View all followers and followees.
Administrators also have the same ability as moderators.
Note of course that people with access to the server and/or database access can do basically anything without restrictions (including breaking the instance).
## Resetting an administrators password
Administrators are blocked from the paths of resetting the password by moderators or administrators.
However, if your server has email configured you should be able to use the "Forgot password" link on the normal signin dialog.
If you did not set up email, you will need to kick of this process instead through modifying the database yourself.
You will need the user ID whose password should be reset, indicated in the following as `<USERID>`;
as well as a random string (a UUID would be recommended) indicated as `<TOKEN>`.
Replacing the two terms above, run the following SQL query:
```sql
INSERT INTO "password_reset_request" VALUES ('0000000000', now(), '<TOKEN>', '<USERID>');
```
After that, navigate to `/reset-password/<TOKEN>` on your instance to finish the password reset process.
After that you should be able to sign in with the new password you just set.
# Moderator
A moderator has fewer privileges than an administrator.
They can also be more easily added or removed by an adminstrator.
Having moderators may be a good idea to help with user moderation.
## Immunity
- Cannot be reported by local users.
- Cannot be suspended.
## Abilities
- Suspend users.
- Add, list and remove relays.
- View queue, database and server information.
- Create, edit, delete, export and import local custom emoji.
- View global, social and local timelines even if disabled by administrators.
- Show, update and delete any users files and file metadata.
Managing emoji is described in [a separate file](emoji.md).
- Delete any users notes.
- Create an invitation.
This allows users to register an account even if (public) registrations are closed using an invite code.
- View users' account details.
- Suspend and unsuspend users.
- Silence and unsilence users.
- Handle reports.
- Create, update and delete announcements.
- View the moderation log.

View File

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

View File

@ -11,9 +11,9 @@ username: "اسم المستخدم"
password: "الكلمة السرية"
forgotPassword: "نسيتَ كلمة السر"
fetchingAsApObject: "جارٍ جلبه مِن الفديفرس…"
ok: "حسناً"
ok: " حسناً"
gotIt: "فهِمت"
cancel: "إلغاء"
cancel: " إلغاء"
renotedBy: "أعاد نشرها {user}"
noNotes: "لم يُعثر على أية ملاحظات"
noNotifications: "ليس هناك أية اشعارات"
@ -32,6 +32,9 @@ signup: "أنشئ حسابًا"
save: "حفظ"
users: "المستخدمون"
addUser: "اضافة مستخدم"
favorite: "أضفها للمفضلة"
favorites: "المفضلات"
unfavorite: "إزالة من المفضلة"
pin: "دبّسها على الصفحة الشخصية"
unpin: "ألغ تدبيسها من ملفك الشخصي"
copyContent: "انسخ المحتوى"
@ -141,7 +144,7 @@ youHaveNoLists: "لا تمتلك أية قائمة"
followConfirm: "أتريد متابعة {name}؟"
proxyAccount: "حساب وكيل البروكسي"
proxyAccountDescription: "يتصرف حساب الوكيل كمتابع بعيد لمستخدمين تحت ظروف معينة.\
\ على سبيل المثال ، عندما يضيف مستخدم مستخدمًا بعيدًا إلى قائمة فإن ملاحظاته لن\
\ على سبيل المثال ، عندما يضيف مستخدم مستخدمًا بعيدًا إلى قائمة فإن ملاحظاته لن\
\ تُرسل إلى المثيل ما لم يُتابعه مستخدم محلي. وبالتالي فإن حساب الوكيل سوف يتابع\
\ هذا المستخدم لكي تُرسل ملاحظاته."
host: "المضيف"
@ -219,7 +222,8 @@ fromUrl: "عبر رابط"
uploadFromUrl: "ارفع عبر رابط"
uploadFromUrlDescription: "رابط الملف المراد رفعه"
uploadFromUrlRequested: "الرفع مطلوب"
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع"
uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الرفع "
explore: "استكشاف"
messageRead: "مقروءة"
noMoreHistory: "لا يوجد المزيد من التاريخ"
startMessaging: "ابدأ محادثة"
@ -254,6 +258,8 @@ createFolder: "أنشئ مجلدًا"
renameFolder: "إعادة تسمية المجلد"
deleteFolder: "احذف هذا المجلد"
addFile: "إضافة ملف"
emptyDrive: "قرص التخزين فارغ"
emptyFolder: "هذا المجلد فارغ"
unableToDelete: "لا يمكن حذفه"
inputNewFileName: "ادخل الإسم الجديد للملف"
inputNewDescription: "أدخل تعليقًا توضيحيًا"
@ -299,6 +305,9 @@ inMb: "بالميغابايت"
iconUrl: "رابط الأيقونة"
bannerUrl: "رابط صورة اللافتة"
backgroundImageUrl: "رابط صورة الخلفية"
pinnedUsers: "المستخدمون المدبسون"
pinnedUsersDescription: "قائمة المستخدمين المدبسين في لسان \"استكشف\" ، اجعل كل اسم\
\ مستخدم في سطر لوحده."
hcaptchaSiteKey: "مفتاح الموقع"
hcaptchaSecretKey: "المفتاح السري"
recaptchaSiteKey: "مفتاح الموقع"
@ -323,6 +332,11 @@ silence: "اكتم"
silenceConfirm: "أمتأكد من كتم هذا المستخدم؟"
unsilence: "إلغاء الكتم"
unsilenceConfirm: "أمتأكد من إلغاء كتم هذا المستخدم؟"
popularUsers: "المستخدمون الرائدون"
recentlyUpdatedUsers: "أصحاب النشاطات الأخيرة"
recentlyRegisteredUsers: "المستخدمون المنضمون حديثًا"
recentlyDiscoveredUsers: "المستخدمون المكتشفون حديثًا"
popularTags: "الوسوم الرائجة"
userList: "القوائم"
aboutMisskey: "عن FoundKey"
administrator: "المدير"
@ -363,6 +377,7 @@ messagingWithGroup: "محادثة جماعية"
title: "العنوان"
text: "النص"
enable: "تشغيل"
next: "التالية"
retype: "أعد الكتابة"
noteOf: "ملاحظات {user}"
inviteToGroup: "دعوة إلى فريق"
@ -469,7 +484,7 @@ description: "الوصف"
describeFile: "أضف تعليقًا توضيحيًا"
author: "الكاتب"
leaveConfirm: "لديك تغييرات غير محفوظة. أتريد المتابعة دون حفظها؟"
manage: "إدارة"
manage: "إدارة "
plugins: "الإضافات"
width: "العرض"
height: "الإرتفاع"
@ -487,7 +502,7 @@ useStarForReactionFallback: "استخدم ★ كبديل إذا كان التف
emailServer: "خادم البريد الإلكتروني"
emailConfigInfo: "يستخدم لتأكيد عنوان بريدك الإلكتروني ولإعادة تعيين كلمة المرور إن\
\ نسيتها."
email: "البريد الإلكتروني"
email: "البريد الإلكتروني "
emailAddress: "عنوان البريد الالكتروني"
smtpConfig: "إعدادات خادم SMTP"
smtpHost: "المضيف"
@ -523,6 +538,7 @@ abuseReports: "البلاغات"
reportAbuse: "أبلغ"
reportAbuseOf: "أبلغ عن {name}"
fillAbuseReportDescription: "أكتب بالتفصيل سبب البلاغ"
abuseReported: "أُرسل البلاغ، شكرًا لك"
reporter: "المُبلّغ"
reporteeOrigin: "أصل البلاغ"
reporterOrigin: "أصل المُبلّغ"
@ -567,6 +583,7 @@ loadRawImages: "حمّل الصور الأصلية بدلًا من المصغر
disableShowingAnimatedImages: "لا تشغّل الصور المتحركة"
verificationEmailSent: "أُرسل بريد التحقق. أنقر على الرابط المضمن لإكمال التحقق."
emailVerified: "تُحقّق من بريدك الإلكتروني"
noteFavoritesCount: "عدد الملاحظات المفضلة"
pageLikesCount: "عدد الصفحات التي أعجبت بها"
pageLikedCount: "عدد صفحاتك المُعجب بها"
contact: "التواصل"
@ -628,13 +645,16 @@ enabled: "مفعّل"
disabled: "معطّل"
quickAction: "الإجراءات السّريعة"
user: "المستخدمون"
administration: "إدارة"
administration: "إدارة "
accounts: "الحسابات"
switch: "بدّل"
noMaintainerInformationWarning: "لم تُضبط معلومات المدير"
noBotProtectionWarning: "لم تضبط الحماية من الحسابات الآلية"
configure: "اضبط"
postToGallery: "انشر في المعرض"
gallery: "المعرض"
recentPosts: "المشاركات الحديثة"
popularPosts: "المشاركات المتداولة"
shareWithNote: "شاركه في ملاحظة"
emailNotConfiguredWarning: "لم تعيّن بريدًا إلكترونيًا"
ratio: "النسبة"
@ -723,6 +743,11 @@ _forgotPassword:
ifNoEmail: "إذا لم تربط حسابك ببريد إلكتروني سيتوجب عليك التواصل مع مدير الموقع."
contactAdmin: "هذا المثيل لا يدعم استخدام البريد الإلكتروني، إن أردت إعادة تعيين\
\ كلمة المرور تواصل مع المدير."
_gallery:
my: "معرضي"
liked: "المشاركات المُعجب بها"
like: "أعجبني"
unlike: "أزل الإعجاب"
_email:
_follow:
title: "يتابعك"
@ -747,7 +772,7 @@ _nsfw:
force: "اخف كل الوسائط"
_mfm:
cheatSheet: "مرجع ملخص عن MFM"
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة\
intro: "MFM هي لغة ترميزية مخصصة يمكن استخدامها في عدّة أماكن في ميسكي. يمكنك مراجعة\
\ كل تعابيرها مع كيفية استخدامها هنا."
mention: "أشر الى"
mentionDescription: "يمكنك الإشارة لمستخدم معيّن من خلال كتابة @ متبوعة باسم مستخدم."
@ -870,6 +895,35 @@ _time:
minute: "د"
hour: "سا"
day: "ي"
_tutorial:
title: "كيف تستخدم FoundKey"
step1_1: "مرحبًا!"
step1_2: "تدعى هذه الصفحة 'الخيط الزمني' وهي تحوي ملاحظات الأشخاص الذي تتابعهم مرتبة\
\ حسب تاريخ نشرها."
step1_3: "خيطك الزمني فارغ حاليًا بما أنك لا تتابع أي شخص ولم تنشر أي ملاحظة."
step2_1: "لننهي إعداد ملفك الشخصي قبل كتابة ملاحظة أو متابعة أشخاص."
step2_2: "أعطاء معلومات عن شخصيتك يمنح من له نفس إهتماماتك فرصة متابعتك والتفاعل\
\ مع ملاحظاتك."
step3_1: "هل أنهيت إعداد حسابك؟"
step3_2: "إذا تاليًا لتنشر ملاحظة. أنقر على أيقونة القلم في أعلى الشاشة"
step3_3: "املأ النموذج وانقر الزرّ الموجود في أعلى اليمين للإرسال."
step3_4: "ليس لديك ما تقوله؟ إذا اكتب \"بدأتُ استخدم ميسكي\"."
step4_1: "هل نشرت ملاحظتك الأولى؟"
step4_2: "مرحى! يمكنك الآن رؤية ملاحظتك في الخيط الزمني."
step5_1: "والآن، لنجعل الخيط الزمني أكثر حيوية وذلك بمتابعة بعض المستخدمين."
step5_2: "تعرض صفحة {features} الملاحظات المتداولة في هذا المثيل ويتيح لك {Explore}\
\ العثور على المستخدمين الرائدين. اعثر على الأشخاص الذين يثيرون إهتمامك وتابعهم!"
step5_3: "لمتابعة مستخدمين ادخل ملفهم الشخصي بالنقر على صورتهم الشخصية ثم اضغط زر\
\ 'تابع'."
step5_4: "إذا كان لدى المستخدم رمز قفل بجوار اسمه ، وجب عليك انتظاره ليقبل طلب المتابعة\
\ يدويًا."
step6_1: "الآن ستتمكن من رؤية ملاحظات المستخدمين المتابَعين في الخيط الزمني."
step6_2: "يمكنك التفاعل بسرعة مع الملاحظات عن طريق إضافة \"تفاعل\"."
step6_3: "لإضافة تفاعل لملاحظة ، انقر فوق علامة \"+\" أسفل للملاحظة واختر الإيموجي\
\ المطلوب."
step7_1: "مبارك ! أنهيت الدورة التعليمية الأساسية لاستخدام ميسكي."
step7_2: "إذا أردت معرفة المزيد عن ميسكي زر {help}."
step7_3: "حظًا سعيدًا واستمتع بوقتك مع ميسكي! \U0001F680"
_2fa:
alreadyRegistered: "سجلت سلفًا جهازًا للاستيثاق بعاملين."
registerDevice: "سجّل جهازًا جديدًا"
@ -896,6 +950,7 @@ _permissions:
"write:notes": "أنشئ أو احذف ملاحظات"
"read:notifications": "اظهر الإشعارات"
"write:notifications": "إدارة الإشعارات"
"read:reactions": "اعرض تفاعلاتك"
"write:reactions": "عدّل تفاعلاتك"
"write:votes": "صوّت"
"read:pages": "اعرض صفحاتك"
@ -905,6 +960,9 @@ _permissions:
"write:user-groups": "عدّل أو احذف فِرق المستخدمين"
"read:channels": "طالع قنواتك"
"write:channels": "عدّل القنوات"
"read:gallery": "اعرض المعرض"
"write:gallery": "عدّل المعرض"
"read:gallery-likes": "يعرض ما أعجبك من مشاركات المعرض"
_auth:
shareAccess: "أتريد التفويض لـ \"{name}\" بالوصول لحسابك؟"
shareAccessAsk: "هل تخول لهذا التطبيق الوصول لحسابك؟"

View File

@ -3,7 +3,7 @@ headlineMisskey: "নোট ব্যাবহার করে সংযুক
introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা।\
\ \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন \U0001F4E1\n\"রিঅ্যাকশন\"\
\ গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন \U0001F44D\n\
একটি নতুন দুনিয়া ঘুরে দেখুন \U0001F680"
একটি নতুন দুনিয়া ঘুরে দেখুন \U0001F680\n"
monthAndDay: "{day}/{month}"
search: "খুঁজুন"
notifications: "বিজ্ঞপ্তি"
@ -32,6 +32,9 @@ signup: "নিবন্ধন করুন"
save: "সংরক্ষণ"
users: "ব্যবহারকারীগণ"
addUser: "ব্যবহারকারী যোগ করুন"
favorite: "পছন্দ"
favorites: "পছন্দগুলি"
unfavorite: "পছন্দ না"
pin: "পিন করা"
unpin: "পিন সরান"
copyContent: "বিষয়বস্তু কপি করুন"
@ -62,7 +65,7 @@ driveFileDeleteConfirm: "আপনি কি নিশ্চিত যে আপ
unfollowConfirm: "{name} কে আনফলোও করার ব্যাপারে নিশ্চিত?"
exportRequested: "আপনার তথ্যসমূহ রপ্তানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।\
\ রপ্তানি সম্পন্ন হলে তা আপনার ড্রাইভে সংরক্ষিত হবে।"
importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।."
importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে। "
lists: "লিস্ট"
note: "নোট"
notes: "নোটগুলি"
@ -76,10 +79,10 @@ somethingHappened: "একটি ত্রুটি হয়েছে"
retry: "আবার চেষ্টা করুন"
pageLoadError: "পেজ লোড করা যায়নি"
pageLoadErrorDescription: "এটি সাধারনত নেটওয়ার্কের সমস্যার বা ব্রাউজার ক্যাশের কারণে\
\ ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন।."
\ ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন। "
serverIsDead: "এই সার্ভার বর্তমানে সাড়া দিচ্ছে না। একটু পরে আবার চেষ্টা করুন।"
youShouldUpgradeClient: "এই পেজ দেখার জন্য আপনার ব্রাউজার রিফ্রেশ করে ক্লায়েন্ট আপডেট\
\ করুন।."
\ করুন। "
enterListName: "লিস্টের নাম লিখুন"
privacy: "গোপনীয়তা"
makeFollowManuallyApprove: "অনুসরণ করার অনুরোধগুলি গৃহীত হওয়ার জন্য আপনার অনুমতি লাগবে"
@ -90,7 +93,7 @@ followRequests: "অনুসরণ করার অনুরোধসমূহ"
unfollow: "অনুসরণ বাতিল"
followRequestPending: "অনুসরণ করার অনুরোধ বিচারাধীন"
renote: "রিনোট"
unrenote: "রিনোট সরান"
unrenote: "রিনোট সরান "
quote: "উদ্ধৃতি"
pinnedNote: "পিন করা নোট"
you: "আপনি"
@ -100,7 +103,7 @@ add: "যুক্ত করুন"
reaction: "প্রতিক্রিয়া"
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে\
\ + টিপুন।"
attachCancel: "অ্যাটাচমেন্ট সরান"
attachCancel: "অ্যাটাচমেন্ট সরান "
markAsSensitive: "সংবেদনশীল হিসাবে চিহ্নিত করুন"
unmarkAsSensitive: "সংবেদনশীল চিহ্ন সরান"
enterFileName: "ফাইলের নাম লিখুন"
@ -126,7 +129,7 @@ addEmoji: "ইমোজি যুক্ত করুন"
cacheRemoteFiles: "রিমোট ফাইলসমুহ ক্যাশ করুন"
cacheRemoteFilesDescription: "যখন এই অপশনটি বন্ধ থাকে তখন রিমোট ফাইল সমূহ সরাসরি রিমোট\
\ ইন্সট্যান্স থেকে লোড করা হয়। এই অপশনটি বন্ধ করলে স্টোরেজ এর ব্যাবহার কমবে তবে\
\ থাম্বনেইল তৈরি না করার কারণে নেটওয়ার্ক ব্যান্ডউইথ বেশী লাগবে।"
\ থাম্বনেইল তৈরি না করার কারণে নেটওয়ার্ক ব্যান্ডউইথ বেশী লাগবে। "
flagAsBot: "বট হিসাবে চিহ্নিত করুন"
flagAsBotDescription: "এই অ্যাকাউন্টটি যদি একটি প্রোগ্রাম দ্বারা পরিচালিত হয়, তাহলে\
\ এই অপশনটি চালু করুন। ইন্টারঅ্যাকশান চেইনিং রোধ করতে, মিস্কির সিস্টেম পরিচালনাকে\
@ -181,7 +184,7 @@ clearCachedFiles: "ক্যাশ পরিষ্কার করুন"
clearCachedFilesConfirm: "আপনি কি ক্যাশ পরিষ্কার করার ব্যাপারে নিশ্চিত?"
blockedInstances: "ব্লককৃত ইন্সট্যান্সসমুহ"
blockedInstancesDescription: "আপনি যে ইন্সট্যান্সগুলি ব্লক করতে চান তার হোস্টনেমগুলি\
\ প্রত্যেকটি আলাদা লাইনে লিখুন। ব্লককৃত ইন্সট্যান্সগুলি এই ইন্সট্যান্সের সাথে যোগাযোগ\
\ প্রত্যেকটি আলাদা লাইনে লিখুন। ব্লককৃত ইন্সট্যান্সগুলি এই ইন্সট্যান্সের সাথে যোগাযোগ\
\ করতে পারবেনা৷"
muteAndBlock: "মিউট এবং ব্লকগুলি"
mutedUsers: "নিঃশব্দকৃত ব্যবহারকারী"
@ -234,6 +237,7 @@ uploadFromUrl: "URL হতে আপলোড"
uploadFromUrlDescription: "যে ফাইলটি আপলোড করতে চান, সেটির URL"
uploadFromUrlRequested: "আপলোড অনুরোধ করা হয়েছে"
uploadFromUrlMayTakeTime: "URL হতে আপলোড হতে কিছু সময় লাগতে পারে।"
explore: "ঘুরে দেখুন"
messageRead: "পড়া"
noMoreHistory: "আর কোন ইতিহাস নেই"
startMessaging: "চ্যাট শুরু করুন"
@ -269,6 +273,8 @@ createFolder: "ফোল্ডার তৈরি করুন"
renameFolder: "ফোল্ডার পুনঃনামকরন"
deleteFolder: "ফোল্ডার মুছুন"
addFile: "ফাইল যোগ করুন"
emptyDrive: "আপনার ড্রাইভ খালি"
emptyFolder: "এই ফোল্ডার খালি"
unableToDelete: "মুছে ফেলা যায়নি"
inputNewFileName: "ফাইলের নতুন নাম লিখুন"
inputNewDescription: "নতুন ক্যাপশন লিখুন"
@ -286,7 +292,7 @@ reload: "আবার লোড করুন"
doNothing: "কিছু করবেন না"
reloadConfirm: "আপনি কি রিলোড করতে চান?"
watch: "বিজ্ঞপ্তি পান"
unwatch: "বিজ্ঞপ্তি পাওয়া বন্ধ করুন"
unwatch: "বিজ্ঞপ্তি পাওয়া বন্ধ করুন "
accept: "অনুমোদন"
reject: "প্রত্যাখ্যান"
normal: "স্বাভাবিক"
@ -314,6 +320,9 @@ inMb: "মেগাবাইটে লিখুন"
iconUrl: "আইকনের URL (ফ্যাভিকন, ইত্যাদি)"
bannerUrl: "ব্যানার ছবির URL"
backgroundImageUrl: "পটভূমির চিত্রের URL"
pinnedUsers: "পিন করা ব্যাবহারকারীগণ"
pinnedUsersDescription: "আপনি যেসব ব্যবহারকারীদের \"ঘুরে দেখুন\" পৃষ্ঠায় পিন করতে\
\ চান তাদের বর্ণনা করুন, প্রত্যেকের বর্ণনা আলাদা লাইনে লিখুন"
hcaptchaSiteKey: "সাইট কী"
hcaptchaSecretKey: "সিক্রেট কী"
recaptchaSiteKey: "সাইট কী"
@ -338,6 +347,11 @@ silence: "নীরব"
silenceConfirm: "আপনি কি এই ব্যাবহারকারীকের নীরব করতে চান?"
unsilence: "সরব"
unsilenceConfirm: "আপনি কি এই ব্যাবহারকারীকের সরব করতে চান?"
popularUsers: "জনপ্রিয় ব্যবহারকারীগন"
recentlyUpdatedUsers: "সম্প্রতি পোস্ট করা ব্যবহারকারীগন"
recentlyRegisteredUsers: "নতুন যোগ দেওয়া ব্যবহারকারীগন"
recentlyDiscoveredUsers: "নতুন খুঁজে পাওয়া ব্যবহারকারীগন"
popularTags: "জনপ্রিয় ট্যাগগুলি"
userList: "লিস্ট"
aboutMisskey: "FoundKey সম্পর্কে"
administrator: "প্রশাসক"
@ -378,6 +392,7 @@ messagingWithGroup: "গ্রুপ চ্যাট"
title: "শিরোনাম"
text: "পাঠ্য"
enable: "সক্রিয়"
next: "পরবর্তী"
retype: "পুনঃ প্রবেশ"
noteOf: "{user} এর নোট"
inviteToGroup: "গ্রুপে আমন্ত্রণ জানান"
@ -407,7 +422,7 @@ uiLanguage: "UI এর ভাষা"
groupInvited: "আপনি একটি গ্রুপে আমন্ত্রিত হয়েছেন"
useOsNativeEmojis: "অপারেটিং সিস্টেমের নেটিভ ইমোজি ব্যবহার করুন"
disableDrawer: "ড্রয়ার মেনু প্রদর্শন করবেন না"
youHaveNoGroups: "আপনার কোন গ্রুপ নেই"
youHaveNoGroups: "আপনার কোন গ্রুপ নেই "
joinOrCreateGroup: "একটি বিদ্যমান গ্রুপের আমন্ত্রণ পান বা একটি নতুন গ্রুপ তৈরি করুন৷"
noHistory: "কোনো ইতিহাস নেই"
signinHistory: "প্রবেশ করার ইতিহাস"
@ -432,7 +447,7 @@ objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "রেফারেন্স হিসাবে ব্যবহৃত URL। আপনি একটি CDN বা প্রক্সি\
\ ব্যবহার করলে URL, S3: 'https://<bucket>.s3.amazonaws.com', GCS: 'https://storage.googleapis.com/<bucket>'।"
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "ব্যবহার করা পরিষেবার bucket এর নাম লিখুন।."
objectStorageBucketDesc: "ব্যবহার করা পরিষেবার bucket এর নাম লিখুন। "
objectStoragePrefix: "Prefix"
objectStoragePrefixDesc: "ফাইলসমূহ এই prefix যুক্ত ফোল্ডারের অধীনে সংরক্ষণ করা হবে।"
objectStorageEndpoint: "এন্ডপয়েন্ট"
@ -480,7 +495,7 @@ deleteAllFilesConfirm: "সকল ফাইল ডিলিট করতে চ
removeAllFollowing: "সকল অনুসরণ বাতিল করুন"
removeAllFollowingDescription: "{host} এর সকল ব্যাবহারকারীকে আর ফলোও করবেন না । যদি\
\ ইন্সত্যান্সটির কোন সমস্যা (যেমনঃ ইন্সত্যান্সটি আর নেই) হয়ে থাকে তবে এটি ব্যাবহার\
\ করুন ।."
\ করুন । "
userSuspended: "এই ব্যাবহারকারির অ্যাকাউন্ট স্থগিত করা হয়েছে"
userSilenced: "এই ব্যাবহারকারিকে মিউট করা হয়েছে"
yourAccountSuspendedTitle: "এই অ্যাকাউন্টটি স্থগিত করা হয়েছে"
@ -569,6 +584,7 @@ abuseReports: "অভিযোগ"
reportAbuse: "অভিযোগ"
reportAbuseOf: "{name} এ অভিযোগ করুন"
fillAbuseReportDescription: "রিপোর্টের কারণ বর্ণনা করুন."
abuseReported: "আপনার অভিযোগটি দাখিল করা হয়েছে। আপনাকে ধন্যবাদ।"
reporter: "অভিযোগকারী"
reporteeOrigin: "অভিযোগটির উৎস"
reporterOrigin: "অভিযোগকারীর উৎস"
@ -609,7 +625,7 @@ driveFilesCount: "ড্রাইভে ফাইল এর সংখ্যা"
driveUsage: "ড্রাইভ এর ব্যাবহার"
noCrawle: "ক্রলার ইন্ডেক্সিং বন্ধ করুন"
noCrawleDescription: "সার্চ ইঞ্জিনগুলিকে আপনার প্রোফাইল, নোট, পেজ ইত্যাদি ইনডেক্স\
\ করতে নিষেধ করুন।."
\ করতে নিষেধ করুন। "
lockedAccountInfo: "এমনকি আপনি আপনার অনুসরণকারীদের বেছে বেছে অনুমোদন করলেও, যে কেউ\
\ আপনার নোটগুলি দেখতে পাবে, যতক্ষণ না আপনি আপনার নোটগুলিকে \"অনুসারীদের জন্য\" হিসাবে\
\ সেট না করেন৷"
@ -619,11 +635,12 @@ disableShowingAnimatedImages: "অ্যানিমেটেড চিত্র
verificationEmailSent: "নিশ্চিতকরণ ইমেল পাঠানো হয়েছে। সেটআপ সম্পূর্ণ করতে ইমেল এর\
\ লিঙ্ক অনুসরণ করুন।"
emailVerified: "ইমেইল নিশ্চিত করা হয়েছে"
noteFavoritesCount: "পছন্দ করা নোটের সংখ্যা"
pageLikesCount: "পেজ লাইক করেছেন"
pageLikedCount: "পেজ লাইক পেয়েছেন"
contact: "পরিচিতি সমূহ"
useSystemFont: "সিস্টেম ফন্ট ব্যাবহার করুন"
clips: "ক্লিপগুলি"
clips: "ক্লিপগুলি "
makeExplorable: "অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় দেখান"
makeExplorableDescription: "আপনি এটি বন্ধ করলে, আপনার অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায়\
\ প্রদর্শিত হবে না।"
@ -654,6 +671,7 @@ editCode: "কোড সম্পাদনা করুন"
apply: "প্রয়োগ করুন"
receiveAnnouncementFromInstance: "এই ইন্সট্যান্স থেকে বিজ্ঞপ্তি পান"
emailNotification: "ইমেইল বিজ্ঞপ্তি"
publish: "প্রকাশ"
useReactionPickerForContextMenu: "রাইট ক্লিকের মাধ্যমে রিঅ্যাকশন পিকার খুলুন"
typingUsers: "{users} লেখছে"
jumpToSpecifiedDate: "একটি নির্দিষ্ট তারিখে যান"
@ -692,7 +710,10 @@ switch: "পাল্টান"
noMaintainerInformationWarning: "প্রশাসকের তথ্য সেট করা হয়নি।"
noBotProtectionWarning: "বট প্রোটেকশন সেট করা হয়নি।"
configure: "কনফিগার করুন"
postToGallery: "গ্যালারী পোস্ট তৈরি করুন"
gallery: "গ্যালারী"
recentPosts: "নতুন পোস্ট"
popularPosts: "জনপ্রিয় পোস্ট"
shareWithNote: "নোটের মাধ্যমে শেয়ার করুন"
emailNotConfiguredWarning: "ইমেইল অ্যাড্রেস সেট করা হয়নি।"
ratio: "অনুপাত"
@ -700,7 +721,7 @@ previewNoteText: "প্রিভিউ দেখান"
customCss: "কাস্টম CSS"
customCssWarn: "এই ব্যাপারে অভিজ্ঞতা না থাকলে এই সেটিংটি ব্যাবহার করবেন না। অনুপযুক্ত\
\ সেটিংস ক্লায়েন্টকে স্বাভাবিকভাবে ব্যবহার করতে বাধা দিতে পারে।"
squareAvatars: "চারকোনা প্রোফাইল পিকচার দেখান"
squareAvatars: "চারকোনা প্রোফাইল পিকচার দেখান "
searchResult: "অনুসন্ধানের ফলাফল"
hashtags: "হ্যাশট্যাগ"
troubleshooting: "ট্রাবলশুটিং"
@ -744,7 +765,7 @@ hide: "লুকান"
leaveGroup: "গ্রুপ ছেড়ে চলে যান"
leaveGroupConfirm: "\"{name}\" গ্রুপ ছেড়ে চলে যেতে চান?"
useDrawerReactionPickerForMobile: "মোবাইলে রিঅ্যাকশন পিকারকে ড্রয়ারে প্রদর্শন করুন"
clickToFinishEmailVerification: "[{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত\
clickToFinishEmailVerification: " [{ok}] ক্লিক করার মাধ্যমে আপনার ইমেল ঠিকানা নিশ্চিত\
\ করুন।"
overridedDeviceKind: "ডিভাইসের ধরন"
smartphone: "স্মার্টফোন"
@ -764,12 +785,12 @@ oneDay: "একদিন"
oneWeek: "এক সপ্তাহ"
reflectMayTakeTime: "এটির কাজ দেখা যেতে কিছুটা সময় লাগতে পারে।"
failedToFetchAccountInformation: "অ্যাকাউন্টের তথ্য উদ্ধার করা যায়নি"
rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে"
rateLimitExceeded: "রেট লিমিট ছাড়িয়ে গেছে "
_emailUnavailable:
used: "এই ইমেইল ঠিকানাটি ইতোমধ্যে ব্যবহৃত হয়েছে"
format: "এই ইমেল ঠিকানাটি সঠিকভাবে লিখা হয়নি"
disposable: "অস্থায়ী ইমেইল ঠিকানা ব্যাবহার করা যাবে না"
mx: "ইমেইল সার্ভারটি ঠিক না"
mx: "ইমেইল সার্ভারটি ঠিক না"
smtp: "ইমেইল সার্ভারটি সাড়া দিচ্ছে না"
_ffVisibility:
public: "প্রকাশ"
@ -798,6 +819,11 @@ _forgotPassword:
\ প্রশাসকের সাথে যোগাযোগ করুন।"
contactAdmin: "এই ইন্সট্যান্সটি ইমেইল ব্যাবহার করে না, তাই আপনার পাসওয়ার্ড পুনরায়\
\ সেট করতে প্রশাসকের সাথে যোগাযোগ করুন৷"
_gallery:
my: "আমার গ্যালারী"
liked: "পছন্দ করা পোস্ট"
like: "পছন্দ করা"
unlike: "পছন্দ সরান"
_email:
_follow:
title: "আপনাকে অনুসরণ করছে"
@ -841,7 +867,8 @@ _mfm:
center: "সেন্টার"
centerDescription: "লেখা মাঝ বরাবর দেখানো হবে"
inlineCode: "কোড (ইনলাইন)"
inlineCodeDescription: "প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা হবে."
inlineCodeDescription: " প্রোগ্রামের কোডের জন্য ইনলাইন সিনট্যাক্স হাইলাইটিং করা\
\ হবে"
blockCode: "কোড (ব্লক)"
blockCodeDescription: "মাল্টি-লাইন প্রোগ্রামের কোডের জন্য সিনট্যাক্স হাইলাইট করে।"
inlineMath: "গাণিতিক সূত্র (ইনলাইন)"
@ -964,6 +991,41 @@ _time:
minute: "মিনিট"
hour: "ঘণ্টা"
day: "দিন"
_tutorial:
title: "FoundKey কিভাবে ব্যাবহার করবেন"
step1_1: "স্বাগতম!"
step1_2: "এই স্ক্রীনটিকে \"টাইমলাইন\" বলা হয় এবং কালানুক্রমিক ক্রমে আপনার এবং আপনি\
\ যাদের \"অনুসরণ করেন\" তাদের \"নোটগুলি\" দেখায়৷"
step1_3: "আপনি আপনার টাইমলাইনে কিছু দেখতে পাবেন না কারণ আপনি এখনও কোনো নোট পোস্ট\
\ করেননি এবং আপনি কাউকে অনুসরণ করছেন না৷"
step2_1: "নোট তৈরি করার আগে বা কাউকে অনুসরণ করার আগে প্রথমে আপনার প্রোফাইলটি সম্পূর্ণ\
\ করুন।"
step2_2: "আপনি কে তা জানা অনেক লোকের জন্য আপনার নোটগুলি দেখা এবং অনুসরণ করাকে সহজ\
\ করে তোলে৷"
step3_1: "আপনি কি সফলভাবে আপনার প্রোফাইল সেট আপ করেছেন?"
step3_2: "এখন, কিছু নোট পোস্ট করার চেষ্টা করুন। পোস্ট ফর্ম খুলতে পেন্সিল চিহ্নযুক্ত\
\ বাটনে ক্লিক করুন।"
step3_3: "বিষয়বস্তু লেখার পরে, আপনি ফর্মের উপরের ডানদিকের বাটনে ক্লিক করে পোস্ট\
\ করতে পারেন।"
step3_4: "পোস্ট করার মত কিছু মনে পরছে না? \"আমি মিসকি সেট আপ করছি\" বললে কেমন হয়?"
step4_1: "পোস্ট করেছেন?"
step4_2: "সাবাশ! এখন আপনার নোট টাইমলাইনে দেখা যাবে।"
step5_1: "এখন অন্যদেরকে অনুসরণ করে আপনার টাইমলাইনকে প্রাণবন্ত করে তুলুন।"
step5_2: "আপনি {featured}-এ জনপ্রিয় নোটগুলি দেখতে পারেন, যাতে আপনি যে ব্যক্তিকে\
\ পছন্দ করেন তাকে বেছে নিতে এবং অনুসরণ করতে পারেন, অথবা {explore}-এ জনপ্রিয় ব্যবহারকারীদের\
\ দেখতে পারেন৷"
step5_3: "একজন ব্যবহারকারীকে অনুসরণ করতে, ব্যবহারকারীর আইকনে ক্লিক করুন এবং ব্যবহারকারীর\
\ পৃষ্ঠাতে \"অনুসরণ করুন\" বাটনে ক্লিক করুন।"
step5_4: "যদি ব্যবহারকারীর নামের পাশে একটি লক আইকন থাকে তাহলে আপনার অনুসরণের অনুরোধ\
\ গ্রহণ করার জন্য তারা কিছু সময় নিতে পারে।"
step6_1: "সবকিছু ঠিক থাকলে আপনি টাইমলাইনে অন্য ব্যবহারকারীদের নোট দেখতে পাবেন।"
step6_2: "আপনি সহজেই আপনার প্রতিক্রিয়া জানাতে অন্য ব্যক্তির নোটে \"রিঅ্যাকশন\"\
\ যোগ করতে পারেন।"
step6_3: "একটি রিঅ্যাকশন যোগ করতে, নোটে \"+\" চিহ্নে ক্লিক করুন এবং আপনার পছন্দের\
\ রিঅ্যাকশন নির্বাচন করুন।"
step7_1: "অভিনন্দন! আপনি এখন FoundKey-র প্রাথমিক টিউটোরিয়ালটি শেষ করেছেন।"
step7_2: "আপনি যদি FoundKey সম্পর্কে আরও জানতে চান, তাহলে {help} এ দেখুন।"
step7_3: "এখন FoundKey উপভোগ করুন \U0001F680"
_2fa:
alreadyRegistered: "আপনি ইতিমধ্যে একটি 2-ফ্যাক্টর অথেনটিকেশন ডিভাইস নিবন্ধন করেছেন৷"
registerDevice: "নতুন ডিভাইস নিবন্ধন করুন"
@ -993,6 +1055,7 @@ _permissions:
"write:notes": "নোট লিখা"
"read:notifications": "বিজ্ঞপ্তিগুলি দেখুন"
"write:notifications": "বিজ্ঞপ্তি নিয়ে কাজ করে"
"read:reactions": "রিঅ্যাকশনগুলি দেখুন"
"write:reactions": "রিঅ্যাকশনগুলি সম্পাদনা করুন"
"write:votes": "ভোট দিন"
"read:pages": "আপনার পেজগুলি দেখুন"
@ -1003,6 +1066,10 @@ _permissions:
"write:user-groups": "ব্যাবহারকারী গ্রুপগুলি সম্পাদনা করুন"
"read:channels": "চ্যানেলগুলি দেখুন"
"write:channels": "চ্যানেলগুলি সম্পাদনা করুন"
"read:gallery": "গ্যালারী দেখুন"
"write:gallery": "গ্যালারী সম্পাদনা করুন"
"read:gallery-likes": "গ্যালারীর পছন্দগুলি দেখুন"
"write:gallery-likes": "গ্যালারীর পছন্দগুলি সম্পাদনা করুন"
_auth:
shareAccess: "\"{name}\" কে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"
shareAccessAsk: "অ্যাপ্লিকেশনটিকে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"

View File

@ -14,7 +14,7 @@ fetchingAsApObject: "Cercant en el Fediverse..."
ok: "OK"
gotIt: "Ho he entès!"
cancel: "Cancel·lar"
renotedBy: "Resignat per {user}"
renotedBy: "Resignat per {usuari}"
noNotes: "Cap nota"
noNotifications: "Cap notificació"
instance: "Instàncies"
@ -32,6 +32,9 @@ signup: "Registrar-se"
save: "Desar"
users: "Usuaris"
addUser: "Afegir un usuari"
favorite: "Afegir a preferits"
favorites: "Favorits"
unfavorite: "Eliminar dels preferits"
pin: "Fixar al perfil"
unpin: "Para de fixar del perfil"
copyContent: "Copiar el contingut"

View File

@ -32,6 +32,9 @@ signup: "Registrace"
save: "Uložit"
users: "Uživatelé"
addUser: "Přidat uživatele"
favorite: "Oblíbené"
favorites: "Oblíbené"
unfavorite: "Odebrat z oblízených"
pin: "Připnout"
unpin: "Odepnout"
copyContent: "Zkopírovat obsah"
@ -210,6 +213,7 @@ fromUrl: "Z URL"
uploadFromUrl: "Nahrát z URL adresy"
uploadFromUrlDescription: "URL adresa souboru, který chcete nahrát"
uploadFromUrlMayTakeTime: "Může trvat nějakou dobu, dokud nebude dokončeno nahrávání."
explore: "Objevovat"
messageRead: "Přečtené"
noMoreHistory: "To je vše"
startMessaging: "Zahájit chat"
@ -245,6 +249,7 @@ createFolder: "Vytvořit složku"
renameFolder: "Přejmenovat složku"
deleteFolder: "Odstranit složku"
addFile: "Přidat soubor"
emptyFolder: "Tato složka je prázdná"
unableToDelete: "Nelze smazat"
inputNewFileName: "Zadejte nový název"
copyUrl: "Kopírovat URL"
@ -280,6 +285,7 @@ inMb: "V megabajtech"
iconUrl: "Favicon URL"
bannerUrl: "Baner URL"
backgroundImageUrl: "Adresa URL obrázku pozadí"
pinnedUsers: "Připnutí uživatelé"
hcaptchaSecretKey: "Tajný Klíč (Secret Key)"
recaptchaSecretKey: "Tajný Klíč (Secret Key)"
antennas: "Antény"
@ -288,6 +294,7 @@ name: "Jméno"
antennaSource: "Zdroj Antény"
caseSensitive: "Rozlišuje malá a velká písmena"
connectedTo: "Následující účty jsou připojeny"
popularTags: "Populární tagy"
userList: "Seznamy"
aboutMisskey: "O FoundKey"
administrator: "Administrátor"
@ -325,6 +332,7 @@ transfer: "Převod"
title: "Titulek"
text: "Text"
enable: "Povolit"
next: "Další"
retype: "Zadejte znovu"
noteOf: "{user} poznámky"
inviteToGroup: "Pozvat do skupiny"

View File

@ -33,6 +33,9 @@ signup: "Registrieren"
save: "Speichern"
users: "Benutzer"
addUser: "Benutzer hinzufügen"
favorite: "Zu Favoriten hinzufügen"
favorites: "Favoriten"
unfavorite: "Aus Favoriten entfernen"
pin: "An dein Profil anheften"
unpin: "Von deinem Profil lösen"
copyContent: "Inhalt kopieren"
@ -191,8 +194,8 @@ blockedInstances: "Blockierte Instanzen"
blockedInstancesDescription: "Gib die Hostnamen der Instanzen, welche blockiert werden\
\ sollen, durch Zeilenumbrüche getrennt an. Blockierte Instanzen können mit dieser\
\ Instanz nicht mehr kommunizieren. Hostnamen, die nicht-ASCII-Zeichen enthalten,\
\ müssen zuvor in Punycode umgewandelt werden. Subdomains der aufgelisteten Hostnamen\
\ werden ebenfalls blockiert."
\ müssen zuvor in Punycode umgewandelt werden. Ein Asterisk (*) kann als Platzhalter\
\ für beliebig viele Zeichen verwendet werden."
muteAndBlock: "Stummschaltungen und Blockierungen"
mutedUsers: "Stummgeschaltete Benutzer"
blockedUsers: "Blockierte Benutzer"
@ -245,6 +248,7 @@ uploadFromUrlDescription: "URL der hochzuladenden Datei"
uploadFromUrlRequested: "Upload angefordert"
uploadFromUrlMayTakeTime: "Es kann eine Weile dauern, bis das Hochladen abgeschlossen\
\ ist."
explore: "Erkunden"
messageRead: "Gelesen"
noMoreHistory: "Kein weiterer Verlauf vorhanden"
startMessaging: "Neuen Chat erstellen"
@ -280,6 +284,8 @@ createFolder: "Ordner erstellen"
renameFolder: "Ordner umbenennen"
deleteFolder: "Ordner löschen"
addFile: "Datei hinzufügen"
emptyDrive: "Deine Drive ist leer"
emptyFolder: "Dieser Ordner ist leer"
unableToDelete: "Nicht löschbar"
inputNewFileName: "Gib einen neuen Dateinamen ein"
inputNewDescription: "Gib eine neue Beschreibung ein"
@ -327,10 +333,13 @@ inMb: "In Megabytes"
iconUrl: "Icon-URL (favicon etc)"
bannerUrl: "Banner-URL"
backgroundImageUrl: "Hintergrundbild-URL"
pinnedUsers: "Angeheftete Benutzer"
pinnedUsersDescription: "Gib durch Leerzeichen getrennte Benutzer an, die an die \"\
Erkunden\"-Seite angeheftet werden sollen."
hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Geheimer Schlüssel"
recaptchaSiteKey: "Site-Schlüssel"
recaptchaSecretKey: "Geheimer Schlüssel"
hcaptchaSecretKey: "Secret key"
recaptchaSiteKey: "Site key"
recaptchaSecretKey: "Secret key"
antennas: "Antennen"
manageAntennas: "Antennen verwalten"
name: "Name"
@ -353,6 +362,11 @@ silenceConfirm: "Möchtest du diesen Benutzer wirklich instanzweit stummschalten
unsilence: "Instanzweite Stummschaltung aufheben"
unsilenceConfirm: "Möchtest du die instanzweite Stummschaltung dieses Benutzers wirklich\
\ aufheben?"
popularUsers: "Beliebte Benutzer"
recentlyUpdatedUsers: "Vor kurzem aktive Benutzer"
recentlyRegisteredUsers: "Vor kurzem registrierte Benutzer"
recentlyDiscoveredUsers: "Vor kurzem gefundene Benutzer"
popularTags: "Beliebte Schlagwörter"
userList: "Liste"
aboutMisskey: "Über FoundKey"
administrator: "Administrator"
@ -393,6 +407,7 @@ messagingWithGroup: "Gruppenchat"
title: "Titel"
text: "Text"
enable: "Aktivieren"
next: "Weiter"
retype: "Erneut eingeben"
noteOf: "Notiz von {user}"
inviteToGroup: "Zu Gruppe einladen"
@ -590,6 +605,7 @@ reportAbuse: "Melden"
reportAbuseOf: "{name} melden"
fillAbuseReportDescription: "Bitte gib zusätzliche Informationen zu dieser Meldung\
\ an."
abuseReported: "Deine Meldung wurde versendet. Vielen Dank."
reporter: "Melder"
reporteeOrigin: "Herkunft des Gemeldeten"
reporterOrigin: "Herkunft des Meldenden"
@ -640,6 +656,7 @@ disableShowingAnimatedImages: "Animierte Bilder nicht abspielen"
verificationEmailSent: "Eine Bestätigungsmail wurde an deine Email-Adresse versendet.\
\ Besuche den dort enthaltenen Link, um die Verifizierung abzuschließen."
emailVerified: "Email-Adresse bestätigt"
noteFavoritesCount: "Anzahl an als Favorit markierter Notizen"
pageLikesCount: "Anzahl an als \"Gefällt mir\" markierter Seiten"
pageLikedCount: "Anzahl erhaltener \"Gefällt mir\" auf Seiten"
contact: "Kontakt"
@ -676,6 +693,7 @@ editCode: "Code bearbeiten"
apply: "Anwenden"
receiveAnnouncementFromInstance: "Benachrichtigungen von dieser Instanz empfangen"
emailNotification: "Email-Benachrichtigungen"
publish: "Veröffentlichen"
useReactionPickerForContextMenu: "Reaktionsauswahl durch Rechtsklick öffnen"
typingUsers: "{users} ist/sind am schreiben …"
jumpToSpecifiedDate: "Zu bestimmtem Datum springen"
@ -714,7 +732,11 @@ switch: "Wechseln"
noMaintainerInformationWarning: "Betreiberinformationen sind nicht konfiguriert."
noBotProtectionWarning: "Schutz vor Bots ist nicht konfiguriert."
configure: "Konfigurieren"
postToGallery: "Neuen Galeriebeitrag erstellen"
attachmentRequired: "Mindestens 1 Anhang ist erforderlich."
gallery: "Galerie"
recentPosts: "Neue Beiträge"
popularPosts: "Beliebte Beiträge"
shareWithNote: "Mit Notiz teilen"
emailNotConfiguredWarning: "Keine Email-Adresse hinterlegt."
ratio: "Verhältnis"
@ -805,7 +827,6 @@ _ffVisibility:
public: "Öffentlich"
followers: "Nur für Follower sichtbar"
private: "Privat"
nobody: Niemand (auch nicht du)
_signup:
almostThere: "Fast geschafft"
emailAddressInfo: "Bitte gib deine Email-Adresse ein. Sie wird nicht öffentlich\
@ -830,6 +851,11 @@ _forgotPassword:
\ wende dich bitte an den Administrator."
contactAdmin: "Diese Instanz unterstützt die Verwendung von Email-Adressen nicht.\
\ Wende dich an den Administrator, um dein Passwort zurückzusetzen."
_gallery:
my: "Meine Galerie"
liked: "Mit \"Gefällt mir\" markierte Beiträge"
like: "Gefällt mir"
unlike: "\"Gefällt mir\" entfernen"
_email:
_follow:
title: "Du hast einen neuen Follower"
@ -953,9 +979,9 @@ _wordMute:
\ trennen."
muteWordsDescription2: "Umgib Schlüsselworter mit Schrägstrichen, um Reguläre Ausdrücke\
\ zu verwenden."
softDescription: "Notizen, welche die angegebenen Konditionen erfüllen, in der Chronik\
softDescription: "Notizen, die die angegebenen Konditionen erfüllen, in der Chronik\
\ ausblenden."
hardDescription: "Verhindern, dass Notizen, welche die angegebenen Konditionen erfüllen,\
hardDescription: "Verhindern, dass Notizen, die die angegebenen Konditionen erfüllen,\
\ der Chronik hinzugefügt werden. Zudem werden diese Notizen auch nicht der Chronik\
\ hinzugefügt, falls die Konditionen geändert werden."
soft: "Leicht"
@ -1003,6 +1029,44 @@ _time:
minute: "Minute(n)"
hour: "Stunde(n)"
day: "Tag(en)"
_tutorial:
title: "Wie du FoundKey verwendest"
step1_1: "Willkommen!"
step1_2: "Diese Seite ist die „Chronik“. Sie zeigt dir deine geschrieben „Notizen“\
\ sowie die aller Benutzer, denen du „folgst“, in chronologischer Reihenfolge."
step1_3: "Deine Chronik sollte momentan leer sein, da du bis jetzt noch keine Notizen\
\ geschrieben hast und auch noch keinen Benutzern folgst."
step2_1: "Lass uns zuerst dein Profil vervollständigen, bevor du Notizen schreibst\
\ oder jemandem folgst."
step2_2: "Informationen darüber, was für eine Person du bist, macht es anderen leichter\
\ zu wissen, ob sie deine Notizen sehen wollen und ob sie dir folgen möchten."
step3_1: "Mit dem Einrichten deines Profils fertig?"
step3_2: "Dann lass uns als nächstes versuchen, eine Notiz zu schreiben. Dies kannst\
\ du tun, indem du auf den Knopf mit dem Stift-Icon auf dem Bildschirm drückst."
step3_3: "Fülle das Fenster aus und drücke auf den Knopf oben rechts zum Senden."
step3_4: "Fällt dir nichts ein, das du schreiben möchtest? Versuch's mit \"Hallo\
\ FoundKey!\""
step4_1: "Fertig mit dem Senden deiner ersten Notiz?"
step4_2: "Falls deine Notiz nun in deiner Chronik auftaucht, hast du alles richtig\
\ gemacht."
step5_1: "Lass uns nun deiner Chronik etwas mehr Leben einhauchen, indem du einigen\
\ anderen Benutzern folgst."
step5_2: "{featured} zeigt dir beliebte Notizen dieser Instanz. In {explore} kannst\
\ du beliebte Benutzer finden. Schau dort, ob du Benutzer findest, die dich interessieren!"
step5_3: "Klicke zum Anzeigen des Profils eines Benutzers auf dessen Profilbild\
\ und dann auf den \"Folgen\"-Knopf, um diesem zu folgen."
step5_4: "Je nach Benutzer kann es etwas Zeit in Anspruch nehmen, bis dieser deine\
\ Follow-Anfrage bestätigt."
step6_1: "Wenn du nun auch die Notizen anderer Benutzer in deiner Chronik siehst,\
\ hast du auch diesmal alles richtig gemacht."
step6_2: "Du kannst ebenso „Reaktionen“ verwenden, um schnell auf Notizen anderer\
\ Benutzer zu reagieren."
step6_3: "Um eine Reaktion anzufügen, klicke auf das „+“-Symbol in der Notiz und\
\ wähle ein Emoji aus, mit dem du reagieren möchtest."
step7_1: "Glückwunsch! Du hast die Einführung in die Verwendung von FoundKey abgeschlossen."
step7_2: "Wenn du mehr über FoundKey lernen möchtest, schau dich im {help}-Bereich\
\ um."
step7_3: "Und nun, viel Spaß mit FoundKey! \U0001F680"
_2fa:
alreadyRegistered: "Du hast bereits ein Gerät für Zwei-Faktor-Authentifizierung\
\ registriert."
@ -1019,39 +1083,40 @@ _2fa:
\ deinem Gerät auch Anmeldung mit Hilfe eines FIDO2-kompatiblen Hardware-Sicherheitsschlüssels\
\ einrichten."
_permissions:
"read:account": "Benutzerkonto-Informationen lesen"
"write:account": "Benutzerkonto-Informationen bearbeiten"
"read:blocks": "Liste der blockierten Benutzer lesen"
"write:blocks": "Liste der blockierten Benutzer bearbeiten"
"read:drive": "Drive-Dateien und -Ordner auflisten"
"write:drive": "Drive-Dateien und -Ordner erstellen, bearbeiten oder löschen"
"read:favorites": "Favorisierte Notizen auflisten"
"write:favorites": "Favorisierung von Notizen hinzufügen oder entfernen"
"read:following": "Gefolgte und folgende Benutzer auflisten"
"read:account": "Deine Benutzerkontoinformationen lesen"
"write:account": "Deine Benutzerkontoinformationen bearbeiten"
"read:blocks": "Die Liste deiner blockierten Benutzer lesen"
"write:blocks": "Die Liste deiner blockierten Benutzer bearbeiten"
"read:drive": "Deine Drive-Dateien und Ordner lesen"
"write:drive": "Deine Drive-Dateien und Ordner bearbeiten oder löschen"
"read:favorites": "Deine Favoriten-Liste lesen"
"write:favorites": "Deine Favoriten-Liste bearbeiten"
"read:following": "Die Liste der Benutzer, denen du folgst, lesen"
"write:following": "Anderen Benutzern folgen oder entfolgen"
"read:messaging": "Chats und Chatverläufe lesen"
"write:messaging": "Chatnachrichten erstellen oder löschen"
"read:mutes": "Stummschaltungen und Renote-Stummschaltungen auflisten"
"write:mutes": "Stummschaltungen und Renote-Stummschaltungen bearbeiten"
"read:messaging": "Chats lesen"
"write:messaging": "Chats bedienen"
"read:mutes": "Stummschaltungen lesen"
"write:mutes": "Stummschaltungen bearbeiten"
"write:notes": "Notizen schreiben oder löschen"
"read:notifications": "Benachrichtigungen lesen"
"write:notifications": "Benachrichtigungen als gelesen markieren oder App-Benachrichtigungen\
\ erstellen"
"write:reactions": "Reaktionen erstellen oder löschen"
"write:votes": "In Umfragen abstimmen"
"read:pages": "Deine Seiten auflisten und lesen"
"write:pages": "Seiten erstellen, bearbeiten oder löschen"
"read:page-likes": "Seiten, die mir gefallen, auflisten und auslesen"
"write:page-likes": "\"Gefällt mir\"-Markierung von Seiten bearbeiten"
"read:user-groups": "beigetretene, erstellte und eingeladene Benutzergruppen auflisten\
\ und lesen"
"write:user-groups": "Benutzergruppen erstellen, bearbeiten, löschen, übertragen,\
\ zu diesen beitreten oder diese verlassen. Andere Benutzer zu diesen Einladen\
\ oder Benutzer aus diesen Bannen. Einladungen zu Benutzergruppen annehmen oder\
\ ablehnen."
"read:channels": "gefolgte und beigetretene Kanäle auflisten und lesen"
"write:channels": "Kanäle erstellen, bearbeiten, diesen folgen und entfolgen"
"read:reactions": Reaktionen ansehen
"write:notifications": "Benachrichtigungen bedienen"
"read:reactions": "Reaktionen lesen"
"write:reactions": "Reaktionen bedienen"
"write:votes": "Umfragen bedienen"
"read:pages": "Deine Seiten lesen"
"write:pages": "Deine Seiten bearbeiten oder löschen"
"read:page-likes": "Liste der Seiten, die mir gefallen, lesen"
"write:page-likes": "Liste der Seiten, die mir gefallen, bearbeiten"
"read:user-groups": "Benutzergruppen lesen"
"write:user-groups": "Benutzergruppen bearbeiten oder löschen"
"read:channels": "Kanäle lesen"
"write:channels": "Kanäle bedienen"
"read:gallery": "Beiträge deiner Galerie lesen"
"write:gallery": "Deine Galerie bearbeiten"
"read:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge\
\ lesen"
"write:gallery-likes": "Liste deiner mit \"Gefällt mir\" markierten Galerie-Beiträge\
\ bearbeiten"
_auth:
shareAccess: "Möchtest du „{name}“ authorisieren, auf dieses Benutzerkonto zugreifen\
\ zu können?"
@ -1224,7 +1289,7 @@ _pages:
hideTitleWhenPinned: "Seitentitel wenn angeheftet ausblenden"
font: "Schriftart"
fontSerif: "Serif"
fontSansSerif: "serifenlos"
fontSansSerif: "Sans Serif"
eyeCatchingImageSet: "Vorschaubild festlegen"
eyeCatchingImageRemove: "Vorschaubild entfernen"
_relayStatus:
@ -1259,8 +1324,6 @@ _notification:
followRequestAccepted: "Akzeptierte Follow-Anfragen"
groupInvited: "Erhaltene Gruppeneinladungen"
app: "Benachrichtigungen von Apps"
move: Account-Umzüge
update: Beobachtete Notiz wurde bearbeitet
_actions:
followBack: "folgt dir nun auch"
reply: "Antworten"
@ -1303,7 +1366,7 @@ confirmToUnclipAlreadyClippedNote: "Diese Notiz ist bereits im \"{name}\" Clip e
noEmailServerWarning: "Es ist kein Email-Server konfiguriert."
thereIsUnresolvedAbuseReportWarning: "Es liegen ungelöste Meldungen vor."
recommended: "Empfehlung"
check: "Überprüfen"
check: "Check"
maxCustomEmojiPicker: Maximale Anzahl vorgeschlagener benutzerdefinierter Emoji
maxUnicodeEmojiPicker: Maximale Anzahl vorgeschlagener Unicode-Emoji
documentation: Dokumentation
@ -1330,34 +1393,9 @@ addTag: Schlagwörter hinzufügen
removeTag: Schlagwörter entfernen
exportAll: Alle exportieren
exportSelected: Gewählte exportieren
federateBlocks: Anderen Instanzen mitteilen, wenn ich jemanden blockiere
federateBlocks: Andere Instanzen mitteilen, wenn ich jemanden blockiere
selectMode: Auswählen
selectAll: Alle auswählen
renoteUnmute: Renotes zeigen
renoteMute: Renotes verstecken
externalCssSnippets: Einige CSS-Schnipsel zur Inspiration (nicht durch FoundKey verwaltet)
botFollowRequiresApproval: Follow-Anfragen von als Bot markierten Accounts benötigen
Bestätigung
unrenoteAll: alle Renotes zurücknehmen
unrenoteAllConfirm: Bist du sicher, dass du alle Renotes zurücknehmen möchtest?
deleteAllFiles: Alle Dateien löschen
cannotAttachFileWhenAccountSwitched: Kann keine Dateien anhängen, während ein anderer
Account eingestellt ist.
cannotSwitchAccountWhenFileAttached: Kann keinen anderen Account einstellen, solange
Dateien angehängt sind.
oauthErrorGoBack: Bei der Authentifizierung einer Drittanbieter-Anwendung ist ein
Fehler aufgetreten. Bitte geh zurück und versuche es erneut.
appAuthorization: Anwendungs-Authorisierung
noPermissionsRequested: (Keine Berechtigungen angefordert.)
_remoteInteract:
title: Es tut mir leid, aber das kann ich nicht tun.
description: Diese Aktion kann gerade nicht ausgeführt werden. Vermutlich musst
du diese Aktion auf deiner eigenen Instanz ausführen, oder dich anmelden.
urlInstructions: Kopiere diese URL. Wenn du sie auf deiner Instanz in das Suchfeld
einfügst, solltest du zum richtigen Ort gelangen.
movedTo: Diese Person ist umgezogen zu {handle}.
attachedToNotes: Notizen mit dieser Datei
showAttachedNotes: Zeige Notizen mit dieser Datei
uploadFailed: Hochladen fehlgeschlagen
uploadFailedDescription: Die Datei konnte nicht hochgeladen werden.
uploadFailedSize: Die Datei ist zu groß.

View File

@ -32,6 +32,9 @@ signup: "Sign Up"
save: "Save"
users: "Users"
addUser: "Add a user"
favorite: "Add to favorites"
favorites: "Favorites"
unfavorite: "Remove from favorites"
pin: "Pin to profile"
unpin: "Unpin from profile"
copyContent: "Copy contents"
@ -85,7 +88,6 @@ youShouldUpgradeClient: "To view this page, please refresh to update your client
enterListName: "Enter a name for the list"
privacy: "Privacy"
makeFollowManuallyApprove: "Follow requests require approval"
botFollowRequiresApproval: "Follow requests from accounts marked as bots require approval"
defaultNoteVisibility: "Default visibility"
follow: "Follow"
followRequest: "Send follow request"
@ -230,9 +232,6 @@ resetAreYouSure: "Really reset?"
saved: "Saved"
messaging: "Chat"
upload: "Upload"
uploadFailed: "Upload failed"
uploadFailedDescription: "The file could not be uploaded."
uploadFailedSize: "The file is too large to be uploaded."
keepOriginalUploading: "Keep original image"
keepOriginalUploadingDescription: "Saves the originally uploaded image as-is. If turned\
\ off, a version to display on the web will be generated on upload."
@ -242,6 +241,7 @@ uploadFromUrl: "Upload from a URL"
uploadFromUrlDescription: "URL of the file you want to upload"
uploadFromUrlRequested: "Upload requested"
uploadFromUrlMayTakeTime: "It may take some time until the upload is complete."
explore: "Explore"
messageRead: "Read"
noMoreHistory: "There is no further history"
startMessaging: "Start a new chat"
@ -277,6 +277,8 @@ createFolder: "Create a folder"
renameFolder: "Rename this folder"
deleteFolder: "Delete this folder"
addFile: "Add a file"
emptyDrive: "Your Drive is empty"
emptyFolder: "This folder is empty"
unableToDelete: "Unable to delete"
inputNewFileName: "Enter a new filename"
inputNewDescription: "Enter new caption"
@ -323,6 +325,9 @@ inMb: "In megabytes"
iconUrl: "Icon URL"
bannerUrl: "Banner image URL"
backgroundImageUrl: "Background image URL"
pinnedUsers: "Pinned users"
pinnedUsersDescription: "List usernames separated by line breaks to be pinned in the\
\ \"Explore\" tab."
hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key"
recaptchaSiteKey: "Site key"
@ -343,12 +348,15 @@ withReplies: "Include replies"
connectedTo: "Following account(s) are connected"
notesAndReplies: "Notes and replies"
withFiles: "Including files"
attachedToNotes: "Notes with this file"
showAttachedNotes: "Show notes with this file"
silence: "Silence"
silenceConfirm: "Are you sure that you want to silence this user?"
unsilence: "Undo silencing"
unsilenceConfirm: "Are you sure that you want to undo the silencing of this user?"
popularUsers: "Popular users"
recentlyUpdatedUsers: "Recently active users"
recentlyRegisteredUsers: "Newly joined users"
recentlyDiscoveredUsers: "Newly discovered users"
popularTags: "Popular tags"
userList: "Lists"
aboutMisskey: "About FoundKey"
administrator: "Administrator"
@ -389,6 +397,7 @@ messagingWithGroup: "Group chat"
title: "Title"
text: "Text"
enable: "Enable"
next: "Next"
retype: "Enter again"
noteOf: "Note by {user}"
inviteToGroup: "Invite to group"
@ -492,10 +501,7 @@ scratchpadDescription: "The Scratchpad provides an environment for AiScript expe
\ in it."
output: "Output"
updateRemoteUser: "Update remote user information"
deleteAllFiles: "Delete all files"
deleteAllFilesConfirm: "Are you sure that you want to delete all files?"
deleteAllNotes: "Delete all notes"
deleteAllNotesConfirm: "Are you sure that you want to delete all visible notes of this clip?"
removeAllFollowing: "Unfollow all followed users"
removeAllFollowingDescription: "Executing this unfollows all accounts from {host}.\
\ Please run this if the instance e.g. no longer exists."
@ -586,6 +592,7 @@ abuseReports: "Reports"
reportAbuse: "Report"
reportAbuseOf: "Report {name}"
fillAbuseReportDescription: "Please fill in details regarding this report."
abuseReported: "Your report has been sent. Thank you very much."
reporter: "Reporter"
reporteeOrigin: "Reportee Origin"
reporterOrigin: "Reporter Origin"
@ -636,6 +643,7 @@ disableShowingAnimatedImages: "Don't play animated images"
verificationEmailSent: "A verification email has been sent. Please follow the included\
\ link to complete verification."
emailVerified: "Email has been verified"
noteFavoritesCount: "Number of favorite notes"
pageLikesCount: "Number of liked Pages"
pageLikedCount: "Number of received Page likes"
contact: "Contact"
@ -670,6 +678,7 @@ editCode: "Edit code"
apply: "Apply"
receiveAnnouncementFromInstance: "Receive notifications from this instance"
emailNotification: "Email notifications"
publish: "Publish"
useReactionPickerForContextMenu: "Open reaction picker on right-click"
typingUsers: "{users} is/are typing..."
jumpToSpecifiedDate: "Jump to specific date"
@ -700,8 +709,6 @@ botProtection: "Bot Protection"
instanceBlocking: "Blocked Instances"
selectAccount: "Select account"
switchAccount: "Switch account"
cannotAttachFileWhenAccountSwitched: "You cannot attach a file while switched to another account."
cannotSwitchAccountWhenFileAttached: "You cannot switch accounts while files are attached."
enabled: "Enabled"
disabled: "Disabled"
quickAction: "Quick actions"
@ -712,7 +719,11 @@ switch: "Switch"
noMaintainerInformationWarning: "Maintainer information is not configured."
noBotProtectionWarning: "Bot protection is not configured."
configure: "Configure"
postToGallery: "Create new gallery post"
attachmentRequired: "At least 1 attachment is required."
gallery: "Gallery"
recentPosts: "Recent posts"
popularPosts: "Popular posts"
shareWithNote: "Share with note"
emailNotConfiguredWarning: "Email address not set."
ratio: "Ratio"
@ -819,7 +830,6 @@ oauthErrorGoBack: "An error happened while trying to authenticate a 3rd party ap
\ Please go back and try again."
appAuthorization: "App authorization"
noPermissionsRequested: "(No permissions requested.)"
movedTo: "This user has moved to {handle}."
_emailUnavailable:
used: "This email address is already being used"
format: "The format of this email address is invalid"
@ -830,7 +840,6 @@ _ffVisibility:
public: "Public"
followers: "Visible to followers only"
private: "Private"
nobody: "Nobody (not even you)"
_signup:
almostThere: "Almost there"
emailAddressInfo: "Please enter your email address. It will not be made public."
@ -853,6 +862,11 @@ _forgotPassword:
\ instance administrator instead."
contactAdmin: "This instance does not support using email addresses, please contact\
\ the instance administrator to reset your password instead."
_gallery:
my: "My Gallery"
liked: "Liked Posts"
like: "Like"
unlike: "Remove like"
_email:
_follow:
title: "You've got a new follower"
@ -1020,6 +1034,39 @@ _time:
minute: "Minute(s)"
hour: "Hour(s)"
day: "Day(s)"
_tutorial:
title: "How to use FoundKey"
step1_1: "Welcome!"
step1_2: "This page is called the \"timeline\". It shows chronologically ordered\
\ \"notes\" of people who you \"follow\"."
step1_3: "Your timeline is currently empty, since you have not posted any notes\
\ or followed anyone yet."
step2_1: "Let's finish setting up your profile before writing a note or following\
\ anyone."
step2_2: "Providing some information about who you are will make it easier for others\
\ to tell if they want to see your notes or follow you."
step3_1: "Finished setting up your profile?"
step3_2: "Then let's try posting a note next. You can do so by pressing the button\
\ with a pencil icon on the screen."
step3_3: "Fill in the modal and press the button on the top right to post."
step3_4: "Have nothing to say? Try \"just setting up my msky\"!"
step4_1: "Finished posting your first note?"
step4_2: "Hurray! Now your first note should be displayed on your timeline."
step5_1: "Now, let's try making your timeline more lively by following other people."
step5_2: "{featured} will show you popular notes in this instance. {explore} will\
\ let you find popular users. Try finding people you'd like to follow there!"
step5_3: "To follow other users, click on their icon and press the \"Follow\" button\
\ on their profile."
step5_4: "If the other user has a lock icon next to their name, it may take some\
\ time for that user to manually approve your follow request."
step6_1: "You should be able to see other users' notes on your timeline now."
step6_2: "You can also put \"reactions\" on other people's notes to quickly respond\
\ to them."
step6_3: "To attach a \"reaction\", press the \"+\" mark on another user's note\
\ and choose an emoji you'd like to react with."
step7_1: "Congratulations! You have now finished FoundKey's basic tutorial."
step7_2: "If you would like to learn more about FoundKey, try the {help} section."
step7_3: "Now then, good luck and have fun with FoundKey! \U0001F680"
_2fa:
alreadyRegistered: "You have already registered a 2-factor authentication device."
registerDevice: "Register a new device"
@ -1050,7 +1097,6 @@ _permissions:
"write:notes": "Create and delete notes"
"read:notifications": "Read notifications"
"write:notifications": "Mark notifications as read and create custom notifications"
"read:reactions": "View reactions"
"write:reactions": "Create and delete reactions"
"write:votes": "Vote in polls"
"read:pages": "List and read pages"
@ -1061,6 +1107,10 @@ _permissions:
"write:user-groups": "Create, modify, delete, transfer, join and leave groups. Invite and ban others from groups. Accept and reject group invitations."
"read:channels": "List and read followed and joined channels"
"write:channels": "Create, modify, follow and unfollow channels"
"read:gallery": "List and read gallery posts"
"write:gallery": "Create, modify and delete gallery posts"
"read:gallery-likes": "List and read gallery post likes"
"write:gallery-likes": "Like and unlike gallery posts"
_auth:
shareAccess: "Would you like to authorize \"{name}\" to access this account?"
shareAccessAsk: "Are you sure you want to authorize this application to access your\
@ -1205,7 +1255,6 @@ _timelines:
local: "Local"
social: "Social"
global: "Global"
shuffled: "Shuffled"
_pages:
newPage: "Create a new Page"
editPage: "Edit this Page"
@ -1263,11 +1312,9 @@ _notification:
reaction: "Reactions"
pollVote: "Votes on polls"
pollEnded: "Polls ending"
update: "Watched Note was updated"
receiveFollowRequest: "Received follow requests"
followRequestAccepted: "Accepted follow requests"
groupInvited: "Group invitations"
move: "Others moving accounts"
app: "Notifications from linked apps"
_actions:
followBack: "followed you back"
@ -1301,7 +1348,3 @@ _translationService:
_libreTranslate:
endpoint: "LibreTranslate API Endpoint"
authKey: "LibreTranslate Auth Key (optional)"
_remoteInteract:
title: "I'm sorry, I'm afraid I can't do that."
description: "You cannot perform this action right now. You probably need to do it on your own instance, or sign in."
urlInstructions: "You can copy this URL. If you paste it into the search field on your instance, you should be taken to the right location."

View File

@ -33,6 +33,9 @@ signup: "Registrarse"
save: "Guardar"
users: "Usuarios"
addUser: "Agregar usuario"
favorite: "Favorito"
favorites: "Favoritos"
unfavorite: "Quitar de favoritos"
pin: "Fijar"
unpin: "Desfijar"
copyContent: "Copiar contenido"
@ -182,17 +185,16 @@ clearQueueConfirmText: "Las notas aún no entregadas no se federarán. Normalmen
clearCachedFiles: "Limpiar caché"
clearCachedFilesConfirm: "¿Desea borrar todos los archivos remotos cacheados?"
blockedInstances: "Instancias bloqueadas"
blockedInstancesDescription: "Seleccione los hosts de las instancias que desea bloquear.\
\ Las instancias listadas no podrán comunicarse con esta instancia. Los nombres\
\ de dominios Non-ASCII deben ser codificados con punycode.\nLos sub dominios de\
\ la lista de instancias serán bloqueados también."
blockedInstancesDescription: "Seleccione los hosts de las instancias que desea bloquear,\
\ separadas por una linea nueva. Las instancias bloqueadas no podrán comunicarse\
\ con esta instancia."
muteAndBlock: "Silenciar y bloquear"
mutedUsers: "Usuarios silenciados"
blockedUsers: "Usuarios bloqueados"
noUsers: "No hay usuarios"
editProfile: "Editar perfil"
noteDeleteConfirm: "¿Desea borrar esta nota?"
pinLimitExceeded: "Ya no se pueden fijar más notas."
pinLimitExceeded: "Ya no se pueden fijar más posts"
intro: "¡La instalación de FoundKey ha terminado! Crea el usuario administrador."
done: "Terminado"
processing: "Procesando"
@ -238,6 +240,7 @@ uploadFromUrl: "Subir desde una URL"
uploadFromUrlDescription: "URL del fichero que quieres subir"
uploadFromUrlRequested: "Subida solicitada"
uploadFromUrlMayTakeTime: "Subir el fichero puede tardar un tiempo."
explore: "Explorar"
messageRead: "Ya leído"
noMoreHistory: "El historial se ha acabado"
startMessaging: "Iniciar chat"
@ -272,6 +275,8 @@ createFolder: "Crear carpeta"
renameFolder: "Renombrar carpeta"
deleteFolder: "Borrar carpeta"
addFile: "Agregar archivo"
emptyDrive: "El drive está vacío"
emptyFolder: "La carpeta está vacía"
unableToDelete: "No se puede borrar"
inputNewFileName: "Ingrese un nuevo nombre de archivo"
inputNewDescription: "Ingrese nueva descripción"
@ -318,6 +323,9 @@ inMb: "En megabytes"
iconUrl: "URL de la imagen del avatar"
bannerUrl: "URL de la imagen del banner"
backgroundImageUrl: "URL de la imagen de fondo"
pinnedUsers: "Usuarios fijados"
pinnedUsersDescription: "Describir los usuarios que quiere fijar en la página \"Descubrir\"\
\ separados por una linea nueva"
hcaptchaSiteKey: "Clave del sitio"
hcaptchaSecretKey: "Clave secreta"
recaptchaSiteKey: "Clave del sitio"
@ -342,6 +350,11 @@ silence: "Silenciar"
silenceConfirm: "¿Desea silenciar al usuario?"
unsilence: "Dejar de silenciar"
unsilenceConfirm: "¿Desea dejar de silenciar al usuario?"
popularUsers: "Usuarios populares"
recentlyUpdatedUsers: "Usuarios activos recientemente"
recentlyRegisteredUsers: "Usuarios registrados recientemente"
recentlyDiscoveredUsers: "Usuarios descubiertos recientemente"
popularTags: "Etiquetas populares"
userList: "Lista"
aboutMisskey: "Sobre FoundKey"
administrator: "Administrador"
@ -382,6 +395,7 @@ messagingWithGroup: "Chatear en grupo"
title: "Título"
text: "Texto"
enable: "Activar"
next: "Siguiente"
retype: "Intentar de nuevo"
noteOf: "Notas de {user}"
inviteToGroup: "Invitar al grupo"
@ -457,7 +471,7 @@ objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión
objectStorageUseProxy: "Conectarse a través de Proxy"
objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión\
\ de Almacenamiento de objetos"
objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir"
objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir "
showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
newNoteRecived: "Tienes una nota nuevo"
sounds: "Sonidos"
@ -544,7 +558,7 @@ smtpPass: "Contraseña"
emptyToDisableSmtpAuth: "Deje el nombre del usuario y la contraseña en blanco para\
\ deshabilitar la autenticación SMTP"
smtpSecure: "Usar SSL/TLS implícito en la conexión SMTP"
smtpSecureInfo: "Apagar cuando se use STARTTLS."
smtpSecureInfo: "Apagar cuando se use STARTTLS"
testEmail: "Prueba de envío"
wordMute: "Silenciar palabras"
instanceMute: "Instancias silenciadas"
@ -573,6 +587,7 @@ abuseReports: "Reportes"
reportAbuse: "Reportar"
reportAbuseOf: "Reportar a {name}"
fillAbuseReportDescription: "Ingrese los detalles del reporte."
abuseReported: "Se ha enviado el reporte. Muchas gracias."
reporteeOrigin: "Informar a"
reporterOrigin: "Origen del informe"
forwardReport: "Transferir un informe a una instancia remota"
@ -584,7 +599,7 @@ openInNewTab: "Abrir en una Nueva Pestaña"
defaultNavigationBehaviour: "Navegación por defecto"
instanceTicker: "Información de notas de la instancia"
system: "Sistema"
switchUi: "Cambiar interfaz"
switchUi: "Cambiar interfaz de usuario"
desktop: "Escritorio"
clip: "Clip"
createNew: "Crear"
@ -624,6 +639,7 @@ verificationEmailSent: "Se le ha enviado un correo electrónico de confirmación
\ favor, acceda al enlace proporcionado en el correo electrónico para completar\
\ la configuración."
emailVerified: "Su dirección de correo electrónico ha sido verificada."
noteFavoritesCount: "Número de notas favoritas"
pageLikesCount: "Número de favoritos en la página"
pageLikedCount: "Número de favoritos de su página"
contact: "Contacto"
@ -659,6 +675,7 @@ editCode: "Editar código"
apply: "Aplicar"
receiveAnnouncementFromInstance: "Recibir notificaciones de la instancia"
emailNotification: "Notificaciones por correo electrónico"
publish: "Publicar"
useReactionPickerForContextMenu: "Haga clic con el botón derecho para abrir el menu\
\ de reacciones"
typingUsers: "{users} está escribiendo"
@ -675,7 +692,7 @@ notSpecifiedMentionWarning: "Algunas menciones no están incluidas en el destino
info: "Información"
userInfo: "Información del usuario"
unknown: "Desconocido"
hideOnlineStatus: "Mostrarse como desconectado"
hideOnlineStatus: "mostrarse como desconectado"
hideOnlineStatusDescription: "Ocultar su estado en línea puede reducir la eficacia\
\ de algunas funciones, como la búsqueda"
online: "En línea"
@ -696,7 +713,10 @@ switch: "Cambiar"
noMaintainerInformationWarning: "No se ha establecido la información del administrador"
noBotProtectionWarning: "La protección contra los bots no está configurada"
configure: "Configurar"
postToGallery: "Crear una nueva publicación en la galería"
gallery: "Galería"
recentPosts: "Posts recientes"
popularPosts: "Más vistos"
shareWithNote: "Compartir con una nota"
emailNotConfiguredWarning: "No se ha configurado una dirección de correo electrónico."
ratio: "Proporción"
@ -714,7 +734,7 @@ misskeyUpdated: "¡FoundKey ha sido actualizado!"
whatIsNew: "Mostrar cambios"
translate: "Traducir"
translatedFrom: "Traducido de {x}"
accountDeletionInProgress: "La eliminación de la cuenta está en curso."
accountDeletionInProgress: "La eliminación de la cuenta está en curso"
usernameInfo: "Un nombre que identifique su cuenta de otras en este servidor. Puede\
\ utilizar el alfabeto (a~z, A~Z), dígitos (0~9) o guiones bajos (_). Los nombres\
\ de usuario no se pueden cambiar posteriormente."
@ -741,60 +761,52 @@ ffVisibility: "Visibilidad de seguidores y seguidos"
hide: "Ocultar"
indefinitely: "Sin límite de tiempo"
_ffVisibility:
public: "Público"
private: Privado
followers: Visible solo a seguidores
public: "Publicar"
_accountDelete:
accountDelete: "Eliminar Cuenta"
started: La eliminación ha iniciado.
sendEmail: Cuando se complete la eliminación de la cuenta, un correo será enviado
a la dirección registrada de la cuenta.
requestAccountDelete: Solicitar eliminación de cuenta
inProgress: Eliminación en progreso
mayTakeTime: Como la eliminación de la cuenta es un proceso que consume muchos recursos,
puede llevar algún tiempo según la cantidad de contenido que se haya creado y
la cantidad de archivos que cargados.
_forgotPassword:
contactAdmin: "Esta instancia no admite el uso de direcciones de correo electrónico,\
\ póngase en contacto con el administrador de la instancia para restablecer su\
\ contraseña."
enterEmail: Ingrese el correo que se uso para el registro. Se enviará un link para
que resetear la contraseña.
ifNoEmail: Si no se utilizó un correo durante el registro, por favor contacte con
el administrador de la instancia.
\ contraseña"
_gallery:
my: "Mi galería"
liked: "Publicaciones que me gustan"
like: "¡Muy bien!"
unlike: "Quitar me gusta"
_email:
_follow:
title: "Tienes un nuevo seguidor"
title: "te ha seguido"
_receiveFollowRequest:
title: "Has recibido una solicitud de seguimiento"
_plugin:
install: "Instalar plugins"
installWarn: "Por favor no instale plugins que no son de confianza."
installWarn: "Por favor no instale plugins que no son de confianza"
_registry:
scope: "Alcance"
key: "Clave"
keys: "Claves"
keys: "Clave"
domain: "Dominio"
createKey: "Crear una llave"
_aboutMisskey:
about: "FoundKey es una bifurcación de Misskey desarrollada desde Julio de 2022."
about: "FoundKey es un software de código abierto, desarrollado por syuilo desde\
\ el 2014"
allContributors: "Todos los colaboradores"
source: "Código fuente"
_nsfw:
respect: "Ocultar medios NSFW"
ignore: "No esconder medios NSFW"
ignore: "No esconder medios NSFW "
force: "Ocultar todos los medios"
_mfm:
cheatSheet: "Hoja de referencia de MFM"
intro: "MFM es un lenguaje de marcado dedicado que se puede usar en varios lugares\
\ dentro de FoundKey. Aquí puede ver una lista de sintaxis disponibles en MFM."
dummy: "FoundKey expande el mundo del Fediverso"
dummy: "FoundKey expande el mundo de la Fediverso"
mention: "Menciones"
mentionDescription: "El signo @ seguido de un nombre de usuario se puede utilizar\
\ para notificar a un usuario en particular."
hashtag: "Hashtag #"
hashtag: "Hashtag"
url: "URL"
urlDescription: "Se pueden mostrar las URL."
urlDescription: "Se pueden mostrar las URL"
link: "Vínculo"
bold: "Negrita"
center: "Centrar"
@ -809,48 +821,6 @@ _mfm:
\ / derecha."
font: "Fuente"
rotate: "Rotar"
jump: Animación (Salto)
jumpDescription: Da al contenido un salto animado.
bounce: Animación (Bounce)
centerDescription: Muestra el contenido de manera centrada.
inlineCode: Código (Inline)
blockMath: 'Función matemática (Block)'
blockMathDescription: Muestra líneas múltiples de fórmulas matemáticas (KaTeX) en
un bloque.
inlineCodeDescription: Muestra resaltado de sintaxis en línea para el código (program).
quoteDescription: Muestra el contenido en una cita.
searchDescription: Muestra un cuadro de búsqueda con texto pre introducido.
jellyDescription: Le da al contenido una animación del tipo Jelly.
tada: Animación (Tada)
shake: Animación (Shake)
hashtagDescription: Puedes especificar un hashtag usando un número, signo y texto.
linkDescription: Partes especificas del texto pueden ser mostradas como URL.
boldDescription: Resalta las letras haciéndolas más gruesas.
small: Pequeño
smallDescription: Muestra el contenido de manera pequeña y delgada.
inlineMathDescription: Muestra fórmulas matemáticas (KaTeX) en linea.
tadaDescription: Da al contenido un "Tada!" del tipo animación.
bounceDescription: Brinda al contenido una animación de rebote.
emojiDescription: Al colocar dos puntos en un emoji personalizado, se puede mostrar
un emoji personalizado.
jelly: Animación (Jelly)
twitchDescription: Da al contenido una animación fuertemente temblorosa.
twitch: Animación (Twitch)
spin: Animación (Spin)
shakeDescription: Brinda al contenido una animación temblorosa.
inlineMath: Función matemática (Inline)
rainbow: Arcoíris
x4Description: Muestra el contenido de la manera más grandemente posible.
blurDescription: Muestra borroso el contenido. Se mostrará con claridad cuando se
cubra.
spinDescription: Da al contenido una animación de girar.
x2: Grande
x2Description: Muestra en grande el contenido.
x3Description: Muestra más grande el contenido.
x4: Increíblemente grande
blur: Borroso
fontDescription: Agrega la fuente para mostrar contenido.
x3: Muy grande
_instanceTicker:
none: "No mostrar"
remote: "Mostrar a usuarios remotos"
@ -925,6 +895,41 @@ _time:
minute: "Minutos"
hour: "Horas"
day: "Días"
_tutorial:
title: "Cómo usar FoundKey"
step1_1: "Bienvenido"
step1_2: "Esta imagen se llama \"Linea de tiempo\" y muestra en orden cronológico\
\ las \"notas\" tuyas y de la gente que \"sigues\""
step1_3: "Si no estás escribiendo ninguna nota y no estás siguiendo a nadie, es\
\ esperable que no se muestre nada en la linea de tiempo"
step2_1: "Antes de crear notas y seguir a alguien, primero vamos a crear tu perfil"
step2_2: "Si provees información sobre quien eres, será más fácil para que otros\
\ usuarios te sigan"
step3_1: "¿Has podido crear tu perfil sin problemas?"
step3_2: "Con esto, prueba hacer una nota. Aprieta el botón con forma de lápiz que\
\ está arriba de la imagen y abre el formulario."
step3_3: "Si has escrito el contenido, aprieta el botón que está arriba a la derecha\
\ del formulario para postear."
step3_4: "¿No se te ocurre un contenido? Prueba con decir \"Empecé a usar FoundKey\""
step4_1: "¿Has posteado?"
step4_2: "Si tu nota puede verse en la linea de tiempo, fue todo un éxito."
step5_1: "Luego, ponte a seguir a otra gente y haz que tu linea de tiempo esté más\
\ animada."
step5_2: "Puedes ver las notas destacadas en {featured} y desde allí seguir a usuarios\
\ que te importan. También puedes buscar usuario destacados en {explore}."
step5_3: "Para seguir a un usuario, haz click en su avatar para ver su página de\
\ usuario y allí apretar el botón \"seguir\""
step5_4: "De esa manera, puede pasar un tiempo hasta que el usuario apruebe al seguidor."
step6_1: "Si puedes ver en la linea de tiempo las notas de otros usuarios, fue todo\
\ un éxito."
step6_2: "En las notas de otros usuarios puedes añadir una \"reacción\", para poder\
\ responder rápidamente."
step6_3: "Para añadir una reacción, haz click en el botón \"+\" de la nota y elige\
\ la reacción que prefieras."
step7_1: "Así terminó la explicación del funcionamiento básico de FoundKey. Eso\
\ fue todo."
step7_2: "Si quieres conocer más sobre FoundKey, prueba con la sección {help}."
step7_3: "Así, disfruta de FoundKey \U0001F680"
_2fa:
alreadyRegistered: "Ya has completado la configuración."
registerDevice: "Registrar dispositivo"
@ -955,6 +960,7 @@ _permissions:
"write:notes": "Crear/borrar notas"
"read:notifications": "Ver notificaciones"
"write:notifications": "Administrar notificaciones"
"read:reactions": "Ver reacciones"
"write:reactions": "Administrar reacciones"
"write:votes": "Votar"
"read:pages": "Ver páginas"
@ -1138,7 +1144,7 @@ _notification:
youWereFollowed: "te ha seguido"
youReceivedFollowRequest: "Has mandado una solicitud de seguimiento"
yourFollowRequestAccepted: "Tu solicitud de seguimiento fue aceptada"
youWereInvitedToGroup: "{userName} invitado al grupo"
youWereInvitedToGroup: "Invitado al grupo"
_types:
follow: "Siguiendo"
mention: "Menciones"
@ -1173,116 +1179,3 @@ _deck:
mentions: "Menciones"
direct: "Mensaje directo"
_services: {}
translationService: Servicio de traducción
translationSettings: Ajustes de traducción
selectAll: Seleccionar todo
setCategory: Establecer categoría
unlimited: Ilimitado
setTag: Establecer tag
recentNHours: Últimas {n} horas
check: Verificar
unrenoteAll: Quitar todas las renotas
unclip: Desenganchar
deleteAllFiles: Borrar todos los archivos.
voteConfirm: ¿Confirmas tu voto para "{choice}"?
tenMinutes: 10 minutos
oneHour: Una hora
failedToFetchAccountInformation: No se pudo obtener la información de la cuenta
rateLimitExceeded: Límite de velocidad excedido
cropImage: Cortar imagen
recentNDays: Últimos {n} días
typeToConfirm: Por favor ingrese {x} para confirmar
cropImageAsk: ¿Desea cortar esta imagen?
cannotAttachFileWhenAccountSwitched: No puedes adjuntar un archivo mientras cambias
de cuenta.
cannotSwitchAccountWhenFileAttached: No puedes cambiar de cuenta mientras se adjuntan
archivos.
threadMuteNotificationsDesc: Selecciona las notificaciones que deseas ver de este
hilo. Los ajustes globales de notificación también se aplicarán. La desactivación
tiene prioridad.
ffVisibilityDescription: Permite configurar quien puede ver a quienes sigues y quienes
te siguen.
deleteAccountConfirm: Esto borrará se manera irreversible tu cuenta {handle}. ¿Quieres
proceder?
incorrectPassword: Contraseña incorrecta.
leaveGroup: Dejar grupo
overridedDeviceKind: Tipo de dispositivo
smartphone: Smartphone
auto: Automático
themeColor: Color de teletipo de instancia
size: Tamaño
numberOfColumn: Número de columnas
instanceDefaultLightTheme: Tema claro predeterminado para la instancia
oneDay: Un día
oneWeek: Una semana
numberOfPageCache: Número de páginas en caché
confirmToUnclipAlreadyClippedNote: Esta nota ya forma parte del clip "{name}". ¿Quieres
eliminarlo de este clip en su lugar?
noEmailServerWarning: Correo del servidor no configurado.
thereIsUnresolvedAbuseReportWarning: Hay reportes sin resolver.
recommended: Recomendado
addTag: Agregar tag
removeTag: Quitar tag
_emailUnavailable:
used: El correo ya se encuentra en uso
format: El formato del correo es invalido
disposable: No se puede utilizar direcciones de correo electrónico desechables
mx: El servidor del correo es inválido
smtp: El servido del correo no responde
exportAll: Exportar todo
exportSelected: Exportar seleccionados
botFollowRequiresApproval: Solicitudes de seguimiento de cuentas marcadas como "bots"
necesitan aprobación
unrenoteAllConfirm: ¿Estas seguro de querer quitar todas las renotas de esta nota?
signinHistoryExpires: Los datos de los intentos de sesión serán borrados automáticamente
luego de 60 días, debido a regulaciones de privacidad.
tablet: Tableta
mutePeriod: Duración de mute
reflectMayTakeTime: Puede tomar cierto tiempo en que se reflejen los cambios.
isSystemAccount: Una cuenta creada y operada automáticamente por el sistema.
deleteAccount: Eliminar cuenta
numberOfPageCacheDescription: Aumentar este número mejorará la comodidad para los
usuarios, pero provocará una mayor carga del servidor y más memoria se utilizará.
externalCssSnippets: Algunos fragmentos de CSS para inspirar (no administrados por
FoundKey)
_signup:
emailSent: Se envió un correo de confirmación a ({email}). Por favor haz click en
link adjunto para completar la creación de cuenta.
almostThere: Ya casi
emailAddressInfo: Por favor ingresa tu correo electrónico. No sera público.
instanceDefaultThemeDescription: Ingrese el código de tema en el formato del objeto
stopActivityDeliveryDescription: Las actividades locales no serán enviadas a esta
instancia. Las actividades recibidas de recepción funcionan como antes.
documentation: Documentación
file: Archivo
federateBlocks: Bloques Federados
federateBlocksDescription: Si esta deshabilitado, las actividades bloqueadas no serán
enviadas.
useDrawerReactionPickerForMobile: Mostrar selección de reacción como cajón en móvil
leaveGroupConfirm: ¿Estas seguro de salir "{name}"?
clickToFinishEmailVerification: Por favor presiona [{ok}] para completar la verificación
email.
oauthErrorGoBack: Ocurrió un error al tratar de autenticar una app de terceros. Por
favor regresa e intenta de nuevo.
appAuthorization: Autorización de app
noPermissionsRequested: (No hay permisos solicitados).
selectMode: Selección múltiple
renoteMute: Ocultar renotas
renoteUnmute: Mostrar renotas
blockThisInstanceDescription: Las actividades locales no serán enviadas a esta instancia.
Las actividades de esta instancia serán descartadas.
instanceDefaultDarkTheme: Tema oscuro predeterminado para la instancia
showLess: Mostrar menos
regexpError: Error de Expresión Regular
regexpErrorDescription: 'Hay un error en la expresión regular de la linea {line} de
{tab} palabras silenciadas:'
unlikeConfirm: ¿En verdad quieres remover tu like?
breakFollow: Quitar seguidor
reporter: Reportero
continueThread: Ver la continuación del hilo
uploadFailedSize: El archivo es muy grande para subirse.
uploadFailed: Subida fallida
uploadFailedDescription: No se pudo subir el archivo.
movedTo: Este usuario se ha movido a {handle}.
attachedToNotes: Notas del archivo
showAttachedNotes: Mostrar notas del archivo

View File

@ -34,6 +34,9 @@ signup: "Sinscrire"
save: "Enregistrer"
users: "Utilisateur·rice·s"
addUser: "Ajouter un·e utilisateur·rice"
favorite: "Ajouter aux favoris"
favorites: "Favoris"
unfavorite: "Retirer des favoris"
pin: "Épingler sur le profil"
unpin: "Désépingler"
copyContent: "Copier le contenu"
@ -68,8 +71,8 @@ importRequested: "Vous avez initié un import. Cela pourrait prendre un peu de t
lists: "Listes"
note: "Notes"
notes: "Notes"
following: "Suivis"
followers: "Vous suivent"
following: "Abonnements"
followers: "Abonné·e·s"
followsYou: "Vous suit"
createList: "Créer une liste"
manageLists: "Gérer les listes"
@ -85,15 +88,15 @@ youShouldUpgradeClient: "Si la page ne s'affiche pas correctement, rechargez-la
\ mettre votre client à jour."
enterListName: "Nom de la liste"
privacy: "Confidentialité"
makeFollowManuallyApprove: "Accepter manuellement les demandes de suivi"
makeFollowManuallyApprove: "Accepter manuellement les demandes dabonnement"
defaultNoteVisibility: "Visibilité des notes par défaut"
follow: "Suivre"
followRequest: "Demande de suivi"
followRequests: "Demandes de suivi"
unfollow: "Ne plus suivre"
followRequestPending: "Demande de suivi en attente de confirmation"
follow: "Sabonner"
followRequest: "Demande dabonnement"
followRequests: "Demandes dabonnement"
unfollow: "Se désabonner"
followRequestPending: "Demande d'abonnement en attente de confirmation"
renote: "Renoter"
unrenote: "Retirer la renote"
unrenote: "Annuler la Renote"
quote: "Citer"
pinnedNote: "Note épinglée"
you: "Vous"
@ -185,9 +188,7 @@ clearCachedFilesConfirm: "Êtes-vous sûr·e de vouloir vider tout le cache de f
\ distants ?"
blockedInstances: "Instances bloquées"
blockedInstancesDescription: "Listez les instances que vous désirez bloquer, une par\
\ ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance.\
\ Les noms de domaine non-ASCII doivent être encodés en punycode. Les sous-domaines\
\ de ces instances seront aussi bloqués."
\ ligne. Ces instances ne seront plus en capacité d'interagir avec votre instance."
muteAndBlock: "Masqué·e·s / Bloqué·e·s"
mutedUsers: "Utilisateur·rice·s en sourdine"
blockedUsers: "Utilisateur·rice·s bloqué·e·s"
@ -238,6 +239,7 @@ uploadFromUrlDescription: "URL du fichier que vous souhaitez téléverser"
uploadFromUrlRequested: "Téléversement demandé"
uploadFromUrlMayTakeTime: "Le téléversement de votre fichier peut prendre un certain\
\ temps."
explore: "Découvrir"
messageRead: "Lu"
noMoreHistory: "Il ny a plus dhistorique"
startMessaging: "Commencer à discuter"
@ -273,6 +275,8 @@ createFolder: "Créer un dossier"
renameFolder: "Renommer le dossier"
deleteFolder: "Supprimer le dossier"
addFile: "Ajouter un fichier"
emptyDrive: "Le Drive est vide"
emptyFolder: "Le dossier est vide"
unableToDelete: "Suppression impossible"
inputNewFileName: "Entrez un nouveau nom de fichier"
inputNewDescription: "Veuillez entrer une nouvelle description"
@ -319,6 +323,9 @@ inMb: "en mégaoctets"
iconUrl: "URL de l'icône"
bannerUrl: "URL de limage de la bannière"
backgroundImageUrl: "URL de l'image d'arrière-plan"
pinnedUsers: "Utilisateur·rice épinglé·e"
pinnedUsersDescription: "Listez les utilisateur·rice·s que vous souhaitez voir épinglé·e·s\
\ sur la page \"Découvrir\", un·e par ligne."
hcaptchaSiteKey: "Clé du site"
hcaptchaSecretKey: "Clé secrète"
recaptchaSiteKey: "Clé du site"
@ -345,6 +352,11 @@ silenceConfirm: "Êtes-vous sûr·e de vouloir mettre lutilisateur·rice en s
unsilence: "Annuler la sourdine"
unsilenceConfirm: "Êtes-vous sûr·e de vouloir annuler la mise en sourdine de cet·te\
\ utilisateur·rice ?"
popularUsers: "Utilisateur·rice·s populaires"
recentlyUpdatedUsers: "Utilisateur·rice·s actif·ve·s récemment"
recentlyRegisteredUsers: "Utilisateur·rice·s récemment inscrit·e·s"
recentlyDiscoveredUsers: "Utilisateur·rice·s récemment découvert·e·s"
popularTags: "Mots-clés populaires"
userList: "Listes"
aboutMisskey: "À propos de FoundKey"
administrator: "Administrateur"
@ -385,6 +397,7 @@ messagingWithGroup: "Discuter avec un groupe"
title: "Titre"
text: "Texte"
enable: "Activer"
next: "Suivant"
retype: "Confirmation"
noteOf: "Notes de {user}"
inviteToGroup: "Inviter dans un groupe"
@ -585,6 +598,7 @@ abuseReports: "Signalements"
reportAbuse: "Signaler"
reportAbuseOf: "Signaler {name}"
fillAbuseReportDescription: "Veuillez expliquer les raisons du signalement."
abuseReported: "Le rapport est envoyé. Merci."
reporter: "Signalé par"
reporteeOrigin: "Origine du signalement"
reporterOrigin: "Signalé par"
@ -633,6 +647,7 @@ disableShowingAnimatedImages: "Désactiver l'animation des images"
verificationEmailSent: "Un e-mail de vérification a été envoyé. Veuillez accéder au\
\ lien pour compléter la vérification."
emailVerified: "Votre adresse e-mail a été vérifiée"
noteFavoritesCount: "Nombre de notes dans les favoris"
pageLikesCount: "Nombre de pages aimées"
pageLikedCount: "Nombre de vos pages aimées"
contact: "Contact"
@ -668,6 +683,7 @@ editCode: "Modifier le code"
apply: "Appliquer"
receiveAnnouncementFromInstance: "Recevoir les messages d'information de l'instance"
emailNotification: "Notifications par mail"
publish: "Public"
useReactionPickerForContextMenu: "Clic-droit pour ouvrir le panneau de réactions"
typingUsers: "{users} est en train d'écrire..."
jumpToSpecifiedDate: "Se rendre à la date"
@ -706,7 +722,10 @@ switch: "Remplacer"
noMaintainerInformationWarning: "Informations administrateur non configurées."
noBotProtectionWarning: "La protection contre les bots n'est pas configurée."
configure: "Configurer"
postToGallery: "Publier dans la galerie"
gallery: "Galerie"
recentPosts: "Les plus récentes"
popularPosts: "Les plus consultées"
shareWithNote: "Partager dans une note"
emailNotConfiguredWarning: "Vous n'avez pas configuré d'adresse e-mail."
ratio: "Ratio"
@ -812,6 +831,11 @@ _forgotPassword:
contactAdmin: "Cette instance ne permettant pas l'utilisation d'adresses e-mail,\
\ prenez contact avec l'administrateur·rice pour procéder à la réinitialisation\
\ de votre mot de passe."
_gallery:
my: "Mes publications"
liked: "Publications que j'ai aimées"
like: "J'aime"
unlike: "Je naime pas"
_email:
_follow:
title: "Vous suit"
@ -982,6 +1006,46 @@ _time:
minute: "min"
hour: "h"
day: "j"
_tutorial:
title: "Comment utiliser FoundKey"
step1_1: "Bienvenue !"
step1_2: "Cette page est appelée « un fil ». Elle affiche les « notes » des personnes\
\ auxquelles vous êtes abonné dans un ordre chronologique."
step1_3: "Votre fil est actuellement vide vu que vous ne suivez aucun compte et\
\ que vous navez publié aucune note, pour linstant."
step2_1: "Procédons dabord à la préparation de votre profil avant décrire une\
\ note et/ou de vous abonner à un compte."
step2_2: "En fournissant quelques informations sur vous, il sera plus facile pour\
\ les autres de sabonner à votre compte."
step3_1: "Vous avez fini de créer votre profil ?"
step3_2: "Létape suivante consiste à créer une note. Vous pouvez commencer en cliquant\
\ sur licône crayon sur lécran."
step3_3: "Remplissez le cadran et cliquez sur le bouton en haut à droite pour envoyer."
step3_4: "Vous navez rien à dire ? Essayez décrire « Jai commencé à utiliser\
\ FoundKey » !"
step4_1: "Avez-vous publié votre première note ?"
step4_2: "Youpi ! Celle-ci est maintenant affichée sur votre fil dactualité."
step5_1: "Maintenant, essayons de nous abonner à dautres personnes afin de rendre\
\ votre fil plus vivant."
step5_2: "La page {featured} affiche les notes en tendance sur la présente instance\
\ et {explore} vous permet de trouver des utilisateur·rice·s en tendance. Essayez\
\ de vous abonner aux gens que vous aimez !"
step5_3: "Pour pouvoir suivre dautres utilisateur·rice, cliquez sur leur avatar\
\ afin dafficher la page du profil utilisateur ensuite appuyez sur le bouton\
\ « Sabonner »."
step5_4: "Si lautre utilisateur possède une icône sous forme dun cadenas à côté\
\ de son nom, il devra accepter votre demande dabonnement manuellement."
step6_1: "Maintenant, vous êtes en mesure de voir safficher les notes des autres\
\ utilisateur·rice·s sur votre propre fil."
step6_2: "Vous avez également la possibilité dintéragir rapidement avec les notes\
\ des autres utilisateur·rice·s en ajoutant des « réactions »."
step6_3: "Pour ajouter une réaction à une note, cliquez sur le signe « + » de celle-ci\
\ et sélectionnez lémoji souhaité."
step7_1: "Félicitations ! Vous avez atteint la fin du tutoriel de base pour lutilisation\
\ de FoundKey."
step7_2: "Si vous désirez en savoir plus sur FoundKey, jetez un œil sur la section\
\ {help}."
step7_3: "Bon courage et amusez-vous bien sur FoundKey ! \U0001F680"
_2fa:
alreadyRegistered: "Configuration déjà achevée."
registerDevice: "Ajouter un nouvel appareil"
@ -999,34 +1063,38 @@ _2fa:
step2Url: 'Vous pouvez aussi entrer cette URL si vous utilisez un client lourd sur
ordinateur :'
_permissions:
"read:account": "Lire les informations du compte"
"write:account": "Mettre à jour les informations du compte"
"read:blocks": "Lire les utilisateurs bloqués"
"write:blocks": "Bloquer et Débloquer des comptes"
"read:drive": "Lister les fichiers et dossiers du drive"
"write:drive": "Créer, changer et supprimer des fichiers du drive"
"read:favorites": "Lister les notes favorites"
"write:favorites": "Gérer les notes favorites"
"read:following": "Lister les comptes suivis et les comptes qui vous suivent"
"write:following": "Abonner et désabonner autres comptes"
"read:messaging": "Voir vos discussions et leur historique"
"write:messaging": "Créer et supprimer les messages des discussions"
"read:mutes": "Lister les comptes desquels vous masquez les notes ou les renotes"
"write:mutes": "Masquer et démasquer les notes ou les renotes des comptes"
"write:notes": "Gérer les notes"
"read:notifications": "Lire vos notifications"
"write:notifications": "Gérer vos notifications et en créer"
"write:reactions": "Gérer les réactions"
"write:votes": "Voter dans les sondages"
"read:pages": "Lister et lire les pages"
"read:account": "Afficher les informations du compte"
"write:account": "Mettre à jour les informations de votre compte"
"read:blocks": "Voir les comptes bloqués"
"write:blocks": "Gérer les comptes bloqués"
"read:drive": "Parcourir le Drive"
"write:drive": "Écrire sur le Drive"
"read:favorites": "Afficher les favoris"
"write:favorites": "Gérer les favoris"
"read:following": "Voir les informations de vos abonnements"
"write:following": "Abonnements/Se désabonner"
"read:messaging": "Voir vos discussions"
"write:messaging": "Gérer les discussions"
"read:mutes": "Voir les comptes masqués"
"write:mutes": "Gérer les comptes masqués"
"write:notes": "Créer / supprimer des notes"
"read:notifications": "Afficher les notifications"
"write:notifications": "Gérer vos notifications"
"read:reactions": "Lire les réactions"
"write:reactions": "Gérer vos réactions"
"write:votes": "Voter"
"read:pages": "Voir vos pages"
"write:pages": "Gérer les pages"
"read:page-likes": "Voir les mentions « J'aime » des pages"
"write:page-likes": "Gérer les mentions « J'aime » sur les pages"
"read:user-groups": "Voir les groupes d'utilisateur·rice·s"
"write:user-groups": "Éditer les groupes des utilisateur·rice·s"
"read:channels": "Lister et lire les canaux suivis et rejoints"
"read:channels": "Lire les canaux"
"write:channels": "Gérer les canaux"
"read:reactions": Lister les réactions
"read:gallery": "Voir la galerie"
"write:gallery": "Éditer la galerie"
"read:gallery-likes": "Voir les mentions « J'aime » dans la galerie"
"write:gallery-likes": "Gérer les mentions « J'aime » dans la galerie"
_auth:
shareAccess: "Autoriser \"{name}\" à accéder à votre compte ?"
shareAccessAsk: "Voulez-vous vraiment autoriser cette application à accéder à votre\
@ -1325,19 +1393,6 @@ regexpErrorDescription: "Il y a une erreur dans l'expression régulière de la l
\ {line} de vos mots ignorées {tab} :"
forwardReportIsAnonymous: Un compte système anonyme sera affiché, à la place de votre
compte, lors du signalement à l'instance distante.
attachmentRequired: Un attachement au moins est nécessaire.
useDrawerReactionPickerForMobile: Sur mobile afficher un tiroir pour le panneau de
réaction
appAuthorization: Authorisation de l'application
noPermissionsRequested: (Aucune permission demandée.)
oauthErrorGoBack: Une erreur est survenue pendant l'authentification d'une application
tierce. Veuillez réessayer.
botFollowRequiresApproval: Accepter manuellement les demandes de suivi des comptes
marqués « robots »
unrenoteAllConfirm: Étes-vous certain·e de vouloir retirer toutes les renotes de cette
note ?
unrenoteAll: Retirer toutes les renotes
deleteAllFiles: Supprimer tous les fichiers
cannotAttachFileWhenAccountSwitched: Vous ne pouvez pas joindre un fichier à partir
d'un autre compte.
cannotSwitchAccountWhenFileAttached: Vous ne pouvez pas changer de compte tant qu'il
y a des pièces jointes.

View File

@ -12,7 +12,7 @@ password: "Kata sandi"
forgotPassword: "Lupa Kata Sandi"
fetchingAsApObject: "Mengambil data dari Fediverse..."
ok: "OK"
gotIt: "Saya mengerti!"
gotIt: "Saya mengerti"
cancel: "Batalkan"
renotedBy: "direnote oleh {user}"
noNotes: "Tidak ada catatan"
@ -24,7 +24,7 @@ otherSettings: "Pengaturan lainnya"
openInWindow: "Buka di jendela"
profile: "Profil"
timeline: "Linimasa"
noAccountDescription: "Pengguna ini belum menulis biodata mereka."
noAccountDescription: "Pengguna ini belum menulis bio"
login: "Masuk"
loggingIn: "Sedang masuk"
logout: "Keluar"
@ -32,6 +32,9 @@ signup: "Daftar"
save: "Simpan"
users: "Pengguna"
addUser: "Tambah pengguna"
favorite: "Favorit"
favorites: "Favorit"
unfavorite: "Hapus favorit"
pin: "Sematkan ke profil"
unpin: "Lepas sematan dari profil"
copyContent: "Salin konten"
@ -59,8 +62,8 @@ files: "Berkas"
download: "Unduh"
driveFileDeleteConfirm: "Hapus {name}? Catatan dengan berkas terkait juga akan terhapus."
unfollowConfirm: "Berhenti mengikuti {name}?"
exportRequested: "Anda telah meminta ekspor. Ini mungkin memerlukan waktu beberapa\
\ saat. File ini akan ditambahkan ke Drive Anda setelah selesai."
exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah\
\ ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive"
importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat."
lists: "Daftar"
note: "Catat"
@ -97,8 +100,8 @@ clickToShow: "Klik untuk melihat"
sensitive: "Konten sensitif"
add: "Tambahkan"
reaction: "Reaksi"
reactionSettingDescription2: "Seret untuk menyusun ulang, klik untuk menghapus, tekan\
\ \"+\" untuk menambahkan."
reactionSettingDescription2: "Geser untuk memindah urutkan, klik untuk menghapus,\
\ tekan \"+\" untuk menambahkan"
attachCancel: "Hapus lampiran"
markAsSensitive: "Tandai sebagai konten sensitif"
unmarkAsSensitive: "Hapus tanda konten sensitif"
@ -190,10 +193,10 @@ blockedUsers: "Pengguna yang diblokir"
noUsers: "Tidak ada pengguna"
editProfile: "Sunting profil"
noteDeleteConfirm: "Apakah kamu yakin ingin menghapus catatan ini?"
pinLimitExceeded: "Anda tidak dapat menyematkan catatan lagi."
pinLimitExceeded: "Kamu tidak dapat menyematkan catatan lagi"
intro: "Instalasi FoundKey telah selesai! Mohon untuk membuat pengguna admin."
done: "Selesai"
processing: "Pemrosesan..."
processing: "Memproses"
preview: "Pratinjau"
default: "Bawaan"
noCustomEmojis: "Tidak ada emoji kustom"
@ -207,7 +210,7 @@ publishing: "Sedang menyiarkan langsung"
notResponding: "Tidak ada respon"
changePassword: "Ubah kata sandi"
security: "Keamanan"
retypedNotMatch: "Input tidak cocok."
retypedNotMatch: "Input tidak sama"
currentPassword: "Kata sandi saat ini"
newPassword: "Kata sandi baru"
newPasswordRetype: "Ulangi kata sandi baru"
@ -234,7 +237,8 @@ fromUrl: "Dari URL"
uploadFromUrl: "Unggah dari URL"
uploadFromUrlDescription: "URL berkas yang ingin kamu unggah"
uploadFromUrlRequested: "Pengunggahan telah diminta"
uploadFromUrlMayTakeTime: "Mungkin diperlukan waktu hingga unggahan selesai."
uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai"
explore: "Jelajahi"
messageRead: "Telah dibaca"
noMoreHistory: "Tidak ada sejarah lagi"
startMessaging: "Mulai mengirim pesan"
@ -270,6 +274,8 @@ createFolder: "Buat folder"
renameFolder: "Ubah nama folder"
deleteFolder: "Hapus folder"
addFile: "Tambahkan berkas"
emptyDrive: "Drive kosong"
emptyFolder: "Folder kosong"
unableToDelete: "Tidak dapat menghapus"
inputNewFileName: "Masukkan nama berkas yang baru"
inputNewDescription: "Masukkan keterangan disini"
@ -316,6 +322,9 @@ inMb: "dalam Megabytes"
iconUrl: "URL Gambar ikon"
bannerUrl: "URL Banner"
backgroundImageUrl: "URL Gambar latar"
pinnedUsers: "Pengguna yang disematkan"
pinnedUsersDescription: "Tuliskan satu nama pengguna dalam satu baris. Pengguna yang\
\ dituliskan disini akan disematkan dalam bilah \"Jelajahi\"."
hcaptchaSiteKey: "Site Key"
hcaptchaSecretKey: "Secret Key"
recaptchaSiteKey: "Site key"
@ -340,6 +349,11 @@ silence: "Bungkam"
silenceConfirm: "Apakah kamu yakin ingin membungkam pengguna ini?"
unsilence: "Hapus bungkam"
unsilenceConfirm: "Apakah kamu ingin untuk batal membungkam pengguna ini?"
popularUsers: "Pengguna populer"
recentlyUpdatedUsers: "Pengguna dengan aktivitas terkini"
recentlyRegisteredUsers: "Pengguna baru saja bergabung"
recentlyDiscoveredUsers: "Pengguna baru saja dilihat"
popularTags: "Tag populer"
userList: "Daftar"
aboutMisskey: "Tentang FoundKey"
administrator: "Admin"
@ -380,6 +394,7 @@ messagingWithGroup: "Obrolan di dalam grup"
title: "Judul"
text: "Teks"
enable: "Aktifkan"
next: "Selanjutnya"
retype: "Masukkan ulang"
noteOf: "Catatan milik {user}"
inviteToGroup: "Undang ke grup"
@ -390,7 +405,7 @@ newMessageExists: "Kamu mendapatkan pesan baru"
onlyOneFileCanBeAttached: "Kamu hanya dapat melampirkan satu berkas ke dalam pesan"
signinRequired: "Silahkan login"
invitationCode: "Kode undangan"
checking: "Memeriksa..."
checking: "Memeriksa"
available: "Tersedia"
unavailable: "Tidak tersedia"
usernameInvalidFormat: "Hanya dapat menerima karakter a-z, A-Z dan angka 0-9."
@ -432,10 +447,11 @@ showFeaturedNotesInTimeline: "Tampilkan catatan yang diunggulkan di linimasa"
objectStorage: "Object Storage"
useObjectStorage: "Gunakan object storage"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "URL yang digunakan sebagai referensi. Tentukan URL CDN\
\ atau Proksi Anda jika Anda menggunakan keduanya.\nUntuk S3 gunakan 'https://<bucket>.s3.amazonaws.com'\
\ dan untuk GCS atau layanan yang setara gunakan 'https://storage.googleapis.com/<bucket>',\
\ dst."
objectStorageBaseUrlDesc: "Prefix URL digunakan untuk mengkonstruksi URL ke object\
\ (media) referencing. Tentukan URL jika kamu menggunakan CDN atau Proxy, jika tidak\
\ tentukan alamat yang dapat diakses secara publik sesuai dengan panduan dari layanan\
\ yang akan kamu gunakan, contohnya. 'https://<bucket>.s3.amazonaws.com' untuk AWS\
\ S3, dan 'https://storage.googleapis.com/<bucket>' untuk GCS."
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "Mohon tentukan nama bucket yang digunakan pada layanan yang\
\ telah dikonfigurasi."
@ -479,7 +495,7 @@ ascendingOrder: "Urutkan naik"
descendingOrder: "Urutkan menurun"
scratchpad: "Scratchpad"
scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScript.\
\ Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan\
\ Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan\
\ FoundKey."
output: "Keluaran"
updateRemoteUser: "Perbaharui informasi pengguna luar"
@ -575,6 +591,7 @@ abuseReports: "Laporkan"
reportAbuse: "Laporkan"
reportAbuseOf: "Laporkan {name}"
fillAbuseReportDescription: "Mohon isi rincian laporan."
abuseReported: "Laporan kamu telah dikirimkan. Terima kasih."
reporter: "Pelapor"
reporteeOrigin: "Yang dilaporkan"
reporterOrigin: "Pelapor"
@ -625,14 +642,15 @@ disableShowingAnimatedImages: "Jangan mainkan gambar bergerak"
verificationEmailSent: "Surel verifikasi telah dikirimkan. Mohon akses tautan yang\
\ telah disertakan untuk menyelesaikan verifikasi."
emailVerified: "Surel telah diverifikasi"
noteFavoritesCount: "Jumlah catatan yang difavoritkan"
pageLikesCount: "Jumlah suka yang diterima Halaman"
pageLikedCount: "Jumlah Halaman yang disukai"
contact: "Kontak"
useSystemFont: "Gunakan font bawaan sistem operasi"
clips: "Klip"
makeExplorable: "Buat akun tampil di \"Jelajahi\""
makeExplorableDescription: "Jika Anda menonaktifkannya, akun Anda tidak akan muncul\
\ di bagian \"Jelajahi\"."
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di\
\ bagian \"Jelajahi:"
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada linimasa"
duplicate: "Duplikat"
left: "Kiri"
@ -660,6 +678,7 @@ editCode: "Sunting kode"
apply: "Terapkan"
receiveAnnouncementFromInstance: "Terima pemberitahuan surel dari instansi ini"
emailNotification: "Pemberitahuan surel"
publish: "Terbitkan"
useReactionPickerForContextMenu: "Buka pemilih reaksi dengan klik-kanan"
typingUsers: "{users} sedang mengetik..."
jumpToSpecifiedDate: "Loncat ke tanggal spesifik"
@ -698,7 +717,10 @@ switch: "Beralih"
noMaintainerInformationWarning: "Informasi pengelola belum disetel."
noBotProtectionWarning: "Proteksi bot belum disetel."
configure: "Setel"
postToGallery: "Posting ke galeri"
gallery: "Galeri"
recentPosts: "Postingan terbaru"
popularPosts: "Postingan populer"
shareWithNote: "Bagikan dengan catatan"
emailNotConfiguredWarning: "Alamat surel tidak disetel."
ratio: "Rasio"
@ -743,7 +765,7 @@ ffVisibility: "Visibilitas Mengikuti/Pengikut"
ffVisibilityDescription: "Mengatur siapa yang dapat melihat pengikutmu dan yang kamu\
\ ikuti."
continueThread: "Lihat lanjutan thread"
deleteAccountConfirm: "Ini akan menghapuskan akun {handle} secara permanen. Lanjutkan?"
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
incorrectPassword: "Kata sandi salah."
voteConfirm: "Konfirmasi suara kamu untuk ({choice})"
hide: "Sembunyikan"
@ -807,6 +829,11 @@ _forgotPassword:
\ admin segera."
contactAdmin: "Instansi ini tidak mendukung menggunakan alamat surel, mohon kontak\
\ admin untuk mengatur ulang password kamu."
_gallery:
my: "Postingan saya"
liked: "Postingan yang disukai"
like: "Suka"
unlike: "Hapus suka"
_email:
_follow:
title: "Mengikuti kamu"
@ -978,6 +1005,44 @@ _time:
minute: "menit"
hour: "jam"
day: "hari"
_tutorial:
title: "Cara menggunakan FoundKey"
step1_1: "Selamat datang!"
step1_2: "Halaman ini disebut \"linimasa\". Halaman ini menampilkan \"catatan\"\
\ yang diurutkan secara kronologis dari orang-orang yang kamu \"ikuti\"."
step1_3: "Linimasa kamu kosong, karena kamu belum mencatat catatan apapun atau mengikuti\
\ siapapun."
step2_1: "Selesaikan menyetel profilmu sebelum menulis sebuah catatan atau mengikuti\
\ seseorang."
step2_2: "Menyediakan beberapa informasi tentang siapa kamu akan membuat orang lain\
\ mudah untuk mengikutimu kembali."
step3_1: "Selesai menyetel profil kamu?"
step3_2: "Langkah selanjutnya adalah membuat catatan. Kamu bisa lakukan ini dengan\
\ mengklik ikon pensil pada layar kamu."
step3_3: "Isilah di dalam modal dan tekan tombol pada atas kanan untuk memcatat\
\ catatan kamu."
step3_4: "Bingung tidak berpikiran untuk mengatakan sesuatu? Coba saja \"baru aja\
\ ikutan bikin akun misskey punyaku\"!"
step4_1: "Selesai mencatat catatan pertamamu?"
step4_2: "Horee! Sekarang catatan pertamamu sudah ditampilkan di linimasa milikmu."
step5_1: "Sekarang, mari mencoba untuk membuat linimasamu lebih hidup dengan mengikuti\
\ orang lain."
step5_2: "{featured} akan memperlihatkan catatan yang sedang tren saat ini untuk\
\ kamu. {explore} akan membantumu untuk mencari pengguna yang sedang tren juga\
\ saat ini. Coba ikuti seseorang yang kamu suka!"
step5_3: "Untuk mengikuti pengguna lain, klik pada ikon mereka dan tekan tombol\
\ follow pada profil mereka."
step5_4: "Jika pengguna lain memiliki ikon gembok di sebelah nama mereka, maka pengguna\
\ rersebut harus menyetujui permintaan mengikuti dari kamu secara manual."
step6_1: "Sekarang kamu dapat melihat catatan pengguna lain pada linimasamu."
step6_2: "Kamu juga bisa memberikan \"reaksi\" ke catatan orang lain untuk merespon\
\ dengan cepat."
step6_3: "Untuk memberikan \"reaksi\", tekan tanda \"+\" pada catatan pengguna lain\
\ dan pilih emoji yang kamu suka untuk memberikan reaksimu kepada mereka."
step7_1: "Yay, Selamat! Kamu sudah menyelesaikan tutorial dasar FoundKey."
step7_2: "Jika kamu ingin mempelajari lebih lanjut tentang FoundKey, cobalah berkunjung\
\ ke bagian {help}."
step7_3: "Semoga berhasil dan bersenang-senanglah! \U0001F680"
_2fa:
alreadyRegistered: "Kamu telah mendaftarkan perangkat otentikasi dua faktor."
registerDevice: "Daftarkan perangkat baru"
@ -1011,6 +1076,7 @@ _permissions:
"write:notes": "Buat atau hapus catatan"
"read:notifications": "Lihat pemberitahuan"
"write:notifications": "Sunting pemberitahuan"
"read:reactions": "Lihat reaksi"
"write:reactions": "Sunting reaksi"
"write:votes": "Beri suara"
"read:pages": "Lihat halaman"
@ -1021,11 +1087,15 @@ _permissions:
"write:user-groups": "Sunting atau hapus grup pengguna"
"read:channels": "Lihat saluran"
"write:channels": "Sunting saluran"
"read:gallery": "Lihat galeri"
"write:gallery": "Sunting galeri"
"read:gallery-likes": "Lihat daftar postingan galeri yang disukai"
"write:gallery-likes": "Sunting daftar postingan galeri yang disukai"
_auth:
shareAccess: "Apakah kamu ingin mengijinkan \"{name}\" untuk mengakses akun ini?"
shareAccessAsk: "Apakah kamu ingin mengijinkan aplikasi ini untuk mengakses akun\
\ kamu?"
permissionAsk: "Aplikasi ini meminta izin berikut ini"
permissionAsk: "Aplikasi ini membutuhkan beberapa ijin, yaitu:"
pleaseGoBack: "Mohon kembali ke aplikasi kamu"
callback: "Mengembalikan kamu ke aplikasi"
denied: "Akses ditolak"
@ -1169,7 +1239,7 @@ _pages:
editPage: "Sunting halaman"
readPage: "Lihat sumber kode aktif"
created: "Halaman berhasil dibuat"
updated: "Halaman berhasil diperbaharui"
updated: "Halaman berhasil diperbaharui!"
deleted: "Halaman telah dihapus"
pageSetting: "Pengaturan Halaman"
nameAlreadyExists: "URL Halaman yang ditentukan sudah ada"
@ -1209,7 +1279,7 @@ _notification:
youWereFollowed: "Mengikuti kamu"
youReceivedFollowRequest: "Kamu menerima permintaan mengikuti"
yourFollowRequestAccepted: "Permintaan mengikuti kamu telah diterima"
youWereInvitedToGroup: "{userName} mengundang Anda ke grup"
youWereInvitedToGroup: "Telah diundang ke grup"
pollEnded: "Hasil Kuesioner telah keluar"
emptyPushNotificationMessage: "Pembaruan notifikasi dorong"
_types:

View File

@ -27,6 +27,7 @@ const languages = [
'id-ID',
'it-IT',
'ja-JP',
'ja-KS',
'kab-KAB',
'kn-IN',
'ko-KR',

View File

@ -33,6 +33,9 @@ signup: "Iscriviti"
save: "Salva"
users: "Utente"
addUser: "Aggiungi utente"
favorite: "Preferiti"
favorites: "Preferiti"
unfavorite: "Rimuovi nota dai preferiti"
pin: "Fissa sul profilo"
unpin: "Non fissare sul profilo"
copyContent: "Copia il contenuto"
@ -63,7 +66,7 @@ driveFileDeleteConfirm: "Vuoi davvero eliminare il file「{name}? Anche gli alle
unfollowConfirm: "Vuoi davvero smettere di seguire {name}?"
exportRequested: "Hai richiesto un'esportazione, e potrebbe volerci tempo. Quando\
\ sarà compiuta, il file verrà aggiunto direttamente al Drive."
importRequested: "Hai richiesto un'importazione. Può volerci tempo."
importRequested: "Hai richiesto un'importazione. Può volerci tempo. "
lists: "Liste"
note: "Nota"
notes: "Note"
@ -75,7 +78,7 @@ manageLists: "Gestisci liste"
error: "Errore"
somethingHappened: "Si è verificato un problema"
retry: "Riprova"
pageLoadError: "Caricamento pagina non riuscito."
pageLoadError: "Caricamento pagina non riuscito. "
pageLoadErrorDescription: "Questo viene normalmente causato dalla rete o dalla cache\
\ del browser. Si prega di pulire la cache, o di attendere e riprovare più tardi."
serverIsDead: "Il server non risponde. Si prega di attendere e riprovare più tardi."
@ -187,7 +190,7 @@ blockedUsers: "Account bloccati"
noUsers: "Nessun utente trovato"
editProfile: "Modifica profilo"
noteDeleteConfirm: "Eliminare questo Nota?"
pinLimitExceeded: "Non puoi fissare altre note."
pinLimitExceeded: "Non puoi fissare altre note "
intro: "L'installazione di FoundKey è finita! Si prega di creare un account amministratore."
done: "Fine"
processing: "In elaborazione"
@ -229,6 +232,7 @@ uploadFromUrl: "Incolla URL immagine"
uploadFromUrlDescription: "URL del file che vuoi caricare"
uploadFromUrlRequested: "Caricamento richiesto"
uploadFromUrlMayTakeTime: "Il caricamento del file può richiedere tempo."
explore: "Esplora"
messageRead: "Visualizzato"
noMoreHistory: "Non c'è più cronologia da visualizzare"
startMessaging: "Nuovo messaggio"
@ -264,6 +268,8 @@ createFolder: "Nuova cartella"
renameFolder: "Rinominare cartella"
deleteFolder: "Elimina cartella"
addFile: "Allega"
emptyDrive: "Il Drive è vuoto"
emptyFolder: "La cartella è vuota"
unableToDelete: "Eliminazione impossibile"
inputNewFileName: "Inserisci nome del nuovo file"
inputNewDescription: "Inserisci una nuova descrizione"
@ -310,6 +316,9 @@ inMb: "in Megabytes"
iconUrl: "URL di icona (favicon, ecc.)"
bannerUrl: "URL dell'immagine d'intestazione"
backgroundImageUrl: "URL dello sfondo"
pinnedUsers: "Utenti in evidenza"
pinnedUsersDescription: "Elenca gli/le utenti che vuoi fissare in cima alla pagina\
\ \"Esplora\", un@ per riga."
hcaptchaSiteKey: "Chiave del sito"
hcaptchaSecretKey: "Chiave segreta"
recaptchaSiteKey: "Chiave del sito"
@ -334,6 +343,11 @@ silence: "Silenzia"
silenceConfirm: "Vuoi davvero silenziare l'utente?"
unsilence: "Riattiva"
unsilenceConfirm: "Vuoi davvero riattivare l'utente?"
popularUsers: "Utenti popolari"
recentlyUpdatedUsers: "Utenti attivi di recente"
recentlyRegisteredUsers: "Utenti registrati di recente"
recentlyDiscoveredUsers: "Utenti scoperti di recente"
popularTags: "Tag di tendenza"
userList: "Liste"
aboutMisskey: "Informazioni di FoundKey"
administrator: "Amministratore"
@ -374,6 +388,7 @@ messagingWithGroup: "Chattare in gruppo"
title: "Titolo"
text: "Testo"
enable: "Abilita"
next: "Avanti"
retype: "Conferma"
noteOf: "Note di {user}"
inviteToGroup: "Invitare al gruppo"
@ -427,7 +442,7 @@ useObjectStorage: "Utilizza stoccaggio oggetti"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "URL di riferimento. In caso di utilizzo di proxy o CDN\
\ l'URL è 'https://<bucket>.s3.amazonaws.com' per S3, 'https://storage.googleapis.com/<bucket>'\
\ per GCS eccetera."
\ per GCS eccetera. "
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "Specificare il nome del bucket utilizzato dal provider."
objectStoragePrefix: "Prefix"
@ -512,7 +527,7 @@ large: "Grande"
medium: "Predefinito"
small: "Piccolo"
generateAccessToken: "Genera token di accesso"
permission: "Autorizzazioni"
permission: "Autorizzazioni "
enableAll: "Abilita tutto"
disableAll: "Disabilita tutto"
tokenRequested: "Autorizza accesso all'account"
@ -564,6 +579,7 @@ abuseReports: "Segnalazioni"
reportAbuse: "Segnalazioni"
reportAbuseOf: "Segnala {name}"
fillAbuseReportDescription: "Si prega di spiegare il motivo della segnalazione."
abuseReported: "La segnalazione è stata inviata. Grazie."
reporter: "il corrispondente"
reporteeOrigin: "Origine del segnalato"
reporterOrigin: "Origine del segnalatore"
@ -611,6 +627,7 @@ disableShowingAnimatedImages: "Disabilita le immagini animate"
verificationEmailSent: "Una mail di verifica è stata inviata. Si prega di accedere\
\ al collegamento per compiere la verifica."
emailVerified: "Il tuo indirizzo email è stato verificato"
noteFavoritesCount: "Conteggio note tra i preferiti"
pageLikesCount: "Numero di pagine che ti piacciono"
pageLikedCount: "Numero delle tue pagine che hanno ricevuto \"Mi piace\""
contact: "Contatti"
@ -644,10 +661,11 @@ editCode: "Modifica codice"
apply: "Applica"
receiveAnnouncementFromInstance: "Ricevi i messaggi informativi dall'istanza"
emailNotification: "Eventi per notifiche via mail"
publish: "Pubblico"
useReactionPickerForContextMenu: "Cliccare sul tasto destro per aprire il pannello\
\ di reazioni"
typingUsers: "{users} sta(nno) scrivendo"
jumpToSpecifiedDate: "Vai alla data"
jumpToSpecifiedDate: "Vai alla data "
clear: "Cancella"
markAllAsRead: "Segna tutti come già letti"
goBack: "Indietro"
@ -682,7 +700,10 @@ switch: "Sostituisci"
noMaintainerInformationWarning: "Le informazioni amministratore non sono impostate."
noBotProtectionWarning: "Nessuna protezione impostata contro i bot."
configure: "Imposta"
postToGallery: "Pubblicare nella galleria"
gallery: "Galleria"
recentPosts: "Le più recenti"
popularPosts: "Le più visualizzate"
shareWithNote: "Condividere in nota"
emailNotConfiguredWarning: "Non hai impostato nessun indirizzo e-mail."
ratio: "Rapporto"
@ -759,6 +780,11 @@ _forgotPassword:
contactAdmin: "Poiché questa istanza non permette l'utilizzo di una mail, si prega\
\ di contattare l'amministratore·trice dell'istanza per poter ripristinare la\
\ password."
_gallery:
my: "Le mie pubblicazioni"
liked: "Pubblicazioni che mi piacciono"
like: "Mi piace!"
unlike: "Non mi piace più"
_email:
_follow:
title: "Ha iniziato a seguirti"
@ -881,7 +907,7 @@ _ago:
secondsAgo: "{n}s fa"
minutesAgo: "{n}min fa"
hoursAgo: "{n}h fa"
daysAgo: "{n} giorni fa"
daysAgo: "{1} giorni fa"
weeksAgo: "{n} settimane fa"
monthsAgo: "{n} mesi fa"
yearsAgo: "{n} anni fa"
@ -890,6 +916,45 @@ _time:
minute: "min"
hour: "ore"
day: "giorni"
_tutorial:
title: "Come usare FoundKey"
step1_1: "Benvenuto/a!"
step1_2: "Questa pagina si chiama una \" Timeline \". Mostra in ordine cronologico\
\ le \" note \" delle persone che segui."
step1_3: "Attualmente la tua Timeline è vuota perché non segui alcun account e non\
\ hai pubblicato alcuna nota ancora."
step2_1: "Prima di scrivere una nota o di seguire un account, imposta il tuo profilo!"
step2_2: "Aggiungere qualche informazione su di te aumenterà le tue possibilità\
\ di essere seguit@ da altre persone. "
step3_1: "Hai finito di impostare il tuo profilo?"
step3_2: "Ora, puoi pubblicare una nota. Facciamo una prova! Premi il pulsante a\
\ forma di penna in cima allo schermo per aprire una finestra di dialogo. "
step3_3: "Scritto il testo della nota, puoi pubblicarla premendo il pulsante nella\
\ parte superiore destra della finestra di dialogo."
step3_4: "Non ti viene niente in mente? Perché non scrivi semplicemente \"Ho appena\
\ cominciato a usare FoundKey\"?"
step4_1: "Hai pubblicato qualcosa?"
step4_2: "Se puoi visualizzare la tua nota sulla timeline, ce l'hai fatta!"
step5_1: "Adesso, cerca di seguire altre persone per vivacizzare la tua timeline. "
step5_2: "La pagina {featured} mostra le note di tendenza su questa istanza, e magari\
\ ti aiuterà a trovare account che ti piacciono e che vorrai seguire. Oppure,\
\ potrai trovare utenti popolari usando {explore}."
step5_3: "Per seguire altrə utenti, clicca sul loro avatar per aprire la pagina\
\ di profilo dove puoi premere il pulsante \"Seguire\". "
step5_4: "Alcunə utenti scelgono di confermare manualmente le richieste di follow\
\ che ricevono, quindi a seconda delle persone potrebbe volerci un pò prima che\
\ la tua richiesta sia accolta."
step6_1: "Ora, se puoi visualizzare le note di altrə utenti sulla tua timeline,\
\ ce l'hai fatta!"
step6_2: "Puoi inviare una risposta rapida alle note di altrə utenti mandando loro\
\ \"reazioni\"."
step6_3: "Per inviare una reazione, premi l'icona + della nota e scegli l'emoji\
\ che vuoi mandare."
step7_1: "Complimenti! Sei arrivat@ alla fine dell'esercitazione di base su come\
\ usare FoundKey. "
step7_2: "Se vuoi saperne di più su FoundKey, puoi dare un'occhiata alla sezione\
\ {help}."
step7_3: "Da ultimo, buon divertimento su FoundKey! \U0001F680"
_2fa:
registerDevice: "Aggiungi dispositivo"
_permissions:
@ -910,6 +975,7 @@ _permissions:
"write:notes": "Creare / Eliminare note"
"read:notifications": "Visualizza notifiche"
"write:notifications": "Gerisci notifiche"
"read:reactions": "Vedi reazioni"
"write:reactions": "Gerisci reazioni"
"write:votes": "Votare"
"read:pages": "Visualizzare pagine"
@ -1062,9 +1128,9 @@ _timelines:
_pages:
newPage: "Crea pagina"
editPage: "Modifica pagina"
readPage: "Visualizzando fonte"
created: "Pagina creata"
updated: "Pagina aggiornata con successo"
readPage: "Visualizzando fonte "
created: "Pagina creata!"
updated: "Pagina aggiornata con successo!"
deleted: "Pagina eliminata"
pageSetting: "Impostazioni pagina"
nameAlreadyExists: "Esiste già una pagina con lo stesso URL."

View File

@ -1,17 +1,17 @@
_lang_: "日本語"
headlineMisskey: "ノートでつながるネットワーク"
introMisskey: "ようこそFoundKeyは、オープンソースの分散型マイクロブログサービスです。\n「ート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n\
「リアクション」機能で、皆のノートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
introMisskey: "ようこそFoundKeyは、オープンソースの分散型マイクロブログサービスです。\n「ート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう\U0001F4E1\
\n「リアクション」機能で、皆のノートに素早く反応を追加することもできます\U0001F44D\n新しい世界を探検しよう\U0001F680"
monthAndDay: "{month}月 {day}日"
search: "検索"
notifications: "通知"
username: "ユーザー名"
password: "パスワード"
forgotPassword: "パスワードを忘れた"
fetchingAsApObject: "連合に照会中..."
fetchingAsApObject: "連合に照会中"
ok: "OK"
gotIt: "わかった!"
gotIt: "わかった"
cancel: "キャンセル"
renotedBy: "{user}がRenote"
noNotes: "ノートはありません"
@ -23,7 +23,7 @@ otherSettings: "その他の設定"
openInWindow: "ウィンドウで開く"
profile: "プロフィール"
timeline: "タイムライン"
noAccountDescription: "このユーザーはまだ自己紹介文を書いていません。"
noAccountDescription: "自己紹介はありません"
login: "ログイン"
loggingIn: "ログイン中"
logout: "ログアウト"
@ -31,6 +31,9 @@ signup: "新規登録"
save: "保存"
users: "ユーザー"
addUser: "ユーザーを追加"
favorite: "お気に入り"
favorites: "お気に入り"
unfavorite: "お気に入り解除"
pin: "ピン留め"
unpin: "ピン留め解除"
copyContent: "内容をコピー"
@ -120,12 +123,12 @@ addEmoji: "絵文字を追加"
cacheRemoteFiles: "リモートのファイルをキャッシュする"
cacheRemoteFilesDescription: "この設定を無効にすると、リモートファイルをキャッシュせず直リンクするようになります。サーバーのストレージを節約できますが、サムネイルが生成されないので通信量が増加します。"
flagAsBot: "Botとして設定"
flagAsBotDescription: "このアカウントがプログラムによって制御される場合は、このフラグをオンにします。オンにすると、別のBotとの終わりのないインタラクションの連続を防ぐためのフラグとして他の開発者に役立ったり、このアカウントをBotとして扱うためにFoundKey内部のシステムを調整します。"
flagAsBotDescription: "このアカウントがプログラムによって運用される場合は、このフラグをオンにします。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、FoundKeyのシステム上での扱いがBotに合ったものになります。"
flagAsCat: "Catとして設定"
flagAsCatDescription: "このアカウントが猫であることを示す場合は、このフラグをオンにします。"
flagShowTimelineReplies: "タイムラインにノートへの返信を表示する"
flagShowTimelineRepliesDescription: "オンにすると、タイムラインにユーザーのノート以外にもそのユーザーの他のノートへの返信を表示します。"
autoAcceptFollowed: "フォローしているユーザーからのフォローリクエストを自動承認"
autoAcceptFollowed: "フォロー中ユーザーからのフォロリクを自動承認"
addAccount: "アカウントを追加"
loginFailed: "ログインに失敗しました"
showOnRemote: "リモートで表示"
@ -162,17 +165,17 @@ clearQueueConfirmText: "未配達の投稿は配送されなくなります。
clearCachedFiles: "キャッシュをクリア"
clearCachedFilesConfirm: "キャッシュされたリモートファイルをすべて削除しますか?"
blockedInstances: "ブロックしたインスタンス"
blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定します。ブロックされたインスタンスは、このインスタンスとやり取りできなくなります。非ASCII文字を含むドメイン名はpunycodeでエンコードされている必要があります。設定したインスタンスのサブドメインもブロックされます。"
blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定します。ブロックされたインスタンスは、このインスタンスとやり取りできなくなります。"
muteAndBlock: "ミュートとブロック"
mutedUsers: "ミュートしたユーザー"
blockedUsers: "ブロックしたユーザー"
noUsers: "ユーザーはいません"
editProfile: "プロフィールを編集"
noteDeleteConfirm: "このノートを削除しますか?"
pinLimitExceeded: "これ以上ピン留めできません"
pinLimitExceeded: "これ以上ピン留めできません"
intro: "FoundKeyのインストールが完了しました管理者アカウントを作成しましょう。"
done: "完了"
processing: "処理中..."
processing: "処理中"
preview: "プレビュー"
default: "デフォルト"
noCustomEmojis: "絵文字はありません"
@ -213,6 +216,7 @@ uploadFromUrl: "URLアップロード"
uploadFromUrlDescription: "アップロードしたいファイルのURL"
uploadFromUrlRequested: "アップロードをリクエストしました"
uploadFromUrlMayTakeTime: "アップロードが完了するまで時間がかかる場合があります。"
explore: "みつける"
messageRead: "既読"
noMoreHistory: "これより過去の履歴はありません"
startMessaging: "チャットを開始"
@ -247,6 +251,8 @@ createFolder: "フォルダーを作成"
renameFolder: "フォルダー名を変更"
deleteFolder: "フォルダーを削除"
addFile: "ファイルを追加"
emptyDrive: "ドライブは空です"
emptyFolder: "フォルダーは空です"
unableToDelete: "削除できません"
inputNewFileName: "新しいファイル名を入力してください"
inputNewDescription: "新しいキャプションを入力してください"
@ -291,6 +297,8 @@ inMb: "メガバイト単位"
iconUrl: "アイコン画像のURL (faviconなど)"
bannerUrl: "バナー画像のURL"
backgroundImageUrl: "背景画像のURL"
pinnedUsers: "ピン留めユーザー"
pinnedUsersDescription: "「みつける」ページなどにピン留めしたいユーザーを改行で区切って記述します。"
hcaptchaSiteKey: "サイトキー"
hcaptchaSecretKey: "シークレットキー"
recaptchaSiteKey: "サイトキー"
@ -301,7 +309,7 @@ name: "名前"
antennaSource: "受信ソース"
antennaKeywords: "受信キーワード"
antennaExcludeKeywords: "除外キーワード"
antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
antennaKeywordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります"
notifyAntenna: "新しいノートを通知する"
withFileAntenna: "ファイルが添付されたノートのみ"
antennaUsersDescription: "ユーザー名を改行で区切って指定します"
@ -314,6 +322,11 @@ silence: "サイレンス"
silenceConfirm: "サイレンスしますか?"
unsilence: "サイレンス解除"
unsilenceConfirm: "サイレンス解除しますか?"
popularUsers: "人気のユーザー"
recentlyUpdatedUsers: "最近投稿したユーザー"
recentlyRegisteredUsers: "最近登録したユーザー"
recentlyDiscoveredUsers: "最近発見されたユーザー"
popularTags: "人気のタグ"
userList: "リスト"
aboutMisskey: "FoundKeyについて"
administrator: "管理者"
@ -354,6 +367,7 @@ messagingWithGroup: "グループでチャット"
title: "タイトル"
text: "テキスト"
enable: "有効にする"
next: "次"
retype: "再入力"
noteOf: "{user}のノート"
inviteToGroup: "グループに招待"
@ -364,10 +378,10 @@ newMessageExists: "新しいメッセージがあります"
onlyOneFileCanBeAttached: "メッセージに添付できるファイルはひとつです"
signinRequired: "続行する前に、サインアップまたはサインインが必要です"
invitationCode: "招待コード"
checking: "確認しています..."
checking: "確認しています"
available: "利用できます"
unavailable: "利用できません"
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えます"
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えます"
tooShort: "短すぎます"
tooLong: "長すぎます"
weakPassword: "弱いパスワード"
@ -405,8 +419,8 @@ showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを
objectStorage: "オブジェクトストレージ"
useObjectStorage: "オブジェクトストレージを使用"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "参照に使用するURL。CDNやProxyを使用している場合はそのURL。\nS3: 'https://<bucket>.s3.amazonaws.com'、GCS等:
'https://storage.googleapis.com/<bucket>'。"
objectStorageBaseUrlDesc: "参照に使用するURL。CDNやProxyを使用している場合はそのURLS3: 'https://<bucket>.s3.amazonaws.com'、GCS等:\
\ 'https://storage.googleapis.com/<bucket>'。"
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "使用サービスのbucket名を指定してください。"
objectStoragePrefix: "Prefix"
@ -528,6 +542,7 @@ abuseReports: "通報"
reportAbuse: "通報"
reportAbuseOf: "{name}を通報する"
fillAbuseReportDescription: "通報理由の詳細を記入してください。"
abuseReported: "内容が送信されました。ご報告ありがとうございました。"
reporter: "通報者"
reporteeOrigin: "通報先"
reporterOrigin: "通報元"
@ -574,6 +589,7 @@ loadRawImages: "添付画像のサムネイルをオリジナル画質にする"
disableShowingAnimatedImages: "アニメーション画像を再生しない"
verificationEmailSent: "確認のメールを送信しました。メールに記載されたリンクにアクセスして、設定を完了してください。"
emailVerified: "メールアドレスが確認されました"
noteFavoritesCount: "お気に入りノートの数"
pageLikesCount: "Pageにいいねした数"
pageLikedCount: "Pageにいいねされた数"
contact: "連絡先"
@ -594,7 +610,7 @@ onlineUsersCount: "{n}人がオンライン"
backgroundColor: "背景"
accentColor: "アクセント"
textColor: "文字"
saveAs: "名前を付けて保存..."
saveAs: "名前を付けて保存"
createdAt: "作成日時"
updatedAt: "更新日時"
deleteConfirm: "削除しますか?"
@ -607,8 +623,9 @@ editCode: "コードを編集"
apply: "適用"
receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る"
emailNotification: "メール通知"
publish: "公開"
useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開く"
typingUsers: "{users}が入力中..."
typingUsers: "{users}が入力中"
jumpToSpecifiedDate: "特定の日付にジャンプ"
clear: "クリア"
markAllAsRead: "全て既読にする"
@ -625,7 +642,7 @@ unknown: "不明"
hideOnlineStatus: "オンライン状態を隠す"
hideOnlineStatusDescription: "オンライン状態を隠すと、検索などの一部機能において利便性が低下することがあります。"
federateBlocks: "ブロックを連合に送信"
federateBlocksDescription: "オフにすると、BlockのActivityは連合に送信されません。"
federateBlocksDescription: "オフにするとBlockのActivityは連合に送信しません"
online: "オンライン"
active: "アクティブ"
offline: "オフライン"
@ -644,7 +661,10 @@ switch: "切り替え"
noMaintainerInformationWarning: "管理者情報が設定されていません。"
noBotProtectionWarning: "Botプロテクションが設定されていません。"
configure: "設定する"
postToGallery: "ギャラリーへ投稿"
gallery: "ギャラリー"
recentPosts: "最近の投稿"
popularPosts: "人気の投稿"
shareWithNote: "ノートで共有"
emailNotConfiguredWarning: "メールアドレスの設定がされていません。"
ratio: "比率"
@ -661,7 +681,7 @@ misskeyUpdated: "FoundKeyが更新されました"
whatIsNew: "更新情報を見る"
translate: "翻訳"
translatedFrom: "{x}から翻訳"
accountDeletionInProgress: "アカウントの削除が進行中です"
accountDeletionInProgress: "アカウントの削除が進行中です"
usernameInfo: "サーバー上であなたのアカウントを一意に識別するための名前。アルファベット(a~z, A~Z)、数字(0~9)、およびアンダーバー(_)が使用できます。ユーザー名は後から変更することは出来ません。"
keepCw: "CWを維持する"
pubSub: "Pub/Subのアカウント"
@ -685,7 +705,7 @@ threadMuteNotificationsDesc: "このスレッドから表示する通知を選
ffVisibility: "つながりの公開範囲"
ffVisibilityDescription: "自分のフォロー/フォロワー情報の公開範囲を設定できます。"
continueThread: "さらにスレッドを見る"
deleteAccountConfirm: "アカウント {handle} 不可逆的に削除されます。よろしいですか?"
deleteAccountConfirm: "アカウントが削除されます。よろしいですか?"
incorrectPassword: "パスワードが間違っています。"
voteConfirm: "「{choice}」に投票しますか?"
hide: "隠す"
@ -738,7 +758,6 @@ _ffVisibility:
followers: "フォロワーだけに公開"
private: "非公開"
nobody: 誰にも見せない (あなたにさえも)
_signup:
almostThere: "ほとんど完了です"
emailAddressInfo: "あなたが使っているメールアドレスを入力してください。メールアドレスが公開されることはありません。"
@ -757,6 +776,12 @@ _forgotPassword:
ifNoEmail: "メールアドレスを登録していない場合は、管理者までお問い合わせください。"
contactAdmin: "このインスタンスではメールがサポートされていないため、パスワードリセットを行う場合は管理者までお問い合わせください。"
_gallery:
my: "自分の投稿"
liked: "いいねした投稿"
like: "いいね!"
unlike: "いいね解除"
_email:
_follow:
title: "フォローされました"
@ -774,7 +799,7 @@ _registry:
createKey: "キーを作成"
_aboutMisskey:
about: "FoundKeyは2022年7月から開発されている、Misskeyのフォークです。"
about: "FoundKeyはsyuiloによって2014年から開発されている、オープンソースのソフトウェアです。"
allContributors: "全てのコントリビューター"
source: "ソースコード"
_nsfw:
@ -928,6 +953,30 @@ _time:
hour: "時間"
day: "日"
_tutorial:
title: "FoundKeyの使い方"
step1_1: "ようこそ。"
step1_2: "この画面は「タイムライン」と呼ばれ、あなたや、あなたが「フォロー」する人の「ノート」が時系列で表示されます。"
step1_3: "あなたはまだ何もノートを投稿しておらず、誰もフォローしていないので、タイムラインには何も表示されていないはずです。"
step2_1: "ノートを作成したり誰かをフォローしたりする前に、まずあなたのプロフィールを完成させましょう。"
step2_2: "あなたがどんな人かわかると、多くの人にノートを見てもらえたり、フォローしてもらいやすくなります。"
step3_1: "プロフィール設定はうまくできましたか?"
step3_2: "では試しに、何かノートを投稿してみてください。画面上にある鉛筆マークのボタンを押すとフォームが開きます。"
step3_3: "内容を書いたら、フォーム右上のボタンを押すと投稿できます。"
step3_4: "内容が思いつかない「FoundKey始めました」というのはいかがでしょう。"
step4_1: "投稿できましたか?"
step4_2: "あなたのノートがタイムラインに表示されていれば成功です。"
step5_1: "次は、他の人をフォローしてタイムラインを賑やかにしたいところです。"
step5_2: "{featured}で人気のノートが見れるので、その中から気になった人を選んでフォローしたり、{explore}で人気のユーザーを探すこともできます。"
step5_3: "ユーザーをフォローするには、ユーザーのアイコンをクリックしてユーザーページを表示し、「フォロー」ボタンを押します。"
step5_4: "ユーザーによっては、フォローが承認されるまで時間がかかる場合があります。"
step6_1: "タイムラインに他のユーザーのノートが表示されていれば成功です。"
step6_2: "他の人のノートには、「リアクション」を付けることができ、簡単にあなたの反応を伝えられます。"
step6_3: "リアクションを付けるには、ノートの「+」マークをクリックして、好きなリアクションを選択します。"
step7_1: "これで、FoundKeyの基本的な使い方の説明は終わりました。お疲れ様でした。"
step7_2: "もっとFoundKeyについて知りたいときは、{help}を見てみてください。"
step7_3: "では、FoundKeyをお楽しみください\U0001F680"
_2fa:
alreadyRegistered: "既に設定は完了しています。"
registerDevice: "デバイスを登録"
@ -940,34 +989,39 @@ _2fa:
securityKeyInfo: "FIDO2をサポートするハードウェアセキュリティキーもしくは端末の指紋認証やPINを使用してログインするように設定できます。"
_permissions:
"read:account": "アカウントの情報を読み取る"
"read:account": "アカウントの情報をる"
"write:account": "アカウントの情報を変更する"
"read:blocks": "どのユーザーをブロックしているかを読み取る"
"write:blocks": "ユーザーをブロック・ブロック解除する"
"read:drive": "ドライブ内のファイルとフォルダをリスト化する"
"write:drive": "ドライブ内でファイルを作成・変更・削除する"
"read:favorites": "お気に入りにしたノートをリスト化する"
"write:favorites": "ノートをお気に入りまたはお気に入り解除する"
"read:following": "自分がフォローしているユーザーおよび自分をフォローしているユーザーをリスト化する"
"write:following": "ユーザーをフォロー・フォロー解除する"
"read:messaging": "チャットの内容と履歴を見る"
"write:messaging": "チャットでメッセージを作成・削除する"
"read:mutes": "ミュートまたはRenoteをミュートにしたユーザーをリスト化する"
"write:mutes": "ユーザーまたはユーザーのRenoteをミュート・ミュート解除する"
"read:blocks": "ブロックを見る"
"write:blocks": "ブロックを操作する"
"read:drive": "ドライブを見る"
"write:drive": "ドライブ作する"
"read:favorites": "お気に入りを見る"
"write:favorites": "お気に入りを操作する"
"read:following": "フォローの情報を見る"
"write:following": "フォロー・フォロー解除する"
"read:messaging": "チャットを見る"
"write:messaging": "チャット作する"
"read:mutes": "ミュートを見る"
"write:mutes": "ミュートを操作する"
"write:notes": "ノートを作成・削除する"
"read:notifications": "通知を読み取る"
"write:notifications": "通知の既読化およびカスタム通知を作成する"
"write:reactions": "リアクションを作成・削除する"
"read:notifications": "通知を見る"
"write:notifications": "通知を操作する"
"read:reactions": "リアクションを見る"
"write:reactions": "リアクションを操作する"
"write:votes": "投票する"
"read:pages": "ページのリスト化・読み取りをする"
"write:pages": "ページを作成・変更・削除する"
"read:page-likes": "ページのいいねのリスト化・読み取りをする"
"write:page-likes": "ページをいいね・いいね解除する"
"read:user-groups": "参加・所有している、および招待されているグループのリスト化・読み取りをする"
"write:user-groups": "グループを作成・変更・削除・譲渡・参加、または脱退する。グループから他のユーザーを招待・凍結する。グループへの招待を承認・拒否する。"
"read:channels": "フォローおよび参加しているチャンネルのリスト化・読み取りをする"
"write:channels": "チャンネルを作成・変更・フォロー・フォロー解除する"
"read:reactions": リアクションを見る
"read:pages": "ページを見る"
"write:pages": "ページを操作する"
"read:page-likes": "ページのいいねを見る"
"write:page-likes": "ページのいいねを操作する"
"read:user-groups": "ユーザーグループを見る"
"write:user-groups": "ユーザーグループを操作する"
"read:channels": "チャンネルを見る"
"write:channels": "チャンネルを操作する"
"read:gallery": "ギャラリーを見る"
"write:gallery": "ギャラリーを操作する"
"read:gallery-likes": "ギャラリーのいいねを見る"
"write:gallery-likes": "ギャラリーのいいねを操作する"
_auth:
shareAccess: "「{name}」がアカウントにアクセスすることを許可しますか?"
shareAccessAsk: "アカウントへのアクセスを許可しますか?"
@ -1013,7 +1067,6 @@ _widgets:
aiscript: "AiScriptコンソール"
aichan: "藍"
rssMarquee: RSSティッカー
_cw:
hide: "隠す"
show: "もっと見る"
@ -1027,8 +1080,8 @@ _poll:
canMultipleVote: "複数回答可"
expiration: "期限"
infinite: "無期限"
at: "日時指定..."
after: "経過指定..."
at: "日時指定"
after: "経過指定"
deadlineDate: "期日"
deadlineTime: "時間"
duration: "期間"
@ -1064,7 +1117,7 @@ _postForm:
b: "何かありましたか?"
c: "何をお考えですか?"
d: "言いたいことは?"
e: "ここに書いてください..."
e: "ここに書いてください"
f: "あなたが書くのを待っています..."
_profile:
@ -1123,7 +1176,6 @@ _timelines:
social: "ソーシャル"
global: "グローバル"
shuffled: シャッフル
_pages:
newPage: "ページの作成"
editPage: "ページの編集"
@ -1189,8 +1241,6 @@ _notification:
groupInvited: "グループに招待された"
app: "連携アプリからの通知"
move: 自分以外のアカウントの引っ越し
update: ウォッチ中のノートが更新された
_actions:
followBack: "フォローバック"
reply: "返信"
@ -1219,48 +1269,3 @@ _deck:
list: "リスト"
mentions: "あなた宛て"
direct: "ダイレクト"
translationSettings: 翻訳設定
signinHistoryExpires: プライバシー規則に準拠するため、過去のログイン試行に関するデータは60日後に自動的に削除されます。
deleteAllFiles: すべてのファイルを削除
cannotAttachFileWhenAccountSwitched: 別のアカウントに切り替えている間はファイルを添付できません。
translationService: 翻訳サービス
cannotSwitchAccountWhenFileAttached: ファイルを添付したままアカウントを切り替えることはできません。
externalCssSnippets: インスピレーションのためのCSSスニペット群 (FoundKeyによって管理されていません)
botFollowRequiresApproval: Botとして設定されたアカウントからのフォロー申請は承認を必要にする
documentation: ドキュメンテーション
unlimited: 無制限
exportAll: すべてエクスポート
oauthErrorGoBack: サードパーティーアプリの認証中にエラーが発生しました。戻ってもう一度やり直してみてください。
selectMode: 複数選択
renoteMute: Renoteをミュート
renoteUnmute: Renoteのミュートを解除
stopActivityDeliveryDescription: ローカルでのアクティビティはこのインスタンスに対して送信されません。アクティビティの受信はこれまで通り機能します。
unrenoteAll: すべてのRenoteを取り消す
unrenoteAllConfirm: このートのRenoteをすべて取り消します。よろしいですか
addTag: タグを追加
removeTag: タグを削除
appAuthorization: アプリの承認
noPermissionsRequested: (必要な権限はありません。)
setCategory: カテゴリを設定
selectAll: 全選択
setTag: タグを設定
blockThisInstanceDescription: ローカルでのアクティビティはこのインスタンスに対して送信されません。このインスタンスからのアクティビティは破棄されます。
maxCustomEmojiPicker: ピッカー内で提案するカスタム絵文字の最大数
maxUnicodeEmojiPicker: ピッカー内で提案するUnicode絵文字の最大数
exportSelected: 選択をエクスポート
_translationService:
_libreTranslate:
authKey: LibreTranslate認証キー (任意)
endpoint: LibreTranslate API Endpoint
_deepl:
authKey: DeepL認証キー
_remoteInteract:
title: 申し訳ありませんが、残念ながら実行できません。
urlInstructions: 以下のURLをコピーするとよいでしょう。あなたのインスタンスの検索フィールドに貼り付けることで、正しい場所に誘導されるでしょう。
description: 今すぐにこのアクションを実行することはできません。あなたのインスタンス上で、またはログインして行う必要があるかもしれません。
movedTo: このユーザーは {handle} に引っ越しました。
uploadFailedDescription: ファイルをアップロードできませんでした。
uploadFailedSize: ファイルサイズが大きすぎるためアップロードできません。
uploadFailed: アップロード失敗
showAttachedNotes: 添付ノートを表示
attachedToNotes: このファイルが添付されたノート

819
locales/ja-KS.yml Normal file
View File

@ -0,0 +1,819 @@
_lang_: "日本語 (関西弁)"
headlineMisskey: "ノートでつながるネットワーク"
introMisskey: "ようお越しFoundKeyは、オープンソースの分散型マイクロブログサービスやねん。\n「ート」を作って、いま起こっとることを共有したり、あんたについて皆に発信しよう\U0001F4E1\
\n「リアクション」機能で、皆のートに素早く反応を追加したりもできるで✌\nほな新しい世界を探検しよか\U0001F680"
monthAndDay: "{month}月 {day}日"
search: "探す"
notifications: "通知"
username: "ユーザー名"
password: "パスワード"
forgotPassword: "パスワード忘れてん"
fetchingAsApObject: "今ちと連合に照会しとるで"
ok: "OKや"
gotIt: "ほい"
cancel: "やめとく"
renotedBy: "{user}がRenote"
noNotes: "ノートはあらへん"
noNotifications: "通知はあらへん"
instance: "インスタンス"
settings: "設定"
basicSettings: "基本設定"
otherSettings: "その他の設定"
openInWindow: "ウィンドウで開くで"
profile: "プロフィール"
timeline: "タイムライン"
noAccountDescription: "自己紹介食ってもた"
login: "ログイン"
loggingIn: "ログインしよるで"
logout: "ログアウト"
signup: "新規登録"
save: "保存"
users: "ユーザー"
addUser: "ユーザーを追加や"
favorite: "お気に入り"
favorites: "お気に入り"
unfavorite: "やっぱ気に入らん"
pin: "ピン留めしとく"
unpin: "やっぱピン留めせん"
copyContent: "内容をコピー"
copyLink: "リンクをコピー"
delete: "ほかす"
deleteAndEdit: "ほかして直す"
deleteAndEditConfirm: "このートをほかして書き直すんかこのートへのリアクション、Renote、返信も全部消えてまうで。"
addToList: "リストに入れたる"
sendMessage: "メッセージを送る"
copyUsername: "ユーザー名をコピー"
reply: "返事"
loadMore: "まだまだあるで!"
showMore: "まだまだあるで!"
youGotNewFollower: "フォローされたで"
receiveFollowRequest: "フォローリクエストされたで"
followRequestAccepted: "フォローが承認されたで"
mention: "メンション"
mentions: "うち宛て"
directNotes: "ダイレクト投稿"
importAndExport: "インポートとエクスポート"
import: "インポート"
export: "エクスポート"
files: "ファイル"
download: "ダウンロード"
driveFileDeleteConfirm: "ファイル「{name}」を消してしもうてええか?このファイルを添付したノートも消えてまうで。"
unfollowConfirm: "{name}のフォローを解除してもええんか?"
exportRequested: "エクスポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。エクスポート終わったら「ドライブ」に突っ込んどくで。"
importRequested: "インポートしてな、ってリクエストしたけど、これ多分めっちゃ時間かかるで。"
lists: "リスト"
note: "ノート"
notes: "ノート"
following: "フォロー"
followers: "フォロワー"
followsYou: "フォローされとるで"
createList: "リスト作る"
manageLists: "リストの管理"
error: "エラー"
somethingHappened: "なんかアカンことが起こったで"
retry: "もっぺんやる?"
pageLoadError: "ページの読み込みに失敗してしもうたで…"
pageLoadErrorDescription: "これは普通、ネットワークかブラウザキャッシュが原因やからね。キャッシュをクリアするか、もうちっとだけ待ってくれへんか?"
serverIsDead: "The server is not responding. Please wait for a while before trying\
\ again."
youShouldUpgradeClient: "To display this page, please reload and use a new version\
\ client. "
enterListName: "リスト名を入れてや"
privacy: "プライバシー"
makeFollowManuallyApprove: "自分が認めた人だけがこのアカウントをフォローできるようにする"
defaultNoteVisibility: "もとからの公開範囲"
follow: "フォロー"
followRequest: "フォローを頼む"
followRequests: "フォロー申請"
unfollow: "フォローやめる"
followRequestPending: "フォロー許してくれるん待っとる"
renote: "Renote"
unrenote: "Renoteやめる"
quote: "引用"
pinnedNote: "ピン留めされとるノート"
you: "あんた"
clickToShow: "押したら見えるで"
sensitive: "ちょっとアカンやつやで"
add: "増やす"
reaction: "リアクション"
reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。"
attachCancel: "のっけるのやめる"
markAsSensitive: "ちょっとこれはアカン"
unmarkAsSensitive: "そこまでアカンことないやろ"
enterFileName: "ファイル名を入れてや"
mute: "ミュート"
unmute: "ミュートやめたる"
block: "ブロック"
unblock: "ブロックやめたる"
suspend: "凍結"
unsuspend: "溶かす"
blockConfirm: "ブロックしてもええんか?"
unblockConfirm: "ブロックやめたるってほんまか?"
suspendConfirm: "凍結してしもうてええか?"
unsuspendConfirm: "解凍するけどええか?"
selectList: "リストを選ぶ"
selectAntenna: "アンテナを選ぶ"
selectWidget: "ウィジェットを選ぶ"
editWidgets: "ウィジェットをいじる"
editWidgetsExit: "編集終ったで"
customEmojis: "カスタム絵文字"
emoji: "絵文字"
emojis: "絵文字"
addEmoji: "絵文字を追加"
cacheRemoteFiles: "リモートのファイルをキャッシュする"
cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになるで。サーバーの容量は節約できるけど、サムネイルが作られんくなるから通信量が増えるで。"
flagAsBot: "Botやで"
flagAsBotDescription: "もしこのアカウントがプログラムによって運用されるんやったら、このフラグをオンにしてたのむで。オンにすると、反応の連鎖を防ぐためのフラグとして他の開発者に役立ったり、FoundKeyのシステム上での扱いがBotに合ったもんになるんやで。"
flagAsCat: "Catやで"
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
flagShowTimelineReplies: "It will display the reply to the note in the timeline. "
flagShowTimelineRepliesDescription: "It will display the reply to notes other than\
\ the user notes in the timeline when you turn it on. "
autoAcceptFollowed: "フォローしとるユーザーからのフォローリクエストを勝手に許可しとく"
addAccount: "アカウントを追加"
loginFailed: "ログインに失敗してしもうた…"
showOnRemote: "リモートで見る"
general: "全般"
setWallpaper: "壁紙を設定"
removeWallpaper: "壁紙を削除"
youHaveNoLists: "リストがあらへんで?"
followConfirm: "{name}をフォローしてええか?"
proxyAccount: "プロキシアカウント"
proxyAccountDescription: "プロキシアカウントは、代わりにフォローしてくれるアカウントや。例えば、551に豚まんが無いときやったり、ユーザーがリモートユーザーをアカウントに入れたとき、リストに入れられたユーザーが誰からもフォローされてないと寂しいやん。寂しいし、アクティビティも配達されへんから、プロキシアカウントがフォローしてくれるで。ええやつやん…"
host: "ホスト"
selectUser: "ユーザーを選ぶ"
recipient: "宛先"
annotation: "注釈"
federation: "連合"
registeredAt: "初観測"
latestRequestSentAt: "ちょっと前のリクエスト送信"
latestRequestReceivedAt: "ちょっと前のリクエスト受信"
latestStatus: "ちょっと前のステータス"
charts: "チャート"
perHour: "1時間ごと"
perDay: "1日ごと"
stopActivityDelivery: "アクティビティの配送をやめる"
blockThisInstance: "このインスタンスをブロック"
software: "ソフトウェア"
version: "バージョン"
withNFiles: "{n}個のファイル"
jobQueue: "ジョブキュー"
instanceInfo: "インスタンス情報"
statistics: "統計"
clearQueue: "キューにさいなら"
clearQueueConfirmTitle: "キューをクリアしまっか?"
clearQueueConfirmText: "未配達の投稿は配送されなくなるで。通常この操作を行う必要はあらへんや。"
clearCachedFiles: "キャッシュにさいなら"
clearCachedFilesConfirm: "キャッシュされとるリモートファイルをみんなほかしてええか?"
blockedInstances: "インスタンスブロック"
blockedInstancesDescription: "ブロックしたいインスタンスのホストを改行で区切って設定してな。ブロックされてもうたインスタンスとはもう金輪際やり取りできひんくなるで。"
muteAndBlock: "ミュートとブロック"
mutedUsers: "ミュートしたユーザー"
blockedUsers: "ブロックしたユーザー"
noUsers: "ユーザーはおらへん"
editProfile: "プロフィールをいじる"
noteDeleteConfirm: "このノートを削除しまっか?"
pinLimitExceeded: "これ以上ピン留めできひん"
intro: "FoundKeyのインストールが完了してん管理者アカウントを作ってや。"
done: "でけた"
processing: "処理しとる"
preview: "プレビュー"
default: "デフォルト"
noCustomEmojis: "絵文字はあらへん"
noJobs: "ジョブはあらへん"
federating: "連合しとる"
blocked: "ブロックしとる"
suspended: "配信せぇへん"
all: "みんな"
subscribing: "購読しとる"
publishing: "配信しとる"
notResponding: "応答してへんで"
changePassword: "パスワード変える"
security: "セキュリティ"
retypedNotMatch: "そやないねん。"
currentPassword: "今のパスワード"
newPassword: "今度のパスワード"
newPasswordRetype: "今度のパスワード(もっぺん入れて)"
attachFile: "ファイルのっける"
more: "他のやつ!"
featured: "ハイライト"
usernameOrUserId: "ユーザー名かユーザーID"
noSuchUser: "ユーザーが見つからへんで"
lookup: "見てきて"
announcements: "お知らせ"
imageUrl: "画像URL"
remove: "ほかす"
removeAreYouSure: "「{x}」はほかしてええか?"
deleteAreYouSure: "「{x}」はほかしてええか?"
resetAreYouSure: "リセットしてええん?"
saved: "保存したで!"
messaging: "チャット"
upload: "アップロード"
keepOriginalUploading: "Retain the original image. "
keepOriginalUploadingDescription: "When uploading the clip, the original version will\
\ be retained. Turning it of then uploading will produce images for public use. "
fromDrive: "ドライブから"
fromUrl: "URLから"
uploadFromUrl: "URLアップロード"
uploadFromUrlDescription: "このURLのファイルをアップロードしたいねん"
uploadFromUrlRequested: "アップロードしたい言うといたで"
uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間かかるかもしれへんわ。"
explore: "みつける"
messageRead: "もう読んだ"
noMoreHistory: "これより過去の履歴はあらへんで"
startMessaging: "チャットやるで"
nUsersRead: "{n}人が読んでもうた"
agreeTo: "{0}に同意したで"
tos: "利用規約"
start: "始める"
home: "ホーム"
remoteUserCaution: "リモートユーザーやから、足りひん情報あるかもしれへん。"
activity: "アクティビティ"
images: "画像"
birthday: "生まれた日"
yearsOld: "{age}歳"
registeredDate: "始めた日"
location: "場所"
theme: "テーマ"
themeForLightMode: "ライトモードではこのテーマつこて"
themeForDarkMode: "ダークモードではこのテーマつこて"
light: "ライト"
dark: "ダーク"
lightThemes: "デイゲーム"
darkThemes: "ナイトゲーム"
syncDeviceDarkMode: "デバイスのダークモードと一緒にする"
drive: "ドライブ"
selectFile: "ファイル選んでや"
selectFiles: "ファイル選んでや"
selectFolder: "フォルダ選んでや"
selectFolders: "フォルダ選んでや"
renameFile: "ファイル名をいらう"
folderName: "フォルダー名"
createFolder: "フォルダー作る"
renameFolder: "フォルダー名を変える"
deleteFolder: "フォルダーを消してまう"
addFile: "ファイルを追加"
emptyDrive: "ドライブにはなんも残っとらん"
emptyFolder: "ふぉろだーにはなんも残っとらん"
unableToDelete: "消そうおもってんけどな、あかんかったわ"
inputNewFileName: "今度のファイル名は何にするん?"
inputNewDescription: "新しいキャプションを入力しましょ"
inputNewFolderName: "今度のフォルダ名は何にするん?"
circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーや。"
hasChildFilesOrFolders: "このフォルダ、まだなんか入っとるから消されへん"
copyUrl: "URLをコピー"
rename: "名前を変えるで"
avatar: "アイコン"
banner: "バナー"
nsfw: "閲覧注意"
whenServerDisconnected: "サーバーとの接続が切れたとき"
disconnectedFromServer: "サーバーとの通信が切れたで"
reload: "リロード"
doNothing: "何もせんとく"
reloadConfirm: "リロードしてええか?"
watch: "ウォッチ"
unwatch: "ウォッチやめる"
accept: "ええで"
reject: "あかん"
normal: "ええ感じ"
instanceName: "インスタンス名"
instanceDescription: "インスタンスの紹介"
maintainerName: "管理者の名前"
maintainerEmail: "管理者のメールアドレス"
tosUrl: "利用規約のURL"
thisYear: "今年"
thisMonth: "今月"
today: "今日"
dayX: "{day}日"
monthX: "{month}月"
yearX: "{year}年"
pages: "ページ"
enableLocalTimeline: "ローカルタイムラインを使えるようにする"
enableGlobalTimeline: "グローバルタイムラインを使えるようにする"
disablingTimelinesInfo: "ここらへんのタイムラインを使えんようにしてしもても、管理者とモデレーターは使えるままになってるで、そうやなかったら不便やからな。"
enableRegistration: "一見さんでも誰でもいらっしゃ~い"
invite: "来てや"
driveCapacityPerLocalAccount: "ローカルユーザーひとりあたりのドライブ容量"
driveCapacityPerRemoteAccount: "リモートユーザーひとりあたりのドライブ容量"
inMb: "メガバイト単位"
iconUrl: "アイコン画像のURL"
bannerUrl: "バナー画像のURL"
pinnedUsers: "ピン留めしたユーザー"
pinnedUsersDescription: "「みつける」ページとかにピン留めしたいユーザーをここに書けばええんやで。他ん人との名前は改行で区切ればええんやで。"
hcaptchaSiteKey: "サイトキー"
hcaptchaSecretKey: "シークレットキー"
recaptchaSiteKey: "サイトキー"
recaptchaSecretKey: "シークレットキー"
antennas: "アンテナ"
manageAntennas: "アンテナいじる"
name: "名前"
antennaSource: "受信ソース(このソースは食われへん)"
antennaKeywords: "受信キーワード"
antennaExcludeKeywords: "除外キーワード"
antennaKeywordsDescription: "スペースで区切ったるとAND指定で、改行で区切ったるとOR指定や"
notifyAntenna: "新しいノートを通知すんで"
withFileAntenna: "なんか添付されたノートだけ"
antennaUsersDescription: "ユーザー名を改行で区切ったってな"
caseSensitive: "大文字と小文字は別もんや"
withReplies: "返信も入れたって"
connectedTo: "次のアカウントに繋がっとるで"
notesAndReplies: "投稿と返信"
withFiles: "ファイル付いとる"
silence: "サイレンス"
silenceConfirm: "サイレンスしよか?"
unsilence: "サイレンスやめるで"
unsilenceConfirm: "サイレンスやめよか?"
popularUsers: "人気のユーザー"
recentlyUpdatedUsers: "ちょっと前に投稿したばっかりのユーザー"
recentlyRegisteredUsers: "ちょっと前に始めたばっかりのユーザー"
recentlyDiscoveredUsers: "最近見っけたユーザー"
popularTags: "人気のタグ"
userList: "リスト"
aboutMisskey: "FoundKeyってなんや"
administrator: "管理者"
token: "トークン"
twoStepAuthentication: "二段階認証"
moderator: "モデレーター"
nUsersMentioned: "{n}人が投稿"
securityKey: "セキュリティキー"
securityKeyName: "キーの名前"
registerSecurityKey: "セキュリティキーを登録するで"
lastUsed: "最後につこうた日"
unregister: "登録やめる"
passwordLessLogin: "パスワード無くてもログインできるようにする"
resetPassword: "パスワードをリセット"
newPasswordIs: "今度のパスワードは「{password}」や"
reduceUiAnimation: "UIの動きやアニメーションを減らす"
share: "わけわけ"
notFound: "見つからへんね"
notFoundDescription: "指定されたURLに該当するページはあらへんやった。"
uploadFolder: "とりあえずアップロードしたやつ置いとく所"
markAsReadAllNotifications: "通知はもう全て読んだわっ"
markAsReadAllUnreadNotes: "投稿は全て読んだわっ"
markAsReadAllTalkMessages: "チャットはもうぜんぶ読んだわっ"
help: "ヘルプ"
inputMessageHere: "ここにメッセージ書いてや"
close: "閉じる"
group: "グループ"
groups: "グループ"
createGroup: "グループを作るで"
ownedGroups: "所有しとるグループ"
joinedGroups: "参加しとるグループ"
invites: "来てや"
groupName: "グループ名"
members: "メンバー"
transfer: "譲渡"
messagingWithUser: "ユーザーとチャット"
messagingWithGroup: "グループでチャット"
title: "タイトル"
text: "テキスト"
enable: "有効にするで"
next: "次"
retype: "もっかい入力"
noteOf: "{user}のノート"
inviteToGroup: "グループに招く"
quoteAttached: "引用付いとるで"
quoteQuestion: "引用として添付してもええか?"
noMessagesYet: "まだチャットはあらへんで"
newMessageExists: "新しいメッセージがきたで"
onlyOneFileCanBeAttached: "すまん、メッセージに添付できるファイルはひとつだけなんや。"
signinRequired: "ログインしてくれへん?"
invitationCode: "招待コード"
checking: "確認しとるで"
available: "利用できる\n"
unavailable: "利用できん"
usernameInvalidFormat: "a~z、A~Z、0~9、_が使えるで"
tooShort: "短すぎやろ!"
tooLong: "長すぎやろ!"
weakPassword: "へぼいパスワード"
normalPassword: "普通のパスワード"
strongPassword: "ええ感じのパスワード"
passwordMatched: "よし!一致や!"
passwordNotMatched: "一致しとらんで?"
or: "それか"
language: "言語"
uiLanguage: "UIの表示言語"
groupInvited: "グループに招待されとるで"
useOsNativeEmojis: "OSネイティブの絵文字を使う"
youHaveNoGroups: "グループがあらへんねぇ。"
noHistory: "履歴はあらへんねぇ。"
signinHistory: "ログイン履歴"
disableAnimatedMfm: "動きがやかましいMFMを止める"
category: "カテゴリ"
tags: "タグ"
createAccount: "アカウントを作成"
fontSize: "フォントサイズ"
noFollowRequests: "フォロー申請はあらへんで"
openImageInNewTab: "画像を新しいタブで開く"
dashboard: "ダッシュボード"
local: "ローカル"
remote: "リモート"
dayOverDayChanges: "前日比"
appearance: "見た目"
clientSettings: "クライアントの設定"
showFeaturedNotesInTimeline: "タイムラインにおすすめのノートを表示してや"
objectStorage: "オブジェクトストレージ"
useObjectStorage: "オブジェクトストレージを使う"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "参照に使うにURLやで。CDNやProxyを使用してるんならそのURL、S3: 'https://<bucket>.s3.amazonaws.com'、GCSとかなら:\
\ 'https://storage.googleapis.com/<bucket>'。"
objectStorageBucket: "Bucket"
objectStoragePrefix: "Prefix"
objectStorageEndpoint: "Endpoint"
objectStorageRegion: "Region"
objectStorageUseSSL: "SSLを使う"
objectStorageUseProxy: "Proxyを使う"
objectStorageUseProxyDesc: "API接続にproxy使わんのやったら切ってくれへん"
objectStorageSetPublicRead: "アップロードした時に'public-read'を設定してや"
showFixedPostForm: "タイムラインの上の方で投稿できるようにやってくれへん?"
newNoteRecived: "新しいノートがあるで"
sounds: "サウンド"
listen: "聴く"
none: "なし"
showInPage: "ページで表示"
popout: "ポップアウト"
volume: "音量"
masterVolume: "全体の音量"
details: "もっと"
unableToProcess: "なんか作業が止まってしまったようやね"
recentUsed: "最近使ったやつ"
install: "インストール"
uninstall: "アンインストール"
installedApps: "インストールされとるアプリ"
nothing: "あらへん"
installedDate: "インストールした日時"
lastUsedDate: "最後に使った日時"
state: "状態"
sort: "仕分ける"
ascendingOrder: "小さい順"
descendingOrder: "大きい順"
scratchpad: "スクラッチパッド"
scratchpadDescription: "スクラッチパッドではAiScriptを色々試すことができるんや。FoundKeyに対して色々できるコードを書いて動かしてみたり、結果を見たりできるで。"
output: "出力"
updateRemoteUser: "リモートユーザー情報の更新してくれん?"
deleteAllFilesConfirm: "ホンマにすべてのファイルを削除するん?消したもんはもう戻ってこんのやで?"
removeAllFollowing: "フォローを全解除"
removeAllFollowingDescription: "{host}からのフォローをすべて解除するで。そのインスタンスが消えて無くなった時とかには便利な機能やで。"
userSuspended: "このユーザーは...凍結されとる。"
userSilenced: "このユーザーは...サイレンスされとる。"
divider: "分割線"
relays: "リレー"
addRelay: "リレーの追加"
inboxUrl: "inboxのURL"
poll: "アンケート"
enablePlayer: "プレイヤーを開く"
disablePlayer: "プレイヤーを閉じる"
themeEditor: "テーマエディター"
description: "説明"
author: "作者"
leaveConfirm: "未保存の変更があるで!ほかしてええか?"
manage: "管理"
plugins: "プラグイン"
deck: "デッキ"
width: "幅"
height: "高さ"
large: "大"
medium: "中"
small: "小"
edit: "編集"
enableEmail: "メール配信を受け取る"
emailConfigInfo: "メールアドレスの確認とかパスワードリセットの時に使うで"
email: "メール"
emailAddress: "メールアドレス"
smtpConfig: "SMTP サーバーの設定"
smtpHost: "ホスト"
smtpPort: "ポート"
smtpUser: "ユーザー名"
smtpPass: "パスワード"
emptyToDisableSmtpAuth: "ユーザー名とパスワードになんも入れんかったら、SMTP認証を無効化するで"
smtpSecure: "SMTP 接続に暗黙的なSSL/TLSを使用する"
testEmail: "配信テスト"
wordMute: "ワードミュート"
userSaysSomething: "{name}が何か言ったようやで"
makeActive: "使うで"
display: "表示"
copy: "コピー"
overview: "概要"
database: "データベース"
channel: "チャンネル"
create: "作成"
notificationSetting: "通知設定"
notificationSettingDesc: "表示する通知の種類えらんでや。"
useGlobalSetting: "グローバル設定を使ってや"
other: "その他"
regenerateLoginToken: "ログイントークンを再生成"
behavior: "動作"
abuseReports: "通報"
reportAbuse: "通報"
reportAbuseOf: "{name}を通報する"
send: "送信"
abuseMarkAsResolved: "対応したで"
openInNewTab: "新しいタブで開く"
defaultNavigationBehaviour: "デフォルトのナビゲーション"
instanceTicker: "ノートのインスタンス情報"
system: "システム"
switchUi: "UI切り替え"
desktop: "デスクトップ"
clip: "クリップ"
receivedReactionsCount: "リアクションされた数"
pollVotesCount: "アンケートに投票した数"
pollVotedCount: "アンケートに投票された数"
yes: "はい"
no: "いいえ"
driveFilesCount: "ドライブのファイル数"
emailVerified: "メールアドレスは確認されたで"
pageLikesCount: "Pageにええやんと思った数"
pageLikedCount: "Pageにええやんと思ってくれた数"
clips: "クリップ"
duplicate: "複製"
left: "左"
center: "中央"
wide: "広い"
narrow: "狭い"
reloadToApplySetting: "設定はページリロード後に反映されるで。今リロードしとくか?"
clearCache: "キャッシュをほかす"
onlineUsersCount: "{n}人が起きとるで"
backgroundColor: "背景"
accentColor: "アクセント"
textColor: "文字"
saveAs: "名前を付けて保存"
createdAt: "作成した日"
updatedAt: "更新日時"
deleteConfirm: "ホンマに削除するで?"
closeAccount: "アカウントを閉鎖する"
newVersionOfClientAvailable: "新しいバージョンのクライアントが使えるで。"
usageAmount: "使用量"
capacity: "容量"
inUse: "使用中"
editCode: "コードを編集"
apply: "適用"
receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る"
emailNotification: "メール通知"
useReactionPickerForContextMenu: "右クリックでリアクションピッカーを開くようにする"
typingUsers: "{users}が今書きよるで"
jumpToSpecifiedDate: "特定の日付にジャンプ"
clear: "クリア"
markAllAsRead: "もうみな読んでもうたわ"
goBack: "戻る"
info: "情報"
user: "ユーザー"
administration: "管理"
hashtags: "ハッシュタグ"
hide: "隠す"
indefinitely: "無期限"
_gallery:
unlike: "良くないわ"
_email:
_follow:
title: "フォローされたで"
_receiveFollowRequest:
title: "フォローリクエストを受け取ったで"
_plugin:
install: "プラグインのインストール"
installWarn: "信頼できへんプラグインはインストールせんとってな"
_registry:
scope: "スコープ"
key: "キー"
keys: "キー"
domain: "ドメイン"
createKey: "キーを作る"
_aboutMisskey:
about: "FoundKeyはsyuiloが2014年からずっと作ってはる、オープンソースなソフトウェアや。"
allContributors: "全ての貢献者"
source: "ソースコード"
_mfm:
cheatSheet: "MFMチートシート"
mention: "メンション"
hashtag: "ハッシュタグ"
url: "URL"
link: "リンク"
bold: "太字"
center: "中央寄せ"
inlineCode: "コード(インライン)"
blockCode: "コード(ブロック)"
inlineMath: "数式(インライン)"
quote: "引用"
emoji: "カスタム絵文字"
search: "探す"
shake: "アニメーション(ぶるぶる)"
twitch: "アニメーション(ブレ)"
spin: "アニメーション(回転)"
blur: "ぼかし"
font: "フォント"
rotate: "回転"
_instanceTicker:
none: "表示せん"
remote: "リモートユーザーに表示"
always: "常に表示"
_serverDisconnectedBehavior:
reload: "自動でリロード"
dialog: "ダイアログで警告"
_channel:
create: "チャンネルを作る"
edit: "チャンネルを編集"
setBanner: "バナーを設定"
removeBanner: "バナーを削除"
featured: "トレンド"
notesCount: "{n}こ投稿があるで"
_menuDisplay:
hide: "隠す"
_wordMute:
soft: "ソフト"
hard: "ハード"
_theme:
explore: "テーマを探す"
install: "テーマのインストール"
manage: "テーマの管理"
code: "テーマコード"
description: "説明"
installed: "{name}をインストールしたで。"
installedThemes: "インストールされとるテーマ"
builtinThemes: "標準のテーマ"
alreadyInstalled: "そのテーマはもうインストールされとるで?"
make: "テーマを作る"
_sfx:
note: "ノート"
noteMy: "ノート(自分)"
notification: "通知"
chat: "チャット"
_ago:
future: "未来"
justNow: "たった今"
secondsAgo: "{n}秒前"
minutesAgo: "{n}分前"
hoursAgo: "{n}時間前"
daysAgo: "{n}日前"
weeksAgo: "{n}週間前"
monthsAgo: "{n}ヶ月前"
yearsAgo: "{n}年前"
_time:
second: "秒"
minute: "分"
hour: "時間"
day: "日"
_tutorial:
step3_1: "プロフィール設定はええ感じにできたか?"
_2fa:
alreadyRegistered: "もう設定終わっとるわ。"
_permissions:
"read:reactions": "リアクションを見る"
"write:votes": "投票する"
"read:pages": "ページを見る"
"read:page-likes": "ページのええやんを見る"
"write:page-likes": "ページのええやんを操作する"
"read:user-groups": "ユーザーグループを見る"
"read:channels": "チャンネルを見る"
_auth:
permissionAsk: "このアプリは次の権限を要求しとるで"
_antennaSources:
all: "みんなのノート"
homeTimeline: "フォローしとるユーザーのノート"
_weekday:
sunday: "日曜日"
monday: "月曜日"
tuesday: "火曜日"
wednesday: "水曜日"
thursday: "木曜日"
friday: "金曜日"
saturday: "土曜日"
_widgets:
memo: "付箋"
notifications: "通知"
timeline: "タイムライン"
calendar: "カレンダー"
trends: "トレンド"
clock: "時計"
rss: "RSSリーダー"
activity: "アクティビティ"
photos: "フォト"
digitalClock: "デジタル時計"
federation: "連合"
postForm: "投稿フォーム"
slideshow: "スライドショー"
button: "ボタン"
onlineUsers: "オンラインユーザー"
jobQueue: "ジョブキュー"
serverMetric: "サーバーメトリクス"
aiscript: "AiScriptコンソール"
_cw:
hide: "隠す"
show: "続き見して!"
chars: "{count}文字"
files: "{count}ファイル"
_poll:
choiceN: "選択肢{n}"
noMore: "これ以上追加でけへん"
canMultipleVote: "複数回答可"
expiration: "期限"
infinite: "無期限"
at: "日時指定"
after: "経過指定"
deadlineDate: "期日"
deadlineTime: "時間"
duration: "期間"
votesCount: "{n}票"
vote: "投票する"
_visibility:
publicDescription: "みんなに公開"
home: "ホーム"
followers: "フォロワー"
_profile:
name: "名前"
username: "ユーザー名"
_exportOrImport:
allNotes: "全てのノート"
followingList: "フォロー"
muteList: "ミュート"
blockingList: "ブロック"
userLists: "リスト"
_charts:
federation: "連合"
apRequest: "リクエスト"
usersTotal: "ユーザーの合計"
activeUsers: "アクティブユーザー数"
notesIncDec: "ノートの増減"
localNotesIncDec: "ローカルのノートの増減"
remoteNotesIncDec: "リモートのノートの増減"
notesTotal: "ノートの合計"
filesIncDec: "ファイルの増減"
filesTotal: "ファイルの合計"
storageUsageIncDec: "ストレージ使用量の増減"
storageUsageTotal: "ストレージ使用量の合計"
_instanceCharts:
requests: "リクエスト"
users: "ユーザーの増減"
usersTotal: "ユーザーの累積"
notes: "ノートの増減"
notesTotal: "ノートの累積"
ff: "フォロー/フォロワーの増減"
ffTotal: "フォロー/フォロワーの累積"
cacheSize: "キャッシュサイズの増減"
cacheSizeTotal: "キャッシュサイズの累積"
files: "ファイル数の増減"
filesTotal: "ファイル数の累積"
_timelines:
home: "ホーム"
local: "ローカル"
social: "ソーシャル"
global: "グローバル"
_pages:
newPage: "ページを作る"
editPage: "ページの編集"
readPage: "ソースを表示中"
created: "ページを作成したで"
updated: "ページを更新したで"
deleted: "ページを削除したで"
pageSetting: "ページ設定"
viewPage: "ページを見る"
like: "ええやん"
unlike: "良くないわ"
liked: "ええと思ったページ"
contents: "コンテンツ"
summary: "ページの要約"
alignCenter: "中央寄せ"
font: "フォント"
fontSerif: "セリフ"
fontSansSerif: "サンセリフ"
eyeCatchingImageSet: "アイキャッチ画像を設定"
eyeCatchingImageRemove: "アイキャッチ画像を削除"
_notification:
youGotMention: "{name}からのメンション"
youGotReply: "{name}からのリプライ"
youWereFollowed: "フォローされたで"
youReceivedFollowRequest: "フォロー許可してほしいみたいやな"
yourFollowRequestAccepted: "フォローさせてもろたで"
youWereInvitedToGroup: "グループに招待されとるで"
_types:
follow: "フォロー"
mention: "メンション"
renote: "Renote"
quote: "引用"
reaction: "リアクション"
receiveFollowRequest: "フォロー許可してほしいみたいやで"
followRequestAccepted: "フォローが受理されたで"
_actions:
reply: "返事"
renote: "Renote"
_deck:
alwaysShowMainColumn: "いつもメインカラムを表示"
columnAlign: "カラムの寄せ"
columnMargin: "カラム間のマージン"
columnHeaderHeight: "カラムのヘッダー幅"
addColumn: "カラムを追加"
swapLeft: "左に移動"
swapRight: "右に移動"
swapUp: "上に移動"
swapDown: "下に移動"
stackLeft: "左に重ねる"
popRight: "右に出す"
profile: "プロファイル"
_columns:
main: "メイン"
widgets: "ウィジェット"
notifications: "通知"
tl: "タイムライン"
antenna: "アンテナ"
list: "リスト"
mentions: "あんた宛て"
direct: "ダイレクト"
_services: {}

View File

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

View File

@ -27,6 +27,9 @@ signup: "ನೋಂದಣಿ"
save: "ಉಳಿಸಿ"
users: "ಬಳಕೆದಾರ"
addUser: "ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"
favorite: "ಮೆಚ್ಚಿನ"
favorites: "ಮೆಚ್ಚಿನವುಗಳು"
unfavorite: "ಮೆಚ್ಚುಗೆ ಅಳಿಸು"
pin: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು"
unpin: "ಪ್ರೊಫ಼ೈಲಿಂದ ಅಂಟುತೆಗೆ"
copyContent: "ವಿಷಯವನ್ನು ನಕಲಿಸು"

View File

@ -1,8 +1,7 @@
---
_lang_: "한국어"
headlineMisskey: "노트로 연결되는 네트워크"
introMisskey: "환영합니다! FoundKey 는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n\"노트\" 를 작성해서, 지금 일어나고\
\ 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요\U0001F4E1\n\"리액션\" 기능으로, 친구의 노트에 총알같이 반응을 추가할\
\ 수도 있습니다\U0001F44D\n새로운 세계를 탐험해 보세요\U0001F680"
introMisskey: "환영합니다! FoundKey 는 오픈 소스 분산형 마이크로 블로그 서비스입니다.\n\"노트\" 를 작성해서, 지금 일어나고 있는 일을 공유하거나, 당신만의 이야기를 모두에게 발신하세요📡\n\"리액션\" 기능으로, 친구의 노트에 총알같이 반응을 추가할 수도 있습니다👍\n새로운 세계를 탐험해 보세요🚀"
monthAndDay: "{month}월 {day}일"
search: "검색"
notifications: "알림"
@ -13,6 +12,7 @@ fetchingAsApObject: "연합에서 조회 중"
ok: "OK"
gotIt: "알겠어요"
cancel: "취소"
enterUsername: "유저명 입력"
renotedBy: "{user}님이 Renote"
noNotes: "노트가 없습니다"
noNotifications: "표시할 알림이 없습니다"
@ -28,9 +28,16 @@ login: "로그인"
loggingIn: "로그인 중"
logout: "로그아웃"
signup: "회원 가입"
uploading: "업로드 중"
save: "저장"
users: "유저"
addUser: "유저 추가"
favorite: "즐겨찾기"
favorites: "즐겨찾기"
unfavorite: "즐겨찾기에서 제거"
favorited: "즐겨찾기에 등록했습니다"
alreadyFavorited: "이미 즐겨찾기에 등록되어 있습니다"
cantFavorite: "즐겨찾기에 등록하지 못했습니다"
pin: "프로필에 고정"
unpin: "프로필에서 고정 해제"
copyContent: "내용 복사"
@ -41,6 +48,7 @@ deleteAndEditConfirm: "이 노트를 삭제한 뒤 다시 편집하시겠습니
addToList: "리스트에 추가"
sendMessage: "메시지 보내기"
copyUsername: "유저명 복사"
searchUser: "사용자 검색"
reply: "답글"
loadMore: "더 보기"
showMore: "더 보기"
@ -60,6 +68,7 @@ unfollowConfirm: "{name}님을 언팔로우하시겠습니까?"
exportRequested: "내보내기를 요청하였습니다. 이 작업은 시간이 걸릴 수 있습니다. 내보내기가 완료되면 \"드라이브\"에 추가됩니다."
importRequested: "가져오기를 요청하였습니다. 이 작업에는 시간이 걸릴 수 있습니다."
lists: "리스트"
noLists: "리스트가 없습니다"
note: "노트"
notes: "노트"
following: "팔로잉"
@ -71,8 +80,7 @@ error: "오류"
somethingHappened: "오류가 발생했습니다"
retry: "다시 시도"
pageLoadError: "페이지를 불러오지 못했습니다."
pageLoadErrorDescription: "네트워크 연결 또는 브라우저 캐시로 인해 발생했을 가능성이 높습니다. 캐시를 삭제하거나, 잠시 후\
\ 다시 시도해 주세요."
pageLoadErrorDescription: "네트워크 연결 또는 브라우저 캐시로 인해 발생했을 가능성이 높습니다. 캐시를 삭제하거나, 잠시 후 다시 시도해 주세요."
serverIsDead: "서버로부터 응답이 없습니다. 잠시 후 다시 시도해주세요."
youShouldUpgradeClient: "이 페이지를 표시하려면 새로고침하여 새로운 버전의 클라이언트를 이용해 주십시오."
enterListName: "리스트 이름을 입력"
@ -84,15 +92,21 @@ followRequest: "팔로우 요청"
followRequests: "팔로우 요청"
unfollow: "팔로우 해제"
followRequestPending: "팔로우 허가 대기중"
enterEmoji: "이모지 입력"
renote: "Renote"
unrenote: "Renote 취소"
renoted: "Renote 하였습니다"
cantRenote: "이 게시물은 Renote할 수 없습니다."
cantReRenote: "Renote를 Renote할 수 없습니다."
quote: "인용"
pinnedNote: "고정해놓은 노트"
pinned: "프로필에 고정"
you: "당신"
clickToShow: "클릭하여 보기"
sensitive: "열람주의"
add: "추가"
reaction: "리액션"
reactionSetting: "선택기에 표시할 리액션"
reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다."
attachCancel: "첨부 취소"
markAsSensitive: "열람주의로 설정"
@ -116,13 +130,14 @@ editWidgetsExit: "편집 종료"
customEmojis: "커스텀 이모지"
emoji: "이모지"
emojis: "이모지"
emojiName: "이모지 이름"
emojiUrl: "이모지 URL"
addEmoji: "이모지 추가"
settingGuide: "추천 설정"
cacheRemoteFiles: "리모트 파일을 캐시"
cacheRemoteFilesDescription: "이 설정을 해지하면 리모트 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라\
\ 서버의 저장 공간을 절약할 수 있지만, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다."
cacheRemoteFilesDescription: "이 설정을 해지하면 리모트 파일을 캐시하지 않고 해당 파일을 직접 링크하게 됩니다. 그에 따라 서버의 저장 공간을 절약할 수 있지만, 썸네일이 생성되지 않기 때문에 통신량이 증가합니다."
flagAsBot: "나는 봇입니다"
flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우에 활성화해 주세요. 이 플래그를 활성화하면, 다른 봇이 이를 참고하여\
\ 봇 끼리의 무한 연쇄 반응을 회피하거나, 이 계정의 시스템 상에서의 취급이 Bot 운영에 최적화되는 등의 변화가 생깁니다."
flagAsBotDescription: "이 계정을 자동화된 수단으로 운용할 경우에 활성화해 주세요. 이 플래그를 활성화하면, 다른 봇이 이를 참고하여 봇 끼리의 무한 연쇄 반응을 회피하거나, 이 계정의 시스템 상에서의 취급이 Bot 운영에 최적화되는 등의 변화가 생깁니다."
flagAsCat: "나는 고양이다냥"
flagAsCatDescription: "이 계정이 고양이라면 활성화 해주세요."
flagShowTimelineReplies: "타임라인에 노트의 답글을 표시하기"
@ -132,32 +147,40 @@ addAccount: "계정 추가"
loginFailed: "로그인에 실패했습니다"
showOnRemote: "리모트에서 보기"
general: "일반"
wallpaper: "배경"
setWallpaper: "배경화면 설정"
removeWallpaper: "배경 제거"
searchWith: "검색: {q}"
youHaveNoLists: "리스트가 없습니다"
followConfirm: "{name}님을 팔로우 하시겠습니까?"
proxyAccount: "프록시 계정"
proxyAccountDescription: "프록시 계정은 특정 조건 하에서 유저의 리모트 팔로우를 대행하는 계정입니다. 예를 들면, 유저가 리모트\
\ 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 인스턴스로 배달되지 않기 때문에, 대신 프록시 계정이\
\ 해당 유저를 팔로우하도록 합니다."
proxyAccountDescription: "프록시 계정은 특정 조건 하에서 유저의 리모트 팔로우를 대행하는 계정입니다. 예를 들면, 유저가 리모트 유저를 리스트에 넣었을 때, 리스트에 들어간 유저를 아무도 팔로우한 적이 없다면 액티비티가 인스턴스로 배달되지 않기 때문에, 대신 프록시 계정이 해당 유저를 팔로우하도록 합니다."
host: "호스트"
selectUser: "유저 선택"
recipient: "수신인"
annotation: "내용에 대한 주석"
federation: "연합"
instances: "인스턴스"
registeredAt: "등록 날짜"
latestRequestSentAt: "마지막으로 요청을 보낸 시간"
latestRequestReceivedAt: "마지막으로 요청을 받은 시간"
latestStatus: "마지막 상태"
storageUsage: "스토리지 사용량"
charts: "차트"
perHour: "1시간마다"
perDay: "1일마다"
stopActivityDelivery: "액티비티 보내지 않기"
blockThisInstance: "이 인스턴스를 차단"
operations: "작업"
software: "소프트웨어"
version: "버전"
metadata: "메타데이터"
withNFiles: "{n}개의 파일"
monitor: "모니터"
jobQueue: "작업 대기열"
cpuAndMemory: "CPU와 메모리"
network: "네트워크"
disk: "디스크"
instanceInfo: "인스턴스 정보"
statistics: "통계"
clearQueue: "대기열 비우기"
@ -166,8 +189,7 @@ clearQueueConfirmText: "대기열에 남아 있는 노트는 더이상 연합되
clearCachedFiles: "캐시 비우기"
clearCachedFilesConfirm: "캐시된 리모트 파일을 모두 삭제하시겠습니까?"
blockedInstances: "차단된 인스턴스"
blockedInstancesDescription: "차단하려는 인스턴스의 호스트 이름을 줄바꿈으로 구분하여 설정합니다. 차단된 인스턴스는 이 인스턴스와\
\ 통신할 수 없게 됩니다."
blockedInstancesDescription: "차단하려는 인스턴스의 호스트 이름을 줄바꿈으로 구분하여 설정합니다. 차단된 인스턴스는 이 인스턴스와 통신할 수 없게 됩니다."
muteAndBlock: "뮤트 및 차단"
mutedUsers: "뮤트한 유저"
blockedUsers: "차단한 유저"
@ -189,6 +211,9 @@ all: "전체"
subscribing: "구독 중"
publishing: "배포 중"
notResponding: "응답 없음"
instanceFollowing: "인스턴스의 팔로잉"
instanceFollowers: "인스턴스의 팔로워"
instanceUsers: "인스턴스의 유저"
changePassword: "비밀번호 변경"
security: "보안"
retypedNotMatch: "입력이 일치하지 않습니다."
@ -204,6 +229,7 @@ lookup: "조회"
announcements: "공지사항"
imageUrl: "이미지 URL"
remove: "삭제"
removed: "삭제하였습니다"
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
resetAreYouSure: "초기화 하시겠습니까?"
@ -211,14 +237,14 @@ saved: "저장하였습니다"
messaging: "대화"
upload: "업로드"
keepOriginalUploading: "원본 이미지를 유지"
keepOriginalUploadingDescription: "이미지를 업로드할 때에 원본을 그대로 유지합니다. 비활성화하면 업로드할 때 브라우저에서\
\ 웹 공개용 이미지를 생성합니다."
keepOriginalUploadingDescription: "이미지를 업로드할 때에 원본을 그대로 유지합니다. 비활성화하면 업로드할 때 브라우저에서 웹 공개용 이미지를 생성합니다."
fromDrive: "드라이브에서"
fromUrl: "URL로부터"
uploadFromUrl: "URL 업로드"
uploadFromUrlDescription: "업로드하려는 파일의 URL"
uploadFromUrlRequested: "업로드를 요청했습니다"
uploadFromUrlMayTakeTime: "업로드가 완료될 때까지 시간이 소요될 수 있습니다."
explore: "발견하기"
messageRead: "읽음"
noMoreHistory: "이것보다 과거의 기록이 없습니다"
startMessaging: "대화 시작하기"
@ -243,6 +269,7 @@ lightThemes: "밝은 테마"
darkThemes: "어두운 테마"
syncDeviceDarkMode: "디바이스의 다크 모드 설정과 동기화"
drive: "드라이브"
fileName: "파일명"
selectFile: "파일 선택"
selectFiles: "파일 선택"
selectFolder: "폴더 선택"
@ -253,6 +280,8 @@ createFolder: "폴더 만들기"
renameFolder: "폴더 이름 바꾸기"
deleteFolder: "폴더 삭제"
addFile: "파일 추가"
emptyDrive: "드라이브가 비어 있습니다"
emptyFolder: "폴더가 비어 있습니다"
unableToDelete: "삭제할 수 없습니다"
inputNewFileName: "바꿀 파일명을 입력해 주세요"
inputNewDescription: "새 캡션을 입력해 주세요"
@ -289,6 +318,7 @@ pages: "페이지"
enableLocalTimeline: "로컬 타임라인 활성화"
enableGlobalTimeline: "글로벌 타임라인 활성화"
disablingTimelinesInfo: "특정 타임라인을 비활성화하더라도 관리자 및 모더레이터는 계속 사용할 수 있습니다."
registration: "등록"
enableRegistration: "신규 회원가입을 활성화"
invite: "초대"
driveCapacityPerLocalAccount: "로컬 유저 한 명당 드라이브 용량"
@ -297,10 +327,22 @@ inMb: "메가바이트 단위"
iconUrl: "아이콘 URL"
bannerUrl: "배너 이미지 URL"
backgroundImageUrl: "배경 이미지 URL"
basicInfo: "기본 정보"
pinnedUsers: "고정된 유저"
pinnedUsersDescription: "\"발견하기\" 페이지 등에 고정하고 싶은 유저를 한 줄에 한 명씩 적습니다."
pinnedPages: "고정한 페이지"
pinnedPagesDescription: "인스턴스의 대문에 고정하고 싶은 페이지의 경로를 한 줄에 하나씩 적습니다."
pinnedClipId: "고정할 클립의 ID"
pinnedNotes: "고정해놓은 노트"
hcaptcha: "hCaptcha"
enableHcaptcha: "hCaptcha 활성화"
hcaptchaSiteKey: "사이트 키"
hcaptchaSecretKey: "시크릿 키"
recaptcha: "reCAPTCHA"
enableRecaptcha: "reCAPTCHA 활성화"
recaptchaSiteKey: "사이트 키"
recaptchaSecretKey: "시크릿 키"
avoidMultiCaptchaConfirm: "여러 Captcha를 사용하는 경우 간섭이 발생할 가능성이 있습니다. 다른 Captcha를 비활성화하시겠습니까? 취소를 눌러 여러 Captcha를 활성화한 상태로 두는 것도 가능합니다."
antennas: "안테나"
manageAntennas: "안테나 관리"
name: "이름"
@ -310,6 +352,7 @@ antennaExcludeKeywords: "제외할 키워드"
antennaKeywordsDescription: "공백으로 구분하는 경우 AND, 줄바꿈으로 구분하는 경우 OR로 지정됩니다"
notifyAntenna: "새로운 노트를 알림"
withFileAntenna: "파일이 첨부된 노트만"
enableServiceworker: "ServiceWorker 사용"
antennaUsersDescription: "유저명을 한 줄에 한 명씩 적습니다"
caseSensitive: "대소문자를 구분"
withReplies: "답글 포함"
@ -320,7 +363,15 @@ silence: "사일런스"
silenceConfirm: "이 계정을 사일런스로 설정하시겠습니까?"
unsilence: "사일런스 해제"
unsilenceConfirm: "이 계정의 사일런스를 해제하시겠습니까?"
popularUsers: "인기 유저"
recentlyUpdatedUsers: "최근 활동한 유저"
recentlyRegisteredUsers: "최근 가입한 유저"
recentlyDiscoveredUsers: "최근 발견한 유저"
exploreUsersCount: "{count}명의 유저가 있습니다"
exploreFediverse: "연합우주를 탐색"
popularTags: "인기 태그"
userList: "리스트"
about: "정보"
aboutMisskey: "FoundKey에 대하여"
administrator: "관리자"
token: "토큰"
@ -340,6 +391,7 @@ share: "공유"
notFound: "찾을 수 없습니다"
notFoundDescription: "지정한 URL에 해당하는 페이지가 존재하지 않습니다."
uploadFolder: "기본 업로드 위치"
cacheClear: "캐시 지우기"
markAsReadAllNotifications: "모든 알림을 읽은 상태로 표시"
markAsReadAllUnreadNotes: "모든 글을 읽은 상태로 표시"
markAsReadAllTalkMessages: "모든 대화를 읽은 상태로 표시"
@ -360,6 +412,7 @@ messagingWithGroup: "그룹끼리 대화하기"
title: "제목"
text: "텍스트"
enable: "사용"
next: "다음"
retype: "다시 입력"
noteOf: "{user}의 노트"
inviteToGroup: "그룹에 초대하기"
@ -369,6 +422,7 @@ noMessagesYet: "아직 대화가 없습니다"
newMessageExists: "새 메시지가 있습니다"
onlyOneFileCanBeAttached: "메시지에 첨부할 수 있는 파일은 하나까지입니다"
signinRequired: "로그인 해주세요"
invitations: "초대"
invitationCode: "초대 코드"
checking: "확인하는 중입니다"
available: "사용 가능합니다"
@ -387,6 +441,7 @@ or: "혹은"
language: "언어"
uiLanguage: "UI 표시 언어"
groupInvited: "그룹에 초대되었습니다"
aboutX: "{x}에 대하여"
useOsNativeEmojis: "OS 기본 이모지를 사용"
disableDrawer: "드로어 메뉴를 사용하지 않기"
youHaveNoGroups: "그룹이 없습니다"
@ -394,42 +449,47 @@ joinOrCreateGroup: "다른 그룹의 초대를 받거나, 직접 새 그룹을
noHistory: "기록이 없습니다"
signinHistory: "로그인 기록"
disableAnimatedMfm: "움직임이 있는 MFM을 비활성화"
doing: "잠시만요"
category: "카테고리"
tags: "태그"
docSource: "이 문서의 소스"
createAccount: "계정 만들기"
existingAccount: "기존 계정"
regenerate: "재생성"
fontSize: "글자 크기"
noFollowRequests: "처리되지 않은 팔로우 요청이 없습니다"
openImageInNewTab: "새 탭에서 이미지 열기"
dashboard: "대시보드"
local: "로컬"
remote: "리모트"
total: "합계"
weekOverWeekChanges: "지난주보다"
dayOverDayChanges: "어제보다"
appearance: "모양"
clientSettings: "클라이언트 설정"
accountSettings: "계정 설정"
numberOfDays: "며칠동안"
hideThisNote: "이 노트를 숨기기"
showFeaturedNotesInTimeline: "타임라인에 추천 노트를 표시"
objectStorage: "오브젝트 스토리지"
useObjectStorage: "오브젝트 스토리지를 사용"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "오브젝트 (미디어) 참조 URL 을 만들 때 사용되는 URL입니다. CDN 또는 프록시를 사용하는\
\ 경우 그 URL을 지정하고, 그 외의 경우 사용할 서비스의 가이드에 따라 공개적으로 액세스 할 수 있는 주소를 지정해 주세요. 예를 들어,\
\ AWS S3의 경우 'https://<bucket>.s3.amazonaws.com', GCS등의 경우 'https://storage.googleapis.com/<bucket>'\
\ 와 같이 지정합니다."
objectStorageBaseUrlDesc: "오브젝트 (미디어) 참조 URL 을 만들 때 사용되는 URL입니다. CDN 또는 프록시를 사용하는 경우 그 URL을 지정하고, 그 외의 경우 사용할 서비스의 가이드에 따라 공개적으로 액세스 할 수 있는 주소를 지정해 주세요. 예를 들어, AWS S3의 경우 'https://<bucket>.s3.amazonaws.com', GCS등의 경우 'https://storage.googleapis.com/<bucket>' 와 같이 지정합니다."
objectStorageBucket: "Bucket"
objectStorageBucketDesc: "사용 서비스의 bucket명을 지정해주세요."
objectStoragePrefix: "Prefix"
objectStoragePrefixDesc: "이 Prefix 의 디렉토리 아래에 파일이 저장됩니다."
objectStorageEndpoint: "Endpoint"
objectStorageEndpointDesc: "AWS S3의 경우 공란, 다른 서비스의 경우 각 서비스의 가이드에 맞게 endpoint를 설정해주세요.\
\ '<host>' 혹은 '<host>:<port>' 와 같이 지정합니다."
objectStorageEndpointDesc: "AWS S3의 경우 공란, 다른 서비스의 경우 각 서비스의 가이드에 맞게 endpoint를 설정해주세요. '<host>' 혹은 '<host>:<port>' 와 같이 지정합니다."
objectStorageRegion: "Region"
objectStorageRegionDesc: "'xx-east-1'와 같이 region을 지정해주세요. 사용하는 서비스에 region 개념이 없는\
\ 경우, 비워 두거나 'us-east-1'으로 설정해 주세요."
objectStorageRegionDesc: "'xx-east-1'와 같이 region을 지정해주세요. 사용하는 서비스에 region 개념이 없는 경우, 비워 두거나 'us-east-1'으로 설정해 주세요."
objectStorageUseSSL: "SSL 사용"
objectStorageUseSSLDesc: "API 호출시 HTTPS 를 사용하지 않는 경우 OFF 로 설정해 주세요"
objectStorageUseProxy: "연결에 프록시를 사용"
objectStorageUseProxyDesc: "오브젝트 스토리지 API 호출시 프록시를 사용하지 않는 경우 OFF 로 설정해 주세요"
objectStorageSetPublicRead: "업로드할 때 'public-read'를 설정하기"
serverLogs: "서버 로그"
deleteAll: "모두 삭제"
showFixedPostForm: "타임라인 상단에 글 작성란을 표시"
newNoteRecived: "새 노트가 있습니다"
sounds: "소리"
@ -440,6 +500,7 @@ popout: "새 창으로 열기"
volume: "음량"
masterVolume: "마스터 볼륨"
details: "자세히"
chooseEmoji: "이모지 선택"
unableToProcess: "작업을 완료할 수 없습니다"
recentUsed: "최근 사용"
install: "설치"
@ -453,27 +514,28 @@ sort: "정렬"
ascendingOrder: "오름차순"
descendingOrder: "내림차순"
scratchpad: "스크래치 패드"
scratchpadDescription: "스크래치 패드는 AiScript 의 테스트 환경을 제공합니다. FoundKey 와 상호 작용하는 코드를\
\ 작성, 실행 및 결과를 확인할 수 있습니다."
scratchpadDescription: "스크래치 패드는 AiScript 의 테스트 환경을 제공합니다. FoundKey 와 상호 작용하는 코드를 작성, 실행 및 결과를 확인할 수 있습니다."
output: "출력"
script: "스크립트"
updateRemoteUser: "리모트 유저 정보 갱신"
deleteAllFiles: "모든 파일 삭제"
deleteAllFilesConfirm: "모든 파일을 삭제하시겠습니까?"
removeAllFollowing: "모든 팔로잉 해제"
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게\
\ 된 경우 등에 실행해 주세요."
removeAllFollowingDescription: "{host}(으)로부터 모든 팔로잉을 해제합니다. 해당 인스턴스가 더 이상 존재하지 않게 된 경우 등에 실행해 주세요."
userSuspended: "이 계정은 정지된 상태입니다."
userSilenced: "이 계정은 사일런스된 상태입니다."
yourAccountSuspendedTitle: "계정이 정지되었습니다"
yourAccountSuspendedDescription: "이 계정은 서버의 이용 약관을 위반하거나, 기타 다른 이유로 인해 정지되었습니다. 자세한\
\ 사항은 관리자에게 문의해 주십시오. 계정을 새로 생성하지 마십시오."
yourAccountSuspendedDescription: "이 계정은 서버의 이용 약관을 위반하거나, 기타 다른 이유로 인해 정지되었습니다. 자세한 사항은 관리자에게 문의해 주십시오. 계정을 새로 생성하지 마십시오."
menu: "메뉴"
divider: "구분선"
addItem: "항목 추가"
relays: "릴레이"
addRelay: "릴레이 추가"
inboxUrl: "Inbox 주소"
addedRelays: "추가된 릴레이"
serviceworkerInfo: "푸시 알림을 수행하려면 활성화해야 합니다."
deletedNote: "삭제된 노트"
invisibleNote: "비공개 노트"
enableInfiniteScroll: "자동으로 좀 더 보기"
visibility: "공개 범위"
poll: "투표"
@ -483,12 +545,15 @@ disablePlayer: "플레이어 닫기"
themeEditor: "테마 에디터"
description: "설명"
describeFile: "캡션 추가"
enterFileDescription: "캡션 입력"
author: "작성자"
leaveConfirm: "저장하지 않은 변경사항이 있습니다. 취소하시겠습니까?"
manage: "관리"
plugins: "플러그인"
deck: "덱"
undeck: "덱 해제"
useBlurEffectForModal: "모달에 흐림 효과 사용"
useFullReactionPicker: "모든 기능이 포함된 리액션 선택기 사용"
width: "폭"
height: "높이"
large: "크게"
@ -500,6 +565,7 @@ enableAll: "전체 선택"
disableAll: "전체 해제"
tokenRequested: "계정 접근 허용"
pluginTokenRequestedDescription: "이 플러그인은 여기서 설정한 권한을 사용할 수 있게 됩니다."
notificationType: "알림 유형"
edit: "편집"
useStarForReactionFallback: "알 수 없는 리액션 이모지 대신 ★ 사용"
emailServer: "메일 서버"
@ -524,7 +590,10 @@ userSaysSomething: "{name}님이 무언가를 말했습니다"
makeActive: "활성화"
display: "표시"
copy: "복사"
metrics: "통계"
overview: "요약"
logs: "로그"
delayed: "지연"
database: "데이터베이스"
channel: "채널"
create: "생성"
@ -534,15 +603,16 @@ useGlobalSetting: "글로벌 설정을 사용하기"
useGlobalSettingDesc: "활성화하면 계정의 알림 설정이 적용되니다. 비활성화하면 개별적으로 설정할 수 있게 됩니다."
other: "기타"
regenerateLoginToken: "로그인 토큰을 재생성"
regenerateLoginTokenDescription: "로그인할 때 사용되는 내부 토큰을 재생성합니다. 일반적으로 이 작업을 실행할 필요는 없습니다.\
\ 이 기능을 사용하면 이 계정으로 로그인한 모든 기기에서 로그아웃됩니다."
regenerateLoginTokenDescription: "로그인할 때 사용되는 내부 토큰을 재생성합니다. 일반적으로 이 작업을 실행할 필요는 없습니다. 이 기능을 사용하면 이 계정으로 로그인한 모든 기기에서 로그아웃됩니다."
setMultipleBySeparatingWithSpace: "공백으로 구분하여 여러 개 설정할 수 있습니다."
fileIdOrUrl: "파일 ID 또는 URL"
behavior: "동작"
sample: "예시"
abuseReports: "신고"
reportAbuse: "신고"
reportAbuseOf: "{name}을 신고하기"
fillAbuseReportDescription: "신고하려는 이유를 자세히 알려주세요."
abuseReported: "신고를 보냈습니다. 신고해 주셔서 감사합니다."
reporter: "신고자"
reporteeOrigin: "피신고자"
reporterOrigin: "신고자"
@ -551,8 +621,12 @@ forwardReportIsAnonymous: "리모트 인스턴스에서는 나의 정보를 볼
send: "전송"
abuseMarkAsResolved: "해결됨으로 표시"
openInNewTab: "새 탭에서 열기"
openInSideView: "사이드뷰로 열기"
defaultNavigationBehaviour: "기본 탐색 동작"
editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다."
instanceTicker: "노트의 인스턴스 정보"
waitingFor: "{x}을(를) 기다리고 있습니다"
random: "랜덤"
system: "시스템"
switchUi: "UI 전환"
desktop: "데스크탑"
@ -586,12 +660,16 @@ alwaysMarkSensitive: "미디어를 항상 열람 주의로 설정"
loadRawImages: "첨부한 이미지의 썸네일을 원본화질로 표시"
disableShowingAnimatedImages: "움직이는 이미지를 자동으로 재생하지 않음"
verificationEmailSent: "확인 메일을 발송하였습니다. 설정을 완료하려면 메일에 첨부된 링크를 확인해 주세요."
notSet: "설정되지 않음"
emailVerified: "메일 주소가 확인되었습니다."
noteFavoritesCount: "즐겨찾기한 노트 수"
pageLikesCount: "좋아요 한 Page 수"
pageLikedCount: "Page에 받은 좋아요 수"
contact: "연락처"
useSystemFont: "시스템 기본 글꼴을 사용"
clips: "클립"
experimentalFeatures: "실험실"
developer: "개발자"
makeExplorable: "\"발견하기\"에 내 계정 보이기"
makeExplorableDescription: "비활성화하면 \"발견하기\"에 나의 계정을 표시하지 않습니다."
showGapBetweenNotesInTimeline: "타임라인의 노트 사이를 띄워서 표시"
@ -602,16 +680,28 @@ wide: "넓게"
narrow: "좁게"
reloadToApplySetting: "이 설정을 적용하려면 페이지를 새로고침해야 합니다. 바로 새로고침하시겠습니까?"
needReloadToApply: "변경 사항은 새로고침하면 적용됩니다."
showTitlebar: "타이틀 바를 표시하기"
clearCache: "캐시 비우기"
onlineUsersCount: "{n}명이 접속 중"
nUsers: "{n} 유저"
nNotes: "{n} 노트"
myTheme: "내 테마"
backgroundColor: "배경 색"
accentColor: "강조 색상"
textColor: "문자 색"
saveAs: "다른 이름으로 저장"
advanced: "고급"
value: "값"
createdAt: "생성된 날짜"
updatedAt: "수정한 날짜"
saveConfirm: "저장하시겠습니까?"
deleteConfirm: "삭제하시겠습니까?"
invalidValue: "올바른 값이 아닙니다."
registry: "레지스트리"
closeAccount: "계정 폐쇄"
currentVersion: "현재 버전"
latestVersion: "최신 버전"
youAreRunningUpToDateClient: "사용 중인 클라이언트는 최신입니다."
newVersionOfClientAvailable: "새로운 버전의 클라이언트를 이용할 수 있습니다."
usageAmount: "사용량"
capacity: "용량"
@ -620,9 +710,12 @@ editCode: "코드 수정"
apply: "적용"
receiveAnnouncementFromInstance: "이 인스턴스의 알림을 이메일로 수신할게요"
emailNotification: "메일 알림"
publish: "게시"
inChannelSearch: "채널에서 검색"
useReactionPickerForContextMenu: "우클릭하여 리액션 선택기 열기"
typingUsers: "{users} 님이 입력하고 있어요.."
jumpToSpecifiedDate: "특정 날짜로 이동"
showingPastTimeline: "과거의 타임라인을 표시하고 있어요"
clear: "지우기"
markAllAsRead: "모두 읽은 상태로 표시"
goBack: "뒤로"
@ -635,6 +728,7 @@ notSpecifiedMentionWarning: "수신자가 선택되지 않은 멘션이 있어
info: "정보"
userInfo: "유저 정보"
unknown: "알 수 없음"
onlineStatus: "온라인 상태"
hideOnlineStatus: "온라인 상태 숨기기"
hideOnlineStatusDescription: "온라인 상태를 숨기면, 검색과 같은 일부 기능에 영향을 미칠 수 있습니다."
online: "온라인"
@ -655,15 +749,26 @@ switch: "전환"
noMaintainerInformationWarning: "관리자 정보가 설정되어 있지 않습니다."
noBotProtectionWarning: "Bot 방어가 설정되어 있지 않습니다."
configure: "설정하기"
postToGallery: "갤러리에 업로드"
gallery: "갤러리"
recentPosts: "최근 포스트"
popularPosts: "인기 포스트"
shareWithNote: "노트로 공유"
expiration: "기한"
memo: "메모"
priority: "우선순위"
high: "높음"
middle: "보통"
low: "낮음"
emailNotConfiguredWarning: "메일 주소가 설정되어 있지 않습니다."
ratio: "비율"
previewNoteText: "본문 미리보기"
customCss: "CSS 사용자화"
customCssWarn: "이 설정은 기능을 알고 있는 경우에만 사용해야 합니다. 잘못된 값을 입력하면 클라이언트가 정상적으로 작동하지 않을 수\
\ 있습니다."
customCssWarn: "이 설정은 기능을 알고 있는 경우에만 사용해야 합니다. 잘못된 값을 입력하면 클라이언트가 정상적으로 작동하지 않을 수 있습니다."
global: "글로벌"
squareAvatars: "프로필 아이콘을 사각형으로 표시"
sent: "전송"
received: "수신"
searchResult: "검색 결과"
hashtags: "해시태그"
troubleshooting: "문제 해결"
@ -674,8 +779,7 @@ whatIsNew: "패치 정보 보기"
translate: "번역"
translatedFrom: "{x}에서 번역"
accountDeletionInProgress: "계정 삭제 작업을 진행하고 있습니다"
usernameInfo: "서버상에서 계정을 식별하기 위한 이름. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있습니다.\
\ 사용자명은 나중에 변경할 수 없습니다."
usernameInfo: "서버상에서 계정을 식별하기 위한 이름. 알파벳(a~z, A~Z), 숫자(0~9) 및 언더바(_)를 사용할 수 있습니다. 사용자명은 나중에 변경할 수 없습니다."
keepCw: "CW 유지하기"
pubSub: "Pub/Sub 계정"
lastCommunication: "마지막 통신"
@ -738,9 +842,8 @@ _ffVisibility:
private: "비공개"
_signup:
almostThere: "거의 다 끝났습니다"
emailAddressInfo: "당신이 사용하고 있는 이메일 주소를 입력해 주세요. 이메일 주소는 다른 유저에게 공개되지 않습니다."
emailSent: "입력하신 메일 주소({email})로 확인 메일을 보내드렸습니다. 가입을 완료하시려면 보내드린 메일에 있는 링크로 접속해\
\ 주세요."
emailAddressInfo: "당신이 사용하고 있는 이메일 주소를 입력해 주세요. 이메일 주소는 다른 유저에게 공개되지 않습니다."
emailSent: "입력하신 메일 주소({email})로 확인 메일을 보내드렸습니다. 가입을 완료하시려면 보내드린 메일에 있는 링크로 접속해 주세요."
_accountDelete:
accountDelete: "계정 삭제"
mayTakeTime: "계정 삭제는 서버에 부하를 가하기 때문에, 작성한 콘텐츠나 업로드한 파일의 수가 많으면 완료까지 시간이 걸릴 수 있습니다."
@ -748,10 +851,18 @@ _accountDelete:
requestAccountDelete: "계정 삭제 요청"
started: "삭제 작업이 시작되었습니다."
inProgress: "삭제 진행 중"
_ad:
back: "뒤로"
reduceFrequencyOfThisAd: "이 광고의 표시 빈도 낮추기"
_forgotPassword:
enterEmail: "여기에 계정에 등록한 메일 주소를 입력해 주세요. 입력한 메일 주소로 비밀번호 재설정 링크를 발송합니다."
ifNoEmail: "메일 주소를 등록하지 않은 경우, 관리자에 문의해 주십시오."
contactAdmin: "이 인스턴스에서는 메일 기능이 지원되지 않습니다. 비밀번호를 재설정하려면 관리자에게 문의해 주십시오."
_gallery:
my: "내 갤러리"
liked: "좋아요 한 갤러리"
like: "좋아요!"
unlike: "좋아요 취소"
_email:
_follow:
title: "새로운 팔로워가 있습니다"
@ -760,6 +871,7 @@ _email:
_plugin:
install: "플러그인 설치"
installWarn: "신뢰할 수 없는 플러그인은 설치하지 않는 것이 좋습니다."
manage: "플러그인 관리"
_registry:
scope: "범위"
key: "키"
@ -768,16 +880,17 @@ _registry:
createKey: "키 생성"
_aboutMisskey:
about: "FoundKey는 syuilo에 의해서 2014년부터 개발되어 온 오픈소스 소프트웨어 입니다."
contributors: "주요 기여자"
allContributors: "모든 기여자"
source: "소스 코드"
translation: "FoundKey를 번역하기"
_nsfw:
respect: "열람주의로 설정된 미디어 숨기기"
ignore: "열람 주의 미디어 항상 표시"
force: "미디어 항상 숨기기"
_mfm:
cheatSheet: "MFM 도움말"
intro: "MFM는 FoundKey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할\
\ 수 있습니다."
intro: "MFM는 FoundKey의 다양한 곳에서 사용할 수 있는 전용 마크업 언어입니다. 여기에서는 MFM에서 사용할 수 있는 구문을 확인할 수 있습니다."
dummy: "FoundKey로 연합우주의 세계가 펼쳐집니다"
mention: "멘션"
mentionDescription: "골뱅이표(@) 뒤에 사용자명을 넣어 특정 유저를 나타낼 수 있습니다."
@ -888,6 +1001,68 @@ _theme:
alreadyInstalled: "이미 설치된 테마입니다"
invalid: "테마 형식이 올바르지 않습니다"
make: "테마 만들기"
base: "베이스"
addConstant: "상수 추가"
constant: "상수"
defaultValue: "기본값"
color: "색"
refProp: "프로퍼티를 참조"
refConst: "상수를 참조"
key: "키"
func: "함수"
funcKind: "함수 종류"
argument: "매개변수"
basedProp: "기준으로 할 속성 이름"
alpha: "불투명도"
darken: "어두움"
lighten: "밝음"
inputConstantName: "상수 이름을 입력하세요"
importInfo: "여기에 테마 코드를 붙여 넣어 에디터로 불러올 수 있습니다."
deleteConstantConfirm: "상수 {const}를 삭제하시겠습니까?"
keys:
accent: "강조 색상"
bg: "배경"
fg: "텍스트"
focus: "포커스"
indicator: "인디케이터"
panel: "패널"
shadow: "그림자"
header: "헤더"
navBg: "사이드바 배경"
navFg: "사이드바 텍스트"
navHoverFg: "사이드바 텍스트 (호버)"
navActive: "사이드바 텍스트 (활성)"
navIndicator: "사이드바 인디케이터"
link: "링크"
hashtag: "해시태그"
mention: "멘션"
mentionMe: "나에게 보낸 멘션"
renote: "Renote"
modalBg: "모달 배경"
divider: "구분선"
scrollbarHandle: "스크롤바 핸들"
scrollbarHandleHover: "스크롤바 핸들 (호버)"
dateLabelFg: "날짜 레이블 텍스트"
infoBg: "정보창 배경"
infoFg: "정보창 텍스트"
infoWarnBg: "경고창 배경"
infoWarnFg: "경고창 텍스트"
cwBg: "CW 버튼 배경"
cwFg: "CW 버튼 텍스트"
cwHoverBg: "CW 버튼 배경 (호버)"
toastBg: "알림창 배경"
toastFg: "알림창 텍스트"
buttonBg: "버튼 배경"
buttonHoverBg: "버튼 배경 (호버)"
inputBorder: "입력 필드 테두리"
listItemHoverBg: "리스트 항목 배경 (호버)"
driveFolderBg: "드라이브 폴더 배경"
wallpaperOverlay: "배경화면 오버레이"
badge: "배지"
messageBg: "채팅 배경"
accentDarken: "강조 색상 (어두움)"
accentLighten: "강조 색상 (밝음)"
fgHighlighted: "강조된 텍스트"
_sfx:
note: "새 노트"
noteMy: "내 노트"
@ -911,6 +1086,29 @@ _time:
minute: "분"
hour: "시간"
day: "일"
_tutorial:
title: "FoundKey의 사용 방법"
step1_1: "환영합니다!"
step1_2: "이 페이지는 \"타임라인\"이라고 불립니다. 당신이 \"팔로우\"하고 있는 사람들의 \"노트\"가 시간순으로 나타납니다."
step1_3: "아직 아무 유저도 팔로우하고 있지 않기에 타임라인은 비어 있을 것입니다."
step2_1: "새 노트를 작성하거나 다른 사람을 팔로우하기 전에, 먼저 프로필을 완성해보도록 합시다."
step2_2: "당신이 어떤 사람인지를 알린다면, 다른 사람들이 당신을 팔로우할 확률이 올라갈 것입니다."
step3_1: "프로필 설정은 잘 끝내셨나요?"
step3_2: "그럼 시험삼아 노트를 작성해 보세요. 화면에 있는 연필 버튼을 누르면 작성 폼이 열립니다."
step3_3: "내용을 작성한 후, 폼 오른쪽 상단의 버튼을 눌러 노트를 올릴 수 있습니다."
step3_4: "쓸 말이 없나요? \"Misskey 시작했어요!\" 같은 건 어떨까요? :>"
step4_1: "노트 작성을 끝내셨나요?"
step4_2: "당신의 노트가 타임라인에 표시되어 있다면 성공입니다."
step5_1: "이제, 다른 사람을 팔로우하여 타임라인을 활기차게 만들어보도록 합시다."
step5_2: "{featured}에서 이 인스턴스의 인기 노트를 보실 수 있습니다. {explore}에서는 인기 사용자를 찾을 수 있구요. 마음에 드는 사람을 골라 팔로우해 보세요!"
step5_3: "다른 유저를 팔로우하려면 해당 유저의 아이콘을 클릭하여 프로필 페이지를 띄운 후, 팔로우 버튼을 눌러 주세요."
step5_4: "사용자에 따라 팔로우가 승인될 때까지 시간이 걸릴 수 있습니다."
step6_1: "타임라인에 다른 사용자의 노트가 나타난다면 성공입니다."
step6_2: "다른 유저의 노트에 \"리액션\"을 붙여 간단하게 당신의 반응을 전달할 수도 있습니다."
step6_3: "리액션을 붙이려면, 노트의 \"+\" 버튼을 클릭하고 원하는 이모지를 선택합니다."
step7_1: "이것으로 FoundKey의 기본 튜토리얼을 마치겠습니다. 수고하셨습니다!"
step7_2: "FoundKey에 대해 더 알고 싶으시다면 {help}를 참고해 주세요."
step7_3: "그럼 FoundKey를 즐기세요! 🚀"
_2fa:
alreadyRegistered: "이미 설정이 완료되었습니다."
registerDevice: "디바이스 등록"
@ -920,8 +1118,7 @@ _2fa:
step2Url: "데스크톱 앱에서는 다음 URL을 입력하세요:"
step3: "앱에 표시된 토큰을 입력하시면 완료됩니다."
step4: "다음 로그인부터는 토큰을 입력해야 합니다."
securityKeyInfo: "FIDO2를 지원하는 하드웨어 보안 키 혹은 디바이스의 지문인식이나 화면잠금 PIN을 이용해서 로그인하도록 설정할\
\ 수 있습니다."
securityKeyInfo: "FIDO2를 지원하는 하드웨어 보안 키 혹은 디바이스의 지문인식이나 화면잠금 PIN을 이용해서 로그인하도록 설정할 수 있습니다."
_permissions:
"read:account": "계정의 정보를 봅니다"
"write:account": "계정의 정보를 변경합니다"
@ -951,6 +1148,10 @@ _permissions:
"write:user-groups": "유저 그룹을 만들거나, 초대하거나, 이름을 변경하거나, 양도하거나, 삭제합니다"
"read:channels": "채널을 보기"
"write:channels": "채널을 추가하거나 삭제합니다"
"read:gallery": "갤러리를 봅니다"
"write:gallery": "갤러리를 추가하거나 삭제합니다"
"read:gallery-likes": "갤러리의 좋아요를 확인합니다"
"write:gallery-likes": "갤러리에 좋아요를 추가하거나 취소합니다"
_auth:
shareAccess: "\"{name}\" 이 계정에 접근하는 것을 허용하시겠습니까?"
shareAccessAsk: "이 애플리케이션이 계정에 접근하는 것을 허용하시겠습니까?"
@ -1127,6 +1328,7 @@ _relayStatus:
accepted: "승인됨"
rejected: "거절됨"
_notification:
fileUploaded: "파일이 업로드되었습니다"
youGotMention: "{name}님이 멘션함"
youGotReply: "{name}님이 답글함"
youGotQuote: "{name}님이 인용함"
@ -1141,6 +1343,7 @@ _notification:
pollEnded: "투표 결과가 발표되었습니다"
emptyPushNotificationMessage: "푸시 알림이 갱신되었습니다"
_types:
all: "전부"
follow: "팔로잉"
mention: "멘션"
reply: "답글"

View File

@ -10,7 +10,7 @@ notifications: "Meldingen"
username: "Gebruikersnaam"
password: "Wachtwoord"
forgotPassword: "Wachtwoord vergeten"
fetchingAsApObject: "Ophalen vanuit de Fediverse..."
fetchingAsApObject: "Ophalen vanuit de Fediverse"
ok: "Ok"
gotIt: "Begrepen"
cancel: "Annuleren"
@ -32,6 +32,9 @@ signup: "Registreren"
save: "Opslaan"
users: "Gebruikers"
addUser: "Toevoegen gebruiker"
favorite: "Favorieten"
favorites: "Toevoegen aan favorieten"
unfavorite: "Verwijderen uit favorieten"
pin: "Vastmaken aan profielpagina"
unpin: "Losmaken van profielpagina"
copyContent: "Kopiëren inhoud"
@ -42,7 +45,7 @@ deleteAndEditConfirm: "Weet je zeker dat je deze notitie wilt verwijderen en dan
\ Je verliest alle reacties, herdelingen en antwoorden erop."
addToList: "Aan lijst toevoegen"
sendMessage: "Verstuur bericht"
copyUsername: "Kopiëren gebruikersnaam"
copyUsername: "Kopiëren gebruikersnaam "
reply: "Antwoord"
loadMore: "Laad meer"
showMore: "Toon meer"
@ -73,9 +76,9 @@ followsYou: "Volgt jou"
createList: "Creëer lijst"
manageLists: "Beheren lijsten"
error: "Fout"
somethingHappened: "Er is iets misgegaan"
somethingHappened: "Er is iets misgegaan."
retry: "Probeer opnieuw"
pageLoadError: "Pagina laden mislukt."
pageLoadError: "Pagina laden mislukt"
pageLoadErrorDescription: "Dit wordt normaal gesproken veroorzaakt door netwerkfouten\
\ of door de cache van de browser. Probeer de cache te wissen en probeer het na\
\ een tijdje wachten opnieuw."
@ -214,16 +217,17 @@ resetAreYouSure: "Resetten?"
saved: "Opgeslagen"
messaging: "Chat"
upload: "Uploaden"
keepOriginalUploading: "Origineel beeld behouden"
keepOriginalUploading: "Origineel beeld behouden."
keepOriginalUploadingDescription: "Bewaar de originele versie bij het uploaden van\
\ afbeeldingen. Indien uitgeschakeld, wordt bij het uploaden een alternatieve versie\
\ voor webpublicatie genereert."
fromDrive: "Van schijf"
fromUrl: "Van URL"
fromUrl: "Van URL"
uploadFromUrl: "Uploaden vanaf een URL"
uploadFromUrlDescription: "URL van het bestand dat je wil uploaden"
uploadFromUrlRequested: "Uploadverzoek"
uploadFromUrlMayTakeTime: "Het kan even duren voordat het uploaden voltooid is."
explore: "Verkennen"
messageRead: "Lezen"
noMoreHistory: "Er is geen verdere geschiedenis"
startMessaging: "Start een gesprek"
@ -259,6 +263,8 @@ createFolder: "Map aanmaken"
renameFolder: "Map hernoemen"
deleteFolder: "Map verwijderen"
addFile: "Bestand toevoegen"
emptyDrive: "Jouw Drive is leeg."
emptyFolder: "Deze map is leeg"
unableToDelete: "Kan niet worden verwijderd"
inputNewFileName: "Voer een nieuwe naam in"
copyUrl: "URL kopiëren"
@ -288,7 +294,7 @@ smtpUser: "Gebruikersnaam"
smtpPass: "Wachtwoord"
clearCache: "Cache opschonen"
user: "Gebruikers"
muteThread: "Discussies dempen"
muteThread: "Discussies dempen "
unmuteThread: "Dempen van discussie ongedaan maken"
hide: "Verbergen"
cropImage: "Afbeelding bijsnijden"
@ -352,12 +358,3 @@ selectWidget: Kies een widget
editWidgets: Widgets wijzigen
editWidgetsExit: Klaar
_services: {}
botFollowRequiresApproval: Volgverzoeken van als robot gemarkeerde gebruikers vereisen
goedkeuring
unrenoteAll: Alle renotes terugnemen
unrenoteAllConfirm: Weet je zeker dat je alle renotes voor deze note terug wil nemen?
exportAll: Alles exporteren
exportSelected: Selectie exporteren
uploadFailed: Uploaden mislukt
uploadFailedDescription: Het bestand kon niet worden geupload.
uploadFailedSize: Het bestand is te groot om te uploaden.

View File

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

View File

@ -32,6 +32,9 @@ signup: "Registrar-se"
save: "Guardar"
users: "Usuários"
addUser: "Adicionar usuário"
favorite: "Favoritar"
favorites: "Favoritar"
unfavorite: "Remover dos favoritos"
pin: "Afixar no perfil"
unpin: "Desafixar do perfil"
copyContent: "Copiar conteúdos"

View File

@ -32,6 +32,9 @@ signup: "Înregistrează-te"
save: "Salvează"
users: "Utilizatori"
addUser: "Adăugă utilizator"
favorite: "Adaugă la favorite"
favorites: "Favorite"
unfavorite: "Elimină din favorite"
pin: "Fixează pe profil"
unpin: "Anulati fixare"
copyContent: "Copiază conținutul"
@ -236,6 +239,7 @@ uploadFromUrl: "Încarcă dintr-un URL"
uploadFromUrlDescription: "URL-ul fișierului pe care dorești să îl încarci"
uploadFromUrlRequested: "Încărcare solicitată"
uploadFromUrlMayTakeTime: "S-ar putea să ia puțin până se finalizează încărcarea."
explore: "Explorează"
messageRead: "Citit"
noMoreHistory: "Nu există mai mult istoric"
startMessaging: "Începe un chat nou"
@ -271,6 +275,8 @@ createFolder: "Crează folder"
renameFolder: "Redenumește acest folder"
deleteFolder: "Șterge acest folder"
addFile: "Adăugați un fișier"
emptyDrive: "Drive-ul tău e gol"
emptyFolder: "Folder-ul acesta este gol"
unableToDelete: "Nu se poate șterge"
inputNewFileName: "Introdu un nou nume de fișier"
inputNewDescription: "Introdu o descriere nouă"
@ -317,6 +323,9 @@ inMb: "În megabytes"
iconUrl: "URL-ul iconiței"
bannerUrl: "URL-ul imaginii de banner"
backgroundImageUrl: "URL-ul imaginii de fundal"
pinnedUsers: "Utilizatori fixați"
pinnedUsersDescription: "Scrie utilizatorii, separați prin pauză de rând, care vor\
\ fi fixați pe pagina \"Explorează\"."
hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key"
recaptchaSiteKey: "Site key"
@ -341,6 +350,11 @@ silence: "Amuțește"
silenceConfirm: "Ești sigur că vrei să amuțești acest utilizator?"
unsilence: "Anulează amuțirea"
unsilenceConfirm: "Ești sigur că vrei să anulezi amuțirea acestui utilizator?"
popularUsers: "Utilizatori populari"
recentlyUpdatedUsers: "Utilizatori activi recent"
recentlyRegisteredUsers: "Utilizatori ce s-au alăturat recent"
recentlyDiscoveredUsers: "Utilizatori descoperiți recent"
popularTags: "Taguri populare"
userList: "Liste"
aboutMisskey: "Despre FoundKey"
administrator: "Administrator"
@ -381,6 +395,7 @@ messagingWithGroup: "Chat de grup"
title: "Titlu"
text: "Text"
enable: "Activează"
next: "Următorul"
retype: "Introdu din nou"
noteOf: "Notă de {user}"
inviteToGroup: "Invită în grup"
@ -574,6 +589,7 @@ abuseReports: "Rapoarte"
reportAbuse: "Raportează"
reportAbuseOf: "Raportează {name}"
fillAbuseReportDescription: "Te rog scrie detaliile legate de acest raport."
abuseReported: "Raportul tău a fost trimis. Mulțumim."
reporter: "Raportorul"
reporteeOrigin: "Originea raportatului"
reporterOrigin: "Originea raportorului"

View File

@ -32,6 +32,9 @@ signup: "Регистрация"
save: "Сохранить"
users: "Пользователи"
addUser: "Добавить пользователя"
favorite: "В избранное"
favorites: "Избранное"
unfavorite: "Убрать из избранного"
pin: "Закрепить в профиле"
unpin: "Открепить от профиля"
copyContent: "Скопировать содержимое"
@ -178,15 +181,14 @@ clearCachedFiles: "Очистить кэш"
clearCachedFilesConfirm: "Удалить все закэшированные файлы с других сайтов?"
blockedInstances: "Заблокированные инстансы"
blockedInstancesDescription: "Введите список инстансов, которые хотите заблокировать.\
\ Они больше не смогут обмениваться с вашим инстансом. Не-ASCII доменные имена должны\
\ быть переведены в punycode. Субдомены тоже будут заблокированы"
\ Они больше не смогут обмениваться с вашим инстансом."
muteAndBlock: "Скрытие и блокировка"
mutedUsers: "Скрытые пользователи"
blockedUsers: "Заблокированные пользователи"
noUsers: "Нет ни одного пользователя"
editProfile: "Редактировать профиль"
noteDeleteConfirm: "Вы хотите удалить эту заметку?"
pinLimitExceeded: "Нельзя закрепить ещё больше заметок."
pinLimitExceeded: "Нельзя закрепить ещё больше заметок"
intro: "Установка FoundKey завершена! А теперь создайте учетную запись администратора."
done: "Готово"
processing: "Обработка"
@ -231,6 +233,7 @@ uploadFromUrl: "Загрузить по ссылке"
uploadFromUrlDescription: "Ссылка на файл, который хотите загрузить"
uploadFromUrlRequested: "Загрузка выбранного"
uploadFromUrlMayTakeTime: "Загрузка может занять некоторое время."
explore: "Обзор"
messageRead: "Прочитали"
noMoreHistory: "История закончилась"
startMessaging: "Начать общение"
@ -266,6 +269,8 @@ createFolder: "Создать папку"
renameFolder: "Переименовать папку"
deleteFolder: "Удалить папку"
addFile: "Добавить файл"
emptyDrive: "Диск пуст"
emptyFolder: "Папка пуста"
unableToDelete: "Удаление невозможно"
inputNewFileName: "Введите имя нового файла"
inputNewDescription: "Введите новую подпись"
@ -311,6 +316,9 @@ inMb: "В мегабайтах"
iconUrl: "Ссылка на аватар"
bannerUrl: "Ссылка на изображение в шапке"
backgroundImageUrl: "Ссылка на фоновое изображение"
pinnedUsers: "Прикреплённый пользователь"
pinnedUsersDescription: "Перечислите по одному имени пользователя в строке. Пользователи,\
\ перечисленные здесь, будут привязаны к закладке \"Изучение\"."
hcaptchaSiteKey: "Ключ сайта"
hcaptchaSecretKey: "Секретный ключ"
recaptchaSiteKey: "Ключ сайта"
@ -333,9 +341,14 @@ connectedTo: "Вы подключены к следующим аккаунтам
notesAndReplies: "Заметки и ответы"
withFiles: "Заметки с файлами"
silence: "Заглушить"
silenceConfirm: "Заглушить этого пользователя? Уверены?"
silenceConfirm: " Заглушить этого пользователя? Уверены?"
unsilence: "Снять глушение"
unsilenceConfirm: "Снять глушение с этого пользователя? Уверены?"
popularUsers: "Популярные пользователи"
recentlyUpdatedUsers: "Активные последнее время"
recentlyRegisteredUsers: "Недавно зарегистрированные пользователи"
recentlyDiscoveredUsers: "Недавно обнаруженные пользователи"
popularTags: "Популярные теги"
userList: "Списки"
aboutMisskey: "О FoundKey"
administrator: "Администратор"
@ -376,6 +389,7 @@ messagingWithGroup: "Общение в группе"
title: "Заголовок"
text: "Текст"
enable: "Включить"
next: "Дальше"
retype: "Введите ещё раз"
noteOf: "Что пишет {user}"
inviteToGroup: "Пригласить в группу"
@ -569,6 +583,7 @@ abuseReports: "Жалобы"
reportAbuse: "Жалоба"
reportAbuseOf: "Пожаловаться на пользователя {name}"
fillAbuseReportDescription: "Опишите, пожалуйста, причину жалобы подробнее."
abuseReported: "Жалоба отправлена. Большое спасибо за информацию."
reporteeOrigin: "О ком сообщено"
reporterOrigin: "Кто сообщил"
forwardReport: "Перенаправление отчета на инстант."
@ -617,6 +632,7 @@ disableShowingAnimatedImages: "Не проигрывать анимацию"
verificationEmailSent: "Вам отправлено письмо для подтверждения. Пройдите, пожалуйста,\
\ по ссылке из письма, чтобы завершить проверку."
emailVerified: "Адрес электронной почты подтверждён."
noteFavoritesCount: "Количество добавленного в избранное"
pageLikesCount: "Количество понравившихся страниц"
pageLikedCount: "Количество страниц, понравившихся другим"
contact: "Как связаться"
@ -652,6 +668,7 @@ editCode: "Редактировать исходный текст"
apply: "Применить"
receiveAnnouncementFromInstance: "Получать оповещения с инстанса"
emailNotification: "Уведомления по электронной почте"
publish: "Опубликовать"
useReactionPickerForContextMenu: "Открывать палитру реакций правой кнопкой"
typingUsers: "Стук клавиш. Это {users}…"
jumpToSpecifiedDate: "Перейти к заданной дате"
@ -690,7 +707,10 @@ switch: "Переключение"
noMaintainerInformationWarning: "Не заполнены сведения об администраторах"
noBotProtectionWarning: "Ботозащита не настроена"
configure: "Настроить"
postToGallery: "Опубликовать в галерею"
gallery: "Галерея"
recentPosts: "Недавние публикации"
popularPosts: "Популярные публикации"
shareWithNote: "Поделиться заметкой"
emailNotConfiguredWarning: "Не указан адрес электронной почты"
ratio: "Соотношение"
@ -708,7 +728,7 @@ misskeyUpdated: "FoundKey обновился!"
whatIsNew: "Что новенького?"
translate: "Перевод"
translatedFrom: "Перевод. Язык оригинала — {x}"
accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи."
accountDeletionInProgress: "В настоящее время выполняется удаление учетной записи"
usernameInfo: "Имя, которое отличает вашу учетную запись от других на этом сервере.\
\ Вы можете использовать алфавит (a~z, A~Z), цифры (0~9) или символы подчеркивания\
\ (_). Имена пользователей не могут быть изменены позже."
@ -735,7 +755,7 @@ ffVisibility: "Видимость подписок и подписчиков"
ffVisibilityDescription: "Здесь можно настроить, кто будет видеть ваши подписки и\
\ подписчиков."
continueThread: "Показать следующие ответы"
deleteAccountConfirm: "Учётная запись {handle} будет безвозвратно удалена. Подтверждаете?"
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
incorrectPassword: "Пароль неверен."
voteConfirm: "Отдать голос за «{choice}»?"
hide: "Спрятать"
@ -785,6 +805,11 @@ _forgotPassword:
\ ресурса, чтобы сменить пароль."
contactAdmin: "Здесь не используются адреса электронной почты, так что свяжитесь\
\ с администратором, чтобы поменять пароль."
_gallery:
my: "Личная"
liked: "Понравившееся"
like: "Нравится!"
unlike: "Отменить «нравится»"
_email:
_follow:
title: "Новый подписчик"
@ -952,6 +977,43 @@ _time:
minute: "мин"
hour: "ч"
day: "сут"
_tutorial:
title: "Как пользоваться FoundKey"
step1_1: "Добро пожаловать!"
step1_2: "Эта страница называется «лента». Здесь будут появляться «заметки»: ваши\
\ личные и тех, на кого вы «подписаны». Они будут располагаться в порядке времени\
\ их появления."
step1_3: "Правда, ваша лента пока пуста. Она начнёт заполняться, когда вы будете\
\ писать свои заметки и подписываться на других."
step2_1: "Давайте, заполним профиль, прежде чем начать писать заметки и подписываться\
\ на других."
step2_2: "То, что вы расскажете в профиле, поможет лучше вас узнать, а значит, многим\
\ будет легче присоединиться — вы скорее получите новых подписчиков и читателей."
step3_1: "Успешно заполнили профиль?"
step3_2: "Что ж, теперь самое время опубликуовать заметку. Если нажать вверху страницы\
\ на изображение карандаша, появится форма для текста."
step3_3: "Напишите в неё, что хотите, и нажмите на кнопку в правом верхнем углу."
step3_4: "Ничего не приходит в голову? Как насчёт: «Я новенький, пока осваиваюсь\
\ в FoundKey»?"
step4_1: "С написанием первой заметки покончено?"
step4_2: "Отлично, теперь она должна появиться в вашей ленте."
step5_1: "А теперь самое время немного оживить ленту, подписавшись на других."
step5_2: "На странице «{featured}» собраны популярные сегодня заметки, читая которые,\
\ вы можете найти кого-то вам интересного, а на странице «{explore}» можно посмотреть,\
\ кто популярен у остальных."
step5_3: "Чтобы подписаться на кого-нибудь, щёлкните по его аватару и в открывшемся\
\ профиле нажмите кнопку «Подписаться»."
step5_4: "Некоторые пользователи (около их имени «висит замок») вручную подтверждают\
\ чужие подписки. Так что иногда подписка начинает работать не сразу.\n"
step6_1: "Если теперь в ленте видны и чужие заметки, значит у вас получилось."
step6_2: "Здесь можно непринуждённо выразить свои чувства к чьей-то заметке, отметив\
\ «реакцию» под ней."
step6_3: "Отмечайте реакции, нажмая на символ «+» под заметкой и выбирая значок\
\ по душе."
step7_1: "На этом вводный урок по использованию FoundKey закончен. Спасибо, что\
\ прошли его до конца!"
step7_2: "Хотите изучить FoundKey глубже — добро пожаловать в раздел «{help}»."
step7_3: "Приятно вам провести время с FoundKey\U0001F680"
_2fa:
alreadyRegistered: "Двухфакторная аутентификация уже настроена."
registerDevice: "Зарегистрируйте ваше устройство"
@ -982,6 +1044,7 @@ _permissions:
"write:notes": "Писать и удалять заметки"
"read:notifications": "Смотреть уведомления"
"write:notifications": "Изменять уведомления"
"read:reactions": "Смотреть реакции"
"write:reactions": "Изменять реакции"
"write:votes": "Голосовать"
"read:pages": "Смотреть страницы"
@ -992,6 +1055,10 @@ _permissions:
"write:user-groups": "Изменять и удалять группы пользователей"
"read:channels": "Смотреть каналы"
"write:channels": "Изменять каналы"
"read:gallery": "Просмотр галереи"
"write:gallery": "Редактирование галереи"
"read:gallery-likes": "Просмотр списка понравившегося в галерее"
"write:gallery-likes": "Изменение списка понравившегося в галерее"
_auth:
shareAccess: "Дать доступ для «{name}» к вашей учётной записи?"
shareAccessAsk: "Уверены, что хотите дать приложению доступ к своей учётной записи?"
@ -1095,7 +1162,7 @@ _profile:
changeAvatar: "Поменять аватар"
changeBanner: "Поменять изображение в шапке"
_exportOrImport:
allNotes: "Все записи"
allNotes: "Все записи\n"
followingList: "Подписки"
muteList: "Скрытые"
blockingList: "Заблокированные"
@ -1217,81 +1284,3 @@ _deck:
mentions: "Упоминания"
direct: "Личное"
_services: {}
botFollowRequiresApproval: Запросы на подписку от аккаунтов помеченных как бот требуют
подтверждения
showLess: Показать меньше
exportAll: Экспортировать всё
exportSelected: Экспортировать выбранное
cannotAttachFileWhenAccountSwitched: Вы не можете прикрепить файл, перейдя в другую
учетную запись.
cannotSwitchAccountWhenFileAttached: Вы не можете переключать учетные записи, пока
файлы прикреплены.
deleteAccount: Удалить аккаунт
isSystemAccount: Учетная запись, созданная системой и автоматически управляемая ею.
oneDay: Один день
cropImage: Обрезать изображение
documentation: Документация
movedTo: Этот пользователь перешел на {handle}.
typeToConfirm: Пожалуйста введите {x} чтобы подтвердить
rateLimitExceeded: Лимит превышен
numberOfPageCache: Количество кэшированных страниц
numberOfPageCacheDescription: Увеличение этого числа повысит удобство для пользователей,
но приведет к увеличению нагрузки на сервер, а также к использованию большего объема
памяти.
file: Файл
unclip: Удалить из подборки
translationSettings: Настройки перевода
translationService: Служба перевода
threadMuteNotificationsDesc: Выберите уведомления, которые вы хотите просмотреть в
этом треде. Также применяются глобальные настройки уведомлений. Отключение имеет
приоритет.
reflectMayTakeTime: Это может занять некоторое время чтобы вступило в силу.
failedToFetchAccountInformation: Не удалось получить информацию о аккаунте
instanceDefaultThemeDescription: Введите код темы в формате объекта.
tenMinutes: 10 минут
oneHour: Один час
oneWeek: Одна неделя
cropImageAsk: Вы хотите обрезать это изображение?
recentNHours: Последние {n} часов
recentNDays: Последние {n} дней
confirmToUnclipAlreadyClippedNote: Эта заметка уже является частью подборки "{name}".
Вы хотите вместо этого удалить это из этой подборки?
noEmailServerWarning: Сервер электронной почты не настроен.
setTag: Установить метку
addTag: Добавить метку
removeTag: Удалить метку
externalCssSnippets: Несколько фрагментов CSS для вашего вдохновения (не управляются
FoundKey)
oauthErrorGoBack: Произошла ошибка при попытке аутентификации стороннего приложения.
Пожалуйста, вернитесь и попробуйте еще раз.
appAuthorization: Авторизация приложения
noPermissionsRequested: (Никаких разрешений не требуется.)
selectMode: Выберите несколько
selectAll: Выбрать все
setCategory: Установить категорию
thereIsUnresolvedAbuseReportWarning: Есть нерасмотренные жалобы.
recommended: Рекомендовано
check: Проверка
unlimited: Неограниченный
mutePeriod: Длительность глушения
uploadFailed: Загрузка не удалась
uploadFailedDescription: Файл не может быть загружен.
uploadFailedSize: Файл слишком большой для загрузки.
renoteUnmute: Показать репосты
stopActivityDeliveryDescription: Локальная активнось не будет отправлена на этот сервер.
Получение активностей работает как раньше.
renoteMute: Скрыть репосты
unrenoteAllConfirm: Вы уверены что хотите отменить все репосты данной замети?
unrenoteAll: Отменить все репосты
blockThisInstanceDescription: Локальная активность не будет отправлена на этот сервер.
Активность этого сервера будет выброшена.
attachedToNotes: Заметки с этим файлом
showAttachedNotes: Показать заметки с этим файлом
signinHistoryExpires: Данные о прошлых попытках войти будут автоматически удалены
после 60 дней для соблюдения правил конфиденциальности.
deleteAllFiles: Удалить все файлы
federateBlocks: Федерировать блоки
federateBlocksDescription: Если выключено, то активности типа "блок" не будут отправлены.
regexpErrorDescription: 'Произошла ошибка в регулярном выражении на строке {line}
ваших {tab} заглушенных слов:'
reporter: Подавший жалобу

View File

@ -32,6 +32,9 @@ signup: "Registrovať"
save: "Uložiť"
users: "Používatelia"
addUser: "Pridať používateľa"
favorite: "Páči sa mi"
favorites: "Obľúbené"
unfavorite: "Nepáči sa mi"
pin: "Pripnúť"
unpin: "Odopnúť"
copyContent: "Kopírovať obsah"
@ -230,6 +233,7 @@ uploadFromUrl: "Nahrať z URL adresy"
uploadFromUrlDescription: "URL adresa nahrávaného súboru"
uploadFromUrlRequested: "Upload vyžiadaný"
uploadFromUrlMayTakeTime: "Nahrávanie môže nejaký čas trvať."
explore: "Objavovať"
messageRead: "Prečítané"
noMoreHistory: "To je všetko"
startMessaging: "Začať chat"
@ -265,6 +269,8 @@ createFolder: "Vytvoriť priečinok"
renameFolder: "Premenovať priečinok"
deleteFolder: "Odstrániť priečinok"
addFile: "Pridať súbor"
emptyDrive: "Váš disk je prázdny"
emptyFolder: "Tento priečinok je prázdny"
unableToDelete: "Nedá sa odstrániť"
inputNewFileName: "Zadajte nový názov"
inputNewDescription: "Zadajte nový popis"
@ -311,6 +317,9 @@ inMb: "V megabajtoch"
iconUrl: "Favicon URL"
bannerUrl: "URL obrázku bannera"
backgroundImageUrl: "URL obrázku pozadia"
pinnedUsers: "Pripnutí používatelia"
pinnedUsersDescription: "Zoznam mien používateľov oddelených riadkami, ktorý budú\
\ pripnutí v záložke \"Objavovať\"."
hcaptchaSiteKey: "Site key"
hcaptchaSecretKey: "Secret key"
recaptchaSiteKey: "Site key"
@ -335,6 +344,11 @@ silence: "Ticho"
silenceConfirm: "Naozaj chcete utíšiť tohoto používateľa?"
unsilence: "Vrátiť utíšenie"
unsilenceConfirm: "Naozaj chcete vrátiť utíšenie tohoto používateľa?"
popularUsers: "Populárni používatelia"
recentlyUpdatedUsers: "Používatelia s najnovšou aktivitou"
recentlyRegisteredUsers: "Najnovší používatelia"
recentlyDiscoveredUsers: "Naposledy objavení používatelia"
popularTags: "Populárne značky"
userList: "Zoznamy"
aboutMisskey: "O FoundKey"
administrator: "Administrátor"
@ -375,6 +389,7 @@ messagingWithGroup: "Skupinový chat"
title: "Nadpis"
text: "Text"
enable: "Povoliť"
next: "Ďalší"
retype: "Zadajte znovu"
noteOf: "Poznámky používateľa {user}"
inviteToGroup: "Pozvať do skupiny"
@ -560,6 +575,7 @@ abuseReports: "Nahlásenia"
reportAbuse: "Nahlásiť"
reportAbuseOf: "Nahlásiť {name}"
fillAbuseReportDescription: "Prosím vyplňte podrobnosti nahlásenia."
abuseReported: "Vaše nahlásenie je odoslané. Veľmi pekne ďakujeme."
reporter: "Nahlásil"
reporteeOrigin: "Pôvod nahláseného"
reporterOrigin: "Pôvod nahlasovača"
@ -609,6 +625,7 @@ disableShowingAnimatedImages: "Neprehrávať animované obrázky"
verificationEmailSent: "Odoslali sme overovací email. Overenie dokončíte kliknutím\
\ na odkaz v emaili."
emailVerified: "Email overený"
noteFavoritesCount: "Počet obľúbených poznámok"
pageLikesCount: "Počet obľúbených stránok"
pageLikedCount: "Počet prijatých \"páči sa mi\""
contact: "Kontakt"
@ -644,6 +661,7 @@ editCode: "Upraviť kód"
apply: "Použiť"
receiveAnnouncementFromInstance: "Prijať notifikácie z tohoto servera"
emailNotification: "Emailové upozornenia"
publish: "Zverejniť"
useReactionPickerForContextMenu: "Otvoriť výber reakcií na pravý klik"
typingUsers: "{users} píše/u"
jumpToSpecifiedDate: "Skočiť na konkrétny dátum"
@ -682,7 +700,10 @@ switch: "Prepnúť"
noMaintainerInformationWarning: "Informácie správcu nie sú nastavené."
noBotProtectionWarning: "Ochrana proti botom nie je nastavená."
configure: "Konfigurovať"
postToGallery: "Vytvoriť nový príspevok v galérii"
gallery: "Galéria"
recentPosts: "Najnovšie príspevky"
popularPosts: "Populárne príspevky"
shareWithNote: "Zdieľať s poznámkou"
emailNotConfiguredWarning: "Nie je nastavená emailová adresa."
ratio: "Pomer"
@ -783,6 +804,11 @@ _forgotPassword:
ifNoEmail: "Ak ste pri registrácii nepoužili email, prosím kontaktujte administrátora."
contactAdmin: "Tento server nepodporuje používanie emailových adries, prosím kontaktuje\
\ administrátor, ktorý vám resetuje heslo."
_gallery:
my: "Moja galéria"
liked: "Obľúbené príspevky"
like: "Páči sa mi"
unlike: "Nepáči sa mi"
_email:
_follow:
title: "Máte nového sledujúceho"
@ -948,6 +974,40 @@ _time:
minute: "min"
hour: "hod"
day: "dní"
_tutorial:
title: "Ako používať FoundKey"
step1_1: "Vitajte!"
step1_2: "Táto stránka sa volá \"časová os\". Zobrazuje chronologicky zoradené \"\
poznámky\" od ľudí, ktorých sledujete."
step1_3: "Vaša časová os je teraz prázdna pretože ste nepridali žiadne poznámky\
\ ani nikoho zatiaľ nesledujete."
step2_1: "Podˇme dokončiť nastavenia vášho profilu pred napísaním poznámky alebo\
\ sledovaním niekoho."
step2_2: "Poskytnutím informácií o vás uľahčíte ostatným, či chcú vidieť alebo sledovať\
\ vaše poznámky."
step3_1: "Dokončili ste nastavovanie svojho profilu?"
step3_2: "Poďme vyskúšať napísať poznámku. Môžete to spraviť stlačením ikony ceruzky\
\ na vrchu obrazovky."
step3_3: "Vyplňte polia a stlačte tlačítko vpravo hore."
step3_4: "Nemáte čo povedať? Skúste \"len si nastavujem môj msky\"!"
step4_1: "Napísali ste svoju prvú poznámku?"
step4_2: "Hurá! Teraz by vaša prvá poznámka mala byť na vašej časovej osi."
step5_1: "Teraz skúsme oživiť časovú os sledovaním nejakých ľudí."
step5_2: "{featured} zobrazí populárne poznámku na tomto serveri. {explore} môžete\
\ objavovať populárnych používateľov. Skúste tam nájsť ľudí, ktorých by ste radi\
\ sledovali!"
step5_3: "Ak chcete sledovať ďalších používateľov, kliknite na ich ikonu a stlačte\
\ tlačidlo \"Sledovať\" na ich profile."
step5_4: "Ak má niektorý používateľ ikonu zámku vedľa svojho mena, znamená to, že\
\ môže trvať určitý čas, kým daný používateľ schváli vašu žiadosť o sledovanie."
step6_1: "Teraz by ste mali vidieť poznámky ďalších používateľov na svojej časovej\
\ osi."
step6_2: "Môžete dať \"reakcie\" na poznámky ďalších ľudí ako rýchlu odpoveď."
step6_3: "Reakciu pridáte kliknutím na \"+\" niekoho poznámke a vybratím emoji,\
\ ktorou chcete reagovať."
step7_1: "Gralujeme! Dokončili ste základného sprievodcu FoundKey."
step7_2: "Ak sa chcete naučiť viac o FoundKey, skúste sekciu {help}."
step7_3: "A teraz, veľa šťastia, bavte sa s FoundKey! \U0001F680"
_2fa:
alreadyRegistered: "Už ste zaregistrovali 2-faktorové autentifikačné zariadenie."
registerDevice: "Registrovať nové zariadenie"
@ -979,6 +1039,7 @@ _permissions:
"write:notes": "Písať alebo odstrániť poznámky"
"read:notifications": "Vidieť vaše oznámenia"
"write:notifications": "Pracovať s vašimi notifikáciami"
"read:reactions": "Vidieť vaše reakcie"
"write:reactions": "Upravovať vaše reakcie"
"write:votes": "Hlasovať v hlasovaniach"
"read:pages": "Vidieť vaše stránky"
@ -989,6 +1050,10 @@ _permissions:
"write:user-groups": "Upraviť alebo odstrániť vaše skupiny"
"read:channels": "Čítať vaše kanály"
"write:channels": "Upravovať vaše kanály"
"read:gallery": "Vidieť vašu galériu"
"write:gallery": "Upravovať vašu galériu"
"read:gallery-likes": "Vidieť zoznam obľúbených príspevkov z galérie"
"write:gallery-likes": "Upraviť zoznam obľúbených príspevov z galérie"
_auth:
shareAccess: "Prajete si povoliť \"{name}\", aby mal prístup k tomuto účtu?"
shareAccessAsk: "Naozaj chcete povoliť tejto aplikácii prístup k tomuto účtu?"
@ -1192,7 +1257,7 @@ _notification:
groupInvited: "Pozvánky do skupín"
app: "Oznámenia z prepojených aplikácií"
_actions:
followBack: "Sledovať späť"
followBack: "Sledovať späť\n"
reply: "Odpovedať"
renote: "Preposlať"
_deck:

View File

@ -32,6 +32,9 @@ signup: "Registrera"
save: "Spara"
users: "Användare"
addUser: "Lägg till användare"
favorite: "Lägg till i favoriter"
favorites: "Favoriter"
unfavorite: "Avfavorisera"
pin: "Fäst till profil"
unpin: "Lossa från profil"
copyContent: "Kopiera innehåll"
@ -71,7 +74,7 @@ followers: "Följare"
followsYou: "Följer dig"
createList: "Skapa lista"
manageLists: "Hantera lista"
error: "Fel"
error: "Fel!"
somethingHappened: "Ett fel har uppstått"
retry: "Försök igen"
pageLoadError: "Det gick inte att ladda sidan."
@ -180,17 +183,15 @@ clearQueueConfirmText: "Om någon not är olevererad i kön kommer den inte fede
clearCachedFiles: "Rensa cache"
clearCachedFilesConfirm: "Är du säker att du vill radera alla cachade externa filer?"
blockedInstances: "Blockerade instanser"
blockedInstancesDescription: "Skriv de instansernas domäner som du vill blockera.\
\ Uppradade instanser kommer inte längre kunna kommunicera med denna instans. Icke\
\ ASCII domännamn måste skrivas i punycode. Subdomäner till de uppradade instanserna\
\ kommer också blockeras."
blockedInstancesDescription: "Lista adressnamn av instanser som du vill blockera.\
\ Listade instanser kommer inte längre kommunicera med denna instans."
muteAndBlock: "Tystningar och blockeringar"
mutedUsers: "Tystade användare"
blockedUsers: "Blockerade användare"
noUsers: "Det finns inga användare"
editProfile: "Redigera profil"
noteDeleteConfirm: "Är du säker på att du vill ta bort denna not?"
pinLimitExceeded: "Du kan inte fästa fler noter."
pinLimitExceeded: "Du kan inte fästa fler noter"
intro: "FoundKey har installerats! Vänligen skapa en adminanvändare."
done: "Klar"
processing: "Bearbetar..."
@ -207,7 +208,7 @@ publishing: "Publiceras"
notResponding: "Svarar inte"
changePassword: "Ändra lösenord"
security: "Säkerhet"
retypedNotMatch: "Inmatningen matchar inte."
retypedNotMatch: "Inmatningen matchar inte"
currentPassword: "Nuvarande lösenord"
newPassword: "Nytt lösenord"
newPasswordRetype: "Bekräfta lösenord"
@ -283,34 +284,3 @@ _deck:
list: "Listor"
mentions: "Omnämningar"
_services: {}
botFollowRequiresApproval: Följarförfrågningar från botmarkerade konton kräver manuellt
godkännande
home: Hem
activity: Akitivitet
images: Bilder
birthday: Födelsedag
yearsOld: '{age} år gammal'
stopActivityDeliveryDescription: Lokala aktiviteter kommer inte skickas till denna
instans. Mottagande av aktiviteter fungerar som innan.
remoteUserCaution: Eftersom användaren är ifrån en fjärran instans så kan informationen
vara inkomplett.
registeredDate: Blev medlem vid
location: Plats
theme: Teman
exportAll: Exportera alla
exportSelected: Exportera valda
showLess: Dölj
keepOriginalUploadingDescription: Sparar den ursprungliga bilden som den är. Om avstängd
så kommer en version som visas på webben genereras vid uppladning.
fromDrive: Från Drive
fromUrl: Från URL
uploadFromUrl: Ladda upp via en URL
uploadFromUrlDescription: URL till filen som du vill ladda upp
uploadFromUrlRequested: Förfrågade uppladningar
uploadFromUrlMayTakeTime: Det tar kanske ett tag innan uppladningen är färdig.
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,11 +23,14 @@ openInWindow: "Bir pencere ile aç"
profile: "Profil"
timeline: "Zaman çizelgesi"
noAccountDescription: "Bu kullanıcı henüz biyografisini yazmadı"
login: "Giriş Yap"
login: "Giriş Yap "
logout: ıkış Yap"
signup: "Kayıt Ol"
users: "Kullanıcı"
addUser: "Kullanıcı Ekle"
favorite: "Favoriler"
favorites: "Favoriler"
unfavorite: "Favorilerden Kaldır"
pin: "Sabitlenmiş"
unpin: "Sabitlemeyi kaldır"
copyContent: "İçeriği kopyala"

View File

@ -32,6 +32,9 @@ signup: "Реєстрація"
save: "Зберегти"
users: "Користувачі"
addUser: "Додати користувача"
favorite: "Обране"
favorites: "Обране"
unfavorite: "Видалити з обраного"
pin: "Закріпити"
unpin: "Відкріпити"
copyContent: "Скопіювати контент"
@ -180,16 +183,14 @@ clearCachedFiles: "Очистити кеш"
clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?"
blockedInstances: "Заблоковані інстанси"
blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені\
\ інстанси більше не зможуть спілкуватися з цим інстансом. Назви доменів не в ASCII\
\ кодуванні мають бути вказані в кодуванні punycode. Піддомени вказаних доменів\
\ також будуть заблоковані."
\ інстанси більше не зможуть спілкуватися з цим інстансом."
muteAndBlock: "Заглушення і блокування"
mutedUsers: "Заглушені користувачі"
blockedUsers: "Заблоковані користувачі"
noUsers: "Немає користувачів"
editProfile: "Редагувати обліковий запис"
noteDeleteConfirm: "Ви дійсно хочете видалити цей запис?"
pinLimitExceeded: "Більше записів закріпити не можна."
pinLimitExceeded: "Більше записів не можна закріпити"
intro: "Встановлення FoundKey завершено! Будь ласка, створіть обліковий запис адміністратора."
done: "Готово"
processing: "Обробка"
@ -234,6 +235,7 @@ uploadFromUrl: "Завантажити з посилання"
uploadFromUrlDescription: "Посилання на файл для завантаження"
uploadFromUrlRequested: "Завантаження розпочалось"
uploadFromUrlMayTakeTime: "Завантаження може зайняти деякий час."
explore: "Огляд"
messageRead: "Прочитано"
noMoreHistory: "Подальшої історії немає"
startMessaging: "Розпочати діалог"
@ -268,6 +270,8 @@ createFolder: "Створити теку"
renameFolder: "Перейменувати теку"
deleteFolder: "Видалити теку"
addFile: "Додати файл"
emptyDrive: "Диск порожній"
emptyFolder: "Тека порожня"
unableToDelete: "Видалення неможливе"
inputNewFileName: "Введіть ім'я нового файлу"
inputNewDescription: "Введіть новий заголовок"
@ -313,6 +317,9 @@ inMb: "В мегабайтах"
iconUrl: "URL аватара"
bannerUrl: "URL банера"
backgroundImageUrl: "URL-адреса фонового зображення"
pinnedUsers: "Закріплені користувачі"
pinnedUsersDescription: "Впишіть в список користувачів, яких хочете закріпити на сторінці\
\ \"Знайти\", ім'я в стовпчик."
hcaptchaSiteKey: "Ключ сайту"
hcaptchaSecretKey: "Секретний ключ"
recaptchaSiteKey: "Ключ сайту"
@ -337,6 +344,11 @@ silence: "Заглушити"
silenceConfirm: "Ви впевнені, що хочете заглушити цього користувача?"
unsilence: "Не глушити"
unsilenceConfirm: "Ви впевнені, що хочете скасувати глушіння цього користувача?"
popularUsers: "Популярні користувачі"
recentlyUpdatedUsers: "Нещодавно активні користувачі"
recentlyRegisteredUsers: "Нещодавно зареєстровані користувачі"
recentlyDiscoveredUsers: "Нещодавно знайдені користувачі"
popularTags: "Популярні теги"
userList: "Списки"
aboutMisskey: "Про FoundKey"
administrator: "Адмін"
@ -377,6 +389,7 @@ messagingWithGroup: "Чат з групою"
title: "Тема"
text: "Текст"
enable: "Увімкнути"
next: "Далі"
retype: "Введіть ще раз"
noteOf: "Нотатка {user}"
inviteToGroup: "Запрошення до групи"
@ -535,7 +548,7 @@ smtpPass: "Пароль"
emptyToDisableSmtpAuth: "Залиште назву користувача і пароль пустими для вимкнення\
\ підтвердження SMTP"
smtpSecure: "Використовувати безумовне шифрування SSL/TLS для з'єднань SMTP"
smtpSecureInfo: "Вимкніть при використанні STARTTLS ."
smtpSecureInfo: "Вимкніть при використанні STARTTLS "
testEmail: "Тестовий email"
wordMute: "Блокування слів"
regexpError: "Помилка регулярного виразу"
@ -567,6 +580,7 @@ abuseReports: "Скарги"
reportAbuse: "Поскаржитись"
reportAbuseOf: "Поскаржитись на {name}"
fillAbuseReportDescription: "Будь ласка вкажіть подробиці скарги."
abuseReported: "Дякуємо, вашу скаргу було відправлено. "
reporter: "Репортер"
reporteeOrigin: "Про кого повідомлено"
reporterOrigin: "Хто повідомив"
@ -617,6 +631,7 @@ disableShowingAnimatedImages: "Не програвати анімовані зо
verificationEmailSent: "Електронний лист з підтвердженням відісланий. Будь ласка перейдіть\
\ по посиланню в листі для підтвердження."
emailVerified: "Електронну пошту підтверджено."
noteFavoritesCount: "Кількість улюблених нотаток"
pageLikesCount: "Кількість отриманих вподобань сторінки"
pageLikedCount: "Кількість вподобаних сторінок"
contact: "Контакт"
@ -651,6 +666,7 @@ editCode: "Редагувати вихідний текст"
apply: "Застосувати"
receiveAnnouncementFromInstance: "Отримувати оповіщення з інстансу"
emailNotification: "Сповіщення електронною поштою"
publish: "Опублікувати"
useReactionPickerForContextMenu: "Відкривати палітру реакцій правою кнопкою"
typingUsers: "Стук клавіш. Це {users}…"
goBack: "Назад"
@ -662,6 +678,8 @@ hide: "Сховати"
indefinitely: "Ніколи"
_ffVisibility:
public: "Опублікувати"
_gallery:
unlike: "Не вподобати"
_email:
_follow:
title: "Новий підписник"
@ -680,7 +698,7 @@ _nsfw:
ignore: "Не приховувати NSFW медіа"
force: "Приховувати всі медіа файли"
_mfm:
cheatSheet: "Довідка MFM"
cheatSheet: " Довідка MFM"
intro: "MFM це ексклюзивна мова розмітки тексту в FoundKey, яку можна використовувати\
\ в багатьох місцях. Тут ви можете переглянути приклади її синтаксису."
dummy: "FoundKey розширює світ Федіверсу"
@ -804,6 +822,40 @@ _time:
minute: "х"
hour: "г"
day: "д"
_tutorial:
title: "Як користуватись FoundKey"
step1_1: "Ласкаво просимо!"
step1_2: "Ця сторінка має назву \"стрічка подій\". На ній з'являються записи користувачів\
\ на яких ви підписані."
step1_3: "Наразі ваша стрічка порожня, оскільки ви ще не написали жодної нотатки\
\ і не підписані на інших."
step2_1: "Перш ніж зробити запис або підписатись на когось, спочатку заповніть свій\
\ обліковий запис."
step2_2: "Надання деякої інформації про себе дозволить іншим користувачам підписатись\
\ на вас."
step3_1: "Ви успішно налаштували свій обліковий запис?"
step3_2: "Наступним кроком є написання нотатки. Це можна зробити, натиснувши зображення\
\ олівця на екрані."
step3_3: "Після написання вмісту ви можете опублікувати його, натиснувши кнопку\
\ у верхньому правому куті форми."
step3_4: "Не знаєте що написати? Спробуйте \"налаштовую свій msky\"!"
step4_1: "Ви розмістили свій перший запис?"
step4_2: "Ура! Ваш перший запис відображається на вашій стрічці подій."
step5_1: "Настав час оживити вашу стрічку подій підписавшись на інших користувачів."
step5_2: "{featured} показує популярні записи , а {explore} популярних користувачів\
\ з цього інстансу. Спробуйте підписатись на користувача, який вам сподобався!"
step5_3: "Щоб підписатись на інших користувачів, нажміть на їхнє зображення, а потім\
\ на кнопку \"підписатись\"."
step5_4: "Якщо користувач має замок при імені, то йому потрібно буде вручну підтвердити\
\ вашу заявку на підписку."
step6_1: "Тепер ви повинні бачити записи інших користувачів на вашій стрічці подій."
step6_2: "Також ви можете швидко відповісти, або \"відреагувати\" на записи інших\
\ користувачів."
step6_3: "Щоб \"відреагувати\", нажміть на знак плюс \"+\" на записі і виберіть\
\ емоджі яким ви хочете \"відреагувати\"."
step7_1: "Вітаю! Ви пройшли ознайомлення з FoundKey."
step7_2: "Якщо ви хочете більше дізнатись про FoundKey, зайдіть в розділ {help}."
step7_3: "Насолоджуйтесь FoundKey! \U0001F680"
_2fa:
registerKey: "Зареєструвати новий ключ безпеки"
_permissions:
@ -823,6 +875,7 @@ _permissions:
"write:mutes": "Змінювати список ігнорованих"
"write:notes": "Писати і видаляти нотатки"
"read:notifications": "Переглядати сповіщення"
"read:reactions": "Переглядати реакції"
"write:reactions": "Змінювати реакції"
"write:votes": "Голосувати в опитуваннях"
"read:pages": "Переглядати сторінки"
@ -865,7 +918,7 @@ _widgets:
button: "Кнопка"
onlineUsers: "Користувачі онлайн"
jobQueue: "Черга завдань"
serverMetric: "Показники сервера"
serverMetric: "Показники сервера "
aiscript: "Консоль AiScript"
_cw:
hide: "Сховати"
@ -1042,26 +1095,3 @@ _deck:
mentions: "Згадки"
direct: "Особисте"
_services: {}
exportAll: Експортувати все
exportSelected: Експортувати обране
signinHistoryExpires: Дані про минулі спроби входу автоматично видаляються через 60
днів з метою дотримання законодавства.
addDescription: Додати опис
userPagePinTip: Ви можете показувати тут дописи вибравши «Закріпити в профілі» в меню
окремих дописів.
unrenoteAllConfirm: Ви впевнені, що хочете скасувати всі поширення цього запису?
unrenoteAll: Скасувати всі поширення
renoteMute: Приховати поширення
renoteUnmute: Показати поширення
quitFullView: Вийти з повного перегляду
notSpecifiedMentionWarning: Цей допис містить згадки користувачів не вказаних як одержувачі
userInfo: Інформація про користувача
unknown: Невідомо
hideOnlineStatus: Приховати онлайн статус
deleteAllFiles: Видалити всі файли
clear: Повернутися
markAllAsRead: Позначити все як прочитане
unlikeConfirm: Дійсно видалити ваше вподобання?
fullView: Повний перегляд
showLess: Показати менше
jumpToSpecifiedDate: Перейти до вказаної дати

View File

@ -32,6 +32,9 @@ signup: "Đăng ký"
save: "Lưu"
users: "Người dùng"
addUser: "Thêm người dùng"
favorite: "Thêm vào yêu thích"
favorites: "Lượt thích"
unfavorite: "Bỏ thích"
pin: "Ghim"
unpin: "Bỏ ghim"
copyContent: "Chép nội dung"
@ -230,6 +233,7 @@ uploadFromUrl: "Tải lên bằng một URL"
uploadFromUrlDescription: "URL của tập tin bạn muốn tải lên"
uploadFromUrlRequested: "Đã yêu cầu tải lên"
uploadFromUrlMayTakeTime: "Sẽ mất một khoảng thời gian để tải lên xong."
explore: "Khám phá"
messageRead: "Đã đọc"
noMoreHistory: "Không còn gì để đọc"
startMessaging: "Bắt đầu trò chuyện"
@ -265,6 +269,8 @@ createFolder: "Tạo thư mục"
renameFolder: "Đổi tên thư mục"
deleteFolder: "Xóa thư mục"
addFile: "Thêm tập tin"
emptyDrive: "Ổ đĩa của bạn trống trơn"
emptyFolder: "Thư mục trống"
unableToDelete: "Không thể xóa"
inputNewFileName: "Nhập tên mới cho tập tin"
inputNewDescription: "Nhập mô tả mới"
@ -311,6 +317,9 @@ inMb: "Tính bằng MB"
iconUrl: "URL Icon"
bannerUrl: "URL Ảnh bìa"
backgroundImageUrl: "URL Ảnh nền"
pinnedUsers: "Những người thú vị"
pinnedUsersDescription: "Liệt kê mỗi hàng một tên người dùng xuống dòng để ghim trên\
\ tab \"Khám phá\"."
hcaptchaSiteKey: "Khóa của trang"
hcaptchaSecretKey: "Khóa bí mật"
recaptchaSiteKey: "Khóa của trang"
@ -335,6 +344,11 @@ silence: "Ẩn"
silenceConfirm: "Bạn có chắc muốn ẩn người này?"
unsilence: "Bỏ ẩn"
unsilenceConfirm: "Bạn có chắc muốn bỏ ẩn người này?"
popularUsers: "Những người nổi tiếng"
recentlyUpdatedUsers: "Hoạt động gần đây"
recentlyRegisteredUsers: "Mới tham gia"
recentlyDiscoveredUsers: "Mới khám phá"
popularTags: "Hashtag thông dụng"
userList: "Danh sách"
aboutMisskey: "Về FoundKey"
administrator: "Quản trị viên"
@ -375,6 +389,7 @@ messagingWithGroup: "Chat nhóm"
title: "Tựa đề"
text: "Nội dung"
enable: "Bật"
next: "Kế tiếp"
retype: "Nhập lại"
noteOf: "Tút của {user}"
inviteToGroup: "Mời vào nhóm"
@ -513,7 +528,7 @@ large: "Lớn"
medium: "Vừa"
small: "Nhỏ"
generateAccessToken: "Tạo mã truy cập"
permission: "Cho phép"
permission: "Cho phép "
enableAll: "Bật toàn bộ"
disableAll: "Tắt toàn bộ"
tokenRequested: "Cấp quyền truy cập vào tài khoản"
@ -565,6 +580,7 @@ abuseReports: "Lượt báo cáo"
reportAbuse: "Báo cáo"
reportAbuseOf: "Báo cáo {name}"
fillAbuseReportDescription: "Vui lòng điền thông tin chi tiết về báo cáo này."
abuseReported: "Báo cáo đã được gửi. Cảm ơn bạn nhiều."
reporter: "Người báo cáo"
reporteeOrigin: "Bị báo cáo"
reporterOrigin: "Máy chủ người báo cáo"
@ -614,6 +630,7 @@ disableShowingAnimatedImages: "Không phát ảnh động"
verificationEmailSent: "Một email xác minh đã được gửi. Vui lòng nhấn vào liên kết\
\ đính kèm để hoàn tất xác minh."
emailVerified: "Email đã được xác minh"
noteFavoritesCount: "Số lượng tút yêu thích"
pageLikesCount: "Số lượng trang đã thích"
pageLikedCount: "Số lượng thích trang đã nhận"
contact: "Liên hệ"
@ -649,6 +666,7 @@ editCode: "Chỉnh sửa mã"
apply: "Áp dụng"
receiveAnnouncementFromInstance: "Nhận thông báo từ máy chủ này"
emailNotification: "Thông báo email"
publish: "Đăng"
useReactionPickerForContextMenu: "Nhấn chuột phải để mở bộ chọn biểu cảm"
typingUsers: "{users} đang nhập…"
jumpToSpecifiedDate: "Đến một ngày cụ thể"
@ -686,7 +704,10 @@ switch: "Chuyển đổi"
noMaintainerInformationWarning: "Chưa thiết lập thông tin vận hành."
noBotProtectionWarning: "Bảo vệ Bot chưa thiết lập."
configure: "Thiết lập"
postToGallery: "Tạo tút có ảnh"
gallery: "Thư viện ảnh"
recentPosts: "Tút gần đây"
popularPosts: "Tút được xem nhiều nhất"
shareWithNote: "Chia sẻ kèm với tút"
emailNotConfiguredWarning: "Chưa đặt địa chỉ email."
ratio: "Tỷ lệ"
@ -789,6 +810,11 @@ _forgotPassword:
\ viên."
contactAdmin: "Máy chủ này không hỗ trợ sử dụng địa chỉ email, vui lòng liên hệ\
\ với quản trị viên để đặt lại mật khẩu của bạn."
_gallery:
my: "Kho Ảnh"
liked: "Tút Đã Thích"
like: "Thích"
unlike: "Bỏ thích"
_email:
_follow:
title: "đã theo dõi bạn"
@ -916,7 +942,7 @@ _wordMute:
mutedNotes: "Những tút đã ẩn"
_instanceMute:
instanceMuteDescription: "Thao tác này sẽ ẩn mọi tút/lượt đăng lại từ các máy chủ\
\ được liệt kê, bao gồm cả những tút dạng trả lời từ máy chủ bị ẩn."
\ được liệt kê, bao gồm cả những tút dạng trả lời từ máy chủ bị ẩn."
instanceMuteDescription2: "Tách bằng cách xuống dòng"
title: "Ẩn tút từ những máy chủ đã liệt kê."
heading: "Danh sách những máy chủ bị ẩn"
@ -955,6 +981,43 @@ _time:
minute: "phút"
hour: "giờ"
day: "ngày"
_tutorial:
title: "Cách dùng FoundKey"
step1_1: "Xin chào!"
step1_2: "Trang này gọi là \"bảng tin\". Nó hiện \"tút\" từ những người mà bạn \"\
theo dõi\" theo thứ tự thời gian."
step1_3: "Bảng tin của bạn đang trống, bởi vì bạn chưa đăng tút nào hoặc chưa theo\
\ dõi ai."
step2_1: "Hãy hoàn thành việc thiết lập hồ sơ của bạn trước khi viết tút hoặc theo\
\ dõi bất kỳ ai."
step2_2: "Cung cấp một số thông tin giới thiệu bạn là ai sẽ giúp người khác dễ dàng\
\ biết được họ muốn đọc tút hay theo dõi bạn."
step3_1: "Hoàn thành thiết lập hồ sơ của bạn?"
step3_2: "Sau đó, hãy thử đăng một tút tiếp theo. Bạn có thể làm như vậy bằng cách\
\ nhấn vào nút có biểu tượng bút chì trên màn hình."
step3_3: "Nhập nội dung vào khung soạn thảo và nhấn nút đăng ở góc trên."
step3_4: "Chưa biết nói gì? Thử \"Tôi mới tham gia FoundKey\"!"
step4_1: "Đăng xong tút đầu tiên của bạn?"
step4_2: "De! Tút đầu tiên của bạn đã hiện trên bảng tin."
step5_1: "Bây giờ, hãy thử làm cho bảng tin của bạn sinh động hơn bằng cách theo\
\ dõi những người khác."
step5_2: "{feature} sẽ hiển thị cho bạn các tút nổi bật trên máy chủ này. {explore}\
\ sẽ cho phép bạn tìm thấy những người dùng thú vị. Hãy thử tìm những người bạn\
\ muốn theo dõi ở đó!"
step5_3: "Để theo dõi những người dùng khác, hãy nhấn vào ảnh đại diện của họ và\
\ nhấn nút \"Theo dõi\" trên hồ sơ của họ."
step5_4: "Nếu người dùng khác có biểu tượng ổ khóa bên cạnh tên của họ, có thể mất\
\ một khoảng thời gian để người dùng đó phê duyệt yêu cầu theo dõi của bạn theo\
\ cách thủ công."
step6_1: "Bạn sẽ có thể xem tút của những người dùng khác trên bảng tin của mình\
\ ngay bây giờ."
step6_2: "Bạn cũng có thể đặt \"biểu cảm\" trên tút của người khác để phản hồi nhanh\
\ chúng."
step6_3: "Để đính kèm \"biểu cảm\", hãy nhấn vào dấu \"+\" trên tút của người dùng\
\ khác rồi chọn biểu tượng cảm xúc mà bạn muốn dùng."
step7_1: "Xin chúc mừng! Bây giờ bạn đã hoàn thành phần hướng dẫn cơ bản của FoundKey."
step7_2: "Nếu bạn muốn tìm hiểu thêm về FoundKey, hãy thử phần {help}."
step7_3: "Bây giờ, chúc may mắn và vui vẻ với FoundKey! \U0001F680"
_2fa:
alreadyRegistered: "Bạn đã đăng ký thiết bị xác minh 2 bước."
registerDevice: "Đăng ký một thiết bị"
@ -987,6 +1050,7 @@ _permissions:
"write:notes": "Soạn hoặc xóa tút"
"read:notifications": "Xem thông báo của tôi"
"write:notifications": "Quản lý thông báo của tôi"
"read:reactions": "Xem lượt biểu cảm của tôi"
"write:reactions": "Sửa lượt biểu cảm của tôi"
"write:votes": "Bình chọn"
"read:pages": "Xem trang của tôi"
@ -997,6 +1061,10 @@ _permissions:
"write:user-groups": "Sửa hoặc xóa nhóm của tôi"
"read:channels": "Xem kênh của tôi"
"write:channels": "Sửa kênh của tôi"
"read:gallery": "Xem kho ảnh của tôi"
"write:gallery": "Sửa kho ảnh của tôi"
"read:gallery-likes": "Xem danh sách các tút đã thích trong thư viện của tôi"
"write:gallery-likes": "Sửa danh sách các tút đã thích trong thư viện của tôi"
_auth:
shareAccess: "Bạn có muốn cho phép \"{name}\" truy cập vào tài khoản này không?"
shareAccessAsk: "Bạn có chắc muốn cho phép ứng dụng này truy cập vào tài khoản của\

View File

@ -30,6 +30,9 @@ signup: "新用户注册"
save: "保存"
users: "用户"
addUser: "添加用户"
favorite: "收藏"
favorites: "收藏"
unfavorite: "取消收藏"
pin: "置顶"
unpin: "取消置顶"
copyContent: "复制内容"
@ -211,6 +214,7 @@ uploadFromUrl: "从网址上传"
uploadFromUrlDescription: "输入文件的URL"
uploadFromUrlRequested: "请求上传"
uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
explore: "发现"
messageRead: "已读"
noMoreHistory: "没有更多的历史记录"
startMessaging: "添加聊天"
@ -245,6 +249,8 @@ createFolder: "创建文件夹"
renameFolder: "重命名文件夹"
deleteFolder: "删除文件夹"
addFile: "添加文件"
emptyDrive: "网盘中无文件"
emptyFolder: "此文件夹中无文件"
unableToDelete: "无法删除"
inputNewFileName: "请输入新文件名"
inputNewDescription: "请输入新标题"
@ -289,6 +295,8 @@ inMb: "以兆字节(MegaByte)为单位"
iconUrl: "图标URL"
bannerUrl: "横幅URL"
backgroundImageUrl: "背景图URL"
pinnedUsers: "置顶用户"
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
hcaptchaSiteKey: "网站密钥"
hcaptchaSecretKey: "密钥"
recaptchaSiteKey: "网站密钥"
@ -312,6 +320,11 @@ silence: "禁言"
silenceConfirm: "确认要禁言吗?"
unsilence: "解除禁言"
unsilenceConfirm: "要解除禁言吗?"
popularUsers: "热门用户"
recentlyUpdatedUsers: "最近投稿的用户"
recentlyRegisteredUsers: "最近登录的用户"
recentlyDiscoveredUsers: "最近发现的用户"
popularTags: "热门标签"
userList: "列表"
aboutMisskey: "关于 FoundKey"
administrator: "管理员"
@ -352,6 +365,7 @@ messagingWithGroup: "与群组聊天"
title: "标题"
text: "文本"
enable: "启用"
next: "下一个"
retype: "重新输入"
noteOf: "{user}的帖子"
inviteToGroup: "群组邀请"
@ -526,6 +540,7 @@ abuseReports: "举报"
reportAbuse: "举报"
reportAbuseOf: "举报{name}"
fillAbuseReportDescription: "请填写举报的详细原因。"
abuseReported: "内容已发送。感谢您提交信息。"
reporter: "举报者"
reporteeOrigin: "举报来源"
reporterOrigin: "举报者来源"
@ -570,6 +585,7 @@ loadRawImages: "添加附件图像的缩略图时使用原始图像质量"
disableShowingAnimatedImages: "不播放动画"
verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成设置。"
emailVerified: "电子邮件地址已验证"
noteFavoritesCount: "收藏的帖子数"
pageLikesCount: "页面点赞次数"
pageLikedCount: "页面被点赞次数"
contact: "联系人"
@ -603,6 +619,7 @@ editCode: "编辑代码"
apply: "应用"
receiveAnnouncementFromInstance: "从实例接收通知"
emailNotification: "邮件通知"
publish: "发布"
useReactionPickerForContextMenu: "单击右键打开回应工具栏"
typingUsers: "{users}正在输入"
jumpToSpecifiedDate: "跳转到特定日期"
@ -629,7 +646,7 @@ instanceBlocking: "被阻拦的实例"
selectAccount: "选择账户"
switchAccount: "切换账户"
enabled: "已启用"
disabled: "已禁用"
disabled: "已禁用 "
quickAction: "快捷操作"
user: "用户"
administration: "管理"
@ -638,7 +655,10 @@ switch: "切换"
noMaintainerInformationWarning: "管理人员信息未设置。"
noBotProtectionWarning: "Bot保护未设置。"
configure: "设置"
postToGallery: "发送到图库"
gallery: "图库"
recentPosts: "最新发布"
popularPosts: "热门投稿"
shareWithNote: "在帖子中分享"
emailNotConfiguredWarning: "电子邮件地址未设置。"
ratio: "比率"
@ -729,6 +749,11 @@ _forgotPassword:
enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。"
ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。"
contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。"
_gallery:
my: "我的图库"
liked: "喜欢的图片"
like: "喜欢"
unlike: "取消喜欢"
_email:
_follow:
title: "你有新的关注者"
@ -887,6 +912,29 @@ _time:
minute: "分"
hour: "小时"
day: "日"
_tutorial:
title: "FoundKey的使用方法"
step1_1: "欢迎!"
step1_2: "这个页面叫做「时间线」,它会按照时间顺序显示所有你「关注」的人所发的「帖子」。"
step1_3: "如果你并没有发布任何帖子,也没有关注其他的人,你的时间线页面应当什么都没有显示。"
step2_1: "在您想要发帖或关注其他人之前,请先设置一下个人资料吧。"
step2_2: "如果别人能够更加的了解你,关注你的概率也会得到提升。"
step3_1: "已经设置完个人资料了吗?"
step3_2: "那么接下来,试着写一些什么东西来发布吧。你可以通过点击屏幕上的铅笔图标来打开投稿页面。"
step3_3: "写完内容后,点击窗口右上方的按钮就可以投稿。"
step3_4: "不知道说些什么好吗那就写下「FoundKey我来啦」这样的话吧。"
step4_1: "将你的话语发布出去了吗?"
step4_2: "太棒了!现在你可以在你的时间线中看到你刚刚发布的帖子了。"
step5_1: "接下来,关注其他人来使时间线更生动吧。"
step5_2: "{featured}将向您展示热门趋势的帖子。 {explore}将让您找到热门用户。 尝试关注您喜欢的人!"
step5_3: "要关注其他用户,请单击他的头像,然后在他的个人资料上按下“关注”按钮。"
step5_4: "如果用户的名称旁边有锁定图标,则该用户需要手动批准您的关注请求。"
step6_1: "现在,您将可以在时间线上看到其他用户的帖子。"
step6_2: "您还可以在其他人的帖子上进行「回应」,以快速做出简单回复。"
step6_3: "在他人的贴子上按下「+」图标,即可选择想要的表情来进行「回应」。"
step7_1: "对FoundKey基本操作的简单介绍就到此结束了。 辛苦了!"
step7_2: "如果你想了解更多有关FoundKey的信息请参见{help}。"
step7_3: "接下来享受FoundKey带来的乐趣吧\U0001F680"
_2fa:
alreadyRegistered: "此设备已被注册"
registerDevice: "注册设备"
@ -915,6 +963,7 @@ _permissions:
"write:notes": "撰写或删除帖子"
"read:notifications": "查看通知"
"write:notifications": "管理通知"
"read:reactions": "查看回应"
"write:reactions": "回应操作"
"write:votes": "投票"
"read:pages": "查看页面"
@ -925,6 +974,10 @@ _permissions:
"write:user-groups": "操作用户组"
"read:channels": "查看频道"
"write:channels": "管理频道"
"read:gallery": "浏览图库"
"write:gallery": "操作图库"
"read:gallery-likes": "读取喜欢的图片"
"write:gallery-likes": "操作喜欢的图片"
_auth:
shareAccess: "您要授权允许“{name}”访问您的帐户吗?"
shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?"

View File

@ -30,6 +30,9 @@ signup: "註冊"
save: "儲存"
users: "使用者"
addUser: "新增使用者"
favorite: "我的最愛"
favorites: "我的最愛"
unfavorite: "從我的最愛中移除"
pin: "置頂"
unpin: "取消置頂"
copyContent: "複製內容"
@ -54,7 +57,7 @@ import: "匯入"
export: "匯出"
files: "檔案"
download: "下載"
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。"
driveFileDeleteConfirm: "確定要刪除檔案「{name}」嗎?使用此附件的貼文也會跟著消失。\n"
unfollowConfirm: "確定要取消追隨{name}嗎?"
exportRequested: "已請求匯出。這可能會花一點時間。結束後檔案將會被放到雲端裡。"
importRequested: "已請求匯入。這可能會花一點時間"
@ -211,6 +214,7 @@ uploadFromUrl: "從網址上傳"
uploadFromUrlDescription: "您要上傳的文件的URL"
uploadFromUrlRequested: "已請求上傳"
uploadFromUrlMayTakeTime: "還需要一些時間才能完成上傳。"
explore: "探索"
messageRead: "已讀"
noMoreHistory: "沒有更多歷史紀錄"
startMessaging: "開始傳送訊息"
@ -245,9 +249,11 @@ createFolder: "新增資料夾"
renameFolder: "重新命名資料夾"
deleteFolder: "刪除資料夾"
addFile: "加入附件"
emptyDrive: "雲端硬碟為空"
emptyFolder: "資料夾為空"
unableToDelete: "無法刪除"
inputNewFileName: "輸入檔案名稱"
inputNewDescription: "請輸入新標題"
inputNewDescription: "請輸入新標題 "
inputNewFolderName: "輸入新資料夾的名稱"
circularReferenceFolder: "目標文件夾是您要移動的文件夾的子文件夾。"
hasChildFilesOrFolders: "此文件夾不是空的,無法刪除。"
@ -288,7 +294,9 @@ driveCapacityPerRemoteAccount: "每個非本地用戶的雲端容量"
inMb: "以Mbps為單位"
iconUrl: "圖像URL"
bannerUrl: "橫幅圖像URL"
backgroundImageUrl: "背景圖片的來源網址"
backgroundImageUrl: "背景圖片的來源網址 "
pinnedUsers: "置頂用戶"
pinnedUsersDescription: "在「發現」頁面中使用換行標記想要置頂的使用者。"
hcaptchaSiteKey: "網站金鑰"
hcaptchaSecretKey: "金鑰"
recaptchaSiteKey: "網站金鑰"
@ -312,6 +320,11 @@ silence: "禁言"
silenceConfirm: "確定要禁言此用戶嗎?"
unsilence: "解除禁言"
unsilenceConfirm: "確定要解除禁言嗎?"
popularUsers: "熱門使用者"
recentlyUpdatedUsers: "最近發文的使用者"
recentlyRegisteredUsers: "新加入使用者"
recentlyDiscoveredUsers: "最近發現的使用者"
popularTags: "熱門標籤"
userList: "清單"
aboutMisskey: "關於 FoundKey"
administrator: "管理員"
@ -352,6 +365,7 @@ messagingWithGroup: "發送訊息至群組"
title: "標題"
text: "文字"
enable: "啟用"
next: "下一步"
retype: "重新輸入"
noteOf: "{user}的貼文"
inviteToGroup: "邀請至群組"
@ -405,7 +419,7 @@ useObjectStorage: "使用Object Storage"
objectStorageBaseUrl: "Base URL"
objectStorageBaseUrlDesc: "引用時的URL。如果您使用的是CDN或反向代理请指定其URL例如S3“https://<bucket>.s3.amazonaws.com”GCS“https://storage.googleapis.com/<bucket>”"
objectStorageBucket: "儲存空間Bucket"
objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。"
objectStorageBucketDesc: "請指定您正在使用的服務的存儲桶名稱。 "
objectStoragePrefix: "前綴"
objectStoragePrefixDesc: "它存儲在此前綴目錄下。"
objectStorageEndpoint: "端點Endpoint"
@ -465,7 +479,7 @@ enablePlayer: "打開播放器"
disablePlayer: "關閉播放器"
themeEditor: "主題編輯器"
description: "描述"
describeFile: "添加標題"
describeFile: "添加標題 "
author: "作者"
leaveConfirm: "有未保存的更改。要放棄嗎?"
manage: "管理"
@ -525,6 +539,7 @@ abuseReports: "檢舉"
reportAbuse: "檢舉"
reportAbuseOf: "檢舉{name}"
fillAbuseReportDescription: "請填寫檢舉的詳細理由。"
abuseReported: "回報已送出。感謝您的報告。"
reporter: "檢舉者"
reporteeOrigin: "檢舉來源"
reporterOrigin: "檢舉者來源"
@ -569,6 +584,7 @@ loadRawImages: "以原始圖檔顯示附件圖檔的縮圖"
disableShowingAnimatedImages: "不播放動態圖檔"
verificationEmailSent: "已發送驗證電子郵件。請點擊進入電子郵件中的鏈接完成驗證。"
emailVerified: "已成功驗證您的電郵"
noteFavoritesCount: "我的最愛貼文的數目"
pageLikesCount: "頁面被按讚次數"
pageLikedCount: "頁面被按讚次數"
contact: "聯絡人"
@ -602,6 +618,7 @@ editCode: "編輯代碼"
apply: "套用"
receiveAnnouncementFromInstance: "接收由本實例發出的電郵通知"
emailNotification: "郵件通知"
publish: "發佈"
useReactionPickerForContextMenu: "點擊右鍵開啟回應工具欄"
typingUsers: "{users}輸入中..."
jumpToSpecifiedDate: "跳轉到特定日期"
@ -637,7 +654,10 @@ switch: "切換"
noMaintainerInformationWarning: "尚未設定管理員信息。"
noBotProtectionWarning: "尚未設定Bot防護。"
configure: "設定"
postToGallery: "發佈到相簿"
gallery: "相簿"
recentPosts: "最新貼文"
popularPosts: "熱門的貼文"
shareWithNote: "在貼文中分享"
emailNotConfiguredWarning: "沒有設定電子郵件地址"
ratio: "%"
@ -726,8 +746,13 @@ _accountDelete:
inProgress: "正在刪除"
_forgotPassword:
enterEmail: "請輸入您的帳戶註冊的電子郵件地址。 密碼重置連結將被發送到該電子郵件地址。"
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。"
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。"
ifNoEmail: "如果您還沒有註冊您的電子郵件地址,請聯繫管理員。 "
contactAdmin: "此實例不支持電子郵件,請聯繫您的管理員重置您的密碼。 "
_gallery:
my: "我的貼文"
liked: "喜歡的貼文"
like: "讚"
unlike: "收回喜歡"
_email:
_follow:
title: "您有新的追隨者"
@ -761,7 +786,7 @@ _mfm:
url: "URL"
urlDescription: "可以展示URL位址。"
link: "鏈接"
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。"
linkDescription: "您可以將特定範圍的文章與 URL 相關聯。 "
bold: "粗體"
boldDescription: "可以將文字顯示为粗體来強調。"
small: "縮小"
@ -779,7 +804,7 @@ _mfm:
quote: "引用"
quoteDescription: "可以用來表示引用的内容。"
emoji: "自訂表情符號"
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。"
emojiDescription: "您可以通過將自定義表情符號名稱括在冒號中來顯示自定義表情符號。 "
search: "搜尋"
searchDescription: "您可以顯示所輸入的搜索框。"
flip: "翻轉"
@ -886,6 +911,29 @@ _time:
minute: "分鐘"
hour: "小時"
day: "日"
_tutorial:
title: "FoundKey使用方法"
step1_1: "歡迎!"
step1_2: "此為「時間軸」頁面,它會按照時間順序顯示你「追隨」的人發出的「貼文」"
step1_3: "由於你沒有發佈任何貼文,也沒有追隨任何人,所以你的時間軸目前是空的。"
step2_1: "在發文或追隨其他人之前先讓我們設定一下個人資料吧。"
step2_2: "提供一些關於自己的資訊來讓其他人更有追隨你的意願。"
step3_1: "個人資料都設定好了嗎?"
step3_2: "接下來,讓我們來試試看發個文,按一下畫面上的鉛筆圖示來開始"
step3_3: "輸入完內容後,按視窗右上角的按鈕來發文"
step3_4: "不知道該寫什麼內容嗎試試看「開始使用FoundKey了」如何。"
step4_1: "貼文發出去了嗎?"
step4_2: "如果你的貼文出現在時間軸上,就代表發文成功。"
step5_1: "現在試試看追隨其他人來讓你的時間軸變得更生動吧。"
step5_2: "你會在{featured}上看到受歡迎的貼文,你也可以從列表中追隨你喜歡的人,或者在{explore}上找到熱門使用者。"
step5_3: "想要追隨其他人,只要點擊他們的大頭貼並按「追隨」即可。"
step5_4: "如果使用者的名字旁有鎖頭的圖示,代表他們需要手動核准你的追隨請求。"
step6_1: "現在你可以在時間軸上看到其他用戶的貼文。"
step6_2: "你也可以對別人的貼文作出「情感」,作出簡單的回覆。"
step6_3: "在他人的貼文按下\"+\"圖標,即可選擇喜好的表情符號進行回應。"
step7_1: "以上為FoundKey的基本操作說明教學在此告一段落。辛苦了。"
step7_2: "歡迎到{help}來瞭解更多FoundKey相關介紹。"
step7_3: "那麼祝您在FoundKey玩的開心~ \U0001F680"
_2fa:
alreadyRegistered: "此設備已經被註冊過了"
registerDevice: "註冊裝置"
@ -914,6 +962,7 @@ _permissions:
"write:notes": "撰寫或刪除貼文"
"read:notifications": "查看通知"
"write:notifications": "編輯通知"
"read:reactions": "查看情感"
"write:reactions": "編輯情感"
"write:votes": "投票"
"read:pages": "顯示頁面"
@ -924,6 +973,10 @@ _permissions:
"write:user-groups": "編輯使用者群組"
"read:channels": "已查看的頻道"
"write:channels": "編輯頻道"
"read:gallery": "瀏覽圖庫"
"write:gallery": "操作圖庫"
"read:gallery-likes": "讀取喜歡的圖片"
"write:gallery-likes": "操作喜歡的圖片"
_auth:
shareAccess: "要授權「“{name}”」存取您的帳戶嗎?"
shareAccessAsk: "您確定要授權這個應用程式使用您的帳戶嗎?"
@ -962,7 +1015,7 @@ _widgets:
button: "按鈕"
onlineUsers: "線上的用戶"
jobQueue: "佇列"
serverMetric: "服務器指標"
serverMetric: "服務器指標 "
aiscript: "AiScript控制台"
aichan: "小藍"
_cw:
@ -978,7 +1031,7 @@ _poll:
expiration: "期限"
infinite: "無期限"
at: "結束時間"
after: "進度指定"
after: "進度指定 "
deadlineDate: "截止日期"
deadlineTime: "小時"
duration: "時長"
@ -994,7 +1047,7 @@ _poll:
remainingSeconds: "{s}秒後截止"
_visibility:
public: "公開"
publicDescription: "發布給所有用戶"
publicDescription: "發布給所有用戶 "
home: "首頁"
homeDescription: "僅發送至首頁的時間軸"
followers: "追隨者"

View File

@ -1 +0,0 @@
<svg width="1000" height="1000" viewBox="0 0 264.583 264.583" xml:space="preserve" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><defs><linearGradient id="a"><stop style="stop-color:#92191c;stop-opacity:1" offset="0"/><stop style="stop-color:#a11c38;stop-opacity:1" offset="1"/></linearGradient><linearGradient xlink:href="#a" id="b" gradientUnits="userSpaceOnUse" x1="100.048" y1="229.172" x2="97.548" y2="233.865"/></defs><path style="opacity:1;fill:url(#b);fill-opacity:1;stroke-width:1.47155;stroke-linecap:round;stroke-linejoin:round" d="M98.99 228.83a7.578 7.578 0 0 1-1.807-.246c.031.156.115.316.2.451.07.11.186.195.284.28a2 2 0 0 0-.185 1.383.853.853 0 0 0-.49.283.93.93 0 0 0-.214.532c-.014.194.029.39.113.566.087.181.22.342.388.452.168.11.372.167.572.149a.829.829 0 0 0 .424-.165c.425.21.942.225 1.378.039.402-.172.729-.51.887-.917l.478-.203a.626.626 0 0 0 .13-.069.276.276 0 0 0 .092-.114.267.267 0 0 0 .014-.146.562.562 0 0 0-.049-.14l-.1-.22a.664.664 0 0 0 .066-.035.405.405 0 0 0 .092-.07.25.25 0 0 0 .058-.1.24.24 0 0 0 .004-.114.467.467 0 0 0-.04-.108l-.171-.374a.545.545 0 0 0-.069-.119.257.257 0 0 0-.11-.08.263.263 0 0 0-.135-.01.624.624 0 0 0-.13.043l-.203.085c-.024-.121-.041-.24-.091-.353-.044-.098-.055-.124-.117-.212a.928.928 0 0 0 .341-.27.974.974 0 0 0 .194-.438c-.633.195-1.264.243-1.805.24z" transform="translate(-5365.976 -12670.019) scale(55.51197)"/><path style="opacity:1;fill:#fff;fill-opacity:1;stroke-width:1.47155;stroke-linecap:round;stroke-linejoin:round" d="M100.778 230.08v.001c-.008 0-.013.002-.02.003a.29.29 0 0 0-.038.014l-1.987.872a.364.364 0 0 1-.108.36c-.046.04-.1.07-.16.087a.597.597 0 0 1-.18.024.795.795 0 0 1-.385-.105.83.83 0 0 1-.317-.325.517.517 0 0 0-.35.15.599.599 0 0 0-.164.393.85.85 0 0 0 .097.418.816.816 0 0 0 .326.354c.071.04.15.065.232.072a.5.5 0 0 0 .24-.036.56.56 0 0 0 .286-.304.69.69 0 0 0 .042-.387l1.236-.546.18.408a.37.37 0 0 0 .02.035c.007.01.018.02.029.025.012.006.026.007.039.006a.09.09 0 0 0 .037-.012l.268-.12a.199.199 0 0 0 .031-.018.063.063 0 0 0 .02-.03.062.062 0 0 0 0-.035c-.002-.012-.008-.022-.012-.033l-.186-.417.31-.135.19.444a.14.14 0 0 0 .019.033c.008.011.018.019.031.023a.07.07 0 0 0 .038 0 .154.154 0 0 0 .036-.012l.27-.118c.01-.005.022-.01.03-.018a.055.055 0 0 0 .018-.03.07.07 0 0 0-.001-.035.152.152 0 0 0-.013-.033l-.2-.436.25-.112.03-.015a.07.07 0 0 0 .022-.023.05.05 0 0 0 .007-.032c0-.01-.006-.02-.01-.03l-.128-.267c-.006-.012-.011-.024-.021-.034a.077.077 0 0 0-.054-.023zm-3.136 1.36h.01c.091 0 .183.07.23.171.061.135.024.285-.083.334-.107.048-.243-.022-.305-.157-.061-.135-.024-.284.082-.333a.206.206 0 0 1 .066-.015zM99.434 229.088a.552.552 0 0 0-.476.278.535.535 0 0 0-.514-.273.546.546 0 0 0-.494.53.625.625 0 0 0 .09.338c.06.101.146.187.244.252.198.13.44.176.676.177.244.002.496-.043.7-.178a.773.773 0 0 0 .248-.264c.06-.107.09-.23.08-.352a.559.559 0 0 0-.535-.508h-.019zm-.946.173a.4.4 0 0 1 .268.104c.077.07.125.173.129.277l-.267.006a.135.135 0 0 0-.032-.108.136.136 0 0 0-.103-.045.135.135 0 0 0-.1.048.136.136 0 0 0-.028.108l-.262.006c0-.1.04-.199.11-.27a.404.404 0 0 1 .284-.124zm.956 0a.4.4 0 0 1 .397.38l-.267.007a.135.135 0 0 0-.031-.108.137.137 0 0 0-.103-.045.135.135 0 0 0-.1.048.135.135 0 0 0-.029.108l-.261.006c0-.1.04-.199.109-.27a.404.404 0 0 1 .285-.124zm-.48.422.289.423-.262.225-.294-.203z" transform="translate(-5365.976 -12670.019) scale(55.51197)"/></svg>

Before

Width:  |  Height:  |  Size: 3.3 KiB

View File

@ -1,6 +1,6 @@
{
"name": "foundkey",
"version": "13.0.0-preview6",
"version": "13.0.0-preview3",
"repository": {
"type": "git",
"url": "https://akkoma.dev/FoundKeyGang/FoundKey.git"
@ -10,8 +10,7 @@
"packages/*"
],
"scripts": {
"build": "yarn workspaces foreach --topological run build && yarn run gulp",
"build-parallel": "yarn workspaces foreach --parallel --topological run build && yarn run gulp",
"build": "yarn workspaces foreach --parallel --topological run build && yarn run gulp",
"start": "yarn workspace backend run start",
"start:test": "yarn workspace backend run start:test",
"init": "yarn migrate",
@ -19,7 +18,7 @@
"migrateandstart": "yarn migrate && yarn start",
"gulp": "gulp build",
"watch": "yarn dev",
"dev": "node ./scripts/dev.mjs",
"dev": "node ./scripts/dev.js",
"lint": "yarn workspaces foreach run lint",
"cy:open": "cypress open --browser --e2e --config-file=cypress.config.ts",
"cy:run": "cypress run",
@ -27,8 +26,8 @@
"mocha": "yarn workspace backend run mocha",
"test": "yarn mocha",
"format": "gulp format",
"clean": "node ./scripts/clean.mjs",
"clean-all": "node ./scripts/clean-all.mjs",
"clean": "node ./scripts/clean.js",
"clean-all": "node ./scripts/clean-all.js",
"cleanall": "yarn clean-all"
},
"resolutions": {
@ -53,5 +52,5 @@
"start-server-and-test": "1.14.0",
"typescript": "^4.9.4"
},
"packageManager": "yarn@3.4.1"
"packageManager": "yarn@3.3.0"
}

View File

@ -6,11 +6,7 @@ module.exports = {
extends: [
'../shared/.eslintrc.js',
],
plugins: [
'foundkey-custom-rules',
],
rules: {
'foundkey-custom-rules/typeorm-prefer-count': 'error',
'import/order': ['warn', {
'groups': ['builtin', 'external', 'internal', 'parent', 'sibling', 'index', 'object', 'type'],
'pathGroups': [

View File

@ -1,6 +1,8 @@
{
"extension": ["ts","js","cjs","mjs"],
"node-option": [
"experimental-specifier-resolution=node"
"experimental-specifier-resolution=node",
"loader=./test/loader.js"
],
"slow": 1000,
"timeout": 30000,

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 9.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 66 KiB

After

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 9.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 106 KiB

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 23 KiB

View File

@ -7,14 +7,6 @@ export class removeMentionedRemoteUsersColumn1661376843000 {
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "note" ADD "mentionedRemoteUsers" TEXT NOT NULL DEFAULT '[]'::text`);
await queryRunner.query(`CREATE TEMP TABLE IF NOT EXISTS "temp_mentions" AS
SELECT "id", "url", "uri", "username", "host"
FROM "user"
JOIN "user_profile" ON "user"."id" = "user_profile". "userId" WHERE "user"."host" IS NOT NULL`);
await queryRunner.query(`CREATE UNIQUE INDEX "temp_mentions_id" ON "temp_mentions"("id")`);
await queryRunner.query(`UPDATE "note" SET "mentionedRemoteUsers" = (
SELECT COALESCE(json_agg(row_to_json("data")::jsonb - 'id')::text, '[]') FROM "temp_mentions" AS "data"
WHERE "data"."id" = ANY("note"."mentions")
)`);
await queryRunner.query(`UPDATE "note" SET "mentionedRemoteUsers" = (SELECT COALESCE(json_agg(row_to_json("data"))::text, '[]') FROM (SELECT "url", "uri", "username", "host" FROM "user" JOIN "user_profile" ON "user"."id" = "user_profile". "userId" WHERE "user"."host" IS NOT NULL AND "user"."id" = ANY("note"."mentions")) AS "data")`);
}
}

View File

@ -1,53 +0,0 @@
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

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

View File

@ -1,21 +0,0 @@
export class removeReversi1672607891750 {
name = 'removeReversi1672607891750';
async up(queryRunner) {
await queryRunner.query(`DROP TABLE "reversi_matching"`);
await queryRunner.query(`DROP TABLE "reversi_game"`);
}
async down(queryRunner) {
await queryRunner.query(`CREATE TABLE "reversi_game" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "startedAt" TIMESTAMP WITH TIME ZONE, "user1Id" character varying(32) NOT NULL, "user2Id" character varying(32) NOT NULL, "user1Accepted" boolean NOT NULL DEFAULT false, "user2Accepted" boolean NOT NULL DEFAULT false, "black" integer, "isStarted" boolean NOT NULL DEFAULT false, "isEnded" boolean NOT NULL DEFAULT false, "winnerId" character varying(32), "surrendered" character varying(32), "logs" jsonb NOT NULL DEFAULT '[]', "map" character varying(64) array NOT NULL, "bw" character varying(32) NOT NULL, "isLlotheo" boolean NOT NULL DEFAULT false, "canPutEverywhere" boolean NOT NULL DEFAULT false, "loopedBoard" boolean NOT NULL DEFAULT false, "form1" jsonb DEFAULT null, "form2" jsonb DEFAULT null, "crc32" character varying(32), CONSTRAINT "PK_76b30eeba71b1193ad7c5311c3f" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_b46ec40746efceac604142be1c" ON "reversi_game" ("createdAt")`);
await queryRunner.query(`CREATE TABLE "reversi_matching" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "parentId" character varying(32) NOT NULL, "childId" character varying(32) NOT NULL, CONSTRAINT "PK_880bd0afbab232f21c8b9d146cf" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_b604d92d6c7aec38627f6eaf16" ON "reversi_matching" ("createdAt")`);
await queryRunner.query(`CREATE INDEX "IDX_3b25402709dd9882048c2bbade" ON "reversi_matching" ("parentId")`);
await queryRunner.query(`CREATE INDEX "IDX_e247b23a3c9b45f89ec1299d06" ON "reversi_matching" ("childId")`);
await queryRunner.query(`ALTER TABLE "reversi_game" ADD CONSTRAINT "FK_f7467510c60a45ce5aca6292743" FOREIGN KEY ("user1Id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "reversi_game" ADD CONSTRAINT "FK_6649a4e8c5d5cf32fb03b5da9f6" FOREIGN KEY ("user2Id") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "reversi_matching" ADD CONSTRAINT "FK_3b25402709dd9882048c2bbade0" FOREIGN KEY ("parentId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "reversi_matching" ADD CONSTRAINT "FK_e247b23a3c9b45f89ec1299d066" FOREIGN KEY ("childId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
}

View File

@ -1,23 +0,0 @@
export class removeUserGroupInvite1672991292018 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user_group_invite" DROP CONSTRAINT "FK_e10924607d058004304611a436a"`);
await queryRunner.query(`ALTER TABLE "user_group_invite" DROP CONSTRAINT "FK_1039988afa3bf991185b277fe03"`);
await queryRunner.query(`DROP INDEX "IDX_d9ecaed8c6dc43f3592c229282"`);
await queryRunner.query(`DROP INDEX "IDX_78787741f9010886796f2320a4"`);
await queryRunner.query(`DROP INDEX "IDX_e10924607d058004304611a436"`);
await queryRunner.query(`DROP INDEX "IDX_1039988afa3bf991185b277fe0"`);
await queryRunner.query(`DROP TABLE "user_group_invite"`);
}
async down(queryRunner) {
await queryRunner.query(`CREATE TABLE "user_group_invite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "userGroupId" character varying(32) NOT NULL, CONSTRAINT "PK_3893884af0d3a5f4d01e7921a97" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_1039988afa3bf991185b277fe0" ON "user_group_invite" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_e10924607d058004304611a436" ON "user_group_invite" ("userGroupId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_78787741f9010886796f2320a4" ON "user_group_invite" ("userId", "userGroupId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d9ecaed8c6dc43f3592c229282" ON "user_group_joining" ("userId", "userGroupId") `);
await queryRunner.query(`ALTER TABLE "user_group_invite" ADD CONSTRAINT "FK_1039988afa3bf991185b277fe03" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "user_group_invite" ADD CONSTRAINT "FK_e10924607d058004304611a436a" FOREIGN KEY ("userGroupId") REFERENCES "user_group"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
}

View File

@ -1,18 +0,0 @@
export class deletionProgress1673201544000 {
name = 'deletionProgress1673201544000';
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "user" RENAME COLUMN "isDeleted" TO "isDeletedOld"`);
await queryRunner.query(`ALTER TABLE "user" ADD "isDeleted" integer`);
await queryRunner.query(`UPDATE "user" SET "isDeleted" = CASE WHEN "host" IS NULL THEN -1 ELSE 0 END WHERE "isDeletedOld"`);
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isDeletedOld"`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "user" RENAME COLUMN "isDeleted" TO "isDeletedOld"`);
await queryRunner.query(`ALTER TABLE "user" ADD "isDeleted" boolean NOT NULL DEFAULT false`);
await queryRunner.query(`UPDATE "user" SET "isDeleted" = "isDeletedOld" IS NOT NULL`);
await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "isDeletedOld"`);
}
}

View File

@ -1,65 +0,0 @@
import { genId } from '../built/misc/gen-id.js';
export class removeGroups1673892262930 {
name = 'removeGroups1673892262930';
async up(queryRunner) {
// migrate gallery posts into notes, keeping the ids
await queryRunner.query(`
INSERT INTO "note" (
"id", "createdAt", "text", "cw", "userId", "visibility", "fileIds", "attachedFileTypes", "tags"
)
WITH "file_types" ("id", "types") AS (
SELECT "gallery_post"."id", ARRAY_AGG("drive_file"."type")
FROM "gallery_post"
JOIN "drive_file" ON "drive_file"."id" = ANY("gallery_post"."fileIds")
GROUP BY "gallery_post"."id"
)
SELECT "gallery_post"."id", "gallery_post"."createdAt",
CASE
WHEN "gallery_post"."title" IS NULL THEN "gallery_post"."description"
ELSE '<b>' || "gallery_post"."title" || E'</b>\\n\\n' || "gallery_post"."description"
END,
CASE
WHEN "gallery_post"."isSensitive" THEN 'NSFW'
ELSE NULL
END,
"gallery_post"."userId", 'home', "gallery_post"."fileIds", "file_types"."types", "gallery_post"."tags"
FROM "gallery_post"
JOIN "file_types" ON "gallery_post"."id" = "file_types"."id"
`);
// make a clip for each users gallery
await queryRunner.query(`SELECT DISTINCT "userId" FROM "gallery_post"`).then(userIds =>
Promise.all(userIds.map(({ userId }) => {
const clipId = genId();
// generate the clip itself
return queryRunner.query(`INSERT INTO "clip" ("id", "createdAt", "userId", "name", "isPublic") VALUES ($1, now(), $2, 'Gallery', true)`, [clipId, userId])
// and add all the previous gallery posts to it
// to not have to use genId for each gallery post, we just prepend a zero, something that could never be generated by genId
.then(() => queryRunner.query(`INSERT INTO "clip_note" ("id", "noteId", "clipId") SELECT '0' || "id", "id", $1 FROM "gallery_post" WHERE "userId" = $2`, [clipId, userId]));
}))
);
await queryRunner.query(`DROP TABLE "gallery_like"`);
await queryRunner.query(`DROP TABLE "gallery_post"`);
}
async down(queryRunner) {
// can only restore the table structure
await queryRunner.query(`CREATE TABLE "gallery_post" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "updatedAt" TIMESTAMP WITH TIME ZONE NOT NULL, "title" character varying(256) NOT NULL, "description" character varying(2048), "userId" character varying(32) NOT NULL, "fileIds" character varying(32) array NOT NULL DEFAULT '{}'::varchar[], "isSensitive" boolean NOT NULL DEFAULT false, "likedCount" integer NOT NULL DEFAULT '0', "tags" character varying(128) array NOT NULL DEFAULT '{}'::varchar[], CONSTRAINT "PK_8e90d7b6015f2c4518881b14753" PRIMARY KEY ("id")); COMMENT ON COLUMN "gallery_post"."createdAt" IS 'The created date of the GalleryPost.'; COMMENT ON COLUMN "gallery_post"."updatedAt" IS 'The updated date of the GalleryPost.'; COMMENT ON COLUMN "gallery_post"."userId" IS 'The ID of author.'; COMMENT ON COLUMN "gallery_post"."isSensitive" IS 'Whether the post is sensitive.'`);
await queryRunner.query(`CREATE INDEX "IDX_8f1a239bd077c8864a20c62c2c" ON "gallery_post" ("createdAt") `);
await queryRunner.query(`CREATE INDEX "IDX_f631d37835adb04792e361807c" ON "gallery_post" ("updatedAt") `);
await queryRunner.query(`CREATE INDEX "IDX_985b836dddd8615e432d7043dd" ON "gallery_post" ("userId") `);
await queryRunner.query(`CREATE INDEX "IDX_3ca50563facd913c425e7a89ee" ON "gallery_post" ("fileIds") `);
await queryRunner.query(`CREATE INDEX "IDX_f2d744d9a14d0dfb8b96cb7fc5" ON "gallery_post" ("isSensitive") `);
await queryRunner.query(`CREATE INDEX "IDX_1a165c68a49d08f11caffbd206" ON "gallery_post" ("likedCount") `);
await queryRunner.query(`CREATE INDEX "IDX_05cca34b985d1b8edc1d1e28df" ON "gallery_post" ("tags") `);
await queryRunner.query(`CREATE TABLE "gallery_like" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "postId" character varying(32) NOT NULL, CONSTRAINT "PK_853ab02be39b8de45cd720cc15f" PRIMARY KEY ("id"))`);
await queryRunner.query(`CREATE INDEX "IDX_8fd5215095473061855ceb948c" ON "gallery_like" ("userId") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_df1b5f4099e99fb0bc5eae53b6" ON "gallery_like" ("userId", "postId") `);
await queryRunner.query(`ALTER TABLE "gallery_post" ADD CONSTRAINT "FK_985b836dddd8615e432d7043ddb" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "gallery_like" ADD CONSTRAINT "FK_8fd5215095473061855ceb948cf" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
await queryRunner.query(`ALTER TABLE "gallery_like" ADD CONSTRAINT "FK_b1cb568bfe569e47b7051699fc8" FOREIGN KEY ("postId") REFERENCES "gallery_post"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
}
}

View File

@ -1,23 +0,0 @@
export class syncOrm1674499888924 {
name = 'syncOrm1674499888924'
async up(queryRunner) {
await queryRunner.query(`COMMENT ON COLUMN "user"."token" IS 'The native access token of local users, or null.'`);
await queryRunner.query(`ALTER TABLE "auth_session" DROP CONSTRAINT "UQ_8e001e5a101c6dca37df1a76d66"`);
// remove human readable URL from notes where it is duplicated, so the index can be added
await queryRunner.query(`UPDATE "note" SET "url" = NULL WHERE "url" IN (SELECT "url" FROM "note" GROUP BY "url" HAVING COUNT("url") > 1)`);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_71d35fceee0d0fa62b2fa8f3b2" ON "note" ("url") `);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_d9ecaed8c6dc43f3592c229282" ON "user_group_joining" ("userId", "userGroupId") `);
}
async down(queryRunner) {
await queryRunner.query(`DROP INDEX "public"."IDX_d9ecaed8c6dc43f3592c229282"`);
await queryRunner.query(`DROP INDEX "public"."IDX_71d35fceee0d0fa62b2fa8f3b2"`);
await queryRunner.query(`ALTER TABLE "auth_session" ADD CONSTRAINT "UQ_8e001e5a101c6dca37df1a76d66" UNIQUE ("accessTokenId")`);
await queryRunner.query(`COMMENT ON COLUMN "user"."token" IS 'The native access token of the User. It will be null if the origin of the user is local.'`);
}
}

View File

@ -1,19 +0,0 @@
export class registryRemoveDomain1675375940759 {
name = 'registryRemoveDomain1675375940759'
async up(queryRunner) {
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" ALTER COLUMN "key" TYPE text USING "key"::text`);
// delete existing duplicated entries, keeping the latest created one
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")`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "registry_item" DROP CONSTRAINT "UQ_b8d6509f847331273ab99daccc7"`);
await queryRunner.query(`ALTER TABLE "registry_item" ALTER COLUMN "key" TYPE character varying(1024) USING "key"::varchar(1024)`);
await queryRunner.query(`ALTER TABLE "registry_item" ADD "domain" character varying(512)`);
await queryRunner.query(`CREATE INDEX "IDX_0a72bdfcdb97c0eca11fe7ecad" ON "registry_item" ("domain") `);
}
}

View File

@ -1,13 +0,0 @@
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

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

View File

@ -1,21 +0,0 @@
export class ffVisibilityNobody1684536337602 {
name = 'ffVisibilityNobody1684536337602';
async up(queryRunner) {
await queryRunner.query(`ALTER TYPE "public"."user_profile_ffvisibility_enum" RENAME TO "user_profile_ffvisibility_enum_old"`);
await queryRunner.query(`CREATE TYPE "public"."user_profile_ffvisibility_enum" AS ENUM('public', 'followers', 'private', 'nobody')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "ffVisibility" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "ffVisibility" TYPE "public"."user_profile_ffvisibility_enum" USING "ffVisibility"::"text"::"public"."user_profile_ffvisibility_enum"`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "ffVisibility" SET DEFAULT 'public'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_ffvisibility_enum_old"`);
}
async down(queryRunner) {
await queryRunner.query(`CREATE TYPE "public"."user_profile_ffvisibility_enum_old" AS ENUM('public', 'followers', 'private')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "ffVisibility" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "ffVisibility" TYPE "public"."user_profile_ffvisibility_enum_old" USING "ffVisibility"::"text"::"public"."user_profile_ffvisibility_enum_old"`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "ffVisibility" SET DEFAULT 'public'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_ffvisibility_enum"`);
await queryRunner.query(`ALTER TYPE "public"."user_profile_ffvisibility_enum_old" RENAME TO "user_profile_ffvisibility_enum"`);
}
}

View File

@ -1,33 +0,0 @@
export class removeFavourites1685126322423 {
name = 'removeFavourites1685126322423';
async up(queryRunner) {
await queryRunner.query(`
WITH "new_clips" AS (
INSERT INTO "clip" ("id", "createdAt", "userId", "name")
SELECT
LEFT(MD5(RANDOM()::text), 10),
NOW(),
"userId",
'⭐'
FROM "note_favorite"
GROUP BY "userId"
RETURNING "id", "userId"
)
INSERT INTO "clip_note" ("id", "noteId", "clipId")
SELECT
"note_favorite"."id",
"noteId",
"new_clips"."id"
FROM "note_favorite"
JOIN "new_clips" ON "note_favorite"."userId" = "new_clips"."userId"
`);
await queryRunner.query(`DROP TABLE "note_favorite"`);
}
async down(queryRunner) {
// can't revert the migration to clips, can only recreate the database table
await queryRunner.query(`CREATE TABLE "note_favorite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "userId" character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, CONSTRAINT "PK_af0da35a60b9fa4463a62082b36" PRIMARY KEY ("id"))`);
}
}

View File

@ -1,34 +0,0 @@
export class noteEditing1685997617959 {
name = 'noteEditing1685997617959';
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "note" ADD "updatedAt" TIMESTAMP WITH TIME ZONE`);
await queryRunner.query(`COMMENT ON COLUMN "note"."updatedAt" IS 'The updated date of the Note.'`);
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum" RENAME TO "notification_type_enum_old"`);
await queryRunner.query(`CREATE TYPE "public"."notification_type_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'move', 'app', 'updated')`);
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum" USING "type"::"text"::"public"."notification_type_enum"`);
await queryRunner.query(`DROP TYPE "public"."notification_type_enum_old"`);
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum" RENAME TO "user_profile_mutingnotificationtypes_enum_old"`);
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'move', 'app', 'updated')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum"[]`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum_old"`);
}
async down(queryRunner) {
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum_old" AS ENUM('move', 'follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app', 'pollEnded')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum_old"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum_old"[]`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum"`);
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum_old" RENAME TO "user_profile_mutingnotificationtypes_enum"`);
await queryRunner.query(`CREATE TYPE "public"."notification_type_enum_old" AS ENUM('move', 'follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum_old" USING "type"::"text"::"public"."notification_type_enum_old"`);
await queryRunner.query(`DROP TYPE "public"."notification_type_enum"`);
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum_old" RENAME TO "notification_type_enum"`);
await queryRunner.query(`ALTER TABLE "note" DROP COLUMN "updatedAt"`);
}
}

View File

@ -1,43 +0,0 @@
export class syncDatabase1689005520053 {
name = 'syncDatabase1689005520053';
async up(queryRunner) {
await queryRunner.query(`COMMENT ON COLUMN "user"."isDeleted" IS 'How many delivery jobs are outstanding before the deletion is completed.'`);
await queryRunner.query(`ALTER TYPE "public"."note_thread_muting_mutingnotificationtypes_enum" RENAME TO "note_thread_muting_mutingnotificationtypes_enum_old"`);
await queryRunner.query(`CREATE TYPE "public"."note_thread_muting_mutingnotificationtypes_enum" AS ENUM('mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'update')`);
await queryRunner.query(`ALTER TABLE "note_thread_muting" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "note_thread_muting" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."note_thread_muting_mutingnotificationtypes_enum"[] USING "mutingNotificationTypes"::"text"::"public"."note_thread_muting_mutingnotificationtypes_enum"[]`);
await queryRunner.query(`ALTER TABLE "note_thread_muting" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."note_thread_muting_mutingnotificationtypes_enum_old"`);
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum" RENAME TO "notification_type_enum_old"`);
await queryRunner.query(`CREATE TYPE "public"."notification_type_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'update', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'move', 'app')`);
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum" USING "type"::"text"::"public"."notification_type_enum"`);
await queryRunner.query(`DROP TYPE "public"."notification_type_enum_old"`);
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum" RENAME TO "user_profile_mutingnotificationtypes_enum_old"`);
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'update', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'move', 'app')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum"[]`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum_old"`);
}
async down(queryRunner) {
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'move', 'app', 'updated')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum_old"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum_old"[]`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum"`);
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum_old" RENAME TO "user_profile_mutingnotificationtypes_enum"`);
await queryRunner.query(`CREATE TYPE "public"."notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'move', 'app', 'updated')`);
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum_old" USING "type"::"text"::"public"."notification_type_enum_old"`);
await queryRunner.query(`DROP TYPE "public"."notification_type_enum"`);
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum_old" RENAME TO "notification_type_enum"`);
await queryRunner.query(`CREATE TYPE "public"."note_thread_muting_mutingnotificationtypes_enum_old" AS ENUM('mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded')`);
await queryRunner.query(`ALTER TABLE "note_thread_muting" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "note_thread_muting" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."note_thread_muting_mutingnotificationtypes_enum_old"[] USING "mutingNotificationTypes"::"text"::"public"."note_thread_muting_mutingnotificationtypes_enum_old"[]`);
await queryRunner.query(`ALTER TABLE "note_thread_muting" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."note_thread_muting_mutingnotificationtypes_enum"`);
await queryRunner.query(`ALTER TYPE "public"."note_thread_muting_mutingnotificationtypes_enum_old" RENAME TO "note_thread_muting_mutingnotificationtypes_enum"`);
await queryRunner.query(`COMMENT ON COLUMN "user"."isDeleted" IS NULL`);
}
}

View File

@ -1,10 +0,0 @@
export class removePinnedUsers1704234742539 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" DROP COLUMN "pinnedUsers"`);
}
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "meta" ADD "pinnedUsers" character varying(256) array NOT NULL DEFAULT '{}'::varchar[]`);
}
}

View File

@ -1,10 +0,0 @@
export class removeNoteVisibility1704236065406 {
async up(queryRunner) {
await queryRunner.query(`ALTER TABLE "poll" DROP COLUMN "noteVisibility"`);
await queryRunner.query(`DROP TYPE "poll_notevisibility_enum"`);
}
async down(queryRunner) {
await queryRunner.query(`CREATE TYPE "poll_notevisibility_enum" AS ENUM('public', 'home', 'followers', 'specified')`);
await queryRunner.query(`ALTER TABLE "poll" ADD "noteVisibility" "poll_notevisibility_enum" NOT NULL`);
}
}

View File

@ -1,12 +0,0 @@
export class removeHashtagChart1710687673333 {
async up(queryRunner) {
await queryRunner.query(`DROP TABLE "__chart__hashtag"`);
await queryRunner.query(`DROP TABLE "__chart_day__hashtag"`);
}
async down(queryRunner) {
await queryRunner.query(`CREATE TABLE public.__chart__hashtag ("id" SERIAL NOT NULL CONSTRAINT "PK_c32f1ea2b44a5d2f7881e37f8f9" PRIMARY KEY,"date" integer NOT NULL,"group" character varying(128) NOT NULL,"___local_users" integer DEFAULT 0 NOT NULL,"___remote_users" integer DEFAULT 0 NOT NULL,"unique_temp___local_users" character varying[] DEFAULT '{}'::character varying[] NOT NULL,"unique_temp___remote_users" character varying[] DEFAULT '{}'::character varying[] NOT NULL,CONSTRAINT "UQ_25a97c02003338124b2b75fdbc8" UNIQUE ("date", "group"))`);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_25a97c02003338124b2b75fdbc" ON public.__chart__hashtag USING btree (date, "group")`);
await queryRunner.query(`CREATE TABLE public.__chart_day__hashtag ("id" SERIAL NOT NULL CONSTRAINT CONSTRAINT "PK_13d5a3b089344e5557f8e0980b4" PRIMARY KEY,"date" integer NOT NULL,"group" character varying(128) NOT NULL,"___local_users" integer DEFAULT 0 NOT NULL,"___remote_users" integer DEFAULT 0 NOT NULL,"unique_temp___local_users" character varying[] DEFAULT '{}'::character varying[] NOT NULL,"unique_temp___remote_users" character varying[] DEFAULT '{}'::character varying[] NOT NULL,CONSTRAINT "UQ_8f589cf056ff51f09d6096f6450" UNIQUE ("date", "group"))`);
await queryRunner.query(`CREATE UNIQUE INDEX "IDX_8f589cf056ff51f09d6096f645" ON public.__chart_day__hashtag USING btree (date, "group")`);
}
}

View File

@ -1,17 +1,17 @@
{
"name": "backend",
"version": "13.0.0-preview6",
"version": "13.0.0-preview3",
"main": "./index.js",
"private": true,
"type": "module",
"scripts": {
"build": "tsc -p tsconfig.json || echo done. && tsc-alias -p tsconfig.json",
"watch": "node watch.mjs",
"lint": "tsc --noEmit --skipLibCheck && eslint src --ext .ts",
"mocha": "NODE_ENV=test mocha",
"migrate": "yarn exec typeorm migration:run -d ormconfig.js",
"lint": "tsc --noEmit && eslint src --ext .ts",
"mocha": "cross-env NODE_ENV=test TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT=\"./test/tsconfig.json\" mocha",
"migrate": "npx typeorm migration:run -d ormconfig.js",
"start": "node --experimental-json-modules ./built/index.js",
"start:test": "NODE_ENV=test node --experimental-json-modules ./built/index.js",
"start:test": "cross-env NODE_ENV=test node --experimental-json-modules ./built/index.js",
"test": "npm run mocha"
},
"dependencies": {
@ -28,7 +28,6 @@
"abort-controller": "3.0.0",
"ajv": "8.11.0",
"archiver": "5.3.1",
"argon2": "^0.30.2",
"autobind-decorator": "2.4.0",
"aws-sdk": "2.1165.0",
"bcryptjs": "2.4.3",
@ -36,11 +35,12 @@
"bull": "4.8.4",
"cacheable-lookup": "6.0.4",
"cbor": "8.1.0",
"chalk": "5.0.1",
"chalk-template": "0.4.0",
"cli-highlight": "2.1.11",
"color-convert": "2.0.1",
"content-disposition": "0.5.4",
"date-fns": "2.28.0",
"decompress": "4.2.1",
"deep-email-validator": "0.1.21",
"escape-regexp": "0.0.1",
"feed": "4.2.2",
@ -51,7 +51,6 @@
"hpagent": "0.1.2",
"ioredis": "4.28.5",
"ip-cidr": "3.0.10",
"ipaddr.js": "2.1.0",
"is-svg": "4.3.2",
"js-yaml": "4.1.0",
"jsdom": "20.0.0",
@ -59,7 +58,6 @@
"json5-loader": "4.0.1",
"jsonld": "6.0.0",
"jsrsasign": "10.5.25",
"katex": "^0.16.0",
"koa": "2.13.4",
"koa-bodyparser": "4.3.0",
"koa-favicon": "2.1.0",
@ -69,9 +67,9 @@
"koa-send": "5.0.1",
"koa-slow": "2.1.0",
"koa-views": "7.0.2",
"mfm-js": "0.23.3",
"mfm-js": "0.22.1",
"mime-types": "2.1.35",
"mocha": "10.2.0",
"mocha": "10.0.0",
"multer": "1.4.5-lts.1",
"nested-property": "4.0.0",
"node-fetch": "3.2.6",
@ -79,6 +77,7 @@
"os-utils": "0.0.14",
"parse5": "7.0.0",
"pg": "8.7.3",
"private-ip": "2.3.3",
"probe-image-size": "7.2.3",
"promise-limit": "2.7.0",
"pug": "3.0.2",
@ -100,7 +99,8 @@
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
"style-loader": "3.3.1",
"summaly": "2.7.0",
"summaly": "2.6.0",
"syslog-pro": "1.0.0",
"systeminformation": "5.11.22",
"tinycolor2": "1.4.2",
"tmp": "0.2.1",
@ -110,8 +110,10 @@
"tsconfig-paths": "4.1.0",
"twemoji-parser": "14.0.0",
"typeorm": "0.3.7",
"unzipper": "0.10.11",
"uuid": "8.3.2",
"web-push": "3.5.0",
"websocket": "1.0.34",
"ws": "8.8.0",
"xev": "3.0.2"
},
@ -157,15 +159,17 @@
"@types/sinon": "^10.0.13",
"@types/sinonjs__fake-timers": "8.1.2",
"@types/speakeasy": "2.0.7",
"@types/syslog-pro": "^1.0.0",
"@types/tinycolor2": "1.4.3",
"@types/tmp": "0.2.3",
"@types/uuid": "8.3.4",
"@types/web-push": "3.3.2",
"@types/websocket": "1.0.5",
"@types/ws": "8.5.3",
"@typescript-eslint/eslint-plugin": "^5.46.1",
"@typescript-eslint/parser": "^5.46.1",
"cross-env": "7.0.3",
"eslint": "^8.29.0",
"eslint-plugin-foundkey-custom-rules": "file:../shared/custom-rules",
"eslint-plugin-import": "^2.26.0",
"execa": "6.1.0",
"form-data": "^4.0.0",

View File

@ -1,29 +1,24 @@
import cluster from 'node:cluster';
import chalk from 'chalk';
import Xev from 'xev';
import Logger from '@/services/logger.js';
import { envOption, LOG_LEVELS } from '@/env.js';
import { envOption } from '@/env.js';
// for typeorm
import 'reflect-metadata';
import { masterMain } from './master.js';
import { workerMain } from './worker.js';
const logger = new Logger('core');
const clusterLogger = logger.createSubLogger('cluster');
const logger = new Logger('core', 'cyan');
const clusterLogger = logger.createSubLogger('cluster', 'orange', false);
const ev = new Xev();
/**
* Init process
*/
export async function boot(): Promise<void> {
if (envOption.disableClustering) {
process.title = "Foundkey";
} else if (cluster.isPrimary) {
process.title = "Foundkey (master)";
} else if (cluster.isWorker) {
process.title = `Foundkey (${process.env.mode})`;
}
process.title = `FoundKey (${cluster.isPrimary ? 'master' : 'worker'})`;
if (cluster.isPrimary || envOption.disableClustering) {
await masterMain();
@ -56,8 +51,16 @@ cluster.on('online', worker => {
clusterLogger.debug(`Process is now online: [${worker.id}]`);
});
// Listen for dying workers
cluster.on('exit', worker => {
// Replace the dead worker,
// we're not sentimental
clusterLogger.error(chalk.red(`[${worker.id}] died :(`));
cluster.fork();
});
// Display detail of unhandled promise rejection
if (envOption.logLevel !== LOG_LEVELS.quiet) {
if (!envOption.quiet) {
process.on('unhandledRejection', console.dir);
}

View File

@ -3,13 +3,15 @@ import { fileURLToPath } from 'node:url';
import { dirname } from 'node:path';
import * as os from 'node:os';
import cluster from 'node:cluster';
import chalk from 'chalk';
import chalkTemplate from 'chalk-template';
import semver from 'semver';
import Logger from '@/services/logger.js';
import { loadConfig } from '@/config/load.js';
import loadConfig from '@/config/load.js';
import { Config } from '@/config/types.js';
import { showMachineInfo } from '@/misc/show-machine-info.js';
import { envOption, LOG_LEVELS } from '@/env.js';
import { envOption } from '@/env.js';
import { db, initDb } from '@/db/postgre.js';
const _filename = fileURLToPath(import.meta.url);
@ -17,27 +19,29 @@ const _dirname = dirname(_filename);
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../../built/meta.json`, 'utf-8'));
const logger = new Logger('core');
const bootLogger = logger.createSubLogger('boot');
const logger = new Logger('core', 'cyan');
const bootLogger = logger.createSubLogger('boot', 'magenta', false);
const themeColor = chalk.hex('#86b300');
function greet(): void {
if (envOption.logLevel !== LOG_LEVELS.quiet) {
if (!envOption.quiet) {
//#region FoundKey logo
console.log(' ___ _ _ __ ');
console.log(' | __|__ _ _ _ _ __| | |/ /___ _ _ ');
console.log(' | _/ _ \\ || | \' \\/ _` | \' </ -_) || |');
console.log(' |_|\\___/\\_,_|_||_\\__,_|_|\\_\\___|\\_, |');
console.log(' |__/ ');
console.log(themeColor(' ___ _ _ __ '));
console.log(themeColor(' | __|__ _ _ _ _ __| | |/ /___ _ _ '));
console.log(themeColor(' | _/ _ \\ || | \' \\/ _` | \' </ -_) || |'));
console.log(themeColor(' |_|\\___/\\_,_|_||_\\__,_|_|\\_\\___|\\_, |'));
console.log(themeColor(' |__/ '));
//#endregion
console.log(' FoundKey is an open-source decentralized microblogging platform.');
console.log('');
console.log(`--- ${os.hostname()} (PID: ${process.pid.toString()}) ---`);
console.log(chalkTemplate`--- ${os.hostname()} {gray (PID: ${process.pid.toString()})} ---`);
}
bootLogger.info('Welcome to FoundKey!');
bootLogger.info(`FoundKey v${meta.version}`);
bootLogger.info(`FoundKey v${meta.version}`, null, true);
}
/**
@ -55,7 +59,7 @@ export async function masterMain(): Promise<void> {
config = loadConfigBoot();
await connectDb();
} catch (e) {
bootLogger.error('Fatal error occurred during initialization');
bootLogger.error('Fatal error occurred during initialization', {}, true);
process.exit(1);
}
@ -65,7 +69,7 @@ export async function masterMain(): Promise<void> {
await spawnWorkers(config.clusterLimits);
}
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`);
bootLogger.succ(`Now listening on port ${config.port} on ${config.url}`, null, true);
if (!envOption.noDaemons) {
import('../daemons/server-stats.js').then(x => x.serverStats());
@ -80,7 +84,7 @@ function showEnvironment(): void {
if (env !== 'production') {
logger.warn('The environment is not in production mode.');
logger.warn('DO NOT USE FOR PRODUCTION PURPOSE!');
logger.warn('DO NOT USE FOR PRODUCTION PURPOSE!', {}, true);
}
}
@ -105,7 +109,7 @@ function loadConfigBoot(): Config {
} catch (exception) {
const e = exception as Partial<NodeJS.ErrnoException> | Error;
if ('code' in e && e.code === 'ENOENT') {
configLogger.error('Configuration file not found');
configLogger.error('Configuration file not found', {}, true);
process.exit(1);
} else if (e instanceof Error) {
configLogger.error(e.message);
@ -129,32 +133,23 @@ async function connectDb(): Promise<void> {
const v = await db.query('SHOW server_version').then(x => x[0].server_version);
dbLogger.succ(`Connected: v${v}`);
} catch (e) {
dbLogger.error('Cannot connect');
dbLogger.error('Cannot connect', {}, true);
dbLogger.error(e as Error | string);
process.exit(1);
}
}
async function spawnWorkers(clusterLimits: Required<Config['clusterLimits']>): Promise<void> {
const modes = ['web' as const, 'queue' as const];
const clusters = structuredClone(clusterLimits);
if (envOption.onlyQueue) {
clusters.web = 0;
} else if (envOption.onlyServer) {
clusters.queue = 0;
}
const modes = ['web', 'queue'];
const cpus = os.cpus().length;
for (const mode of modes.filter(mode => clusters[mode] > cpus)) {
for (const mode of modes.filter(mode => clusterLimits[mode] > cpus)) {
bootLogger.warn(`configuration warning: cluster limit for ${mode} exceeds number of cores (${cpus})`);
}
const total = modes.reduce((acc, mode) => acc + clusters[mode], 0);
const total = modes.reduce((acc, mode) => acc + clusterLimits[mode], 0);
const workers = new Array(total);
workers.fill('web', 0, clusters.web);
workers.fill('queue', clusters.web);
workers.fill('web', 0, clusterLimits.web);
workers.fill('queue', clusterLimits.web);
bootLogger.info(`Starting ${total} workers...`);
await Promise.all(workers.map(mode => spawnWorker(mode)));
@ -164,29 +159,13 @@ async function spawnWorkers(clusterLimits: Required<Config['clusterLimits']>): P
function spawnWorker(mode: 'web' | 'queue'): Promise<void> {
return new Promise(res => {
const worker = cluster.fork({ mode });
worker.on('exit', async (code, signal) => {
logger.error(mode + ' worker died, restarting...');
await spawnWorker(mode);
});
worker.on('message', message => {
switch (message) {
case 'listenFailed':
bootLogger.error('The server Listen failed due to the previous error.');
process.exit(1);
break;
case 'ready':
res();
break;
case 'metaUpdate':
// forward new instance metadata to all workers
for (const otherWorker of Object.values(cluster.workers)) {
// don't forward the message to the worker that sent it
if (worker.id === otherWorker.id) continue;
otherWorker.send(message);
}
break;
if (message === 'listenFailed') {
bootLogger.error('The server Listen failed due to the previous error.');
process.exit(1);
}
if (message !== 'ready') return;
res();
});
});
}

View File

@ -1,3 +1,3 @@
import { loadConfig } from './load.js';
import load from './load.js';
export default loadConfig();
export default load();

View File

@ -23,10 +23,10 @@ const path = process.env.NODE_ENV === 'test'
? `${dir}/test.yml`
: `${dir}/default.yml`;
export function loadConfig(): Config {
export default function load(): Config {
const meta = JSON.parse(fs.readFileSync(`${_dirname}/../../../../built/meta.json`, 'utf-8'));
const clientManifest = JSON.parse(fs.readFileSync(`${_dirname}/../../../../built/_client_dist_/manifest.json`, 'utf-8'));
let config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
const config = yaml.load(fs.readFileSync(path, 'utf-8')) as Source;
if (config.id && config.id !== 'aid') throw new Error('Unsupported ID algorithm. Only "aid" is supported.');
@ -38,31 +38,13 @@ export function loadConfig(): Config {
config.port = config.port || parseInt(process.env.PORT || '', 10);
// set default values
config.images = Object.assign({
info: '/twemoji/1f440.svg',
notFound: '/twemoji/2049.svg',
error: '/twemoji/1f480.svg',
}, config.images ?? {});
config.clusterLimits = Object.assign({
web: 1,
queue: 1,
}, config.clusterLimits ?? {});
config = Object.assign({
disableHsts: false,
deliverJobConcurrency: 128,
inboxJobConcurrency: 16,
deliverJobPerSec: -1,
inboxJobPerSec: 16,
deliverJobMaxAttempts: 12,
inboxJobMaxAttempts: 8,
proxyRemoteFiles: false,
maxFileSize: 262144000, // 250 MiB
maxNoteTextLength: 3000,
allowUnsignedFetches: false,
}, config);
if (!config.maxNoteTextLength) config.maxNoteTextLength = 3000;
mixin.version = meta.version;
mixin.host = url.host;
@ -78,8 +60,21 @@ export function loadConfig(): Config {
if (!config.redis.prefix) config.redis.prefix = mixin.host;
if (config.clusterLimits.web < 1 || config.clusterLimits.queue < 1) {
throw new Error('invalid cluster limits');
if (!config.clusterLimits) {
config.clusterLimits = {
web: 1,
queue: 1,
};
} else {
config.clusterLimits = {
web: 1,
queue: 1,
...config.clusterLimits,
};
if (config.clusterLimits.web < 1 || config.clusterLimits.queue < 1) {
throw new Error('invalid cluster limits');
}
}
return Object.assign(config, mixin);

View File

@ -1,7 +1,7 @@
import Logger from '@/services/logger.js';
import config from './index.js';
const logger = new Logger('config:redis');
const logger = new Logger('config:redis', 'gray', false);
function getRedisFamily(family?: string | number): number {
const familyMap = {

View File

@ -59,6 +59,11 @@ export type Source = {
deliverJobMaxAttempts?: number;
inboxJobMaxAttempts?: number;
syslog?: {
host: string;
port: number;
};
mediaProxy?: string;
proxyRemoteFiles?: boolean;
internalStoragePath?: string;
@ -68,8 +73,6 @@ export type Source = {
notFound?: string;
error?: string;
};
allowUnsignedFetches?: boolean;
};
/**

View File

@ -33,6 +33,7 @@ import { UserGroup } from '@/models/entities/user-group.js';
import { UserGroupJoining } from '@/models/entities/user-group-joining.js';
import { UserGroupInvitation } from '@/models/entities/user-group-invitation.js';
import { Hashtag } from '@/models/entities/hashtag.js';
import { NoteFavorite } from '@/models/entities/note-favorite.js';
import { AbuseUserReport } from '@/models/entities/abuse-user-report.js';
import { RegistrationTicket } from '@/models/entities/registration-tickets.js';
import { MessagingMessage } from '@/models/entities/messaging-message.js';
@ -49,6 +50,8 @@ import { UserSecurityKey } from '@/models/entities/user-security-key.js';
import { AttestationChallenge } from '@/models/entities/attestation-challenge.js';
import { Page } from '@/models/entities/page.js';
import { PageLike } from '@/models/entities/page-like.js';
import { GalleryPost } from '@/models/entities/gallery-post.js';
import { GalleryLike } from '@/models/entities/gallery-like.js';
import { ModerationLog } from '@/models/entities/moderation-log.js';
import { UsedUsername } from '@/models/entities/used-username.js';
import { Announcement } from '@/models/entities/announcement.js';
@ -72,7 +75,7 @@ import { getRedisOptions } from '@/config/redis.js';
import { dbLogger } from './logger.js';
import { redisClient } from './redis.js';
const sqlLogger = dbLogger.createSubLogger('sql');
const sqlLogger = dbLogger.createSubLogger('sql', 'gray', false);
class MyCustomLogger implements Logger {
private highlight(sql: string): string {
@ -133,12 +136,15 @@ export const entities = [
RenoteMuting,
Blocking,
Note,
NoteFavorite,
NoteReaction,
NoteWatching,
NoteThreadMuting,
NoteUnread,
Page,
PageLike,
GalleryPost,
GalleryLike,
DriveFile,
DriveFolder,
Poll,

View File

@ -1,40 +1,20 @@
export const LOG_LEVELS = {
quiet: 6,
error: 5,
warning: 4,
success: 3,
info: 2,
debug: 1,
};
export const envOption = {
const envOption = {
onlyQueue: false,
onlyServer: false,
noDaemons: false,
disableClustering: false,
verbose: false,
withLogTime: false,
quiet: false,
slow: false,
logLevel: LOG_LEVELS.info,
};
for (const key of Object.keys(envOption) as (keyof typeof envOption)[]) {
const value = process.env['FK_' + key.replace(/[A-Z]/g, letter => `_${letter}`).toUpperCase()];
if (value) {
if (key === 'logLevel') {
if (value.toLowerCase() in LOG_LEVELS) {
envOption.logLevel = LOG_LEVELS[value.toLowerCase()];
}
else {
console.log('Unknown log level ' + JSON.stringify(value.toLowerCase()) + ', defaulting to "info"');
}
} else {
envOption[key] = true;
}
}
if (process.env['MK_' + key.replace(/[A-Z]/g, letter => `_${letter}`).toUpperCase()]) envOption[key] = true;
}
if (process.env.NODE_ENV === 'test') {
envOption.disableClustering = true;
envOption.logLevel = LOG_LEVELS.quiet;
envOption.noDaemons = true;
}
if (process.env.NODE_ENV === 'test') envOption.disableClustering = true;
if (process.env.NODE_ENV === 'test') envOption.quiet = true;
if (process.env.NODE_ENV === 'test') envOption.noDaemons = true;
export { envOption };

View File

@ -68,16 +68,14 @@ export function fromHtml(html: string, quoteUri?: string | null): string {
case 'a':
{
// trim spaces away, because some AP servers (app.wafrn.net) send strange
// zero width non-break space in strange places and things like that
const txt = getText(node).trim();
const txt = getText(node);
const href = getAttr(node, 'href');
// hashtags
if (txt.startsWith('#') && href && (attrHas(node, 'rel', 'tag') || attrHas(node, 'class', 'hashtag'))) {
text += txt;
// mentions: a link that starts with `@` and does not include space
} else if (txt.startsWith('@') && txt.match(/\s/) == null && !attrHas(node, 'rel', 'me')) {
// mentions
} else if (txt.startsWith('@') && !attrHas(node, 'rel', 'me')) {
const part = txt.split('@');
if (part.length === 2 && href) {
@ -178,53 +176,6 @@ export function fromHtml(html: string, quoteUri?: string | null): string {
break;
}
// inline or block KaTeX
case 'math': {
// This node should contain <semantics>[...]<annotation/>[...]</semantics> tag with the "source code".
if (node.childNodes.length !== 1 || node.childNodes[0].nodeName !== 'semantics')
break;
const semantics = node.childNodes[0];
// only select well formed annotations
const annotations = semantics.childNodes
.filter(node =>
node.nodeName === 'annotation'
&& node.childNodes.length === 1
&& node.childNodes[0].nodeName === '#text'
);
if (annotations.length === 0)
break;
let annotation = annotations[0];
// try to prefer a TeX annotation if there are multiple annotations
const filteredAnnotations = annotations.filter(node => node.attrs.some(attribute => attribute.name === 'encoding' && attribute.value === 'application/x-tex'));
if (filteredAnnotations.length > 0) {
annotation = filteredAnnotations[0];
}
const formula = annotation.childNodes[0].value;
if (annotation.attrs.some(attribute => attribute.name === 'encoding' && attribute.value === 'application/x-tex')) {
// can be rendered as KaTeX, now decide if it is possible to render as inline or not
if (/[\r\n]/.test(formula)) {
// line break, this must be rendered as a block
text += '\n\\[' + formula + '\\]\n';
} else {
// render as inline
text += '\\(' + formula + '\\)';
}
} else {
// not KaTeX, but if there is a plaintext annotation it can still be rendered as code
if (/[\r\n]/.test(formula)) {
// line break, this must be rendered as a block
text += '\n```\n' + formula + '\n```\n';
} else {
// render as inline
text += '`' + formula + '`';
}
}
break;
}
case 'blockquote': {
const t = getText(node);
if (t) {

View File

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

View File

@ -0,0 +1,35 @@
export const kinds = [
'read:account',
'write:account',
'read:blocks',
'write:blocks',
'read:drive',
'write:drive',
'read:favorites',
'write:favorites',
'read:following',
'write:following',
'read:messaging',
'write:messaging',
'read:mutes',
'write:mutes',
'write:notes',
'read:notifications',
'write:notifications',
'read:reactions',
'write:reactions',
'write:votes',
'read:pages',
'write:pages',
'write:page-likes',
'read:page-likes',
'read:user-groups',
'write:user-groups',
'read:channels',
'write:channels',
'read:gallery',
'write:gallery',
'read:gallery-likes',
'write:gallery-likes',
];
// IF YOU ADD KINDS(PERMISSIONS), YOU MUST ADD TRANSLATIONS (under _permissions).

View File

@ -8,7 +8,10 @@ import { SECOND } from '@/const.js';
*/
const retryDelay = 100;
const lock: (key: string, timeout?: number) => Promise<() => void> = promisify(redisLock(redisClient, retryDelay));
const lock: (key: string, timeout?: number) => Promise<() => void>
= redisClient
? promisify(redisLock(redisClient, retryDelay))
: async () => () => { };
/**
* Get AP Object lock

View File

@ -1,23 +1,12 @@
export class Cache<T> {
// The actual "database" that holds the cache entries, along with their
// insertion time.
// Insertion order is the same as the order of elements expiring. This is
// important because the expiration logic relies on the insertion order.
public cache: Map<string, { date: number; value: T; }>;
// The lifetime of each cache member.
//
// This must not be changed after setup because it may upset
// the expiration logic.
private lifetime: number;
// Function of which the results should be cached.
public fetcher: (key: string) => Promise<T | undefined>;
private timeoutScheduled: boolean;
constructor(lifetime: number, fetcher: Cache<T>['fetcher']) {
this.cache = new Map();
this.lifetime = lifetime;
this.fetcher = fetcher;
this.timeoutScheduled = false;
}
public set(key: string, value: T): void {
@ -25,36 +14,38 @@ export class Cache<T> {
date: Date.now(),
value,
});
// make sure the expiration timeout is in place
this.expire();
}
public get(key: string): T | undefined {
const cached = this.cache.get(key);
if (cached == null) return undefined;
else return cached.value;
// discard if past the cache lifetime
if ((Date.now() - cached.date) > this.lifetime) {
this.cache.delete(key);
return undefined;
}
return cached.value;
}
public delete(key: string): void {
this.cache.delete(key);
}
// If the value is cached, it is returned. Otherwise the fetcher is
// run to get the value. If the fetcher returns undefined, it is
// returned but not cached.
/**
* If the value is cached, it is returned. Otherwise the fetcher is
* run to get the value. If the fetcher returns undefined, it is
* returned but not cached.
*/
public async fetch(key: string): Promise<T | undefined> {
// Check if this value is cached
const cached = this.get(key);
if (cached !== undefined) {
// The value was cached, return it.
return cached;
} else {
// The value was not cached, need to call the original function
// to get its result and then cache it.
const value = await this.fetcher(key);
// `undefined` is not cached
// don't cache undefined
if (value !== undefined) {
this.set(key, value);
}
@ -62,43 +53,4 @@ export class Cache<T> {
return value;
}
}
// Handling the expiration of cached values.
// This is done using a timeout.
private expire(): void {
// If there already is a timeout scheduled, it will be appropriate
// for the first inserted element of the cache.
// If the first element of the cache was removed, it will reschedule
// to the appropriate time when it runs out.
//
// If the cache is empty, there is nothing to expire either.
if (this.timeoutScheduled) return;
// Otherwise, this must mean this is the previously scheduled timeout.
// Since it is running now, it is no longer scheduled.
this.timeoutScheduled = false;
// Check if the first element is actually due for expiration.
//
// Items may have been removed in the meantime or this may be
// the initial call for the first key inserted into the cache.
const [expiredKey, expiredValue] = this.cache.entries().next().value;
if (expiredValue.date + this.lifetime <= Date.now()) {
// This item is due for expiration, so remove it.
this.cache.delete(expiredKey);
}
// If there are no further elements in the cache, there is nothing to
// expire at a later time. The timeout will be set up again later by
// a call from `this.set`.
if (this.cache.size === 0) return;
// Check when the next key is due for removal and schedule
// an appropriate timeout.
const [nextKey, nextValue] = this.cache.entries().next().value;
setTimeout(
() => this.expire(),
nextValue.date + this.lifetime - Date.now()
);
this.timeoutScheduled = true;
}
}

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