Compare commits
2 commits
Author | SHA1 | Date | |
---|---|---|---|
1dd0b6aece | |||
9384ce8cf5 |
4
.config/docker_example.env
Normal file
|
@ -0,0 +1,4 @@
|
|||
# db settings
|
||||
POSTGRES_PASSWORD=example-misskey-pass
|
||||
POSTGRES_USER=example-misskey-user
|
||||
POSTGRES_DB=misskey
|
|
@ -1,34 +1,33 @@
|
|||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# FoundKey configuration
|
||||
# Misskey configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
# ┌─────┐
|
||||
#───┘ 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 └───────────────────────────────────
|
||||
|
||||
#
|
||||
# FoundKey requires a reverse proxy to support HTTPS connections.
|
||||
# Misskey requires a reverse proxy to support HTTPS connections.
|
||||
#
|
||||
# +-------- https://example.tld/ ----------+
|
||||
# +------+ |+-------------+ +-----------------+|
|
||||
# | User | ---> || Proxy (443) | ---> | FoundKey (3000) ||
|
||||
# +------+ |+-------------+ +-----------------+|
|
||||
# +----------------------------------------+
|
||||
# +----- https://example.tld/ ------------+
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# +---------------------------------------+
|
||||
#
|
||||
# You need to set up a reverse proxy. (e.g. nginx)
|
||||
# An encrypted connection with HTTPS is highly recommended
|
||||
# because tokens may be transferred in GET requests.
|
||||
|
||||
# The port that your FoundKey server should listen on.
|
||||
# The port that your Misskey server should listen on.
|
||||
port: 3000
|
||||
|
||||
# ┌──────────────────────────┐
|
||||
|
@ -39,17 +38,16 @@ db:
|
|||
port: 5432
|
||||
|
||||
# Database name
|
||||
db: foundkey
|
||||
db: misskey
|
||||
|
||||
# Auth
|
||||
user: example-foundkey-user
|
||||
pass: example-foundkey-pass
|
||||
user: example-misskey-user
|
||||
pass: example-misskey-pass
|
||||
|
||||
# Whether to disable query caching
|
||||
# Default is to cache, i.e. false.
|
||||
# Whether disable Caching queries
|
||||
#disableCache: true
|
||||
|
||||
# Extra connection options
|
||||
# Extra Connection options
|
||||
#extra:
|
||||
# ssl: true
|
||||
|
||||
|
@ -59,48 +57,53 @@ 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: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
#pass: example-pass
|
||||
#prefix: example-prefix
|
||||
#db: 1
|
||||
|
||||
# ┌─────────────────────────────┐
|
||||
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||
|
||||
#elasticsearch:
|
||||
# host: localhost
|
||||
# port: 9200
|
||||
# ssl: false
|
||||
# user:
|
||||
# pass:
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ 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.
|
||||
#clusterLimits:
|
||||
# web: 1
|
||||
# queue: 1
|
||||
# Number of worker processes
|
||||
#clusterLimit: 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
|
||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||
#outgoingAddressFamily: ipv4
|
||||
|
||||
# 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'
|
||||
|
@ -114,37 +117,15 @@ 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)
|
||||
# default is to store it in ./files in the directory foundkey is located in
|
||||
#internalStoragePath: '/etc/foundkey/files'
|
||||
# Sign to ActivityPub GET request (default: false)
|
||||
#signToActivityPubGet: true
|
||||
|
||||
# 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'
|
||||
#]
|
||||
|
||||
# images used on error screens. You can use absolute or relative URLs.
|
||||
# If you use relative URLs, be aware that the URL may be used on different pages/paths, so the path component should be absolute.
|
||||
#images:
|
||||
# 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
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
||||
|
|
15
.dockerignore
Normal file
|
@ -0,0 +1,15 @@
|
|||
.autogen
|
||||
.github
|
||||
.travis
|
||||
.vscode
|
||||
.config
|
||||
Dockerfile
|
||||
build/
|
||||
built/
|
||||
db/
|
||||
docker-compose.yml
|
||||
elasticsearch/
|
||||
node_modules/
|
||||
redis/
|
||||
files/
|
||||
misskey-assets/
|
|
@ -2,10 +2,9 @@ root = true
|
|||
|
||||
[*]
|
||||
indent_style = tab
|
||||
indent_size = 4
|
||||
indent_size = 2
|
||||
charset = utf-8
|
||||
insert_final_newline = true
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
||||
indent_size = 2
|
||||
|
|
6
.gitattributes
vendored
|
@ -1 +1,7 @@
|
|||
*.svg -diff -text
|
||||
*.psd -diff -text
|
||||
*.ai -diff -text
|
||||
*.mqo -diff -text
|
||||
*.glb -diff -text
|
||||
*.blend -diff -text
|
||||
*.afdesign -diff -text
|
||||
|
|
28
.gitignore
vendored
|
@ -1,26 +1,25 @@
|
|||
# Visual Studio Code
|
||||
/.vscode
|
||||
/.vsls.json
|
||||
!/.vscode/extensions.json
|
||||
|
||||
# Intelij-IDEA
|
||||
/.idea
|
||||
|
||||
# Sublime Text
|
||||
/*.sublime-*
|
||||
|
||||
# nano
|
||||
.swp
|
||||
|
||||
# vimlocal
|
||||
.vimlocal
|
||||
|
||||
# Node.js
|
||||
node_modules
|
||||
report.*.json
|
||||
|
||||
# Cypress
|
||||
cypress/screenshots
|
||||
cypress/videos
|
||||
|
||||
# config
|
||||
/.config/*
|
||||
!/.config/example.yml
|
||||
!/.config/docker_example.env
|
||||
|
||||
# misskey
|
||||
/build
|
||||
|
@ -28,6 +27,7 @@ built
|
|||
/data
|
||||
/.cache-loader
|
||||
/db
|
||||
/elasticsearch
|
||||
npm-debug.log
|
||||
*.pem
|
||||
run.bat
|
||||
|
@ -45,17 +45,3 @@ ormconfig.json
|
|||
*.blend3
|
||||
*.blend4
|
||||
*.blend5
|
||||
|
||||
# Yarn
|
||||
.yarn/*
|
||||
!.yarn/patches
|
||||
!.yarn/plugins
|
||||
!.yarn/releases
|
||||
!.yarn/sdks
|
||||
!.yarn/versions
|
||||
packages/client/.yarn/*
|
||||
packages/backend/.yarn/*
|
||||
packages/sw/.yarn/*
|
||||
|
||||
# TypeScript
|
||||
tsconfig.tsbuildinfo
|
||||
|
|
3
.gitmodules
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
[submodule "misskey-assets"]
|
||||
path = misskey-assets
|
||||
url = https://github.com/misskey-dev/assets.git
|
32
.mailmap
|
@ -1,32 +0,0 @@
|
|||
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>
|
||||
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>
|
||||
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>
|
||||
Nya Candy <20502130+Candinya@users.noreply.github.com> <dev@candinya.com>
|
||||
Nya Candy <20502130+Candinya@users.noreply.github.com> <github@lcy.moe>
|
||||
Skehmatics <skeh@is.nota.live>
|
||||
Skehmatics <skeh@is.nota.live> <skehmatics@gmail.com>
|
||||
ThatOneCalculator <kainoa@t1c.dev> <44733677+ThatOneCalculator@users.noreply.github.com>
|
||||
Weblate <noreply@weblate.org>
|
||||
Xeltica <7106976+Xeltica@users.noreply.github.com>
|
||||
YuzuRyo61 <yuzuryo61@yuzulia.com> <cyberman.craft@gmail.com>
|
||||
YuzuRyo61 <yuzuryo61@yuzulia.com> <yuzuryo61@yuzulia.work>
|
||||
dependabot[bot] <dependabot[bot]@users.noreply.github.com> <27856297+dependabot-preview[bot]@users.noreply.github.com>
|
||||
dependabot[bot] <dependabot[bot]@users.noreply.github.com> <49699333+dependabot[bot]@users.noreply.github.com>
|
||||
dependabot[bot] <dependabot[bot]@users.noreply.github.com> <support@dependabot.com>
|
||||
imgbot[bot] <imgbot[bot]@users.noreply.github.com> <31301654+imgbot[bot]@users.noreply.github.com>
|
||||
imgbot[bot] <imgbot[bot]@users.noreply.github.com> <ImgBotHelp@gmail.com>
|
||||
marihachi <marihachi0620@gmail.com>
|
||||
mei23 <m@m544.net> <30769358+mei23@users.noreply.github.com>
|
||||
nullobsi <me@nullob.si>
|
||||
otofune <otofune@gmail.com> <otofune@users.noreply.github.com>
|
||||
syuilo <syuilotan@yahoo.co.jp> <Syuilotan@yahoo.co.jp>
|
||||
xianon <xianon@hotmail.co.jp>
|
|
@ -1 +1 @@
|
|||
v18.7.0
|
||||
v16.15.0
|
||||
|
|
2
.npmrc
Normal file
|
@ -0,0 +1,2 @@
|
|||
save-exact = true
|
||||
package-lock = false
|
6
.okteto/okteto-pipeline.yml
Normal file
|
@ -0,0 +1,6 @@
|
|||
build:
|
||||
misskey:
|
||||
args:
|
||||
- NODE_ENV=development
|
||||
deploy:
|
||||
- helm upgrade --install misskey chart --set image=${OKTETO_BUILD_MISSKEY_IMAGE} --set url="https://misskey-$(kubectl config view --minify -o jsonpath='{..namespace}').cloud.okteto.net" --set environment=development
|
9
.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"recommendations": [
|
||||
"editorconfig.editorconfig",
|
||||
"eg2.vscode-npm-script",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"Vue.volar",
|
||||
"Vue.vscode-typescript-vue-plugin"
|
||||
]
|
||||
}
|
4
.vsls.json
Normal file
|
@ -0,0 +1,4 @@
|
|||
{
|
||||
"$schema": "http://json.schemastore.org/vsls",
|
||||
"gitignore": "exclude"
|
||||
}
|
|
@ -8,15 +8,17 @@ clone:
|
|||
pipeline:
|
||||
install:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn install
|
||||
build:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn build
|
||||
|
|
|
@ -8,15 +8,17 @@ clone:
|
|||
pipeline:
|
||||
install:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn install
|
||||
lint:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn workspace backend run lint
|
||||
- yarn --cwd ./packages/backend lint
|
||||
|
|
|
@ -8,15 +8,17 @@ clone:
|
|||
pipeline:
|
||||
install:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn install
|
||||
lint:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn workspace client run lint
|
||||
- yarn --cwd ./packages/client lint
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
clone:
|
||||
git:
|
||||
image: woodpeckerci/plugin-git
|
||||
settings:
|
||||
depth: 1 # CI does not need commit history
|
||||
recursive: true
|
||||
|
||||
pipeline:
|
||||
install:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn install
|
||||
lint:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn workspace foundkey-js run lint
|
|
@ -1,22 +0,0 @@
|
|||
clone:
|
||||
git:
|
||||
image: woodpeckerci/plugin-git
|
||||
settings:
|
||||
depth: 1 # CI does not need commit history
|
||||
recursive: true
|
||||
|
||||
pipeline:
|
||||
install:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn install
|
||||
lint:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn workspace sw run lint
|
13
.woodpecker/misskey/test.yml
Normal file
|
@ -0,0 +1,13 @@
|
|||
url: 'http://misskey.local'
|
||||
|
||||
port: 80
|
||||
|
||||
db:
|
||||
host: postgres
|
||||
port: 5432
|
||||
db: test-misskey
|
||||
user: postgres
|
||||
pass: ''
|
||||
redis:
|
||||
host: redis
|
||||
port: 6379
|
|
@ -5,16 +5,44 @@ clone:
|
|||
depth: 1 # CI does not need commit history
|
||||
recursive: true
|
||||
|
||||
depends_on:
|
||||
- build
|
||||
|
||||
pipeline:
|
||||
build:
|
||||
when:
|
||||
branch: main
|
||||
event: push
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn install
|
||||
- git diff --exit-code yarn.lock
|
||||
- cp .woodpecker/misskey/test.yml .config
|
||||
- yarn build
|
||||
mocha:
|
||||
when:
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
image: node:18.6.0
|
||||
commands:
|
||||
- yarn mocha
|
||||
e2e:
|
||||
when:
|
||||
event:
|
||||
- push
|
||||
- pull_request
|
||||
image: cypress/included:10.3.0
|
||||
commands:
|
||||
- npm run start:test &
|
||||
- sleep 30 # wait for server to start
|
||||
- cypress run --browser chrome
|
||||
# TODO: upload screenshots and video artifacts?
|
||||
# would need some kind of storage though
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:13
|
||||
environment:
|
||||
- POSTGRES_DB=test-misskey
|
||||
- POSTGRES_HOST_AUTH_METHOD=trust
|
||||
redis:
|
||||
image: redis:6
|
||||
|
|
541
.yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
vendored
873
.yarn/releases/yarn-3.4.1.cjs
vendored
1
.yarnrc
Normal file
|
@ -0,0 +1 @@
|
|||
network-timeout 600000
|
11
.yarnrc.yml
|
@ -1,11 +0,0 @@
|
|||
httpTimeout: 600000
|
||||
|
||||
nodeLinker: node-modules
|
||||
|
||||
plugins:
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-interactive-tools.cjs
|
||||
spec: "@yarnpkg/plugin-interactive-tools"
|
||||
- path: .yarn/plugins/@yarnpkg/plugin-workspace-tools.cjs
|
||||
spec: "@yarnpkg/plugin-workspace-tools"
|
||||
|
||||
yarnPath: .yarn/releases/yarn-3.4.1.cjs
|
670
CHANGELOG-OLD.md
|
@ -1,670 +0,0 @@
|
|||
**This is the changelog for Misskey v12.111.1 and earlier for historical reference. Changes for FoundKey versions post-fork can be found in the current [CHANGELOG.md](./CHANGELOG.md).**
|
||||
|
||||
**Contributors should use [changelog trailers](./CONTRIBUTING.md#changelog-trailer) for any changes that should be noted in the current changelog.**
|
||||
|
||||
## 12.x.x (unreleased)
|
||||
|
||||
### Changes
|
||||
- ハイライトがみつけるに統合されました
|
||||
- カスタム絵文字ページはインスタンス情報ページに統合されました
|
||||
- 連合ページはインスタンス情報ページに統合されました
|
||||
|
||||
### Improvements
|
||||
- Client: Fix URL-encoded routing
|
||||
- Server: Allow GET method for some endpoints @syuilo
|
||||
- Server: Add rate limit to i/notifications @tamaina
|
||||
- Client: Improve control panel @syuilo
|
||||
- Client: Show warning in control panel when there is an unresolved abuse report @syuilo
|
||||
- Client: For notes with specified visibility, show recipients when hovering over visibility symbol. @Johann150
|
||||
- Client: Add rss-ticker widget @syuilo
|
||||
- Client: Removing entries from a clip @futchitwo
|
||||
- Client: Poll highlights in explore page @syuilo
|
||||
- Make possible to delete an account by admin @syuilo
|
||||
- Improve player detection in URL preview @mei23
|
||||
- Add Badge Image to Push Notification #8012 @tamaina
|
||||
- Server: Improve performance
|
||||
- Server: Supports IPv6 on Redis transport. @mei23
|
||||
IPv4/IPv6 is used by default. You can tune this behavior via `redis.family`.
|
||||
|
||||
### Bugfixes
|
||||
- Server: Fix GenerateVideoThumbnail failed @mei23
|
||||
- Server: Ensure temp directory cleanup @Johann150
|
||||
- favicons of federated instances not showing @syuilo
|
||||
- Client: fix switch to receive email notifications @syuilo
|
||||
- Client: Page freezes when trying to open configuration page of existing webhooks @syuilo
|
||||
|
||||
## 12.111.1 (2022/06/13)
|
||||
|
||||
### Bugfixes
|
||||
- some fixes of multiple notification read @tamaina
|
||||
- some GenerateVideoThumbnail failed @Johann150
|
||||
- Client: デッキでウィジェットの情報が保存されない問題を修正 @syuilo
|
||||
- Client: ギャラリーの投稿を開こうとすると編集画面が表示される @futchitwo
|
||||
|
||||
## 12.111.0 (2022/06/11)
|
||||
### Note
|
||||
- Node.js 16.15.0 or later is required
|
||||
|
||||
### Improvements
|
||||
- Supports Unicode Emoji 14.0 @mei23
|
||||
- プッシュ通知を複数アカウント対応に #7667 @tamaina
|
||||
- プッシュ通知にクリックやactionを設定 #7667 @tamaina
|
||||
- ドライブに画像ファイルをアップロードするときオリジナル画像を破棄してwebpublicのみ保持するオプション @tamaina
|
||||
- Server: always remove completed tasks of job queue @Johann150
|
||||
- Client: アバターの設定で画像をクロップできるように @syuilo
|
||||
- Client: make emoji stand out more on reaction button @Johann150
|
||||
- Client: display URL of QR code for TOTP registration @tamaina
|
||||
- Client: render quote renote CWs as MFM @pixeldesu
|
||||
- API: notifications/readは配列でも受け付けるように #7667 @tamaina
|
||||
- API: ユーザー検索で、クエリがusernameの条件を満たす場合はusernameもLIKE検索するように @tamaina
|
||||
- MFM: Allow speed changes in all animated MFMs @Johann150
|
||||
- The theme color is now better validated. @Johann150
|
||||
Your own theme color may be unset if it was in an invalid format.
|
||||
Admins should check their instance settings if in doubt.
|
||||
- Perform port diagnosis at startup only when Listen fails @mei23
|
||||
- Rate limiting is now also usable for non-authenticated users. @Johann150 @mei23
|
||||
Admins should make sure the reverse proxy sets the `X-Forwarded-For` header to the original address.
|
||||
|
||||
### Bugfixes
|
||||
- Server: keep file order of note attachement @Johann150
|
||||
- Server: fix missing foreign key for reports leading to reports page being unusable @Johann150
|
||||
- Server: fix internal in-memory caching @Johann150
|
||||
- Server: prevent crash when processing certain PNGs @syuilo
|
||||
- Server: Fix unable to generate video thumbnails @mei23
|
||||
- Server: Fix `Cannot find module` issue @mei23
|
||||
- Federation: Add rel attribute to host-meta @mei23
|
||||
- Federation: add id for activitypub follows @Johann150
|
||||
- Federation: use `source` instead of `_misskey_content` @Johann150
|
||||
- Federation: ensure resolver does not fetch local resources via HTTP(S) @Johann150
|
||||
- Federation: correctly render empty note text @Johann150
|
||||
- Federation: Fix quote renotes containing no text being federated correctly @Johann150
|
||||
- Federation: remove duplicate br tag/newline @Johann150
|
||||
- Federation: add missing authorization checks @Johann150
|
||||
- Client: fix profile picture height in mentions @tamaina
|
||||
- Client: fix abuse reports page to be able to show all reports @Johann150
|
||||
- Client: fix settings page @tamaina
|
||||
- Client: fix profile tabs @futchitwo
|
||||
- Client: fix popout URL @futchitwo
|
||||
- Client: correctly handle MiAuth URLs with query string @sn0w
|
||||
- Client: ノート詳細ページの新しいノートを表示する機能の動作が正しくなるように修正する @xianonn
|
||||
- MFM: more animated functions support `speed` parameter @futchitwo
|
||||
- MFM: limit large MFM @Johann150
|
||||
|
||||
## 12.110.1 (2022/04/23)
|
||||
|
||||
### Bugfixes
|
||||
- Fix GOP rendering @syuilo
|
||||
- Improve performance of antenna, clip, and list @xianonn
|
||||
|
||||
## 12.110.0 (2022/04/11)
|
||||
|
||||
### Improvements
|
||||
- Improve webhook @syuilo
|
||||
- Client: Show loading icon on splash screen @syuilo
|
||||
|
||||
### Bugfixes
|
||||
- API: parameter validation of users/show was wrong
|
||||
- Federation: リモートインスタンスへのダイレクト投稿が届かない問題を修正 @syuilo
|
||||
|
||||
## 12.109.2 (2022/04/03)
|
||||
|
||||
### Bugfixes
|
||||
- API: admin/update-meta was not working @syuilo
|
||||
- Client: テーマを切り替えたり読み込んだりするとmeta[name="theme-color"]のcontentがundefinedになる問題を修正 @tamaina
|
||||
|
||||
## 12.109.1 (2022/04/02)
|
||||
|
||||
### Bugfixes
|
||||
- API: Renoteが行えない問題を修正
|
||||
|
||||
## 12.109.0 (2022/04/02)
|
||||
|
||||
### Improvements
|
||||
- Webhooks @syuilo
|
||||
- Bull Dashboardを組み込み、ジョブキューの確認や操作を行えるように @syuilo
|
||||
- Bull Dashboardを開くには、最初だけ一旦ログアウトしてから再度管理者権限を持つアカウントでログインする必要があります
|
||||
- Check that installed Node.js version fulfills version requirement @ThatOneCalculator
|
||||
- Server: overall performance improvements @syuilo
|
||||
- Federation: avoid duplicate activity delivery @Johann150
|
||||
- Federation: limit federation of reactions on direct notes @Johann150
|
||||
- Client: タッチパッド・タッチスクリーンでのデッキの操作性を向上 @tamaina
|
||||
|
||||
### Bugfixes
|
||||
- email address validation was not working @ybw2016v
|
||||
- API: fix endpoint endpoint @Johann150
|
||||
- API: fix admin/meta endpoint @syuilo
|
||||
- API: improved validation and documentation for endpoints that accept different variants of input @Johann150
|
||||
- API: `notes/create`: The `mediaIds` property is now deprecated. @Johann150
|
||||
- Use `fileIds` instead, it has the same behaviour.
|
||||
- Client: URIエンコーディングが異常でdecodeURIComponentが失敗するとURLが表示できなくなる問題を修正 @tamaina
|
||||
|
||||
## 12.108.1 (2022/03/12)
|
||||
|
||||
### Bugfixes
|
||||
- リレーが動作しない問題を修正 @xianonn
|
||||
- ulidを使用していると動作しない問題を修正 @syuilo
|
||||
- 外部からOGPが正しく取得できない問題を修正 @syuilo
|
||||
- instance can not get the files from other instance when there are items in allowedPrivateNetworks in .config/default.yml @ybw2016v
|
||||
|
||||
## 12.108.0 (2022/03/09)
|
||||
|
||||
### NOTE
|
||||
このバージョンからNode v16.14.0以降が必要です
|
||||
|
||||
### Changes
|
||||
- ノートの最大文字数を設定できる機能が廃止され、デフォルトで一律3000文字になりました @syuilo
|
||||
- Misskey can no longer terminate HTTPS connections. @Johann150
|
||||
- If you did not use a reverse proxy (e.g. nginx) before, you will probably need to adjust
|
||||
your configuration file and set up a reverse proxy. The `https` configuration key is no
|
||||
longer recognized!
|
||||
|
||||
### Improvements
|
||||
- インスタンスデフォルトテーマを設定できるように @syuilo
|
||||
- ミュートに期限を設定できるように @syuilo
|
||||
- アンケートが終了したときに通知が作成されるように @syuilo
|
||||
- プロフィールの追加情報を最大16まで保存できるように @syuilo
|
||||
- 連合チャートにPub&Subを追加 @syuilo
|
||||
- 連合チャートにActiveを追加 @syuilo
|
||||
- デフォルトで10秒以上時間がかかるデータベースへのクエリは中断されるように @syuilo
|
||||
- 設定ファイルの`db.extra`に`statement_timeout`を設定することでタイムアウト時間を変更できます
|
||||
- Client: スプラッシュスクリーンにインスタンスのアイコンを表示するように @syuilo
|
||||
|
||||
### Bugfixes
|
||||
- Client: リアクションピッカーの高さが低くなったまま戻らないことがあるのを修正 @syuilo
|
||||
- Client: ユーザー名オートコンプリートが正しく動作しない問題を修正 @syuilo
|
||||
- Client: タッチ操作だとウィジェットの編集がしにくいのを修正 @xianonn
|
||||
- Client: register_note_view_interruptor()が動かないのを修正 @syuilo
|
||||
- Client: iPhone X以降(?)でページの内容が全て表示しきれないのを修正 @tamaina
|
||||
- Client: fix image caption on mobile @nullobsi
|
||||
|
||||
## 12.107.0 (2022/02/12)
|
||||
|
||||
### Improvements
|
||||
- クライアント: テーマを追加 @syuilo
|
||||
|
||||
### Bugfixes
|
||||
- API: stats APIで内部エラーが発生する問題を修正 @syuilo
|
||||
- クライアント: ソフトミュートですべてがマッチしてしまう場合があるのを修正 @tamaina
|
||||
- クライアント: デバイスのスクリーンのセーフエリアを考慮するように @syuilo
|
||||
- クライアント: 一部環境でサイドバーの投稿ボタンが表示されない問題を修正 @syuilo
|
||||
|
||||
## 12.106.3 (2022/02/11)
|
||||
|
||||
### Improvements
|
||||
- クライアント: スマートフォンでの余白を調整 @syuilo
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: ノートの詳細が表示されない問題を修正 @syuilo
|
||||
|
||||
## 12.106.2 (2022/02/11)
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: 削除したノートがタイムラインから自動で消えない問題を修正 @syuilo
|
||||
- クライアント: リアクション数が正しくないことがある問題を修正 @syuilo
|
||||
- 一部環境でマイグレーションが動作しない問題を修正 @syuilo
|
||||
|
||||
## 12.106.1 (2022/02/11)
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: ワードミュートが保存できない問題を修正 @syuilo
|
||||
|
||||
## 12.106.0 (2022/02/11)
|
||||
|
||||
### Improvements
|
||||
- Improve federation chart @syuilo
|
||||
- クライアント: リアクションピッカーのサイズを設定できるように @syuilo
|
||||
- クライアント: リアクションピッカーの幅、高さ制限を緩和 @syuilo
|
||||
- Docker: Update to Node v16.13.2 @mei23
|
||||
- Update dependencies
|
||||
|
||||
### Bugfixes
|
||||
- validate regular expressions in word mutes @Johann150
|
||||
|
||||
## 12.105.0 (2022/02/09)
|
||||
|
||||
### Improvements
|
||||
- インスタンスのテーマカラーを設定できるように @syuilo
|
||||
|
||||
### Bugfixes
|
||||
- 一部環境でマイグレーションが失敗する問題を修正 @syuilo
|
||||
|
||||
## 12.104.0 (2022/02/09)
|
||||
|
||||
### Note
|
||||
ビルドする前に`npm run clean`を実行してください。
|
||||
|
||||
このリリースはマイグレーションの規模が大きいため、インスタンスによってはマイグレーションに時間がかかる可能性があります。
|
||||
マイグレーションが終わらない場合は、チャートの情報はリセットされてしまいますが`__chart__`で始まるテーブルの**レコード**を全て削除(テーブル自体は消さないでください)してから再度試す方法もあります。
|
||||
|
||||
### Improvements
|
||||
- チャートエンジンの強化 @syuilo
|
||||
- テーブルサイズの削減
|
||||
- notes/instance/perUserNotesチャートに添付ファイル付きノートの数を追加
|
||||
- activeUsersチャートに新しい項目を追加
|
||||
- federationチャートに新しい項目を追加
|
||||
- apRequestチャートを追加
|
||||
- networkチャート廃止
|
||||
- クライアント: 自インスタンス情報ページでチャートを見れるように @syuilo
|
||||
- クライアント: デバイスの種類を手動指定できるように @syuilo
|
||||
- クライアント: UIのアイコンを更新 @syuilo
|
||||
- クライアント: UIのアイコンをセルフホスティングするように @syuilo
|
||||
- NodeInfo のユーザー数と投稿数の内容を見直す @xianonn
|
||||
|
||||
### Bugfixes
|
||||
- Client: タイムライン種別を切り替えると「新しいノートがあります」の表示が残留してしまうのを修正 @tamaina
|
||||
- Client: UIのサイズがおかしくなる問題の修正 @tamaina
|
||||
- Client: Setting instance information of notes to always show breaks the timeline @Johann150
|
||||
- Client: 環境に依っては返信する際のカーソル位置が正しくない問題を修正 @syuilo
|
||||
- Client: コントロールパネルのユーザー、ファイルにて、インスタンスの表示範囲切り替えが機能しない問題を修正 @syuilo
|
||||
- Client: アップデートお知らせダイアログが出ないのを修正 @syuilo
|
||||
- Client: Follows/Followers Visibility changes won't be saved unless clicking on an other checkbox @Johann150
|
||||
- API: Fix API cast @mei23
|
||||
- add instance favicon where it's missing @solfisher
|
||||
- チャートの定期resyncが動作していない問題を修正 @syuilo
|
||||
|
||||
## 12.103.1 (2022/02/02)
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: ツールチップの表示位置が正しくない問題を修正
|
||||
|
||||
## 12.103.0 (2022/02/02)
|
||||
|
||||
### Improvements
|
||||
- クライアント: 連合インスタンスページからインスタンス情報再取得を行えるように
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: 投稿のNSFW画像を表示したあとにリアクションが更新されると画像が非表示になる問題を修正
|
||||
- クライアント: 「クリップ」ページが開かない問題を修正
|
||||
- クライアント: トレンドウィジェットが動作しないのを修正
|
||||
- クライアント: フェデレーションウィジェットが動作しないのを修正
|
||||
- クライアント: リアクション設定で絵文字ピッカーが開かないのを修正
|
||||
- クライアント: DMページでメンションが含まれる問題を修正
|
||||
- クライアント: 投稿フォームのハッシュタグ保持フィールドが動作しない問題を修正
|
||||
- クライアント: サイドビューが動かないのを修正
|
||||
- クライアント: ensure that specified users does not get duplicates
|
||||
- Add `img-src` and `media-src` directives to `Content-Security-Policy` for
|
||||
files and media proxy
|
||||
|
||||
## 12.102.1 (2022/01/27)
|
||||
### Bugfixes
|
||||
- チャットが表示できない問題を修正
|
||||
|
||||
## 12.102.0 (2022/01/27)
|
||||
|
||||
### NOTE
|
||||
アップデート後、一部カスタム絵文字が表示できなくなる場合があります。その場合、一旦絵文字管理ページから絵文字を一括エクスポートし、再度コントロールパネルから一括インポートすると直ります。
|
||||
⚠ 12.102.0以前にエクスポートされたzipとは互換性がありません。アップデートしてからエクスポートを行なってください。
|
||||
|
||||
### Changes
|
||||
- Room機能が削除されました
|
||||
- 後日別リポジトリとして復活予定です
|
||||
- リバーシ機能が削除されました
|
||||
- 後日別リポジトリとして復活予定です
|
||||
- Chat UIが削除されました
|
||||
- ノートに添付できるファイルの数が16に増えました
|
||||
- カスタム絵文字にSVGを指定した場合、PNGに変換されて表示されるようになりました
|
||||
|
||||
### Improvements
|
||||
- カスタム絵文字一括編集機能
|
||||
- カスタム絵文字一括インポート
|
||||
- 投稿フォームで一時的に投稿するアカウントを切り替えられるように
|
||||
- Unifying Misskey-specific IRIs in JSON-LD `@context`
|
||||
- クライアントのパフォーマンス向上
|
||||
- セキュリティの向上
|
||||
|
||||
### Bugfixes
|
||||
- アップロードエラー時の処理を修正
|
||||
|
||||
## 12.101.1 (2021/12/29)
|
||||
|
||||
### Bugfixes
|
||||
- SVG絵文字が表示できないのを修正
|
||||
- エクスポートした絵文字の拡張子がfalseになることがあるのを修正
|
||||
|
||||
## 12.101.0 (2021/12/29)
|
||||
|
||||
### Improvements
|
||||
- クライアント: ノートプレビューの精度を改善
|
||||
- クライアント: MFM sparkleエフェクトの改善
|
||||
- クライアント: デザインの調整
|
||||
- セキュリティの向上
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: 一部のコンポーネントが裏に隠れるのを修正
|
||||
- fix html blockquote conversion
|
||||
|
||||
## 12.100.2 (2021/12/18)
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: Deckカラムの増減がページをリロードするまで正しく反映されない問題を修正
|
||||
- クライアント: 一部のコンポーネントが裏に隠れるのを修正
|
||||
- クライアント: カスタム絵文字一覧ページの負荷が高いのを修正
|
||||
|
||||
## 12.100.1 (2021/12/17)
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: デザインの調整
|
||||
|
||||
## 12.100.0 (2021/12/17)
|
||||
|
||||
### Improvements
|
||||
- クライアント: モバイルでの各種メニュー、リアクションピッカーの表示を改善
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: 一部のコンポーネントが裏に隠れるのを修正
|
||||
|
||||
## 12.99.3 (2021/12/14)
|
||||
### Bugfixes
|
||||
- クライアント: オートコンプリートがダイアログの裏に隠れる問題を修正
|
||||
|
||||
## 12.99.2 (2021/12/14)
|
||||
|
||||
## 12.99.1 (2021/12/14)
|
||||
|
||||
## 12.99.0 (2021/12/14)
|
||||
|
||||
### Improvements
|
||||
- Added a user-level instance mute in user settings
|
||||
- フォローエクスポートでミュートしているユーザーを含めないオプションを追加
|
||||
- フォローエクスポートで使われていないアカウントを含めないオプションを追加
|
||||
- カスタム絵文字エクスポート機能
|
||||
- チャートのパフォーマンスの改善
|
||||
- グループから抜けられるように
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: タッチ機能付きディスプレイを使っていてマウス操作をしている場合に一部機能が動作しない問題を修正
|
||||
- クライアント: クリップの設定を編集できない問題を修正
|
||||
- クライアント: メニューなどがウィンドウの裏に隠れる問題を修正
|
||||
|
||||
## 12.98.0 (2021/12/03)
|
||||
|
||||
### Improvements
|
||||
- API: /antennas/notes API で日付による絞り込みができるように
|
||||
- クライアント: アンケートに投票する際に確認ダイアログを出すように
|
||||
- クライアント: Renoteなノート詳細ページから元のノートページに遷移できるように
|
||||
- クライアント: 画像ポップアップでクリックで閉じられるように
|
||||
- クライアント: デザインの調整
|
||||
- フォロワーを解除できる機能
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: LTLやGTLが無効になっている場合でもUI上にタブが表示される問題を修正
|
||||
- クライアント: ログインにおいてパスワードが誤っている際のエラーメッセージが正しく表示されない問題を修正
|
||||
- クライアント: リアクションツールチップ、Renoteツールチップのユーザーの並び順を修正
|
||||
- クライアント: サウンドのマスターボリュームが正しく保存されない問題を修正
|
||||
- クライアント: 一部環境において通知が表示されると操作不能になる問題を修正
|
||||
- クライアント: モバイルでタップしたときにツールチップが表示される問題を修正
|
||||
- クライアント: リモートインスタンスのノートに返信するとき、対象のノートにそのリモートインスタンス内のユーザーへのメンションが含まれていると、返信テキスト内にローカルユーザーへのメンションとして引き継がれてしまう場合がある問題を修正
|
||||
- クライアント: 画像ビューワーで全体表示した時に上側の一部しか表示されない画像がある問題を修正
|
||||
- API: ユーザーを取得時に条件によっては内部エラーになる問題を修正
|
||||
|
||||
### Changes
|
||||
- クライアント: ノートにモデレーターバッジを表示するのを廃止
|
||||
|
||||
## 12.97.0 (2021/11/19)
|
||||
|
||||
### Improvements
|
||||
- クライアント: 返信先やRenoteに対しても自動折りたたみされるように
|
||||
- クライアント: 長いスレッドの表示を改善
|
||||
- クライアント: 翻訳にもMFMを適用し、元の文章の改行などを保持するように
|
||||
- クライアント: アカウント削除に確認ダイアログを出すように
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: ユーザー検索の「全て」が動作しない問題を修正
|
||||
- クライアント: リアクション一覧、Renote一覧ツールチップのスタイルを修正
|
||||
|
||||
## 12.96.1 (2021/11/13)
|
||||
### Improvements
|
||||
- npm scriptの互換性を向上
|
||||
|
||||
## 12.96.0 (2021/11/13)
|
||||
|
||||
### Improvements
|
||||
- フォロー/フォロワーを非公開にできるように
|
||||
- インスタンスプロフィールレンダリング ready
|
||||
- 通知のリアクションアイコンをホバーで拡大できるように
|
||||
- RenoteボタンをホバーでRenoteしたユーザー一覧を表示するように
|
||||
- 返信の際にメンションを含めるように
|
||||
- 通報があったときに管理者へEメールで通知されるように
|
||||
- メールアドレスのバリデーションを強化
|
||||
|
||||
### Bugfixes
|
||||
- アカウント削除処理があると高負荷になる問題を修正
|
||||
- クライアント: 長いメニューが画面からはみ出す問題を修正
|
||||
- クライアント: コントロールパネルのジョブキューに個々のジョブが表示されないのを修正
|
||||
- クライアント: fix missing i18n string
|
||||
- fix html conversion issue with code blocks
|
||||
|
||||
### Changes
|
||||
- ノートにモバイルからの投稿か否かの情報を含めないように
|
||||
|
||||
## 12.95.0 (2021/10/31)
|
||||
|
||||
### Improvements
|
||||
- スレッドミュート機能
|
||||
|
||||
### Bugfixes
|
||||
- リレー向けのActivityが一部実装で除外されてしまうことがあるのを修正
|
||||
- 削除したノートやユーザーがリモートから参照されると復活することがあるのを修正
|
||||
- クライアント: ページ編集時のドロップダウンメニューなどが動作しない問題を修正
|
||||
- クライアント: コントロールパネルのカスタム絵文字タブが切り替わらないように見える問題を修正
|
||||
- API: ユーザー情報の hasUnreadChannel が常に false になっている問題を修正
|
||||
|
||||
## 12.94.1 (2021/10/25)
|
||||
|
||||
### Improvements
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: ユーザーページのナビゲーションが失敗する問題を修正
|
||||
|
||||
## 12.94.0 (2021/10/25)
|
||||
|
||||
### Improvements
|
||||
- クライアント: 画像ビューアを強化
|
||||
- クライアント: メンションにユーザーのアバターを表示するように
|
||||
- クライアント: デザインの調整
|
||||
- クライアント: twemojiをセルフホスティングするように
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: CWで画像が隠されたとき、画像の高さがおかしいことになる問題を修正
|
||||
|
||||
### NOTE
|
||||
- このバージョンから、iOS 15未満のサポートがされなくなります。対象のバージョンをお使いの方は、iOSのバージョンアップを行ってください。
|
||||
|
||||
## 12.93.2 (2021/10/23)
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: ウィジェットを追加できない問題を修正
|
||||
|
||||
## 12.93.1 (2021/10/23)
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: 通知上でローカルのリアクションが表示されないのを修正
|
||||
|
||||
## 12.93.0 (2021/10/23)
|
||||
|
||||
### Improvements
|
||||
- クライアント: コントロールパネルのパフォーマンスを改善
|
||||
- クライアント: 自分のリアクション一覧を見れるように
|
||||
- 設定により、リアクション一覧を全員に公開することも可能
|
||||
- クライアント: ユーザー検索の精度を強化
|
||||
- クライアント: 新しいライトテーマを追加
|
||||
- クライアント: 新しいダークテーマを追加
|
||||
- API: ユーザーのリアクション一覧を取得する users/reactions を追加
|
||||
- API: users/search および users/search-by-username-and-host を強化
|
||||
- ミュート及びブロックのインポートを行えるように
|
||||
- クライアント: /share のクエリでリプライやファイル等の情報を渡せるように
|
||||
- チャートのsyncを毎日0時に自動で行うように
|
||||
|
||||
### Bugfixes
|
||||
- クライアント: テーマの管理が行えない問題を修正
|
||||
- API: アプリケーション通知が取得できない問題を修正
|
||||
- クライアント: リモートノートで意図せずローカルカスタム絵文字が使われてしまうことがあるのを修正
|
||||
- ActivityPub: not reacted な Undo.Like がinboxに滞留するのを修正
|
||||
|
||||
### Changes
|
||||
- 連合の考慮に問題があることなどが分かったため、モデレーターをブロックできない仕様を廃止しました
|
||||
- データベースにログを保存しないようになりました
|
||||
- ログを永続化したい場合はsyslogを利用してください
|
||||
|
||||
## 12.92.0 (2021/10/16)
|
||||
|
||||
### Improvements
|
||||
- アカウント登録にメールアドレスの設定を必須にするオプション
|
||||
- クライアント: 全体的なUIのブラッシュアップ
|
||||
- クライアント: MFM関数構文のサジェストを実装
|
||||
- クライアント: ノート本文を投稿フォーム内でプレビューできるように
|
||||
- クライアント: 未読の通知のみ表示する機能
|
||||
- クライアント: 通知ページで通知の種類によるフィルタ
|
||||
- クライアント: アニメーションを減らす設定の適用範囲を拡充
|
||||
- クライアント: 新しいダークテーマを追加
|
||||
- クライアント: テーマコンパイラに hue と saturate 関数を追加
|
||||
- ActivityPub: HTML -> MFMの変換を強化
|
||||
- API: グループから抜ける users/groups/leave エンドポイントを実装
|
||||
- API: i/notifications に unreadOnly オプションを追加
|
||||
- API: ap系のエンドポイントをログイン必須化+レートリミット追加
|
||||
- MFM: Add tag syntaxes of bold <b></b> and strikethrough <s></s>
|
||||
|
||||
### Bugfixes
|
||||
- Fix createDeleteAccountJob
|
||||
- admin inbox queue does not show individual jobs
|
||||
- クライアント: ヘッダーのタブが折り返される問題を修正
|
||||
- クライアント: ヘッダーにタブが表示されている状態でタイトルをクリックしたときにタブ選択が表示されるのを修正
|
||||
- クライアント: ユーザーページのタブが機能していない問題を修正
|
||||
- クライアント: ピン留めユーザーの設定項目がない問題を修正
|
||||
- クライアント: Deck UIにおいて、重ねたカラムの片方を畳んだ状態で右に出すと表示が壊れる問題を修正
|
||||
- API: 管理者およびモデレーターをブロックできてしまう問題を修正
|
||||
- MFM: Mentions in the link label are parsed as text
|
||||
- MFM: Add a property to the URL node indicating whether it was enclosed in <>
|
||||
- MFM: Disallows < and > in hashtags
|
||||
|
||||
### Changes
|
||||
- 保守性やユーザビリティの観点から、Misskeyのコマンドラインオプションが削除されました。
|
||||
- 必要であれば、代わりに環境変数で設定することができます
|
||||
- MFM: パフォーマンス、保守性、構文誤認識抑制の観点から、旧関数構文のサポートが削除されました。
|
||||
- 旧構文(`[foo bar]`)を使用せず、現行の構文(`$[foo bar]`)を使用してください。
|
||||
|
||||
## 12.91.0 (2021/09/22)
|
||||
|
||||
### Improvements
|
||||
- ActivityPub: リモートユーザーのDeleteアクティビティに対応
|
||||
- ActivityPub: add resolver check for blocked instance
|
||||
- ActivityPub: deliverキューのメモリ使用量を削減
|
||||
- API: 管理者用アカウント削除APIを実装(/admin/accounts/delete)
|
||||
- リモートユーザーの削除も可能に
|
||||
- アカウントが凍結された場合に、凍結された旨を表示してからログアウトするように
|
||||
- 凍結されたアカウントにログインしようとしたときに、凍結されている旨を表示するように
|
||||
- リスト、アンテナタイムラインを個別ページとして分割
|
||||
- UIの改善
|
||||
- MFMにsparklesエフェクトを追加
|
||||
- 非ログイン自は更新ダイアログを出さないように
|
||||
- クライアント起動時、アップデートが利用可能な場合エラー表示およびダイアログ表示しないように
|
||||
|
||||
### Bugfixes
|
||||
- アカウントデータのエクスポート/インポート処理ができない問題を修正
|
||||
- アンテナの既読が付かない問題を修正
|
||||
- popupで設定ページを表示すると、アカウントの削除ページにアクセスすることができない問題を修正
|
||||
- "問題が発生しました"ウィンドウを開くと☓ボタンがなくて閉じれない問題を修正
|
||||
|
||||
## 12.90.1 (2021/09/05)
|
||||
|
||||
### Bugfixes
|
||||
- Dockerfileを修正
|
||||
- ノート翻訳時に公開範囲が考慮されていない問題を修正
|
||||
|
||||
## 12.90.0 (2021/09/04)
|
||||
|
||||
### Improvements
|
||||
- 藍モード、および藍ウィジェット
|
||||
- クライアントに藍ちゃんを召喚することができるようになりました。
|
||||
- URLからのアップロード, APの添付ファイル, 外部ファイルのプロキシ等では、Privateアドレス等へのリクエストは拒否されるようになりました。
|
||||
- developmentで動作している場合は、この制限は適用されません。
|
||||
- Proxy使用時には、この制限は適用されません。
|
||||
Proxy使用時に同等の制限を行いたい場合は、Proxy側で設定を行う必要があります。
|
||||
- `default.yml`にて`allowedPrivateNetworks`にCIDRを追加することにより、宛先ネットワークを指定してこの制限から除外することが出来ます。
|
||||
- アップロード, ダウンロード出来るファイルサイズにハードリミットが適用されるようになりました。(約250MB)
|
||||
- `default.yml`にて`maxFileSize`を変更することにより、制限値を変更することが出来ます。
|
||||
|
||||
### Bugfixes
|
||||
- 管理者が最初にサインアップするページでログインされないのを修正
|
||||
- CWを維持する設定を復活
|
||||
- クライアントの表示を修正
|
||||
|
||||
## 12.89.2 (2021/08/24)
|
||||
|
||||
### Bugfixes
|
||||
- カスタムCSSを有効にしているとエラーになる問題を修正
|
||||
|
||||
## 12.89.1 (2021/08/24)
|
||||
|
||||
### Improvements
|
||||
- クライアントのデザインの調整
|
||||
|
||||
### Bugfixes
|
||||
- 翻訳でDeepLのProアカウントに対応していない問題を修正
|
||||
- インスタンス設定でDeepLのAuth Keyが空で表示される問題を修正
|
||||
- セキュリティの向上
|
||||
|
||||
## 12.89.0 (2021/08/21)
|
||||
|
||||
### Improvements
|
||||
- アカウント削除の安定性を向上
|
||||
- 絵文字オートコンプリートの挙動を改修
|
||||
- localStorageのaccountsはindexedDBで保持するように
|
||||
- ActivityPub: ジョブキューの試行タイミングを調整 (#7635)
|
||||
- API: sw/unregisterを追加
|
||||
- ワードミュートのドキュメントを追加
|
||||
- クライアントのデザインの調整
|
||||
- 依存関係の更新
|
||||
|
||||
### Bugfixes
|
||||
- チャンネルを作成しているとアカウントを削除できないのを修正
|
||||
- ノートの「削除して編集」をするとアンケートの選択肢が[object Object]になる問題を修正
|
||||
|
||||
## 12.88.0 (2021/08/17)
|
||||
|
||||
### Features
|
||||
- ノートの翻訳機能を追加
|
||||
- 有効にするには、サーバー管理者がDeepLの無料アカウントを登録し、取得した認証キーを「インスタンス設定 > その他 > DeepL Auth Key」に設定する必要があります。
|
||||
- Misskey更新時にダイアログを表示するように
|
||||
- ジョブキューウィジェットに警報音を鳴らす設定を追加
|
||||
|
||||
### Improvements
|
||||
- ブロックの挙動を改修
|
||||
- ブロックされたユーザーがブロックしたユーザーに対してアクション出来ないようになりました。詳細はドキュメントをご確認ください。
|
||||
- UIデザインの調整
|
||||
- データベースのインデックスを最適化
|
||||
- Proxy使用時にKeep-Aliveをサポート
|
||||
- DNSキャッシュでネガティブキャッシュをサポート
|
||||
- 依存関係の更新
|
||||
|
||||
### Bugfixes
|
||||
- タッチ操作でウィンドウを閉じることができない問題を修正
|
||||
- Renoteされた時刻が投稿された時刻のように表示される問題を修正
|
||||
- コントロールパネルでファイルを削除した際の表示を修正
|
||||
- ActivityPub: 長いユーザーの名前や自己紹介の対応
|
||||
|
||||
## 12.87.0 (2021/08/12)
|
||||
|
||||
### Improvements
|
||||
- 絵文字オートコンプリートで一文字目は最近使った絵文字をサジェストするように
|
||||
- 絵文字オートコンプリートのパフォーマンスを改善
|
||||
- about-misskeyページにドキュメントへのリンクを追加
|
||||
- Docker: Node.jsを16.6.2に
|
||||
- 依存関係の更新
|
||||
- 翻訳の更新
|
||||
|
||||
### Bugfixes
|
||||
- Misskey更新時、テーマキャッシュの影響でスタイルがおかしくなる問題を修正
|
||||
|
||||
## 12.86.0 (2021/08/11)
|
||||
|
||||
### Improvements
|
||||
- ドキュメントの更新
|
||||
- ドキュメントにchangelogを追加
|
||||
- ぼかし効果のオプションを追加
|
||||
- Vueを3.2.1に更新
|
||||
- UIの調整
|
||||
|
||||
### Bugfixes
|
||||
- ハッシュタグ入力が空のときに#が付くのを修正
|
||||
- フォローリクエストのEメール通知を修正
|
1080
CHANGELOG.md
|
@ -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/
|
||||
|
|
338
CONTRIBUTING.md
|
@ -1,43 +1,61 @@
|
|||
# Contribution guide
|
||||
We're glad you're interested in contributing to Foundkey! In this document you will find the information you need to contribute to the project.
|
||||
We're glad you're interested in contributing Misskey! In this document you will find the information you need to contribute to the project.
|
||||
|
||||
The project uses English as its primary language. However due to being a fork of Misskey (which uses Japanese as its primary language) you may find things that are in Japanese.
|
||||
If you make contributions (pull requests, commits, comments in newly added code etc.) we expect that these should be in English.
|
||||
> **Note**
|
||||
> This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.**
|
||||
> Also, you might receive comments on your Issue/PR in Japanese, but you do not need to reply to them in Japanese as well.\
|
||||
> The accuracy of machine translation into Japanese is not high, so it will be easier for us to understand if you write it in the original language.
|
||||
> It will also allow the reader to use the translation tool of their preference if necessary.
|
||||
|
||||
We won't mind if issues are not in English but we cannot guarantee we will understand you correctly.
|
||||
However it might stíll be better if you write issues in your original language if you are not confident of your English skills because we might be able to use different translators or ask people to translate if we are not sure what you mean.
|
||||
Please understand that in such cases we might edit your issue to translate it, to help us avoid duplicating issues.
|
||||
|
||||
## 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.
|
||||
Before creating an issue, please check the following:
|
||||
- To avoid duplication, please search for similar issues before creating a new issue.
|
||||
- Do not use Issues to ask questions or troubleshooting.
|
||||
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
||||
- Please ask questions or troubleshooting in the [Misskey Forum](https://forum.misskey.io/) or [Discord](https://discord.gg/Wp8gVStHW3).
|
||||
|
||||
Please do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
||||
> **Warning**
|
||||
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
||||
|
||||
## Before implementation
|
||||
When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the PR will not be merged even if it is implemented.
|
||||
|
||||
At this point, you also need to clarify the goals of the PR you will create, and make sure that the other members of the team are aware of them.
|
||||
PRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review.
|
||||
|
||||
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work.
|
||||
|
||||
## Well-known branches
|
||||
branch|what it's for
|
||||
---|---
|
||||
main|development branch
|
||||
- **`master`** branch is tracking the latest release and used for production purposes.
|
||||
- **`develop`** branch is where we work for the next release.
|
||||
- When you create a PR, basically target it to this branch.
|
||||
- **`l10n_develop`** branch is reserved for localization management.
|
||||
|
||||
For a production environment you might not want to follow the `main` branch directly but instead check out one of the git tags.
|
||||
## Creating a PR
|
||||
Thank you for your PR! Before creating a PR, please check the following:
|
||||
- If possible, prefix the title with a keyword that identifies the type of this PR, as shown below.
|
||||
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc
|
||||
- Also, make sure that the granularity of this PR is appropriate. Please do not include more than one type of change or interest in a single PR.
|
||||
- If there is an Issue which will be resolved by this PR, please include a reference to the Issue in the text.
|
||||
- Please add the summary of the changes to [`CHANGELOG.md`](/CHANGELOG.md). However, this is not necessary for changes that do not affect the users, such as refactoring.
|
||||
- Check if there are any documents that need to be created or updated due to this change.
|
||||
- If you have added a feature or fixed a bug, please add a test case if possible.
|
||||
- Please make sure that tests and Lint are passed in advance.
|
||||
- You can run it with `npm run test` and `npm run lint`. [See more info](#testing)
|
||||
- If this PR includes UI changes, please attach a screenshot in the text.
|
||||
|
||||
## Considerations to be made for all contributions
|
||||
Thanks for your cooperation 🤗
|
||||
|
||||
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.
|
||||
|
||||
Some more points you might want to consider are:
|
||||
## Reviewers guide
|
||||
Be willing to comment on the good points and not just the things you want fixed 💯
|
||||
|
||||
### Review perspective
|
||||
- Scope
|
||||
- Are the goals of the PR clear?
|
||||
- Is the granularity of the PR appropriate?
|
||||
- Are the goals of the PR clear?
|
||||
- Is the granularity of the PR appropriate?
|
||||
- Security
|
||||
- Does merging this PR create a vulnerability?
|
||||
- Performance
|
||||
|
@ -48,137 +66,93 @@ Some more points you might want to consider are:
|
|||
- Are there any omissions or gaps?
|
||||
- Does it check for anomalies?
|
||||
|
||||
## Code contributions
|
||||
|
||||
There are different "rules" of how you can contribute, depending on your access privileges to the repository.
|
||||
|
||||
### Without push access
|
||||
|
||||
If you do not have push access, you have to create a pull request to get your changes into Foundkey.
|
||||
Someone with push access should review your contribution.
|
||||
If they are satisfied that what you are doing seems like a good idea and the considerations from the section above are fulfilled, they can merge your pull request.
|
||||
Or, they might request another member to also review your changes.
|
||||
Please be patient as nobody is getting paid to do this, so it might take a bit longer.
|
||||
|
||||
### With push access
|
||||
|
||||
You can push stuff directly to any branch.
|
||||
But y'know, "with great power comes great responsibility" and so on, be sensible.
|
||||
We most likely will not kick you out if you made a mistake, it happens to the best.
|
||||
But this of course means that the erroneous contributions may be either fixed or undone.
|
||||
|
||||
Alternatively, you can also proceed as for "without push access" above.
|
||||
In this case it will be assumed that you wish for a review of the changes you want to make.
|
||||
Instead of having someone else merge the pull request when they have approved your changes, you can also merge yourself if you think the given feedback is sufficient.
|
||||
|
||||
### Changelog Trailer
|
||||
|
||||
To keep track of changes that should go into the CHANGELOG, we use a standard [trailer](https://git-scm.com/docs/git-interpret-trailers).
|
||||
For single-commits that should be included in the changeset, include the trailer directly.
|
||||
For multiple commits, the merge commit (in case of a branch) or an empty final commit should include the trailer.
|
||||
|
||||
Valid values for the trailer are: "Added", "Changed", "Removed", "Fixed", "Security".
|
||||
For breaking changes, include a "BREAKING:" in the summary.
|
||||
Any additional notes should go into the commit body.
|
||||
|
||||
If you forget to include it, you can create an empty commit after the fact with it (`--allow-empty`).
|
||||
Try not to include invalid values in the trailer.
|
||||
|
||||
Here is an example complete breaking commit with notes.
|
||||
|
||||
## Deploy
|
||||
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
||||
```
|
||||
BREAKING: client: remove rooms
|
||||
|
||||
Rooms were removed by syuilo some time ago.
|
||||
This commit is an example of what the changelog trailer usage is like.
|
||||
Admins should ensure to run migrations on startup, else foundkey will fail to start.
|
||||
|
||||
Changelog: Removed
|
||||
/deploy sha=<commit hash>
|
||||
```
|
||||
An actual domain will be assigned so you can test the federation.
|
||||
|
||||
### Creating a PR
|
||||
|
||||
- Please prefix the title with the part of FoundKey you are changing, i.e. `server:` or `client:`
|
||||
- The rest of the title should roughly describe what you did.
|
||||
- Make sure that the granularity of this PR is appropriate. Please do not include more than one type of change in a single PR.
|
||||
- If there is an issue which will be resolved by this PR, please include a reference to the Issue in the text.
|
||||
- If you have added a feature or fixed a bug, please add a test case if possible.
|
||||
- Please make sure that tests and Lint are passed in advance.
|
||||
- You can run it with `npm run test` and `npm run lint`. [See more info](#testing)
|
||||
- Don't forget to update the changelog and/or documentation as appropriate (see above).
|
||||
|
||||
Thanks for your cooperation!
|
||||
## Merge
|
||||
For now, basically only @syuilo has the authority to merge PRs into develop because he is most familiar with the codebase.
|
||||
However, minor fixes, refactoring, and urgent changes may be merged at the discretion of a contributor.
|
||||
|
||||
## Release
|
||||
### Release Instructions
|
||||
1. Commit version changes in the `develop` branch ([package.json](https://github.com/misskey-dev/misskey/blob/develop/package.json))
|
||||
2. Create a release PR.
|
||||
- Into `master` from `develop` branch.
|
||||
- The title must be in the format `Release: x.y.z`.
|
||||
- `x.y.z` is the new version you are trying to release.
|
||||
3. Deploy and perform a simple QA check. Also verify that the tests passed.
|
||||
4. Merge it.
|
||||
5. Create a [release of GitHub](https://github.com/misskey-dev/misskey/releases)
|
||||
- The target branch must be `master`
|
||||
- The tag name must be the version
|
||||
|
||||
### Fork transition
|
||||
## Localization (l10n)
|
||||
Misskey uses [Crowdin](https://crowdin.com/project/misskey) for localization management.
|
||||
You can improve our translations with your Crowdin account.
|
||||
Your changes in Crowdin are automatically submitted as a PR (with the title "New Crowdin translations") to the repository.
|
||||
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
|
||||
|
||||
**Note:**
|
||||
Since Foundkey was forked from Misskey recently, there might be some breaking changes we want to make.
|
||||
For this purpose there will be several pre-release versions of 13.0.0 (e.g. `13.0.0-preview1`).
|
||||
Until major version 13 is released, the below process is not fully in effect.
|
||||
If your language is not listed in Crowdin, please open an issue.
|
||||
|
||||
### Release process
|
||||
Before a stable version is released, there should be a comment period which should usually be 7 days to give everyone the chance to comment.
|
||||
If a (critical) bug or similar is found during the comment period, the release may be postponed until a fix is found.
|
||||
For commenting, an issue should be created, and the comment period should also be announced in the `#foundkey-dev` [IRC](https://irc.akkoma.dev) channel.
|
||||
|
||||
Pre-releases do not require as much scrutiny and can be useful for "field testing" before a stable release is made.
|
||||
|
||||
All releases are managed as git tags.
|
||||
If the released version is 1.2.3, the git tag should be "v1.2.3".
|
||||
Pre-releases are marked "previewN".
|
||||
The first pre-release for 1.2.3 should be tagged "v1.2.3-preview1".
|
||||
The tag should be a "lightweight" tag (not annotated) of the commit that modifies the CHANGELOG and package.json version.
|
||||
|
||||
To generate the changelog, we use a standard shortlog command: `git shortlog --format='%h %s' --group=trailer:changelog LAST_TAG..`.
|
||||
The person performing the release process should build the next CHANGELOG section based on this output, not use it as-is.
|
||||
Full releases should also remove any pre-release CHANGELOG sections.
|
||||
|
||||
Here is the step by step checklist:
|
||||
1. If **stable** release, announce the comment period. Restart the comment period if a blocker bug is found and fixed.
|
||||
2. Edit various `package.json`s to the new version.
|
||||
3. Write a new entry into the changelog.
|
||||
You should use the `git shortlog --format='%h %s' --group=trailer:changelog LAST_TAG..` command to get general data,
|
||||
then rewrite it in a human way.
|
||||
4. Tag the commit with the changes in 2 and 3 (if together, else the latter).
|
||||
|
||||
## Translation
|
||||
|
||||
[](http://translate.akkoma.dev/engage/foundkey/)
|
||||
|
||||
<small>a.k.a. Localization (l10n) or Internationalization (i18n)</small>
|
||||
|
||||
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.
|
||||

|
||||
|
||||
## Development
|
||||
During development, it is useful to use the `npm run dev` command.
|
||||
This command monitors the server-side and client-side source files and automatically builds them if they are modified.
|
||||
In addition, it will also automatically start the Misskey server process.
|
||||
|
||||
## Testing
|
||||
- Test codes are located in [`/test`](/test).
|
||||
|
||||
### Run test
|
||||
Create a config file.
|
||||
```
|
||||
cp test/test.yml .config/
|
||||
```
|
||||
Prepare DB/Redis for testing.
|
||||
```
|
||||
docker-compose -f test/docker-compose.yml up
|
||||
```
|
||||
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
|
||||
|
||||
Run all test.
|
||||
```
|
||||
npm run test
|
||||
```
|
||||
|
||||
#### Run specify test
|
||||
```
|
||||
npx cross-env TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" npx mocha test/foo.ts --require ts-node/register
|
||||
```
|
||||
|
||||
### e2e tests
|
||||
TODO
|
||||
|
||||
## Continuous integration
|
||||
Misskey uses GitHub Actions for executing automated tests.
|
||||
Configuration files are located in [`/.github/workflows`](/.github/workflows).
|
||||
|
||||
## Vue
|
||||
Misskey uses Vue(v3) as its front-end framework.
|
||||
- Use TypeScript functionality.
|
||||
- Use the type only variant of `defineProps` and `defineEmits`.
|
||||
- When creating a new component, please use the Composition API (with [setup sugar](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref sugar](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.
|
||||
- Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are welcome.
|
||||
You might be able to use this shell command to find components that have not yet been refactored: `find packages/client/src -name '*.vue' | xargs grep '<script' | grep -v 'setup'`
|
||||
- Use TypeScript.
|
||||
- **When creating a new component, please use the Composition API (with [setup sugar](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref sugar](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.**
|
||||
- Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are also welcome.
|
||||
|
||||
## Notes
|
||||
### How to resolve `yarn.lock` conflicts?
|
||||
### How to resolve conflictions occurred at yarn.lock?
|
||||
|
||||
Just execute `yarn` to fix it.
|
||||
|
||||
### Use `insert` instead of `save` to create new objects
|
||||
When using `save`, you may accidentally update an existing item, because `save` circumvents uniqueness constraints.
|
||||
### INSERTするときにはsaveではなくinsertを使用する
|
||||
#6441
|
||||
|
||||
See also <https://github.com/misskey-dev/misskey/issues/6441>.
|
||||
|
||||
### typeorm placeholders
|
||||
The names of placeholders used in queries must be unique in each query.
|
||||
|
||||
For example
|
||||
### placeholder
|
||||
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
|
||||
例えば
|
||||
``` ts
|
||||
query.andWhere(new Brackets(qb => {
|
||||
for (const type of ps.fileType) {
|
||||
|
@ -186,8 +160,8 @@ query.andWhere(new Brackets(qb => {
|
|||
}
|
||||
}));
|
||||
```
|
||||
would mean that `type` is used multiple times because it is used in a loop.
|
||||
This is incorrect. instead you would need to do something like the following:
|
||||
と書くと、ループ中で`type`というプレースホルダが複数回使われてしまいおかしくなる
|
||||
だから次のようにする必要がある
|
||||
```ts
|
||||
query.andWhere(new Brackets(qb => {
|
||||
for (const type of ps.fileType) {
|
||||
|
@ -197,88 +171,82 @@ query.andWhere(new Brackets(qb => {
|
|||
}));
|
||||
```
|
||||
|
||||
### `null` (JS/TS) and `NULL` (SQL)
|
||||
#### in TypeORM FindOptions
|
||||
Using the JavaScript/TypeScript `null` constant is not supported in Typeorm. Instead you need to use the special `Null()` function Typeorm provides.
|
||||
It can also be combined with other similar TypeORM functions.
|
||||
|
||||
For example to make a condition similar to SQL `IS NOT NULL`, do the following:
|
||||
### Not `null` in TypeORM
|
||||
```ts
|
||||
const foo = await Foos.findOne({
|
||||
bar: Not(null)
|
||||
});
|
||||
```
|
||||
のようなクエリ(`bar`が`null`ではない)は期待通りに動作しない。
|
||||
次のようにします:
|
||||
```ts
|
||||
import { IsNull, Not } from 'typeorm';
|
||||
|
||||
const foo = await Foos.findOne({
|
||||
bar: Not(IsNull())
|
||||
});
|
||||
```
|
||||
|
||||
#### in SQL queries or `QueryBuilder`s
|
||||
In SQL statements, you need to have separate statements for cases where parameters may be `null`.
|
||||
|
||||
Take for example this snippet:
|
||||
### `null` in SQL
|
||||
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
|
||||
例えば
|
||||
``` ts
|
||||
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||
```
|
||||
If `ps.folderId === null`, the resulting query would be `file.folderId = null` which is incorrect and might produce unexpected results.
|
||||
|
||||
What you need to do instead is something like the following:
|
||||
という処理で、`ps.folderId`が`null`だと結果的に`file.folderId = null`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||
だから次のようにする必要がある
|
||||
``` ts
|
||||
if (ps.folderId != null) {
|
||||
if (ps.folderId) {
|
||||
query.where('file.folderId = :folderId', { folderId: ps.folderId });
|
||||
} else {
|
||||
query.where('file.folderId IS NULL');
|
||||
}
|
||||
```
|
||||
|
||||
### Empty array handling in TypeORM FindOptions
|
||||
If you are using the `In` function in `FindOptions`, there must be different behaviour if it may receive empty arrays.
|
||||
|
||||
### `[]` in SQL
|
||||
SQLを発行する際、`IN`のパラメータが`[]`(空の配列)になる可能性のある場合はSQL文を出し分けなければならない
|
||||
例えば
|
||||
``` ts
|
||||
const users = await Users.find({
|
||||
id: In(userIds)
|
||||
});
|
||||
```
|
||||
This would produce erroneous SQL, i.e. `user.id IN ()`.
|
||||
To fix this you would need separate handling for an empty array, for example like this:
|
||||
という処理で、`userIds`が`[]`だと結果的に`user.id IN ()`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
|
||||
だから次のようにする必要がある
|
||||
``` ts
|
||||
const users = userIds.length > 0 ? await Users.find({
|
||||
id: In(userIds)
|
||||
}) : [];
|
||||
```
|
||||
|
||||
### typeorm: selecting only specific columns
|
||||
### 配列のインデックス in SQL
|
||||
SQLでは配列のインデックスは**1始まり**。
|
||||
`[a, b, c]`の `a`にアクセスしたいなら`[0]`ではなく`[1]`と書く
|
||||
|
||||
If you select specific columns of a table only, you will probably not be able to use the usual `getOne`, `getMany` etc.
|
||||
Instead you might want to try using `getRawOne` and `getRawMany`.
|
||||
For that, you may also want to add aliases to the columns you select, which can be done using the second parameter of `select` or `addSelect`.
|
||||
### null IN
|
||||
nullが含まれる可能性のあるカラムにINするときは、そのままだとおかしくなるのでORなどでnullのハンドリングをしよう。
|
||||
|
||||
### Array indexing in SQL
|
||||
PostgreSQL array indices **start at 1**.
|
||||
### `undefined`にご用心
|
||||
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
|
||||
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
|
||||
|
||||
### `NULL IN ...`
|
||||
When `IN` is performed on a column that may contain `NULL` values, use `OR` or similar to handle `NULL` values.
|
||||
|
||||
### creating migrations
|
||||
First make changes to the entity files in `packages/backend/src/models/entities/`.
|
||||
|
||||
Then, in `packages/backend`, run:
|
||||
### Migration作成方法
|
||||
packages/backendで:
|
||||
```sh
|
||||
yarn build
|
||||
npx typeorm migration:generate -d ormconfig.js -o <migration name>
|
||||
```
|
||||
|
||||
After generating (and potentially editing) the file, move it to the `packages/backend/migration` folder.
|
||||
- 生成後、ファイルをmigration下に移してください
|
||||
- 作成されたスクリプトは不必要な変更を含むため除去してください
|
||||
|
||||
### `markRaw` for connections
|
||||
When setting up a foundkey-js streaming connection as a data option to a Vue component, be sure to wrap it in `markRaw`.
|
||||
Unnecessarily reactivating a connection causes problems with processing in foundkey-js and leads to performance issues.
|
||||
This does not apply when using the Composition API since reactivation is manual.
|
||||
### コネクションには`markRaw`せよ
|
||||
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
|
||||
|
||||
### JSON imports
|
||||
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.
|
||||
### JSONのimportに気を付けよう
|
||||
TypeScriptでjsonをimportすると、tscでコンパイルするときにそのjsonファイルも一緒にdistディレクトリに吐き出されてしまう。この挙動により、意図せずファイルの書き換えが発生することがあるので、jsonをimportするときは書き換えられても良いものかどうか確認すること。書き換えされて欲しくない場合は、importで読み込むのではなく、`fs.readFileSync`などの関数を使って読み込むようにすればよい。
|
||||
|
||||
### 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.
|
||||
### コンポーネントのスタイル定義でmarginを持たせない
|
||||
コンポーネント自身がmarginを設定するのは問題の元となることはよく知られている
|
||||
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.
|
||||
## その他
|
||||
### HTMLのクラス名で follow という単語は使わない
|
||||
広告ブロッカーで誤ってブロックされる
|
||||
|
|
22
COPYING
|
@ -1,10 +1,10 @@
|
|||
Unless otherwise stated this repository is
|
||||
Copyright © 2014-2022 syuilo and contributors
|
||||
Copyright © 2022-2023 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.)
|
||||
Copyright © 2014-2020 syuilo and contributers
|
||||
|
||||
FoundKey includes several third-party Open-Source softwares.
|
||||
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
||||
|
||||
|
||||
Misskey includes several third-party Open-Source softwares.
|
||||
|
||||
Emoji keywords for Unicode 11 and below by Mu-An Chiou
|
||||
License: MIT
|
||||
|
@ -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/
|
||||
|
|
36
Dockerfile
Normal file
|
@ -0,0 +1,36 @@
|
|||
FROM node:18.0.0-alpine3.15 AS base
|
||||
|
||||
ARG NODE_ENV=production
|
||||
|
||||
WORKDIR /misskey
|
||||
|
||||
ENV BUILD_DEPS autoconf automake file g++ gcc libc-dev libtool make nasm pkgconfig python3 zlib-dev git
|
||||
|
||||
FROM base AS builder
|
||||
|
||||
COPY . ./
|
||||
|
||||
RUN apk add --no-cache $BUILD_DEPS && \
|
||||
git submodule update --init && \
|
||||
yarn install && \
|
||||
yarn build && \
|
||||
rm -rf .git
|
||||
|
||||
FROM base AS runner
|
||||
|
||||
RUN apk add --no-cache \
|
||||
ffmpeg \
|
||||
tini
|
||||
|
||||
ENTRYPOINT ["/sbin/tini", "--"]
|
||||
|
||||
COPY --from=builder /misskey/node_modules ./node_modules
|
||||
COPY --from=builder /misskey/built ./built
|
||||
COPY --from=builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
|
||||
COPY --from=builder /misskey/packages/backend/built ./packages/backend/built
|
||||
COPY --from=builder /misskey/packages/client/node_modules ./packages/client/node_modules
|
||||
COPY . ./
|
||||
|
||||
ENV NODE_ENV=production
|
||||
CMD ["npm", "run", "migrateandstart"]
|
||||
|
20
READING.md
|
@ -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 (object–relational 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
|
||||
|
||||
|
|
60
README.md
|
@ -1,21 +1,55 @@
|
|||
<div align="center"><img src="./logo.svg" height="200" alt="Foundkey logo, an owl holding a key"/></div>
|
||||
<div align="center">
|
||||
<a href="https://misskey-hub.net">
|
||||
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="400"/>
|
||||
</a>
|
||||
|
||||
**🌎 **[Misskey](https://misskey-hub.net/)** is an open source, decentralized social media platform that's free forever! 🚀**
|
||||
|
||||
---
|
||||
|
||||
# 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.
|
||||
<a href="https://misskey-hub.net/instances.html">
|
||||
<img src="https://custom-icon-badges.herokuapp.com/badge/find_an-instance-acea31?logoColor=acea31&style=for-the-badge&logo=misskey&labelColor=363B40" alt="find an instance"/></a>
|
||||
|
||||
Forked from Misskey, FoundKey improves on maintainability and behaviour, while also bringing in useful features.
|
||||
<a href="https://misskey-hub.net/docs/install.html">
|
||||
<img src="https://custom-icon-badges.herokuapp.com/badge/create_an-instance-FBD53C?logoColor=FBD53C&style=for-the-badge&logo=server&labelColor=363B40" alt="create an instance"/></a>
|
||||
|
||||
See the [changelog](./CHANGELOG.md) and [roadmap](./ROADMAP.md) for more on what's changed and future plans.
|
||||
<a href="./CONTRIBUTING.md">
|
||||
<img src="https://custom-icon-badges.herokuapp.com/badge/become_a-contributor-A371F7?logoColor=A371F7&style=for-the-badge&logo=git-merge&labelColor=363B40" alt="become a contributor"/></a>
|
||||
|
||||
<a href="https://discord.gg/Wp8gVStHW3">
|
||||
<img src="https://custom-icon-badges.herokuapp.com/badge/join_the-community-5865F2?logoColor=5865F2&style=for-the-badge&logo=discord&labelColor=363B40" alt="join the community"/></a>
|
||||
|
||||
<a href="https://www.patreon.com/syuilo">
|
||||
<img src="https://custom-icon-badges.herokuapp.com/badge/become_a-patron-F96854?logoColor=F96854&style=for-the-badge&logo=patreon&labelColor=363B40" alt="become a patron"/></a>
|
||||
|
||||
---
|
||||
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
||||
<a href="https://xn--931a.moe/"><img src="https://github.com/misskey-dev/misskey/blob/develop/assets/ai.png?raw=true" align="right" height="320px"/></a>
|
||||
|
||||
## ✨ Features
|
||||
- **ActivityPub support**\
|
||||
Not on Misskey? No problem! Not only can Misskey instances talk to each other, but you can make friends with people on other networks like Mastodon and Pixelfed!
|
||||
- **Reactions**\
|
||||
You can add emoji reactions to any post! No longer are you bound by a like button, show everyone exactly how you feel with the tap of a button.
|
||||
- **Drive**\
|
||||
With Misskey's built in drive, you get cloud storage right in your social media, where you can upload any files, make folders, and find media from posts you've made!
|
||||
- **Rich Web UI**\
|
||||
Misskey has a rich and easy to use Web UI!
|
||||
It is highly customizable, from changing the layout and adding widgets to making custom themes.
|
||||
Furthermore, plugins can be created using AiScript, an original programming language.
|
||||
- And much more...
|
||||
|
||||
</div>
|
||||
|
||||
<div style="clear: both;"></div>
|
||||
|
||||
## Documentation
|
||||
FoundKey's documentation is a work in progress, which can be found in the `docs/` folder.
|
||||
Feel free to contribute some documentation.
|
||||
|
||||
## Contributing
|
||||
If you're interested in helping out with the project, please read the [contributing guide](./CONTRIBUTING.md).
|
||||
Misskey Documentation can be found at [Misskey Hub](https://misskey-hub.net/), some of the links and graphics above also lead to specific portions of it.
|
||||
|
||||
## 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.
|
||||
|
|
|
@ -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
|
||||
I’ve been thinking about a community misskey fork for a while now. To some of you, this is not a surprise. Let’s talk about that.
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# Reporting Security Issues
|
||||
|
||||
If you discover a security issue in Foundkey, please report it by sending an
|
||||
email to [johann@qwertqwefsday.eu](mailto:johann@qwertqwefsday.eu).
|
||||
If you discover a security issue in Misskey, please report it by sending an
|
||||
email to [syuilotan@yahoo.co.jp](mailto:syuilotan@yahoo.co.jp).
|
||||
|
||||
This will allow us to assess the risk, and make a fix available before we add a
|
||||
bug report to the repository.
|
||||
bug report to the GitHub repository.
|
||||
|
||||
Thanks for helping make Foundkey safe for everyone.
|
||||
Thanks for helping make Misskey safe for everyone.
|
||||
|
|
BIN
assets/about/drive.png
Normal file
After Width: | Height: | Size: 94 KiB |
BIN
assets/about/post.png
Normal file
After Width: | Height: | Size: 317 KiB |
BIN
assets/about/reaction.png
Normal file
After Width: | Height: | Size: 24 KiB |
BIN
assets/about/ui.png
Normal file
After Width: | Height: | Size: 95 KiB |
BIN
assets/ai-orig.png
Normal file
After Width: | Height: | Size: 200 KiB |
BIN
assets/ai.png
Normal file
After Width: | Height: | Size: 235 KiB |
BIN
assets/banner.afdesign
Normal file
BIN
assets/mi-white.afdesign
Normal file
BIN
assets/mi.afdesign
Normal file
BIN
assets/ss/explore.jpg
Normal file
After Width: | Height: | Size: 238 KiB |
BIN
assets/ss/user.jpg
Normal file
After Width: | Height: | Size: 148 KiB |
BIN
assets/title.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
assets/title_float.svg
Normal file
After Width: | Height: | Size: 6.1 KiB |
3
chart/Chart.yaml
Normal file
|
@ -0,0 +1,3 @@
|
|||
apiVersion: v2
|
||||
name: misskey
|
||||
version: 0.0.0
|
165
chart/files/default.yml
Normal file
|
@ -0,0 +1,165 @@
|
|||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Misskey configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
# ┌─────┐
|
||||
#───┘ URL └─────────────────────────────────────────────────────
|
||||
|
||||
# Final accessible URL seen by a user.
|
||||
# url: https://example.tld/
|
||||
|
||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||
# URL SETTINGS AFTER THAT!
|
||||
|
||||
# ┌───────────────────────┐
|
||||
#───┘ Port and TLS settings └───────────────────────────────────
|
||||
|
||||
#
|
||||
# Misskey supports two deployment options for public.
|
||||
#
|
||||
|
||||
# Option 1: With Reverse Proxy
|
||||
#
|
||||
# +----- https://example.tld/ ------------+
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# +---------------------------------------+
|
||||
#
|
||||
# You need to setup reverse proxy. (eg. nginx)
|
||||
# You do not define 'https' section.
|
||||
|
||||
# Option 2: Standalone
|
||||
#
|
||||
# +- https://example.tld/ -+
|
||||
# +------+ | +---------------+ |
|
||||
# | User | ---> | | Misskey (443) | |
|
||||
# +------+ | +---------------+ |
|
||||
# +------------------------+
|
||||
#
|
||||
# You need to run Misskey as root.
|
||||
# You need to set Certificate in 'https' section.
|
||||
|
||||
# To use option 1, uncomment below line.
|
||||
port: 3000 # A port that your Misskey server should listen.
|
||||
|
||||
# To use option 2, uncomment below lines.
|
||||
#port: 443
|
||||
|
||||
#https:
|
||||
# # path for certification
|
||||
# key: /etc/letsencrypt/live/example.tld/privkey.pem
|
||||
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem
|
||||
|
||||
# ┌──────────────────────────┐
|
||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||
|
||||
db:
|
||||
host: localhost
|
||||
port: 5432
|
||||
|
||||
# Database name
|
||||
db: misskey
|
||||
|
||||
# Auth
|
||||
user: example-misskey-user
|
||||
pass: example-misskey-pass
|
||||
|
||||
# Whether disable Caching queries
|
||||
#disableCache: true
|
||||
|
||||
# Extra Connection options
|
||||
#extra:
|
||||
# ssl: true
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
#pass: example-pass
|
||||
#prefix: example-prefix
|
||||
#db: 1
|
||||
|
||||
# ┌─────────────────────────────┐
|
||||
#───┘ Elasticsearch configuration └─────────────────────────────
|
||||
|
||||
#elasticsearch:
|
||||
# host: localhost
|
||||
# port: 9200
|
||||
# ssl: false
|
||||
# user:
|
||||
# pass:
|
||||
|
||||
# ┌───────────────┐
|
||||
#───┘ ID generation └───────────────────────────────────────────
|
||||
|
||||
# You can select the ID generation method.
|
||||
# You don't usually need to change this setting, but you can
|
||||
# change it according to your preferences.
|
||||
|
||||
# Available methods:
|
||||
# aid ... Short, Millisecond accuracy
|
||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||
# ulid ... Millisecond accuracy
|
||||
# objectid ... This is left for backward compatibility
|
||||
|
||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||
# ID SETTINGS AFTER THAT!
|
||||
|
||||
id: "aid"
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
# Whether disable HSTS
|
||||
#disableHsts: true
|
||||
|
||||
# Number of worker processes
|
||||
#clusterLimit: 1
|
||||
|
||||
# Job concurrency per worker
|
||||
# deliverJobConcurrency: 128
|
||||
# inboxJobConcurrency: 16
|
||||
|
||||
# Job rate limiter
|
||||
# deliverJobPerSec: 128
|
||||
# inboxJobPerSec: 16
|
||||
|
||||
# Job attempts
|
||||
# deliverJobMaxAttempts: 12
|
||||
# inboxJobMaxAttempts: 8
|
||||
|
||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||
#outgoingAddressFamily: ipv4
|
||||
|
||||
# Syslog option
|
||||
#syslog:
|
||||
# host: localhost
|
||||
# port: 514
|
||||
|
||||
# Proxy for HTTP/HTTPS
|
||||
#proxy: http://127.0.0.1:3128
|
||||
|
||||
#proxyBypassHosts: [
|
||||
# 'example.com',
|
||||
# '192.0.2.8'
|
||||
#]
|
||||
|
||||
# Proxy for SMTP/SMTPS
|
||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||
|
||||
# Media Proxy
|
||||
#mediaProxy: https://example.com/proxy
|
||||
|
||||
# Sign to ActivityPub GET request (default: false)
|
||||
#signToActivityPubGet: true
|
||||
|
||||
#allowedPrivateNetworks: [
|
||||
# '127.0.0.1/32'
|
||||
#]
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
8
chart/templates/ConfigMap.yml
Normal file
|
@ -0,0 +1,8 @@
|
|||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ include "misskey.fullname" . }}-configuration
|
||||
data:
|
||||
default.yml: |-
|
||||
{{ .Files.Get "files/default.yml"|nindent 4 }}
|
||||
url: {{ .Values.url }}
|
47
chart/templates/Deployment.yml
Normal file
|
@ -0,0 +1,47 @@
|
|||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "misskey.fullname" . }}
|
||||
labels:
|
||||
{{- include "misskey.labels" . | nindent 4 }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "misskey.selectorLabels" . | nindent 6 }}
|
||||
replicas: 1
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "misskey.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
containers:
|
||||
- name: misskey
|
||||
image: {{ .Values.image }}
|
||||
env:
|
||||
- name: NODE_ENV
|
||||
value: {{ .Values.environment }}
|
||||
volumeMounts:
|
||||
- name: {{ include "misskey.fullname" . }}-configuration
|
||||
mountPath: /misskey/.config
|
||||
readOnly: true
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
- name: postgres
|
||||
image: postgres:14-alpine
|
||||
env:
|
||||
- name: POSTGRES_USER
|
||||
value: "example-misskey-user"
|
||||
- name: POSTGRES_PASSWORD
|
||||
value: "example-misskey-pass"
|
||||
- name: POSTGRES_DB
|
||||
value: "misskey"
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
- name: redis
|
||||
image: redis:alpine
|
||||
ports:
|
||||
- containerPort: 6379
|
||||
volumes:
|
||||
- name: {{ include "misskey.fullname" . }}-configuration
|
||||
configMap:
|
||||
name: {{ include "misskey.fullname" . }}-configuration
|
14
chart/templates/Service.yml
Normal file
|
@ -0,0 +1,14 @@
|
|||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "misskey.fullname" . }}
|
||||
annotations:
|
||||
dev.okteto.com/auto-ingress: "true"
|
||||
spec:
|
||||
type: ClusterIP
|
||||
ports:
|
||||
- port: 3000
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "misskey.selectorLabels" . | nindent 4 }}
|
62
chart/templates/_helpers.tpl
Normal file
|
@ -0,0 +1,62 @@
|
|||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "misskey.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "misskey.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "misskey.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "misskey.labels" -}}
|
||||
helm.sh/chart: {{ include "misskey.chart" . }}
|
||||
{{ include "misskey.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "misskey.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "misskey.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "misskey.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "misskey.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
3
chart/values.yml
Normal file
|
@ -0,0 +1,3 @@
|
|||
url: https://example.tld/
|
||||
image: okteto.dev/misskey
|
||||
environment: production
|
4
crowdin.yml
Normal file
|
@ -0,0 +1,4 @@
|
|||
files:
|
||||
- source: /locales/ja-JP.yml
|
||||
translation: /locales/%locale%.yml
|
||||
update_option: update_as_unapproved
|
12
cypress.config.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
import { defineConfig } from 'cypress'
|
||||
|
||||
export default defineConfig({
|
||||
e2e: {
|
||||
// We've imported your old cypress plugins here.
|
||||
// You may want to clean this up later by importing these.
|
||||
setupNodeEvents(on, config) {
|
||||
return require('./cypress/plugins/index.js')(on, config)
|
||||
},
|
||||
baseUrl: 'http://localhost:61812',
|
||||
},
|
||||
})
|
149
cypress/e2e/basic.cy.js
Normal file
|
@ -0,0 +1,149 @@
|
|||
describe('Before setup instance', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.visit('/');
|
||||
});
|
||||
|
||||
it('setup instance', () => {
|
||||
cy.visit('/');
|
||||
|
||||
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
||||
|
||||
cy.get('[data-cy-admin-username] input').type('admin');
|
||||
cy.get('[data-cy-admin-password] input').type('admin1234');
|
||||
cy.get('[data-cy-admin-ok]').click();
|
||||
|
||||
// なぜか動かない
|
||||
//cy.wait('@signup').should('have.property', 'response.statusCode');
|
||||
cy.wait('@signup');
|
||||
});
|
||||
});
|
||||
|
||||
describe('After setup instance', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.visit('/');
|
||||
});
|
||||
|
||||
it('signup', () => {
|
||||
cy.visit('/');
|
||||
|
||||
cy.intercept('POST', '/api/signup').as('signup');
|
||||
|
||||
cy.get('[data-cy-signup]').click();
|
||||
cy.get('[data-cy-signup-username] input').type('alice');
|
||||
cy.get('[data-cy-signup-password] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-submit]').click();
|
||||
|
||||
cy.wait('@signup');
|
||||
});
|
||||
});
|
||||
|
||||
describe('After user signup', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.visit('/');
|
||||
});
|
||||
|
||||
it('signin', () => {
|
||||
cy.visit('/');
|
||||
|
||||
cy.intercept('POST', '/api/signin').as('signin');
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-username] input').type('alice');
|
||||
// Enterキーでサインインできるかの確認も兼ねる
|
||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||
|
||||
cy.wait('@signin');
|
||||
});
|
||||
|
||||
it('suspend', function() {
|
||||
cy.request('POST', '/api/admin/suspend-user', {
|
||||
i: this.admin.token,
|
||||
userId: this.alice.id,
|
||||
});
|
||||
|
||||
cy.visit('/');
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-username] input').type('alice');
|
||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||
|
||||
// TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする
|
||||
cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi);
|
||||
});
|
||||
});
|
||||
|
||||
describe('After user singed in', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
|
||||
cy.login('alice', 'alice1234');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.get('[data-cy-open-post-form]').should('be.visible');
|
||||
});
|
||||
|
||||
it('note', () => {
|
||||
cy.get('[data-cy-open-post-form]').click();
|
||||
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
||||
cy.get('[data-cy-open-post-form-submit]').click();
|
||||
|
||||
cy.contains('Hello, Misskey!');
|
||||
});
|
||||
});
|
||||
|
||||
// TODO: 投稿フォームの公開範囲指定のテスト
|
||||
// TODO: 投稿フォームのファイル添付のテスト
|
||||
// TODO: 投稿フォームのハッシュタグ保持フィールドのテスト
|
65
cypress/e2e/widgets.cy.js
Normal file
|
@ -0,0 +1,65 @@
|
|||
describe('After user signed in', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
cy.viewport('macbook-16');
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
|
||||
cy.login('alice', 'alice1234');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('widget edit toggle is visible', () => {
|
||||
cy.get('.mk-widget-edit').should('be.visible');
|
||||
});
|
||||
|
||||
it('widget select should be visible in edit mode', () => {
|
||||
cy.get('.mk-widget-edit').click();
|
||||
cy.get('.mk-widget-select').should('be.visible');
|
||||
});
|
||||
|
||||
it('first widget should be removed', () => {
|
||||
cy.get('.mk-widget-edit').click();
|
||||
cy.get('.customize-container:first-child .remove._button').click();
|
||||
cy.get('.customize-container').should('have.length', 2);
|
||||
});
|
||||
|
||||
function buildWidgetTest(widgetName) {
|
||||
it(`${widgetName} widget should get added`, () => {
|
||||
cy.get('.mk-widget-edit').click();
|
||||
cy.get('.mk-widget-select select').select(widgetName, { force: true });
|
||||
cy.get('.bg._modalBg.transparent').click({ multiple: true, force: true });
|
||||
cy.get('.mk-widget-add').click({ force: true });
|
||||
cy.get(`.mkw-${widgetName}`).should('exist');
|
||||
});
|
||||
}
|
||||
|
||||
buildWidgetTest('memo');
|
||||
buildWidgetTest('notifications');
|
||||
buildWidgetTest('timeline');
|
||||
buildWidgetTest('calendar');
|
||||
buildWidgetTest('rss');
|
||||
buildWidgetTest('trends');
|
||||
buildWidgetTest('clock');
|
||||
buildWidgetTest('activity');
|
||||
buildWidgetTest('photos');
|
||||
buildWidgetTest('digitalClock');
|
||||
buildWidgetTest('federation');
|
||||
buildWidgetTest('postForm');
|
||||
buildWidgetTest('slideshow');
|
||||
buildWidgetTest('serverMetric');
|
||||
buildWidgetTest('onlineUsers');
|
||||
buildWidgetTest('jobQueue');
|
||||
buildWidgetTest('button');
|
||||
buildWidgetTest('aiscript');
|
||||
buildWidgetTest('aichan');
|
||||
});
|
5
cypress/fixtures/example.json
Normal file
|
@ -0,0 +1,5 @@
|
|||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "hello@cypress.io",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
22
cypress/plugins/index.js
Normal file
|
@ -0,0 +1,22 @@
|
|||
/// <reference types="cypress" />
|
||||
// ***********************************************************
|
||||
// This example plugins/index.js can be used to load plugins
|
||||
//
|
||||
// You can change the location of this file or turn off loading
|
||||
// the plugins file with the 'pluginsFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/plugins-guide
|
||||
// ***********************************************************
|
||||
|
||||
// This function is called when a project is opened or re-opened (e.g. due to
|
||||
// the project's config changing)
|
||||
|
||||
/**
|
||||
* @type {Cypress.PluginConfig}
|
||||
*/
|
||||
// eslint-disable-next-line no-unused-vars
|
||||
module.exports = (on, config) => {
|
||||
// `on` is used to hook into various events Cypress emits
|
||||
// `config` is the resolved Cypress config
|
||||
}
|
55
cypress/support/commands.js
Normal file
|
@ -0,0 +1,55 @@
|
|||
// ***********************************************
|
||||
// This example commands.js shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||
|
||||
Cypress.Commands.add('resetState', () => {
|
||||
cy.window(win => {
|
||||
win.indexedDB.deleteDatabase('keyval-store');
|
||||
});
|
||||
cy.request('POST', '/api/reset-db').as('reset');
|
||||
cy.get('@reset').its('status').should('equal', 204);
|
||||
cy.reload(true);
|
||||
});
|
||||
|
||||
Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
|
||||
const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup';
|
||||
|
||||
cy.request('POST', route, {
|
||||
username: username,
|
||||
password: password,
|
||||
}).its('body').as(username);
|
||||
});
|
||||
|
||||
Cypress.Commands.add('login', (username, password) => {
|
||||
cy.visit('/');
|
||||
|
||||
cy.intercept('POST', '/api/signin').as('signin');
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-username] input').type(username);
|
||||
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
|
||||
|
||||
cy.wait('@signin').as('signedIn');
|
||||
});
|
32
cypress/support/e2e.js
Normal file
|
@ -0,0 +1,32 @@
|
|||
// ***********************************************************
|
||||
// This example support/index.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands'
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
||||
|
||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||
if ([
|
||||
// Chrome
|
||||
'ResizeObserver loop limit exceeded',
|
||||
|
||||
// Firefox
|
||||
'ResizeObserver loop completed with undelivered notifications',
|
||||
].some(msg => err.message.includes(msg))) {
|
||||
return false;
|
||||
}
|
||||
});
|
52
docker-compose.yml
Normal file
|
@ -0,0 +1,52 @@
|
|||
version: "3"
|
||||
|
||||
services:
|
||||
web:
|
||||
build: .
|
||||
restart: always
|
||||
links:
|
||||
- db
|
||||
- redis
|
||||
# - es
|
||||
ports:
|
||||
- "3000:3000"
|
||||
networks:
|
||||
- internal_network
|
||||
- external_network
|
||||
volumes:
|
||||
- ./files:/misskey/files
|
||||
- ./.config:/misskey/.config:ro
|
||||
|
||||
redis:
|
||||
restart: always
|
||||
image: redis:4.0-alpine
|
||||
networks:
|
||||
- internal_network
|
||||
volumes:
|
||||
- ./redis:/data
|
||||
|
||||
db:
|
||||
restart: always
|
||||
image: postgres:12.2-alpine
|
||||
networks:
|
||||
- internal_network
|
||||
env_file:
|
||||
- .config/docker.env
|
||||
volumes:
|
||||
- ./db:/var/lib/postgresql/data
|
||||
|
||||
# es:
|
||||
# restart: always
|
||||
# image: docker.elastic.co/elasticsearch/elasticsearch-oss:6.4.2
|
||||
# environment:
|
||||
# - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
|
||||
# - "TAKE_FILE_OWNERSHIP=111"
|
||||
# networks:
|
||||
# - internal_network
|
||||
# volumes:
|
||||
# - ./elasticsearch:/usr/share/elasticsearch/data
|
||||
|
||||
networks:
|
||||
internal_network:
|
||||
internal: true
|
||||
external_network:
|
25
docs/DONATORS.md
Normal file
|
@ -0,0 +1,25 @@
|
|||
DONATORS
|
||||
========
|
||||
The list of people who have sent donation for Misskey.
|
||||
|
||||
(In random order, honorific titles are omitted.)
|
||||
|
||||
* らふぁ
|
||||
* 俺様
|
||||
* なぎうり
|
||||
* スルメ https://surume.tk/
|
||||
* 藍
|
||||
* 音船 https://otofune.me/
|
||||
* aqz https://misskey.xyz/aqz
|
||||
* kotodu "虚無創作中"
|
||||
* Maya Minatsuki
|
||||
* Knzk https://knzk.me/@Knzk
|
||||
* ねじりわさび https://knzk.me/@y
|
||||
* NCLS https://knzk.me/@imncls]
|
||||
* こじま @skoji@sandbox.skoji.jp
|
||||
|
||||
:heart: Thanks for donating, guys!
|
||||
|
||||
---
|
||||
|
||||
If your name is missing, please contact us!
|
111
docs/emoji.md
|
@ -1,111 +0,0 @@
|
|||
# Managing Custom Emoji
|
||||
|
||||
Custom emoji can be managed by administrators or moderators by going to the instance settings and then the custom emoji submenu.
|
||||
By default you will see a list of the current locally installed emoji.
|
||||
At the start this list will be empty, but you can add custom emoji in different ways.
|
||||
|
||||
## Copying Emoji from another Instance
|
||||
|
||||
Emoji can be easily copied from another instance.
|
||||
To do this, switch to the "remote" tab in the custom emoji settings.
|
||||
You can search emoji by name and/or host they are from.
|
||||
|
||||
When you have found an emoji you want, click it to open a small menu which will allow you to import the emoji.
|
||||
|
||||
Please note that Emoji may be subject to copyright and you are responsible for checking whether you may legally use another emoji.
|
||||
|
||||
## Individual Emoji Import
|
||||
|
||||
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.
|
||||
|
||||
**Warning:**
|
||||
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.
|
||||
|
||||
The emoji will be added to the instance and you will then be able to edit or delete it as usual.
|
||||
|
||||
## Bulk Emoji import
|
||||
|
||||
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:**
|
||||
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
|
||||
|
||||
At the top level is a file called `meta.json` which contains information about the emoji contained in the packed file.
|
||||
A type definition for this file would look like this, where `Meta` is the structure of the whole file.
|
||||
|
||||
```typescript
|
||||
class Meta {
|
||||
metaVersion: number;
|
||||
host: string;
|
||||
/**
|
||||
* Date and time representation returned by ECMAScript `Date.prototype.toString`.
|
||||
*/
|
||||
exportedAt: string;
|
||||
emojis: Emoji[];
|
||||
}
|
||||
|
||||
class Emoji {
|
||||
downloaded: boolean;
|
||||
fileName: string;
|
||||
emoji: {
|
||||
id: string;
|
||||
updatedAt: string;
|
||||
name: string;
|
||||
host: null;
|
||||
category: string;
|
||||
originalUrl: string;
|
||||
publicUrl: string;
|
||||
uri: null;
|
||||
type: string;
|
||||
aliases: string[];
|
||||
};
|
||||
}
|
||||
```
|
||||
|
||||
The fields of `Meta` are currently not used or checked when importing emoji, except for the `emojis` field.
|
||||
|
||||
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.
|
||||
If a previous emoji with the same name exists, it **will be overwritten**!
|
||||
- `category`: category of the emoji
|
||||
- `aliases`: list of strings that should be added as aliases. The admin UI calls these "tags".
|
||||
|
||||
## Editing and Deleting Emoji
|
||||
|
||||
The properties of an emoji can be edited by clicking it in the list of local emoji.
|
||||
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:**
|
||||
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.
|
||||
|
||||
Each emoji can have a name and a category and several tags.
|
||||
The category is used for structuring the emoji picker.
|
||||
Meanwhile the tags can be used as alternate names by which the emoji can be found when searching in the emoji picker.
|
||||
|
||||
When you are done editing, save your changes by clicking the check mark in the top right corner of the dialog.
|
||||
|
||||
### Bulk Editing
|
||||
|
||||
Emoji can be edited in bulk by checking the box below the search field.
|
||||
With this enabled, clicking on an emoji will select it instead of opening the editing dialog.
|
||||
|
||||
The Editing options will be displayed as buttons below the checkbox.
|
||||
To return to the normal behaviour just uncheck the box again.
|
243
docs/install.md
|
@ -1,243 +0,0 @@
|
|||
# FoundKey Setup and Installation Guide
|
||||
|
||||
This guide will assume that you have administrative rights, either as root or a user with sudo permissions. If you are using a non-root user, prefix the commands with `sudo` except when you are logged into the foundkey user with `su`.
|
||||
|
||||
This guide will also assume you're using Debian or a derivative like Ubuntu. If you are using another OS, you will need to adapt the comamnds and package names to match those that your OS uses.
|
||||
|
||||
## Install dependencies
|
||||
FoundKey requires the following packages to run:
|
||||
|
||||
### Dependencies :package:
|
||||
* **[Node.js](https://nodejs.org/en/)** (18.x)
|
||||
* **[PostgreSQL](https://www.postgresql.org/)** (12.x minimum; 13.x+ is preferred)
|
||||
* **[Redis](https://redis.io/)**
|
||||
* **[Yarn](https://yarnpkg.com/)**
|
||||
|
||||
The following are needed to compile native npm modules:
|
||||
* A C/C++ compiler like **GCC** or **Clang**
|
||||
* Build tools like **make**
|
||||
* **[Python](https://python.org/)** (3.x)
|
||||
|
||||
### Optional
|
||||
* [FFmpeg](https://www.ffmpeg.org/)
|
||||
|
||||
To install the dependiencies on Debian (or derivatives like Ubuntu) you can use the following commands:
|
||||
```sh
|
||||
curl -fsSL https://deb.nodesource.com/setup_18.x | bash -
|
||||
apt install build-essential python3 nodejs postgresql redis
|
||||
corepack enable # for yarn
|
||||
|
||||
# Optional dependencies
|
||||
apt install ffmpeg
|
||||
```
|
||||
|
||||
## Create FoundKey user
|
||||
Create a separate non-root user to run FoundKey:
|
||||
|
||||
```sh
|
||||
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.
|
||||
|
||||
First, clone the FoundKey repo:
|
||||
```sh
|
||||
git clone https://akkoma.dev/FoundKeyGang/FoundKey
|
||||
cd 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
|
||||
```
|
||||
|
||||
Updating will be covered in a later section. For now you'll want to install the dependencies using Yarn:
|
||||
```sh
|
||||
yarn install
|
||||
```
|
||||
|
||||
## Configure FoundKey
|
||||
1. Copy `.config/example.yml` to `.config/default.yml`.
|
||||
|
||||
`cp .config/example.yml .config/default.yml`
|
||||
|
||||
2. Edit `default.yml` with a text editor
|
||||
- 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`
|
||||
2. `npx node-gyp build`
|
||||
3. `NODE_ENV=production yarn build`
|
||||
|
||||
## Setting up the database
|
||||
Create the appropriate PostgreSQL users with respective passwords, and empty database as named in the configuration file.
|
||||
|
||||
Make sure the database connection also works correctly when run from the user that will later run FoundKey, or it could cause problems later. The encoding of the database should be UTF-8.
|
||||
|
||||
```sh
|
||||
sudo -u postgres psql
|
||||
```
|
||||
|
||||
```sql
|
||||
create database foundkey with encoding = 'UTF8';
|
||||
create user foundkey with encrypted password '{YOUR_PASSWORD}';
|
||||
grant all privileges on database foundkey to foundkey;
|
||||
\q
|
||||
```
|
||||
|
||||
Next, initialize the database:
|
||||
`yarn run init`
|
||||
|
||||
## Running FoundKey
|
||||
You can either run FoundKey manually or use the system service manager to start FoundKey automatically on startup.
|
||||
|
||||
### Launching manually
|
||||
Run `NODE_ENV=production npm start` to launch FoundKey manually. To stop the server, use Ctrl-C.
|
||||
|
||||
### Launch with systemd
|
||||
|
||||
Run `systemctl edit --full --force foundkey.service`, and paste the following:
|
||||
|
||||
```ini
|
||||
[Unit]
|
||||
Description=FoundKey daemon
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=foundkey
|
||||
ExecStart=/usr/bin/npm start
|
||||
WorkingDirectory=/home/foundkey/FoundKey
|
||||
Environment="NODE_ENV=production"
|
||||
TimeoutSec=60
|
||||
StandardOutput=syslog
|
||||
StandardError=syslog
|
||||
SyslogIdentifier=foundkey
|
||||
Restart=always
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
|
||||
Save the file, then enable and start FoundKey.
|
||||
```sh
|
||||
systemctl enable --now foundkey
|
||||
```
|
||||
|
||||
You can check if the service is running with `systemctl status foundkey`.
|
||||
|
||||
### Launch with OpenRC
|
||||
|
||||
Copy the following text to `/etc/init.d/foundkey`:
|
||||
|
||||
```sh
|
||||
#!/sbin/openrc-run
|
||||
|
||||
name=foundkey
|
||||
description="FoundKey daemon"
|
||||
|
||||
command="/usr/bin/npm"
|
||||
command_args="start"
|
||||
command_user="foundkey"
|
||||
|
||||
supervisor="supervise-daemon"
|
||||
supervise_daemon_args=" -d /home/foundkey/FoundKey -e NODE_ENV=\"production\""
|
||||
|
||||
pidfile="/run/${RC_SVCNAME}.pid"
|
||||
|
||||
depend() {
|
||||
need net
|
||||
use logger
|
||||
|
||||
# alternatively, uncomment if using nginx reverse proxy
|
||||
#use logger nginx
|
||||
}
|
||||
```
|
||||
|
||||
Mark the script as executable and enable the service to start on boot:
|
||||
|
||||
```sh
|
||||
chmod +x /etc/init.d/foundkey
|
||||
rc-update add foundkey
|
||||
```
|
||||
|
||||
Start the FoundKey service:
|
||||
|
||||
```sh
|
||||
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
|
||||
```
|
||||
|
||||
Now you'll want to update your dependencies and rebuild:
|
||||
```sh
|
||||
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
|
||||
```
|
||||
|
||||
Then restart FoundKey if it's still running.
|
||||
```sh
|
||||
# Systemd
|
||||
systemctl restart foundkey
|
||||
|
||||
# OpenRC
|
||||
rc-service foundkey restart
|
||||
```
|
||||
|
||||
If you encounter any problems with updating, please try the following:
|
||||
1. `yarn clean` or `yarn cleanall`
|
||||
2. Retry update (Don't forget `yarn install`)
|
||||
|
||||
## Need Help?
|
||||
If you have any questions or troubles, feel free to contact us on IRC: `#foundkey` on `irc.akkoma.dev`, port `6697` with SSL
|
|
@ -1,80 +0,0 @@
|
|||
# Migrating to FoundKey
|
||||
|
||||
Migrating from Misskey to FoundKey is relatively straightforward. However, additional steps are required as there are significant changes between the two projects.
|
||||
|
||||
## Backup
|
||||
The process will take some time and it's possible something will go wrong. It's highly suggested to make a database dump using `pgdump` and backing up `.config/default.yml` and the `files/` directory before proceeding any further.
|
||||
|
||||
## Requirements
|
||||
FoundKey has different version requirements compared to Misskey. Before continuing please check if you have the following minimum versions installed:
|
||||
* Node (version 18)
|
||||
* Postgresql (version 12)
|
||||
|
||||
## Reverting migrations
|
||||
If you're migrating from Misskey 12.112.0 or higher, you'll need to revert some database migrations as they have diverged from that point. Specifically, you'll need to revert `nsfwDetection1655368940105` and newer migrations.
|
||||
|
||||
Run the following to revert those migrations:
|
||||
```sh
|
||||
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
|
||||
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
|
||||
git remote set-url origin https://akkoma.dev/FoundKeyGang/FoundKey.git
|
||||
git fetch origin
|
||||
```
|
||||
We recommend using a local branch and merging in upstream releases as they get tagged. This allows for easy local customization of your install.
|
||||
|
||||
For example, say your local branch is `toast.cafe` and you want to use release `v13.0.0-preview1`. To create that branch:
|
||||
```sh
|
||||
git checkout tags/v13.0.0-preview1 -b toast.cafe
|
||||
```
|
||||
|
||||
When a new release comes out, simply fetch and merge in the new tag. Here we opt to squash upstream commits as it allows for easy reverts in case something goes wrong.
|
||||
```sh
|
||||
git fetch -t
|
||||
git merge tags/v13.0.0-preview2 --squash
|
||||
# you are now on the "next" release
|
||||
```
|
||||
|
||||
## Making sure modern Yarn works
|
||||
FoundKey uses modern Yarn instead of Classic (1.x) using [Corepack](https://github.com/nodejs/corepack). To make sure the `yarn` command will work going forward, run `corepack enable`.
|
||||
|
||||
If you previously had Yarn installed manually you have to remove it and install Corepack:
|
||||
```sh
|
||||
npm uninstall -g yarn
|
||||
npm install -g corepack
|
||||
corepack enable
|
||||
```
|
||||
|
||||
## Rebuilding and running database migrations
|
||||
This will be pretty much the same as a regular update of Misskey. Note that `yarn install` may take a while since dependency versions have been updated or removed and we use a newer version of Yarn.
|
||||
```sh
|
||||
yarn install
|
||||
NODE_ENV=production yarn build
|
||||
yarn migrate
|
||||
```
|
||||
If you encounter issues during the build process run `yarn clean-all` and run the install and build command again.
|
||||
|
||||
## Restarting your instance
|
||||
To let the changes take effect restart your instance as usual:
|
||||
```sh
|
||||
# Systemd
|
||||
systemctl restart misskey
|
||||
|
||||
# OpenRC
|
||||
rc-service misskey restart
|
||||
```
|
||||
|
||||
## Need help?
|
||||
If you have any questions or troubles, feel free to contact us on IRC: `#foundkey` on `irc.akkoma.dev`, port `6697` with SSL
|
|
@ -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.
|
|
@ -1,86 +0,0 @@
|
|||
# Nginx configuration
|
||||
1. Create `/etc/nginx/conf.d/foundkey.conf` or `/etc/nginx/sites-available/foundkey.conf` and copy the following example to the file.\
|
||||
(The file name does not have to be "foundkey".)
|
||||
2. Edit as follows:
|
||||
1. Replace example.tld with the domain you have prepared.\
|
||||
`ssl_certificate` and `ssl_certificate_key` should be the path to the certificate obtained from Let's Encrypt.
|
||||
2. If using a CDN such as Cloudflare, remove 4 lines from "If it's behind another reverse proxy or CDN, remove the following."
|
||||
3. If you create `/etc/nginx/sites-available/foundkey.conf`, create symlink as `/etc/nginx/sites-enabled/foundkey.conf`.\
|
||||
`sudo ln -s /etc/nginx/sites-available/foundkey.conf /etc/nginx/sites-enabled/foundkey.conf`
|
||||
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
|
||||
# For WebSocket
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name example.tld;
|
||||
|
||||
# For SSL domain validation
|
||||
root /var/www/html;
|
||||
location /.well-known/acme-challenge/ { allow all; }
|
||||
location /.well-known/pki-validation/ { allow all; }
|
||||
location / { return 301 https://$server_name$request_uri; }
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
server_name example.tld;
|
||||
|
||||
ssl_session_timeout 1d;
|
||||
ssl_session_cache shared:ssl_session_cache:10m;
|
||||
ssl_session_tickets off;
|
||||
|
||||
# To use Let's Encrypt certificate
|
||||
ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem;
|
||||
|
||||
# To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
|
||||
#ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
|
||||
#ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
|
||||
|
||||
# SSL protocol settings
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
|
||||
ssl_prefer_server_ciphers off;
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
|
||||
# Change to your upload limit
|
||||
client_max_body_size 80m;
|
||||
|
||||
# Proxy to Node
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:3000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_http_version 1.1;
|
||||
proxy_redirect off;
|
||||
|
||||
# If it's behind another reverse proxy or CDN, remove the following.
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
|
||||
# For WebSocket
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
|
||||
# Cache settings
|
||||
proxy_cache cache1;
|
||||
proxy_cache_lock on;
|
||||
proxy_cache_use_stale updating;
|
||||
add_header X-Cache $upstream_cache_status;
|
||||
}
|
||||
}
|
||||
```
|
|
@ -1,42 +0,0 @@
|
|||
# 3rd party access
|
||||
Foundkey supports:
|
||||
- OAuth 2.0 Authorization Code grant per [RFC 6749](https://www.rfc-editor.org/rfc/rfc6749).
|
||||
- OAuth Bearer Token Usage per [RFC 6750](https://www.rfc-editor.org/rfc/rfc6750).
|
||||
- Proof Key for Code Exchange (PKCE) per [RFC 7636](https://www.rfc-editor.org/rfc/rfc7636).
|
||||
- OAuth 2.0 Authorization Server Metadata per [RFC 8414](https://www.rfc-editor.org/rfc/rfc8414.html).
|
||||
|
||||
# Discovery
|
||||
Because the implementation may change in the future, it is recommended that you use OAuth 2.0 Authorization Server Metadata a.k.a. OpenID Connect Discovery.
|
||||
In short, this means that to discover the URLs for the grant endpoints you should request `/.well-known/oauth-authorization-server`, which is a JSON object.
|
||||
From there, `authorization_endpoint` and `token_endpoint` will probably be most interesting to you.
|
||||
The definitions of all data fields are to be found in [RFC 8414, section 2](https://www.rfc-editor.org/rfc/rfc8414#section-2).
|
||||
|
||||
# App registration
|
||||
Before using the OAuth grant you need to register your application.
|
||||
Currently you will need to use the pre-existing Misskey API to register, though Dynamic Client Registration may be implemented at a later point.
|
||||
(You'd be able to tell from the Authorization Server Metadata, see above.)
|
||||
|
||||
The data you will need to know before registering is the following:
|
||||
- a name for your app,
|
||||
- a short description to be shown to users,
|
||||
- which API permissions you need, and
|
||||
- the callback URL you want to use.
|
||||
|
||||
There can only be 1 callback URL per registration.
|
||||
|
||||
Note that you can specify permissions a 2nd time in the OAuth flow.
|
||||
If you do not provide permissions again in the grant flow, the default is to use all permissions you gave when registering the app.
|
||||
If you do provide permissions in the grant flow, permissions that were not registered will never be granted.
|
||||
A list of available permissions can be viewed on any Foundkey instance by going to the API documentation at `/api-doc`.
|
||||
|
||||
To register your app you need to `POST` to `/api/app/create`.
|
||||
The body of the request must be a JSON object with the following keys:
|
||||
- `name` (string): a name for your app,
|
||||
- `description` (string): a short description to be shown to users,
|
||||
- `permission` (array of permission names) which API permissions you need, and
|
||||
- `callbackUrl` (string): the callback URL you want to use.
|
||||
|
||||
If successful (HTTP response code 200) you will receive back a JSON object containing among other things:
|
||||
- `id` (string): the client ID
|
||||
- `secret` (string): the client secret
|
||||
With these credentials you should be able to use the Authorization Code grant to obtain authorization.
|
|
@ -16,11 +16,11 @@ gulp.task('copy:backend:views', () =>
|
|||
);
|
||||
|
||||
gulp.task('copy:client:fonts', () =>
|
||||
gulp.src('./node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/_client_dist_/fonts/'))
|
||||
gulp.src('./packages/client/node_modules/three/examples/fonts/**/*').pipe(gulp.dest('./built/_client_dist_/fonts/'))
|
||||
);
|
||||
|
||||
gulp.task('copy:client:fontawesome', () =>
|
||||
gulp.src('./node_modules/@fortawesome/fontawesome-free/**/*').pipe(gulp.dest('./built/_client_dist_/fontawesome/'))
|
||||
gulp.src('./packages/client/node_modules/@fortawesome/fontawesome-free/**/*').pipe(gulp.dest('./built/_client_dist_/fontawesome/'))
|
||||
);
|
||||
|
||||
gulp.task('copy:client:locales', cb => {
|
||||
|
@ -36,7 +36,7 @@ gulp.task('copy:client:locales', cb => {
|
|||
});
|
||||
|
||||
gulp.task('build:backend:script', () => {
|
||||
return gulp.src(['./packages/backend/src/server/web/boot.js'])
|
||||
return gulp.src(['./packages/backend/src/server/web/boot.js', './packages/backend/src/server/web/bios.js', './packages/backend/src/server/web/cli.js'])
|
||||
.pipe(replace('LANGS', JSON.stringify(Object.keys(locales))))
|
||||
.pipe(terser({
|
||||
toplevel: true
|
||||
|
@ -45,7 +45,7 @@ gulp.task('build:backend:script', () => {
|
|||
});
|
||||
|
||||
gulp.task('build:backend:style', () => {
|
||||
return gulp.src(['./packages/backend/src/server/web/style.css'])
|
||||
return gulp.src(['./packages/backend/src/server/web/style.css', './packages/backend/src/server/web/bios.css', './packages/backend/src/server/web/cli.css'])
|
||||
.pipe(cssnano({
|
||||
zindex: false
|
||||
}))
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
---
|
||||
_lang_: "Català"
|
||||
headlineMisskey: "Una xarxa connectada per notes"
|
||||
introMisskey: "Benvingut! FoundKey és un servei de microblogging descentralitzat de\
|
||||
\ codi obert.\nCrea \"notes\" per compartir els teus pensaments amb tots els que\
|
||||
\ t'envolten. \U0001F4E1\nAmb \"reaccions\", també pots expressar ràpidament els\
|
||||
\ teus sentiments sobre les notes de tothom. \U0001F44D\nExplorem un món nou! \U0001F680"
|
||||
introMisskey: "Benvingut! Misskey és un servei de microblogging descentralitzat de codi obert.\nCrea \"notes\" per compartir els teus pensaments amb tots els que t'envolten. 📡\nAmb \"reaccions\", també pots expressar ràpidament els teus sentiments sobre les notes de tothom. 👍\nExplorem un món nou! 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Cercar"
|
||||
notifications: "Notificacions"
|
||||
|
@ -14,7 +12,8 @@ fetchingAsApObject: "Cercant en el Fediverse..."
|
|||
ok: "OK"
|
||||
gotIt: "Ho he entès!"
|
||||
cancel: "Cancel·lar"
|
||||
renotedBy: "Resignat per {user}"
|
||||
enterUsername: "Introdueix el teu nom d'usuari"
|
||||
renotedBy: "Resignat per {usuari}"
|
||||
noNotes: "Cap nota"
|
||||
noNotifications: "Cap notificació"
|
||||
instance: "Instàncies"
|
||||
|
@ -29,20 +28,27 @@ login: "Iniciar sessió"
|
|||
loggingIn: "Identificant-se"
|
||||
logout: "Tancar la sessió"
|
||||
signup: "Registrar-se"
|
||||
uploading: "Pujant..."
|
||||
save: "Desar"
|
||||
users: "Usuaris"
|
||||
addUser: "Afegir un usuari"
|
||||
favorite: "Afegir a preferits"
|
||||
favorites: "Favorits"
|
||||
unfavorite: "Eliminar dels preferits"
|
||||
favorited: "Afegit als preferits."
|
||||
alreadyFavorited: "Ja s'ha afegit als preferits."
|
||||
cantFavorite: "No s'ha pogut afegir als preferits."
|
||||
pin: "Fixar al perfil"
|
||||
unpin: "Para de fixar del perfil"
|
||||
copyContent: "Copiar el contingut"
|
||||
copyLink: "Copiar l'enllaç"
|
||||
delete: "Eliminar"
|
||||
deleteAndEdit: "Esborrar i editar"
|
||||
deleteAndEditConfirm: "Estàs segur que vols suprimir aquesta nota i editar-la? Perdràs\
|
||||
\ totes les reaccions, notes i respostes."
|
||||
deleteAndEditConfirm: "Estàs segur que vols suprimir aquesta nota i editar-la? Perdràs totes les reaccions, notes i respostes."
|
||||
addToList: "Afegir a una llista"
|
||||
sendMessage: "Enviar un missatge"
|
||||
copyUsername: "Copiar nom d'usuari"
|
||||
searchUser: "Cercar usuaris"
|
||||
reply: "Respondre"
|
||||
loadMore: "Carregar més"
|
||||
showMore: "Veure més"
|
||||
|
@ -57,13 +63,12 @@ import: "Importar"
|
|||
export: "Exportar"
|
||||
files: "Fitxers"
|
||||
download: "Baixar"
|
||||
driveFileDeleteConfirm: "Estàs segur que vols suprimir el fitxer \"{name}\"? Les notes\
|
||||
\ associades a aquest fitxer adjunt també se suprimiran."
|
||||
driveFileDeleteConfirm: "Estàs segur que vols suprimir el fitxer \"{name}\"? Les notes associades a aquest fitxer adjunt també se suprimiran."
|
||||
unfollowConfirm: "Estàs segur que vols deixar de seguir {name}?"
|
||||
exportRequested: "Has sol·licitat una exportació. Això pot trigar una estona. S'afegirà\
|
||||
\ a la teva unitat un cop completat."
|
||||
exportRequested: "Has sol·licitat una exportació. Això pot trigar una estona. S'afegirà a la teva unitat un cop completat."
|
||||
importRequested: "Has sol·licitat una importació. Això pot trigar una estona."
|
||||
lists: "Llistes"
|
||||
noLists: "No tens cap llista"
|
||||
note: "Nota"
|
||||
notes: "Notes"
|
||||
following: "Seguint"
|
||||
|
@ -75,12 +80,9 @@ error: "Error"
|
|||
somethingHappened: "S'ha produït un error"
|
||||
retry: "Torna-ho a intentar"
|
||||
pageLoadError: "S'ha produït un error en carregar la pàgina"
|
||||
pageLoadErrorDescription: "Això normalment es deu a errors de xarxa o a la memòria\
|
||||
\ cau del navegador. Prova d'esborrar la memòria cau i torna-ho a provar després\
|
||||
\ d'esperar una estona."
|
||||
pageLoadErrorDescription: "Això normalment es deu a errors de xarxa o a la memòria cau del navegador. Prova d'esborrar la memòria cau i torna-ho a provar després d'esperar una estona."
|
||||
serverIsDead: "Aquest servidor no respon. Espera una estona i torna-ho a provar."
|
||||
youShouldUpgradeClient: "Per veure aquesta pàgina, actualitzeu-la per actualitzar\
|
||||
\ el vostre client."
|
||||
youShouldUpgradeClient: "Per veure aquesta pàgina, actualitzeu-la per actualitzar el vostre client."
|
||||
enterListName: "Introdueix un nom per a la llista"
|
||||
privacy: "Privadesa"
|
||||
makeFollowManuallyApprove: "Les sol·licituds de seguiment requereixen aprovació"
|
||||
|
@ -90,21 +92,29 @@ followRequest: "Enviar la sol·licitud de seguiment"
|
|||
followRequests: "Sol·licituds de seguiment"
|
||||
unfollow: "Deixar de seguir"
|
||||
followRequestPending: "Sol·licituds de seguiment pendents"
|
||||
enterEmoji: "Introduir un emoji"
|
||||
renote: "Renotar"
|
||||
unrenote: "Anul·lar renota"
|
||||
renoted: "Renotat."
|
||||
cantRenote: "Aquesta publicació no pot ser renotada."
|
||||
cantReRenote: "Impossible renotar una renota."
|
||||
quote: "Citar"
|
||||
pinnedNote: "Nota fixada"
|
||||
pinned: "Fixar al perfil"
|
||||
you: "Tu"
|
||||
clickToShow: "Fes clic per mostrar"
|
||||
sensitive: "NSFW"
|
||||
add: "Afegir"
|
||||
reaction: "Reaccions"
|
||||
reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem\
|
||||
\ \"+\" per afegir."
|
||||
reactionSetting: "Reaccions a mostrar al selector de reaccions"
|
||||
reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem \"+\" per afegir."
|
||||
rememberNoteVisibility: "Recorda la configuració de visibilitat de les notes"
|
||||
attachCancel: "Eliminar el fitxer adjunt"
|
||||
markAsSensitive: "Marcar com a NSFW"
|
||||
instances: "Instàncies"
|
||||
remove: "Eliminar"
|
||||
nsfw: "NSFW"
|
||||
pinnedNotes: "Nota fixada"
|
||||
userList: "Llistes"
|
||||
smtpUser: "Nom d'usuari"
|
||||
smtpPass: "Contrasenya"
|
||||
|
@ -116,7 +126,10 @@ _mfm:
|
|||
mention: "Menció"
|
||||
quote: "Citar"
|
||||
search: "Cercar"
|
||||
_theme: {}
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Menció"
|
||||
renote: "Renotar"
|
||||
_sfx:
|
||||
note: "Notes"
|
||||
notification: "Notificacions"
|
||||
|
@ -134,6 +147,25 @@ _profile:
|
|||
_exportOrImport:
|
||||
followingList: "Seguint"
|
||||
userLists: "Llistes"
|
||||
_pages:
|
||||
script:
|
||||
categories:
|
||||
list: "Llistes"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Llistes"
|
||||
_randomPick:
|
||||
arg1: "Llistes"
|
||||
_dailyRandomPick:
|
||||
arg1: "Llistes"
|
||||
_seedRandomPick:
|
||||
arg2: "Llistes"
|
||||
_pick:
|
||||
arg1: "Llistes"
|
||||
_listLen:
|
||||
arg1: "Llistes"
|
||||
types:
|
||||
array: "Llistes"
|
||||
_notification:
|
||||
youWereFollowed: "t'ha seguit"
|
||||
_types:
|
||||
|
@ -151,5 +183,3 @@ _deck:
|
|||
tl: "Línia de temps"
|
||||
list: "Llistes"
|
||||
mentions: "Mencions"
|
||||
_services: {}
|
||||
_postForm: {}
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
---
|
||||
_lang_: "Čeština"
|
||||
headlineMisskey: "Síť propojená poznámkami"
|
||||
introMisskey: "Vítejte! FoundKey je otevřený a decentralizovaný microblogový servis.\n\
|
||||
\"Poznámkami\" můžete sdílet co se zrovna děje se všemi ve Vašem okolí. \U0001F4E1\
|
||||
\nPomocí \"reakcí\" můžete sdílet své názory a pocity na ostatní poznámky. \U0001F44D\
|
||||
\nPojďte objevovat nový svět! \U0001F680"
|
||||
introMisskey: "Vítejte! Misskey je otevřený a decentralizovaný microblogový servis.\n\"Poznámkami\" můžete sdílet co se zrovna děje se všemi ve Vašem okolí. 📡\nPomocí \"reakcí\" můžete sdílet své názory a pocity na ostatní poznámky. 👍\nPojďte objevovat nový svět! 🚀"
|
||||
monthAndDay: "{day}. {month}."
|
||||
search: "Vyhledávání"
|
||||
notifications: "Oznámení"
|
||||
|
@ -14,6 +12,7 @@ fetchingAsApObject: "Načítám data z Fediversu..."
|
|||
ok: "Potvrdit"
|
||||
gotIt: "Rozumím!"
|
||||
cancel: "Zrušit"
|
||||
enterUsername: "Zadej uživatelské jméno"
|
||||
renotedBy: "{user} přeposla/a"
|
||||
noNotes: "Žádné poznámky"
|
||||
noNotifications: "Žádná oznámení"
|
||||
|
@ -29,20 +28,27 @@ login: "Přihlásit se"
|
|||
loggingIn: "Probíhá přihlašování"
|
||||
logout: "Odhlásit"
|
||||
signup: "Registrace"
|
||||
uploading: "Nahrávám"
|
||||
save: "Uložit"
|
||||
users: "Uživatelé"
|
||||
addUser: "Přidat uživatele"
|
||||
favorite: "Oblíbené"
|
||||
favorites: "Oblíbené"
|
||||
unfavorite: "Odebrat z oblízených"
|
||||
favorited: "Přidáno do oblíbených"
|
||||
alreadyFavorited: "Už je mezi oblíbenými"
|
||||
cantFavorite: "Nepodařilo se přidat mezi oblíbené."
|
||||
pin: "Připnout"
|
||||
unpin: "Odepnout"
|
||||
copyContent: "Zkopírovat obsah"
|
||||
copyLink: "Kopírovat odkaz"
|
||||
delete: "Smazat"
|
||||
deleteAndEdit: "Smazat a upravit"
|
||||
deleteAndEditConfirm: "Jste si jistí že chcete smazat tuto poznámku a editovat ji?\
|
||||
\ Ztratíte tím všechny reakce, sdílení a odpovědi na ni."
|
||||
deleteAndEditConfirm: "Jste si jistí že chcete smazat tuto poznámku a editovat ji? Ztratíte tím všechny reakce, sdílení a odpovědi na ni."
|
||||
addToList: "Přidat do seznamu"
|
||||
sendMessage: "Odeslat zprávu"
|
||||
copyUsername: "Kopírovat uživatelské jméno"
|
||||
searchUser: "Vyhledat uživatele"
|
||||
reply: "Odpovědět"
|
||||
loadMore: "Zobrazit více"
|
||||
showMore: "Zobrazit více"
|
||||
|
@ -56,13 +62,12 @@ import: "Importovat"
|
|||
export: "Exportovat"
|
||||
files: "Soubor(ů)"
|
||||
download: "Stáhnout"
|
||||
driveFileDeleteConfirm: "Opravdu chcete smazat soubor \"{name}\"? Poznámky, ke kterým\
|
||||
\ je tento soubor připojen, budou také smazány."
|
||||
driveFileDeleteConfirm: "Opravdu chcete smazat soubor \"{name}\"? Poznámky, ke kterým je tento soubor připojen, budou také smazány."
|
||||
unfollowConfirm: "Jste si jisti že už nechcete sledovat {name}?"
|
||||
exportRequested: "Požádali jste o export. To může chvíli trvat. Přidáme ho na váš\
|
||||
\ Disk až bude dokončen."
|
||||
exportRequested: "Požádali jste o export. To může chvíli trvat. Přidáme ho na váš Disk až bude dokončen."
|
||||
importRequested: "Požádali jste o export. To může chvilku trvat."
|
||||
lists: "Seznamy"
|
||||
noLists: "Nemáte žádné seznamy"
|
||||
note: "Poznámka"
|
||||
notes: "Poznámky"
|
||||
following: "Sledovaní"
|
||||
|
@ -75,8 +80,7 @@ somethingHappened: "Jejda. Něco se nepovedlo."
|
|||
retry: "Opakovat"
|
||||
pageLoadError: "Nepodařilo se načíst stránku"
|
||||
serverIsDead: "Server neodpovídá. Počkejte chvíli a zkuste to znovu."
|
||||
youShouldUpgradeClient: "Pro zobrazení této stránky obnovte stránku pro aktualizaci\
|
||||
\ klienta."
|
||||
youShouldUpgradeClient: "Pro zobrazení této stránky obnovte stránku pro aktualizaci klienta."
|
||||
enterListName: "Jméno seznamu"
|
||||
privacy: "Soukromí"
|
||||
makeFollowManuallyApprove: "Žádosti o sledování vyžadují potvrzení"
|
||||
|
@ -86,17 +90,22 @@ followRequest: "Odeslat žádost o sledování"
|
|||
followRequests: "Žádosti o sledování"
|
||||
unfollow: "Přestat sledovat"
|
||||
followRequestPending: "Čekající žádosti o sledování"
|
||||
enterEmoji: "Vložte emoji"
|
||||
renote: "Přeposlat"
|
||||
unrenote: "Zrušit přeposlání"
|
||||
renoted: "Přeposláno"
|
||||
cantRenote: "Tento příspěvek nelze přeposlat."
|
||||
cantReRenote: "Odpověď nemůže být odstraněna."
|
||||
quote: "Citovat"
|
||||
pinnedNote: "Připnutá poznámka"
|
||||
pinned: "Připnout"
|
||||
you: "Vy"
|
||||
clickToShow: "Klikněte pro zobrazení"
|
||||
sensitive: "NSFW"
|
||||
add: "Přidat"
|
||||
reaction: "Reakce"
|
||||
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte\
|
||||
\ \"+\" k přidání"
|
||||
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte \"+\" k přidání"
|
||||
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
|
||||
attachCancel: "Odstranit přílohu"
|
||||
markAsSensitive: "Označit jako NSFW"
|
||||
unmarkAsSensitive: "Odznačit jako NSFW"
|
||||
|
@ -119,52 +128,57 @@ editWidgetsExit: "Hotovo"
|
|||
customEmojis: "Vlastní emoji"
|
||||
emoji: "Emoji"
|
||||
emojis: "Emoji"
|
||||
emojiName: "Jméno emoji"
|
||||
emojiUrl: "URL obrázku"
|
||||
addEmoji: "Přidat emoji"
|
||||
settingGuide: "Doporučené nastavení"
|
||||
cacheRemoteFiles: "Ukládání vzdálených souborů do mezipaměti"
|
||||
cacheRemoteFilesDescription: "Zakázání tohoto nastavení způsobí, že vzdálené soubory\
|
||||
\ budou odkazovány přímo, místo aby byly ukládány do mezipaměti. Tím se ušetří úložiště\
|
||||
\ na serveru, ale zvýší se provoz, protože se negenerují miniatury."
|
||||
cacheRemoteFilesDescription: "Zakázání tohoto nastavení způsobí, že vzdálené soubory budou odkazovány přímo, místo aby byly ukládány do mezipaměti. Tím se ušetří úložiště na serveru, ale zvýší se provoz, protože se negenerují miniatury."
|
||||
flagAsBot: "Tento účet je bot"
|
||||
flagAsBotDescription: "Pokud je tento účet kontrolován programem zaškrtněte tuto možnost.\
|
||||
\ To označí tento účet jako bot pro ostatní vývojáře a zabrání tak nekonečným interakcím\
|
||||
\ s ostatními boty a upraví FoundKey systém aby se choval k tomuhle účtu jako bot."
|
||||
flagAsBotDescription: "Pokud je tento účet kontrolován programem zaškrtněte tuto možnost. To označí tento účet jako bot pro ostatní vývojáře a zabrání tak nekonečným interakcím s ostatními boty a upraví Misskey systém aby se choval k tomuhle účtu jako bot."
|
||||
flagAsCat: "Tenhle účet je kočka"
|
||||
flagAsCatDescription: "Vyberte tuto možnost aby tento účet byl označen jako kočka."
|
||||
flagShowTimelineReplies: "Zobrazovat odpovědi na časové ose"
|
||||
flagShowTimelineRepliesDescription: "Je-li zapnuto, zobrazí odpovědi uživatelů na\
|
||||
\ poznámky jiných uživatelů na vaší časové ose."
|
||||
flagShowTimelineRepliesDescription: "Je-li zapnuto, zobrazí odpovědi uživatelů na poznámky jiných uživatelů na vaší časové ose."
|
||||
autoAcceptFollowed: "Automaticky akceptovat následování od účtů které sledujete"
|
||||
addAccount: "Přidat účet"
|
||||
loginFailed: "Přihlášení se nezdařilo."
|
||||
showOnRemote: "Více na původním profilu"
|
||||
general: "Obecně"
|
||||
wallpaper: "Obrázek na pozadí"
|
||||
setWallpaper: "Nastavení obrázku na pozadí"
|
||||
removeWallpaper: "Odstranit pozadí"
|
||||
searchWith: "Hledat: {q}"
|
||||
youHaveNoLists: "Nemáte žádné seznamy"
|
||||
followConfirm: "Jste si jisti, že chcete sledovat {name}?"
|
||||
proxyAccount: "Proxy účet"
|
||||
proxyAccountDescription: "Proxy účet je účet, který za určitých podmínek sleduje uživatele\
|
||||
\ na dálku vaším jménem. Například když uživatel zařadí vzdáleného uživatele do\
|
||||
\ seznamu, pokud nikdo nesleduje uživatele na seznamu, aktivita nebude doručena\
|
||||
\ instanci, takže místo toho bude uživatele sledovat účet proxy."
|
||||
proxyAccountDescription: "Proxy účet je účet, který za určitých podmínek sleduje uživatele na dálku vaším jménem. Například když uživatel zařadí vzdáleného uživatele do seznamu, pokud nikdo nesleduje uživatele na seznamu, aktivita nebude doručena instanci, takže místo toho bude uživatele sledovat účet proxy."
|
||||
host: "Hostitel"
|
||||
selectUser: "Vyberte uživatele"
|
||||
recipient: "Pro"
|
||||
annotation: "Komentáře"
|
||||
federation: "Federace"
|
||||
instances: "Instance"
|
||||
registeredAt: "Registrován"
|
||||
latestRequestSentAt: "Poslední požadavek poslán"
|
||||
latestRequestReceivedAt: "Poslední požadavek přijat"
|
||||
latestStatus: "Poslední status"
|
||||
storageUsage: "Využití úložiště"
|
||||
charts: "Grafy"
|
||||
perHour: "za hodinu"
|
||||
perDay: "za den"
|
||||
stopActivityDelivery: "Přestat zasílat aktivitu"
|
||||
blockThisInstance: "Blokovat tuto instanci"
|
||||
operations: "Operace"
|
||||
software: "Software"
|
||||
version: "Verze"
|
||||
metadata: "Metadata"
|
||||
withNFiles: "{n} soubor(ů)"
|
||||
monitor: "Monitorovat"
|
||||
jobQueue: "Fronta úloh"
|
||||
cpuAndMemory: "CPU a paměť"
|
||||
network: "Síť"
|
||||
disk: "Disk"
|
||||
instanceInfo: "Informace o instanci"
|
||||
statistics: "Statistiky"
|
||||
clearQueue: "Vyčistit frontu"
|
||||
|
@ -174,7 +188,7 @@ blockedInstances: "Blokované instance"
|
|||
noUsers: "Žádní uživatelé"
|
||||
editProfile: "Upravit můj profil"
|
||||
pinLimitExceeded: "Nemůžete připnout další poznámky."
|
||||
intro: "Instalace FoundKey byla dokončena! Prosím vytvořte admina."
|
||||
intro: "Instalace Misskey byla dokončena! Prosím vytvořte admina."
|
||||
done: "Hotovo"
|
||||
processing: "Zpracovávám"
|
||||
preview: "Náhled"
|
||||
|
@ -186,6 +200,9 @@ all: "Vše"
|
|||
subscribing: "Odebíráte"
|
||||
publishing: "Publikuji"
|
||||
notResponding: "Neodpovídá"
|
||||
instanceFollowing: "Následovníci na instanci"
|
||||
instanceFollowers: "Následovníci na instanci"
|
||||
instanceUsers: "Uživatelé této instance"
|
||||
changePassword: "Změnit heslo"
|
||||
security: "Zabezpečení"
|
||||
currentPassword: "Současné heslo"
|
||||
|
@ -199,6 +216,7 @@ noSuchUser: "Uživatel nebyl nalezen"
|
|||
announcements: "Oznámení"
|
||||
imageUrl: "URL obrázku"
|
||||
remove: "Smazat"
|
||||
removed: "Smazáno"
|
||||
removeAreYouSure: "Jste si jistí že chcete smazat \"{x}\"?"
|
||||
deleteAreYouSure: "Jste si jistí že chcete smazat \"{x}\"?"
|
||||
resetAreYouSure: "Opravdu resetovat?"
|
||||
|
@ -210,6 +228,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"
|
||||
|
@ -218,8 +237,7 @@ agreeTo: "Souhlasím s {0}"
|
|||
tos: "Podmínky užívání"
|
||||
start: "Začít"
|
||||
home: "Domů"
|
||||
remoteUserCaution: "Tyto informace nemusí být aktuální jelikož uživatel je ze vzdálené\
|
||||
\ instance."
|
||||
remoteUserCaution: "Tyto informace nemusí být aktuální jelikož uživatel je ze vzdálené instance."
|
||||
activity: "Aktivita"
|
||||
images: "Obrázky"
|
||||
birthday: "Datum narození"
|
||||
|
@ -235,6 +253,7 @@ lightThemes: "Světlý vzhled"
|
|||
darkThemes: "Tmavý vzhled"
|
||||
syncDeviceDarkMode: "Synchronizovat tmavý vzhled s nastavením Vašeho systému"
|
||||
drive: "Úložiště"
|
||||
fileName: "Název souboru"
|
||||
selectFile: "Vybrat soubor"
|
||||
selectFiles: "Vybrat soubory"
|
||||
selectFolder: "Vyberte složku"
|
||||
|
@ -245,6 +264,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"
|
||||
|
@ -272,24 +292,38 @@ dayX: "{day}"
|
|||
monthX: "{month}"
|
||||
yearX: "{year}"
|
||||
pages: "Stránky"
|
||||
integration: "Integrace"
|
||||
connectService: "Připojit"
|
||||
disconnectService: "Odpojit"
|
||||
enableLocalTimeline: "Povolit lokální čas"
|
||||
enableGlobalTimeline: "Povolit globální čas"
|
||||
registration: "Registrace"
|
||||
enableRegistration: "Povolit registraci novým uživatelům"
|
||||
invite: "Pozvat"
|
||||
inMb: "V megabajtech"
|
||||
iconUrl: "Favicon URL"
|
||||
bannerUrl: "Baner URL"
|
||||
backgroundImageUrl: "Adresa URL obrázku pozadí"
|
||||
basicInfo: "Základní informace"
|
||||
pinnedUsers: "Připnutí uživatelé"
|
||||
pinnedNotes: "Připnutá poznámka"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Aktivovat hCaptchu"
|
||||
hcaptchaSecretKey: "Tajný Klíč (Secret Key)"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Zapnout ReCAPTCHu"
|
||||
recaptchaSecretKey: "Tajný Klíč (Secret Key)"
|
||||
antennas: "Antény"
|
||||
manageAntennas: "Spravovat Antény"
|
||||
name: "Jméno"
|
||||
antennaSource: "Zdroj Antény"
|
||||
enableServiceworker: "Povolit ServiceWorker"
|
||||
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"
|
||||
about: "Informace"
|
||||
aboutMisskey: "O Misskey"
|
||||
administrator: "Administrátor"
|
||||
token: "Token"
|
||||
twoStepAuthentication: "Dvoufaktorová autentikace"
|
||||
|
@ -307,6 +341,7 @@ share: "Sdílet"
|
|||
notFound: "Nenalezeno"
|
||||
notFoundDescription: "Nebyla nalezená žádná stránka korespondující se zadanou URL."
|
||||
uploadFolder: "Výchozí lokace pro upload"
|
||||
cacheClear: "Vymazat cache"
|
||||
markAsReadAllNotifications: "Označit všechna oznámení za přečtená"
|
||||
markAsReadAllUnreadNotes: "Označit všechny příspěvky za přečtené"
|
||||
markAsReadAllTalkMessages: "Označit všechny zprávy za přečtené"
|
||||
|
@ -325,12 +360,14 @@ transfer: "Převod"
|
|||
title: "Titulek"
|
||||
text: "Text"
|
||||
enable: "Povolit"
|
||||
next: "Další"
|
||||
retype: "Zadejte znovu"
|
||||
noteOf: "{user} poznámky"
|
||||
inviteToGroup: "Pozvat do skupiny"
|
||||
newMessageExists: "Máte novou zprávu"
|
||||
onlyOneFileCanBeAttached: "Ke zprávě můžete přiložit jenom jeden soubor"
|
||||
signinRequired: "Přihlašte se, prosím"
|
||||
invitations: "Pozvat"
|
||||
checking: "Ověřuji"
|
||||
available: "K dispozici"
|
||||
unavailable: "Není k dispozici"
|
||||
|
@ -342,11 +379,13 @@ normalPassword: "Dobré heslo"
|
|||
strongPassword: "Silné heslo"
|
||||
passwordMatched: "Hesla se schodují"
|
||||
passwordNotMatched: "Hesla se neschodují"
|
||||
signinWith: "Přihlásit se s {x}"
|
||||
signinFailed: "Nelze se přihlásit. Zkontrolujte prosím své uživatelské jméno a heslo."
|
||||
or: "Nebo"
|
||||
language: "Jazyk"
|
||||
uiLanguage: "Jazyk uživatelského rozhraní"
|
||||
groupInvited: "Pozvat do skupiny"
|
||||
aboutX: "O {x}"
|
||||
useOsNativeEmojis: "Použití nativních emoji operačního systému"
|
||||
youHaveNoGroups: "Nemáte žádné skupiny"
|
||||
joinOrCreateGroup: "Můžete požádat o pozvání do stávající skupiny nebo vytvořit novou."
|
||||
|
@ -356,16 +395,25 @@ category: "Kategorie"
|
|||
tags: "Štítky"
|
||||
createAccount: "Vytvořit účet"
|
||||
existingAccount: "Existující účet"
|
||||
regenerate: "Obnovit"
|
||||
fontSize: "Velikost písma"
|
||||
openImageInNewTab: "Otevřít obrázek v novém panelu"
|
||||
dashboard: "Přehled"
|
||||
local: "Lokální"
|
||||
remote: "Vzdálené"
|
||||
total: "Celkem"
|
||||
weekOverWeekChanges: "Týdně"
|
||||
dayOverDayChanges: "Denně"
|
||||
appearance: "Vzhled"
|
||||
clientSettings: "Nastavení klienta"
|
||||
accountSettings: "Nastavení účtu"
|
||||
promotion: "Propagace"
|
||||
promote: "Propagovat"
|
||||
numberOfDays: "Počet dní"
|
||||
deleteAll: "Smazat vše"
|
||||
showFixedPostForm: "Zobrazit formulář pro nové příspěvky nad časovou osou"
|
||||
masterVolume: "Celková hlasitost"
|
||||
chooseEmoji: "Vybrat emotikon"
|
||||
unableToProcess: "Operace nebyla dokončena."
|
||||
recentUsed: "Naposledy použité"
|
||||
install: "Nainstalovat"
|
||||
|
@ -379,13 +427,16 @@ ascendingOrder: "Vzestupně"
|
|||
descendingOrder: "Sestupně"
|
||||
scratchpad: "Zápisník"
|
||||
output: "Výstup"
|
||||
script: "Skript"
|
||||
updateRemoteUser: "Aktualizovat informace o vzdáleném účtu"
|
||||
deleteAllFiles: "Smazat všechny soubory"
|
||||
deleteAllFilesConfirm: "Jste si jistí že chcete smazat všechny soubory?"
|
||||
userSuspended: "Tomuto uživateli byl pozastaven účet."
|
||||
menu: "Menu"
|
||||
addItem: "Přidat položku"
|
||||
inboxUrl: "Inbox URL"
|
||||
deletedNote: "Odstraněné příspěvky"
|
||||
invisibleNote: "Skryté příspěvky"
|
||||
description: "Popis"
|
||||
author: "Autor"
|
||||
manage: "Administrace"
|
||||
|
@ -394,6 +445,7 @@ generateAccessToken: "Vygenerovat přístupový token"
|
|||
permission: "Oprávnění"
|
||||
enableAll: "Povolit vše"
|
||||
disableAll: "Vypnout vše"
|
||||
notificationType: "Typy oznámení"
|
||||
edit: "Upravit"
|
||||
emailServer: "Mailový server"
|
||||
enableEmail: "Zapnout email dystribuci"
|
||||
|
@ -408,6 +460,7 @@ smtpSecureInfo: "Toto vypněte pokud používáte STARTTLS"
|
|||
makeActive: "Aktivovat"
|
||||
display: "Zobrazit"
|
||||
copy: "Kopírovat"
|
||||
logs: "Logy"
|
||||
database: "Databáze"
|
||||
create: "Vytvořit"
|
||||
notificationSetting: "Nastavení oznámení"
|
||||
|
@ -415,6 +468,7 @@ useGlobalSetting: "Použít globální nastavení"
|
|||
other: "Ostatní"
|
||||
fileIdOrUrl: "ID nebo URL souboru"
|
||||
behavior: "Chování"
|
||||
sample: "Ukázka"
|
||||
clearCache: "Vyprázdnit mezipaměť"
|
||||
info: "Informace"
|
||||
user: "Uživatelé"
|
||||
|
@ -429,6 +483,9 @@ _mfm:
|
|||
search: "Vyhledávání"
|
||||
_theme:
|
||||
description: "Popis"
|
||||
keys:
|
||||
mention: "Zmínění"
|
||||
renote: "Přeposlat"
|
||||
_sfx:
|
||||
note: "Poznámky"
|
||||
notification: "Oznámení"
|
||||
|
@ -456,6 +513,27 @@ _charts:
|
|||
federation: "Federace"
|
||||
_timelines:
|
||||
home: "Domů"
|
||||
_pages:
|
||||
blocks:
|
||||
image: "Obrázky"
|
||||
script:
|
||||
categories:
|
||||
list: "Seznamy"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Seznamy"
|
||||
_randomPick:
|
||||
arg1: "Seznamy"
|
||||
_dailyRandomPick:
|
||||
arg1: "Seznamy"
|
||||
_seedRandomPick:
|
||||
arg2: "Seznamy"
|
||||
_pick:
|
||||
arg1: "Seznamy"
|
||||
_listLen:
|
||||
arg1: "Seznamy"
|
||||
types:
|
||||
array: "Seznamy"
|
||||
_notification:
|
||||
youWereFollowed: "Máte nového následovníka"
|
||||
youWereInvitedToGroup: "Pozvat do skupiny"
|
||||
|
@ -475,4 +553,3 @@ _deck:
|
|||
antenna: "Antény"
|
||||
list: "Seznamy"
|
||||
mentions: "Zmínění"
|
||||
_services: {}
|
||||
|
|
1011
locales/fr-FR.yml
|
@ -27,6 +27,7 @@ const languages = [
|
|||
'id-ID',
|
||||
'it-IT',
|
||||
'ja-JP',
|
||||
'ja-KS',
|
||||
'kab-KAB',
|
||||
'kn-IN',
|
||||
'ko-KR',
|
||||
|
|
1226
locales/ja-KS.yml
Normal file
|
@ -1,3 +1,4 @@
|
|||
---
|
||||
_lang_: "Taqbaylit"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Nadi"
|
||||
|
@ -22,6 +23,7 @@ export: "Sifeḍ"
|
|||
files: "Ifuyla"
|
||||
download: "Sider"
|
||||
lists: "Tibdarin"
|
||||
noLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
|
||||
following: "Ig ṭṭafaṛ"
|
||||
followers: "Imeḍfaṛen"
|
||||
followsYou: "Yeṭṭafaṛ-ik·em-id"
|
||||
|
@ -34,12 +36,15 @@ 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"
|
||||
signinRequired: "Ttxil jerred"
|
||||
signinWith: "Tuqqna s {x}"
|
||||
tapSecurityKey: "Sekcem tasarutt-ik·im n tɣellist"
|
||||
uiLanguage: "Tutlayt n wegrudem"
|
||||
accountSettings: "Iɣewwaṛen n umiḍan"
|
||||
plugins: "Izegrar"
|
||||
email: "Imayl"
|
||||
emailAddress: "Tansa imayl"
|
||||
|
@ -57,7 +62,9 @@ _mfm:
|
|||
mention: "Bder"
|
||||
search: "Nadi"
|
||||
font: "Tasefsit"
|
||||
_theme: {}
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Bder"
|
||||
_sfx:
|
||||
notification: "Ilɣuyen"
|
||||
_permissions:
|
||||
|
@ -81,6 +88,28 @@ _pages:
|
|||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
eyeCatchingImageRemove: "Kkes tugna i d-ijebden"
|
||||
selectType: "Fren anaw"
|
||||
contentBlocks: "Agbur"
|
||||
inputBlocks: "Anekcum"
|
||||
specialBlocks: "Uzzig"
|
||||
script:
|
||||
categories:
|
||||
list: "Tibdarin"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Tibdarin"
|
||||
_randomPick:
|
||||
arg1: "Tibdarin"
|
||||
_dailyRandomPick:
|
||||
arg1: "Tibdarin"
|
||||
_seedRandomPick:
|
||||
arg2: "Tibdarin"
|
||||
_pick:
|
||||
arg1: "Tibdarin"
|
||||
_listLen:
|
||||
arg1: "Tibdarin"
|
||||
types:
|
||||
array: "Tibdarin"
|
||||
_notification:
|
||||
youWereFollowed: "Yeṭṭafaṛ-ik·em-id"
|
||||
_types:
|
||||
|
@ -92,4 +121,3 @@ _deck:
|
|||
_columns:
|
||||
notifications: "Ilɣuyen"
|
||||
list: "Tibdarin"
|
||||
_services: {}
|
||||
|
|
|
@ -1,8 +1,6 @@
|
|||
---
|
||||
_lang_: "ಕನ್ನಡ"
|
||||
introMisskey: "ಸ್ವಾಗತ! FoundKey ಓಪನ್ ಸೋರ್ಸ್ ಒಕ್ಕೂಟ ಮೈಕ್ರೋಬ್ಲಾಗಿಂಗ್ ಸೇವೆಯಾಗಿದೆ.\n ಏನಾಗುತ್ತಿದೆ\
|
||||
\ ಎಂಬುದನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ನಿಮ್ಮ ಬಗ್ಗೆ ಎಲ್ಲರಿಗೂ ಹೇಳಲು \"ಟಿಪ್ಪಣಿ\"ಗಳನ್ನು ರಚಿಸಿ\U0001F4E1\
|
||||
\n \"ಸ್ಪಂದನೆ\" ಕ್ರಿಯೆಯೊಂದಿಗೆ, ನೀವು ಎಲ್ಲರ ಟಿಪ್ಪಣಿಗಳಿಗೆ ತ್ವರಿತವಾಗಿ ಸ್ಪಂದನೆಗಳನ್ನು ಕೂಡ\
|
||||
\ ಸೇರಿಸಬಹುದು.\U0001F44D\n ಹೊಸ ಜಗತ್ತನ್ನು ಅನ್ವೇಷಿಸಿ\U0001F680"
|
||||
introMisskey: "ಸ್ವಾಗತ! Misskey ಓಪನ್ ಸೋರ್ಸ್ ಒಕ್ಕೂಟ ಮೈಕ್ರೋಬ್ಲಾಗಿಂಗ್ ಸೇವೆಯಾಗಿದೆ.\n ಏನಾಗುತ್ತಿದೆ ಎಂಬುದನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ನಿಮ್ಮ ಬಗ್ಗೆ ಎಲ್ಲರಿಗೂ ಹೇಳಲು \"ಟಿಪ್ಪಣಿ\"ಗಳನ್ನು ರಚಿಸಿ📡\n \"ಸ್ಪಂದನೆ\" ಕ್ರಿಯೆಯೊಂದಿಗೆ, ನೀವು ಎಲ್ಲರ ಟಿಪ್ಪಣಿಗಳಿಗೆ ತ್ವರಿತವಾಗಿ ಸ್ಪಂದನೆಗಳನ್ನು ಕೂಡ ಸೇರಿಸಬಹುದು.👍\n ಹೊಸ ಜಗತ್ತನ್ನು ಅನ್ವೇಷಿಸಿ🚀"
|
||||
monthAndDay: "{month}ನೇ ತಿಂಗಳ {day}ನೇ ದಿನ"
|
||||
search: "ಹುಡುಕು"
|
||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
|
@ -12,6 +10,7 @@ fetchingAsApObject: "ಒಕ್ಕೂಟದಿಂದ ಪಡೆಯಲಾಗುತ
|
|||
ok: "ಸರಿ"
|
||||
gotIt: "ಅರ್ಥವಾಯಿತು!"
|
||||
cancel: "ರದ್ದು"
|
||||
enterUsername: "ಬಳಕೆಹೆಸರನ್ನು ಭರ್ತಿ ಮಾಡಿ"
|
||||
renotedBy: "{user} ಪುನರಾವರ್ತಿಸಿದರು"
|
||||
noNotes: "ಟಿಪ್ಪಣಿಗಳಿಲ್ಲ"
|
||||
noNotifications: "ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"
|
||||
|
@ -24,9 +23,13 @@ login: "ಪ್ರವೇಶ"
|
|||
loggingIn: "ಪ್ರವೇಶಿಸುತ್ತಾ..."
|
||||
logout: "ಆಚೆಗೆ"
|
||||
signup: "ನೋಂದಣಿ"
|
||||
uploading: "ಅಪ್ಲೋಡಾಗುತ್ತಿದೆ"
|
||||
save: "ಉಳಿಸಿ"
|
||||
users: "ಬಳಕೆದಾರ"
|
||||
addUser: "ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"
|
||||
favorite: "ಮೆಚ್ಚಿನ"
|
||||
favorites: "ಮೆಚ್ಚಿನವುಗಳು"
|
||||
unfavorite: "ಮೆಚ್ಚುಗೆ ಅಳಿಸು"
|
||||
pin: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು"
|
||||
unpin: "ಪ್ರೊಫ಼ೈಲಿಂದ ಅಂಟುತೆಗೆ"
|
||||
copyContent: "ವಿಷಯವನ್ನು ನಕಲಿಸು"
|
||||
|
@ -48,9 +51,10 @@ import: "ಆಮದು"
|
|||
export: "ರಫ್ತು"
|
||||
files: "ಕಡತಗಳು"
|
||||
download: "ಜಾಲದಿಂದಿಳಿಸು"
|
||||
driveFileDeleteConfirm: "\"{name}\" ಕಡತವನ್ನು ಅಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಈ ನೋಡಿರಿ ಲಗತ್ತಿಸಲಾದ\
|
||||
\ ಟಿಪ್ಪಣಿ ಸಹ ಕಣ್ಮರೆಯಾಗುತ್ತದೆ."
|
||||
driveFileDeleteConfirm: "\"{name}\" ಕಡತವನ್ನು ಅಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಈ ನೋಡಿರಿ ಲಗತ್ತಿಸಲಾದ ಟಿಪ್ಪಣಿ ಸಹ ಕಣ್ಮರೆಯಾಗುತ್ತದೆ."
|
||||
unfollowConfirm: "{name}ಅನ್ನು ಹಿಂಬಾಲಿಸದಿರುವುದೇ?"
|
||||
pinned: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು"
|
||||
instances: "ನಿದರ್ಶನ"
|
||||
remove: "ಅಳಿಸು"
|
||||
smtpUser: "ಬಳಕೆಹೆಸರು"
|
||||
smtpPass: "ಗುಪ್ತಪದ"
|
||||
|
@ -78,6 +82,3 @@ _deck:
|
|||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
tl: "ಸಮಯಸಾಲು"
|
||||
mentions: "ಹೆಸರಿಸಿದ"
|
||||
_theme: {}
|
||||
_postForm: {}
|
||||
_services: {}
|
||||
|
|
|
@ -1,19 +1,18 @@
|
|||
---
|
||||
_lang_: "Nederlands"
|
||||
headlineMisskey: "Netwerk verbonden door notities"
|
||||
introMisskey: "Welkom! FoundKey is een open source, gedecentraliseerde microblogdienst.\n\
|
||||
Maak \"notities\" om je gedachten te delen met iedereen om je heen. \U0001F4E1\n\
|
||||
Met \"reacties\" kun je ook snel je mening geven over berichten van anderen. \U0001F44D\
|
||||
\nLaten we een nieuwe wereld verkennen! \U0001F680"
|
||||
introMisskey: "Welkom! Misskey is een open source, gedecentraliseerde microblogdienst.\nMaak \"notities\" om je gedachten te delen met iedereen om je heen. 📡\nMet \"reacties\" kun je ook snel je mening geven over berichten van anderen. 👍\nLaten we een nieuwe wereld verkennen! 🚀"
|
||||
monthAndDay: "{day} {month}"
|
||||
search: "Zoeken"
|
||||
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"
|
||||
enterUsername: "Voer een gebruikersnaam in"
|
||||
renotedBy: "Hergedeeld door {user}"
|
||||
noNotes: "Geen notities"
|
||||
noNotifications: "Geen meldingen"
|
||||
|
@ -29,20 +28,27 @@ login: "Inloggen"
|
|||
loggingIn: "Aan het inloggen"
|
||||
logout: "Afmelden"
|
||||
signup: "Registreren"
|
||||
uploading: "Bezig met uploaden"
|
||||
save: "Opslaan"
|
||||
users: "Gebruikers"
|
||||
addUser: "Toevoegen gebruiker"
|
||||
favorite: "Favorieten"
|
||||
favorites: "Toevoegen aan favorieten"
|
||||
unfavorite: "Verwijderen uit favorieten"
|
||||
favorited: "Toegevoegd aan favorieten."
|
||||
alreadyFavorited: "Al toegevoegd aan favorieten"
|
||||
cantFavorite: "Kon niet toevoegen aan favorieten"
|
||||
pin: "Vastmaken aan profielpagina"
|
||||
unpin: "Losmaken van profielpagina"
|
||||
copyContent: "Kopiëren inhoud"
|
||||
copyLink: "Kopiëren link"
|
||||
delete: "Verwijderen"
|
||||
deleteAndEdit: "Verwijderen en bewerken"
|
||||
deleteAndEditConfirm: "Weet je zeker dat je deze notitie wilt verwijderen en dan bewerken?\
|
||||
\ Je verliest alle reacties, herdelingen en antwoorden erop."
|
||||
deleteAndEditConfirm: "Weet je zeker dat je deze notitie wilt verwijderen en dan bewerken? Je verliest alle reacties, herdelingen en antwoorden erop."
|
||||
addToList: "Aan lijst toevoegen"
|
||||
sendMessage: "Verstuur bericht"
|
||||
copyUsername: "Kopiëren gebruikersnaam"
|
||||
copyUsername: "Kopiëren gebruikersnaam "
|
||||
searchUser: "Zoeken een gebruiker"
|
||||
reply: "Antwoord"
|
||||
loadMore: "Laad meer"
|
||||
showMore: "Toon meer"
|
||||
|
@ -58,13 +64,12 @@ import: "Import"
|
|||
export: "Export"
|
||||
files: "Bestanden"
|
||||
download: "Downloaden"
|
||||
driveFileDeleteConfirm: "Weet je zeker dat je het bestand \"{name}\" wilt verwijderen?\
|
||||
\ Notities met dit bestand als bijlage worden ook verwijderd."
|
||||
driveFileDeleteConfirm: "Weet je zeker dat je het bestand \"{name}\" wilt verwijderen? Notities met dit bestand als bijlage worden ook verwijderd."
|
||||
unfollowConfirm: "Weet je zeker dat je {name} wilt ontvolgen?"
|
||||
exportRequested: "Je hebt een export aangevraagd. Dit kan een tijdje duren. Het wordt\
|
||||
\ toegevoegd aan je Drive zodra het is voltooid."
|
||||
exportRequested: "Je hebt een export aangevraagd. Dit kan een tijdje duren. Het wordt toegevoegd aan je Drive zodra het is voltooid."
|
||||
importRequested: "Je hebt een import aangevraagd. Dit kan even duren."
|
||||
lists: "Lijsten"
|
||||
noLists: "Je hebt geen lijsten"
|
||||
note: "Notitie"
|
||||
notes: "Notities"
|
||||
following: "Volgend"
|
||||
|
@ -73,12 +78,10 @@ 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."
|
||||
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."
|
||||
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."
|
||||
serverIsDead: "De server reageert niet. Wacht even en probeer het opnieuw."
|
||||
youShouldUpgradeClient: "Werk je client bij om deze pagina te zien."
|
||||
enterListName: "Voer de naam van de lijst in"
|
||||
|
@ -90,17 +93,22 @@ followRequest: "Verzoek om te mogen volgen"
|
|||
followRequests: "Volgverzoeken"
|
||||
unfollow: "Ontvolgen"
|
||||
followRequestPending: "Wachten op goedkeuring volgverzoek"
|
||||
enterEmoji: "Voer een emoji in"
|
||||
renote: "Herdelen"
|
||||
unrenote: "Stop herdelen"
|
||||
renoted: "Herdeeld"
|
||||
cantRenote: "Dit bericht kan niet worden herdeeld"
|
||||
cantReRenote: "Een herdeling kan niet worden herdeeld"
|
||||
quote: "Quote"
|
||||
pinnedNote: "Vastgemaakte notitie"
|
||||
pinned: "Vastmaken aan profielpagina"
|
||||
you: "Jij"
|
||||
clickToShow: "Klik om te bekijken"
|
||||
sensitive: "NSFW"
|
||||
add: "Toevoegen"
|
||||
reaction: "Reacties"
|
||||
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen,\
|
||||
\ Druk op \"+\" om toe te voegen"
|
||||
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen, Druk op \"+\" om toe te voegen"
|
||||
rememberNoteVisibility: "Vergeet niet de notitie zichtbaarheidsinstellingen"
|
||||
attachCancel: "Verwijder bijlage"
|
||||
markAsSensitive: "Markeren als NSFW"
|
||||
unmarkAsSensitive: "Geen NSFW"
|
||||
|
@ -116,62 +124,59 @@ unblockConfirm: "Ben je zeker dat je deze account wil blokkeren?"
|
|||
suspendConfirm: "Ben je zeker dat je deze account wil suspenderen?"
|
||||
unsuspendConfirm: "Ben je zeker dat je deze account wil opnieuw aanstellen?"
|
||||
flagAsBot: "Markeer dit account als een robot."
|
||||
flagAsBotDescription: "Als dit account van een programma wordt beheerd, zet deze vlag\
|
||||
\ aan. Het aanzetten helpt andere ontwikkelaars om bijvoorbeeld onbedoelde feedback\
|
||||
\ loops te doorbreken of om FoundKey meer geschikt te maken."
|
||||
flagAsBotDescription: "Als dit account van een programma wordt beheerd, zet deze vlag aan. Het aanzetten helpt andere ontwikkelaars om bijvoorbeeld onbedoelde feedback loops te doorbreken of om Misskey meer geschikt te maken."
|
||||
flagAsCat: "Markeer dit account als een kat."
|
||||
flagAsCatDescription: "Zet deze vlag aan als je wilt aangeven dat dit account een\
|
||||
\ kat is."
|
||||
flagAsCatDescription: "Zet deze vlag aan als je wilt aangeven dat dit account een kat is."
|
||||
flagShowTimelineReplies: "Toon antwoorden op de tijdlijn."
|
||||
flagShowTimelineRepliesDescription: "Als je dit vlag aanzet, toont de tijdlijn ook\
|
||||
\ antwoorden op andere en niet alleen jouw eigen notities."
|
||||
autoAcceptFollowed: "Accepteer verzoeken om jezelf te volgen vanzelf als je de verzoeker\
|
||||
\ al volgt."
|
||||
flagShowTimelineRepliesDescription: "Als je dit vlag aanzet, toont de tijdlijn ook antwoorden op andere en niet alleen jouw eigen notities."
|
||||
autoAcceptFollowed: "Accepteer verzoeken om jezelf te volgen vanzelf als je de verzoeker al volgt."
|
||||
addAccount: "Account toevoegen"
|
||||
loginFailed: "Aanmelding mislukt."
|
||||
showOnRemote: "Toon op de externe instantie."
|
||||
general: "Algemeen"
|
||||
wallpaper: "Achtergrond"
|
||||
setWallpaper: "Achtergrond instellen"
|
||||
removeWallpaper: "Achtergrond verwijderen"
|
||||
searchWith: "Zoeken: {q}"
|
||||
youHaveNoLists: "Je hebt geen lijsten"
|
||||
followConfirm: "Weet je zeker dat je {name} wilt volgen?"
|
||||
proxyAccount: "Proxy account"
|
||||
proxyAccountDescription: "Een proxy-account is een account dat onder bepaalde voorwaarden\
|
||||
\ fungeert als externe volger voor gebruikers. Als een gebruiker bijvoorbeeld een\
|
||||
\ externe gebruiker aan de lijst toevoegt, wordt de activiteit van de externe gebruiker\
|
||||
\ niet aan de server geleverd als geen lokale gebruiker die gebruiker volgt, dus\
|
||||
\ het proxy-account volgt in plaats daarvan."
|
||||
proxyAccountDescription: "Een proxy-account is een account dat onder bepaalde voorwaarden fungeert als externe volger voor gebruikers. Als een gebruiker bijvoorbeeld een externe gebruiker aan de lijst toevoegt, wordt de activiteit van de externe gebruiker niet aan de server geleverd als geen lokale gebruiker die gebruiker volgt, dus het proxy-account volgt in plaats daarvan."
|
||||
host: "Server"
|
||||
selectUser: "Kies een gebruiker"
|
||||
recipient: "Ontvanger"
|
||||
annotation: "Reacties"
|
||||
federation: "Federatie"
|
||||
instances: "Server"
|
||||
registeredAt: "Geregistreerd op"
|
||||
latestRequestSentAt: "Laatste aanvraag verstuurd"
|
||||
latestRequestReceivedAt: "Laatste aanvraag ontvangen"
|
||||
latestStatus: "Laatste status"
|
||||
storageUsage: "Gebruikte opslagruimte"
|
||||
charts: "Grafieken"
|
||||
perHour: "Per uur"
|
||||
perDay: "Per dag"
|
||||
stopActivityDelivery: "Stop met versturen activiteiten"
|
||||
blockThisInstance: "Blokkeer deze server"
|
||||
operations: "Verwerkingen"
|
||||
software: "Software"
|
||||
version: "Versie"
|
||||
metadata: "Metadata"
|
||||
withNFiles: "{n} bestand(en)"
|
||||
monitor: "Monitor"
|
||||
jobQueue: "Job Queue"
|
||||
cpuAndMemory: "CPU en geheugen"
|
||||
network: "Netwerk"
|
||||
disk: "Schijfruimte"
|
||||
instanceInfo: "Serverinformatie"
|
||||
statistics: "Statistieken"
|
||||
clearQueue: "Wachtrij wissen"
|
||||
clearQueueConfirmTitle: "Weet je zeker dat je de wachtrji leeg wil maken?"
|
||||
clearQueueConfirmText: "Niet-bezorgde biljetten die nog in de wachtrij staan, worden\
|
||||
\ niet gefedereerd. Meestal is deze operatie niet nodig."
|
||||
clearQueueConfirmText: "Niet-bezorgde biljetten die nog in de wachtrij staan, worden niet gefedereerd. Meestal is deze operatie niet nodig."
|
||||
clearCachedFiles: "Cache opschonen"
|
||||
clearCachedFilesConfirm: "Weet je zeker dat je alle externe bestanden in de cache\
|
||||
\ wilt verwijderen?"
|
||||
clearCachedFilesConfirm: "Weet je zeker dat je alle externe bestanden in de cache wilt verwijderen?"
|
||||
blockedInstances: "Geblokkeerde servers"
|
||||
blockedInstancesDescription: "Maak een lijst van de servers die moeten worden geblokkeerd,\
|
||||
\ gescheiden door regeleinden. Geblokkeerde servers kunnen niet meer communiceren\
|
||||
\ met deze server."
|
||||
blockedInstancesDescription: "Maak een lijst van de servers die moeten worden geblokkeerd, gescheiden door regeleinden. Geblokkeerde servers kunnen niet meer communiceren met deze server."
|
||||
muteAndBlock: "Gedempt en geblokkeerd"
|
||||
mutedUsers: "Gedempte gebruikers"
|
||||
blockedUsers: "Geblokkeerde gebruikers"
|
||||
|
@ -179,7 +184,7 @@ noUsers: "Er zijn geen gebruikers."
|
|||
editProfile: "Bewerk Profiel"
|
||||
noteDeleteConfirm: "Ben je zeker dat je dit bericht wil verwijderen?"
|
||||
pinLimitExceeded: "Je kunt geen berichten meer vastprikken"
|
||||
intro: "Installatie van FoundKey geëindigd! Maak nu een beheerder aan."
|
||||
intro: "Installatie van Misskey geëindigd! Maak nu een beheerder aan."
|
||||
done: "Klaar"
|
||||
processing: "Bezig met verwerken"
|
||||
preview: "Voorbeeld"
|
||||
|
@ -193,6 +198,9 @@ all: "Alle"
|
|||
subscribing: "Abonneren"
|
||||
publishing: "Publiceren"
|
||||
notResponding: "Reageert niet"
|
||||
instanceFollowing: "Volgend op server"
|
||||
instanceFollowers: "Volgers op server"
|
||||
instanceUsers: "Gebruikers van deze server"
|
||||
changePassword: "Wachtwoord wijzigen"
|
||||
security: "Beveiliging"
|
||||
retypedNotMatch: "Invoer komt niet overeen"
|
||||
|
@ -208,22 +216,22 @@ lookup: "Opzoeken"
|
|||
announcements: "Aankondigingen"
|
||||
imageUrl: "AfbeeldingsURL"
|
||||
remove: "Verwijderen"
|
||||
removed: "Succesvol verwijderd"
|
||||
removeAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?"
|
||||
deleteAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?"
|
||||
resetAreYouSure: "Resetten?"
|
||||
saved: "Opgeslagen"
|
||||
messaging: "Chat"
|
||||
upload: "Uploaden"
|
||||
keepOriginalUploading: "Origineel beeld behouden"
|
||||
keepOriginalUploadingDescription: "Bewaar de originele versie bij het uploaden van\
|
||||
\ afbeeldingen. Indien uitgeschakeld, wordt bij het uploaden een alternatieve versie\
|
||||
\ voor webpublicatie genereert."
|
||||
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"
|
||||
|
@ -232,8 +240,7 @@ agreeTo: "Ik stem in met {0}"
|
|||
tos: "Gebruiksvoorwaarden"
|
||||
start: "Aan de slag"
|
||||
home: "Startpagina"
|
||||
remoteUserCaution: "Aangezien deze gebruiker van een externe server afkomstig is,\
|
||||
\ kan de weergegeven informatie onvolledig zijn."
|
||||
remoteUserCaution: "Aangezien deze gebruiker van een externe server afkomstig is, kan de weergegeven informatie onvolledig zijn."
|
||||
activity: "Activiteit"
|
||||
images: "Afbeeldingen"
|
||||
birthday: "Geboortedatum"
|
||||
|
@ -249,6 +256,7 @@ lightThemes: "Licht thema's"
|
|||
darkThemes: "Donkere thema's"
|
||||
syncDeviceDarkMode: "Synchroniseer donkere modus met je apparaatinstellingen"
|
||||
drive: "Schijf"
|
||||
fileName: "Bestandsnaam"
|
||||
selectFile: "Kies een bestand"
|
||||
selectFiles: "Selecteer bestanden"
|
||||
selectFolder: "Kies een map"
|
||||
|
@ -259,6 +267,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"
|
||||
|
@ -269,8 +279,9 @@ nsfw: "NSFW"
|
|||
whenServerDisconnected: "Wanneer de verbinding met de server wordt onderbroken"
|
||||
disconnectedFromServer: "Verbinding met de server onderbroken."
|
||||
inMb: "in megabytes"
|
||||
pinnedNotes: "Vastgemaakte notitie"
|
||||
userList: "Lijsten"
|
||||
aboutMisskey: "Over FoundKey"
|
||||
aboutMisskey: "Over Misskey"
|
||||
administrator: "Beheerder"
|
||||
token: "Token"
|
||||
securityKeyName: "Sleutelnaam"
|
||||
|
@ -283,12 +294,13 @@ newPasswordIs: "Het nieuwe wachtwoord is „{password}”."
|
|||
reduceUiAnimation: "Verminder beweging in de UI"
|
||||
share: "Delen"
|
||||
notFound: "Niet gevonden"
|
||||
cacheClear: "Cache verwijderen"
|
||||
smtpHost: "Server"
|
||||
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"
|
||||
|
@ -300,7 +312,10 @@ _mfm:
|
|||
mention: "Vermelding"
|
||||
quote: "Quote"
|
||||
search: "Zoeken"
|
||||
_theme: {}
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Vermelding"
|
||||
renote: "Herdelen"
|
||||
_sfx:
|
||||
note: "Notities"
|
||||
notification: "Meldingen"
|
||||
|
@ -329,6 +344,27 @@ _charts:
|
|||
federation: "Federatie"
|
||||
_timelines:
|
||||
home: "Startpagina"
|
||||
_pages:
|
||||
blocks:
|
||||
image: "Afbeeldingen"
|
||||
script:
|
||||
categories:
|
||||
list: "Lijsten"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Lijsten"
|
||||
_randomPick:
|
||||
arg1: "Lijsten"
|
||||
_dailyRandomPick:
|
||||
arg1: "Lijsten"
|
||||
_seedRandomPick:
|
||||
arg2: "Lijsten"
|
||||
_pick:
|
||||
arg1: "Lijsten"
|
||||
_listLen:
|
||||
arg1: "Lijsten"
|
||||
types:
|
||||
array: "Lijsten"
|
||||
_notification:
|
||||
youWereFollowed: "volgde jou"
|
||||
_types:
|
||||
|
@ -346,18 +382,3 @@ _deck:
|
|||
tl: "Tijdlijn"
|
||||
list: "Lijsten"
|
||||
mentions: "Vermeldingen"
|
||||
selectList: Kies een lijst
|
||||
selectAntenna: Kies een antenne
|
||||
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.
|
||||
|
|
1080
locales/pl-PL.yml
|
@ -1,9 +1,7 @@
|
|||
---
|
||||
_lang_: "Português"
|
||||
headlineMisskey: "Rede conectada por notas"
|
||||
introMisskey: "Bem-vindo! FoundKey é um serviço de microblogue descentralizado de\
|
||||
\ código aberto.\nCria \"notas\" e partilha o que te ocorre com todos à tua volta.\
|
||||
\ \U0001F4E1\nCom \"reações\" podes também expressar logo o que sentes às notas\
|
||||
\ de todos. \U0001F44D\nExploremos um novo mundo! \U0001F680"
|
||||
introMisskey: "Bem-vindo! Misskey é um serviço de microblogue descentralizado de código aberto.\nCria \"notas\" e partilha o que te ocorre com todos à tua volta. 📡\nCom \"reações\" podes também expressar logo o que sentes às notas de todos. 👍\nExploremos um novo mundo! 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Pesquisar"
|
||||
notifications: "Notificações"
|
||||
|
@ -14,6 +12,7 @@ fetchingAsApObject: "Buscando no Fediverso"
|
|||
ok: "OK"
|
||||
gotIt: "Entendi"
|
||||
cancel: "Cancelar"
|
||||
enterUsername: "Digite o nome de usuário"
|
||||
renotedBy: "Repostado por {user}"
|
||||
noNotes: "Sem posts"
|
||||
noNotifications: "Sem notificações"
|
||||
|
@ -29,20 +28,27 @@ login: "Iniciar sessão"
|
|||
loggingIn: "Iniciando sessão…"
|
||||
logout: "Sair"
|
||||
signup: "Registrar-se"
|
||||
uploading: "Enviando…"
|
||||
save: "Guardar"
|
||||
users: "Usuários"
|
||||
addUser: "Adicionar usuário"
|
||||
favorite: "Favoritar"
|
||||
favorites: "Favoritar"
|
||||
unfavorite: "Remover dos favoritos"
|
||||
favorited: "Adicionado aos favoritos."
|
||||
alreadyFavorited: "Já adicionado aos favoritos."
|
||||
cantFavorite: "Não foi possível adicionar aos favoritos."
|
||||
pin: "Afixar no perfil"
|
||||
unpin: "Desafixar do perfil"
|
||||
copyContent: "Copiar conteúdos"
|
||||
copyLink: "Copiar hiperligação"
|
||||
delete: "Eliminar"
|
||||
deleteAndEdit: "Eliminar e editar"
|
||||
deleteAndEditConfirm: "Tens a certeza que pretendes eliminar esta nota e editá-la?\
|
||||
\ Irás perder todas as suas reações, renotas e respostas."
|
||||
deleteAndEditConfirm: "Tens a certeza que pretendes eliminar esta nota e editá-la? Irás perder todas as suas reações, renotas e respostas."
|
||||
addToList: "Adicionar a lista"
|
||||
sendMessage: "Enviar uma mensagem"
|
||||
copyUsername: "Copiar nome de utilizador"
|
||||
searchUser: "Pesquisar utilizador"
|
||||
reply: "Responder"
|
||||
loadMore: "Carregar mais"
|
||||
showMore: "Ver mais"
|
||||
|
@ -57,13 +63,12 @@ import: "Importar"
|
|||
export: "Exportar"
|
||||
files: "Ficheiros"
|
||||
download: "Descarregar"
|
||||
driveFileDeleteConfirm: "Tens a certeza que pretendes apagar o ficheiro \"{name}\"\
|
||||
? As notas que tenham este ficheiro anexado serão também apagadas."
|
||||
driveFileDeleteConfirm: "Tens a certeza que pretendes apagar o ficheiro \"{name}\"? As notas que tenham este ficheiro anexado serão também apagadas."
|
||||
unfollowConfirm: "Tens a certeza que queres deixar de seguir {name}?"
|
||||
exportRequested: "Pediste uma exportação. Este processo pode demorar algum tempo.\
|
||||
\ Será adicionado à tua Drive após a conclusão do processo."
|
||||
exportRequested: "Pediste uma exportação. Este processo pode demorar algum tempo. Será adicionado à tua Drive após a conclusão do processo."
|
||||
importRequested: "Pediste uma importação. Este processo pode demorar algum tempo."
|
||||
lists: "Listas"
|
||||
noLists: "Não tens nenhuma lista"
|
||||
note: "Post"
|
||||
notes: "Posts"
|
||||
following: "Seguindo"
|
||||
|
@ -75,12 +80,9 @@ error: "Erro"
|
|||
somethingHappened: "Ocorreu um erro"
|
||||
retry: "Tentar novamente"
|
||||
pageLoadError: "Ocorreu um erro ao carregar a página."
|
||||
pageLoadErrorDescription: "Isto é normalmente causado por erros de rede ou pela cache\
|
||||
\ do browser. Experimenta limpar a cache e tenta novamente após algum tempo."
|
||||
serverIsDead: "O servidor não está respondendo. Por favor espere um pouco e tente\
|
||||
\ novamente."
|
||||
youShouldUpgradeClient: "Para visualizar essa página, por favor recarregue-a para\
|
||||
\ atualizar seu cliente."
|
||||
pageLoadErrorDescription: "Isto é normalmente causado por erros de rede ou pela cache do browser. Experimenta limpar a cache e tenta novamente após algum tempo."
|
||||
serverIsDead: "O servidor não está respondendo. Por favor espere um pouco e tente novamente."
|
||||
youShouldUpgradeClient: "Para visualizar essa página, por favor recarregue-a para atualizar seu cliente."
|
||||
enterListName: "Insira um nome para a lista"
|
||||
privacy: "Privacidade"
|
||||
makeFollowManuallyApprove: "Pedidos de seguimento precisam ser aprovados"
|
||||
|
@ -90,14 +92,21 @@ followRequest: "Mandar pedido de seguimento"
|
|||
followRequests: "Pedidos de seguimento"
|
||||
unfollow: "Deixar de seguir"
|
||||
followRequestPending: "Pedido de seguimento pendente"
|
||||
enterEmoji: "Inserir emoji"
|
||||
renote: "Repostar"
|
||||
renoted: "Repostado"
|
||||
cantRenote: "Não pode repostar"
|
||||
cantReRenote: "Não pode repostar este repost"
|
||||
quote: "Citar"
|
||||
pinnedNote: "Post fixado"
|
||||
pinned: "Afixar no perfil"
|
||||
you: "Você"
|
||||
clickToShow: "Clique para ver"
|
||||
sensitive: "Conteúdo sensível"
|
||||
add: "Adicionar"
|
||||
reaction: "Reações"
|
||||
reactionSetting: "Quais reações a mostrar no selecionador de reações"
|
||||
rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas"
|
||||
attachCancel: "Remover anexo"
|
||||
markAsSensitive: "Marcar como sensível"
|
||||
unmarkAsSensitive: "Desmarcar como sensível"
|
||||
|
@ -120,14 +129,20 @@ editWidgetsExit: "Pronto"
|
|||
customEmojis: "Emoji personalizado"
|
||||
emoji: "Emoji"
|
||||
emojis: "Emojis"
|
||||
emojiName: "Nome do Emoji"
|
||||
emojiUrl: "URL do Emoji"
|
||||
addEmoji: "Adicionar um Emoji"
|
||||
settingGuide: "Guia de configuração"
|
||||
flagAsBot: "Marcar conta como robô"
|
||||
flagAsCat: "Marcar conta como gato"
|
||||
flagAsCatDescription: "Ative essa opção para marcar essa conta como gato."
|
||||
flagShowTimelineReplies: "Mostrar respostas na linha de tempo"
|
||||
general: "Geral"
|
||||
wallpaper: "Papel de parede"
|
||||
searchWith: "Buscar: {q}"
|
||||
youHaveNoLists: "Não tem nenhuma lista"
|
||||
followConfirm: "Tem certeza que quer deixar de seguir {name}?"
|
||||
instances: "Instância"
|
||||
registeredAt: "Registrado em"
|
||||
perHour: "por hora"
|
||||
perDay: "por dia"
|
||||
|
@ -139,6 +154,7 @@ darkThemes: "Tema escuro"
|
|||
addFile: "Adicionar arquivo"
|
||||
nsfw: "Conteúdo sensível"
|
||||
monthX: "mês de {month}"
|
||||
pinnedNotes: "Post fixado"
|
||||
userList: "Listas"
|
||||
none: "Nenhum"
|
||||
output: "Resultado"
|
||||
|
@ -153,7 +169,10 @@ _mfm:
|
|||
quote: "Citar"
|
||||
emoji: "Emoji personalizado"
|
||||
search: "Pesquisar"
|
||||
_theme: {}
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Menção"
|
||||
renote: "Repostar"
|
||||
_sfx:
|
||||
note: "Posts"
|
||||
notification: "Notificações"
|
||||
|
@ -171,11 +190,179 @@ _exportOrImport:
|
|||
muteList: "Silenciar"
|
||||
blockingList: "Bloquear"
|
||||
userLists: "Listas"
|
||||
_pages:
|
||||
blocks:
|
||||
_button:
|
||||
_action:
|
||||
_pushEvent:
|
||||
event: "Nome do evento"
|
||||
message: "Mostrar mensagem quando ativado"
|
||||
variable: "Variável a mandar"
|
||||
no-variable: "Nenhum"
|
||||
callAiScript: "Invocar AiScript"
|
||||
_callAiScript:
|
||||
functionName: "Nome da função"
|
||||
radioButton: "Escolha"
|
||||
_radioButton:
|
||||
values: "Lista de escolhas separadas por quebras de texto"
|
||||
script:
|
||||
categories:
|
||||
logical: "Operação lógica"
|
||||
operation: "Cálculos"
|
||||
comparison: "Comparação"
|
||||
list: "Listas"
|
||||
blocks:
|
||||
_strReplace:
|
||||
arg2: "Texto que irá ser substituído"
|
||||
arg3: "Substituir com"
|
||||
strReverse: "Virar texto"
|
||||
join: "Sequência de texto"
|
||||
_join:
|
||||
arg1: "Listas"
|
||||
arg2: "Separador"
|
||||
add: "Somar"
|
||||
_add:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
subtract: "Subtrair"
|
||||
_subtract:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
multiply: "Multiplicar"
|
||||
_multiply:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
divide: "Dividir"
|
||||
_divide:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
mod: "O resto de"
|
||||
_mod:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
round: "Arredondar decimal"
|
||||
_round:
|
||||
arg1: "Numérico"
|
||||
eq: "A e B são iguais"
|
||||
_eq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
notEq: "A e B são diferentes"
|
||||
_notEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
and: "A e B"
|
||||
_and:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
or: "A OU B"
|
||||
_or:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
lt: "< A é menor do que B"
|
||||
_lt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
gt: "> A é maior do que B"
|
||||
_gt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
ltEq: "<= A é maior ou igual a B"
|
||||
_ltEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
gtEq: ">= A é maior ou igual a B"
|
||||
_gtEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
if: "Galho"
|
||||
_if:
|
||||
arg1: "Se"
|
||||
arg2: "Então"
|
||||
arg3: "Se não"
|
||||
not: "NÃO"
|
||||
_not:
|
||||
arg1: "NÃO"
|
||||
random: "Aleatório"
|
||||
_random:
|
||||
arg1: "Probabilidade"
|
||||
rannum: "Numeral aleatório"
|
||||
_rannum:
|
||||
arg1: "Valor mínimo"
|
||||
arg2: "Valor máximo"
|
||||
randomPick: "Escolher aleatoriamente de uma lista"
|
||||
_randomPick:
|
||||
arg1: "Listas"
|
||||
dailyRandom: "Aleatório (Muda uma vez por dia para cada usuário)"
|
||||
_dailyRandom:
|
||||
arg1: "Probabilidade"
|
||||
dailyRannum: "Numeral aleatório (Muda uma vez por dia para cada usuário)"
|
||||
_dailyRannum:
|
||||
arg1: "Valor mínimo"
|
||||
arg2: "Valor máximo"
|
||||
dailyRandomPick: "Escolher aleatoriamente de uma lista (Muda uma vez por dia para cada usuário)"
|
||||
_dailyRandomPick:
|
||||
arg1: "Listas"
|
||||
seedRandom: "Aleatório (com semente)"
|
||||
_seedRandom:
|
||||
arg1: "Semente"
|
||||
arg2: "Probabilidade"
|
||||
seedRannum: "Número aleatório (com semente)"
|
||||
_seedRannum:
|
||||
arg1: "Semente"
|
||||
arg2: "Valor mínimo"
|
||||
arg3: "Valor máximo"
|
||||
seedRandomPick: "Escolher aleatoriamente de uma lista (com uma semente)"
|
||||
_seedRandomPick:
|
||||
arg1: "Semente"
|
||||
arg2: "Listas"
|
||||
DRPWPM: "Escolher aleatoriamente de uma lista ponderada (Muda uma vez por dia para cada usuário)"
|
||||
_DRPWPM:
|
||||
arg1: "Lista de texto"
|
||||
pick: "Escolhe a partir da lista"
|
||||
_pick:
|
||||
arg1: "Listas"
|
||||
arg2: "Posição"
|
||||
listLen: "Pegar comprimento da lista"
|
||||
_listLen:
|
||||
arg1: "Listas"
|
||||
number: "Numérico"
|
||||
stringToNumber: "Texto para numérico"
|
||||
_stringToNumber:
|
||||
arg1: "Texto"
|
||||
numberToString: "Numérico para texto"
|
||||
_numberToString:
|
||||
arg1: "Numérico"
|
||||
splitStrByLine: "Dividir texto por quebras"
|
||||
_splitStrByLine:
|
||||
arg1: "Texto"
|
||||
ref: "Variável"
|
||||
aiScriptVar: "Variável AiScript"
|
||||
fn: "Função"
|
||||
_fn:
|
||||
slots: "Espaços"
|
||||
slots-info: "Separar cada espaço com uma quebra de texto"
|
||||
arg1: "Resultado"
|
||||
for: "Repetição 'for'"
|
||||
_for:
|
||||
arg1: "Número de repetições"
|
||||
arg2: "Ação"
|
||||
typeError: "Espaço {slot} aceita valores de tipo \"{expect}\", mas o valor dado é do tipo \"{actual}\"!"
|
||||
thereIsEmptySlot: "O espaço {slot} está vazio!"
|
||||
types:
|
||||
string: "Texto"
|
||||
number: "Numérico"
|
||||
array: "Listas"
|
||||
stringArray: "Lista de texto"
|
||||
emptySlot: "Espaço vazio"
|
||||
enviromentVariables: "Variáveis de ambiente"
|
||||
pageVariables: "Variáveis de página"
|
||||
_relayStatus:
|
||||
requesting: "Pendente"
|
||||
accepted: "Aprovado"
|
||||
rejected: "Recusado"
|
||||
_notification:
|
||||
fileUploaded: "Carregamento de arquivo efetuado com sucesso"
|
||||
youGotMention: "{name} te mencionou"
|
||||
youGotReply: "{name} te respondeu"
|
||||
youGotQuote: "{name} te citou"
|
||||
|
@ -189,6 +376,7 @@ _notification:
|
|||
pollEnded: "Os resultados da enquete agora estão disponíveis"
|
||||
emptyPushNotificationMessage: "As notificações de alerta foram atualizadas"
|
||||
_types:
|
||||
all: "Todos"
|
||||
follow: "Seguindo"
|
||||
mention: "Menção"
|
||||
reply: "Respostas"
|
||||
|
@ -226,5 +414,3 @@ _deck:
|
|||
list: "Listas"
|
||||
mentions: "Menções"
|
||||
direct: "Notas diretas"
|
||||
_postForm: {}
|
||||
_services: {}
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
---
|
||||
_lang_: "Română"
|
||||
headlineMisskey: "O rețea conectată prin note"
|
||||
introMisskey: "Bine ai venit! FoundKey este un serviciu de microblogging open source\
|
||||
\ și decentralizat.\nCreează \"note\" cu care să îți poți împărți gândurile cu oricine\
|
||||
\ din jurul tău. \U0001F4E1\nCu \"reacții\" îți poți expirma rapid părerea despre\
|
||||
\ notele oricui. \U0001F44D\nHai să explorăm o lume nouă! \U0001F680"
|
||||
introMisskey: "Bine ai venit! Misskey este un serviciu de microblogging open source și decentralizat.\nCreează \"note\" cu care să îți poți împărți gândurile cu oricine din jurul tău. 📡\nCu \"reacții\" îți poți expirma rapid părerea despre notele oricui. 👍\nHai să explorăm o lume nouă! 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Caută"
|
||||
notifications: "Notificări"
|
||||
|
@ -14,6 +12,7 @@ fetchingAsApObject: "Se aduce din Fediverse..."
|
|||
ok: "OK"
|
||||
gotIt: "Am înțeles!"
|
||||
cancel: "Anulează"
|
||||
enterUsername: "Introdu numele de utilizator"
|
||||
renotedBy: "Re-notat de {user}"
|
||||
noNotes: "Nicio notă"
|
||||
noNotifications: "Nicio notificare"
|
||||
|
@ -29,20 +28,27 @@ login: "Autentifică-te"
|
|||
loggingIn: "Se autentifică"
|
||||
logout: "Deconectează-te"
|
||||
signup: "Înregistrează-te"
|
||||
uploading: "Se încarcă"
|
||||
save: "Salvează"
|
||||
users: "Utilizatori"
|
||||
addUser: "Adăugă utilizator"
|
||||
favorite: "Adaugă la favorite"
|
||||
favorites: "Favorite"
|
||||
unfavorite: "Elimină din favorite"
|
||||
favorited: "Adăugat la favorite."
|
||||
alreadyFavorited: "Deja adăugat la favorite."
|
||||
cantFavorite: "Nu se poate adăuga la favorite."
|
||||
pin: "Fixează pe profil"
|
||||
unpin: "Anulati fixare"
|
||||
copyContent: "Copiază conținutul"
|
||||
copyLink: "Copiază link-ul"
|
||||
delete: "Şterge"
|
||||
deleteAndEdit: "Șterge și editează"
|
||||
deleteAndEditConfirm: "Ești sigur că vrei să ștergi această notă și să o editezi?\
|
||||
\ Vei pierde reacțiile, re-notele și răspunsurile acesteia."
|
||||
deleteAndEditConfirm: "Ești sigur că vrei să ștergi această notă și să o editezi? Vei pierde reacțiile, re-notele și răspunsurile acesteia."
|
||||
addToList: "Adaugă în listă"
|
||||
sendMessage: "Trimite un mesaj"
|
||||
copyUsername: "Copiază numele de utilizator"
|
||||
searchUser: "Caută un utilizator"
|
||||
reply: "Răspunde"
|
||||
loadMore: "Incarcă mai mult"
|
||||
showMore: "Arată mai mult"
|
||||
|
@ -57,13 +63,12 @@ import: "Importă"
|
|||
export: "Exportă"
|
||||
files: "Fișiere"
|
||||
download: "Descarcă"
|
||||
driveFileDeleteConfirm: "Ești sigur ca vrei să ștergi fișierul \"{name}\"? Notele\
|
||||
\ atașate fișierului vor fi șterse și ele."
|
||||
driveFileDeleteConfirm: "Ești sigur ca vrei să ștergi fișierul \"{name}\"? Notele atașate fișierului vor fi șterse și ele."
|
||||
unfollowConfirm: "Ești sigur ca vrei să nu mai urmărești pe {name}?"
|
||||
exportRequested: "Ai cerut un export. S-ar putea să ia un pic. Va fi adăugat in Drive-ul\
|
||||
\ tău odată completat."
|
||||
exportRequested: "Ai cerut un export. S-ar putea să ia un pic. Va fi adăugat in Drive-ul tău odată completat."
|
||||
importRequested: "Ai cerut un import. S-ar putea să ia un pic."
|
||||
lists: "Liste"
|
||||
noLists: "Nu ai nici o listă"
|
||||
note: "Notă"
|
||||
notes: "Note"
|
||||
following: "Urmărești"
|
||||
|
@ -75,13 +80,9 @@ error: "Eroare"
|
|||
somethingHappened: "A survenit o eroare"
|
||||
retry: "Reîncearcă"
|
||||
pageLoadError: "A apărut o eroare la încărcarea paginii."
|
||||
pageLoadErrorDescription: "De obicei asta este cauzat de o eroare de rețea sau cache-ul\
|
||||
\ browser-ului. Încearcă să cureți cache-ul și apoi să încerci din nou puțin mai\
|
||||
\ târziu."
|
||||
serverIsDead: "Serverul nu răspunde. Te rugăm să aștepți o perioadă și să încerci\
|
||||
\ din nou."
|
||||
youShouldUpgradeClient: "Pentru a vedea această pagină, te rugăm să îți actualizezi\
|
||||
\ clientul."
|
||||
pageLoadErrorDescription: "De obicei asta este cauzat de o eroare de rețea sau cache-ul browser-ului. Încearcă să cureți cache-ul și apoi să încerci din nou puțin mai târziu."
|
||||
serverIsDead: "Serverul nu răspunde. Te rugăm să aștepți o perioadă și să încerci din nou."
|
||||
youShouldUpgradeClient: "Pentru a vedea această pagină, te rugăm să îți actualizezi clientul."
|
||||
enterListName: "Introdu un nume pentru listă"
|
||||
privacy: "Confidenţialitate"
|
||||
makeFollowManuallyApprove: "Fă cererile de urmărire să necesite aprobare"
|
||||
|
@ -91,16 +92,23 @@ followRequest: "Trimite cerere de urmărire"
|
|||
followRequests: "Cereri de urmărire"
|
||||
unfollow: "Nu mai urmări"
|
||||
followRequestPending: "Cerere de urmărire în așteptare"
|
||||
enterEmoji: "Introdu un emoji"
|
||||
renote: "Re-notează"
|
||||
unrenote: "Ia înapoi re-nota"
|
||||
renoted: "Re-notat."
|
||||
cantRenote: "Această postare nu poate fi re-notată."
|
||||
cantReRenote: "O re-notă nu poate fi re-notată."
|
||||
quote: "Citează"
|
||||
pinnedNote: "Notă fixată"
|
||||
pinned: "Fixat pe profil"
|
||||
you: "Tu"
|
||||
clickToShow: "Click pentru a afișa"
|
||||
sensitive: "NSFW"
|
||||
add: "Adaugă"
|
||||
reaction: "Reacție"
|
||||
reactionSetting: "Reacții care să apară in selectorul de reacții"
|
||||
reactionSettingDescription2: "Trage pentru a rearanja, apasă pe \"+\" pentru a adăuga."
|
||||
rememberNoteVisibility: "Amintește setarea de vizibilitate a notelor"
|
||||
attachCancel: "Înlătură atașament"
|
||||
markAsSensitive: "Marchează ca NSFW"
|
||||
unmarkAsSensitive: "Demarchează ca NSFW"
|
||||
|
@ -123,68 +131,66 @@ editWidgetsExit: "Terminat"
|
|||
customEmojis: "Emoji personalizat"
|
||||
emoji: "Emoji"
|
||||
emojis: "Emoji-uri"
|
||||
emojiName: "Numele emoji-ului"
|
||||
emojiUrl: "URL-ul emoji-ului"
|
||||
addEmoji: "Adaugă un emoji"
|
||||
settingGuide: "Setări recomandate"
|
||||
cacheRemoteFiles: "Ține fișierele externe in cache"
|
||||
cacheRemoteFilesDescription: "Când această setare este dezactivată, fișierele externe\
|
||||
\ sunt încărcate direct din instanța externă. Dezactivarea va scădea utilizarea\
|
||||
\ spațiului de stocare, dar va crește traficul, deoarece thumbnail-urile nu vor\
|
||||
\ fi generate."
|
||||
cacheRemoteFilesDescription: "Când această setare este dezactivată, fișierele externe sunt încărcate direct din instanța externă. Dezactivarea va scădea utilizarea spațiului de stocare, dar va crește traficul, deoarece thumbnail-urile nu vor fi generate."
|
||||
flagAsBot: "Marchează acest cont ca bot"
|
||||
flagAsBotDescription: "Activează această opțiune dacă acest cont este controlat de\
|
||||
\ un program. Daca e activată, aceasta va juca rolul unui indicator pentru dezvoltatori\
|
||||
\ pentru a preveni interacțiunea în lanțuri infinite cu ceilalți boți și ajustează\
|
||||
\ sistemele interne al FoundKey pentru a trata acest cont drept un bot."
|
||||
flagAsBotDescription: "Activează această opțiune dacă acest cont este controlat de un program. Daca e activată, aceasta va juca rolul unui indicator pentru dezvoltatori pentru a preveni interacțiunea în lanțuri infinite cu ceilalți boți și ajustează sistemele interne al Misskey pentru a trata acest cont drept un bot."
|
||||
flagAsCat: "Marchează acest cont ca pisică"
|
||||
flagAsCatDescription: "Activează această opțiune dacă acest cont este o pisică."
|
||||
flagShowTimelineReplies: "Arată răspunsurile în cronologie"
|
||||
flagShowTimelineRepliesDescription: "Dacă e activată vor fi arătate în cronologie\
|
||||
\ răspunsurile utilizatorilor către alte notele altor utilizatori."
|
||||
autoAcceptFollowed: "Aprobă automat cererile de urmărire de la utilizatorii pe care\
|
||||
\ îi urmărești"
|
||||
flagShowTimelineRepliesDescription: "Dacă e activată vor fi arătate în cronologie răspunsurile utilizatorilor către alte notele altor utilizatori."
|
||||
autoAcceptFollowed: "Aprobă automat cererile de urmărire de la utilizatorii pe care îi urmărești"
|
||||
addAccount: "Adaugă un cont"
|
||||
loginFailed: "Autentificare eșuată"
|
||||
showOnRemote: "Vezi mai multe pe instanța externă"
|
||||
general: "General"
|
||||
wallpaper: "Imagine de fundal"
|
||||
setWallpaper: "Setați imaginea de fundal"
|
||||
removeWallpaper: "Șterge imagine de fundal"
|
||||
searchWith: "Caută: {q}"
|
||||
youHaveNoLists: "Nu ai nici o listă"
|
||||
followConfirm: "Ești sigur ca vrei să urmărești pe {name}?"
|
||||
proxyAccount: "Cont proxy"
|
||||
proxyAccountDescription: "Un cont proxy este un cont care se comportă ca un urmăritor\
|
||||
\ extern pentru utilizatorii puși sub anumite condiții. De exemplu, când un cineva\
|
||||
\ adaugă un utilizator extern intr-o listă, activitatea utilizatorului extern nu\
|
||||
\ va fi adusă în instanță daca nici un utilizator local nu urmărește acel utilizator,\
|
||||
\ așa că în schimb contul proxy îl va urmări."
|
||||
proxyAccountDescription: "Un cont proxy este un cont care se comportă ca un urmăritor extern pentru utilizatorii puși sub anumite condiții. De exemplu, când un cineva adaugă un utilizator extern intr-o listă, activitatea utilizatorului extern nu va fi adusă în instanță daca nici un utilizator local nu urmărește acel utilizator, așa că în schimb contul proxy îl va urmări."
|
||||
host: "Gazdă"
|
||||
selectUser: "Selectează un utilizator"
|
||||
recipient: "Destinatar"
|
||||
annotation: "Adnotări"
|
||||
federation: "Federație"
|
||||
instances: "Instanțe"
|
||||
registeredAt: "Înregistrat în"
|
||||
latestRequestSentAt: "Ultima cerere trimisă"
|
||||
latestRequestReceivedAt: "Ultima cerere primită"
|
||||
latestStatus: "Ultimul status"
|
||||
storageUsage: "Utilizare stocare"
|
||||
charts: "Diagrame"
|
||||
perHour: "Pe oră"
|
||||
perDay: "Pe zi"
|
||||
stopActivityDelivery: "Nu mai trimite activități"
|
||||
blockThisInstance: "Blochează această instanță"
|
||||
operations: "Operațiuni"
|
||||
software: "Software"
|
||||
version: "Versiune"
|
||||
metadata: "Metadata"
|
||||
withNFiles: "{n} fișier(e)"
|
||||
monitor: "Monitor"
|
||||
jobQueue: "coada de job-uri"
|
||||
cpuAndMemory: "CPU și memorie"
|
||||
network: "Rețea"
|
||||
disk: "Disk"
|
||||
instanceInfo: "Informații despre instanță"
|
||||
statistics: "Statistici"
|
||||
clearQueue: "Șterge coada"
|
||||
clearQueueConfirmTitle: "Ești sigur că vrei să cureți coada?"
|
||||
clearQueueConfirmText: "Orice notă rămasă în coadă nu va fi federată. De obicei această\
|
||||
\ operație nu este necesară."
|
||||
clearQueueConfirmText: "Orice notă rămasă în coadă nu va fi federată. De obicei această operație nu este necesară."
|
||||
clearCachedFiles: "Golește cache-ul"
|
||||
clearCachedFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele externe din\
|
||||
\ cache?"
|
||||
clearCachedFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele externe din cache?"
|
||||
blockedInstances: "Instanțe blocate"
|
||||
blockedInstancesDescription: "Scrie hostname-urile instanțelor pe care dorești să\
|
||||
\ le blochezi. Instanțele listate nu vor mai putea să comunice cu această instanță."
|
||||
blockedInstancesDescription: "Scrie hostname-urile instanțelor pe care dorești să le blochezi. Instanțele listate nu vor mai putea să comunice cu această instanță."
|
||||
muteAndBlock: "Amuțiri și Blocări"
|
||||
mutedUsers: "Utilizatori amuțiți"
|
||||
blockedUsers: "Utilizatori blocați"
|
||||
|
@ -192,7 +198,7 @@ noUsers: "Niciun utilizator"
|
|||
editProfile: "Editează profilul"
|
||||
noteDeleteConfirm: "Ești sigur că vrei să ștergi această notă?"
|
||||
pinLimitExceeded: "Nu poți mai fixa mai multe note"
|
||||
intro: "FoundKey s-a instalat! Te rog crează un utilizator admin."
|
||||
intro: "Misskey s-a instalat! Te rog crează un utilizator admin."
|
||||
done: "Gata"
|
||||
processing: "Se procesează"
|
||||
preview: "Previzualizare"
|
||||
|
@ -206,6 +212,9 @@ all: "Tot"
|
|||
subscribing: "Abonare"
|
||||
publishing: "Publicare"
|
||||
notResponding: "Nu răspunde"
|
||||
instanceFollowing: "Urmărind în instanță"
|
||||
instanceFollowers: "Urmăritori ai instanței"
|
||||
instanceUsers: "Utilizatori ai acestei instanțe"
|
||||
changePassword: "Schimbă parolă"
|
||||
security: "Securitate"
|
||||
retypedNotMatch: "Intrările nu corespund"
|
||||
|
@ -221,6 +230,7 @@ lookup: "Privire"
|
|||
announcements: "Anunțuri"
|
||||
imageUrl: "URL-ul imaginii"
|
||||
remove: "Şterge"
|
||||
removed: "Șterș cu succes"
|
||||
removeAreYouSure: "Ești sigur că vrei să înlături {x}?"
|
||||
deleteAreYouSure: "Ești sigur că vrei să ștergi {x}?"
|
||||
resetAreYouSure: "Sigur vrei să resetezi?"
|
||||
|
@ -228,14 +238,14 @@ saved: "Salvat"
|
|||
messaging: "Chat"
|
||||
upload: "Încarcă"
|
||||
keepOriginalUploading: "Păstrează imaginea originală"
|
||||
keepOriginalUploadingDescription: "Salvează imaginea originala încărcată fără modificări.\
|
||||
\ Dacă e oprită, o versiune pentru afișarea pe web va fi generată la încărcare."
|
||||
keepOriginalUploadingDescription: "Salvează imaginea originala încărcată fără modificări. Dacă e oprită, o versiune pentru afișarea pe web va fi generată la încărcare."
|
||||
fromDrive: "Din Drive"
|
||||
fromUrl: "Din URL"
|
||||
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"
|
||||
|
@ -244,8 +254,7 @@ agreeTo: "Sunt de acord cu {0}"
|
|||
tos: "Termenii de utilizare"
|
||||
start: "Să începem"
|
||||
home: "Acasă"
|
||||
remoteUserCaution: "Deoarece acest utilizator este dintr-o instanță externă, informația\
|
||||
\ afișată poate fi incompletă."
|
||||
remoteUserCaution: "Deoarece acest utilizator este dintr-o instanță externă, informația afișată poate fi incompletă."
|
||||
activity: "Activitate"
|
||||
images: "Imagini"
|
||||
birthday: "Zi de naștere"
|
||||
|
@ -261,6 +270,7 @@ lightThemes: "Teme luminoase"
|
|||
darkThemes: "Teme întunecate"
|
||||
syncDeviceDarkMode: "Sincronizează Modul Întunecat cu setările dispozitivului"
|
||||
drive: "Drive"
|
||||
fileName: "Nume fișier"
|
||||
selectFile: "Alege un fisier"
|
||||
selectFiles: "Alege fișiere"
|
||||
selectFolder: "Selectează un folder"
|
||||
|
@ -271,12 +281,13 @@ 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ă"
|
||||
inputNewFolderName: "Introdu un nume de folder nou"
|
||||
circularReferenceFolder: "Destinația folderului este un subfolder al folderului pe\
|
||||
\ care dorești să îl muți."
|
||||
circularReferenceFolder: "Destinația folderului este un subfolder al folderului pe care dorești să îl muți."
|
||||
hasChildFilesOrFolders: "Acest folder nu este gol, așa că nu poate fi șters."
|
||||
copyUrl: "Copiază URL"
|
||||
rename: "Redenumește"
|
||||
|
@ -305,10 +316,13 @@ dayX: "{day}"
|
|||
monthX: "{month}"
|
||||
yearX: "{year}"
|
||||
pages: "Pagini"
|
||||
integration: "Integrare"
|
||||
connectService: "Conectează"
|
||||
disconnectService: "Deconectează"
|
||||
enableLocalTimeline: "Activează cronologia locală"
|
||||
enableGlobalTimeline: "Activeaza cronologia globală"
|
||||
disablingTimelinesInfo: "Administratorii și Moderatorii vor avea mereu access la toate\
|
||||
\ cronologiile, chiar dacă nu sunt activate."
|
||||
disablingTimelinesInfo: "Administratorii și Moderatorii vor avea mereu access la toate cronologiile, chiar dacă nu sunt activate."
|
||||
registration: "Inregistrare"
|
||||
enableRegistration: "Activează înregistrările pentru utilizatori noi"
|
||||
invite: "Invită"
|
||||
driveCapacityPerLocalAccount: "Capacitatea Drive-ului per utilizator local"
|
||||
|
@ -317,20 +331,32 @@ inMb: "În megabytes"
|
|||
iconUrl: "URL-ul iconiței"
|
||||
bannerUrl: "URL-ul imaginii de banner"
|
||||
backgroundImageUrl: "URL-ul imaginii de fundal"
|
||||
basicInfo: "Informații de bază"
|
||||
pinnedUsers: "Utilizatori fixați"
|
||||
pinnedUsersDescription: "Scrie utilizatorii, separați prin pauză de rând, care vor fi fixați pe pagina \"Explorează\"."
|
||||
pinnedPages: "Pagini fixate"
|
||||
pinnedPagesDescription: "Introdu linkurile Paginilor pe care le vrei fixate in vâruful paginii acestei instanțe, separate de pauze de rând."
|
||||
pinnedClipId: "ID-ul clip-ului pe care să îl fixezi"
|
||||
pinnedNotes: "Notă fixată"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Activează hCaptcha"
|
||||
hcaptchaSiteKey: "Site key"
|
||||
hcaptchaSecretKey: "Secret key"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Activează reCAPTCHA"
|
||||
recaptchaSiteKey: "Site key"
|
||||
recaptchaSecretKey: "Secret key"
|
||||
avoidMultiCaptchaConfirm: "Folosirea mai multor sisteme Captcha poate cauza interferență între acestea. Ai dori să dezactivezi alte sisteme Captcha acum active? Dacă preferi să rămână activate, apasă Anulare."
|
||||
antennas: "Antene"
|
||||
manageAntennas: "Gestionează Antenele"
|
||||
name: "Nume"
|
||||
antennaSource: "Sursa antenei"
|
||||
antennaKeywords: "Cuvinte cheie ascultate"
|
||||
antennaExcludeKeywords: "Cuvinte cheie excluse"
|
||||
antennaKeywordsDescription: "Separă cu spații pentru o condiție ȘI sau cu o întrerupere\
|
||||
\ de rând pentru o condiție SAU."
|
||||
antennaKeywordsDescription: "Separă cu spații pentru o condiție ȘI sau cu o întrerupere de rând pentru o condiție SAU."
|
||||
notifyAntenna: "Notifică-mă pentru note noi"
|
||||
withFileAntenna: "Doar note cu fișiere"
|
||||
enableServiceworker: "Activează ServiceWorker"
|
||||
antennaUsersDescription: "Scrie un nume de utilizator per linie"
|
||||
caseSensitive: "Sensibil la majuscule și minuscule"
|
||||
withReplies: "Include răspunsuri"
|
||||
|
@ -341,8 +367,16 @@ 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"
|
||||
exploreUsersCount: "Aici sunt {count} utilizatori"
|
||||
exploreFediverse: "Explorează Fediverse-ul"
|
||||
popularTags: "Taguri populare"
|
||||
userList: "Liste"
|
||||
aboutMisskey: "Despre FoundKey"
|
||||
about: "Despre"
|
||||
aboutMisskey: "Despre Misskey"
|
||||
administrator: "Administrator"
|
||||
token: "Token"
|
||||
twoStepAuthentication: "Autentificare în doi pași"
|
||||
|
@ -361,6 +395,7 @@ share: "Distribuie"
|
|||
notFound: "Nu a fost găsit"
|
||||
notFoundDescription: "N-a fost găsită nicio pagină cu acest URL."
|
||||
uploadFolder: "Folder implicit pentru încărcări"
|
||||
cacheClear: "Golește cache-ul"
|
||||
markAsReadAllNotifications: "Marchează toate notificările drept citit"
|
||||
markAsReadAllUnreadNotes: "Marchează toate notele drept citit"
|
||||
markAsReadAllTalkMessages: "Marchează toate mesajele drept citit"
|
||||
|
@ -381,6 +416,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"
|
||||
|
@ -390,6 +426,7 @@ noMessagesYet: "Niciun mesaj încă"
|
|||
newMessageExists: "Ai mesaje noi"
|
||||
onlyOneFileCanBeAttached: "Poți atașa un singur fișier la un mesaj"
|
||||
signinRequired: "Te rog autentifică-te"
|
||||
invitations: "Invită"
|
||||
invitationCode: "Cod de invitație"
|
||||
checking: "Se verifică..."
|
||||
available: "Disponibil"
|
||||
|
@ -402,13 +439,14 @@ normalPassword: "Parolă medie"
|
|||
strongPassword: "Parolă puternică"
|
||||
passwordMatched: "Se potrivește!"
|
||||
passwordNotMatched: "Nu se potrivește"
|
||||
signinFailed: "Nu se poate autentifica. Numele de utilizator sau parola introduse\
|
||||
\ sunt incorecte."
|
||||
signinWith: "Autentifică-te cu {x}"
|
||||
signinFailed: "Nu se poate autentifica. Numele de utilizator sau parola introduse sunt incorecte."
|
||||
tapSecurityKey: "Apasă pe cheia ta de securitate."
|
||||
or: "Sau"
|
||||
language: "Limbă"
|
||||
uiLanguage: "Limba interfeței"
|
||||
groupInvited: "Ai fost invitat într-un grup"
|
||||
aboutX: "Despre {x}"
|
||||
useOsNativeEmojis: "Folosește emojiuri native OS-ului"
|
||||
disableDrawer: "Nu folosi meniuri în stil sertar"
|
||||
youHaveNoGroups: "Nu ai niciun grup"
|
||||
|
@ -416,44 +454,49 @@ joinOrCreateGroup: "Primește o invitație într-un grup sau creează unul nou."
|
|||
noHistory: "Nu există istoric"
|
||||
signinHistory: "Istoric autentificări"
|
||||
disableAnimatedMfm: "Dezactivează MFM cu animații"
|
||||
doing: "Se procesează..."
|
||||
category: "Categorie"
|
||||
tags: "Etichete"
|
||||
docSource: "Sursa acestui document"
|
||||
createAccount: "Creează un cont"
|
||||
existingAccount: "Cont existent"
|
||||
regenerate: "Regenerează"
|
||||
fontSize: "Mărimea fontului"
|
||||
noFollowRequests: "Nu ai nicio cerere de urmărire în așteptare"
|
||||
openImageInNewTab: "Deschide imaginile în taburi noi"
|
||||
dashboard: "Panou de control"
|
||||
local: "Local"
|
||||
remote: "Extern"
|
||||
total: "Total"
|
||||
weekOverWeekChanges: "Schimbări până săptămâna trecută"
|
||||
dayOverDayChanges: "Schimbări până ieri"
|
||||
appearance: "Aspect"
|
||||
clientSettings: "Setări client"
|
||||
accountSettings: "Setări cont"
|
||||
promotion: "Promovat"
|
||||
promote: "Promovează"
|
||||
numberOfDays: "Numărul zilelor"
|
||||
hideThisNote: "Ascunde această notă"
|
||||
showFeaturedNotesInTimeline: "Arată notele recomandate în cronologii"
|
||||
objectStorage: "Object Storage"
|
||||
useObjectStorage: "Folosește Object Storage"
|
||||
objectStorageBaseUrl: "URL de bază"
|
||||
objectStorageBaseUrlDesc: "URL-ul este folosit pentru referință. Specifică URL-ul\
|
||||
\ CDN-ului sau Proxy-ului tău dacă folosești unul. Pentru S3 folosește 'https://<bucket>.s3.amazonaws.com'\
|
||||
\ și pentru GCS sau servicii echivalente folosește 'https://storage.googleapis.com/<bucket>',\
|
||||
\ etc."
|
||||
objectStorageBaseUrlDesc: "URL-ul este folosit pentru referință. Specifică URL-ul CDN-ului sau Proxy-ului tău dacă folosești unul. Pentru S3 folosește 'https://<bucket>.s3.amazonaws.com' și pentru GCS sau servicii echivalente folosește 'https://storage.googleapis.com/<bucket>', etc."
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "Te rog specifică numele bucket-ului furnizorului tău."
|
||||
objectStoragePrefix: "Prefix"
|
||||
objectStoragePrefixDesc: "Fișierele vor fi stocate sub directoare cu acest prefix."
|
||||
objectStorageEndpoint: "Endpoint"
|
||||
objectStorageEndpointDesc: "Lasă acest câmp gol dacă folosești AWS S3, dacă nu specifică\
|
||||
\ endpoint-ul ca '<host>' sau '<host>:<port>', depinzând de ce serviciu folosești."
|
||||
objectStorageEndpointDesc: "Lasă acest câmp gol dacă folosești AWS S3, dacă nu specifică endpoint-ul ca '<host>' sau '<host>:<port>', depinzând de ce serviciu folosești."
|
||||
objectStorageRegion: "Regiune"
|
||||
objectStorageRegionDesc: "Specifică o regiune precum 'xx-east-1'. Dacă serviciul tău\
|
||||
\ nu face distincția între regiuni lasă acest câmp gol sau introdu 'us-east-1'."
|
||||
objectStorageRegionDesc: "Specifică o regiune precum 'xx-east-1'. Dacă serviciul tău nu face distincția între regiuni lasă acest câmp gol sau introdu 'us-east-1'."
|
||||
objectStorageUseSSL: "Folosește SSl"
|
||||
objectStorageUseSSLDesc: "Oprește această opțiune dacă nu vei folosi HTTPS pentru\
|
||||
\ conexiunile API-ului"
|
||||
objectStorageUseSSLDesc: "Oprește această opțiune dacă nu vei folosi HTTPS pentru conexiunile API-ului"
|
||||
objectStorageUseProxy: "Conectează-te prin Proxy"
|
||||
objectStorageUseProxyDesc: "Oprește această opțiune dacă vei nu folosi un Proxy pentru\
|
||||
\ conexiunile API-ului"
|
||||
objectStorageUseProxyDesc: "Oprește această opțiune dacă vei nu folosi un Proxy pentru conexiunile API-ului"
|
||||
objectStorageSetPublicRead: "Setează \"public-read\" pentru încărcare"
|
||||
serverLogs: "Loguri server"
|
||||
deleteAll: "Șterge tot"
|
||||
showFixedPostForm: "Arată caseta de postare în vârful cronologie"
|
||||
newNoteRecived: "Sunt note noi"
|
||||
sounds: "Sunete"
|
||||
|
@ -464,6 +507,7 @@ popout: "Scoate în afară"
|
|||
volume: "Volum"
|
||||
masterVolume: "Volumul principal"
|
||||
details: "Detalii"
|
||||
chooseEmoji: "Alege un emoji"
|
||||
unableToProcess: "Această operație nu poate fi completată"
|
||||
recentUsed: "Folosit recent"
|
||||
install: "Instalează"
|
||||
|
@ -477,42 +521,46 @@ sort: "Sortează"
|
|||
ascendingOrder: "Crescător"
|
||||
descendingOrder: "Descrescător"
|
||||
scratchpad: "Scratchpad"
|
||||
scratchpadDescription: "Scratchpad-ul oferă un mediu de experimentare în AiScript.\
|
||||
\ Poți scrie, executa și verifica rezultatele acestuia interacționând cu FoundKey\
|
||||
\ în el."
|
||||
scratchpadDescription: "Scratchpad-ul oferă un mediu de experimentare în AiScript. Poți scrie, executa și verifica rezultatele acestuia interacționând cu Misskey în el."
|
||||
output: "Ieșire"
|
||||
script: "Script"
|
||||
disablePagesScript: "Dezactivează AiScript în Pagini"
|
||||
updateRemoteUser: "Actualizează informațiile utilizatorului extern"
|
||||
deleteAllFiles: "Șterge toate fișierele"
|
||||
deleteAllFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele?"
|
||||
removeAllFollowing: "Dezurmărește toți utilizatorii urmăriți"
|
||||
removeAllFollowingDescription: "Asta va dez-urmări toate conturile din {host}. Te\
|
||||
\ rog execută asta numai dacă instanța, de ex., nu mai există."
|
||||
removeAllFollowingDescription: "Asta va dez-urmări toate conturile din {host}. Te rog execută asta numai dacă instanța, de ex., nu mai există."
|
||||
userSuspended: "Acest utilizator a fost suspendat."
|
||||
userSilenced: "Acest utilizator a fost setat silențios."
|
||||
yourAccountSuspendedTitle: "Acest cont a fost suspendat"
|
||||
yourAccountSuspendedDescription: "Acest cont a fost suspendat din cauza încălcării\
|
||||
\ termenilor de serviciu al serverului sau ceva similar. Contactează administratorul\
|
||||
\ dacă ai dori să afli un motiv mai detaliat. Te rog nu crea un cont nou."
|
||||
yourAccountSuspendedDescription: "Acest cont a fost suspendat din cauza încălcării termenilor de serviciu al serverului sau ceva similar. Contactează administratorul dacă ai dori să afli un motiv mai detaliat. Te rog nu crea un cont nou."
|
||||
menu: "Meniu"
|
||||
divider: "Separator"
|
||||
addItem: "Adaugă element"
|
||||
relays: "Relee"
|
||||
addRelay: "Adaugă Releu"
|
||||
inboxUrl: "URL-ul inbox-ului"
|
||||
addedRelays: "Relee adăugate"
|
||||
serviceworkerInfo: "Trebuie să fie activat pentru notificări push."
|
||||
deletedNote: "Notă ștearsă"
|
||||
invisibleNote: "Note ascunse"
|
||||
enableInfiniteScroll: "Încarcă mai mult automat"
|
||||
visibility: "Vizibilitate"
|
||||
poll: "Sondaj"
|
||||
useCw: "Ascunde conținutul"
|
||||
enablePlayer: "Deschide player-ul video"
|
||||
disablePlayer: "Închide player-ul video"
|
||||
expandTweet: "Expandează tweet"
|
||||
themeEditor: "Editor de teme"
|
||||
description: "Descriere"
|
||||
describeFile: "Adaugă titrări"
|
||||
enterFileDescription: "Introdu titrările"
|
||||
author: "Autor"
|
||||
leaveConfirm: "Ai schimbări nesalvate. Vrei să renunți la ele?"
|
||||
manage: "Gestionare"
|
||||
plugins: "Pluginuri"
|
||||
deck: "Deck"
|
||||
undeck: "Părăsește Deck"
|
||||
useBlurEffectForModal: "Folosește efect de blur pentru modale"
|
||||
width: "Lăţime"
|
||||
height: "Înălţime"
|
||||
|
@ -524,14 +572,13 @@ permission: "Permisiuni"
|
|||
enableAll: "Actevează tot"
|
||||
disableAll: "Dezactivează tot"
|
||||
tokenRequested: "Acordă acces la cont"
|
||||
pluginTokenRequestedDescription: "Acest plugin va putea să folosească permisiunile\
|
||||
\ setate aici."
|
||||
pluginTokenRequestedDescription: "Acest plugin va putea să folosească permisiunile setate aici."
|
||||
notificationType: "Tipul notificării"
|
||||
edit: "Editează"
|
||||
useStarForReactionFallback: "Folosește ★ ca fallback dacă emoji-ul este necunoscut"
|
||||
emailServer: "Server email"
|
||||
enableEmail: "Activează distribuția de emailuri"
|
||||
emailConfigInfo: "Folosit pentru a confirma emailul tău în timpul logări dacă îți\
|
||||
\ uiți parola"
|
||||
emailConfigInfo: "Folosit pentru a confirma emailul tău în timpul logări dacă îți uiți parola"
|
||||
email: "Email"
|
||||
emailAddress: "Adresă de email"
|
||||
smtpConfig: "Configurare Server SMTP"
|
||||
|
@ -539,51 +586,54 @@ smtpHost: "Gazdă"
|
|||
smtpPort: "Port"
|
||||
smtpUser: "Nume de utilizator"
|
||||
smtpPass: "Parolă"
|
||||
emptyToDisableSmtpAuth: "Lasă username-ul și parola necompletate pentru a dezactiva\
|
||||
\ verificarea SMTP"
|
||||
emptyToDisableSmtpAuth: "Lasă username-ul și parola necompletate pentru a dezactiva verificarea SMTP"
|
||||
smtpSecure: "Folosește SSL/TLS implicit pentru conecțiunile SMTP"
|
||||
smtpSecureInfo: "Oprește opțiunea asta dacă STARTTLS este folosit"
|
||||
testEmail: "Testează livrarea emailurilor"
|
||||
wordMute: "Cuvinte pe mut"
|
||||
regexpError: "Eroare de Expresie Regulată"
|
||||
regexpErrorDescription: "A apărut o eroare în expresia regulată pe linia {line} al\
|
||||
\ cuvintelor {tab} setate pe mut:"
|
||||
regexpErrorDescription: "A apărut o eroare în expresia regulată pe linia {line} al cuvintelor {tab} setate pe mut:"
|
||||
instanceMute: "Instanțe pe mut"
|
||||
userSaysSomething: "{name} a spus ceva"
|
||||
makeActive: "Activează"
|
||||
display: "Arată"
|
||||
copy: "Copiază"
|
||||
metrics: "Metrici"
|
||||
overview: "Privire de ansamblu"
|
||||
logs: "Log-uri"
|
||||
delayed: "Întârziate"
|
||||
database: "Baza de date"
|
||||
channel: "Canale"
|
||||
create: "Crează"
|
||||
notificationSetting: "Setări notificări"
|
||||
notificationSettingDesc: "Selectează tipurile de notificări care să fie arătate"
|
||||
useGlobalSetting: "Folosește setările globale"
|
||||
useGlobalSettingDesc: "Dacă opțiunea e pornită, notificările contului tău vor fi folosite.\
|
||||
\ Dacă e oprită, configurația va fi individuală."
|
||||
useGlobalSettingDesc: "Dacă opțiunea e pornită, notificările contului tău vor fi folosite. Dacă e oprită, configurația va fi individuală."
|
||||
other: "Altele"
|
||||
regenerateLoginToken: "Regenerează token de login"
|
||||
regenerateLoginTokenDescription: "Regenerează token-ul folosit intern în timpul logări.\
|
||||
\ În mod normal asta nu este necesar. Odată regenerat, toate dispozitivele vor fi\
|
||||
\ delogate."
|
||||
regenerateLoginTokenDescription: "Regenerează token-ul folosit intern în timpul logări. În mod normal asta nu este necesar. Odată regenerat, toate dispozitivele vor fi delogate."
|
||||
setMultipleBySeparatingWithSpace: "Separă mai multe intrări cu spații."
|
||||
fileIdOrUrl: "Introdu ID sau URL"
|
||||
behavior: "Comportament"
|
||||
sample: "exemplu"
|
||||
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"
|
||||
forwardReport: "Redirecționează raportul către instanța externă"
|
||||
forwardReportIsAnonymous: "În locul contului tău, va fi afișat un cont anonim, de\
|
||||
\ sistem, ca raportor către instanța externă."
|
||||
forwardReportIsAnonymous: "În locul contului tău, va fi afișat un cont anonim, de sistem, ca raportor către instanța externă."
|
||||
send: "Trimite"
|
||||
abuseMarkAsResolved: "Marchează raportul ca rezolvat"
|
||||
openInNewTab: "Deschide în tab nou"
|
||||
openInSideView: "Deschide în vedere laterală"
|
||||
defaultNavigationBehaviour: "Comportament de navigare implicit"
|
||||
editTheseSettingsMayBreakAccount: "Editarea acestor setări îți pot defecta contul."
|
||||
waitingFor: "Așteptând pentru {x}"
|
||||
random: "Aleator"
|
||||
system: "Sistem"
|
||||
switchUi: "Schimbă UI"
|
||||
desktop: "Desktop"
|
||||
|
@ -591,6 +641,8 @@ clearCache: "Golește cache-ul"
|
|||
info: "Despre"
|
||||
user: "Utilizatori"
|
||||
administration: "Gestionare"
|
||||
middle: "Mediu"
|
||||
sent: "Trimite"
|
||||
_email:
|
||||
_follow:
|
||||
title: "te-a urmărit"
|
||||
|
@ -601,6 +653,10 @@ _mfm:
|
|||
search: "Caută"
|
||||
_theme:
|
||||
description: "Descriere"
|
||||
keys:
|
||||
mention: "Mențiune"
|
||||
renote: "Re-notează"
|
||||
divider: "Separator"
|
||||
_sfx:
|
||||
note: "Note"
|
||||
notification: "Notificări"
|
||||
|
@ -628,6 +684,27 @@ _charts:
|
|||
federation: "Federație"
|
||||
_timelines:
|
||||
home: "Acasă"
|
||||
_pages:
|
||||
blocks:
|
||||
image: "Imagini"
|
||||
script:
|
||||
categories:
|
||||
list: "Liste"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Liste"
|
||||
_randomPick:
|
||||
arg1: "Liste"
|
||||
_dailyRandomPick:
|
||||
arg1: "Liste"
|
||||
_seedRandomPick:
|
||||
arg2: "Liste"
|
||||
_pick:
|
||||
arg1: "Liste"
|
||||
_listLen:
|
||||
arg1: "Liste"
|
||||
types:
|
||||
array: "Liste"
|
||||
_notification:
|
||||
youWereFollowed: "te-a urmărit"
|
||||
youWereInvitedToGroup: "Ai fost invitat într-un grup"
|
||||
|
@ -647,4 +724,3 @@ _deck:
|
|||
antenna: "Antene"
|
||||
list: "Liste"
|
||||
mentions: "Mențiuni"
|
||||
_services: {}
|
||||
|
|
|
@ -1,9 +1,7 @@
|
|||
---
|
||||
_lang_: "Svenska"
|
||||
headlineMisskey: "Ett nätverk kopplat av noter"
|
||||
introMisskey: "Välkommen! FoundKey är en öppen och decentraliserad mikrobloggningstjänst.\n\
|
||||
Skapa en \"not\" och dela dina tankar med alla runtomkring dig. \U0001F4E1\nMed\
|
||||
\ \"reaktioner\" kan du snabbt uttrycka dina känslor kring andras noter.\U0001F44D\
|
||||
\nLåt oss utforska en nya värld!\U0001F680"
|
||||
introMisskey: "Välkommen! Misskey är en öppen och decentraliserad mikrobloggningstjänst.\nSkapa en \"not\" och dela dina tankar med alla runtomkring dig. 📡\nMed \"reaktioner\" kan du snabbt uttrycka dina känslor kring andras noter.👍\nLåt oss utforska en nya värld!🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Sök"
|
||||
notifications: "Notifikationer"
|
||||
|
@ -14,6 +12,7 @@ fetchingAsApObject: "Hämtar från Fediversum..."
|
|||
ok: "OK"
|
||||
gotIt: "Uppfattat!"
|
||||
cancel: "Avbryt"
|
||||
enterUsername: "Ange användarnamn"
|
||||
renotedBy: "Omnoterad av {user}"
|
||||
noNotes: "Inga noteringar"
|
||||
noNotifications: "Inga aviseringar"
|
||||
|
@ -29,20 +28,27 @@ login: "Logga in"
|
|||
loggingIn: "Loggar in"
|
||||
logout: "Logga ut"
|
||||
signup: "Registrera"
|
||||
uploading: "Uppladdning sker..."
|
||||
save: "Spara"
|
||||
users: "Användare"
|
||||
addUser: "Lägg till användare"
|
||||
favorite: "Lägg till i favoriter"
|
||||
favorites: "Favoriter"
|
||||
unfavorite: "Avfavorisera"
|
||||
favorited: "Tillagd i favoriter."
|
||||
alreadyFavorited: "Redan tillagd i favoriter."
|
||||
cantFavorite: "Gick inte att lägga till i favoriter."
|
||||
pin: "Fäst till profil"
|
||||
unpin: "Lossa från profil"
|
||||
copyContent: "Kopiera innehåll"
|
||||
copyLink: "Kopiera länk"
|
||||
delete: "Radera"
|
||||
deleteAndEdit: "Radera och ändra"
|
||||
deleteAndEditConfirm: "Är du säker att du vill radera denna not och ändra den? Du\
|
||||
\ kommer förlora alla reaktioner, omnoteringar och svar till den."
|
||||
deleteAndEditConfirm: "Är du säker att du vill radera denna not och ändra den? Du kommer förlora alla reaktioner, omnoteringar och svar till den."
|
||||
addToList: "Lägg till i lista"
|
||||
sendMessage: "Skicka ett meddelande"
|
||||
copyUsername: "Kopiera användarnamn"
|
||||
searchUser: "Sök användare"
|
||||
reply: "Svara"
|
||||
loadMore: "Ladda mer"
|
||||
showMore: "Visa mer"
|
||||
|
@ -57,13 +63,12 @@ import: "Importera"
|
|||
export: "Exportera"
|
||||
files: "Filer"
|
||||
download: "Nedladdning"
|
||||
driveFileDeleteConfirm: "Är du säker att du vill radera filen \"{name}\"? Noter med\
|
||||
\ denna fil bifogad kommer också raderas."
|
||||
driveFileDeleteConfirm: "Är du säker att du vill radera filen \"{name}\"? Noter med denna fil bifogad kommer också raderas."
|
||||
unfollowConfirm: "Är du säker att du vill avfölja {name}?"
|
||||
exportRequested: "Du har begärt en export. Detta kan ta lite tid. Den kommer läggas\
|
||||
\ till i din Drive när den blir klar."
|
||||
exportRequested: "Du har begärt en export. Detta kan ta lite tid. Den kommer läggas till i din Drive när den blir klar."
|
||||
importRequested: "Du har begärt en import. Detta kan ta lite tid."
|
||||
lists: "Listor"
|
||||
noLists: "Du har inga listor"
|
||||
note: "Not"
|
||||
notes: "Noter"
|
||||
following: "Följer"
|
||||
|
@ -71,15 +76,13 @@ 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."
|
||||
pageLoadErrorDescription: "Detta händer oftast p.g.a. nätverksfel eller din webbläsarcache.\
|
||||
\ Försök tömma din cache och testa sedan igen efter en liten stund."
|
||||
pageLoadErrorDescription: "Detta händer oftast p.g.a. nätverksfel eller din webbläsarcache. Försök tömma din cache och testa sedan igen efter en liten stund."
|
||||
serverIsDead: "Servern svarar inte. Vänta ett litet tag och försök igen."
|
||||
youShouldUpgradeClient: "För att kunna se denna sida, vänligen ladda om sidan för\
|
||||
\ att uppdatera din klient."
|
||||
youShouldUpgradeClient: "För att kunna se denna sida, vänligen ladda om sidan för att uppdatera din klient."
|
||||
enterListName: "Skriv ett namn till listan"
|
||||
privacy: "Integritet"
|
||||
makeFollowManuallyApprove: "Följarförfrågningar kräver manuellt godkännande"
|
||||
|
@ -89,17 +92,23 @@ followRequest: "Skicka följarförfrågan"
|
|||
followRequests: "Följarförfrågningar"
|
||||
unfollow: "Avfölj"
|
||||
followRequestPending: "Följarförfrågning avvaktar för svar"
|
||||
enterEmoji: "Skriv en emoji"
|
||||
renote: "Omnotera"
|
||||
unrenote: "Ta tillbaka omnotering"
|
||||
renoted: "Omnoterad."
|
||||
cantRenote: "Inlägget kunde inte bli omnoterat."
|
||||
cantReRenote: "En omnotering kan inte bli omnoterad."
|
||||
quote: "Citat"
|
||||
pinnedNote: "Fästad not"
|
||||
pinned: "Fäst till profil"
|
||||
you: "Du"
|
||||
clickToShow: "Klicka för att visa"
|
||||
sensitive: "Känsligt innehåll"
|
||||
add: "Lägg till"
|
||||
reaction: "Reaktioner"
|
||||
reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"\
|
||||
+\" för att lägga till."
|
||||
reactionSetting: "Reaktioner som ska visas i reaktionsväljaren"
|
||||
reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"+\" för att lägga till."
|
||||
rememberNoteVisibility: "Komihåg notvisningsinställningar"
|
||||
attachCancel: "Ta bort bilaga"
|
||||
markAsSensitive: "Markera som känsligt innehåll"
|
||||
unmarkAsSensitive: "Avmarkera som känsligt innehåll"
|
||||
|
@ -122,76 +131,74 @@ editWidgetsExit: "Avsluta redigering"
|
|||
customEmojis: "Anpassa emoji"
|
||||
emoji: "Emoji"
|
||||
emojis: "Emoji"
|
||||
emojiName: "Emoji namn"
|
||||
emojiUrl: "Emoji länk"
|
||||
addEmoji: "Lägg till emoji"
|
||||
settingGuide: "Rekommenderade inställningar"
|
||||
cacheRemoteFiles: "Spara externa filer till cachen"
|
||||
cacheRemoteFilesDescription: "När denna inställning är avstängd kommer externa filer\
|
||||
\ laddas direkt från den externa instansen. Genom att stänga av detta kommer lagringsutrymme\
|
||||
\ minska i användning men kommer öka datatrafiken eftersom miniatyrer inte kommer\
|
||||
\ genereras."
|
||||
cacheRemoteFilesDescription: "När denna inställning är avstängd kommer externa filer laddas direkt från den externa instansen. Genom att stänga av detta kommer lagringsutrymme minska i användning men kommer öka datatrafiken eftersom miniatyrer inte kommer genereras."
|
||||
flagAsBot: "Markera konto som bot"
|
||||
flagAsBotDescription: "Aktivera det här alternativet om kontot är kontrollerat av\
|
||||
\ ett program. Om aktiverat kommer den fungera som en flagga för andra utvecklare\
|
||||
\ för att hindra ändlösa kedjor med andra bottar. Det kommer också få FoundKeys\
|
||||
\ interna system att hantera kontot som en bot."
|
||||
flagAsBotDescription: "Aktivera det här alternativet om kontot är kontrollerat av ett program. Om aktiverat kommer den fungera som en flagga för andra utvecklare för att hindra ändlösa kedjor med andra bottar. Det kommer också få Misskeys interna system att hantera kontot som en bot."
|
||||
flagAsCat: "Markera konto som katt"
|
||||
flagAsCatDescription: "Aktivera denna inställning för att markera kontot som en katt."
|
||||
flagShowTimelineReplies: "Visa svar i tidslinje"
|
||||
flagShowTimelineRepliesDescription: "Visar användarsvar till andra användares noter\
|
||||
\ i tidslinjen om påslagen."
|
||||
flagShowTimelineRepliesDescription: "Visar användarsvar till andra användares noter i tidslinjen om påslagen."
|
||||
autoAcceptFollowed: "Godkänn följarförfrågningar från användare du följer automatiskt"
|
||||
addAccount: "Lägg till konto"
|
||||
loginFailed: "Inloggningen misslyckades"
|
||||
showOnRemote: "Se på extern instans"
|
||||
general: "Allmänt"
|
||||
wallpaper: "Bakgrundsbild"
|
||||
setWallpaper: "Välj bakgrund"
|
||||
removeWallpaper: "Ta bort bakgrund"
|
||||
searchWith: "Sök: {q}"
|
||||
youHaveNoLists: "Du har inga listor"
|
||||
followConfirm: "Är du säker att du vill följa {name}?"
|
||||
proxyAccount: "Proxykonto"
|
||||
proxyAccountDescription: "Ett proxykonto är ett konto som agerar som en extern följare\
|
||||
\ för användare under vissa villkor. Till exempel, när en användare lägger till\
|
||||
\ en extern användare till en lista så kommer den externa användarens aktivitet\
|
||||
\ inte levireras till instansen om ingen lokal användare följer det kontot, så proxykontot\
|
||||
\ används istället."
|
||||
proxyAccountDescription: "Ett proxykonto är ett konto som agerar som en extern följare för användare under vissa villkor. Till exempel, när en användare lägger till en extern användare till en lista så kommer den externa användarens aktivitet inte levireras till instansen om ingen lokal användare följer det kontot, så proxykontot används istället."
|
||||
host: "Värd"
|
||||
selectUser: "Välj användare"
|
||||
recipient: "Mottagare"
|
||||
annotation: "Kommentarer"
|
||||
federation: "Federation"
|
||||
instances: "Instanser"
|
||||
registeredAt: "Registrerad på"
|
||||
latestRequestSentAt: "Senaste förfrågan skickad"
|
||||
latestRequestReceivedAt: "Senaste begäran mottagen"
|
||||
latestStatus: "Senaste status"
|
||||
storageUsage: "Använt lagringsutrymme"
|
||||
charts: "Diagram"
|
||||
perHour: "Per timme"
|
||||
perDay: "Per dag"
|
||||
stopActivityDelivery: "Sluta skicka aktiviteter"
|
||||
blockThisInstance: "Blockera instans"
|
||||
operations: "Operationer"
|
||||
software: "Mjukvara"
|
||||
version: "Version"
|
||||
metadata: "Metadata"
|
||||
withNFiles: "{n} fil(er)"
|
||||
monitor: "Övervakning"
|
||||
jobQueue: "Jobbkö"
|
||||
cpuAndMemory: "CPU och minne"
|
||||
network: "Nätverk"
|
||||
disk: "Disk"
|
||||
instanceInfo: "Instansinformation"
|
||||
statistics: "Statistik"
|
||||
clearQueue: "Rensa kö"
|
||||
clearQueueConfirmTitle: "Är du säker att du vill rensa kön?"
|
||||
clearQueueConfirmText: "Om någon not är olevererad i kön kommer den inte federeras.\
|
||||
\ Vanligtvis behövs inte denna handling."
|
||||
clearQueueConfirmText: "Om någon not är olevererad i kön kommer den inte federeras. Vanligtvis behövs inte denna handling."
|
||||
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."
|
||||
intro: "FoundKey har installerats! Vänligen skapa en adminanvändare."
|
||||
pinLimitExceeded: "Du kan inte fästa fler noter"
|
||||
intro: "Misskey har installerats! Vänligen skapa en adminanvändare."
|
||||
done: "Klar"
|
||||
processing: "Bearbetar..."
|
||||
preview: "Förhandsvisning"
|
||||
|
@ -205,9 +212,12 @@ all: "Allt"
|
|||
subscribing: "Prenumererar"
|
||||
publishing: "Publiceras"
|
||||
notResponding: "Svarar inte"
|
||||
instanceFollowing: "Följer på instans"
|
||||
instanceFollowers: "Följare av instans"
|
||||
instanceUsers: "Användare av denna instans"
|
||||
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"
|
||||
|
@ -220,6 +230,7 @@ lookup: "Sökning"
|
|||
announcements: "Nyheter"
|
||||
imageUrl: "Bild-URL"
|
||||
remove: "Radera"
|
||||
removed: "Borttaget"
|
||||
removeAreYouSure: "Är du säker att du vill radera \"{x}\"?"
|
||||
deleteAreYouSure: "Är du säker att du vill radera \"{x}\"?"
|
||||
resetAreYouSure: "Vill du återställa?"
|
||||
|
@ -228,6 +239,7 @@ messaging: "Chatt"
|
|||
upload: "Ladda upp"
|
||||
keepOriginalUploading: "Behåll originalbild"
|
||||
nsfw: "Känsligt innehåll"
|
||||
pinnedNotes: "Fästad not"
|
||||
userList: "Listor"
|
||||
smtpHost: "Värd"
|
||||
smtpUser: "Användarnamn"
|
||||
|
@ -242,7 +254,10 @@ _mfm:
|
|||
quote: "Citat"
|
||||
emoji: "Anpassa emoji"
|
||||
search: "Sök"
|
||||
_theme: {}
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Nämn"
|
||||
renote: "Omnotera"
|
||||
_sfx:
|
||||
note: "Noter"
|
||||
notification: "Notifikationer"
|
||||
|
@ -265,6 +280,25 @@ _exportOrImport:
|
|||
userLists: "Listor"
|
||||
_charts:
|
||||
federation: "Federation"
|
||||
_pages:
|
||||
script:
|
||||
categories:
|
||||
list: "Listor"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Listor"
|
||||
_randomPick:
|
||||
arg1: "Listor"
|
||||
_dailyRandomPick:
|
||||
arg1: "Listor"
|
||||
_seedRandomPick:
|
||||
arg2: "Listor"
|
||||
_pick:
|
||||
arg1: "Listor"
|
||||
_listLen:
|
||||
arg1: "Listor"
|
||||
types:
|
||||
array: "Listor"
|
||||
_notification:
|
||||
youWereFollowed: "följde dig"
|
||||
_types:
|
||||
|
@ -282,35 +316,3 @@ _deck:
|
|||
tl: "Tidslinje"
|
||||
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
|
||||
|
|
|
@ -1,10 +1,6 @@
|
|||
---
|
||||
_lang_: "Türkçe"
|
||||
introMisskey: "Açık kaynaklı bir dağıtılmış mikroblog hizmeti olan FoundKey'e hoş\
|
||||
\ geldiniz.\nFoundKey, neler olup bittiğini paylaşmak ve herkese sizden bahsetmek\
|
||||
\ için \"notlar\" oluşturmanıza olanak tanıyan, açık kaynaklı, dağıtılmış bir mikroblog\
|
||||
\ hizmetidir.\nHerkesin notlarına kendi tepkilerinizi hızlıca eklemek için \"Tepkiler\"\
|
||||
\ özelliğini de kullanabilirsiniz\U0001F44D.\nYeni bir dünyayı keşfedin\U0001F680\
|
||||
."
|
||||
introMisskey: "Açık kaynaklı bir dağıtılmış mikroblog hizmeti olan Misskey'e hoş geldiniz.\nMisskey, neler olup bittiğini paylaşmak ve herkese sizden bahsetmek için \"notlar\" oluşturmanıza olanak tanıyan, açık kaynaklı, dağıtılmış bir mikroblog hizmetidir.\nHerkesin notlarına kendi tepkilerinizi hızlıca eklemek için \"Tepkiler\" özelliğini de kullanabilirsiniz👍.\nYeni bir dünyayı keşfedin🚀."
|
||||
monthAndDay: "{month}Ay {day}Gün"
|
||||
search: "Arama"
|
||||
notifications: "Bildirim"
|
||||
|
@ -14,6 +10,7 @@ forgotPassword: "şifremi unuttum"
|
|||
ok: "TAMAM"
|
||||
gotIt: "Anladım"
|
||||
cancel: "İptal"
|
||||
enterUsername: "Kullanıcı adınızı giriniz"
|
||||
noNotes: "Notlar mevcut değil."
|
||||
noNotifications: "Bildirim bulunmuyor"
|
||||
settings: "Ayarlar"
|
||||
|
@ -23,22 +20,29 @@ 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"
|
||||
uploading: "Yükleniyor"
|
||||
users: "Kullanıcı"
|
||||
addUser: "Kullanıcı Ekle"
|
||||
favorite: "Favoriler"
|
||||
favorites: "Favoriler"
|
||||
unfavorite: "Favorilerden Kaldır"
|
||||
favorited: "Favorilerime eklendi."
|
||||
alreadyFavorited: "Zaten favorilerinizde kayıtlı."
|
||||
pin: "Sabitlenmiş"
|
||||
unpin: "Sabitlemeyi kaldır"
|
||||
copyContent: "İçeriği kopyala"
|
||||
copyLink: "Bağlantıyı Kopyala"
|
||||
delete: "Sil"
|
||||
deleteAndEdit: "Sil ve yeniden düzenle"
|
||||
deleteAndEditConfirm: "Bu notu silip yeniden düzenlemek istiyor musunuz? Bu nota ilişkin\
|
||||
\ tüm Tepkiler, Yeniden Notlar ve Yanıtlar da silinecektir."
|
||||
deleteAndEditConfirm: "Bu notu silip yeniden düzenlemek istiyor musunuz? Bu nota ilişkin tüm Tepkiler, Yeniden Notlar ve Yanıtlar da silinecektir."
|
||||
addToList: "Listeye ekle"
|
||||
sendMessage: "Mesaj Gönder"
|
||||
copyUsername: "Kullanıcı Adını Kopyala"
|
||||
searchUser: "Kullanıcıları ara"
|
||||
pinned: "Sabitlenmiş"
|
||||
remove: "Sil"
|
||||
smtpUser: "Kullanıcı Adı"
|
||||
smtpPass: "Şifre"
|
||||
|
@ -56,6 +60,3 @@ _deck:
|
|||
_columns:
|
||||
notifications: "Bildirim"
|
||||
tl: "Zaman çizelgesi"
|
||||
_notification: {}
|
||||
_services: {}
|
||||
_email: {}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
_lang_: "中文(简体)"
|
||||
headlineMisskey: "通过帖子连接在一起的网络"
|
||||
introMisskey: "欢迎!FoundKey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!\U0001F4E1\
|
||||
\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈\U0001F44D\n来探索新的世界吧!\U0001F680"
|
||||
introMisskey: "欢迎!Misskey是一个开源的、去中心化的“微博客”服务。\n通过编写「帖文」来和大家分享你的以及你周围的事情吧!📡\n通过「回应」功能,可以让你快速地对大家的帖文表达反馈👍\n来探索新的世界吧!🚀"
|
||||
monthAndDay: "{month}月 {day}日"
|
||||
search: "搜索"
|
||||
notifications: "通知"
|
||||
|
@ -12,6 +12,7 @@ fetchingAsApObject: "正在联邦宇宙查询中..."
|
|||
ok: "OK"
|
||||
gotIt: "我明白了"
|
||||
cancel: "取消"
|
||||
enterUsername: "输入用户名"
|
||||
renotedBy: "由 {user} 转贴"
|
||||
noNotes: "没有帖文"
|
||||
noNotifications: "无通知"
|
||||
|
@ -27,9 +28,16 @@ login: "登录"
|
|||
loggingIn: "正在登录..."
|
||||
logout: "登出"
|
||||
signup: "新用户注册"
|
||||
uploading: "正在上传"
|
||||
save: "保存"
|
||||
users: "用户"
|
||||
addUser: "添加用户"
|
||||
favorite: "收藏"
|
||||
favorites: "收藏"
|
||||
unfavorite: "取消收藏"
|
||||
favorited: "已加入收藏夹。"
|
||||
alreadyFavorited: "收藏夹中已存在。"
|
||||
cantFavorite: "无法添加到收藏夹。"
|
||||
pin: "置顶"
|
||||
unpin: "取消置顶"
|
||||
copyContent: "复制内容"
|
||||
|
@ -40,6 +48,7 @@ deleteAndEditConfirm: "要删除此帖并再次编辑吗?对此帖的所有回
|
|||
addToList: "添加至列表"
|
||||
sendMessage: "发送"
|
||||
copyUsername: "复制用户名"
|
||||
searchUser: "搜索用户"
|
||||
reply: "回复"
|
||||
loadMore: "查看更多"
|
||||
showMore: "查看更多"
|
||||
|
@ -59,6 +68,7 @@ unfollowConfirm: "要取消对{name}的关注吗?"
|
|||
exportRequested: "导出请求已提交,这可能需要花一些时间,导出的文件将保存到网盘中。"
|
||||
importRequested: "导入请求已提交,这可能需要花一点时间。"
|
||||
lists: "列表"
|
||||
noLists: "列表为空"
|
||||
note: "帖子"
|
||||
notes: "帖子"
|
||||
following: "关注中"
|
||||
|
@ -82,16 +92,23 @@ followRequest: "关注申请"
|
|||
followRequests: "关注申请"
|
||||
unfollow: "取消关注"
|
||||
followRequestPending: "发送关注请求"
|
||||
enterEmoji: "输入表情符号"
|
||||
renote: "转发"
|
||||
unrenote: "取消转发"
|
||||
renoted: "已转发。"
|
||||
cantRenote: "该帖无法转发。"
|
||||
cantReRenote: "转发无法被再次转发。"
|
||||
quote: "引用"
|
||||
pinnedNote: "已置顶的帖子"
|
||||
pinned: "置顶"
|
||||
you: "您"
|
||||
clickToShow: "点击以显示"
|
||||
sensitive: "敏感内容"
|
||||
add: "添加"
|
||||
reaction: "回应"
|
||||
reactionSetting: "在选择器中显示的回应"
|
||||
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
||||
rememberNoteVisibility: "保存上次设置的可见性"
|
||||
attachCancel: "删除附件"
|
||||
markAsSensitive: "标记为敏感内容"
|
||||
unmarkAsSensitive: "取消标记为敏感内容"
|
||||
|
@ -114,11 +131,14 @@ editWidgetsExit: "完成编辑"
|
|||
customEmojis: "自定义表情符号"
|
||||
emoji: "表情符号"
|
||||
emojis: "表情符号"
|
||||
emojiName: "表情符号名称"
|
||||
emojiUrl: "表情符号地址"
|
||||
addEmoji: "添加表情符号"
|
||||
settingGuide: "推荐配置"
|
||||
cacheRemoteFiles: "远程文件缓存"
|
||||
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程实例载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
|
||||
flagAsBot: "这是一个机器人账号"
|
||||
flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让FoundKey的内部系统将此帐户识别为机器人。"
|
||||
flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。"
|
||||
flagAsCat: "将这个账户设定为一只猫"
|
||||
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。"
|
||||
flagShowTimelineReplies: "在时间线上显示帖子的回复"
|
||||
|
@ -128,8 +148,10 @@ addAccount: "添加账户"
|
|||
loginFailed: "登录失败"
|
||||
showOnRemote: "转到所在实例显示"
|
||||
general: "常规设置"
|
||||
wallpaper: "壁纸"
|
||||
setWallpaper: "设置壁纸"
|
||||
removeWallpaper: "移除壁纸"
|
||||
searchWith: "搜索:{q}"
|
||||
youHaveNoLists: "列表为空"
|
||||
followConfirm: "你确定要关注{name}吗?"
|
||||
proxyAccount: "代理账户"
|
||||
|
@ -139,19 +161,27 @@ selectUser: "选择用户"
|
|||
recipient: "收件人"
|
||||
annotation: "注解"
|
||||
federation: "联合"
|
||||
instances: "实例"
|
||||
registeredAt: "初次观测"
|
||||
latestRequestSentAt: "上次发送的请求"
|
||||
latestRequestReceivedAt: "上次收到的请求"
|
||||
latestStatus: "最后状态"
|
||||
storageUsage: "已用存储"
|
||||
charts: "图表"
|
||||
perHour: "每小时"
|
||||
perDay: "每天"
|
||||
stopActivityDelivery: "停止发送活动"
|
||||
blockThisInstance: "阻止此实例向本实例推流"
|
||||
operations: "操作"
|
||||
software: "软件"
|
||||
version: "版本"
|
||||
metadata: "元数据"
|
||||
withNFiles: "{n}个文件"
|
||||
monitor: "服务器状态"
|
||||
jobQueue: "作业队列"
|
||||
cpuAndMemory: "CPU和内存"
|
||||
network: "网络"
|
||||
disk: "存储"
|
||||
instanceInfo: "实例信息"
|
||||
statistics: "统计"
|
||||
clearQueue: "清除队列"
|
||||
|
@ -168,7 +198,7 @@ noUsers: "无用户"
|
|||
editProfile: "编辑资料"
|
||||
noteDeleteConfirm: "要删除该帖子吗?"
|
||||
pinLimitExceeded: "无法置顶更多了"
|
||||
intro: "FoundKey的部署结束啦!填写管理员账号吧!"
|
||||
intro: "Misskey的部署结束啦!填写管理员账号吧!"
|
||||
done: "完成"
|
||||
processing: "正在处理"
|
||||
preview: "预览"
|
||||
|
@ -182,6 +212,9 @@ all: "全部"
|
|||
subscribing: "已订阅"
|
||||
publishing: "直播中"
|
||||
notResponding: "没有响应"
|
||||
instanceFollowing: "关注实例"
|
||||
instanceFollowers: "关注实例"
|
||||
instanceUsers: "实例用户"
|
||||
changePassword: "修改密码"
|
||||
security: "安全"
|
||||
retypedNotMatch: "两次输入不一致!"
|
||||
|
@ -197,6 +230,7 @@ lookup: "查询"
|
|||
announcements: "公告"
|
||||
imageUrl: "图片URL"
|
||||
remove: "删除"
|
||||
removed: "已删除"
|
||||
removeAreYouSure: "要删掉「{x}」吗?"
|
||||
deleteAreYouSure: "要删掉「{x}」吗?"
|
||||
resetAreYouSure: "恢复默认设置?"
|
||||
|
@ -211,6 +245,7 @@ uploadFromUrl: "从网址上传"
|
|||
uploadFromUrlDescription: "输入文件的URL"
|
||||
uploadFromUrlRequested: "请求上传"
|
||||
uploadFromUrlMayTakeTime: "上传可能需要一些时间完成。"
|
||||
explore: "发现"
|
||||
messageRead: "已读"
|
||||
noMoreHistory: "没有更多的历史记录"
|
||||
startMessaging: "添加聊天"
|
||||
|
@ -235,6 +270,7 @@ lightThemes: "浅色主题"
|
|||
darkThemes: "深色主题"
|
||||
syncDeviceDarkMode: "将深色模式与设备设置同步"
|
||||
drive: "网盘"
|
||||
fileName: "文件名称"
|
||||
selectFile: "选择文件"
|
||||
selectFiles: "选择文件"
|
||||
selectFolder: "选择文件夹"
|
||||
|
@ -245,6 +281,8 @@ createFolder: "创建文件夹"
|
|||
renameFolder: "重命名文件夹"
|
||||
deleteFolder: "删除文件夹"
|
||||
addFile: "添加文件"
|
||||
emptyDrive: "网盘中无文件"
|
||||
emptyFolder: "此文件夹中无文件"
|
||||
unableToDelete: "无法删除"
|
||||
inputNewFileName: "请输入新文件名"
|
||||
inputNewDescription: "请输入新标题"
|
||||
|
@ -278,9 +316,13 @@ dayX: "{day}日"
|
|||
monthX: "{month}月"
|
||||
yearX: "{year}年"
|
||||
pages: "页面"
|
||||
integration: "关联"
|
||||
connectService: "连接"
|
||||
disconnectService: "断开连接"
|
||||
enableLocalTimeline: "启用本地时间线功能"
|
||||
enableGlobalTimeline: "启用全局时间线"
|
||||
disablingTimelinesInfo: "即使时间线功能被禁用,出于方便,管理员和数据图表也可以继续使用。"
|
||||
registration: "注册"
|
||||
enableRegistration: "允许新用户注册"
|
||||
invite: "邀请"
|
||||
driveCapacityPerLocalAccount: "每个用户的网盘空间"
|
||||
|
@ -289,10 +331,22 @@ inMb: "以兆字节(MegaByte)为单位"
|
|||
iconUrl: "图标URL"
|
||||
bannerUrl: "横幅URL"
|
||||
backgroundImageUrl: "背景图URL"
|
||||
basicInfo: "基本信息"
|
||||
pinnedUsers: "置顶用户"
|
||||
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
||||
pinnedPages: "固定页面"
|
||||
pinnedPagesDescription: "输入您要固定到实例首页的页面路径,以换行符分隔。"
|
||||
pinnedClipId: "置顶的书签ID"
|
||||
pinnedNotes: "已置顶的帖子"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "启用 hCaptcha"
|
||||
hcaptchaSiteKey: "网站密钥"
|
||||
hcaptchaSecretKey: "密钥"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)"
|
||||
recaptchaSiteKey: "网站密钥"
|
||||
recaptchaSecretKey: "reCAPTCHA 密钥"
|
||||
avoidMultiCaptchaConfirm: "使用多种验证方式可能会造成干扰,您要禁用其他验证方式吗?您可以按“取消”按钮,仍然保持启用多种验证方式。"
|
||||
antennas: "天线"
|
||||
manageAntennas: "天线管理"
|
||||
name: "名称"
|
||||
|
@ -302,6 +356,7 @@ antennaExcludeKeywords: "排除关键字"
|
|||
antennaKeywordsDescription: "使用空格分隔会产生AND规范,并且使用换行符分隔会产生OR规范"
|
||||
notifyAntenna: "开启通知"
|
||||
withFileAntenna: "仅带有附件的帖子"
|
||||
enableServiceworker: "启用ServiceWorker"
|
||||
antennaUsersDescription: "指定用户名,用换行符分隔"
|
||||
caseSensitive: "区分大小写"
|
||||
withReplies: "包括回复"
|
||||
|
@ -312,8 +367,16 @@ silence: "禁言"
|
|||
silenceConfirm: "确认要禁言吗?"
|
||||
unsilence: "解除禁言"
|
||||
unsilenceConfirm: "要解除禁言吗?"
|
||||
popularUsers: "热门用户"
|
||||
recentlyUpdatedUsers: "最近投稿的用户"
|
||||
recentlyRegisteredUsers: "最近登录的用户"
|
||||
recentlyDiscoveredUsers: "最近发现的用户"
|
||||
exploreUsersCount: "有{count}个用户"
|
||||
exploreFediverse: "探索联邦宇宙"
|
||||
popularTags: "热门标签"
|
||||
userList: "列表"
|
||||
aboutMisskey: "关于 FoundKey"
|
||||
about: "关于"
|
||||
aboutMisskey: "关于 Misskey"
|
||||
administrator: "管理员"
|
||||
token: "Token (令牌)"
|
||||
twoStepAuthentication: "两步验证"
|
||||
|
@ -332,6 +395,7 @@ share: "分享"
|
|||
notFound: "未找到"
|
||||
notFoundDescription: "没有与指定URL对应的页面。"
|
||||
uploadFolder: "默认上传文件夹"
|
||||
cacheClear: "清空缓存"
|
||||
markAsReadAllNotifications: "将所有通知标为已读"
|
||||
markAsReadAllUnreadNotes: "将所有帖子标记为已读"
|
||||
markAsReadAllTalkMessages: "将所有聊天标记为已读"
|
||||
|
@ -352,6 +416,7 @@ messagingWithGroup: "与群组聊天"
|
|||
title: "标题"
|
||||
text: "文本"
|
||||
enable: "启用"
|
||||
next: "下一个"
|
||||
retype: "重新输入"
|
||||
noteOf: "{user}的帖子"
|
||||
inviteToGroup: "群组邀请"
|
||||
|
@ -361,6 +426,7 @@ noMessagesYet: "现在没有新的聊天"
|
|||
newMessageExists: "新信息"
|
||||
onlyOneFileCanBeAttached: "只能添加一个附件"
|
||||
signinRequired: "请先登录"
|
||||
invitations: "邀请"
|
||||
invitationCode: "邀请码"
|
||||
checking: "正在确认"
|
||||
available: "可用"
|
||||
|
@ -373,12 +439,14 @@ normalPassword: "密码强度:中等"
|
|||
strongPassword: "密码强度:强"
|
||||
passwordMatched: "密码一致"
|
||||
passwordNotMatched: "密码不一致"
|
||||
signinWith: "以{x}登录"
|
||||
signinFailed: "无法登录,请检查您的用户名和密码是否正确。"
|
||||
tapSecurityKey: "轻触硬件安全密钥"
|
||||
or: "或者"
|
||||
language: "语言"
|
||||
uiLanguage: "显示语言"
|
||||
groupInvited: "您有新的群组邀请"
|
||||
aboutX: "关于 {x}"
|
||||
useOsNativeEmojis: "使用系统的原生表情符号"
|
||||
disableDrawer: "不显示抽屉菜单"
|
||||
youHaveNoGroups: "没有群组"
|
||||
|
@ -386,25 +454,34 @@ joinOrCreateGroup: "请加入一个现有的群组,或者创建新群组。"
|
|||
noHistory: "没有历史记录"
|
||||
signinHistory: "登录历史"
|
||||
disableAnimatedMfm: "禁用MFM动画"
|
||||
doing: "正在进行"
|
||||
category: "类别"
|
||||
tags: "标签"
|
||||
docSource: "文件来源"
|
||||
createAccount: "注册账户"
|
||||
existingAccount: "现有的账户"
|
||||
regenerate: "重新生成"
|
||||
fontSize: "字体大小"
|
||||
noFollowRequests: "没有关注申请"
|
||||
openImageInNewTab: "在新标签页中打开图片"
|
||||
dashboard: "管理面板"
|
||||
local: "本地"
|
||||
remote: "远程"
|
||||
total: "总计"
|
||||
weekOverWeekChanges: "与前一周相比"
|
||||
dayOverDayChanges: "与前一日相比"
|
||||
appearance: "外观"
|
||||
clientSettings: "客户端设置"
|
||||
accountSettings: "账户设置"
|
||||
promotion: "推广"
|
||||
promote: "推广"
|
||||
numberOfDays: "天数"
|
||||
hideThisNote: "隐藏这条帖子"
|
||||
showFeaturedNotesInTimeline: "在时间线上显示热门推荐"
|
||||
objectStorage: "对象存储"
|
||||
useObjectStorage: "使用对象存储"
|
||||
objectStorageBaseUrl: "Base URL"
|
||||
objectStorageBaseUrlDesc: "URL前缀,用于构造URL到对象(媒体)的引用,如果您使用的是CDN或反向代理,请指定其URL,否则请根据您使用的服务指定可公开访问的地址。例如“https://<bucket>.s3.amazonaws.com”用于AWS\
|
||||
\ S3,“https://storage.googleapis.com/<bucket>”用于GCS"
|
||||
objectStorageBaseUrlDesc: "URL前缀,用于构造URL到对象(媒体)的引用,如果您使用的是CDN或反向代理,请指定其URL,否则请根据您使用的服务指定可公开访问的地址。例如“https://<bucket>.s3.amazonaws.com”用于AWS S3,“https://storage.googleapis.com/<bucket>”用于GCS"
|
||||
objectStorageBucket: "存储桶"
|
||||
objectStorageBucketDesc: "请指定使用的对象存储服务的存储桶名称。"
|
||||
objectStoragePrefix: "前缀"
|
||||
|
@ -418,6 +495,8 @@ objectStorageUseSSLDesc: "如果不使用https进行API连接,请关闭。"
|
|||
objectStorageUseProxy: "使用代理"
|
||||
objectStorageUseProxyDesc: "如果您不使用代理进行API连接,请将其关闭。"
|
||||
objectStorageSetPublicRead: "上传时设置为public-read"
|
||||
serverLogs: "服务器日志"
|
||||
deleteAll: "全部删除"
|
||||
showFixedPostForm: "在时间线顶部显示发帖框"
|
||||
newNoteRecived: "有新的帖子"
|
||||
sounds: "提示音"
|
||||
|
@ -428,6 +507,7 @@ popout: "弹窗"
|
|||
volume: "音量"
|
||||
masterVolume: "主音量"
|
||||
details: "详情"
|
||||
chooseEmoji: "选择表情符号"
|
||||
unableToProcess: "操作无法完成"
|
||||
recentUsed: "最近使用"
|
||||
install: "安装"
|
||||
|
@ -441,9 +521,12 @@ sort: "排序"
|
|||
ascendingOrder: "升序"
|
||||
descendingOrder: "降序"
|
||||
scratchpad: "AiScript控制台"
|
||||
scratchpadDescription: "AiScript控制台为AiScript提供了实验环境。您可以编写代码以与FoundKey交互,运行它并查看结果。"
|
||||
scratchpadDescription: "AiScript控制台为AiScript提供了实验环境。您可以编写代码以与Misskey交互,运行它并查看结果。"
|
||||
output: "输出"
|
||||
script: "脚本"
|
||||
disablePagesScript: "禁用页面脚本"
|
||||
updateRemoteUser: "更新远程用户信息"
|
||||
deleteAllFiles: "删除所有文件"
|
||||
deleteAllFilesConfirm: "要删除所有文件吗?"
|
||||
removeAllFollowing: "取消所有关注"
|
||||
removeAllFollowingDescription: "取消{host}的所有关注者。当实例不存在时执行。"
|
||||
|
@ -457,22 +540,29 @@ addItem: "添加项目"
|
|||
relays: "中继"
|
||||
addRelay: "添加中继"
|
||||
inboxUrl: "Inbox URL"
|
||||
addedRelays: "已添加的中继"
|
||||
serviceworkerInfo: "您需要启用推送通知"
|
||||
deletedNote: "已删除的帖子"
|
||||
invisibleNote: "隐藏的帖子"
|
||||
enableInfiniteScroll: "启用自动滚动页面模式"
|
||||
visibility: "可见性"
|
||||
poll: "调查问卷"
|
||||
useCw: "隐藏内容"
|
||||
enablePlayer: "打开播放器"
|
||||
disablePlayer: "关闭播放器"
|
||||
expandTweet: "展开帖子"
|
||||
themeEditor: "主题编辑器"
|
||||
description: "描述"
|
||||
describeFile: "添加标题"
|
||||
enterFileDescription: "输入标题"
|
||||
author: "作者"
|
||||
leaveConfirm: "存在未保存的更改。要放弃更改吗?"
|
||||
manage: "管理"
|
||||
plugins: "插件"
|
||||
deck: "Deck"
|
||||
undeck: "取消Deck"
|
||||
useBlurEffectForModal: "对话框使用模糊效果"
|
||||
useFullReactionPicker: "使用全功能的回应工具栏"
|
||||
width: "宽度"
|
||||
height: "高度"
|
||||
large: "大"
|
||||
|
@ -484,6 +574,7 @@ enableAll: "启用全部"
|
|||
disableAll: "禁用全部"
|
||||
tokenRequested: "允许访问账户"
|
||||
pluginTokenRequestedDescription: "此插件将能够拥有此处设置的权限"
|
||||
notificationType: "通知类型"
|
||||
edit: "编辑"
|
||||
useStarForReactionFallback: "如果回应的是未知表情符号,则使用★作为代替"
|
||||
emailServer: "邮件服务器"
|
||||
|
@ -508,7 +599,10 @@ userSaysSomething: "{name}说了什么"
|
|||
makeActive: "启用"
|
||||
display: "显示"
|
||||
copy: "复制"
|
||||
metrics: "服务器监控"
|
||||
overview: "服务器概况"
|
||||
logs: "日志"
|
||||
delayed: "滞后"
|
||||
database: "数据库"
|
||||
channel: "频道"
|
||||
create: "创建"
|
||||
|
@ -522,10 +616,12 @@ regenerateLoginTokenDescription: "重新生成用于登录的内部令牌。通
|
|||
setMultipleBySeparatingWithSpace: "您可以使用空格分隔多个项目。"
|
||||
fileIdOrUrl: "文件ID或者URL"
|
||||
behavior: "行为"
|
||||
sample: "示例"
|
||||
abuseReports: "举报"
|
||||
reportAbuse: "举报"
|
||||
reportAbuseOf: "举报{name}"
|
||||
fillAbuseReportDescription: "请填写举报的详细原因。"
|
||||
abuseReported: "内容已发送。感谢您提交信息。"
|
||||
reporter: "举报者"
|
||||
reporteeOrigin: "举报来源"
|
||||
reporterOrigin: "举报者来源"
|
||||
|
@ -534,8 +630,12 @@ forwardReportIsAnonymous: "勾选则在远程实例上显示的举报者是匿
|
|||
send: "发送"
|
||||
abuseMarkAsResolved: "处理完毕"
|
||||
openInNewTab: "在新标签页中打开"
|
||||
openInSideView: "在侧边栏中打开"
|
||||
defaultNavigationBehaviour: "默认导航"
|
||||
editTheseSettingsMayBreakAccount: "编辑这些设置可以会损坏您的账号"
|
||||
instanceTicker: "帖子的实例信息"
|
||||
waitingFor: "等待{x}"
|
||||
random: "随机"
|
||||
system: "系统"
|
||||
switchUi: "切换界面"
|
||||
desktop: "桌面"
|
||||
|
@ -544,7 +644,7 @@ createNew: "新建"
|
|||
optional: "可选"
|
||||
createNewClip: "新建书签"
|
||||
public: "公开"
|
||||
i18nInfo: "FoundKey已经被志愿者们翻译成了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。"
|
||||
i18nInfo: "Misskey已经被志愿者们翻译成了各种语言。如果你也有兴趣,可以通过{link}帮助翻译。"
|
||||
manageAccessTokens: "管理 Access Tokens"
|
||||
accountInfo: "账户信息"
|
||||
notesCount: "帖子数量"
|
||||
|
@ -569,12 +669,16 @@ alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
|
|||
loadRawImages: "添加附件图像的缩略图时使用原始图像质量"
|
||||
disableShowingAnimatedImages: "不播放动画"
|
||||
verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成设置。"
|
||||
notSet: "未设置"
|
||||
emailVerified: "电子邮件地址已验证"
|
||||
noteFavoritesCount: "收藏的帖子数"
|
||||
pageLikesCount: "页面点赞次数"
|
||||
pageLikedCount: "页面被点赞次数"
|
||||
contact: "联系人"
|
||||
useSystemFont: "使用系统默认字体"
|
||||
clips: "书签"
|
||||
experimentalFeatures: "实验性功能"
|
||||
developer: "开发者"
|
||||
makeExplorable: "使账号可见。"
|
||||
makeExplorableDescription: "关闭时,账号不会显示在\"发现\"中。"
|
||||
showGapBetweenNotesInTimeline: "时间线上的帖子分开显示。"
|
||||
|
@ -585,16 +689,30 @@ wide: "宽"
|
|||
narrow: "窄"
|
||||
reloadToApplySetting: "页面刷新后设置才会生效。是否现在刷新页面?"
|
||||
needReloadToApply: "重启后应用才会生效。"
|
||||
showTitlebar: "显示标题栏"
|
||||
clearCache: "清除缓存"
|
||||
onlineUsersCount: "{n}人在线"
|
||||
nUsers: "{n}用户"
|
||||
nNotes: "{n}帖子"
|
||||
sendErrorReports: "发送错误报告"
|
||||
sendErrorReportsDescription: "启用后,如果出现问题,可以与Misskey共享详细的错误信息,从而帮助提高软件的质量。"
|
||||
myTheme: "我的主题"
|
||||
backgroundColor: "背景"
|
||||
accentColor: "强调色"
|
||||
textColor: "文本"
|
||||
saveAs: "另存为"
|
||||
advanced: "高级"
|
||||
value: "值"
|
||||
createdAt: "创建日期"
|
||||
updatedAt: "更新时间"
|
||||
saveConfirm: "确定保存?"
|
||||
deleteConfirm: "确定删除?"
|
||||
invalidValue: "无效值。"
|
||||
registry: "注册表"
|
||||
closeAccount: "永久注销账户"
|
||||
currentVersion: "当前版本"
|
||||
latestVersion: "最新版本"
|
||||
youAreRunningUpToDateClient: "您所使用的客户端已经是最新的。"
|
||||
newVersionOfClientAvailable: "新版本的客户端可用。"
|
||||
usageAmount: "使用量"
|
||||
capacity: "容量"
|
||||
|
@ -603,9 +721,12 @@ editCode: "编辑代码"
|
|||
apply: "应用"
|
||||
receiveAnnouncementFromInstance: "从实例接收通知"
|
||||
emailNotification: "邮件通知"
|
||||
publish: "发布"
|
||||
inChannelSearch: "频道内搜索"
|
||||
useReactionPickerForContextMenu: "单击右键打开回应工具栏"
|
||||
typingUsers: "{users}正在输入"
|
||||
jumpToSpecifiedDate: "跳转到特定日期"
|
||||
showingPastTimeline: "显示过去的时间线"
|
||||
clear: "清除"
|
||||
markAllAsRead: "全部标记为已读"
|
||||
goBack: "返回"
|
||||
|
@ -618,6 +739,7 @@ notSpecifiedMentionWarning: "有未指定的提及"
|
|||
info: "关于"
|
||||
userInfo: "用户信息"
|
||||
unknown: "未知"
|
||||
onlineStatus: "在线状态"
|
||||
hideOnlineStatus: "隐藏在线状态"
|
||||
hideOnlineStatusDescription: "隐藏在线状态后,可能会降低例如搜索等功能的便利性。"
|
||||
online: "在线"
|
||||
|
@ -629,7 +751,7 @@ instanceBlocking: "被阻拦的实例"
|
|||
selectAccount: "选择账户"
|
||||
switchAccount: "切换账户"
|
||||
enabled: "已启用"
|
||||
disabled: "已禁用"
|
||||
disabled: "已禁用 "
|
||||
quickAction: "快捷操作"
|
||||
user: "用户"
|
||||
administration: "管理"
|
||||
|
@ -638,25 +760,38 @@ switch: "切换"
|
|||
noMaintainerInformationWarning: "管理人员信息未设置。"
|
||||
noBotProtectionWarning: "Bot保护未设置。"
|
||||
configure: "设置"
|
||||
postToGallery: "发送到图库"
|
||||
gallery: "图库"
|
||||
recentPosts: "最新发布"
|
||||
popularPosts: "热门投稿"
|
||||
shareWithNote: "在帖子中分享"
|
||||
expiration: "截止时间"
|
||||
memo: "便笺"
|
||||
priority: "优先级"
|
||||
high: "高"
|
||||
middle: "中"
|
||||
low: "低"
|
||||
emailNotConfiguredWarning: "电子邮件地址未设置。"
|
||||
ratio: "比率"
|
||||
previewNoteText: "预览文本"
|
||||
customCss: "自定义 CSS"
|
||||
customCssWarn: "这些设置必须有相关的基础知识,不当的配置可能导致客户端无法正常使用!"
|
||||
global: "全局"
|
||||
squareAvatars: "显示方形头像图标"
|
||||
sent: "发送"
|
||||
received: "收取"
|
||||
searchResult: "搜索结果"
|
||||
hashtags: "话题标签"
|
||||
troubleshooting: "故障排除"
|
||||
useBlurEffect: "在UI上使用模糊效果"
|
||||
learnMore: "更多信息"
|
||||
misskeyUpdated: "FoundKey更新完成!"
|
||||
misskeyUpdated: "Misskey更新完成!"
|
||||
whatIsNew: "显示更新信息"
|
||||
translate: "翻译"
|
||||
translatedFrom: "从 {x} 翻译"
|
||||
accountDeletionInProgress: "正在删除账户"
|
||||
usernameInfo: "在服务器上唯一标识您的帐户的名称。您可以使用字母 (a ~ z, A ~ Z)、数字 (0 ~ 9) 和下划线 (_)。用户名以后不能更改。"
|
||||
aiChanMode: "小蓝模式"
|
||||
keepCw: "保留CW"
|
||||
pubSub: "Pub/Sub账户"
|
||||
lastCommunication: "最近通信"
|
||||
|
@ -725,10 +860,18 @@ _accountDelete:
|
|||
requestAccountDelete: "请求删除账户"
|
||||
started: "账户删除过程已开始。"
|
||||
inProgress: "正在删除"
|
||||
_ad:
|
||||
back: "返回"
|
||||
reduceFrequencyOfThisAd: "减少此广告的频率"
|
||||
_forgotPassword:
|
||||
enterEmail: "请输入您验证账号时用的电子邮箱地址,密码重置链接将发送至该邮箱上。"
|
||||
ifNoEmail: "如果您没有使用电子邮件地址进行验证,请联系管理员。"
|
||||
contactAdmin: "该实例不支持发送电子邮件。如果您想重设密码,请联系管理员。"
|
||||
_gallery:
|
||||
my: "我的图库"
|
||||
liked: "喜欢的图片"
|
||||
like: "喜欢"
|
||||
unlike: "取消喜欢"
|
||||
_email:
|
||||
_follow:
|
||||
title: "你有新的关注者"
|
||||
|
@ -737,6 +880,7 @@ _email:
|
|||
_plugin:
|
||||
install: "安装插件"
|
||||
installWarn: "请不要安装不可信的插件。"
|
||||
manage: "管理插件..."
|
||||
_registry:
|
||||
scope: "范围"
|
||||
key: "主要"
|
||||
|
@ -744,17 +888,22 @@ _registry:
|
|||
domain: "域"
|
||||
createKey: "创建键"
|
||||
_aboutMisskey:
|
||||
about: "FoundKey是由syuilo于2014年开发的开源软件。"
|
||||
about: "Misskey是由syuilo于2014年开发的开源软件。"
|
||||
contributors: "主要贡献者"
|
||||
allContributors: "全体贡献者"
|
||||
source: "源代码"
|
||||
translation: "翻译Misskey"
|
||||
donate: "赞助Misskey"
|
||||
morePatrons: "还有很多其他的人也在支持我们,非常感谢🥰"
|
||||
patrons: "支持者"
|
||||
_nsfw:
|
||||
respect: "隐藏敏感内容"
|
||||
ignore: "不隐藏敏感内容"
|
||||
force: "总是隐藏内容"
|
||||
_mfm:
|
||||
cheatSheet: "MFM代码速查表"
|
||||
intro: "MFM是一种在FoundKey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。"
|
||||
dummy: "通过FoundKey扩展联邦宇宙的世界"
|
||||
intro: "MFM是一种在Misskey中的各个位置使用的专用标记语言。在这里您可以看到MFM中可用的语法列表。"
|
||||
dummy: "通过Misskey扩展联邦宇宙的世界"
|
||||
mention: "提及"
|
||||
mentionDescription: "可以使用 @+用户名 来指示特定用户"
|
||||
hashtag: "话题标签"
|
||||
|
@ -864,6 +1013,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: "转发"
|
||||
modalBg: "对话框背景"
|
||||
divider: "分割线"
|
||||
scrollbarHandle: "滚动条"
|
||||
scrollbarHandleHover: "滚动条(悬停)"
|
||||
dateLabelFg: "日期标签文字"
|
||||
infoBg: "信息背景"
|
||||
infoFg: "信息文本"
|
||||
infoWarnBg: "警告背景"
|
||||
infoWarnFg: "警告文本"
|
||||
cwBg: "CW 按钮背景"
|
||||
cwFg: "CW 按钮文本"
|
||||
cwHoverBg: "CW 按钮背景(悬停)"
|
||||
toastBg: "Toast通知背景"
|
||||
toastFg: "Toast通知文本"
|
||||
buttonBg: "按钮背景"
|
||||
buttonHoverBg: "按钮背景(悬停)"
|
||||
inputBorder: "输入框边框"
|
||||
listItemHoverBg: "下拉列表项目背景(悬停)"
|
||||
driveFolderBg: "网盘的文件夹背景"
|
||||
wallpaperOverlay: "壁纸叠加层"
|
||||
badge: "徽章"
|
||||
messageBg: "聊天背景"
|
||||
accentDarken: "强调色(深)"
|
||||
accentLighten: "强调色(浅)"
|
||||
fgHighlighted: "高亮显示文本"
|
||||
_sfx:
|
||||
note: "帖子"
|
||||
noteMy: "我的帖子"
|
||||
|
@ -887,6 +1098,29 @@ _time:
|
|||
minute: "分"
|
||||
hour: "小时"
|
||||
day: "日"
|
||||
_tutorial:
|
||||
title: "Misskey的使用方法"
|
||||
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: "对Misskey基本操作的简单介绍,就到此结束了。 辛苦了!"
|
||||
step7_2: "如果你想了解更多有关Misskey的信息,请参见{help}。"
|
||||
step7_3: "接下来,享受Misskey带来的乐趣吧🚀"
|
||||
_2fa:
|
||||
alreadyRegistered: "此设备已被注册"
|
||||
registerDevice: "注册设备"
|
||||
|
@ -915,6 +1149,7 @@ _permissions:
|
|||
"write:notes": "撰写或删除帖子"
|
||||
"read:notifications": "查看通知"
|
||||
"write:notifications": "管理通知"
|
||||
"read:reactions": "查看回应"
|
||||
"write:reactions": "回应操作"
|
||||
"write:votes": "投票"
|
||||
"read:pages": "查看页面"
|
||||
|
@ -925,6 +1160,10 @@ _permissions:
|
|||
"write:user-groups": "操作用户组"
|
||||
"read:channels": "查看频道"
|
||||
"write:channels": "管理频道"
|
||||
"read:gallery": "浏览图库"
|
||||
"write:gallery": "操作图库"
|
||||
"read:gallery-likes": "读取喜欢的图片"
|
||||
"write:gallery-likes": "操作喜欢的图片"
|
||||
_auth:
|
||||
shareAccess: "您要授权允许“{name}”访问您的帐户吗?"
|
||||
shareAccessAsk: "您确定要授权此应用程序访问您的帐户吗?"
|
||||
|
@ -1085,7 +1324,10 @@ _pages:
|
|||
my: "我的页面"
|
||||
liked: "喜欢的页面"
|
||||
featured: "热门"
|
||||
inspector: "检查器"
|
||||
contents: "内容"
|
||||
content: "页面内容"
|
||||
variables: "变量"
|
||||
title: "标题"
|
||||
url: "页面URL"
|
||||
summary: "页面摘要"
|
||||
|
@ -1096,11 +1338,268 @@ _pages:
|
|||
fontSansSerif: "无衬线字体"
|
||||
eyeCatchingImageSet: "设置封面图片"
|
||||
eyeCatchingImageRemove: "删除封面图片"
|
||||
chooseBlock: "添加块"
|
||||
selectType: "选择类型"
|
||||
enterVariableName: "请输入变量名"
|
||||
variableNameIsAlreadyUsed: "变量名已使用"
|
||||
contentBlocks: "内容"
|
||||
inputBlocks: "输入"
|
||||
specialBlocks: "特殊"
|
||||
blocks:
|
||||
text: "文本"
|
||||
textarea: "文本区域"
|
||||
section: "章节"
|
||||
image: "图片"
|
||||
button: "按钮"
|
||||
if: "如果"
|
||||
_if:
|
||||
variable: "变量"
|
||||
post: "投稿窗口"
|
||||
_post:
|
||||
text: "内容"
|
||||
attachCanvasImage: "附加画布图像"
|
||||
canvasId: "画布ID"
|
||||
textInput: "文本输入"
|
||||
_textInput:
|
||||
name: "变量名"
|
||||
text: "标题"
|
||||
default: "默认值"
|
||||
textareaInput: "多行文本输入"
|
||||
_textareaInput:
|
||||
name: "变量名"
|
||||
text: "标题"
|
||||
default: "默认值"
|
||||
numberInput: "输入数值"
|
||||
_numberInput:
|
||||
name: "变量名"
|
||||
text: "标题"
|
||||
default: "默认值"
|
||||
canvas: "画布"
|
||||
_canvas:
|
||||
id: "画布ID"
|
||||
width: "宽度"
|
||||
height: "高度"
|
||||
note: "嵌入的帖子"
|
||||
_note:
|
||||
id: "帖子ID"
|
||||
idDescription: "您也可以通过粘贴帖子的URL来进行设置。"
|
||||
detailed: "显示详细信息"
|
||||
switch: "开关"
|
||||
_switch:
|
||||
name: "变量名"
|
||||
text: "标题"
|
||||
default: "默认值"
|
||||
counter: "计数器"
|
||||
_counter:
|
||||
name: "变量名"
|
||||
text: "标题"
|
||||
inc: "增加值"
|
||||
_button:
|
||||
text: "标题"
|
||||
colored: "彩色"
|
||||
action: "按下按钮时的行为"
|
||||
_action:
|
||||
dialog: "显示对话框"
|
||||
_dialog:
|
||||
content: "内容"
|
||||
resetRandom: "重置随机值"
|
||||
pushEvent: "发送事件"
|
||||
_pushEvent:
|
||||
event: "事件名称"
|
||||
message: "按下时显示的消息"
|
||||
variable: "发送的变量"
|
||||
no-variable: "空"
|
||||
callAiScript: "调用AiScript"
|
||||
_callAiScript:
|
||||
functionName: "函数名"
|
||||
radioButton: "选择项"
|
||||
_radioButton:
|
||||
name: "变量名"
|
||||
title: "标题"
|
||||
values: "使用换行区分的选择项"
|
||||
default: "默认值"
|
||||
script:
|
||||
categories:
|
||||
flow: "控制"
|
||||
logical: "逻辑运算"
|
||||
operation: "计算"
|
||||
comparison: "比较"
|
||||
random: "随机"
|
||||
value: "值"
|
||||
fn: "函数"
|
||||
text: "文本操作"
|
||||
convert: "转换"
|
||||
list: "列表"
|
||||
blocks:
|
||||
text: "文本"
|
||||
multiLineText: "文本 (多行)"
|
||||
textList: "文本列表"
|
||||
_textList:
|
||||
info: "请使用换行符分隔每行"
|
||||
strLen: "文本长度"
|
||||
_strLen:
|
||||
arg1: "文本"
|
||||
strPick: "提取字符"
|
||||
_strPick:
|
||||
arg1: "文本"
|
||||
arg2: "字符位置"
|
||||
strReplace: "替换文本"
|
||||
_strReplace:
|
||||
arg1: "文本"
|
||||
arg2: "替换之前"
|
||||
arg3: "替换之后"
|
||||
strReverse: "文本反向"
|
||||
_strReverse:
|
||||
arg1: "文本"
|
||||
join: "合并文本"
|
||||
_join:
|
||||
arg1: "列表"
|
||||
arg2: "分隔符"
|
||||
add: "加"
|
||||
_add:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
subtract: "减"
|
||||
_subtract:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
multiply: "乘"
|
||||
_multiply:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
divide: "除"
|
||||
_divide:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
mod: "取模(MOD)"
|
||||
_mod:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
round: "四舍五入"
|
||||
_round:
|
||||
arg1: "数值"
|
||||
eq: "A和B相等"
|
||||
_eq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
notEq: "A和B不等"
|
||||
_notEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
and: "A和B"
|
||||
_and:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
or: "A或B"
|
||||
_or:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
lt: "< A小于B"
|
||||
_lt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
gt: "> A大于B"
|
||||
_gt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
ltEq: "<= A小于等于B"
|
||||
_ltEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
gtEq: ">= A大于等于B"
|
||||
_gtEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
if: "分支"
|
||||
_if:
|
||||
arg1: "如果"
|
||||
arg2: "如果"
|
||||
arg3: "否则"
|
||||
not: "否"
|
||||
_not:
|
||||
arg1: "否"
|
||||
random: "随机"
|
||||
_random:
|
||||
arg1: "概率"
|
||||
rannum: "随机数"
|
||||
_rannum:
|
||||
arg1: "最小值"
|
||||
arg2: "最大值"
|
||||
randomPick: "从列表中随机选择"
|
||||
_randomPick:
|
||||
arg1: "列表"
|
||||
dailyRandom: "随机(每个用户每日)"
|
||||
_dailyRandom:
|
||||
arg1: "概率"
|
||||
dailyRannum: "随机数(每个用户每日)"
|
||||
_dailyRannum:
|
||||
arg1: "最小值"
|
||||
arg2: "最大值"
|
||||
dailyRandomPick: "从列表中随机选择(每个用户每日)"
|
||||
_dailyRandomPick:
|
||||
arg1: "列表"
|
||||
seedRandom: "随机 (种子)"
|
||||
_seedRandom:
|
||||
arg1: "种子"
|
||||
arg2: "概率"
|
||||
seedRannum: "随机数(种子)"
|
||||
_seedRannum:
|
||||
arg1: "种子"
|
||||
arg2: "最小值"
|
||||
arg3: "最大值"
|
||||
seedRandomPick: "从列表中随机选择 (种子)"
|
||||
_seedRandomPick:
|
||||
arg1: "种子"
|
||||
arg2: "列表"
|
||||
DRPWPM: "从概率列表中随机选择(每用户每天)"
|
||||
_DRPWPM:
|
||||
arg1: "文本列表"
|
||||
pick: "从列表中选择"
|
||||
_pick:
|
||||
arg1: "列表"
|
||||
arg2: "位置"
|
||||
listLen: "获取列表长度"
|
||||
_listLen:
|
||||
arg1: "列表"
|
||||
number: "数值"
|
||||
stringToNumber: "文本到数字"
|
||||
_stringToNumber:
|
||||
arg1: "文本"
|
||||
numberToString: "数字到文本"
|
||||
_numberToString:
|
||||
arg1: "数值"
|
||||
splitStrByLine: "将文本按行拆分"
|
||||
_splitStrByLine:
|
||||
arg1: "文本"
|
||||
ref: "变量"
|
||||
aiScriptVar: "AiScript变量"
|
||||
fn: "函数"
|
||||
_fn:
|
||||
slots: "槽函数"
|
||||
slots-info: "请使用换行符分隔每个槽函数"
|
||||
arg1: "输出"
|
||||
for: "重复"
|
||||
_for:
|
||||
arg1: "次数"
|
||||
arg2: "处理"
|
||||
typeError: "槽函数{slot}需要传入“{expect}”,但是实际传入为“{actual}”!"
|
||||
thereIsEmptySlot: "槽函数{slot}为空!"
|
||||
types:
|
||||
string: "文字"
|
||||
number: "数值"
|
||||
boolean: "Flag"
|
||||
array: "列表"
|
||||
stringArray: "文本列表"
|
||||
emptySlot: "空白槽函数"
|
||||
enviromentVariables: "环境变量"
|
||||
pageVariables: "页面元素"
|
||||
argVariables: "输入变量"
|
||||
_relayStatus:
|
||||
requesting: "待批准"
|
||||
accepted: "已批准"
|
||||
rejected: "已拒绝"
|
||||
_notification:
|
||||
fileUploaded: "文件已上传"
|
||||
youGotMention: "来自{name}的提及"
|
||||
youGotReply: "来自{name}的回复"
|
||||
youGotQuote: "来自{name}的引用"
|
||||
|
@ -1115,6 +1614,7 @@ _notification:
|
|||
pollEnded: "问卷调查结果已生成。"
|
||||
emptyPushNotificationMessage: "推送通知已更新"
|
||||
_types:
|
||||
all: "全部"
|
||||
follow: "关注中"
|
||||
mention: "提及"
|
||||
reply: "回复"
|
||||
|
@ -1153,4 +1653,3 @@ _deck:
|
|||
list: "列表"
|
||||
mentions: "提及"
|
||||
direct: "指定用户"
|
||||
_services: {}
|
||||
|
|