forked from mirrors/misskey
Compare commits
5 commits
comfy
...
notificati
Author | SHA1 | Date | |
---|---|---|---|
|
5ec1d96048 | ||
|
441c0ca465 | ||
|
29b06994a2 | ||
|
314fb4bfd9 | ||
|
ce5ff70cb3 |
2732 changed files with 63317 additions and 231406 deletions
|
@ -1,223 +0,0 @@
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
# Misskey configuration
|
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
|
||||||
|
|
||||||
# ┌────────────────────────┐
|
|
||||||
#───┘ Initial Setup Password └─────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
# Password to initiate setting up admin account.
|
|
||||||
# It will not be used after the initial setup is complete.
|
|
||||||
#
|
|
||||||
# Be sure to change this when you set up Misskey via the Internet.
|
|
||||||
#
|
|
||||||
# The provider of the service who sets up Misskey on behalf of the customer should
|
|
||||||
# set this value to something unique when generating the Misskey config file,
|
|
||||||
# and provide it to the customer.
|
|
||||||
setupPassword: example_password_please_change_this_or_you_will_get_hacked
|
|
||||||
|
|
||||||
# ┌─────┐
|
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
# Final accessible URL seen by a user.
|
|
||||||
url: 'http://misskey.local'
|
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
|
||||||
# URL SETTINGS AFTER THAT!
|
|
||||||
|
|
||||||
# ┌───────────────────────┐
|
|
||||||
#───┘ Port and TLS settings └───────────────────────────────────
|
|
||||||
|
|
||||||
#
|
|
||||||
# Misskey requires a reverse proxy to support HTTPS connections.
|
|
||||||
#
|
|
||||||
# +----- https://example.tld/ ------------+
|
|
||||||
# +------+ |+-------------+ +----------------+|
|
|
||||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
|
||||||
# +------+ |+-------------+ +----------------+|
|
|
||||||
# +---------------------------------------+
|
|
||||||
#
|
|
||||||
# You need to set up a reverse proxy. (e.g. nginx)
|
|
||||||
# An encrypted connection with HTTPS is highly recommended
|
|
||||||
# because tokens may be transferred in GET requests.
|
|
||||||
|
|
||||||
# The port that your Misskey server should listen on.
|
|
||||||
port: 61812
|
|
||||||
|
|
||||||
# ┌──────────────────────────┐
|
|
||||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
|
||||||
|
|
||||||
db:
|
|
||||||
host: db
|
|
||||||
port: 5432
|
|
||||||
|
|
||||||
# Database name
|
|
||||||
db: misskey
|
|
||||||
|
|
||||||
# Auth
|
|
||||||
user: postgres
|
|
||||||
pass: postgres
|
|
||||||
|
|
||||||
# Whether disable Caching queries
|
|
||||||
#disableCache: true
|
|
||||||
|
|
||||||
# Extra Connection options
|
|
||||||
#extra:
|
|
||||||
# ssl: true
|
|
||||||
|
|
||||||
dbReplications: false
|
|
||||||
|
|
||||||
# You can configure any number of replicas here
|
|
||||||
#dbSlaves:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
# -
|
|
||||||
# host:
|
|
||||||
# port:
|
|
||||||
# db:
|
|
||||||
# user:
|
|
||||||
# pass:
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
|
||||||
#───┘ Redis configuration └─────────────────────────────────────
|
|
||||||
|
|
||||||
redis:
|
|
||||||
host: redis
|
|
||||||
port: 6379
|
|
||||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
#pass: example-pass
|
|
||||||
#prefix: example-prefix
|
|
||||||
#db: 1
|
|
||||||
|
|
||||||
#redisForPubsub:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForJobQueue:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForTimelines:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
#redisForReactions:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
# ┌───────────────────────────┐
|
|
||||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
|
||||||
|
|
||||||
#meilisearch:
|
|
||||||
# host: meilisearch
|
|
||||||
# port: 7700
|
|
||||||
# apiKey: ''
|
|
||||||
# ssl: true
|
|
||||||
# index: ''
|
|
||||||
|
|
||||||
# ┌───────────────┐
|
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
|
||||||
|
|
||||||
# You can select the ID generation method.
|
|
||||||
# You don't usually need to change this setting, but you can
|
|
||||||
# change it according to your preferences.
|
|
||||||
|
|
||||||
# Available methods:
|
|
||||||
# aid ... Short, Millisecond accuracy
|
|
||||||
# aidx ... Millisecond accuracy
|
|
||||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
|
||||||
# ulid ... Millisecond accuracy
|
|
||||||
# objectid ... This is left for backward compatibility
|
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
|
||||||
# ID SETTINGS AFTER THAT!
|
|
||||||
|
|
||||||
id: 'aidx'
|
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# vueIntegration:
|
|
||||||
# tracingOptions:
|
|
||||||
# trackComponents: true
|
|
||||||
# browserTracingIntegration:
|
|
||||||
# replayIntegration:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
|
||||||
|
|
||||||
# Whether disable HSTS
|
|
||||||
#disableHsts: true
|
|
||||||
|
|
||||||
# Number of worker processes
|
|
||||||
#clusterLimit: 1
|
|
||||||
|
|
||||||
# Job concurrency per worker
|
|
||||||
# deliverJobConcurrency: 128
|
|
||||||
# inboxJobConcurrency: 16
|
|
||||||
|
|
||||||
# Job rate limiter
|
|
||||||
# deliverJobPerSec: 128
|
|
||||||
# inboxJobPerSec: 32
|
|
||||||
|
|
||||||
# Job attempts
|
|
||||||
# deliverJobMaxAttempts: 12
|
|
||||||
# inboxJobMaxAttempts: 8
|
|
||||||
|
|
||||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
|
||||||
#outgoingAddressFamily: ipv4
|
|
||||||
|
|
||||||
# Proxy for HTTP/HTTPS
|
|
||||||
#proxy: http://127.0.0.1:3128
|
|
||||||
|
|
||||||
proxyBypassHosts:
|
|
||||||
- api.deepl.com
|
|
||||||
- api-free.deepl.com
|
|
||||||
- www.recaptcha.net
|
|
||||||
- hcaptcha.com
|
|
||||||
- challenges.cloudflare.com
|
|
||||||
|
|
||||||
# Proxy for SMTP/SMTPS
|
|
||||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
|
||||||
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
|
||||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
|
||||||
|
|
||||||
# Media Proxy
|
|
||||||
#mediaProxy: https://example.com/proxy
|
|
||||||
|
|
||||||
allowedPrivateNetworks: [
|
|
||||||
'127.0.0.1/32'
|
|
||||||
]
|
|
||||||
|
|
||||||
# Upload or download file size limits (bytes)
|
|
||||||
#maxFileSize: 262144000
|
|
|
@ -1,11 +1,4 @@
|
||||||
# misskey settings
|
|
||||||
# MISSKEY_URL=https://example.tld/
|
|
||||||
|
|
||||||
# db settings
|
# db settings
|
||||||
POSTGRES_PASSWORD=example-misskey-pass
|
POSTGRES_PASSWORD=example-misskey-pass
|
||||||
# DATABASE_PASSWORD=${POSTGRES_PASSWORD}
|
|
||||||
POSTGRES_USER=example-misskey-user
|
POSTGRES_USER=example-misskey-user
|
||||||
# DATABASE_USER=${POSTGRES_USER}
|
|
||||||
POSTGRES_DB=misskey
|
POSTGRES_DB=misskey
|
||||||
# DATABASE_DB=${POSTGRES_DB}
|
|
||||||
DATABASE_URL="postgres://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}"
|
|
||||||
|
|
|
@ -6,7 +6,6 @@
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
# Final accessible URL seen by a user.
|
# Final accessible URL seen by a user.
|
||||||
# You can set url from an environment variable instead.
|
|
||||||
url: https://example.tld/
|
url: https://example.tld/
|
||||||
|
|
||||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||||
|
@ -39,11 +38,9 @@ db:
|
||||||
port: 5432
|
port: 5432
|
||||||
|
|
||||||
# Database name
|
# Database name
|
||||||
# You can set db from an environment variable instead.
|
|
||||||
db: misskey
|
db: misskey
|
||||||
|
|
||||||
# Auth
|
# Auth
|
||||||
# You can set user and pass from environment variables instead.
|
|
||||||
user: example-misskey-user
|
user: example-misskey-user
|
||||||
pass: example-misskey-pass
|
pass: example-misskey-pass
|
||||||
|
|
||||||
|
@ -106,37 +103,8 @@ redis:
|
||||||
# #prefix: example-prefix
|
# #prefix: example-prefix
|
||||||
# #db: 1
|
# #db: 1
|
||||||
|
|
||||||
#redisForReactions:
|
# ┌───────────────────────────┐
|
||||||
# host: redis
|
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
# ┌───────────────────────────────┐
|
|
||||||
#───┘ Fulltext search configuration └─────────────────────────────
|
|
||||||
|
|
||||||
# These are the setting items for the full-text search provider.
|
|
||||||
fulltextSearch:
|
|
||||||
# You can select the ID generation method.
|
|
||||||
# - sqlLike (default)
|
|
||||||
# Use SQL-like search.
|
|
||||||
# This is a standard feature of PostgreSQL, so no special extensions are required.
|
|
||||||
# - sqlPgroonga
|
|
||||||
# Use pgroonga.
|
|
||||||
# You need to install pgroonga and configure it as a PostgreSQL extension.
|
|
||||||
# In addition to the above, you need to create a pgroonga index on the text column of the note table.
|
|
||||||
# see: https://pgroonga.github.io/tutorial/
|
|
||||||
# - meilisearch
|
|
||||||
# Use Meilisearch.
|
|
||||||
# You need to install Meilisearch and configure.
|
|
||||||
provider: sqlLike
|
|
||||||
|
|
||||||
# For Meilisearch settings.
|
|
||||||
# If you select "meilisearch" for "fulltextSearch.provider", it must be set.
|
|
||||||
# You can set scope to local (default value) or global
|
|
||||||
# (include notes from remote).
|
|
||||||
|
|
||||||
#meilisearch:
|
#meilisearch:
|
||||||
# host: meilisearch
|
# host: meilisearch
|
||||||
|
@ -144,7 +112,6 @@ fulltextSearch:
|
||||||
# apiKey: ''
|
# apiKey: ''
|
||||||
# ssl: true
|
# ssl: true
|
||||||
# index: ''
|
# index: ''
|
||||||
# scope: local
|
|
||||||
|
|
||||||
# ┌───────────────┐
|
# ┌───────────────┐
|
||||||
#───┘ ID generation └───────────────────────────────────────────
|
#───┘ ID generation └───────────────────────────────────────────
|
||||||
|
@ -165,26 +132,6 @@ fulltextSearch:
|
||||||
|
|
||||||
id: 'aidx'
|
id: 'aidx'
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# vueIntegration:
|
|
||||||
# tracingOptions:
|
|
||||||
# trackComponents: true
|
|
||||||
# browserTracingIntegration:
|
|
||||||
# replayIntegration:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
@ -200,7 +147,7 @@ id: 'aidx'
|
||||||
|
|
||||||
# Job rate limiter
|
# Job rate limiter
|
||||||
# deliverJobPerSec: 128
|
# deliverJobPerSec: 128
|
||||||
# inboxJobPerSec: 32
|
# inboxJobPerSec: 16
|
||||||
|
|
||||||
# Job attempts
|
# Job attempts
|
||||||
# deliverJobMaxAttempts: 12
|
# deliverJobMaxAttempts: 12
|
||||||
|
@ -227,22 +174,15 @@ proxyBypassHosts:
|
||||||
# Media Proxy
|
# Media Proxy
|
||||||
#mediaProxy: https://example.com/proxy
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
# For security reasons, uploading attachments from the intranet is prohibited,
|
# Proxy remote files (default: true)
|
||||||
# but exceptions can be made from the following settings. Default value is "undefined".
|
proxyRemoteFiles: true
|
||||||
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
|
|
||||||
|
# Sign to ActivityPub GET request (default: true)
|
||||||
|
signToActivityPubGet: true
|
||||||
|
|
||||||
#allowedPrivateNetworks: [
|
#allowedPrivateNetworks: [
|
||||||
# '127.0.0.1/32'
|
# '127.0.0.1/32'
|
||||||
#]
|
#]
|
||||||
|
|
||||||
# Upload or download file size limits (bytes)
|
# Upload or download file size limits (bytes)
|
||||||
#maxFileSize: 262144000
|
#maxFileSize: 262144000
|
||||||
|
|
||||||
# Log settings
|
|
||||||
# logging:
|
|
||||||
# sql:
|
|
||||||
# # Outputs query parameters during SQL execution to the log.
|
|
||||||
# # default: false
|
|
||||||
# enableQueryParamLogging: false
|
|
||||||
# # Disable query truncation. If set to true, the full text of the query will be output to the log.
|
|
||||||
# # default: false
|
|
||||||
# disableQueryTruncation: false
|
|
||||||
|
|
|
@ -2,77 +2,6 @@
|
||||||
# Misskey configuration
|
# Misskey configuration
|
||||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||||
|
|
||||||
# ┌──────────────────────────────┐
|
|
||||||
#───┘ a boring but important thing └────────────────────────────
|
|
||||||
|
|
||||||
#
|
|
||||||
# First of all, let me tell you a story that may possibly be
|
|
||||||
# boring to you and possibly important to you.
|
|
||||||
#
|
|
||||||
# Misskey is licensed under the AGPLv3 license. This license is
|
|
||||||
# known to be often misunderstood. Please read the following
|
|
||||||
# instructions carefully and select the appropriate option so
|
|
||||||
# that you do not negligently cause a license violation.
|
|
||||||
#
|
|
||||||
|
|
||||||
# --------
|
|
||||||
# Option 1: If you host Misskey AS-IS (without any changes to
|
|
||||||
# the source code. forks are not included).
|
|
||||||
#
|
|
||||||
# Step 1: Congratulations! You don't need to do anything.
|
|
||||||
|
|
||||||
# --------
|
|
||||||
# Option 2: If you have made changes to the source code (forks
|
|
||||||
# are included) and publish a Git repository of source
|
|
||||||
# code. There should be no access restrictions on
|
|
||||||
# this repository. Strictly speaking, it doesn't have
|
|
||||||
# to be a Git repository, but you'll probably use Git!
|
|
||||||
#
|
|
||||||
# Step 1: Build and run the Misskey server first.
|
|
||||||
# Step 2: Open <https://your.misskey.example/admin/settings> in
|
|
||||||
# your browser with the administrator account.
|
|
||||||
# Step 3: Enter the URL of your Git repository in the
|
|
||||||
# "Repository URL" field.
|
|
||||||
|
|
||||||
# --------
|
|
||||||
# Option 3: If neither of the above applies to you.
|
|
||||||
# (In this case, the source code should be published
|
|
||||||
# on the Misskey interface. IT IS NOT ENOUGH TO
|
|
||||||
# DISCLOSE THE SOURCE CODE WHEN A USER REQUESTS IT BY
|
|
||||||
# E-MAIL OR OTHER MEANS. If you are not satisfied
|
|
||||||
# with this, it is recommended that you read the
|
|
||||||
# license again carefully. Anyway, enabling this
|
|
||||||
# option will automatically generate and publish a
|
|
||||||
# tarball at build time, protecting you from
|
|
||||||
# inadvertent license violations. (There is no legal
|
|
||||||
# guarantee, of course.) The tarball will generated
|
|
||||||
# from the root directory of your codebase. So it is
|
|
||||||
# also recommended to check <built/tarball> directory
|
|
||||||
# once after building and before activating the server
|
|
||||||
# to avoid ACCIDENTAL LEAKING OF SENSITIVE INFORMATION.
|
|
||||||
# To prevent certain files from being included in the
|
|
||||||
# tarball, add a glob pattern after line 15 in
|
|
||||||
# <scripts/tarball.mjs>. DO NOT FORGET TO BUILD AFTER
|
|
||||||
# ENABLING THIS OPTION!)
|
|
||||||
#
|
|
||||||
# Step 1: Uncomment the following line.
|
|
||||||
#
|
|
||||||
# publishTarballInsteadOfProvideRepositoryUrl: true
|
|
||||||
|
|
||||||
# ┌────────────────────────┐
|
|
||||||
#───┘ Initial Setup Password └─────────────────────────────────────────────────────
|
|
||||||
|
|
||||||
# Password to initiate setting up admin account.
|
|
||||||
# It will not be used after the initial setup is complete.
|
|
||||||
#
|
|
||||||
# Be sure to change this when you set up Misskey via the Internet.
|
|
||||||
#
|
|
||||||
# The provider of the service who sets up Misskey on behalf of the customer should
|
|
||||||
# set this value to something unique when generating the Misskey config file,
|
|
||||||
# and provide it to the customer.
|
|
||||||
#
|
|
||||||
# setupPassword: example_password_please_change_this_or_you_will_get_hacked
|
|
||||||
|
|
||||||
# ┌─────┐
|
# ┌─────┐
|
||||||
#───┘ URL └─────────────────────────────────────────────────────
|
#───┘ URL └─────────────────────────────────────────────────────
|
||||||
|
|
||||||
|
@ -186,39 +115,8 @@ redis:
|
||||||
# # You can specify more ioredis options...
|
# # You can specify more ioredis options...
|
||||||
# #username: example-username
|
# #username: example-username
|
||||||
|
|
||||||
#redisForReactions:
|
# ┌───────────────────────────┐
|
||||||
# host: localhost
|
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
# # You can specify more ioredis options...
|
|
||||||
# #username: example-username
|
|
||||||
|
|
||||||
# ┌───────────────────────────────┐
|
|
||||||
#───┘ Fulltext search configuration └─────────────────────────────
|
|
||||||
|
|
||||||
# These are the setting items for the full-text search provider.
|
|
||||||
fulltextSearch:
|
|
||||||
# You can select the ID generation method.
|
|
||||||
# - sqlLike (default)
|
|
||||||
# Use SQL-like search.
|
|
||||||
# This is a standard feature of PostgreSQL, so no special extensions are required.
|
|
||||||
# - sqlPgroonga
|
|
||||||
# Use pgroonga.
|
|
||||||
# You need to install pgroonga and configure it as a PostgreSQL extension.
|
|
||||||
# In addition to the above, you need to create a pgroonga index on the text column of the note table.
|
|
||||||
# see: https://pgroonga.github.io/tutorial/
|
|
||||||
# - meilisearch
|
|
||||||
# Use Meilisearch.
|
|
||||||
# You need to install Meilisearch and configure.
|
|
||||||
provider: sqlLike
|
|
||||||
|
|
||||||
# For Meilisearch settings.
|
|
||||||
# If you select "meilisearch" for "fulltextSearch.provider", it must be set.
|
|
||||||
# You can set scope to local (default value) or global
|
|
||||||
# (include notes from remote).
|
|
||||||
|
|
||||||
#meilisearch:
|
#meilisearch:
|
||||||
# host: localhost
|
# host: localhost
|
||||||
|
@ -247,26 +145,6 @@ fulltextSearch:
|
||||||
|
|
||||||
id: 'aidx'
|
id: 'aidx'
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# vueIntegration:
|
|
||||||
# tracingOptions:
|
|
||||||
# trackComponents: true
|
|
||||||
# browserTracingIntegration:
|
|
||||||
# replayIntegration:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
@ -279,14 +157,14 @@ id: 'aidx'
|
||||||
# Job concurrency per worker
|
# Job concurrency per worker
|
||||||
#deliverJobConcurrency: 128
|
#deliverJobConcurrency: 128
|
||||||
#inboxJobConcurrency: 16
|
#inboxJobConcurrency: 16
|
||||||
#relationshipJobConcurrency: 16
|
#relashionshipJobConcurrency: 16
|
||||||
# What's relationshipJob?:
|
# What's relashionshipJob?:
|
||||||
# Follow, unfollow, block and unblock(ings) while following-imports, etc. or account migrations.
|
# Follow, unfollow, block and unblock(ings) while following-imports, etc. or account migrations.
|
||||||
|
|
||||||
# Job rate limiter
|
# Job rate limiter
|
||||||
#deliverJobPerSec: 128
|
#deliverJobPerSec: 128
|
||||||
#inboxJobPerSec: 32
|
#inboxJobPerSec: 16
|
||||||
#relationshipJobPerSec: 64
|
#relashionshipJobPerSec: 64
|
||||||
|
|
||||||
# Job attempts
|
# Job attempts
|
||||||
#deliverJobMaxAttempts: 12
|
#deliverJobMaxAttempts: 12
|
||||||
|
@ -319,15 +197,19 @@ proxyBypassHosts:
|
||||||
# * Perform image compression (on a different server resource than the main process)
|
# * Perform image compression (on a different server resource than the main process)
|
||||||
#mediaProxy: https://example.com/proxy
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
|
# Proxy remote files (default: true)
|
||||||
|
# Proxy remote files by this instance or mediaProxy to prevent remote files from running in remote domains.
|
||||||
|
proxyRemoteFiles: true
|
||||||
|
|
||||||
# Movie Thumbnail Generation URL
|
# Movie Thumbnail Generation URL
|
||||||
# There is no reference implementation.
|
# There is no reference implementation.
|
||||||
# For example, Misskey will point to the following URL:
|
# For example, Misskey will point to the following URL:
|
||||||
# https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4
|
# https://example.com/thumbnail.webp?thumbnail=1&url=https%3A%2F%2Fstorage.example.com%2Fpath%2Fto%2Fvideo.mp4
|
||||||
#videoThumbnailGenerator: https://example.com
|
#videoThumbnailGenerator: https://example.com
|
||||||
|
|
||||||
# For security reasons, uploading attachments from the intranet is prohibited,
|
# Sign to ActivityPub GET request (default: true)
|
||||||
# but exceptions can be made from the following settings. Default value is "undefined".
|
signToActivityPubGet: true
|
||||||
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
|
|
||||||
#allowedPrivateNetworks: [
|
#allowedPrivateNetworks: [
|
||||||
# '127.0.0.1/32'
|
# '127.0.0.1/32'
|
||||||
#]
|
#]
|
||||||
|
@ -337,13 +219,3 @@ proxyBypassHosts:
|
||||||
|
|
||||||
# PID File of master process
|
# PID File of master process
|
||||||
#pidFile: /tmp/misskey.pid
|
#pidFile: /tmp/misskey.pid
|
||||||
|
|
||||||
# Log settings
|
|
||||||
# logging:
|
|
||||||
# sql:
|
|
||||||
# # Outputs query parameters during SQL execution to the log.
|
|
||||||
# # default: false
|
|
||||||
# enableQueryParamLogging: false
|
|
||||||
# # Disable query truncation. If set to true, the full text of the query will be output to the log.
|
|
||||||
# # default: false
|
|
||||||
# disableQueryTruncation: false
|
|
||||||
|
|
|
@ -1,24 +1,25 @@
|
||||||
{
|
{
|
||||||
"name": "Misskey",
|
"name": "Misskey",
|
||||||
"dockerComposeFile": "compose.yml",
|
"dockerComposeFile": "docker-compose.yml",
|
||||||
"service": "app",
|
"service": "app",
|
||||||
"workspaceFolder": "/workspace",
|
"workspaceFolder": "/workspace",
|
||||||
"features": {
|
"features": {
|
||||||
"ghcr.io/devcontainers/features/node:1": {
|
"ghcr.io/devcontainers-contrib/features/pnpm:2": {
|
||||||
"version": "22.15.0"
|
"version": "8.9.2"
|
||||||
},
|
},
|
||||||
"ghcr.io/devcontainers-extra/features/pnpm:2": {
|
"ghcr.io/devcontainers/features/node:1": {
|
||||||
"version": "10.10.0"
|
"version": "20.5.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"forwardPorts": [3000],
|
"forwardPorts": [3000],
|
||||||
"postCreateCommand": "/bin/bash .devcontainer/init.sh",
|
"postCreateCommand": "sudo chmod 755 .devcontainer/init.sh && .devcontainer/init.sh",
|
||||||
"customizations": {
|
"customizations": {
|
||||||
"vscode": {
|
"vscode": {
|
||||||
"extensions": [
|
"extensions": [
|
||||||
"editorconfig.editorconfig",
|
"editorconfig.editorconfig",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"Vue.volar",
|
"Vue.volar",
|
||||||
|
"Vue.vscode-typescript-vue-plugin",
|
||||||
"Orta.vscode-jest",
|
"Orta.vscode-jest",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"mrmlnc.vscode-json5"
|
"mrmlnc.vscode-json5"
|
||||||
|
|
|
@ -103,14 +103,6 @@ redis:
|
||||||
# #prefix: example-prefix
|
# #prefix: example-prefix
|
||||||
# #db: 1
|
# #db: 1
|
||||||
|
|
||||||
#redisForReactions:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
# ┌───────────────────────────┐
|
# ┌───────────────────────────┐
|
||||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||||
|
|
||||||
|
@ -140,26 +132,6 @@ redis:
|
||||||
|
|
||||||
id: 'aidx'
|
id: 'aidx'
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# vueIntegration:
|
|
||||||
# tracingOptions:
|
|
||||||
# trackComponents: true
|
|
||||||
# browserTracingIntegration:
|
|
||||||
# replayIntegration:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
@ -175,7 +147,7 @@ id: 'aidx'
|
||||||
|
|
||||||
# Job rate limiter
|
# Job rate limiter
|
||||||
# deliverJobPerSec: 128
|
# deliverJobPerSec: 128
|
||||||
# inboxJobPerSec: 32
|
# inboxJobPerSec: 16
|
||||||
|
|
||||||
# Job attempts
|
# Job attempts
|
||||||
# deliverJobMaxAttempts: 12
|
# deliverJobMaxAttempts: 12
|
||||||
|
@ -202,6 +174,12 @@ proxyBypassHosts:
|
||||||
# Media Proxy
|
# Media Proxy
|
||||||
#mediaProxy: https://example.com/proxy
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
|
# Proxy remote files (default: true)
|
||||||
|
proxyRemoteFiles: true
|
||||||
|
|
||||||
|
# Sign to ActivityPub GET request (default: true)
|
||||||
|
signToActivityPubGet: true
|
||||||
|
|
||||||
allowedPrivateNetworks: [
|
allowedPrivateNetworks: [
|
||||||
'127.0.0.1/32'
|
'127.0.0.1/32'
|
||||||
]
|
]
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
app:
|
app:
|
||||||
build:
|
build:
|
||||||
|
@ -6,7 +8,6 @@ services:
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
- ../:/workspace:cached
|
- ../:/workspace:cached
|
||||||
- node_modules:/workspace/node_modules
|
|
||||||
|
|
||||||
command: sleep infinity
|
command: sleep infinity
|
||||||
|
|
||||||
|
@ -45,7 +46,6 @@ services:
|
||||||
volumes:
|
volumes:
|
||||||
postgres-data:
|
postgres-data:
|
||||||
redis-data:
|
redis-data:
|
||||||
node_modules:
|
|
||||||
|
|
||||||
networks:
|
networks:
|
||||||
internal_network:
|
internal_network:
|
|
@ -2,14 +2,10 @@
|
||||||
|
|
||||||
set -xe
|
set -xe
|
||||||
|
|
||||||
sudo chown node node_modules
|
sudo chown -R node /workspace
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get -y install libgtk2.0-0 libgtk-3-0 libgbm-dev libnotify-dev libnss3 libxss1 libasound2 libxtst6 xauth xvfb
|
|
||||||
git config --global --add safe.directory /workspace
|
|
||||||
git submodule update --init
|
git submodule update --init
|
||||||
pnpm config set store-dir /home/node/.local/share/pnpm/store
|
pnpm config set store-dir /home/node/.local/share/pnpm/store
|
||||||
pnpm install --frozen-lockfile
|
pnpm install --frozen-lockfile
|
||||||
cp .devcontainer/devcontainer.yml .config/default.yml
|
cp .devcontainer/devcontainer.yml .config/default.yml
|
||||||
pnpm build
|
pnpm build
|
||||||
pnpm migrate
|
pnpm migrate
|
||||||
pnpm exec cypress install
|
|
||||||
|
|
|
@ -7,11 +7,12 @@ Dockerfile
|
||||||
build/
|
build/
|
||||||
built/
|
built/
|
||||||
db/
|
db/
|
||||||
.devcontainer/compose.yml
|
docker-compose.yml
|
||||||
node_modules/
|
node_modules/
|
||||||
packages/*/node_modules
|
packages/*/node_modules
|
||||||
redis/
|
redis/
|
||||||
files/
|
files/
|
||||||
|
misskey-assets/
|
||||||
fluent-emojis/
|
fluent-emojis/
|
||||||
.pnp.*
|
.pnp.*
|
||||||
|
|
||||||
|
@ -27,4 +28,4 @@ fluent-emojis/
|
||||||
|
|
||||||
.idea/
|
.idea/
|
||||||
packages/*/.vscode/
|
packages/*/.vscode/
|
||||||
packages/backend/test/compose.yml
|
packages/backend/test/docker-compose.yml
|
||||||
|
|
3
.github/FUNDING.yml
vendored
Normal file
3
.github/FUNDING.yml
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
# These are supported funding model platforms
|
||||||
|
|
||||||
|
patreon: syuilo
|
14
.github/ISSUE_TEMPLATE/01_bug-report.yml
vendored
14
.github/ISSUE_TEMPLATE/01_bug-report.yml
vendored
|
@ -53,8 +53,8 @@ body:
|
||||||
Examples:
|
Examples:
|
||||||
* Model and OS of the device(s): MacBook Pro (14inch, 2021), macOS Ventura 13.4
|
* Model and OS of the device(s): MacBook Pro (14inch, 2021), macOS Ventura 13.4
|
||||||
* Browser: Chrome 113.0.5672.126
|
* Browser: Chrome 113.0.5672.126
|
||||||
* Server URL: misskey.example.com
|
* Server URL: misskey.io
|
||||||
* Misskey: 2025.x.x
|
* Misskey: 13.x.x
|
||||||
value: |
|
value: |
|
||||||
* Model and OS of the device(s):
|
* Model and OS of the device(s):
|
||||||
* Browser:
|
* Browser:
|
||||||
|
@ -74,11 +74,11 @@ body:
|
||||||
|
|
||||||
Examples:
|
Examples:
|
||||||
* Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment
|
* Installation Method or Hosting Service: docker compose, k8s/docker, systemd, "Misskey install shell script", development environment
|
||||||
* Misskey: 2025.x.x
|
* Misskey: 13.x.x
|
||||||
* Node: 20.x.x
|
* Node: 20.x.x
|
||||||
* PostgreSQL: 15.x.x
|
* PostgreSQL: 15.x.x
|
||||||
* Redis: 7.x.x
|
* Redis: 7.x.x
|
||||||
* OS and Architecture: Ubuntu 24.04.2 LTS aarch64
|
* OS and Architecture: Ubuntu 22.04.2 LTS aarch64
|
||||||
value: |
|
value: |
|
||||||
* Installation Method or Hosting Service:
|
* Installation Method or Hosting Service:
|
||||||
* Misskey:
|
* Misskey:
|
||||||
|
@ -89,9 +89,3 @@ body:
|
||||||
render: markdown
|
render: markdown
|
||||||
validations:
|
validations:
|
||||||
required: false
|
required: false
|
||||||
|
|
||||||
- type: checkboxes
|
|
||||||
attributes:
|
|
||||||
label: Do you want to address this bug yourself?
|
|
||||||
options:
|
|
||||||
- label: Yes, I will patch the bug myself and send a pull request
|
|
||||||
|
|
11
.github/ISSUE_TEMPLATE/02_feature-request.yml
vendored
11
.github/ISSUE_TEMPLATE/02_feature-request.yml
vendored
|
@ -9,14 +9,3 @@ body:
|
||||||
description: Tell us what the suggestion is
|
description: Tell us what the suggestion is
|
||||||
validations:
|
validations:
|
||||||
required: true
|
required: true
|
||||||
- type: textarea
|
|
||||||
attributes:
|
|
||||||
label: Purpose
|
|
||||||
description: Describe the specific problem or need you think this feature will solve, and who it will help.
|
|
||||||
validations:
|
|
||||||
required: true
|
|
||||||
- type: checkboxes
|
|
||||||
attributes:
|
|
||||||
label: Do you want to implement this feature yourself?
|
|
||||||
options:
|
|
||||||
- label: Yes, I will implement this by myself and send a pull request
|
|
||||||
|
|
4
.github/ISSUE_TEMPLATE/config.yml
vendored
4
.github/ISSUE_TEMPLATE/config.yml
vendored
|
@ -2,7 +2,3 @@ contact_links:
|
||||||
- name: 💬 Misskey official Discord
|
- name: 💬 Misskey official Discord
|
||||||
url: https://discord.gg/Wp8gVStHW3
|
url: https://discord.gg/Wp8gVStHW3
|
||||||
about: Chat freely about Misskey
|
about: Chat freely about Misskey
|
||||||
# 仮
|
|
||||||
- name: 💬 Start discussion
|
|
||||||
url: https://github.com/misskey-dev/misskey/discussions
|
|
||||||
about: The official forum to join conversation and ask question
|
|
||||||
|
|
27
.github/dependabot.yml
vendored
27
.github/dependabot.yml
vendored
|
@ -9,7 +9,7 @@ updates:
|
||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
open-pull-requests-limit: 0
|
open-pull-requests-limit: 100
|
||||||
|
|
||||||
# Add only the root, not each workspace item
|
# Add only the root, not each workspace item
|
||||||
# https://github.com/dependabot/dependabot-core/issues/4993#issuecomment-1289133027
|
# https://github.com/dependabot/dependabot-core/issues/4993#issuecomment-1289133027
|
||||||
|
@ -17,29 +17,16 @@ updates:
|
||||||
directory: "/"
|
directory: "/"
|
||||||
schedule:
|
schedule:
|
||||||
interval: daily
|
interval: daily
|
||||||
|
# PNPM has an issue with dependabot. See:
|
||||||
|
# https://github.com/dependabot/dependabot-core/issues/7258
|
||||||
|
# https://github.com/pnpm/pnpm/issues/6530
|
||||||
|
# TODO: Restore this when the issue is solved
|
||||||
open-pull-requests-limit: 0
|
open-pull-requests-limit: 0
|
||||||
# List dependencies required to be updated together, sharing the same version numbers.
|
|
||||||
# Those who simply have the common owner (e.g. @fastify) don't need to be listed.
|
|
||||||
groups:
|
groups:
|
||||||
aws-sdk:
|
swc:
|
||||||
patterns:
|
patterns:
|
||||||
- "@aws-sdk/*"
|
- "@swc/*"
|
||||||
nestjs:
|
|
||||||
patterns:
|
|
||||||
- "@nestjs/*"
|
|
||||||
slacc:
|
|
||||||
patterns:
|
|
||||||
- "slacc-*"
|
|
||||||
storybook:
|
storybook:
|
||||||
patterns:
|
patterns:
|
||||||
- "storybook*"
|
- "storybook*"
|
||||||
- "@storybook/*"
|
- "@storybook/*"
|
||||||
swc-core:
|
|
||||||
patterns:
|
|
||||||
- "@swc/core*"
|
|
||||||
typescript-eslint:
|
|
||||||
patterns:
|
|
||||||
- "@typescript-eslint/*"
|
|
||||||
tensorflow:
|
|
||||||
patterns:
|
|
||||||
- "@tensorflow/*"
|
|
||||||
|
|
29
.github/labeler.yml
vendored
29
.github/labeler.yml
vendored
|
@ -1,34 +1,21 @@
|
||||||
'packages/backend':
|
'packages/backend':
|
||||||
- any:
|
- packages/backend/**/*
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/backend/**/*']
|
|
||||||
|
|
||||||
'packages/backend:test':
|
'packages/backend:test':
|
||||||
- any:
|
- packages/backend/test/**/*
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/backend/test/**/*', 'packages/backend/test-federation/**/*']
|
|
||||||
|
|
||||||
'packages/frontend':
|
'packages/frontend':
|
||||||
- any:
|
- packages/frontend/**/*
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/frontend/**/*']
|
|
||||||
|
|
||||||
'packages/frontend:test':
|
'packages/frontend:test':
|
||||||
- any:
|
- cypress/**/*
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['cypress/**/*']
|
|
||||||
|
|
||||||
'packages/sw':
|
'packages/sw':
|
||||||
- any:
|
- packages/sw/**/*
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/sw/**/*']
|
|
||||||
|
|
||||||
'packages/misskey-js':
|
'packages/misskey-js':
|
||||||
- any:
|
- packages/misskey-js/**/*
|
||||||
- changed-files:
|
|
||||||
- any-glob-to-any-file: ['packages/misskey-js/**/*']
|
|
||||||
|
|
||||||
'packages/misskey-js:test':
|
'packages/misskey-js:test':
|
||||||
- any:
|
- packages/misskey-js/test/**/*
|
||||||
- changed-files:
|
- packages/misskey-js/test-d/**/*
|
||||||
- any-glob-to-any-file: ['packages/misskey-js/test/**/*', 'packages/misskey-js/test-d/**/*']
|
|
||||||
|
|
1
.github/min.node-version
vendored
1
.github/min.node-version
vendored
|
@ -1 +0,0 @@
|
||||||
20.10.0
|
|
2
.github/misskey/test.yml
vendored
2
.github/misskey/test.yml
vendored
|
@ -1,7 +1,5 @@
|
||||||
url: 'http://misskey.local'
|
url: 'http://misskey.local'
|
||||||
|
|
||||||
setupPassword: example_password_please_change_this_or_you_will_get_hacked
|
|
||||||
|
|
||||||
# ローカルでテストするときにポートを被らないようにするためデフォルトのものとは変える(以下同じ)
|
# ローカルでテストするときにポートを被らないようにするためデフォルトのものとは変える(以下同じ)
|
||||||
port: 61812
|
port: 61812
|
||||||
|
|
||||||
|
|
18
.github/workflows/api-misskey-js.yml
vendored
18
.github/workflows/api-misskey-js.yml
vendored
|
@ -1,14 +1,7 @@
|
||||||
name: API report (misskey.js)
|
name: API report (misskey.js)
|
||||||
|
|
||||||
on:
|
on: [push, pull_request]
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/api-misskey-js.yml
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/api-misskey-js.yml
|
|
||||||
jobs:
|
jobs:
|
||||||
report:
|
report:
|
||||||
|
|
||||||
|
@ -16,13 +9,12 @@ jobs:
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Setup pnpm
|
- run: corepack enable
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4.4.0
|
uses: actions/setup-node@v4.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
43
.github/workflows/changelog-check.yml
vendored
43
.github/workflows/changelog-check.yml
vendored
|
@ -1,43 +0,0 @@
|
||||||
name: Check the description in CHANGELOG.md
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-changelog:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout head
|
|
||||||
uses: actions/checkout@v4.2.2
|
|
||||||
- name: Setup Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
|
|
||||||
- name: Checkout base
|
|
||||||
run: |
|
|
||||||
mkdir _base
|
|
||||||
cp -r .git _base/.git
|
|
||||||
cd _base
|
|
||||||
git fetch --depth 1 origin ${{ github.base_ref }}
|
|
||||||
git checkout origin/${{ github.base_ref }} CHANGELOG.md
|
|
||||||
|
|
||||||
- name: Copy to Checker directory for CHANGELOG-base.md
|
|
||||||
run: cp _base/CHANGELOG.md scripts/changelog-checker/CHANGELOG-base.md
|
|
||||||
- name: Copy to Checker directory for CHANGELOG-head.md
|
|
||||||
run: cp CHANGELOG.md scripts/changelog-checker/CHANGELOG-head.md
|
|
||||||
- name: diff
|
|
||||||
continue-on-error: true
|
|
||||||
run: diff -u CHANGELOG-base.md CHANGELOG-head.md
|
|
||||||
working-directory: scripts/changelog-checker
|
|
||||||
|
|
||||||
- name: Setup Checker
|
|
||||||
run: npm install
|
|
||||||
working-directory: scripts/changelog-checker
|
|
||||||
- name: Run Checker
|
|
||||||
run: npm run run
|
|
||||||
working-directory: scripts/changelog-checker
|
|
139
.github/workflows/check-misskey-js-autogen.yml
vendored
139
.github/workflows/check-misskey-js-autogen.yml
vendored
|
@ -1,139 +0,0 @@
|
||||||
name: Check Misskey JS autogen
|
|
||||||
|
|
||||||
on:
|
|
||||||
pull_request_target:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
- improve-misskey-js-autogen-check
|
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# pull_request_target safety: permissions: read-all, and there are no secrets used in this job
|
|
||||||
generate-misskey-js:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
|
||||||
steps:
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
persist-credentials: false
|
|
||||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
|
||||||
|
|
||||||
- name: setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
|
|
||||||
- name: setup node
|
|
||||||
id: setup-node
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
cache: pnpm
|
|
||||||
|
|
||||||
- name: install dependencies
|
|
||||||
run: pnpm i --frozen-lockfile
|
|
||||||
|
|
||||||
# generate api.json
|
|
||||||
- name: Copy Config
|
|
||||||
run: cp .config/example.yml .config/default.yml
|
|
||||||
- name: Build
|
|
||||||
run: pnpm build
|
|
||||||
- name: Generate API JSON
|
|
||||||
run: pnpm --filter backend generate-api-json
|
|
||||||
|
|
||||||
# build misskey js
|
|
||||||
- name: Build misskey-js
|
|
||||||
run: |-
|
|
||||||
cp packages/backend/built/api.json packages/misskey-js/generator/api.json
|
|
||||||
pnpm run --filter misskey-js-type-generator generate
|
|
||||||
|
|
||||||
# packages/misskey-js/generator/built/autogen
|
|
||||||
- name: Upload Generated
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: generated-misskey-js
|
|
||||||
path: packages/misskey-js/generator/built/autogen
|
|
||||||
|
|
||||||
# pull_request_target safety: permissions: read-all, and no user codes are executed
|
|
||||||
get-actual-misskey-js:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
|
||||||
steps:
|
|
||||||
- name: checkout
|
|
||||||
uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
persist-credentials: false
|
|
||||||
ref: refs/pull/${{ github.event.pull_request.number }}/merge
|
|
||||||
|
|
||||||
- name: Upload From Merged
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: actual-misskey-js
|
|
||||||
path: packages/misskey-js/src/autogen
|
|
||||||
|
|
||||||
# pull_request_target safety: nothing is cloned from repository
|
|
||||||
comment-misskey-js-autogen:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs: [generate-misskey-js, get-actual-misskey-js]
|
|
||||||
permissions:
|
|
||||||
pull-requests: write
|
|
||||||
steps:
|
|
||||||
- name: download generated-misskey-js
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: generated-misskey-js
|
|
||||||
path: misskey-js-generated
|
|
||||||
|
|
||||||
- name: download actual-misskey-js
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: actual-misskey-js
|
|
||||||
path: misskey-js-actual
|
|
||||||
|
|
||||||
- name: check misskey-js changes
|
|
||||||
id: check-changes
|
|
||||||
run: |
|
|
||||||
diff -r -u --label=generated --label=on-tree ./misskey-js-generated ./misskey-js-actual > misskey-js.diff || true
|
|
||||||
|
|
||||||
if [ -s misskey-js.diff ]; then
|
|
||||||
echo "changes=true" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "changes=false" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Print full diff
|
|
||||||
run: cat ./misskey-js.diff
|
|
||||||
|
|
||||||
- name: send message
|
|
||||||
if: steps.check-changes.outputs.changes == 'true'
|
|
||||||
uses: thollander/actions-comment-pull-request@v2
|
|
||||||
with:
|
|
||||||
comment_tag: check-misskey-js-autogen
|
|
||||||
message: |-
|
|
||||||
Thank you for sending us a great Pull Request! 👍
|
|
||||||
Please regenerate misskey-js type definitions! 🙏
|
|
||||||
|
|
||||||
example:
|
|
||||||
```sh
|
|
||||||
pnpm run build-misskey-js-with-types
|
|
||||||
```
|
|
||||||
|
|
||||||
- name: send message
|
|
||||||
if: steps.check-changes.outputs.changes == 'false'
|
|
||||||
uses: thollander/actions-comment-pull-request@v2
|
|
||||||
with:
|
|
||||||
comment_tag: check-misskey-js-autogen
|
|
||||||
mode: delete
|
|
||||||
message: "Thank you!"
|
|
||||||
create_if_not_exists: false
|
|
||||||
|
|
||||||
- name: Make failure if changes are detected
|
|
||||||
if: steps.check-changes.outputs.changes == 'true'
|
|
||||||
run: exit 1
|
|
29
.github/workflows/check-misskey-js-version.yml
vendored
29
.github/workflows/check-misskey-js-version.yml
vendored
|
@ -1,29 +0,0 @@
|
||||||
name: Check Misskey JS version
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ develop ]
|
|
||||||
paths:
|
|
||||||
- packages/misskey-js/package.json
|
|
||||||
- package.json
|
|
||||||
- .github/workflows/check-misskey-js-version.yml
|
|
||||||
pull_request:
|
|
||||||
branches: [ develop ]
|
|
||||||
paths:
|
|
||||||
- packages/misskey-js/package.json
|
|
||||||
- package.json
|
|
||||||
- .github/workflows/check-misskey-js-version.yml
|
|
||||||
jobs:
|
|
||||||
check-version:
|
|
||||||
# ルートの package.json と packages/misskey-js/package.json のバージョンが一致しているかを確認する
|
|
||||||
name: Check version
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.2.2
|
|
||||||
- name: Check version
|
|
||||||
run: |
|
|
||||||
if [ "$(jq -r '.version' package.json)" != "$(jq -r '.version' packages/misskey-js/package.json)" ]; then
|
|
||||||
echo "Version mismatch!"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
80
.github/workflows/check-spdx-license-id.yml
vendored
80
.github/workflows/check-spdx-license-id.yml
vendored
|
@ -1,80 +0,0 @@
|
||||||
name: Check SPDX-License-Identifier
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
pull_request:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
check-spdx-license-id:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.2.2
|
|
||||||
- name: Check
|
|
||||||
run: |
|
|
||||||
counter=0
|
|
||||||
|
|
||||||
search() {
|
|
||||||
local directory="$1"
|
|
||||||
find "$directory" -type f \
|
|
||||||
'(' \
|
|
||||||
-name "*.cjs" -and -not -name '*.config.cjs' -o \
|
|
||||||
-name "*.html" -o \
|
|
||||||
-name "*.js" -and -not -name '*.config.js' -o \
|
|
||||||
-name "*.mjs" -and -not -name '*.config.mjs' -o \
|
|
||||||
-name "*.scss" -o \
|
|
||||||
-name "*.ts" -and -not -name '*.config.ts' -o \
|
|
||||||
-name "*.vue" \
|
|
||||||
')' -and \
|
|
||||||
-not -name '*eslint*'
|
|
||||||
}
|
|
||||||
|
|
||||||
check() {
|
|
||||||
local file="$1"
|
|
||||||
if ! (
|
|
||||||
grep -q "SPDX-FileCopyrightText: syuilo and misskey-project" "$file" ||
|
|
||||||
grep -q "SPDX-License-Identifier: AGPL-3.0-only" "$file"
|
|
||||||
); then
|
|
||||||
echo "Missing: $file"
|
|
||||||
((counter++))
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
directories=(
|
|
||||||
"cypress/e2e"
|
|
||||||
"packages/backend/migration"
|
|
||||||
"packages/backend/src"
|
|
||||||
"packages/backend/test"
|
|
||||||
"packages/frontend-shared/@types"
|
|
||||||
"packages/frontend-shared/js"
|
|
||||||
"packages/frontend/.storybook"
|
|
||||||
"packages/frontend/@types"
|
|
||||||
"packages/frontend/lib"
|
|
||||||
"packages/frontend/public"
|
|
||||||
"packages/frontend/src"
|
|
||||||
"packages/frontend/test"
|
|
||||||
"packages/frontend-embed/@types"
|
|
||||||
"packages/frontend-embed/src"
|
|
||||||
"packages/icons-subsetter/src"
|
|
||||||
"packages/misskey-bubble-game/src"
|
|
||||||
"packages/misskey-reversi/src"
|
|
||||||
"packages/sw/src"
|
|
||||||
"scripts"
|
|
||||||
)
|
|
||||||
|
|
||||||
for directory in "${directories[@]}"; do
|
|
||||||
for file in $(search $directory); do
|
|
||||||
check "$file"
|
|
||||||
done
|
|
||||||
done
|
|
||||||
|
|
||||||
if [ $counter -gt 0 ]; then
|
|
||||||
echo "SPDX-License-Identifier is missing in $counter files."
|
|
||||||
exit 1
|
|
||||||
else
|
|
||||||
echo "SPDX-License-Identifier is certainly described in all target files!"
|
|
||||||
exit 0
|
|
||||||
fi
|
|
2
.github/workflows/check_copyright_year.yml
vendored
2
.github/workflows/check_copyright_year.yml
vendored
|
@ -10,7 +10,7 @@ jobs:
|
||||||
check_copyright_year:
|
check_copyright_year:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
- run: |
|
- run: |
|
||||||
if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
|
if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
|
||||||
echo "Please change copyright year!"
|
echo "Please change copyright year!"
|
||||||
|
|
84
.github/workflows/deploy-test-environment.yml
vendored
84
.github/workflows/deploy-test-environment.yml
vendored
|
@ -1,84 +0,0 @@
|
||||||
name: deploy-test-environment
|
|
||||||
|
|
||||||
on:
|
|
||||||
issue_comment:
|
|
||||||
types: [created]
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
repository:
|
|
||||||
description: 'Repository to deploy (optional, use the repository where this workflow is stored by default)'
|
|
||||||
required: false
|
|
||||||
default: ''
|
|
||||||
branch_or_hash:
|
|
||||||
description: 'Branch or Commit hash to deploy (optional, use the branch where this workflow is stored by default)'
|
|
||||||
required: false
|
|
||||||
default: ''
|
|
||||||
wait_time:
|
|
||||||
description: 'Time to wait in seconds (optional, 1800 seconds by default)'
|
|
||||||
required: false
|
|
||||||
default: ''
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
get-pr-ref:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: github.event_name == 'issue_comment' && github.event.issue.pull_request && startsWith(github.event.comment.body, '/preview')
|
|
||||||
outputs:
|
|
||||||
is-allowed-user: ${{ steps.check-allowed-users.outputs.is-allowed-user }}
|
|
||||||
pr-ref: ${{ steps.get-ref.outputs.pr-ref }}
|
|
||||||
wait_time: ${{ steps.get-wait-time.outputs.wait_time }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4.2.2
|
|
||||||
|
|
||||||
- name: Check allowed users
|
|
||||||
id: check-allowed-users
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
ORG_ID: ${{ github.repository_owner_id }}
|
|
||||||
COMMENT_AUTHOR: ${{ github.event.comment.user.login }}
|
|
||||||
run: |
|
|
||||||
MEMBERSHIP_STATUS=$(curl -s -H "Authorization: Bearer $GITHUB_TOKEN" \
|
|
||||||
-H "Accept: application/vnd.github+json" \
|
|
||||||
-H "X-GitHub-Api-Version: 2022-11-28" \
|
|
||||||
"https://api.github.com/organizations/$ORG_ID/public_members/$COMMENT_AUTHOR" \
|
|
||||||
-o /dev/null -w '%{http_code}\n' -s)
|
|
||||||
if [ "$MEMBERSHIP_STATUS" -eq 204 ]; then
|
|
||||||
echo "is-allowed-user=true" > $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "is-allowed-user=false" > $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Get PR ref
|
|
||||||
id: get-ref
|
|
||||||
run: |
|
|
||||||
PR_REF="refs/pull/${{ github.event.issue.number }}/head"
|
|
||||||
echo "pr-ref=$PR_REF" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: Extract wait time
|
|
||||||
id: get-wait-time
|
|
||||||
env:
|
|
||||||
COMMENT_BODY: ${{ github.event.comment.body }}
|
|
||||||
run: |
|
|
||||||
WAIT_TIME=$(echo "$COMMENT_BODY" | grep -oP '(?<=/preview\s)\d+' || echo "1800")
|
|
||||||
echo "wait_time=$WAIT_TIME" > $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
deploy-test-environment-pr-comment:
|
|
||||||
needs: get-pr-ref
|
|
||||||
if: needs.get-pr-ref.outputs.is-allowed-user == 'true'
|
|
||||||
uses: joinmisskey/misskey-tga/.github/workflows/deploy-test-environment.yml@main
|
|
||||||
with:
|
|
||||||
repository: ${{ github.repository }}
|
|
||||||
branch_or_hash: ${{ needs.get-pr-ref.outputs.pr-ref }}
|
|
||||||
wait_time: ${{ needs.get-pr-ref.outputs.wait_time }}
|
|
||||||
secrets:
|
|
||||||
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
|
||||||
|
|
||||||
deploy-test-environment-wd:
|
|
||||||
if: github.event_name == 'workflow_dispatch'
|
|
||||||
uses: joinmisskey/misskey-tga/.github/workflows/deploy-test-environment.yml@main
|
|
||||||
with:
|
|
||||||
repository: ${{ inputs.repository || github.repository }}
|
|
||||||
branch_or_hash: ${{ inputs.branch_or_hash || github.ref_name }}
|
|
||||||
wait_time: ${{ inputs.wait_time || '1800' }}
|
|
||||||
secrets:
|
|
||||||
DISCORD_WEBHOOK_URL: ${{ secrets.DISCORD_WEBHOOK_URL }}
|
|
79
.github/workflows/docker-develop.yml
vendored
79
.github/workflows/docker-develop.yml
vendored
|
@ -6,83 +6,38 @@ on:
|
||||||
- develop
|
- develop
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
|
||||||
REGISTRY_IMAGE: misskey/misskey
|
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
# see https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
|
push_to_registry:
|
||||||
build:
|
name: Push Docker image to Docker Hub
|
||||||
name: Build
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
platform:
|
|
||||||
- linux/amd64
|
|
||||||
- linux/arm64
|
|
||||||
if: github.repository == 'misskey-dev/misskey'
|
if: github.repository == 'misskey-dev/misskey'
|
||||||
steps:
|
steps:
|
||||||
- name: Prepare
|
|
||||||
run: |
|
|
||||||
platform=${{ matrix.platform }}
|
|
||||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
|
||||||
- name: Check out the repo
|
- name: Check out the repo
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.1.1
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v3
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v3.0.0
|
||||||
|
with:
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
- name: Docker meta
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: misskey/misskey
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
- name: Build and push by digest
|
- name: Build and Push to Docker Hub
|
||||||
id: build
|
uses: docker/build-push-action@v5
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
with:
|
||||||
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
platforms: ${{ matrix.platform }}
|
platforms: ${{ steps.buildx.outputs.platforms }}
|
||||||
provenance: false
|
provenance: false
|
||||||
|
tags: misskey/misskey:develop
|
||||||
labels: develop
|
labels: develop
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
|
|
||||||
- name: Export digest
|
|
||||||
run: |
|
|
||||||
mkdir -p /tmp/digests
|
|
||||||
digest="${{ steps.build.outputs.digest }}"
|
|
||||||
touch "/tmp/digests/${digest#sha256:}"
|
|
||||||
- name: Upload digest
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: digests-${{ env.PLATFORM_PAIR }}
|
|
||||||
path: /tmp/digests/*
|
|
||||||
if-no-files-found: error
|
|
||||||
retention-days: 1
|
|
||||||
|
|
||||||
merge:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs:
|
|
||||||
- build
|
|
||||||
steps:
|
|
||||||
- name: Download digests
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
path: /tmp/digests
|
|
||||||
pattern: digests-*
|
|
||||||
merge-multiple: true
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
- name: Create manifest list and push
|
|
||||||
working-directory: /tmp/digests
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create --tag ${{ env.REGISTRY_IMAGE }}:develop \
|
|
||||||
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
|
|
||||||
- name: Inspect image
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:develop
|
|
||||||
|
|
102
.github/workflows/docker.yml
vendored
102
.github/workflows/docker.yml
vendored
|
@ -5,101 +5,45 @@ on:
|
||||||
types: [published]
|
types: [published]
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
|
||||||
env:
|
jobs:
|
||||||
REGISTRY_IMAGE: misskey/misskey
|
push_to_registry:
|
||||||
TAGS: |
|
name: Push Docker image to Docker Hub
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Check out the repo
|
||||||
|
uses: actions/checkout@v4.1.1
|
||||||
|
- name: Set up Docker Buildx
|
||||||
|
id: buildx
|
||||||
|
uses: docker/setup-buildx-action@v3.0.0
|
||||||
|
with:
|
||||||
|
platforms: linux/amd64,linux/arm64
|
||||||
|
- name: Docker meta
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v5
|
||||||
|
with:
|
||||||
|
images: misskey/misskey
|
||||||
|
tags: |
|
||||||
type=edge
|
type=edge
|
||||||
type=ref,event=pr
|
type=ref,event=pr
|
||||||
type=ref,event=branch
|
type=ref,event=branch
|
||||||
type=semver,pattern={{version}}
|
type=semver,pattern={{version}}
|
||||||
type=semver,pattern={{major}}.{{minor}}
|
type=semver,pattern={{major}}.{{minor}}
|
||||||
type=semver,pattern={{major}}
|
type=semver,pattern={{major}}
|
||||||
|
|
||||||
jobs:
|
|
||||||
# see https://docs.docker.com/build/ci/github-actions/multi-platform/#distribute-build-across-multiple-runners
|
|
||||||
build:
|
|
||||||
name: Build
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
platform:
|
|
||||||
- linux/amd64
|
|
||||||
- linux/arm64
|
|
||||||
steps:
|
|
||||||
- name: Prepare
|
|
||||||
run: |
|
|
||||||
platform=${{ matrix.platform }}
|
|
||||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
|
||||||
- name: Check out the repo
|
|
||||||
uses: actions/checkout@v4.2.2
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
- name: Docker meta
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
images: ${{ env.REGISTRY_IMAGE }}
|
|
||||||
tags: ${{ env.TAGS }}
|
|
||||||
- name: Log in to Docker Hub
|
- name: Log in to Docker Hub
|
||||||
uses: docker/login-action@v3
|
uses: docker/login-action@v3
|
||||||
with:
|
with:
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
username: ${{ secrets.DOCKER_USERNAME }}
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
password: ${{ secrets.DOCKER_PASSWORD }}
|
||||||
- name: Build and Push to Docker Hub
|
- name: Build and Push to Docker Hub
|
||||||
id: build
|
uses: docker/build-push-action@v5
|
||||||
uses: docker/build-push-action@v6
|
|
||||||
with:
|
with:
|
||||||
|
builder: ${{ steps.buildx.outputs.name }}
|
||||||
context: .
|
context: .
|
||||||
push: true
|
push: true
|
||||||
platforms: ${{ matrix.platform }}
|
platforms: ${{ steps.buildx.outputs.platforms }}
|
||||||
provenance: false
|
provenance: false
|
||||||
|
tags: ${{ steps.meta.outputs.tags }}
|
||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true
|
|
||||||
- name: Export digest
|
|
||||||
run: |
|
|
||||||
mkdir -p /tmp/digests
|
|
||||||
digest="${{ steps.build.outputs.digest }}"
|
|
||||||
touch "/tmp/digests/${digest#sha256:}"
|
|
||||||
- name: Upload digest
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: digests-${{ env.PLATFORM_PAIR }}
|
|
||||||
path: /tmp/digests/*
|
|
||||||
if-no-files-found: error
|
|
||||||
retention-days: 1
|
|
||||||
|
|
||||||
merge:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
needs:
|
|
||||||
- build
|
|
||||||
steps:
|
|
||||||
- name: Download digests
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
path: /tmp/digests
|
|
||||||
pattern: digests-*
|
|
||||||
merge-multiple: true
|
|
||||||
- name: Set up Docker Buildx
|
|
||||||
uses: docker/setup-buildx-action@v3
|
|
||||||
- name: Docker meta
|
|
||||||
id: meta
|
|
||||||
uses: docker/metadata-action@v5
|
|
||||||
with:
|
|
||||||
images: ${{ env.REGISTRY_IMAGE }}
|
|
||||||
tags: ${{ env.TAGS }}
|
|
||||||
- name: Login to Docker Hub
|
|
||||||
uses: docker/login-action@v3
|
|
||||||
with:
|
|
||||||
username: ${{ secrets.DOCKER_USERNAME }}
|
|
||||||
password: ${{ secrets.DOCKER_PASSWORD }}
|
|
||||||
- name: Create manifest list and push
|
|
||||||
working-directory: /tmp/digests
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools create $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \
|
|
||||||
$(printf '${{ env.REGISTRY_IMAGE }}@sha256:%s ' *)
|
|
||||||
- name: Inspect image
|
|
||||||
run: |
|
|
||||||
docker buildx imagetools inspect ${{ env.REGISTRY_IMAGE }}:${{ steps.meta.outputs.version }}
|
|
||||||
|
|
10
.github/workflows/dockle.yml
vendored
10
.github/workflows/dockle.yml
vendored
|
@ -13,16 +13,14 @@ jobs:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
env:
|
env:
|
||||||
DOCKER_CONTENT_TRUST: 1
|
DOCKER_CONTENT_TRUST: 1
|
||||||
DOCKLE_VERSION: 0.4.14
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
|
- run: |
|
||||||
run: |
|
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v0.4.10/dockle_0.4.10_Linux-64bit.deb"
|
||||||
curl -L -o dockle.deb "https://github.com/goodwithtech/dockle/releases/download/v${DOCKLE_VERSION}/dockle_${DOCKLE_VERSION}_Linux-64bit.deb"
|
|
||||||
sudo dpkg -i dockle.deb
|
sudo dpkg -i dockle.deb
|
||||||
- run: |
|
- run: |
|
||||||
cp .config/docker_example.env .config/docker.env
|
cp .config/docker_example.env .config/docker.env
|
||||||
cp ./compose_example.yml ./compose.yml
|
cp ./docker-compose.yml.example ./docker-compose.yml
|
||||||
- run: |
|
- run: |
|
||||||
docker compose up -d web
|
docker compose up -d web
|
||||||
docker tag "$(docker compose images web | awk 'OFS=":" {print $4}' | tail -n +2)" misskey-web:latest
|
docker tag "$(docker compose images web | awk 'OFS=":" {print $4}' | tail -n +2)" misskey-web:latest
|
||||||
|
|
171
.github/workflows/get-api-diff.yml
vendored
171
.github/workflows/get-api-diff.yml
vendored
|
@ -6,36 +6,49 @@ on:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
- develop
|
- develop
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
- .github/workflows/get-api-diff.yml
|
|
||||||
jobs:
|
jobs:
|
||||||
get-from-misskey:
|
get-base:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
permissions:
|
permissions:
|
||||||
contents: read
|
contents: read
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
api-json-name: [api-base.json, api-head.json]
|
node-version: [20.5.1]
|
||||||
include:
|
|
||||||
- api-json-name: api-base.json
|
services:
|
||||||
ref: ${{ github.base_ref }}
|
db:
|
||||||
- api-json-name: api-head.json
|
image: postgres:13
|
||||||
ref: refs/pull/${{ github.event.number }}/merge
|
ports:
|
||||||
|
- 5432:5432
|
||||||
|
env:
|
||||||
|
POSTGRES_DB: misskey
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
|
POSTGRES_USER: example-misskey-user
|
||||||
|
POSTGRESS_PASS: example-misskey-pass
|
||||||
|
redis:
|
||||||
|
image: redis:7
|
||||||
|
ports:
|
||||||
|
- 6379:6379
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
ref: ${{ matrix.ref }}
|
repository: ${{ github.event.pull_request.base.repo.full_name }}
|
||||||
|
ref: ${{ github.base_ref }}
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4.1.0
|
uses: pnpm/action-setup@v2
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
version: 8
|
||||||
|
run_install: false
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4.0.0
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
- run: corepack enable
|
||||||
- run: pnpm i --frozen-lockfile
|
- run: pnpm i --frozen-lockfile
|
||||||
- name: Check pnpm-lock.yaml
|
- name: Check pnpm-lock.yaml
|
||||||
run: git diff --exit-code pnpm-lock.yaml
|
run: git diff --exit-code pnpm-lock.yaml
|
||||||
|
@ -43,15 +56,121 @@ jobs:
|
||||||
run: cp .config/example.yml .config/default.yml
|
run: cp .config/example.yml .config/default.yml
|
||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm build
|
run: pnpm build
|
||||||
- name: Generate API JSON
|
- name : Migrate
|
||||||
run: pnpm --filter backend generate-api-json
|
run: pnpm migrate
|
||||||
- name: Copy API.json
|
- name: Launch misskey
|
||||||
run: cp packages/backend/built/api.json ${{ matrix.api-json-name }}
|
run: |
|
||||||
|
screen -S misskey -dm pnpm run dev
|
||||||
|
sleep 30s
|
||||||
|
- name: Wait for Misskey to be ready
|
||||||
|
run: |
|
||||||
|
MAX_RETRIES=12
|
||||||
|
RETRY_DELAY=5
|
||||||
|
count=0
|
||||||
|
until $(curl --output /dev/null --silent --head --fail http://localhost:3000) || [[ $count -eq $MAX_RETRIES ]]; do
|
||||||
|
printf '.'
|
||||||
|
sleep $RETRY_DELAY
|
||||||
|
count=$((count + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ $count -eq $MAX_RETRIES ]]; then
|
||||||
|
echo "Failed to connect to Misskey after $MAX_RETRIES attempts."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- id: fetch
|
||||||
|
name: Get api.json from Misskey
|
||||||
|
run: |
|
||||||
|
RESULT=$(curl --retry 5 --retry-delay 5 --retry-max-time 60 http://localhost:3000/api.json)
|
||||||
|
echo $RESULT > api-base.json
|
||||||
- name: Upload Artifact
|
- name: Upload Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: api-artifact-${{ matrix.api-json-name }}
|
name: api-artifact
|
||||||
path: ${{ matrix.api-json-name }}
|
path: api-base.json
|
||||||
|
- name: Kill Misskey Job
|
||||||
|
run: screen -S misskey -X quit
|
||||||
|
|
||||||
|
get-head:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [20.5.1]
|
||||||
|
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: postgres:13
|
||||||
|
ports:
|
||||||
|
- 5432:5432
|
||||||
|
env:
|
||||||
|
POSTGRES_DB: misskey
|
||||||
|
POSTGRES_HOST_AUTH_METHOD: trust
|
||||||
|
POSTGRES_USER: example-misskey-user
|
||||||
|
POSTGRESS_PASS: example-misskey-pass
|
||||||
|
redis:
|
||||||
|
image: redis:7
|
||||||
|
ports:
|
||||||
|
- 6379:6379
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4.1.1
|
||||||
|
with:
|
||||||
|
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||||
|
ref: ${{ github.head_ref }}
|
||||||
|
submodules: true
|
||||||
|
- name: Install pnpm
|
||||||
|
uses: pnpm/action-setup@v2
|
||||||
|
with:
|
||||||
|
version: 8
|
||||||
|
run_install: false
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4.0.0
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
cache: 'pnpm'
|
||||||
|
- run: corepack enable
|
||||||
|
- run: pnpm i --frozen-lockfile
|
||||||
|
- name: Check pnpm-lock.yaml
|
||||||
|
run: git diff --exit-code pnpm-lock.yaml
|
||||||
|
- name: Copy Configure
|
||||||
|
run: cp .config/example.yml .config/default.yml
|
||||||
|
- name: Build
|
||||||
|
run: pnpm build
|
||||||
|
- name : Migrate
|
||||||
|
run: pnpm migrate
|
||||||
|
- name: Launch misskey
|
||||||
|
run: |
|
||||||
|
screen -S misskey -dm pnpm run dev
|
||||||
|
sleep 30s
|
||||||
|
- name: Wait for Misskey to be ready
|
||||||
|
run: |
|
||||||
|
MAX_RETRIES=12
|
||||||
|
RETRY_DELAY=5
|
||||||
|
count=0
|
||||||
|
until $(curl --output /dev/null --silent --head --fail http://localhost:3000) || [[ $count -eq $MAX_RETRIES ]]; do
|
||||||
|
printf '.'
|
||||||
|
sleep $RETRY_DELAY
|
||||||
|
count=$((count + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
if [[ $count -eq $MAX_RETRIES ]]; then
|
||||||
|
echo "Failed to connect to Misskey after $MAX_RETRIES attempts."
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- id: fetch
|
||||||
|
name: Get api.json from Misskey
|
||||||
|
run: |
|
||||||
|
RESULT=$(curl --retry 5 --retry-delay 5 --retry-max-time 60 http://localhost:3000/api.json)
|
||||||
|
echo $RESULT > api-head.json
|
||||||
|
- name: Upload Artifact
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: api-artifact
|
||||||
|
path: api-head.json
|
||||||
|
- name: Kill Misskey Job
|
||||||
|
run: screen -S misskey -X quit
|
||||||
|
|
||||||
save-pr-number:
|
save-pr-number:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
@ -61,7 +180,7 @@ jobs:
|
||||||
PR_NUMBER: ${{ github.event.number }}
|
PR_NUMBER: ${{ github.event.number }}
|
||||||
run: |
|
run: |
|
||||||
echo "$PR_NUMBER" > ./pr_number
|
echo "$PR_NUMBER" > ./pr_number
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: api-artifact-pr-number
|
name: api-artifact
|
||||||
path: pr_number
|
path: pr_number
|
||||||
|
|
2
.github/workflows/labeler.yml
vendored
2
.github/workflows/labeler.yml
vendored
|
@ -11,6 +11,6 @@ jobs:
|
||||||
pull-requests: write
|
pull-requests: write
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/labeler@v5
|
- uses: actions/labeler@v4
|
||||||
with:
|
with:
|
||||||
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
repo-token: "${{ secrets.GITHUB_TOKEN }}"
|
||||||
|
|
79
.github/workflows/lint.yml
vendored
79
.github/workflows/lint.yml
vendored
|
@ -5,45 +5,25 @@ on:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
- develop
|
- develop
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
- packages/frontend/**
|
|
||||||
- packages/frontend-shared/**
|
|
||||||
- packages/frontend-embed/**
|
|
||||||
- packages/icons-subsetter/**
|
|
||||||
- packages/sw/**
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- packages/misskey-bubble-game/**
|
|
||||||
- packages/misskey-reversi/**
|
|
||||||
- packages/shared/eslint.config.js
|
|
||||||
- .github/workflows/lint.yml
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
- packages/frontend/**
|
|
||||||
- packages/frontend-shared/**
|
|
||||||
- packages/frontend-embed/**
|
|
||||||
- packages/icons-subsetter/**
|
|
||||||
- packages/sw/**
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- packages/misskey-bubble-game/**
|
|
||||||
- packages/misskey-reversi/**
|
|
||||||
- packages/shared/eslint.config.js
|
|
||||||
- .github/workflows/lint.yml
|
|
||||||
jobs:
|
jobs:
|
||||||
pnpm_install:
|
pnpm_install:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- uses: pnpm/action-setup@v2
|
||||||
uses: pnpm/action-setup@v4.1.0
|
with:
|
||||||
- uses: actions/setup-node@v4.4.0
|
version: 8
|
||||||
|
run_install: false
|
||||||
|
- uses: actions/setup-node@v4.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
- run: corepack enable
|
||||||
- run: pnpm i --frozen-lockfile
|
- run: pnpm i --frozen-lockfile
|
||||||
|
|
||||||
lint:
|
lint:
|
||||||
|
@ -55,35 +35,24 @@ jobs:
|
||||||
workspace:
|
workspace:
|
||||||
- backend
|
- backend
|
||||||
- frontend
|
- frontend
|
||||||
- frontend-shared
|
|
||||||
- frontend-embed
|
|
||||||
- icons-subsetter
|
|
||||||
- sw
|
- sw
|
||||||
- misskey-js
|
- misskey-js
|
||||||
- misskey-bubble-game
|
|
||||||
- misskey-reversi
|
|
||||||
env:
|
|
||||||
eslint-cache-version: v1
|
|
||||||
eslint-cache-path: ${{ github.workspace }}/node_modules/.cache/eslint-${{ matrix.workspace }}
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- uses: pnpm/action-setup@v2
|
||||||
uses: pnpm/action-setup@v4.1.0
|
with:
|
||||||
- uses: actions/setup-node@v4.4.0
|
version: 7
|
||||||
|
run_install: false
|
||||||
|
- uses: actions/setup-node@v4.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
- run: corepack enable
|
||||||
- run: pnpm i --frozen-lockfile
|
- run: pnpm i --frozen-lockfile
|
||||||
- name: Restore eslint cache
|
- run: pnpm --filter ${{ matrix.workspace }} run eslint
|
||||||
uses: actions/cache@v4.2.3
|
|
||||||
with:
|
|
||||||
path: ${{ env.eslint-cache-path }}
|
|
||||||
key: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-${{ github.ref_name }}-${{ github.sha }}
|
|
||||||
restore-keys: eslint-${{ env.eslint-cache-version }}-${{ matrix.workspace }}-${{ hashFiles('**/pnpm-lock.yaml') }}-
|
|
||||||
- run: pnpm --filter ${{ matrix.workspace }} run eslint --cache --cache-location ${{ env.eslint-cache-path }} --cache-strategy content
|
|
||||||
|
|
||||||
typecheck:
|
typecheck:
|
||||||
needs: [pnpm_install]
|
needs: [pnpm_install]
|
||||||
|
@ -93,22 +62,20 @@ jobs:
|
||||||
matrix:
|
matrix:
|
||||||
workspace:
|
workspace:
|
||||||
- backend
|
- backend
|
||||||
- sw
|
|
||||||
- misskey-js
|
- misskey-js
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- uses: pnpm/action-setup@v2
|
||||||
uses: pnpm/action-setup@v4.1.0
|
with:
|
||||||
- uses: actions/setup-node@v4.4.0
|
version: 7
|
||||||
|
run_install: false
|
||||||
|
- uses: actions/setup-node@v4.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
- run: corepack enable
|
||||||
- run: pnpm i --frozen-lockfile
|
- run: pnpm i --frozen-lockfile
|
||||||
- run: pnpm --filter misskey-js run build
|
|
||||||
if: ${{ matrix.workspace == 'backend' || matrix.workspace == 'sw' }}
|
|
||||||
- run: pnpm --filter misskey-reversi run build
|
|
||||||
if: ${{ matrix.workspace == 'backend' }}
|
|
||||||
- run: pnpm --filter ${{ matrix.workspace }} run typecheck
|
- run: pnpm --filter ${{ matrix.workspace }} run typecheck
|
||||||
|
|
28
.github/workflows/locale.yml
vendored
28
.github/workflows/locale.yml
vendored
|
@ -1,28 +0,0 @@
|
||||||
name: Lint
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- locales/**
|
|
||||||
- .github/workflows/locale.yml
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- locales/**
|
|
||||||
- .github/workflows/locale.yml
|
|
||||||
jobs:
|
|
||||||
locale_verify:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
continue-on-error: true
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
- uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
cache: 'pnpm'
|
|
||||||
- run: pnpm i --frozen-lockfile
|
|
||||||
- run: cd locales && node verify.js
|
|
36
.github/workflows/ok-to-test.yml
vendored
Normal file
36
.github/workflows/ok-to-test.yml
vendored
Normal file
|
@ -0,0 +1,36 @@
|
||||||
|
# If someone with write access comments "/ok-to-test" on a pull request, emit a repository_dispatch event
|
||||||
|
name: Ok To Test
|
||||||
|
|
||||||
|
on:
|
||||||
|
issue_comment:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
ok-to-test:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
# Only run for PRs, not issue comments
|
||||||
|
if: ${{ github.event.issue.pull_request }}
|
||||||
|
steps:
|
||||||
|
# Generate a GitHub App installation access token from an App ID and private key
|
||||||
|
# To create a new GitHub App:
|
||||||
|
# https://developer.github.com/apps/building-github-apps/creating-a-github-app/
|
||||||
|
# See app.yml for an example app manifest
|
||||||
|
- name: Generate token
|
||||||
|
id: generate_token
|
||||||
|
uses: tibdex/github-app-token@v2
|
||||||
|
with:
|
||||||
|
app_id: ${{ secrets.DEPLOYBOT_APP_ID }}
|
||||||
|
private_key: ${{ secrets.DEPLOYBOT_PRIVATE_KEY }}
|
||||||
|
|
||||||
|
- name: Slash Command Dispatch
|
||||||
|
uses: peter-evans/slash-command-dispatch@v3
|
||||||
|
env:
|
||||||
|
TOKEN: ${{ steps.generate_token.outputs.token }}
|
||||||
|
with:
|
||||||
|
token: ${{ env.TOKEN }} # GitHub App installation access token
|
||||||
|
# token: ${{ secrets.PERSONAL_ACCESS_TOKEN }} # PAT or OAuth token will also work
|
||||||
|
reaction-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
issue-type: pull-request
|
||||||
|
commands: deploy
|
||||||
|
named-args: true
|
||||||
|
permission: write
|
36
.github/workflows/on-release-created.yml
vendored
36
.github/workflows/on-release-created.yml
vendored
|
@ -1,36 +0,0 @@
|
||||||
name: On Release Created (Publish misskey-js)
|
|
||||||
|
|
||||||
on:
|
|
||||||
release:
|
|
||||||
types: [created]
|
|
||||||
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
publish-misskey-js:
|
|
||||||
name: Publish misskey-js
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: read
|
|
||||||
id-token: write
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
cache: 'pnpm'
|
|
||||||
- name: Publish package
|
|
||||||
run: |
|
|
||||||
pnpm i --frozen-lockfile
|
|
||||||
pnpm build
|
|
||||||
pnpm --filter misskey-js publish --access public --no-git-checks --provenance
|
|
||||||
env:
|
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
|
|
||||||
NPM_TOKEN: ${{ secrets.NODE_AUTH_TOKEN }}
|
|
92
.github/workflows/pr-preview-deploy.yml
vendored
Normal file
92
.github/workflows/pr-preview-deploy.yml
vendored
Normal file
|
@ -0,0 +1,92 @@
|
||||||
|
# Run secret-dependent integration tests only after /deploy approval
|
||||||
|
on:
|
||||||
|
repository_dispatch:
|
||||||
|
types: [deploy-command]
|
||||||
|
|
||||||
|
name: Deploy preview environment
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# Repo owner has commented /deploy on a (fork-based) pull request
|
||||||
|
deploy-preview-environment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if:
|
||||||
|
github.event.client_payload.slash_command.sha != '' &&
|
||||||
|
contains(github.event.client_payload.pull_request.head.sha, github.event.client_payload.slash_command.sha)
|
||||||
|
steps:
|
||||||
|
- uses: actions/github-script@v6.3.3
|
||||||
|
id: check-id
|
||||||
|
env:
|
||||||
|
number: ${{ github.event.client_payload.pull_request.number }}
|
||||||
|
job: ${{ github.job }}
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
result-encoding: string
|
||||||
|
script: |
|
||||||
|
const { data: pull } = await github.rest.pulls.get({
|
||||||
|
...context.repo,
|
||||||
|
pull_number: process.env.number
|
||||||
|
});
|
||||||
|
const ref = pull.head.sha;
|
||||||
|
|
||||||
|
const { data: checks } = await github.rest.checks.listForRef({
|
||||||
|
...context.repo,
|
||||||
|
ref
|
||||||
|
});
|
||||||
|
|
||||||
|
const check = checks.check_runs.filter(c => c.name === process.env.job);
|
||||||
|
|
||||||
|
return check[0].id;
|
||||||
|
|
||||||
|
- uses: actions/github-script@v6.3.3
|
||||||
|
env:
|
||||||
|
check_id: ${{ steps.check-id.outputs.result }}
|
||||||
|
details_url: ${{ github.server_url }}/${{ github.repository }}/runs/${{ github.run_id }}
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
script: |
|
||||||
|
await github.rest.checks.update({
|
||||||
|
...context.repo,
|
||||||
|
check_run_id: process.env.check_id,
|
||||||
|
status: 'in_progress',
|
||||||
|
details_url: process.env.details_url
|
||||||
|
});
|
||||||
|
|
||||||
|
# Check out merge commit
|
||||||
|
- name: Fork based /deploy checkout
|
||||||
|
uses: actions/checkout@v4.1.1
|
||||||
|
with:
|
||||||
|
ref: 'refs/pull/${{ github.event.client_payload.pull_request.number }}/merge'
|
||||||
|
|
||||||
|
# <insert integration tests needing secrets>
|
||||||
|
- name: Context
|
||||||
|
uses: okteto/context@latest
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.OKTETO_TOKEN }}
|
||||||
|
|
||||||
|
- name: Deploy preview environment
|
||||||
|
uses: ikuradon/deploy-preview@latest
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
name: pr-${{ github.event.client_payload.pull_request.number }}-syuilo
|
||||||
|
timeout: 15m
|
||||||
|
|
||||||
|
# Update check run called "integration-fork"
|
||||||
|
- uses: actions/github-script@v6.3.3
|
||||||
|
id: update-check-run
|
||||||
|
if: ${{ always() }}
|
||||||
|
env:
|
||||||
|
# Conveniently, job.status maps to https://developer.github.com/v3/checks/runs/#update-a-check-run
|
||||||
|
conclusion: ${{ job.status }}
|
||||||
|
check_id: ${{ steps.check-id.outputs.result }}
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
script: |
|
||||||
|
const { data: result } = await github.rest.checks.update({
|
||||||
|
...context.repo,
|
||||||
|
check_run_id: process.env.check_id,
|
||||||
|
status: 'completed',
|
||||||
|
conclusion: process.env.conclusion
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
54
.github/workflows/pr-preview-destroy.yml
vendored
Normal file
54
.github/workflows/pr-preview-destroy.yml
vendored
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
# file: .github/workflows/preview-closed.yaml
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- closed
|
||||||
|
|
||||||
|
name: Destroy preview environment
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
destroy-preview-environment:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/github-script@v6.3.3
|
||||||
|
id: check-conclusion
|
||||||
|
env:
|
||||||
|
number: ${{ github.event.number }}
|
||||||
|
with:
|
||||||
|
github-token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
result-encoding: string
|
||||||
|
script: |
|
||||||
|
const { data: pull } = await github.rest.pulls.get({
|
||||||
|
...context.repo,
|
||||||
|
pull_number: process.env.number
|
||||||
|
});
|
||||||
|
const ref = pull.head.sha;
|
||||||
|
|
||||||
|
const { data: checks } = await github.rest.checks.listForRef({
|
||||||
|
...context.repo,
|
||||||
|
ref
|
||||||
|
});
|
||||||
|
|
||||||
|
const check = checks.check_runs.filter(c => c.name === 'deploy-preview-environment');
|
||||||
|
|
||||||
|
if (check.length === 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const { data: result } = await github.rest.checks.get({
|
||||||
|
...context.repo,
|
||||||
|
check_run_id: check[0].id,
|
||||||
|
});
|
||||||
|
|
||||||
|
return result.conclusion;
|
||||||
|
- name: Context
|
||||||
|
if: steps.check-conclusion.outputs.result == 'success'
|
||||||
|
uses: okteto/context@latest
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.OKTETO_TOKEN }}
|
||||||
|
|
||||||
|
- name: Destroy preview environment
|
||||||
|
if: steps.check-conclusion.outputs.result == 'success'
|
||||||
|
uses: okteto/destroy-preview@latest
|
||||||
|
with:
|
||||||
|
name: pr-${{ github.event.number }}-syuilo
|
48
.github/workflows/release-edit-with-push.yml
vendored
48
.github/workflows/release-edit-with-push.yml
vendored
|
@ -1,48 +0,0 @@
|
||||||
name: "Release Manager: sync changelog with PR"
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- develop
|
|
||||||
paths:
|
|
||||||
- 'CHANGELOG.md'
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
edit:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
# headが$GITHUB_REF_NAME, baseが$STABLE_BRANCHかつopenのPRを1つ取得
|
|
||||||
- name: Get PR
|
|
||||||
run: |
|
|
||||||
echo "pr_number=$(gh pr list --limit 1 --search "head:$GITHUB_REF_NAME base:$STABLE_BRANCH is:open" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
|
|
||||||
id: get_pr
|
|
||||||
env:
|
|
||||||
STABLE_BRANCH: ${{ vars.STABLE_BRANCH }}
|
|
||||||
- name: Get target version
|
|
||||||
if: steps.get_pr.outputs.pr_number != ''
|
|
||||||
uses: misskey-dev/release-manager-actions/.github/actions/get-target-version@v2
|
|
||||||
id: v
|
|
||||||
# CHANGELOG.mdの内容を取得
|
|
||||||
- name: Get changelog
|
|
||||||
if: steps.get_pr.outputs.pr_number != ''
|
|
||||||
uses: misskey-dev/release-manager-actions/.github/actions/get-changelog@v2
|
|
||||||
with:
|
|
||||||
version: ${{ steps.v.outputs.target_version }}
|
|
||||||
id: changelog
|
|
||||||
# PRのnotesを更新
|
|
||||||
- name: Update PR
|
|
||||||
if: steps.get_pr.outputs.pr_number != ''
|
|
||||||
run: |
|
|
||||||
gh pr edit "$PR_NUMBER" --body "$CHANGELOG"
|
|
||||||
env:
|
|
||||||
PR_NUMBER: ${{ steps.get_pr.outputs.pr_number }}
|
|
||||||
CHANGELOG: ${{ steps.changelog.outputs.changelog }}
|
|
136
.github/workflows/release-with-dispatch.yml
vendored
136
.github/workflows/release-with-dispatch.yml
vendored
|
@ -1,136 +0,0 @@
|
||||||
name: "Release Manager [Dispatch]"
|
|
||||||
|
|
||||||
on:
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
## Specify the type of the next release.
|
|
||||||
#version_increment_type:
|
|
||||||
# type: choice
|
|
||||||
# description: 'VERSION INCREMENT TYPE'
|
|
||||||
# default: 'patch'
|
|
||||||
# required: false
|
|
||||||
# options:
|
|
||||||
# - 'major'
|
|
||||||
# - 'minor'
|
|
||||||
# - 'patch'
|
|
||||||
merge:
|
|
||||||
type: boolean
|
|
||||||
description: 'MERGE RELEASE BRANCH TO MAIN'
|
|
||||||
default: false
|
|
||||||
start-rc:
|
|
||||||
type: boolean
|
|
||||||
description: 'Start Release Candidate'
|
|
||||||
default: false
|
|
||||||
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
permissions:
|
|
||||||
contents: write
|
|
||||||
issues: write
|
|
||||||
pull-requests: write
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
get-pr:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
outputs:
|
|
||||||
pr_number: ${{ steps.get_pr.outputs.pr_number }}
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
# headが$GITHUB_REF_NAME, baseが$STABLE_BRANCHかつopenのPRを1つ取得
|
|
||||||
- name: Get PRs
|
|
||||||
run: |
|
|
||||||
echo "pr_number=$(gh pr list --limit 1 --search "head:$GITHUB_REF_NAME base:$STABLE_BRANCH is:open" --json number --jq '.[] | .number')" >> $GITHUB_OUTPUT
|
|
||||||
id: get_pr
|
|
||||||
env:
|
|
||||||
STABLE_BRANCH: ${{ vars.STABLE_BRANCH }}
|
|
||||||
|
|
||||||
merge:
|
|
||||||
uses: misskey-dev/release-manager-actions/.github/workflows/merge.yml@v2
|
|
||||||
needs: get-pr
|
|
||||||
if: ${{ needs.get-pr.outputs.pr_number != '' && inputs.merge == true }}
|
|
||||||
with:
|
|
||||||
pr_number: ${{ needs.get-pr.outputs.pr_number }}
|
|
||||||
user: 'github-actions[bot]'
|
|
||||||
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
|
|
||||||
# Text to prepend to the changelog
|
|
||||||
# The first line must be `## Unreleased`
|
|
||||||
changes_template: |
|
|
||||||
## Unreleased
|
|
||||||
|
|
||||||
### General
|
|
||||||
-
|
|
||||||
|
|
||||||
### Client
|
|
||||||
-
|
|
||||||
|
|
||||||
### Server
|
|
||||||
-
|
|
||||||
|
|
||||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
|
||||||
indent: ${{ vars.INDENT }}
|
|
||||||
secrets:
|
|
||||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
|
||||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
|
||||||
|
|
||||||
create-prerelease:
|
|
||||||
uses: misskey-dev/release-manager-actions/.github/workflows/create-prerelease.yml@v2
|
|
||||||
needs: get-pr
|
|
||||||
if: ${{ needs.get-pr.outputs.pr_number != '' && inputs.merge != true }}
|
|
||||||
with:
|
|
||||||
pr_number: ${{ needs.get-pr.outputs.pr_number }}
|
|
||||||
user: 'github-actions[bot]'
|
|
||||||
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
|
|
||||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
|
||||||
indent: ${{ vars.INDENT }}
|
|
||||||
draft_prerelease_channel: alpha
|
|
||||||
ready_start_prerelease_channel: beta
|
|
||||||
prerelease_channel: ${{ inputs.start-rc && 'rc' || '' }}
|
|
||||||
reset_number_on_channel_change: true
|
|
||||||
secrets:
|
|
||||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
|
||||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
|
||||||
|
|
||||||
create-target:
|
|
||||||
uses: misskey-dev/release-manager-actions/.github/workflows/create-target.yml@v2
|
|
||||||
needs: get-pr
|
|
||||||
if: ${{ needs.get-pr.outputs.pr_number == '' }}
|
|
||||||
with:
|
|
||||||
user: 'github-actions[bot]'
|
|
||||||
# The script for version increment.
|
|
||||||
# process.env.CURRENT_VERSION: The current version.
|
|
||||||
#
|
|
||||||
# Misskey calender versioning (yyyy.MM.patch) example
|
|
||||||
version_increment_script: |
|
|
||||||
const now = new Date();
|
|
||||||
const year = now.toLocaleDateString('en-US', { year: 'numeric', timeZone: 'Asia/Tokyo' });
|
|
||||||
const month = now.toLocaleDateString('en-US', { month: 'numeric', timeZone: 'Asia/Tokyo' });
|
|
||||||
const [major, minor, _patch] = process.env.CURRENT_VERSION.split('.');
|
|
||||||
const patch = Number(_patch.split('-')[0]);
|
|
||||||
if (Number.isNaN(patch)) {
|
|
||||||
console.error('Invalid patch version', year, month, process.env.CURRENT_VERSION, major, minor, _patch);
|
|
||||||
throw new Error('Invalid patch version');
|
|
||||||
}
|
|
||||||
if (year !== major || month !== minor) {
|
|
||||||
return `${year}.${month}.0`;
|
|
||||||
} else {
|
|
||||||
return `${major}.${minor}.${patch + 1}`;
|
|
||||||
}
|
|
||||||
##Semver example
|
|
||||||
#version_increment_script: |
|
|
||||||
# const [major, minor, patch] = process.env.CURRENT_VERSION.split('.');
|
|
||||||
# if ("${{ inputs.version_increment_type }}" === "major") {
|
|
||||||
# return `${Number(major) + 1}.0.0`;
|
|
||||||
# } else if ("${{ inputs.version_increment_type }}" === "minor") {
|
|
||||||
# return `${major}.${Number(minor) + 1}.0`;
|
|
||||||
# } else {
|
|
||||||
# return `${major}.${minor}.${Number(patch) + 1}`;
|
|
||||||
# }
|
|
||||||
package_jsons_to_rewrite: ${{ vars.PACKAGE_JSONS_TO_REWRITE }}
|
|
||||||
use_external_app_to_release: ${{ vars.USE_RELEASE_APP == 'true' }}
|
|
||||||
indent: ${{ vars.INDENT }}
|
|
||||||
stable_branch: ${{ vars.STABLE_BRANCH }}
|
|
||||||
draft_prerelease_channel: alpha
|
|
||||||
secrets:
|
|
||||||
RELEASE_APP_ID: ${{ secrets.RELEASE_APP_ID }}
|
|
||||||
RELEASE_APP_PRIVATE_KEY: ${{ secrets.RELEASE_APP_PRIVATE_KEY }}
|
|
59
.github/workflows/report-api-diff.yml
vendored
59
.github/workflows/report-api-diff.yml
vendored
|
@ -16,31 +16,27 @@ jobs:
|
||||||
# api-artifact
|
# api-artifact
|
||||||
steps:
|
steps:
|
||||||
- name: Download artifact
|
- name: Download artifact
|
||||||
uses: actions/github-script@v7.0.1
|
uses: actions/github-script@v6
|
||||||
with:
|
with:
|
||||||
script: |
|
script: |
|
||||||
const fs = require('fs');
|
|
||||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||||
owner: context.repo.owner,
|
owner: context.repo.owner,
|
||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
run_id: context.payload.workflow_run.id,
|
run_id: context.payload.workflow_run.id,
|
||||||
});
|
});
|
||||||
let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => {
|
let matchArtifact = allArtifacts.data.artifacts.filter((artifact) => {
|
||||||
return artifact.name.startsWith("api-artifact-") || artifact.name == "api-artifact"
|
return artifact.name == "api-artifact"
|
||||||
});
|
})[0];
|
||||||
await Promise.all(matchArtifacts.map(async (artifact) => {
|
|
||||||
let download = await github.rest.actions.downloadArtifact({
|
let download = await github.rest.actions.downloadArtifact({
|
||||||
owner: context.repo.owner,
|
owner: context.repo.owner,
|
||||||
repo: context.repo.repo,
|
repo: context.repo.repo,
|
||||||
artifact_id: artifact.id,
|
artifact_id: matchArtifact.id,
|
||||||
archive_format: 'zip',
|
archive_format: 'zip',
|
||||||
});
|
});
|
||||||
await fs.promises.writeFile(`${process.env.GITHUB_WORKSPACE}/${artifact.name}.zip`, Buffer.from(download.data));
|
let fs = require('fs');
|
||||||
}));
|
fs.writeFileSync(`${process.env.GITHUB_WORKSPACE}/api-artifact.zip`, Buffer.from(download.data));
|
||||||
- name: Extract all artifacts
|
- name: Extract artifact
|
||||||
run: |
|
run: unzip api-artifact.zip -d artifacts
|
||||||
find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec unzip {} -d artifacts ';'
|
|
||||||
ls -la
|
|
||||||
- name: Load PR Number
|
- name: Load PR Number
|
||||||
id: load-pr-num
|
id: load-pr-num
|
||||||
run: echo "pr-number=$(cat artifacts/pr_number)" >> "$GITHUB_OUTPUT"
|
run: echo "pr-number=$(cat artifacts/pr_number)" >> "$GITHUB_OUTPUT"
|
||||||
|
@ -60,7 +56,7 @@ jobs:
|
||||||
- name: Echo full diff
|
- name: Echo full diff
|
||||||
run: cat ./api-full.json.diff
|
run: cat ./api-full.json.diff
|
||||||
- name: Upload full diff to Artifact
|
- name: Upload full diff to Artifact
|
||||||
uses: actions/upload-artifact@v4
|
uses: actions/upload-artifact@v3
|
||||||
with:
|
with:
|
||||||
name: api-artifact
|
name: api-artifact
|
||||||
path: |
|
path: |
|
||||||
|
@ -70,35 +66,20 @@ jobs:
|
||||||
- id: out-diff
|
- id: out-diff
|
||||||
name: Build diff Comment
|
name: Build diff Comment
|
||||||
run: |
|
run: |
|
||||||
HEADER="このPRによるapi.jsonの差分"
|
cat <<- EOF > ./output.md
|
||||||
FOOTER="[Get diff files from Workflow Page](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})"
|
このPRによるapi.jsonの差分
|
||||||
DIFF_BYTES="$(stat ./api.json.diff -c '%s' | tr -d '\n')"
|
<details>
|
||||||
|
<summary>差分はこちら</summary>
|
||||||
|
|
||||||
echo "$HEADER" > ./output.md
|
\`\`\`diff
|
||||||
|
$(cat ./api.json.diff)
|
||||||
|
\`\`\`
|
||||||
|
</details>
|
||||||
|
|
||||||
if (( "$DIFF_BYTES" <= 1 )); then
|
[Get diff files from Workflow Page](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})
|
||||||
echo '差分はありません。' >> ./output.md
|
EOF
|
||||||
else
|
|
||||||
echo '<details>' >> ./output.md
|
|
||||||
echo '<summary>差分はこちら</summary>' >> ./output.md
|
|
||||||
echo >> ./output.md
|
|
||||||
echo '```diff' >> ./output.md
|
|
||||||
cat ./api.json.diff >> ./output.md
|
|
||||||
echo '```' >> ./output.md
|
|
||||||
echo '</details>' >> .output.md
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo "$FOOTER" >> ./output.md
|
|
||||||
- uses: thollander/actions-comment-pull-request@v2
|
- uses: thollander/actions-comment-pull-request@v2
|
||||||
with:
|
with:
|
||||||
pr_number: ${{ steps.load-pr-num.outputs.pr-number }}
|
pr_number: ${{ steps.load-pr-num.outputs.pr-number }}
|
||||||
comment_tag: show_diff
|
comment_tag: show_diff
|
||||||
filePath: ./output.md
|
filePath: ./output.md
|
||||||
- name: Tell error to PR
|
|
||||||
uses: thollander/actions-comment-pull-request@v2
|
|
||||||
if: failure() && steps.load-pr-num.outputs.pr-number
|
|
||||||
with:
|
|
||||||
pr_number: ${{ steps.load-pr-num.outputs.pr-number }}
|
|
||||||
comment_tag: show_diff_error
|
|
||||||
message: |
|
|
||||||
api.jsonの差分作成中にエラーが発生しました。詳細は[Workflowのログ](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }})を確認してください。
|
|
||||||
|
|
108
.github/workflows/storybook.yml
vendored
108
.github/workflows/storybook.yml
vendored
|
@ -1,108 +0,0 @@
|
||||||
name: Storybook
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
pull_request_target:
|
|
||||||
branches-ignore:
|
|
||||||
# Since pull requests targets master mostly is the "develop" branch.
|
|
||||||
# Storybook CI is checked on the "push" event of "develop" branch so it would cause a duplicate build.
|
|
||||||
# This is a waste of chromatic build quota, so we don't run storybook CI on pull requests targets master.
|
|
||||||
- master
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
# Chromatic is not likely to be available for fork repositories, so we disable for fork repositories.
|
|
||||||
if: github.repository == 'misskey-dev/misskey'
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
env:
|
|
||||||
NODE_OPTIONS: "--max_old_space_size=7168"
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
if: github.event_name != 'pull_request_target'
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
if: github.event_name == 'pull_request_target'
|
|
||||||
with:
|
|
||||||
fetch-depth: 0
|
|
||||||
submodules: true
|
|
||||||
ref: "refs/pull/${{ github.event.number }}/merge"
|
|
||||||
- name: Checkout actual HEAD
|
|
||||||
if: github.event_name == 'pull_request_target'
|
|
||||||
run: git checkout "$(git rev-list --parents -n1 HEAD | cut -d" " -f3)"
|
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
cache: 'pnpm'
|
|
||||||
- run: pnpm i --frozen-lockfile
|
|
||||||
- name: Check pnpm-lock.yaml
|
|
||||||
run: git diff --exit-code pnpm-lock.yaml
|
|
||||||
- name: Build dependent packages
|
|
||||||
run: pnpm -F misskey-js -F misskey-bubble-game -F misskey-reversi build
|
|
||||||
- name: Build storybook
|
|
||||||
run: pnpm --filter frontend build-storybook
|
|
||||||
- name: Publish to Chromatic
|
|
||||||
if: github.event_name != 'pull_request_target' && github.ref == 'refs/heads/master'
|
|
||||||
run: pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static
|
|
||||||
env:
|
|
||||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
|
||||||
- name: Publish to Chromatic
|
|
||||||
if: github.event_name != 'pull_request_target' && github.ref != 'refs/heads/master'
|
|
||||||
id: chromatic_push
|
|
||||||
run: |
|
|
||||||
DIFF="${{ github.event.before }} HEAD"
|
|
||||||
if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then
|
|
||||||
DIFF="HEAD"
|
|
||||||
fi
|
|
||||||
CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff-tree --no-commit-id --name-only -r $(echo "$DIFF") | xargs))"
|
|
||||||
if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then
|
|
||||||
echo "skip=true" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
if pnpm --filter frontend chromatic -d storybook-static $(echo "$CHROMATIC_PARAMETER"); then
|
|
||||||
echo "success=true" >> $GITHUB_OUTPUT
|
|
||||||
else
|
|
||||||
echo "success=false" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
env:
|
|
||||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
|
||||||
- name: Publish to Chromatic
|
|
||||||
if: github.event_name == 'pull_request_target'
|
|
||||||
id: chromatic_pull_request
|
|
||||||
run: |
|
|
||||||
CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff --name-only origin/${GITHUB_BASE_REF}...origin/${GITHUB_HEAD_REF} | xargs))"
|
|
||||||
if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then
|
|
||||||
echo "skip=true" >> $GITHUB_OUTPUT
|
|
||||||
fi
|
|
||||||
BRANCH="${{ github.event.pull_request.head.user.login }}:$GITHUB_HEAD_REF"
|
|
||||||
if [ "$BRANCH" = "misskey-dev:$GITHUB_HEAD_REF" ]; then
|
|
||||||
BRANCH="$GITHUB_HEAD_REF"
|
|
||||||
fi
|
|
||||||
pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static --branch-name "$BRANCH" $(echo "$CHROMATIC_PARAMETER")
|
|
||||||
env:
|
|
||||||
CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
|
|
||||||
- name: Notify that Chromatic detects changes
|
|
||||||
uses: actions/github-script@v7.0.1
|
|
||||||
if: github.event_name != 'pull_request_target' && steps.chromatic_push.outputs.success == 'false'
|
|
||||||
with:
|
|
||||||
github-token: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
script: |
|
|
||||||
github.rest.repos.createCommitComment({
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
commit_sha: context.sha,
|
|
||||||
body: 'Chromatic detects changes. Please [review the changes on Chromatic](https://www.chromatic.com/builds?appId=6428f7d7b962f0b79f97d6e4).'
|
|
||||||
})
|
|
||||||
- name: Upload Artifacts
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: storybook
|
|
||||||
path: packages/frontend/storybook-static
|
|
108
.github/workflows/test-backend.yml
vendored
108
.github/workflows/test-backend.yml
vendored
|
@ -5,32 +5,19 @@ on:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
- develop
|
- develop
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
# for permissions
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/test-backend.yml
|
|
||||||
- .github/misskey/test.yml
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
# for permissions
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/test-backend.yml
|
|
||||||
- .github/misskey/test.yml
|
|
||||||
jobs:
|
jobs:
|
||||||
unit:
|
jest:
|
||||||
name: Unit tests (backend)
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
node-version-file:
|
node-version: [20.5.1]
|
||||||
- .node-version
|
|
||||||
- .github/min.node-version
|
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:15
|
image: postgres:13
|
||||||
ports:
|
ports:
|
||||||
- 54312:5432
|
- 54312:5432
|
||||||
env:
|
env:
|
||||||
|
@ -42,31 +29,20 @@ jobs:
|
||||||
- 56312:6379
|
- 56312:6379
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4.1.0
|
uses: pnpm/action-setup@v2
|
||||||
- name: Install FFmpeg
|
|
||||||
run: |
|
|
||||||
for i in {1..3}; do
|
|
||||||
echo "Attempt $i: Installing FFmpeg..."
|
|
||||||
curl -s -L https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -o ffmpeg.tar.xz && \
|
|
||||||
tar -xf ffmpeg.tar.xz && \
|
|
||||||
mv ffmpeg-*-static/ffmpeg /usr/local/bin/ && \
|
|
||||||
mv ffmpeg-*-static/ffprobe /usr/local/bin/ && \
|
|
||||||
rm -rf ffmpeg.tar.xz ffmpeg-*-static/ && \
|
|
||||||
break || sleep 10
|
|
||||||
if [ $i -eq 3 ]; then
|
|
||||||
echo "Failed to install FFmpeg after 3 attempts"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
with:
|
||||||
node-version-file: ${{ matrix.node-version-file }}
|
version: 8
|
||||||
|
run_install: false
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4.0.0
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
- run: corepack enable
|
||||||
- run: pnpm i --frozen-lockfile
|
- run: pnpm i --frozen-lockfile
|
||||||
- name: Check pnpm-lock.yaml
|
- name: Check pnpm-lock.yaml
|
||||||
run: git diff --exit-code pnpm-lock.yaml
|
run: git diff --exit-code pnpm-lock.yaml
|
||||||
|
@ -75,57 +51,9 @@ jobs:
|
||||||
- name: Build
|
- name: Build
|
||||||
run: pnpm build
|
run: pnpm build
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter backend test-and-coverage
|
run: pnpm jest-and-coverage
|
||||||
- name: Upload to Codecov
|
- name: Upload Coverage
|
||||||
uses: codecov/codecov-action@v5
|
uses: codecov/codecov-action@v3
|
||||||
with:
|
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
files: ./packages/backend/coverage/coverage-final.json
|
|
||||||
|
|
||||||
e2e:
|
|
||||||
name: E2E tests (backend)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version-file:
|
|
||||||
- .node-version
|
|
||||||
- .github/min.node-version
|
|
||||||
|
|
||||||
services:
|
|
||||||
postgres:
|
|
||||||
image: postgres:15
|
|
||||||
ports:
|
|
||||||
- 54312:5432
|
|
||||||
env:
|
|
||||||
POSTGRES_DB: test-misskey
|
|
||||||
POSTGRES_HOST_AUTH_METHOD: trust
|
|
||||||
redis:
|
|
||||||
image: redis:7
|
|
||||||
ports:
|
|
||||||
- 56312:6379
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: ${{ matrix.node-version-file }}
|
|
||||||
cache: 'pnpm'
|
|
||||||
- run: pnpm i --frozen-lockfile
|
|
||||||
- name: Check pnpm-lock.yaml
|
|
||||||
run: git diff --exit-code pnpm-lock.yaml
|
|
||||||
- name: Copy Configure
|
|
||||||
run: cp .github/misskey/test.yml .config
|
|
||||||
- name: Build
|
|
||||||
run: pnpm build
|
|
||||||
- name: Test
|
|
||||||
run: pnpm --filter backend test-and-coverage:e2e
|
|
||||||
- name: Upload to Codecov
|
|
||||||
uses: codecov/codecov-action@v5
|
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
files: ./packages/backend/coverage/coverage-final.json
|
files: ./packages/backend/coverage/coverage-final.json
|
||||||
|
|
89
.github/workflows/test-federation.yml
vendored
89
.github/workflows/test-federation.yml
vendored
|
@ -1,89 +0,0 @@
|
||||||
name: Test (federation)
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/test-federation.yml
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/test-federation.yml
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
test:
|
|
||||||
name: Federation test
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
node-version-file:
|
|
||||||
- .node-version
|
|
||||||
- .github/min.node-version
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
- name: Install FFmpeg
|
|
||||||
run: |
|
|
||||||
for i in {1..3}; do
|
|
||||||
echo "Attempt $i: Installing FFmpeg..."
|
|
||||||
curl -s -L https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -o ffmpeg.tar.xz && \
|
|
||||||
tar -xf ffmpeg.tar.xz && \
|
|
||||||
mv ffmpeg-*-static/ffmpeg /usr/local/bin/ && \
|
|
||||||
mv ffmpeg-*-static/ffprobe /usr/local/bin/ && \
|
|
||||||
rm -rf ffmpeg.tar.xz ffmpeg-*-static/ && \
|
|
||||||
break || sleep 10
|
|
||||||
if [ $i -eq 3 ]; then
|
|
||||||
echo "Failed to install FFmpeg after 3 attempts"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: ${{ matrix.node-version-file }}
|
|
||||||
cache: 'pnpm'
|
|
||||||
- name: Build Misskey
|
|
||||||
run: |
|
|
||||||
pnpm i --frozen-lockfile
|
|
||||||
pnpm build
|
|
||||||
- name: Setup
|
|
||||||
run: |
|
|
||||||
echo "NODE_VERSION=$(cat ${{ matrix.node-version-file }})" >> $GITHUB_ENV
|
|
||||||
cd packages/backend/test-federation
|
|
||||||
bash ./setup.sh
|
|
||||||
sudo chmod 644 ./certificates/*.test.key
|
|
||||||
- name: Start servers
|
|
||||||
id: start_servers
|
|
||||||
continue-on-error: true
|
|
||||||
# https://github.com/docker/compose/issues/1294#issuecomment-374847206
|
|
||||||
run: |
|
|
||||||
cd packages/backend/test-federation
|
|
||||||
docker compose up -d --scale tester=0
|
|
||||||
- name: Print start_servers error
|
|
||||||
if: ${{ steps.start_servers.outcome == 'failure' }}
|
|
||||||
run: |
|
|
||||||
cd packages/backend/test-federation
|
|
||||||
docker compose logs | tail -n 300
|
|
||||||
exit 1
|
|
||||||
- name: Test
|
|
||||||
run: |
|
|
||||||
cd packages/backend/test-federation
|
|
||||||
docker compose run --no-deps tester
|
|
||||||
- name: Log
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
cd packages/backend/test-federation
|
|
||||||
docker compose logs
|
|
||||||
- name: Stop servers
|
|
||||||
if: always()
|
|
||||||
run: |
|
|
||||||
cd packages/backend/test-federation
|
|
||||||
docker compose down
|
|
65
.github/workflows/test-frontend.yml
vendored
65
.github/workflows/test-frontend.yml
vendored
|
@ -5,39 +5,31 @@ on:
|
||||||
branches:
|
branches:
|
||||||
- master
|
- master
|
||||||
- develop
|
- develop
|
||||||
paths:
|
|
||||||
- packages/frontend/**
|
|
||||||
# for permissions
|
|
||||||
- packages/misskey-js/**
|
|
||||||
# for e2e
|
|
||||||
- packages/backend/**
|
|
||||||
- .github/workflows/test-frontend.yml
|
|
||||||
- .github/misskey/test.yml
|
|
||||||
pull_request:
|
pull_request:
|
||||||
paths:
|
|
||||||
- packages/frontend/**
|
|
||||||
# for permissions
|
|
||||||
- packages/misskey-js/**
|
|
||||||
# for e2e
|
|
||||||
- packages/backend/**
|
|
||||||
- .github/workflows/test-frontend.yml
|
|
||||||
- .github/misskey/test.yml
|
|
||||||
jobs:
|
jobs:
|
||||||
vitest:
|
vitest:
|
||||||
name: Unit tests (frontend)
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [20.5.1]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4.1.0
|
uses: pnpm/action-setup@v2
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
version: 8
|
||||||
|
run_install: false
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4.0.0
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
- run: corepack enable
|
||||||
- run: pnpm i --frozen-lockfile
|
- run: pnpm i --frozen-lockfile
|
||||||
- name: Check pnpm-lock.yaml
|
- name: Check pnpm-lock.yaml
|
||||||
run: git diff --exit-code pnpm-lock.yaml
|
run: git diff --exit-code pnpm-lock.yaml
|
||||||
|
@ -48,23 +40,23 @@ jobs:
|
||||||
- name: Test
|
- name: Test
|
||||||
run: pnpm --filter frontend test-and-coverage
|
run: pnpm --filter frontend test-and-coverage
|
||||||
- name: Upload Coverage
|
- name: Upload Coverage
|
||||||
uses: codecov/codecov-action@v5
|
uses: codecov/codecov-action@v3
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
files: ./packages/frontend/coverage/coverage-final.json
|
files: ./packages/frontend/coverage/coverage-final.json
|
||||||
|
|
||||||
e2e:
|
e2e:
|
||||||
name: E2E tests (frontend)
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
node-version: [20.5.1]
|
||||||
browser: [chrome]
|
browser: [chrome]
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:15
|
image: postgres:13
|
||||||
ports:
|
ports:
|
||||||
- 54312:5432
|
- 54312:5432
|
||||||
env:
|
env:
|
||||||
|
@ -76,7 +68,7 @@ jobs:
|
||||||
- 56312:6379
|
- 56312:6379
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
# https://github.com/cypress-io/cypress-docker-images/issues/150
|
# https://github.com/cypress-io/cypress-docker-images/issues/150
|
||||||
|
@ -85,13 +77,17 @@ jobs:
|
||||||
# if: ${{ matrix.browser == 'firefox' }}
|
# if: ${{ matrix.browser == 'firefox' }}
|
||||||
#- uses: browser-actions/setup-firefox@latest
|
#- uses: browser-actions/setup-firefox@latest
|
||||||
# if: ${{ matrix.browser == 'firefox' }}
|
# if: ${{ matrix.browser == 'firefox' }}
|
||||||
- name: Setup pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4.1.0
|
uses: pnpm/action-setup@v2
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
version: 7
|
||||||
|
run_install: false
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4.0.0
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
- run: corepack enable
|
||||||
- run: pnpm i --frozen-lockfile
|
- run: pnpm i --frozen-lockfile
|
||||||
- name: Copy Configure
|
- name: Copy Configure
|
||||||
run: cp .github/misskey/test.yml .config
|
run: cp .github/misskey/test.yml .config
|
||||||
|
@ -106,19 +102,18 @@ jobs:
|
||||||
run: pnpm exec cypress install
|
run: pnpm exec cypress install
|
||||||
- name: Cypress run
|
- name: Cypress run
|
||||||
uses: cypress-io/github-action@v6
|
uses: cypress-io/github-action@v6
|
||||||
timeout-minutes: 15
|
|
||||||
with:
|
with:
|
||||||
install: false
|
install: false
|
||||||
start: pnpm start:test
|
start: pnpm start:test
|
||||||
wait-on: 'http://localhost:61812'
|
wait-on: 'http://localhost:61812'
|
||||||
headed: true
|
headed: true
|
||||||
browser: ${{ matrix.browser }}
|
browser: ${{ matrix.browser }}
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v2
|
||||||
if: failure()
|
if: failure()
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.browser }}-cypress-screenshots
|
name: ${{ matrix.browser }}-cypress-screenshots
|
||||||
path: cypress/screenshots
|
path: cypress/screenshots
|
||||||
- uses: actions/upload-artifact@v4
|
- uses: actions/upload-artifact@v2
|
||||||
if: always()
|
if: always()
|
||||||
with:
|
with:
|
||||||
name: ${{ matrix.browser }}-cypress-videos
|
name: ${{ matrix.browser }}-cypress-videos
|
||||||
|
|
26
.github/workflows/test-misskey-js.yml
vendored
26
.github/workflows/test-misskey-js.yml
vendored
|
@ -6,31 +6,29 @@ name: Test (misskey.js)
|
||||||
on:
|
on:
|
||||||
push:
|
push:
|
||||||
branches: [ develop ]
|
branches: [ develop ]
|
||||||
paths:
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/test-misskey-js.yml
|
|
||||||
pull_request:
|
pull_request:
|
||||||
branches: [ develop ]
|
branches: [ develop ]
|
||||||
paths:
|
|
||||||
- packages/misskey-js/**
|
|
||||||
- .github/workflows/test-misskey-js.yml
|
|
||||||
jobs:
|
jobs:
|
||||||
test:
|
test:
|
||||||
name: Unit tests (misskey.js)
|
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [20.5.1]
|
||||||
|
# See supported Node.js release schedule at https://nodejs.org/en/about/releases/
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4.2.2
|
uses: actions/checkout@v4.1.1
|
||||||
|
|
||||||
- name: Setup pnpm
|
- run: corepack enable
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.4.0
|
uses: actions/setup-node@v4.0.0
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
@ -48,7 +46,7 @@ jobs:
|
||||||
CI: true
|
CI: true
|
||||||
|
|
||||||
- name: Upload Coverage
|
- name: Upload Coverage
|
||||||
uses: codecov/codecov-action@v5
|
uses: codecov/codecov-action@v3
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.CODECOV_TOKEN }}
|
token: ${{ secrets.CODECOV_TOKEN }}
|
||||||
files: ./packages/misskey-js/coverage/coverage-final.json
|
files: ./packages/misskey-js/coverage/coverage-final.json
|
||||||
|
|
21
.github/workflows/test-production.yml
vendored
21
.github/workflows/test-production.yml
vendored
|
@ -12,20 +12,27 @@ env:
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
production:
|
production:
|
||||||
name: Production build
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [20.5.1]
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v4.2.2
|
- uses: actions/checkout@v4.1.1
|
||||||
with:
|
with:
|
||||||
submodules: true
|
submodules: true
|
||||||
- name: Setup pnpm
|
- name: Install pnpm
|
||||||
uses: pnpm/action-setup@v4.1.0
|
uses: pnpm/action-setup@v2
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
version: 8
|
||||||
|
run_install: false
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v4.0.0
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
- run: corepack enable
|
||||||
- run: pnpm i --frozen-lockfile
|
- run: pnpm i --frozen-lockfile
|
||||||
- name: Check pnpm-lock.yaml
|
- name: Check pnpm-lock.yaml
|
||||||
run: git diff --exit-code pnpm-lock.yaml
|
run: git diff --exit-code pnpm-lock.yaml
|
||||||
|
|
40
.github/workflows/validate-api-json.yml
vendored
40
.github/workflows/validate-api-json.yml
vendored
|
@ -1,40 +0,0 @@
|
||||||
name: api.json validation
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- master
|
|
||||||
- develop
|
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
- .github/workflows/validate-api-json.yml
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- packages/backend/**
|
|
||||||
- .github/workflows/validate-api-json.yml
|
|
||||||
jobs:
|
|
||||||
validate-api-json:
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4.2.2
|
|
||||||
with:
|
|
||||||
submodules: true
|
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4.1.0
|
|
||||||
- name: Use Node.js
|
|
||||||
uses: actions/setup-node@v4.4.0
|
|
||||||
with:
|
|
||||||
node-version-file: '.node-version'
|
|
||||||
cache: 'pnpm'
|
|
||||||
- name: Install Redocly CLI
|
|
||||||
run: npm i -g @redocly/cli
|
|
||||||
- run: pnpm i --frozen-lockfile
|
|
||||||
- name: Check pnpm-lock.yaml
|
|
||||||
run: git diff --exit-code pnpm-lock.yaml
|
|
||||||
- name: Copy Configure
|
|
||||||
run: cp .config/example.yml .config/default.yml
|
|
||||||
- name: Build and generate
|
|
||||||
run: pnpm build && pnpm --filter backend generate-api-json
|
|
||||||
- name: Validation
|
|
||||||
run: npx @redocly/cli lint --extends=minimal ./packages/backend/built/api.json
|
|
15
.gitignore
vendored
15
.gitignore
vendored
|
@ -35,17 +35,12 @@ coverage
|
||||||
!/.config/example.yml
|
!/.config/example.yml
|
||||||
!/.config/docker_example.yml
|
!/.config/docker_example.yml
|
||||||
!/.config/docker_example.env
|
!/.config/docker_example.env
|
||||||
!/.config/cypress-devcontainer.yml
|
|
||||||
docker-compose.yml
|
docker-compose.yml
|
||||||
./compose.yml
|
!/.devcontainer/docker-compose.yml
|
||||||
.devcontainer/compose.yml
|
|
||||||
!/.devcontainer/compose.yml
|
|
||||||
|
|
||||||
# misskey
|
# misskey
|
||||||
/build
|
/build
|
||||||
built
|
built
|
||||||
built-test
|
|
||||||
js-built
|
|
||||||
/data
|
/data
|
||||||
/.cache-loader
|
/.cache-loader
|
||||||
/db
|
/db
|
||||||
|
@ -62,14 +57,6 @@ api-docs.json
|
||||||
ormconfig.json
|
ormconfig.json
|
||||||
temp
|
temp
|
||||||
/packages/frontend/src/**/*.stories.ts
|
/packages/frontend/src/**/*.stories.ts
|
||||||
tsdoc-metadata.json
|
|
||||||
misskey-assets
|
|
||||||
|
|
||||||
# Vite temporary files
|
|
||||||
vite.config.js.timestamp-*
|
|
||||||
vite.config.ts.timestamp-*
|
|
||||||
vite.config.local-dev.js.timestamp-*
|
|
||||||
vite.config.local-dev.ts.timestamp-*
|
|
||||||
|
|
||||||
# blender backups
|
# blender backups
|
||||||
*.blend1
|
*.blend1
|
||||||
|
|
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +1,6 @@
|
||||||
|
[submodule "misskey-assets"]
|
||||||
|
path = misskey-assets
|
||||||
|
url = https://github.com/misskey-dev/assets.git
|
||||||
[submodule "fluent-emojis"]
|
[submodule "fluent-emojis"]
|
||||||
path = fluent-emojis
|
path = fluent-emojis
|
||||||
url = https://github.com/misskey-dev/emojis.git
|
url = https://github.com/misskey-dev/emojis.git
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
22.15.0
|
20.5.1
|
||||||
|
|
3
.npmrc
3
.npmrc
|
@ -1,3 +0,0 @@
|
||||||
engine-strict = true
|
|
||||||
save-exact = true
|
|
||||||
shell-emulator = true
|
|
2
.vscode/extensions.json
vendored
2
.vscode/extensions.json
vendored
|
@ -3,7 +3,9 @@
|
||||||
"editorconfig.editorconfig",
|
"editorconfig.editorconfig",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"Vue.volar",
|
"Vue.volar",
|
||||||
|
"Vue.vscode-typescript-vue-plugin",
|
||||||
"Orta.vscode-jest",
|
"Orta.vscode-jest",
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
"mrmlnc.vscode-json5"
|
"mrmlnc.vscode-json5"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
6
.vscode/settings.json
vendored
6
.vscode/settings.json
vendored
|
@ -7,9 +7,5 @@
|
||||||
"*.test.ts": "typescript"
|
"*.test.ts": "typescript"
|
||||||
},
|
},
|
||||||
"jest.jestCommandLine": "pnpm run jest",
|
"jest.jestCommandLine": "pnpm run jest",
|
||||||
"jest.runMode": "on-demand",
|
"jest.autoRun": "off"
|
||||||
"editor.codeActionsOnSave": {
|
|
||||||
"source.fixAll": "explicit"
|
|
||||||
},
|
|
||||||
"editor.formatOnSave": false
|
|
||||||
}
|
}
|
1201
CHANGELOG.md
1201
CHANGELOG.md
File diff suppressed because it is too large
Load diff
|
@ -2,131 +2,45 @@
|
||||||
|
|
||||||
## Our Pledge
|
## Our Pledge
|
||||||
|
|
||||||
We as members, contributors, and leaders pledge to make participation in our
|
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.
|
||||||
community a harassment-free experience for everyone, regardless of age, body
|
|
||||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
|
||||||
identity and expression, level of experience, education, socio-economic status,
|
|
||||||
nationality, personal appearance, race, caste, color, religion, or sexual
|
|
||||||
identity and orientation.
|
|
||||||
|
|
||||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
|
||||||
diverse, inclusive, and healthy community.
|
|
||||||
|
|
||||||
## Our Standards
|
## Our Standards
|
||||||
|
|
||||||
Examples of behavior that contributes to a positive environment for our
|
Examples of behavior that contributes to creating a positive environment include:
|
||||||
community include:
|
|
||||||
|
|
||||||
* Demonstrating empathy and kindness toward other people
|
* Using welcoming and inclusive language
|
||||||
* Being respectful of differing opinions, viewpoints, and experiences
|
* Being respectful of differing viewpoints and experiences
|
||||||
* Giving and gracefully accepting constructive feedback
|
* Gracefully accepting constructive criticism
|
||||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
* Focusing on what is best for the community
|
||||||
and learning from the experience
|
* Showing empathy towards other community members
|
||||||
* Focusing on what is best not just for us as individuals, but for the overall
|
|
||||||
community
|
|
||||||
|
|
||||||
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
|
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||||
any kind
|
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
|
||||||
* Public or private harassment
|
* Public or private harassment
|
||||||
* Publishing others' private information, such as a physical or email address,
|
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||||
without their explicit permission
|
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||||
* 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
|
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.
|
||||||
acceptable behavior and will take appropriate and fair corrective action in
|
|
||||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
|
||||||
or harmful.
|
|
||||||
|
|
||||||
Community leaders have the right and responsibility to remove, edit, or reject
|
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.
|
||||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
|
||||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
|
||||||
decisions when appropriate.
|
|
||||||
|
|
||||||
## Scope
|
## Scope
|
||||||
|
|
||||||
This Code of Conduct applies within all community spaces, and also applies when
|
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.
|
||||||
an individual is officially representing the community in public spaces.
|
|
||||||
Examples of representing our community include using an official e-mail address,
|
|
||||||
posting via an official social media account, or acting as an appointed
|
|
||||||
representative at an online or offline event.
|
|
||||||
|
|
||||||
## Enforcement
|
## Enforcement
|
||||||
|
|
||||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
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.
|
||||||
reported to the community leaders responsible for enforcement at
|
|
||||||
<syuilotan@yahoo.co.jp>.
|
|
||||||
All complaints will be reviewed and investigated promptly and fairly.
|
|
||||||
|
|
||||||
All community leaders are obligated to respect the privacy and security of the
|
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.
|
||||||
reporter of any incident.
|
|
||||||
|
|
||||||
## Enforcement Guidelines
|
|
||||||
|
|
||||||
Community leaders will follow these Community Impact Guidelines in determining
|
|
||||||
the consequences for any action they deem in violation of this Code of Conduct:
|
|
||||||
|
|
||||||
### 1. Correction
|
|
||||||
|
|
||||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
|
||||||
unprofessional or unwelcome in the community.
|
|
||||||
|
|
||||||
**Consequence**: A private, written warning from community leaders, providing
|
|
||||||
clarity around the nature of the violation and an explanation of why the
|
|
||||||
behavior was inappropriate. A public apology may be requested.
|
|
||||||
|
|
||||||
### 2. Warning
|
|
||||||
|
|
||||||
**Community Impact**: A violation through a single incident or series of
|
|
||||||
actions.
|
|
||||||
|
|
||||||
**Consequence**: A warning with consequences for continued behavior. No
|
|
||||||
interaction with the people involved, including unsolicited interaction with
|
|
||||||
those enforcing the Code of Conduct, for a specified period of time. This
|
|
||||||
includes avoiding interactions in community spaces as well as external channels
|
|
||||||
like social media. Violating these terms may lead to a temporary or permanent
|
|
||||||
ban.
|
|
||||||
|
|
||||||
### 3. Temporary Ban
|
|
||||||
|
|
||||||
**Community Impact**: A serious violation of community standards, including
|
|
||||||
sustained inappropriate behavior.
|
|
||||||
|
|
||||||
**Consequence**: A temporary ban from any sort of interaction or public
|
|
||||||
communication with the community for a specified period of time. No public or
|
|
||||||
private interaction with the people involved, including unsolicited interaction
|
|
||||||
with those enforcing the Code of Conduct, is allowed during this period.
|
|
||||||
Violating these terms may lead to a permanent ban.
|
|
||||||
|
|
||||||
### 4. Permanent Ban
|
|
||||||
|
|
||||||
**Community Impact**: Demonstrating a pattern of violation of community
|
|
||||||
standards, including sustained inappropriate behavior, harassment of an
|
|
||||||
individual, or aggression toward or disparagement of classes of individuals.
|
|
||||||
|
|
||||||
**Consequence**: A permanent ban from any sort of public interaction within the
|
|
||||||
community.
|
|
||||||
|
|
||||||
## Attribution
|
## Attribution
|
||||||
|
|
||||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version]
|
||||||
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
|
[homepage]: http://contributor-covenant.org
|
||||||
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
[version]: http://contributor-covenant.org/version/1/4/
|
||||||
|
|
||||||
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
|
|
||||||
|
|
313
CONTRIBUTING.md
313
CONTRIBUTING.md
|
@ -1,7 +1,7 @@
|
||||||
# Contribution guide
|
# Contribution guide
|
||||||
We're glad you're interested in contributing Misskey! 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.
|
||||||
|
|
||||||
> [!NOTE]
|
> **Note**
|
||||||
> This project uses Japanese as its major language, **but you do not need to translate and write the Issues/PRs in Japanese.**
|
> 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.\
|
> 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.
|
> 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.
|
||||||
|
@ -15,33 +15,18 @@ Before creating an issue, please check the following:
|
||||||
- To avoid duplication, please search for similar issues before creating a new issue.
|
- To avoid duplication, please search for similar issues before creating a new issue.
|
||||||
- Do not use Issues to ask questions or troubleshooting.
|
- Do not use Issues to ask questions or troubleshooting.
|
||||||
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
||||||
- Please ask questions or troubleshooting in [GitHub Discussions](https://github.com/misskey-dev/misskey/discussions) or [Discord](https://discord.gg/Wp8gVStHW3).
|
- Please ask questions or troubleshooting in ~~the [Misskey Forum](https://forum.misskey.io/)~~ [GitHub Discussions](https://github.com/misskey-dev/misskey/discussions) or [Discord](https://discord.gg/Wp8gVStHW3).
|
||||||
|
|
||||||
> [!WARNING]
|
> **Warning**
|
||||||
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
||||||
|
|
||||||
### Recommended discussing before implementation
|
## Before implementation
|
||||||
We welcome your proposal.
|
|
||||||
|
|
||||||
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.
|
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.
|
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.
|
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 Committer to assign you).
|
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.
|
||||||
By expressing your intention to work on the Issue, you can prevent conflicts in the work.
|
|
||||||
|
|
||||||
To the Committers: you should not assign someone on it before the Final Decision.
|
|
||||||
|
|
||||||
### How issues are triaged
|
|
||||||
|
|
||||||
The Committers may:
|
|
||||||
* close an issue that is not reproducible on latest stable release,
|
|
||||||
* merge an issue into another issue,
|
|
||||||
* split an issue into multiple issues,
|
|
||||||
* or re-open that has been closed for some reason which is not applicable anymore.
|
|
||||||
|
|
||||||
@syuilo reserves the Final Decision rights including whether the project will implement feature and how to implement, these rights are not always exercised.
|
|
||||||
|
|
||||||
## Well-known branches
|
## Well-known branches
|
||||||
- **`master`** branch is tracking the latest release and used for production purposes.
|
- **`master`** branch is tracking the latest release and used for production purposes.
|
||||||
|
@ -64,29 +49,9 @@ Thank you for your PR! Before creating a PR, please check the following:
|
||||||
|
|
||||||
Thanks for your cooperation 🤗
|
Thanks for your cooperation 🤗
|
||||||
|
|
||||||
### Additional things for ActivityPub payload changes
|
|
||||||
*This section is specific to misskey-dev implementation. Other fork or implementation may take different way. A significant difference is that non-"misskey-dev" extension is not described in the misskey-hub's document.*
|
|
||||||
|
|
||||||
If PR includes changes to ActivityPub payload, please reflect it in [misskey-hub's document](https://github.com/misskey-dev/misskey-hub-next/blob/master/content/ns.md) by sending PR.
|
|
||||||
|
|
||||||
The name of purporsed extension property (referred as "extended property" in later) to ActivityPub shall be prefixed by `_misskey_`. (i.e. `_misskey_quote`)
|
|
||||||
|
|
||||||
The extended property in `packages/backend/src/core/activitypub/type.ts` **must** be declared as optional because ActivityPub payloads that comes from older Misskey or other implementation may not contain it.
|
|
||||||
|
|
||||||
The extended property must be included in the context definition. Context is defined in `packages/backend/src/core/activitypub/misc/contexts.ts`.
|
|
||||||
The key shall be same as the name of extended property, and the value shall be same as "short IRI".
|
|
||||||
|
|
||||||
"Short IRI" is defined in misskey-hub's document, but usually takes form of `misskey:<name of extended property>`. (i.e. `misskey:_misskey_quote`)
|
|
||||||
|
|
||||||
One should not add property that has defined before by other implementation, or add custom variant value to "well-known" property.
|
|
||||||
|
|
||||||
## Reviewers guide
|
## Reviewers guide
|
||||||
Be willing to comment on the good points and not just the things you want fixed 💯
|
Be willing to comment on the good points and not just the things you want fixed 💯
|
||||||
|
|
||||||
読んでおくといいやつ
|
|
||||||
- https://blog.lacolaco.net/posts/1e2cf439b3c2/
|
|
||||||
- https://konifar-zatsu.hatenadiary.jp/entry/2024/11/05/192421
|
|
||||||
|
|
||||||
### Review perspective
|
### Review perspective
|
||||||
- Scope
|
- Scope
|
||||||
- Are the goals of the PR clear?
|
- Are the goals of the PR clear?
|
||||||
|
@ -101,22 +66,6 @@ Be willing to comment on the good points and not just the things you want fixed
|
||||||
- Are there any omissions or gaps?
|
- Are there any omissions or gaps?
|
||||||
- Does it check for anomalies?
|
- Does it check for anomalies?
|
||||||
|
|
||||||
## Security Advisory
|
|
||||||
### For reporter
|
|
||||||
Thank you for your reporting!
|
|
||||||
|
|
||||||
If you can also create a patch to fix the vulnerability, please create a PR on the private fork.
|
|
||||||
|
|
||||||
> [!note]
|
|
||||||
> There is a GitHub bug that prevents merging if a PR not following the develop branch of upstream, so please keep follow the develop branch.
|
|
||||||
|
|
||||||
### For misskey-dev member
|
|
||||||
修正PRがdevelopに追従されていないとマージできないので、マージできなかったら
|
|
||||||
|
|
||||||
> Could you merge or rebase onto upstream develop branch?
|
|
||||||
|
|
||||||
などと伝える。
|
|
||||||
|
|
||||||
## Deploy
|
## Deploy
|
||||||
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
The `/deploy` command by issue comment can be used to deploy the contents of a PR to the preview environment.
|
||||||
```
|
```
|
||||||
|
@ -128,7 +77,7 @@ An actual domain will be assigned so you can test the federation.
|
||||||
|
|
||||||
## Release
|
## Release
|
||||||
### Release Instructions
|
### Release Instructions
|
||||||
1. Commit version changes in the `develop` branch ([package.json](package.json))
|
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.
|
2. Create a release PR.
|
||||||
- Into `master` from `develop` branch.
|
- Into `master` from `develop` branch.
|
||||||
- The title must be in the format `Release: x.y.z`.
|
- The title must be in the format `Release: x.y.z`.
|
||||||
|
@ -139,7 +88,7 @@ An actual domain will be assigned so you can test the federation.
|
||||||
- The target branch must be `master`
|
- The target branch must be `master`
|
||||||
- The tag name must be the version
|
- The tag name must be the version
|
||||||
|
|
||||||
> [!NOTE]
|
> **Note**
|
||||||
> Why this instruction is necessary:
|
> Why this instruction is necessary:
|
||||||
> - To perform final QA checks
|
> - To perform final QA checks
|
||||||
> - To distribute responsibility
|
> - To distribute responsibility
|
||||||
|
@ -152,28 +101,24 @@ 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.
|
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.
|
The owner [@syuilo](https://github.com/syuilo) merges the PR into the develop branch before the next release.
|
||||||
|
|
||||||
If your language is not listed in Crowdin, please open an issue. We will add it to Crowdin.
|
If your language is not listed in Crowdin, please open an issue.
|
||||||
For newly added languages, once the translation progress per language exceeds 70%, it will be officially introduced into Misskey and made available to users.
|
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
## Development
|
## Development
|
||||||
### Setup
|
During development, it is useful to use the
|
||||||
Before developing, you have to set up environment. Misskey requires Redis, PostgreSQL, and FFmpeg.
|
|
||||||
|
|
||||||
You would want to install Meilisearch to experiment related features. Technically, meilisearch is not strict requirement, but some features and tests require it.
|
```
|
||||||
|
pnpm dev
|
||||||
|
```
|
||||||
|
|
||||||
There are a few ways to proceed.
|
command.
|
||||||
|
|
||||||
#### Use system-wide software
|
- Server-side source files and automatically builds them if they are modified. Automatically start the server process(es).
|
||||||
You could install them in system-wide (such as from package manager).
|
- Vite HMR (just the `vite` command) is available. The behavior may be different from production.
|
||||||
|
- Service Worker is watched by esbuild.
|
||||||
#### Use `docker compose`
|
|
||||||
You could obtain middleware container by typing `docker compose -f $PROJECT_ROOT/compose.local-db.yml up -d`.
|
|
||||||
|
|
||||||
#### Use Devcontainer
|
|
||||||
Devcontainer also has necessary setting. This method can be done by connecting from VSCode.
|
|
||||||
|
|
||||||
|
### Dev Container
|
||||||
Instead of running `pnpm` locally, you can use Dev Container to set up your development environment.
|
Instead of running `pnpm` locally, you can use Dev Container to set up your development environment.
|
||||||
To use Dev Container, open the project directory on VSCode with Dev Containers installed.
|
To use Dev Container, open the project directory on VSCode with Dev Containers installed.
|
||||||
**Note:** If you are using Windows, please clone the repository with WSL. Using Git for Windows will result in broken files due to the difference in how newlines are handled.
|
**Note:** If you are using Windows, please clone the repository with WSL. Using Git for Windows will result in broken files due to the difference in how newlines are handled.
|
||||||
|
@ -187,61 +132,38 @@ pnpm build
|
||||||
pnpm migrate
|
pnpm migrate
|
||||||
```
|
```
|
||||||
|
|
||||||
After finishing the migration, you can proceed.
|
After finishing the migration, run the `pnpm dev` command to start the development server.
|
||||||
|
|
||||||
### Start developing
|
``` bash
|
||||||
During development, it is useful to use the
|
|
||||||
```
|
|
||||||
pnpm dev
|
pnpm dev
|
||||||
```
|
```
|
||||||
command.
|
|
||||||
|
|
||||||
- Server-side source files and automatically builds them if they are modified. Automatically start the server process(es).
|
|
||||||
- Service Worker is watched by esbuild.
|
|
||||||
- Vite HMR (just the `vite` command) is available. The behavior may be different from production.
|
|
||||||
- Vite runs behind the backend (the backend will proxy Vite at /vite and /embed_vite except for websocket used for HMR).
|
|
||||||
- You can see Misskey by accessing `http://localhost:3000` (Replace `3000` with the port configured with `port` in .config/default.yml).
|
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
You can run non-backend tests by executing following commands:
|
- Test codes are located in [`/packages/backend/test`](/packages/backend/test).
|
||||||
```sh
|
|
||||||
pnpm --filter frontend test
|
### Run test
|
||||||
pnpm --filter misskey-js test
|
Create a config file.
|
||||||
```
|
```
|
||||||
|
|
||||||
Backend tests require manual preparation of servers. See the next section for more on this.
|
|
||||||
|
|
||||||
### Backend
|
|
||||||
There are three types of test codes for the backend:
|
|
||||||
- Unit tests: [`/packages/backend/test/unit`](/packages/backend/test/unit)
|
|
||||||
- Single-server E2E tests: [`/packages/backend/test/e2e`](/packages/backend/test/e2e)
|
|
||||||
- Multiple-server E2E tests: [`/packages/backend/test-federation`](/packages/backend/test-federation)
|
|
||||||
|
|
||||||
#### Running Unit Tests or Single-server E2E Tests
|
|
||||||
1. Create a config file:
|
|
||||||
```sh
|
|
||||||
cp .github/misskey/test.yml .config/
|
cp .github/misskey/test.yml .config/
|
||||||
```
|
```
|
||||||
|
Prepare DB/Redis for testing.
|
||||||
2. Start DB and Redis servers for testing:
|
|
||||||
```sh
|
|
||||||
docker compose -f packages/backend/test/compose.yml up
|
|
||||||
```
|
```
|
||||||
Instead, you can prepare an empty (data can be erased) DB and edit `.config/test.yml` appropriately.
|
docker compose -f packages/backend/test/docker-compose.yml up
|
||||||
|
|
||||||
3. Run all tests:
|
|
||||||
```sh
|
|
||||||
pnpm --filter backend test # unit tests
|
|
||||||
pnpm --filter backend test:e2e # single-server E2E tests
|
|
||||||
```
|
```
|
||||||
If you want to run a specific test, run as a following command:
|
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
|
||||||
```sh
|
|
||||||
pnpm --filter backend test -- packages/backend/test/unit/activitypub.ts
|
Run all test.
|
||||||
pnpm --filter backend test:e2e -- packages/backend/test/e2e/nodeinfo.ts
|
```
|
||||||
|
pnpm test
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Running Multiple-server E2E Tests
|
#### Run specify test
|
||||||
See [`/packages/backend/test-federation/README.md`](/packages/backend/test-federation/README.md).
|
```
|
||||||
|
pnpm jest -- foo.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
### e2e tests
|
||||||
|
TODO
|
||||||
|
|
||||||
## Environment Variable
|
## Environment Variable
|
||||||
|
|
||||||
|
@ -258,12 +180,6 @@ Misskey uses Vue(v3) as its front-end framework.
|
||||||
- **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.**
|
- **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.
|
- 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.
|
||||||
|
|
||||||
## Tabler Icons
|
|
||||||
アイコンは、Production Build時に使用されていないものが削除されるようになっています。
|
|
||||||
|
|
||||||
**アイコンを動的に設定する際には、 `ti-${someVal}` のような、アイコン名のみを動的に変化させる実装を行わないでください。**
|
|
||||||
必ず `ti-xxx` のような完全なクラス名を含めるようにしてください。
|
|
||||||
|
|
||||||
## nirax
|
## nirax
|
||||||
niraxは、Misskeyで使用しているオリジナルのフロントエンドルーティングシステムです。
|
niraxは、Misskeyで使用しているオリジナルのフロントエンドルーティングシステムです。
|
||||||
**vue-routerから影響を多大に受けているので、まずはvue-routerについて学ぶことをお勧めします。**
|
**vue-routerから影響を多大に受けているので、まずはvue-routerについて学ぶことをお勧めします。**
|
||||||
|
@ -271,7 +187,7 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
|
||||||
### ルート定義
|
### ルート定義
|
||||||
ルート定義は、以下の形式のオブジェクトの配列です。
|
ルート定義は、以下の形式のオブジェクトの配列です。
|
||||||
|
|
||||||
```ts
|
``` ts
|
||||||
{
|
{
|
||||||
name?: string;
|
name?: string;
|
||||||
path: string;
|
path: string;
|
||||||
|
@ -279,11 +195,12 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
|
||||||
query?: Record<string, string>;
|
query?: Record<string, string>;
|
||||||
loginRequired?: boolean;
|
loginRequired?: boolean;
|
||||||
hash?: string;
|
hash?: string;
|
||||||
|
globalCacheKey?: string;
|
||||||
children?: RouteDef[];
|
children?: RouteDef[];
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
> [!WARNING]
|
> **Warning**
|
||||||
> 現状、ルートは定義された順に評価されます。
|
> 現状、ルートは定義された順に評価されます。
|
||||||
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
|
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
|
||||||
|
|
||||||
|
@ -345,7 +262,7 @@ export const Default = {
|
||||||
parameters: {
|
parameters: {
|
||||||
layout: 'centered',
|
layout: 'centered',
|
||||||
},
|
},
|
||||||
} satisfies StoryObj<typeof MyComponent>;
|
} satisfies StoryObj<typeof MkAvatar>;
|
||||||
```
|
```
|
||||||
|
|
||||||
If you want to opt-out from the automatic generation, create a `MyComponent.stories.impl.ts` file and add the following line to the file.
|
If you want to opt-out from the automatic generation, create a `MyComponent.stories.impl.ts` file and add the following line to the file.
|
||||||
|
@ -365,115 +282,24 @@ export const argTypes = {
|
||||||
min: 1,
|
min: 1,
|
||||||
max: 4,
|
max: 4,
|
||||||
},
|
},
|
||||||
},
|
|
||||||
};
|
};
|
||||||
```
|
```
|
||||||
|
|
||||||
Also, you can use msw to mock API requests in the storybook. Creating a `MyComponent.stories.msw.ts` file to define the mock handlers.
|
Also, you can use msw to mock API requests in the storybook. Creating a `MyComponent.stories.msw.ts` file to define the mock handlers.
|
||||||
|
|
||||||
```ts
|
```ts
|
||||||
import { HttpResponse, http } from 'msw';
|
import { rest } from 'msw';
|
||||||
export const handlers = [
|
export const handlers = [
|
||||||
http.post('/api/notes/timeline', ({ request }) => {
|
rest.post('/api/notes/timeline', (req, res, ctx) => {
|
||||||
return HttpResponse.json([]);
|
return res(
|
||||||
|
ctx.json([]),
|
||||||
|
);
|
||||||
}),
|
}),
|
||||||
];
|
];
|
||||||
```
|
```
|
||||||
|
|
||||||
Don't forget to re-run the `.storybook/generate.js` script after adding, editing, or removing the above files.
|
Don't forget to re-run the `.storybook/generate.js` script after adding, editing, or removing the above files.
|
||||||
|
|
||||||
## Nest
|
|
||||||
|
|
||||||
### Nest Service Circular dependency / Nestでサービスの循環参照でエラーが起きた場合
|
|
||||||
|
|
||||||
#### forwardRef
|
|
||||||
まずは簡単に`forwardRef`を試してみる
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
export class FooService {
|
|
||||||
constructor(
|
|
||||||
@Inject(forwardRef(() => BarService))
|
|
||||||
private barService: BarService
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### OnModuleInit
|
|
||||||
できなければ`OnModuleInit`を使う
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Injectable, OnModuleInit } from '@nestjs/common';
|
|
||||||
import { ModuleRef } from '@nestjs/core';
|
|
||||||
import { BarService } from '@/core/BarService';
|
|
||||||
|
|
||||||
@Injectable()
|
|
||||||
export class FooService implements OnModuleInit {
|
|
||||||
private barService: BarService // constructorから移動してくる
|
|
||||||
|
|
||||||
constructor(
|
|
||||||
private moduleRef: ModuleRef,
|
|
||||||
) {
|
|
||||||
}
|
|
||||||
|
|
||||||
async onModuleInit() {
|
|
||||||
this.barService = this.moduleRef.get(BarService.name);
|
|
||||||
}
|
|
||||||
|
|
||||||
public async niceMethod() {
|
|
||||||
return await this.barService.incredibleMethod({ hoge: 'fuga' });
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
##### Service Unit Test
|
|
||||||
テストで`onModuleInit`を呼び出す必要がある
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
// import ...
|
|
||||||
|
|
||||||
describe('test', () => {
|
|
||||||
let app: TestingModule;
|
|
||||||
let fooService: FooService; // for test case
|
|
||||||
let barService: BarService; // for test case
|
|
||||||
|
|
||||||
beforeEach(async () => {
|
|
||||||
app = await Test.createTestingModule({
|
|
||||||
imports: ...,
|
|
||||||
providers: [
|
|
||||||
FooService,
|
|
||||||
{ // mockする (mockは必須ではないかもしれない)
|
|
||||||
provide: BarService,
|
|
||||||
useFactory: () => ({
|
|
||||||
incredibleMethod: jest.fn(),
|
|
||||||
}),
|
|
||||||
},
|
|
||||||
{ // Provideにする
|
|
||||||
provide: BarService.name,
|
|
||||||
useExisting: BarService,
|
|
||||||
},
|
|
||||||
],
|
|
||||||
})
|
|
||||||
.useMocker(...
|
|
||||||
.compile();
|
|
||||||
|
|
||||||
fooService = app.get<FooService>(FooService);
|
|
||||||
barService = app.get<BarService>(BarService) as jest.Mocked<BarService>;
|
|
||||||
|
|
||||||
// onModuleInitを実行する
|
|
||||||
await fooService.onModuleInit();
|
|
||||||
});
|
|
||||||
|
|
||||||
test('nice', () => {
|
|
||||||
await fooService.niceMethod();
|
|
||||||
|
|
||||||
expect(barService.incredibleMethod).toHaveBeenCalled();
|
|
||||||
expect(barService.incredibleMethod.mock.lastCall![0])
|
|
||||||
.toEqual({ hoge: 'fuga' });
|
|
||||||
});
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
## Notes
|
## Notes
|
||||||
|
|
||||||
### Misskeyのドメイン固有の概念は`Mi`をprefixする
|
### Misskeyのドメイン固有の概念は`Mi`をprefixする
|
||||||
|
@ -481,11 +307,6 @@ describe('test', () => {
|
||||||
コード上でMisskeyのドメイン固有の概念には`Mi`をprefixすることで、他のドメインの同様の概念と区別できるほか、名前の衝突を防ぐ。
|
コード上でMisskeyのドメイン固有の概念には`Mi`をprefixすることで、他のドメインの同様の概念と区別できるほか、名前の衝突を防ぐ。
|
||||||
ただし、文脈上Misskeyのものを指すことが明らかであり、名前の衝突の恐れがない場合は、一時的なローカル変数に限って`Mi`を省略してもよい。
|
ただし、文脈上Misskeyのものを指すことが明らかであり、名前の衝突の恐れがない場合は、一時的なローカル変数に限って`Mi`を省略してもよい。
|
||||||
|
|
||||||
### Misskey.jsの型生成
|
|
||||||
```bash
|
|
||||||
pnpm build-misskey-js-with-types
|
|
||||||
```
|
|
||||||
|
|
||||||
### How to resolve conflictions occurred at pnpm-lock.yaml?
|
### How to resolve conflictions occurred at pnpm-lock.yaml?
|
||||||
|
|
||||||
Just execute `pnpm` to fix it.
|
Just execute `pnpm` to fix it.
|
||||||
|
@ -581,6 +402,27 @@ pnpm dlx typeorm migration:generate -d ormconfig.js -o <migration name>
|
||||||
- 生成後、ファイルをmigration下に移してください
|
- 生成後、ファイルをmigration下に移してください
|
||||||
- 作成されたスクリプトは不必要な変更を含むため除去してください
|
- 作成されたスクリプトは不必要な変更を含むため除去してください
|
||||||
|
|
||||||
|
### JSON SchemaのobjectでanyOfを使うとき
|
||||||
|
JSON Schemaで、objectに対してanyOfを使う場合、anyOfの中でpropertiesを定義しないこと。
|
||||||
|
バリデーションが効かないため。(SchemaTypeもそのように作られており、objectのanyOf内のpropertiesは捨てられます)
|
||||||
|
https://github.com/misskey-dev/misskey/pull/10082
|
||||||
|
|
||||||
|
テキストhogeおよびfugaについて、片方を必須としつつ両方の指定もありうる場合:
|
||||||
|
|
||||||
|
```
|
||||||
|
export const paramDef = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
hoge: { type: 'string', minLength: 1 },
|
||||||
|
fuga: { type: 'string', minLength: 1 },
|
||||||
|
},
|
||||||
|
anyOf: [
|
||||||
|
{ required: ['hoge'] },
|
||||||
|
{ required: ['fuga'] },
|
||||||
|
],
|
||||||
|
} as const;
|
||||||
|
```
|
||||||
|
|
||||||
### コネクションには`markRaw`せよ
|
### コネクションには`markRaw`せよ
|
||||||
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
|
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
|
||||||
|
|
||||||
|
@ -597,24 +439,3 @@ marginはそのコンポーネントを使う側が設定する
|
||||||
|
|
||||||
### indexというファイル名を使うな
|
### indexというファイル名を使うな
|
||||||
ESMではディレクトリインポートは廃止されているのと、ディレクトリインポートせずともファイル名が index だと何故か一部のライブラリ?でディレクトリインポートだと見做されてエラーになる
|
ESMではディレクトリインポートは廃止されているのと、ディレクトリインポートせずともファイル名が index だと何故か一部のライブラリ?でディレクトリインポートだと見做されてエラーになる
|
||||||
|
|
||||||
## CSS Recipe
|
|
||||||
|
|
||||||
### Lighten CSS vars
|
|
||||||
|
|
||||||
``` css
|
|
||||||
color: hsl(from var(--MI_THEME-accent) h s calc(l + 10));
|
|
||||||
```
|
|
||||||
|
|
||||||
### Darken CSS vars
|
|
||||||
|
|
||||||
``` css
|
|
||||||
color: hsl(from var(--MI_THEME-accent) h s calc(l - 10));
|
|
||||||
```
|
|
||||||
|
|
||||||
### Add alpha to CSS vars
|
|
||||||
|
|
||||||
``` css
|
|
||||||
color: color(from var(--MI_THEME-accent) srgb r g b / 0.5);
|
|
||||||
```
|
|
||||||
|
|
||||||
|
|
2
COPYING
2
COPYING
|
@ -1,5 +1,5 @@
|
||||||
Unless otherwise stated this repository is
|
Unless otherwise stated this repository is
|
||||||
Copyright © 2014-2025 syuilo and contributors
|
Copyright © 2014-2023 syuilo and contributers
|
||||||
|
|
||||||
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
||||||
|
|
||||||
|
|
39
Dockerfile
39
Dockerfile
|
@ -1,6 +1,6 @@
|
||||||
# syntax = docker/dockerfile:1.4
|
# syntax = docker/dockerfile:1.4
|
||||||
|
|
||||||
ARG NODE_VERSION=22.15.0-bookworm
|
ARG NODE_VERSION=20.5.1-bullseye
|
||||||
|
|
||||||
# build assets & compile TypeScript
|
# build assets & compile TypeScript
|
||||||
|
|
||||||
|
@ -14,29 +14,24 @@ RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||||||
&& apt-get install -yqq --no-install-recommends \
|
&& apt-get install -yqq --no-install-recommends \
|
||||||
build-essential
|
build-essential
|
||||||
|
|
||||||
|
RUN corepack enable
|
||||||
|
|
||||||
WORKDIR /misskey
|
WORKDIR /misskey
|
||||||
|
|
||||||
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
|
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
|
||||||
COPY --link ["scripts", "./scripts"]
|
COPY --link ["scripts", "./scripts"]
|
||||||
COPY --link ["packages/backend/package.json", "./packages/backend/"]
|
COPY --link ["packages/backend/package.json", "./packages/backend/"]
|
||||||
COPY --link ["packages/frontend-shared/package.json", "./packages/frontend-shared/"]
|
|
||||||
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
|
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
|
||||||
COPY --link ["packages/frontend-embed/package.json", "./packages/frontend-embed/"]
|
|
||||||
COPY --link ["packages/icons-subsetter/package.json", "./packages/icons-subsetter/"]
|
|
||||||
COPY --link ["packages/sw/package.json", "./packages/sw/"]
|
COPY --link ["packages/sw/package.json", "./packages/sw/"]
|
||||||
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
||||||
COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"]
|
|
||||||
COPY --link ["packages/misskey-bubble-game/package.json", "./packages/misskey-bubble-game/"]
|
|
||||||
|
|
||||||
ARG NODE_ENV=production
|
|
||||||
|
|
||||||
RUN node -e "console.log(JSON.parse(require('node:fs').readFileSync('./package.json')).packageManager)" | xargs npm install -g
|
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
||||||
pnpm i --frozen-lockfile --aggregate-output
|
pnpm i --frozen-lockfile --aggregate-output
|
||||||
|
|
||||||
COPY --link . ./
|
COPY --link . ./
|
||||||
|
|
||||||
|
ARG NODE_ENV=production
|
||||||
|
|
||||||
RUN git submodule update --init
|
RUN git submodule update --init
|
||||||
RUN pnpm build
|
RUN pnpm build
|
||||||
RUN rm -rf .git/
|
RUN rm -rf .git/
|
||||||
|
@ -49,18 +44,13 @@ RUN apt-get update \
|
||||||
&& apt-get install -yqq --no-install-recommends \
|
&& apt-get install -yqq --no-install-recommends \
|
||||||
build-essential
|
build-essential
|
||||||
|
|
||||||
|
RUN corepack enable
|
||||||
|
|
||||||
WORKDIR /misskey
|
WORKDIR /misskey
|
||||||
|
|
||||||
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
|
COPY --link ["pnpm-lock.yaml", "pnpm-workspace.yaml", "package.json", "./"]
|
||||||
COPY --link ["scripts", "./scripts"]
|
COPY --link ["scripts", "./scripts"]
|
||||||
COPY --link ["packages/backend/package.json", "./packages/backend/"]
|
COPY --link ["packages/backend/package.json", "./packages/backend/"]
|
||||||
COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
|
|
||||||
COPY --link ["packages/misskey-reversi/package.json", "./packages/misskey-reversi/"]
|
|
||||||
COPY --link ["packages/misskey-bubble-game/package.json", "./packages/misskey-bubble-game/"]
|
|
||||||
|
|
||||||
ARG NODE_ENV=production
|
|
||||||
|
|
||||||
RUN node -e "console.log(JSON.parse(require('node:fs').readFileSync('./package.json')).packageManager)" | xargs npm install -g
|
|
||||||
|
|
||||||
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
|
||||||
pnpm i --frozen-lockfile --aggregate-output
|
pnpm i --frozen-lockfile --aggregate-output
|
||||||
|
@ -74,29 +64,20 @@ RUN apt-get update \
|
||||||
&& apt-get install -y --no-install-recommends \
|
&& apt-get install -y --no-install-recommends \
|
||||||
ffmpeg tini curl libjemalloc-dev libjemalloc2 \
|
ffmpeg tini curl libjemalloc-dev libjemalloc2 \
|
||||||
&& ln -s /usr/lib/$(uname -m)-linux-gnu/libjemalloc.so.2 /usr/local/lib/libjemalloc.so \
|
&& ln -s /usr/lib/$(uname -m)-linux-gnu/libjemalloc.so.2 /usr/local/lib/libjemalloc.so \
|
||||||
|
&& corepack enable \
|
||||||
&& groupadd -g "${GID}" misskey \
|
&& groupadd -g "${GID}" misskey \
|
||||||
&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey \
|
&& useradd -l -u "${UID}" -g "${GID}" -m -d /misskey misskey \
|
||||||
&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
|
&& find / -type d -path /proc -prune -o -type f -perm /u+s -ignore_readdir_race -exec chmod u-s {} \; \
|
||||||
&& find / -type d -path /sys -prune -o -type d -path /proc -prune -o -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \; \
|
&& find / -type d -path /proc -prune -o -type f -perm /g+s -ignore_readdir_race -exec chmod g-s {} \; \
|
||||||
&& apt-get clean \
|
&& apt-get clean \
|
||||||
&& rm -rf /var/lib/apt/lists
|
&& rm -rf /var/lib/apt/lists
|
||||||
|
|
||||||
# add package.json to add pnpm
|
|
||||||
COPY ./package.json ./package.json
|
|
||||||
RUN node -e "console.log(JSON.parse(require('node:fs').readFileSync('./package.json')).packageManager)" | xargs npm install -g
|
|
||||||
|
|
||||||
USER misskey
|
USER misskey
|
||||||
WORKDIR /misskey
|
WORKDIR /misskey
|
||||||
|
|
||||||
COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules
|
COPY --chown=misskey:misskey --from=target-builder /misskey/node_modules ./node_modules
|
||||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
|
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/backend/node_modules ./packages/backend/node_modules
|
||||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-js/node_modules ./packages/misskey-js/node_modules
|
|
||||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-reversi/node_modules ./packages/misskey-reversi/node_modules
|
|
||||||
COPY --chown=misskey:misskey --from=target-builder /misskey/packages/misskey-bubble-game/node_modules ./packages/misskey-bubble-game/node_modules
|
|
||||||
COPY --chown=misskey:misskey --from=native-builder /misskey/built ./built
|
COPY --chown=misskey:misskey --from=native-builder /misskey/built ./built
|
||||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-js/built ./packages/misskey-js/built
|
|
||||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-reversi/built ./packages/misskey-reversi/built
|
|
||||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/misskey-bubble-game/built ./packages/misskey-bubble-game/built
|
|
||||||
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built
|
COPY --chown=misskey:misskey --from=native-builder /misskey/packages/backend/built ./packages/backend/built
|
||||||
COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis
|
COPY --chown=misskey:misskey --from=native-builder /misskey/fluent-emojis /misskey/fluent-emojis
|
||||||
COPY --chown=misskey:misskey . ./
|
COPY --chown=misskey:misskey . ./
|
||||||
|
|
49
README.md
49
README.md
|
@ -1,18 +1,16 @@
|
||||||
<div align="center">
|
<div align="center">
|
||||||
<a href="https://misskey-hub.net">
|
<a href="https://misskey-hub.net">
|
||||||
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="300"/>
|
<img src="./assets/title_float.svg" alt="Misskey logo" style="border-radius:50%" width="400"/>
|
||||||
</a>
|
</a>
|
||||||
|
|
||||||
**🌎 **Misskey** is an open source, federated social media platform that's free forever! 🚀**
|
**🌎 **[Misskey](https://misskey-hub.net/)** is an open source, decentralized social media platform that's free forever! 🚀**
|
||||||
|
|
||||||
[Learn more](https://misskey-hub.net/)
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
<a href="https://misskey-hub.net/servers/">
|
<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>
|
<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>
|
||||||
|
|
||||||
<a href="https://misskey-hub.net/docs/for-admin/install/guides/">
|
<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>
|
<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>
|
||||||
|
|
||||||
<a href="./CONTRIBUTING.md">
|
<a href="./CONTRIBUTING.md">
|
||||||
|
@ -24,14 +22,45 @@
|
||||||
<a href="https://www.patreon.com/syuilo">
|
<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>
|
<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>
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[](https://codecov.io/gh/misskey-dev/misskey)
|
||||||
|
|
||||||
|
</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
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
<div align="center">
|
||||||
|
<a class="rss3" title="RSS3" href="https://rss3.io/" target="_blank"><img src="https://rss3.mypinata.cloud/ipfs/QmUG6H3Z7D5P511shn7sB4CPmpjH5uZWu4m5mWX7U3Gqbu" alt="RSS3" height="60"></a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
## Thanks
|
## Thanks
|
||||||
|
|
||||||
<a href="https://sentry.io/"><img src="https://github.com/misskey-dev/misskey/assets/4439005/98576556-222f-467a-94be-e98dbda1d852" height="30" alt="Sentry" /></a>
|
|
||||||
|
|
||||||
Thanks to [Sentry](https://sentry.io/) for providing the error tracking platform that helps us catch unexpected errors.
|
|
||||||
|
|
||||||
<a href="https://www.chromatic.com/"><img src="https://user-images.githubusercontent.com/321738/84662277-e3db4f80-af1b-11ea-88f5-91d67a5e59f6.png" height="30" alt="Chromatic" /></a>
|
<a href="https://www.chromatic.com/"><img src="https://user-images.githubusercontent.com/321738/84662277-e3db4f80-af1b-11ea-88f5-91d67a5e59f6.png" height="30" alt="Chromatic" /></a>
|
||||||
|
|
||||||
Thanks to [Chromatic](https://www.chromatic.com/) for providing the visual testing platform that helps us review UI changes and catch visual regressions.
|
Thanks to [Chromatic](https://www.chromatic.com/) for providing the visual testing platform that helps us review UI changes and catch visual regressions.
|
||||||
|
|
|
@ -6,7 +6,6 @@ Also, the later tasks are more indefinite and are subject to change as developme
|
||||||
This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development.
|
This is the phase we are at now. We need to make a high-maintenance environment that can withstand future development.
|
||||||
|
|
||||||
- ~~Make the number of type errors zero (backend)~~ → Done ✔️
|
- ~~Make the number of type errors zero (backend)~~ → Done ✔️
|
||||||
- Make the number of type errors zero (frontend)
|
|
||||||
- Improve CI
|
- Improve CI
|
||||||
- ~~Fix tests~~ → Done ✔️
|
- ~~Fix tests~~ → Done ✔️
|
||||||
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986
|
- Fix random test failures - https://github.com/misskey-dev/misskey/issues/7985 and https://github.com/misskey-dev/misskey/issues/7986
|
||||||
|
|
15
SECURITY.md
15
SECURITY.md
|
@ -1,20 +1,9 @@
|
||||||
# Reporting Security Issues
|
# Reporting Security Issues
|
||||||
|
|
||||||
If you discover a security issue in Misskey, please report it by **[this form](https://github.com/misskey-dev/misskey/security/advisories/new)**.
|
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
|
This will allow us to assess the risk, and make a fix available before we add a
|
||||||
bug report to the GitHub repository.
|
bug report to the GitHub repository.
|
||||||
|
|
||||||
Thanks for helping make Misskey safe for everyone.
|
Thanks for helping make Misskey safe for everyone.
|
||||||
|
|
||||||
> [!note]
|
|
||||||
> CNA [requires](https://www.cve.org/ResourcesSupport/AllResources/CNARules#section_5-2_Description) that CVEs include a description in English for inclusion in the CVE Catalog.
|
|
||||||
>
|
|
||||||
> When creating a security advisory, all content must be written in English (it is acceptable to include a non-English description along with the English one).
|
|
||||||
|
|
||||||
## When create a patch
|
|
||||||
|
|
||||||
If you can also create a patch to fix the vulnerability, please create a PR on the private fork.
|
|
||||||
|
|
||||||
> [!note]
|
|
||||||
> There is a GitHub bug that prevents merging if a PR not following the develop branch of upstream, so please keep follow the develop branch.
|
|
||||||
|
|
BIN
assets/about/drive.png
Normal file
BIN
assets/about/drive.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 94 KiB |
BIN
assets/about/post.png
Normal file
BIN
assets/about/post.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 317 KiB |
BIN
assets/about/reaction.png
Normal file
BIN
assets/about/reaction.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 24 KiB |
BIN
assets/about/ui.png
Normal file
BIN
assets/about/ui.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 95 KiB |
BIN
assets/ss/explore.jpg
Normal file
BIN
assets/ss/explore.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 238 KiB |
BIN
assets/ss/user.jpg
Normal file
BIN
assets/ss/user.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 148 KiB |
Binary file not shown.
|
@ -124,14 +124,6 @@ redis:
|
||||||
# #prefix: example-prefix
|
# #prefix: example-prefix
|
||||||
# #db: 1
|
# #db: 1
|
||||||
|
|
||||||
#redisForReactions:
|
|
||||||
# host: redis
|
|
||||||
# port: 6379
|
|
||||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
|
||||||
# #pass: example-pass
|
|
||||||
# #prefix: example-prefix
|
|
||||||
# #db: 1
|
|
||||||
|
|
||||||
# ┌───────────────────────────┐
|
# ┌───────────────────────────┐
|
||||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||||
|
|
||||||
|
@ -160,27 +152,6 @@ redis:
|
||||||
# ID SETTINGS AFTER THAT!
|
# ID SETTINGS AFTER THAT!
|
||||||
|
|
||||||
id: "aidx"
|
id: "aidx"
|
||||||
|
|
||||||
# ┌────────────────┐
|
|
||||||
#───┘ Error tracking └──────────────────────────────────────────
|
|
||||||
|
|
||||||
# Sentry is available for error tracking.
|
|
||||||
# See the Sentry documentation for more details on options.
|
|
||||||
|
|
||||||
#sentryForBackend:
|
|
||||||
# enableNodeProfiling: true
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
#sentryForFrontend:
|
|
||||||
# vueIntegration:
|
|
||||||
# tracingOptions:
|
|
||||||
# trackComponents: true
|
|
||||||
# browserTracingIntegration:
|
|
||||||
# replayIntegration:
|
|
||||||
# options:
|
|
||||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
|
||||||
|
|
||||||
# ┌─────────────────────┐
|
# ┌─────────────────────┐
|
||||||
#───┘ Other configuration └─────────────────────────────────────
|
#───┘ Other configuration └─────────────────────────────────────
|
||||||
|
|
||||||
|
@ -196,7 +167,7 @@ id: "aidx"
|
||||||
|
|
||||||
# Job rate limiter
|
# Job rate limiter
|
||||||
# deliverJobPerSec: 128
|
# deliverJobPerSec: 128
|
||||||
# inboxJobPerSec: 32
|
# inboxJobPerSec: 16
|
||||||
|
|
||||||
# Job attempts
|
# Job attempts
|
||||||
# deliverJobMaxAttempts: 12
|
# deliverJobMaxAttempts: 12
|
||||||
|
@ -221,6 +192,9 @@ id: "aidx"
|
||||||
# Media Proxy
|
# Media Proxy
|
||||||
#mediaProxy: https://example.com/proxy
|
#mediaProxy: https://example.com/proxy
|
||||||
|
|
||||||
|
# Sign to ActivityPub GET request (default: true)
|
||||||
|
signToActivityPubGet: true
|
||||||
|
|
||||||
#allowedPrivateNetworks: [
|
#allowedPrivateNetworks: [
|
||||||
# '127.0.0.1/32'
|
# '127.0.0.1/32'
|
||||||
#]
|
#]
|
||||||
|
|
|
@ -27,7 +27,7 @@ spec:
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 3000
|
- containerPort: 3000
|
||||||
- name: postgres
|
- name: postgres
|
||||||
image: postgres:15-alpine
|
image: postgres:14-alpine
|
||||||
env:
|
env:
|
||||||
- name: POSTGRES_USER
|
- name: POSTGRES_USER
|
||||||
value: "example-misskey-user"
|
value: "example-misskey-user"
|
||||||
|
@ -38,7 +38,7 @@ spec:
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 5432
|
- containerPort: 5432
|
||||||
- name: redis
|
- name: redis
|
||||||
image: redis:7-alpine
|
image: redis:alpine
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 6379
|
- containerPort: 6379
|
||||||
volumes:
|
volumes:
|
||||||
|
|
|
@ -1,40 +0,0 @@
|
||||||
# このconfigは、 dockerでMisskey本体を起動せず、 redisとpostgresql などだけを起動します
|
|
||||||
|
|
||||||
services:
|
|
||||||
redis:
|
|
||||||
restart: always
|
|
||||||
image: redis:7-alpine
|
|
||||||
ports:
|
|
||||||
- "6379:6379"
|
|
||||||
volumes:
|
|
||||||
- ./redis:/data
|
|
||||||
healthcheck:
|
|
||||||
test: "redis-cli ping"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
db:
|
|
||||||
restart: always
|
|
||||||
image: postgres:15-alpine
|
|
||||||
ports:
|
|
||||||
- "5432:5432"
|
|
||||||
env_file:
|
|
||||||
- .config/docker.env
|
|
||||||
volumes:
|
|
||||||
- ./db:/var/lib/postgresql/data
|
|
||||||
healthcheck:
|
|
||||||
test: "pg_isready -U $$POSTGRES_USER -d $$POSTGRES_DB"
|
|
||||||
interval: 5s
|
|
||||||
retries: 20
|
|
||||||
|
|
||||||
# meilisearch:
|
|
||||||
# restart: always
|
|
||||||
# image: getmeili/meilisearch:v1.3.4
|
|
||||||
# environment:
|
|
||||||
# - MEILI_NO_ANALYTICS=true
|
|
||||||
# - MEILI_ENV=production
|
|
||||||
# env_file:
|
|
||||||
# - .config/meilisearch.env
|
|
||||||
# volumes:
|
|
||||||
# - ./meili_data:/meili_data
|
|
||||||
|
|
|
@ -2,6 +2,11 @@ import { defineConfig } from 'cypress'
|
||||||
|
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
e2e: {
|
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',
|
baseUrl: 'http://localhost:61812',
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|
|
@ -1,8 +1,3 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
describe('Before setup instance', () => {
|
describe('Before setup instance', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
||||||
cy.resetState();
|
cy.resetState();
|
||||||
|
@ -23,7 +18,6 @@ describe('Before setup instance', () => {
|
||||||
|
|
||||||
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
||||||
|
|
||||||
cy.get('[data-cy-admin-initial-password] input').type('example_password_please_change_this_or_you_will_get_hacked');
|
|
||||||
cy.get('[data-cy-admin-username] input').type('admin');
|
cy.get('[data-cy-admin-username] input').type('admin');
|
||||||
cy.get('[data-cy-admin-password] input').type('admin1234');
|
cy.get('[data-cy-admin-password] input').type('admin1234');
|
||||||
cy.get('[data-cy-admin-ok]').click();
|
cy.get('[data-cy-admin-ok]').click();
|
||||||
|
@ -31,15 +25,6 @@ describe('Before setup instance', () => {
|
||||||
// なぜか動かない
|
// なぜか動かない
|
||||||
//cy.wait('@signup').should('have.property', 'response.statusCode');
|
//cy.wait('@signup').should('have.property', 'response.statusCode');
|
||||||
cy.wait('@signup');
|
cy.wait('@signup');
|
||||||
|
|
||||||
cy.intercept('POST', '/api/admin/update-meta').as('update-meta');
|
|
||||||
|
|
||||||
cy.get('[data-cy-next]').click();
|
|
||||||
cy.get('[data-cy-next]').click();
|
|
||||||
cy.get('[data-cy-server-name] input').type('Testskey');
|
|
||||||
cy.get('[data-cy-server-setup-wizard-apply]').click();
|
|
||||||
|
|
||||||
cy.wait('@update-meta');
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -129,16 +114,11 @@ describe('After user signup', () => {
|
||||||
it('signin', () => {
|
it('signin', () => {
|
||||||
cy.visitHome();
|
cy.visitHome();
|
||||||
|
|
||||||
cy.intercept('POST', '/api/signin-flow').as('signin');
|
cy.intercept('POST', '/api/signin').as('signin');
|
||||||
|
|
||||||
cy.get('[data-cy-signin]').click();
|
cy.get('[data-cy-signin]').click();
|
||||||
|
cy.get('[data-cy-signin-username] input').type('alice');
|
||||||
cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
|
// Enterキーでサインインできるかの確認も兼ねる
|
||||||
// Enterキーで続行できるかの確認も兼ねる
|
|
||||||
cy.get('[data-cy-signin-username] input').type('alice{enter}');
|
|
||||||
|
|
||||||
cy.get('[data-cy-signin-page-password]').should('be.visible', { timeout: 10000 });
|
|
||||||
// Enterキーで続行できるかの確認も兼ねる
|
|
||||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||||
|
|
||||||
cy.wait('@signin');
|
cy.wait('@signin');
|
||||||
|
@ -153,9 +133,8 @@ describe('After user signup', () => {
|
||||||
cy.visitHome();
|
cy.visitHome();
|
||||||
|
|
||||||
cy.get('[data-cy-signin]').click();
|
cy.get('[data-cy-signin]').click();
|
||||||
|
cy.get('[data-cy-signin-username] input').type('alice');
|
||||||
cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
|
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||||
cy.get('[data-cy-signin-username] input').type('alice{enter}');
|
|
||||||
|
|
||||||
// TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする
|
// TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする
|
||||||
cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi);
|
cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi);
|
||||||
|
@ -182,13 +161,11 @@ describe('After user signed in', () => {
|
||||||
});
|
});
|
||||||
|
|
||||||
it('successfully loads', () => {
|
it('successfully loads', () => {
|
||||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
cy.get('[data-cy-user-setup-continue]').should('be.visible');
|
||||||
cy.get('[data-cy-user-setup-continue]', { timeout: 30000 }).should('be.visible');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('account setup wizard', () => {
|
it('account setup wizard', () => {
|
||||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
cy.get('[data-cy-user-setup-continue]').click();
|
||||||
cy.get('[data-cy-user-setup-continue]', { timeout: 30000 }).click();
|
|
||||||
|
|
||||||
cy.get('[data-cy-user-setup-user-name] input').type('ありす');
|
cy.get('[data-cy-user-setup-user-name] input').type('ありす');
|
||||||
cy.get('[data-cy-user-setup-user-description] textarea').type('ほげ');
|
cy.get('[data-cy-user-setup-user-description] textarea').type('ほげ');
|
||||||
|
@ -225,8 +202,7 @@ describe('After user setup', () => {
|
||||||
cy.login('alice', 'alice1234');
|
cy.login('alice', 'alice1234');
|
||||||
|
|
||||||
// アカウント初期設定ウィザード
|
// アカウント初期設定ウィザード
|
||||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]').click();
|
||||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]', { timeout: 30000 }).click();
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -242,7 +218,7 @@ describe('After user setup', () => {
|
||||||
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
||||||
cy.get('[data-cy-open-post-form-submit]').click();
|
cy.get('[data-cy-open-post-form-submit]').click();
|
||||||
|
|
||||||
cy.contains('Hello, Misskey!', { timeout: 15000 });
|
cy.contains('Hello, Misskey!');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('open note form with hotkey', () => {
|
it('open note form with hotkey', () => {
|
|
@ -1,35 +0,0 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
describe('Router transition', () => {
|
|
||||||
describe('Redirect', () => {
|
|
||||||
// サーバの初期化。ルートのテストに関しては各describeごとに1度だけ実行で十分だと思う(使いまわした方が早い)
|
|
||||||
before(() => {
|
|
||||||
cy.resetState();
|
|
||||||
|
|
||||||
// インスタンス初期セットアップ
|
|
||||||
cy.registerUser('admin', 'pass', true);
|
|
||||||
|
|
||||||
// ユーザー作成
|
|
||||||
cy.registerUser('alice', 'alice1234');
|
|
||||||
|
|
||||||
cy.login('alice', 'alice1234');
|
|
||||||
|
|
||||||
// アカウント初期設定ウィザード
|
|
||||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
|
||||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]', { timeout: 30000 }).click();
|
|
||||||
cy.wait(500);
|
|
||||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
|
||||||
});
|
|
||||||
|
|
||||||
it('redirect to user profile', () => {
|
|
||||||
// テストのためだけに用意されたリダイレクト用ルートに飛ぶ
|
|
||||||
cy.visit('/redirect-test');
|
|
||||||
|
|
||||||
// プロフィールページのURLであることを確認する
|
|
||||||
cy.url().should('include', '/@alice')
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
|
@ -1,8 +1,3 @@
|
||||||
/*
|
|
||||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* flaky
|
/* flaky
|
||||||
describe('After user signed in', () => {
|
describe('After user signed in', () => {
|
||||||
beforeEach(() => {
|
beforeEach(() => {
|
22
cypress/plugins/index.js
Normal file
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
|
||||||
|
}
|
|
@ -30,13 +30,9 @@ Cypress.Commands.add('visitHome', () => {
|
||||||
})
|
})
|
||||||
|
|
||||||
Cypress.Commands.add('resetState', () => {
|
Cypress.Commands.add('resetState', () => {
|
||||||
// iframe.contentWindow.indexedDB.deleteDatabase() がchromeのバグで使用できないため、indexedDBを無効化している。
|
cy.window(win => {
|
||||||
// see https://github.com/misskey-dev/misskey/issues/13605#issuecomment-2053652123
|
|
||||||
/*
|
|
||||||
cy.window().then(win => {
|
|
||||||
win.indexedDB.deleteDatabase('keyval-store');
|
win.indexedDB.deleteDatabase('keyval-store');
|
||||||
});
|
});
|
||||||
*/
|
|
||||||
cy.request('POST', '/api/reset-db', {}).as('reset');
|
cy.request('POST', '/api/reset-db', {}).as('reset');
|
||||||
cy.get('@reset').its('status').should('equal', 204);
|
cy.get('@reset').its('status').should('equal', 204);
|
||||||
cy.reload(true);
|
cy.reload(true);
|
||||||
|
@ -48,19 +44,16 @@ Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
|
||||||
cy.request('POST', route, {
|
cy.request('POST', route, {
|
||||||
username: username,
|
username: username,
|
||||||
password: password,
|
password: password,
|
||||||
...(isAdmin ? { setupPassword: 'example_password_please_change_this_or_you_will_get_hacked' } : {}),
|
|
||||||
}).its('body').as(username);
|
}).its('body').as(username);
|
||||||
});
|
});
|
||||||
|
|
||||||
Cypress.Commands.add('login', (username, password) => {
|
Cypress.Commands.add('login', (username, password) => {
|
||||||
cy.visitHome();
|
cy.visitHome();
|
||||||
|
|
||||||
cy.intercept('POST', '/api/signin-flow').as('signin');
|
cy.intercept('POST', '/api/signin').as('signin');
|
||||||
|
|
||||||
cy.get('[data-cy-signin]').click();
|
cy.get('[data-cy-signin]').click();
|
||||||
cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
|
cy.get('[data-cy-signin-username] input').type(username);
|
||||||
cy.get('[data-cy-signin-username] input').type(`${username}{enter}`);
|
|
||||||
cy.get('[data-cy-signin-page-password]').should('be.visible', { timeout: 10000 });
|
|
||||||
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
|
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
|
||||||
|
|
||||||
cy.wait('@signin').as('signedIn');
|
cy.wait('@signin').as('signedIn');
|
|
@ -1,19 +0,0 @@
|
||||||
declare global {
|
|
||||||
namespace Cypress {
|
|
||||||
interface Chainable {
|
|
||||||
login(username: string, password: string): Chainable<void>;
|
|
||||||
|
|
||||||
registerUser(
|
|
||||||
username: string,
|
|
||||||
password: string,
|
|
||||||
isAdmin?: boolean
|
|
||||||
): Chainable<void>;
|
|
||||||
|
|
||||||
resetState(): Chainable<void>;
|
|
||||||
|
|
||||||
visitHome(): Chainable<void>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export {}
|
|
|
@ -1,8 +0,0 @@
|
||||||
{
|
|
||||||
"compilerOptions": {
|
|
||||||
"lib": ["dom", "es5"],
|
|
||||||
"target": "es5",
|
|
||||||
"types": ["cypress", "node"]
|
|
||||||
},
|
|
||||||
"include": ["./**/*.ts"]
|
|
||||||
}
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
version: "3"
|
||||||
|
|
||||||
services:
|
services:
|
||||||
web:
|
web:
|
||||||
build: .
|
build: .
|
||||||
|
@ -5,7 +7,6 @@ services:
|
||||||
links:
|
links:
|
||||||
- db
|
- db
|
||||||
- redis
|
- redis
|
||||||
# - mcaptcha
|
|
||||||
# - meilisearch
|
# - meilisearch
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
|
@ -17,8 +18,6 @@ services:
|
||||||
networks:
|
networks:
|
||||||
- internal_network
|
- internal_network
|
||||||
- external_network
|
- external_network
|
||||||
# env_file:
|
|
||||||
# - .config/docker.env
|
|
||||||
volumes:
|
volumes:
|
||||||
- ./files:/misskey/files
|
- ./files:/misskey/files
|
||||||
- ./.config:/misskey/.config:ro
|
- ./.config:/misskey/.config:ro
|
||||||
|
@ -49,36 +48,6 @@ services:
|
||||||
interval: 5s
|
interval: 5s
|
||||||
retries: 20
|
retries: 20
|
||||||
|
|
||||||
# mcaptcha:
|
|
||||||
# restart: always
|
|
||||||
# image: mcaptcha/mcaptcha:latest
|
|
||||||
# networks:
|
|
||||||
# internal_network:
|
|
||||||
# external_network:
|
|
||||||
# aliases:
|
|
||||||
# - localhost
|
|
||||||
# ports:
|
|
||||||
# - 7493:7493
|
|
||||||
# env_file:
|
|
||||||
# - .config/docker.env
|
|
||||||
# environment:
|
|
||||||
# PORT: 7493
|
|
||||||
# MCAPTCHA_redis_URL: "redis://mcaptcha_redis/"
|
|
||||||
# depends_on:
|
|
||||||
# db:
|
|
||||||
# condition: service_healthy
|
|
||||||
# mcaptcha_redis:
|
|
||||||
# condition: service_healthy
|
|
||||||
#
|
|
||||||
# mcaptcha_redis:
|
|
||||||
# image: mcaptcha/cache:latest
|
|
||||||
# networks:
|
|
||||||
# - internal_network
|
|
||||||
# healthcheck:
|
|
||||||
# test: "redis-cli ping"
|
|
||||||
# interval: 5s
|
|
||||||
# retries: 20
|
|
||||||
|
|
||||||
# meilisearch:
|
# meilisearch:
|
||||||
# restart: always
|
# restart: always
|
||||||
# image: getmeili/meilisearch:v1.3.4
|
# image: getmeili/meilisearch:v1.3.4
|
|
@ -1,7 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
# SPDX-FileCopyrightText: syuilo and misskey-project
|
# SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
PORT=$(grep '^port:' /misskey/.config/default.yml | awk 'NR==1{print $2; exit}')
|
PORT=$(grep '^port:' /misskey/.config/default.yml | awk 'NR==1{print $2; exit}')
|
||||||
curl -Sfso/dev/null "http://localhost:${PORT}/healthz"
|
curl -s -S -o /dev/null "http://localhost:${PORT}"
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
使われなくなったけど消すのは勿体ない(将来使えるかもしれない)コードを入れておくとこ
|
|
|
@ -120,10 +120,10 @@ sensitive: "محتوى حساس"
|
||||||
add: "إضافة"
|
add: "إضافة"
|
||||||
reaction: "التفاعلات"
|
reaction: "التفاعلات"
|
||||||
reactions: "التفاعلات"
|
reactions: "التفاعلات"
|
||||||
|
reactionSetting: "التفاعلات المراد عرضها في منتقي التفاعلات."
|
||||||
reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة."
|
reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة."
|
||||||
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
|
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
|
||||||
attachCancel: "أزل المرفق"
|
attachCancel: "أزل المرفق"
|
||||||
deleteFile: "حُذف الملف"
|
|
||||||
markAsSensitive: "علّمه كمحتوى حساس"
|
markAsSensitive: "علّمه كمحتوى حساس"
|
||||||
unmarkAsSensitive: "ألغ تعيينه كمحتوى حساس"
|
unmarkAsSensitive: "ألغ تعيينه كمحتوى حساس"
|
||||||
enterFileName: "ادخل اسم الملف"
|
enterFileName: "ادخل اسم الملف"
|
||||||
|
@ -215,6 +215,7 @@ noUsers: "ليس هناك مستخدمون"
|
||||||
editProfile: "تعديل الملف التعريفي"
|
editProfile: "تعديل الملف التعريفي"
|
||||||
noteDeleteConfirm: "هل تريد حذف هذه الملاحظة؟"
|
noteDeleteConfirm: "هل تريد حذف هذه الملاحظة؟"
|
||||||
pinLimitExceeded: "لا يمكنك تثبيت الملاحظات بعد الآن."
|
pinLimitExceeded: "لا يمكنك تثبيت الملاحظات بعد الآن."
|
||||||
|
intro: "لقد انتهت عملية تنصيب Misskey. الرجاء إنشاء حساب إداري."
|
||||||
done: "تمّ"
|
done: "تمّ"
|
||||||
processing: "المعالجة جارية"
|
processing: "المعالجة جارية"
|
||||||
preview: "معاينة"
|
preview: "معاينة"
|
||||||
|
@ -250,6 +251,7 @@ removeAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||||
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
deleteAreYouSure: "متأكد من أنك تريد حذف {x}؟"
|
||||||
resetAreYouSure: "هل تريد إعادة التعيين؟"
|
resetAreYouSure: "هل تريد إعادة التعيين؟"
|
||||||
saved: "حُفظ"
|
saved: "حُفظ"
|
||||||
|
messaging: "المحادثة"
|
||||||
upload: "ارفع"
|
upload: "ارفع"
|
||||||
keepOriginalUploading: "ابق الصورة الأصلية"
|
keepOriginalUploading: "ابق الصورة الأصلية"
|
||||||
keepOriginalUploadingDescription: "يحفظ الصور المرفوعة على حالتها الأصلية، وان عطّل ستولد نسخة مخصصة من الصورة."
|
keepOriginalUploadingDescription: "يحفظ الصور المرفوعة على حالتها الأصلية، وان عطّل ستولد نسخة مخصصة من الصورة."
|
||||||
|
@ -262,6 +264,7 @@ uploadFromUrlMayTakeTime: "سيستغرق بعض الوقت لاتمام الر
|
||||||
explore: "استكشاف"
|
explore: "استكشاف"
|
||||||
messageRead: "مقروءة"
|
messageRead: "مقروءة"
|
||||||
noMoreHistory: "لا يوجد المزيد من التاريخ"
|
noMoreHistory: "لا يوجد المزيد من التاريخ"
|
||||||
|
startMessaging: "ابدأ محادثة"
|
||||||
nUsersRead: "قرأه {n}"
|
nUsersRead: "قرأه {n}"
|
||||||
agreeTo: "اوافق على {0}"
|
agreeTo: "اوافق على {0}"
|
||||||
agree: "أقبل"
|
agree: "أقبل"
|
||||||
|
@ -340,6 +343,7 @@ enableLocalTimeline: "تفعيل الخيط المحلي"
|
||||||
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
enableGlobalTimeline: "تفعيل الخيط الزمني الشامل"
|
||||||
disablingTimelinesInfo: "سيتمكن المديرون والمشرفون من الوصول إلى كل الخيوط الزمنية حتى وإن لم تفعّل."
|
disablingTimelinesInfo: "سيتمكن المديرون والمشرفون من الوصول إلى كل الخيوط الزمنية حتى وإن لم تفعّل."
|
||||||
registration: "إنشاء حساب"
|
registration: "إنشاء حساب"
|
||||||
|
enableRegistration: "تفعيل إنشاء الحسابات الجديدة"
|
||||||
invite: "دعوة"
|
invite: "دعوة"
|
||||||
driveCapacityPerLocalAccount: "حصة التخزين لكل مستخدم محلي"
|
driveCapacityPerLocalAccount: "حصة التخزين لكل مستخدم محلي"
|
||||||
driveCapacityPerRemoteAccount: "حصة التخزين لكل مستخدم بعيد"
|
driveCapacityPerRemoteAccount: "حصة التخزين لكل مستخدم بعيد"
|
||||||
|
@ -357,8 +361,6 @@ hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "فعّل hCaptcha"
|
enableHcaptcha: "فعّل hCaptcha"
|
||||||
hcaptchaSiteKey: "مفتاح الموقع"
|
hcaptchaSiteKey: "مفتاح الموقع"
|
||||||
hcaptchaSecretKey: "المفتاح السري"
|
hcaptchaSecretKey: "المفتاح السري"
|
||||||
mcaptchaSiteKey: "مفتاح الموقع"
|
|
||||||
mcaptchaSecretKey: "المفتاح السري"
|
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "تمكين reCAPTCHA"
|
enableRecaptcha: "تمكين reCAPTCHA"
|
||||||
recaptchaSiteKey: "مفتاح الموقع"
|
recaptchaSiteKey: "مفتاح الموقع"
|
||||||
|
@ -416,6 +418,7 @@ share: "شارِك"
|
||||||
notFound: "غير موجود"
|
notFound: "غير موجود"
|
||||||
notFoundDescription: "تعذر العثور على صفحة يقود إليها هذا الرابط."
|
notFoundDescription: "تعذر العثور على صفحة يقود إليها هذا الرابط."
|
||||||
uploadFolder: "المجلد الافتراضي للرفع"
|
uploadFolder: "المجلد الافتراضي للرفع"
|
||||||
|
cacheClear: "مسح ذاكرة التخزين المؤقت"
|
||||||
markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة"
|
markAsReadAllNotifications: "وضع جميع الإشعارات كأنها مقروءة"
|
||||||
markAsReadAllUnreadNotes: "علّم جميع الملاحظات كمقروءة"
|
markAsReadAllUnreadNotes: "علّم جميع الملاحظات كمقروءة"
|
||||||
markAsReadAllTalkMessages: "علّم جميع الرسائل كمقروءة"
|
markAsReadAllTalkMessages: "علّم جميع الرسائل كمقروءة"
|
||||||
|
@ -433,6 +436,8 @@ retype: "أعد الكتابة"
|
||||||
noteOf: "ملاحظات {user}"
|
noteOf: "ملاحظات {user}"
|
||||||
quoteAttached: "اِقتُبسَ"
|
quoteAttached: "اِقتُبسَ"
|
||||||
quoteQuestion: "أتريد تضمينها كاقتباس"
|
quoteQuestion: "أتريد تضمينها كاقتباس"
|
||||||
|
noMessagesYet: "ليس هناك رسائل بعد"
|
||||||
|
newMessageExists: "لقد تلقيت رسالة جديدة"
|
||||||
onlyOneFileCanBeAttached: "يمكنك إرفاق ملف واحد بالرسالة"
|
onlyOneFileCanBeAttached: "يمكنك إرفاق ملف واحد بالرسالة"
|
||||||
signinRequired: "رجاءً لِج"
|
signinRequired: "رجاءً لِج"
|
||||||
invitations: "دعوة"
|
invitations: "دعوة"
|
||||||
|
@ -620,7 +625,10 @@ abuseReported: "أُرسل البلاغ، شكرًا لك"
|
||||||
reporter: "المُبلّغ"
|
reporter: "المُبلّغ"
|
||||||
reporteeOrigin: "أصل البلاغ"
|
reporteeOrigin: "أصل البلاغ"
|
||||||
reporterOrigin: "أصل المُبلّغ"
|
reporterOrigin: "أصل المُبلّغ"
|
||||||
|
forwardReport: "وجّه البلاغ إلى المثيل البعيد"
|
||||||
|
forwardReportIsAnonymous: "في المثيل البعيد سيظهر المبلّغ كحساب مجهول."
|
||||||
send: "أرسل"
|
send: "أرسل"
|
||||||
|
abuseMarkAsResolved: "علّم البلاغ كمحلول"
|
||||||
openInNewTab: "افتح في لسان جديد"
|
openInNewTab: "افتح في لسان جديد"
|
||||||
defaultNavigationBehaviour: "سلوك الملاحة الافتراضي"
|
defaultNavigationBehaviour: "سلوك الملاحة الافتراضي"
|
||||||
editTheseSettingsMayBreakAccount: "تعديل هذه الإعدادات قد يسبب عطبًا لحسابك"
|
editTheseSettingsMayBreakAccount: "تعديل هذه الإعدادات قد يسبب عطبًا لحسابك"
|
||||||
|
@ -675,6 +683,7 @@ experimental: "اختباري"
|
||||||
developer: "المطور"
|
developer: "المطور"
|
||||||
makeExplorable: "أظهر الحساب في صفحة \"استكشاف\""
|
makeExplorable: "أظهر الحساب في صفحة \"استكشاف\""
|
||||||
makeExplorableDescription: "بتعطيل هذا الخيار لن يظهر حسابك في صفحة \"استكشاف\""
|
makeExplorableDescription: "بتعطيل هذا الخيار لن يظهر حسابك في صفحة \"استكشاف\""
|
||||||
|
showGapBetweenNotesInTimeline: "أظهر فجوات بين المشاركات في الخيط الزمني"
|
||||||
left: "يسار"
|
left: "يسار"
|
||||||
center: "وسط"
|
center: "وسط"
|
||||||
wide: "عريض"
|
wide: "عريض"
|
||||||
|
@ -809,6 +818,8 @@ makeReactionsPublicDescription: "هذا سيجعل قائمة تفاعلاتك
|
||||||
classic: "تقليدي"
|
classic: "تقليدي"
|
||||||
muteThread: "اكتم النقاش"
|
muteThread: "اكتم النقاش"
|
||||||
unmuteThread: "ارفع الكتم عن النقاش"
|
unmuteThread: "ارفع الكتم عن النقاش"
|
||||||
|
ffVisibility: "مرئية المتابِعين/المتابَعين"
|
||||||
|
ffVisibilityDescription: "يسمح لك بتحديد من يمكنهم رؤية متابِعيك ومتابَعيك."
|
||||||
continueThread: "اعرض بقية النقاش"
|
continueThread: "اعرض بقية النقاش"
|
||||||
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
|
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
|
||||||
incorrectPassword: "كلمة السر خاطئة."
|
incorrectPassword: "كلمة السر خاطئة."
|
||||||
|
@ -937,12 +948,9 @@ rolesAssignedToMe: "الأدوار المسندة إلي"
|
||||||
resetPasswordConfirm: "هل تريد إعادة تعيين كلمة السر؟"
|
resetPasswordConfirm: "هل تريد إعادة تعيين كلمة السر؟"
|
||||||
license: "الرخصة"
|
license: "الرخصة"
|
||||||
unfavoriteConfirm: "أتريد إزالتها من المفضلة؟"
|
unfavoriteConfirm: "أتريد إزالتها من المفضلة؟"
|
||||||
reactionsDisplaySize: "حجم التفاعلات"
|
|
||||||
limitWidthOfReaction: "تصغير حجم التفاعلات"
|
|
||||||
noteIdOrUrl: "معرف الملاحظة أو رابطها"
|
noteIdOrUrl: "معرف الملاحظة أو رابطها"
|
||||||
video: "فيديو"
|
video: "فيديو"
|
||||||
videos: "فيديوهات"
|
videos: "فيديوهات"
|
||||||
dataSaver: "موفر البيانات"
|
|
||||||
accountMigration: "ترحيل الحساب"
|
accountMigration: "ترحيل الحساب"
|
||||||
accountMoved: "نقل هذا المستخدم حسابه:"
|
accountMoved: "نقل هذا المستخدم حسابه:"
|
||||||
accountMovedShort: "رُحل هذا الحساب."
|
accountMovedShort: "رُحل هذا الحساب."
|
||||||
|
@ -950,7 +958,6 @@ operationForbidden: "عملية ممنوعة"
|
||||||
forceShowAds: "أظهر الإعلانات التجارية دائما"
|
forceShowAds: "أظهر الإعلانات التجارية دائما"
|
||||||
reactionsList: "التفاعلات"
|
reactionsList: "التفاعلات"
|
||||||
renotesList: "إعادات النشر"
|
renotesList: "إعادات النشر"
|
||||||
notificationDisplay: "إشعارات"
|
|
||||||
leftTop: "أعلى اليسار"
|
leftTop: "أعلى اليسار"
|
||||||
rightTop: "أعلى اليمين"
|
rightTop: "أعلى اليمين"
|
||||||
leftBottom: "أسفل اليسار"
|
leftBottom: "أسفل اليسار"
|
||||||
|
@ -973,7 +980,6 @@ thisChannelArchived: "أُرشفت هذه القناة."
|
||||||
displayOfNote: "عرض الملاحظة"
|
displayOfNote: "عرض الملاحظة"
|
||||||
initialAccountSetting: "إعداد الملف الشخصي"
|
initialAccountSetting: "إعداد الملف الشخصي"
|
||||||
youFollowing: "متابَع"
|
youFollowing: "متابَع"
|
||||||
preventAiLearning: "منع استخدام البيانات في تعليم الآلة"
|
|
||||||
options: "خيارات"
|
options: "خيارات"
|
||||||
specifyUser: "مستخدم محدد"
|
specifyUser: "مستخدم محدد"
|
||||||
failedToPreviewUrl: "تتعذر المعاينة"
|
failedToPreviewUrl: "تتعذر المعاينة"
|
||||||
|
@ -987,35 +993,13 @@ later: "لاحقاً"
|
||||||
goToMisskey: "لميسكي"
|
goToMisskey: "لميسكي"
|
||||||
additionalEmojiDictionary: "قواميس إيموجي إضافية"
|
additionalEmojiDictionary: "قواميس إيموجي إضافية"
|
||||||
installed: "مُثبت"
|
installed: "مُثبت"
|
||||||
enableServerMachineStats: "نشر إحصائيات عتاد الخادم"
|
|
||||||
turnOffToImprovePerformance: "تفعيله قد يزيد الأداء."
|
|
||||||
createInviteCode: "ولِّد دعوة"
|
|
||||||
inviteCodeCreated: "ولِّدت دعوة"
|
|
||||||
inviteLimitExceeded: "وصلتَ لحد عدد الدعوات المسموح لك توليدها."
|
|
||||||
createLimitRemaining: "حد عدد الدعوات: {limit} دعوة"
|
|
||||||
expirationDate: "تاريخ انتهاء الصلاحية"
|
expirationDate: "تاريخ انتهاء الصلاحية"
|
||||||
noExpirationDate: "لا نهاية لصلاحيتها"
|
|
||||||
inviteCodeUsedAt: "اُستخدم رمز الدعوة في"
|
|
||||||
registeredUserUsingInviteCode: "اِستخدم رمز الدعوة"
|
|
||||||
unused: "غير مستعمَل"
|
unused: "غير مستعمَل"
|
||||||
expired: "منتهية صلاحيته"
|
expired: "منتهية صلاحيته"
|
||||||
icon: "الصورة الرمزية"
|
icon: "الصورة الرمزية"
|
||||||
replies: "رد"
|
replies: "رد"
|
||||||
renotes: "أعد النشر"
|
renotes: "أعد النشر"
|
||||||
sourceCode: "الشفرة المصدرية"
|
|
||||||
flip: "اقلب"
|
flip: "اقلب"
|
||||||
lastNDays: "آخر {n} أيام"
|
|
||||||
surrender: "ألغِ"
|
|
||||||
postForm: "أنشئ ملاحظة"
|
|
||||||
information: "عن"
|
|
||||||
_chat:
|
|
||||||
invitations: "دعوة"
|
|
||||||
noHistory: "السجل فارغ"
|
|
||||||
members: "الأعضاء"
|
|
||||||
home: "الرئيسي"
|
|
||||||
send: "أرسل"
|
|
||||||
_delivery:
|
|
||||||
stop: "مُعلّق"
|
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
accountCreated: "نجح إنشاء حسابك!"
|
accountCreated: "نجح إنشاء حسابك!"
|
||||||
letsStartAccountSetup: "إذا كنت جديدًا لنعدّ حسابك الشخصي."
|
letsStartAccountSetup: "إذا كنت جديدًا لنعدّ حسابك الشخصي."
|
||||||
|
@ -1238,6 +1222,7 @@ _theme:
|
||||||
shadow: "الظل"
|
shadow: "الظل"
|
||||||
navBg: "خلفية الشريط الجانبي"
|
navBg: "خلفية الشريط الجانبي"
|
||||||
navFg: "نص الشريط الجانبي"
|
navFg: "نص الشريط الجانبي"
|
||||||
|
navHoverFg: "نص الشريط الجانبي (عند التمرير فوقه)"
|
||||||
link: "رابط"
|
link: "رابط"
|
||||||
hashtag: "وسم"
|
hashtag: "وسم"
|
||||||
mention: "أشر الى"
|
mention: "أشر الى"
|
||||||
|
@ -1252,11 +1237,15 @@ _theme:
|
||||||
buttonBg: "خلفية الأزرار"
|
buttonBg: "خلفية الأزرار"
|
||||||
buttonHoverBg: "خلفية الأزرار (عند التمرير فوقها)"
|
buttonHoverBg: "خلفية الأزرار (عند التمرير فوقها)"
|
||||||
inputBorder: "حواف حقل الإدخال"
|
inputBorder: "حواف حقل الإدخال"
|
||||||
|
listItemHoverBg: "خلفية عناصر القائمة (عند التمرير فوقها)"
|
||||||
|
driveFolderBg: "خلفية مجلد قرص التخزين"
|
||||||
messageBg: "خلفية المحادثة"
|
messageBg: "خلفية المحادثة"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "الملاحظات"
|
note: "الملاحظات"
|
||||||
noteMy: "ملاحظتي"
|
noteMy: "ملاحظتي"
|
||||||
notification: "الإشعارات"
|
notification: "الإشعارات"
|
||||||
|
antenna: "الهوائيات"
|
||||||
|
channel: "إشعارات القنات"
|
||||||
_ago:
|
_ago:
|
||||||
future: "المستقبَل"
|
future: "المستقبَل"
|
||||||
justNow: "اللحظة"
|
justNow: "اللحظة"
|
||||||
|
@ -1273,6 +1262,9 @@ _time:
|
||||||
minute: "د"
|
minute: "د"
|
||||||
hour: "سا"
|
hour: "سا"
|
||||||
day: "ي"
|
day: "ي"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "كيف تستخدم Misskey"
|
||||||
|
step3_1: "هل نشرت ملاحظتك الأولى؟"
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "سجلت سلفًا جهازًا للاستيثاق بعاملين."
|
alreadyRegistered: "سجلت سلفًا جهازًا للاستيثاق بعاملين."
|
||||||
step1: "أولًا ثبّت تطبيق استيثاق على جهازك (مثل {a} و{b})."
|
step1: "أولًا ثبّت تطبيق استيثاق على جهازك (مثل {a} و{b})."
|
||||||
|
@ -1311,7 +1303,6 @@ _permissions:
|
||||||
"read:gallery": "اعرض المعرض"
|
"read:gallery": "اعرض المعرض"
|
||||||
"write:gallery": "عدّل المعرض"
|
"write:gallery": "عدّل المعرض"
|
||||||
"read:gallery-likes": "يعرض ما أعجبك من مشاركات المعرض"
|
"read:gallery-likes": "يعرض ما أعجبك من مشاركات المعرض"
|
||||||
"write:chat": "اكتب أو احذف رسائل محادثة"
|
|
||||||
_auth:
|
_auth:
|
||||||
shareAccess: "أتريد التفويض لـ \"{name}\" بالوصول لحسابك؟"
|
shareAccess: "أتريد التفويض لـ \"{name}\" بالوصول لحسابك؟"
|
||||||
shareAccessAsk: "هل تخول لهذا التطبيق الوصول لحسابك؟"
|
shareAccessAsk: "هل تخول لهذا التطبيق الوصول لحسابك؟"
|
||||||
|
@ -1416,7 +1407,6 @@ _profile:
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "كل الملاحظات"
|
allNotes: "كل الملاحظات"
|
||||||
favoritedNotes: " الملاحظات المفضلة"
|
favoritedNotes: " الملاحظات المفضلة"
|
||||||
clips: "مِشبك"
|
|
||||||
followingList: "المتابَعون"
|
followingList: "المتابَعون"
|
||||||
muteList: "المستخدمون المكتومون"
|
muteList: "المستخدمون المكتومون"
|
||||||
blockingList: "المستخدمون المحجوبون"
|
blockingList: "المستخدمون المحجوبون"
|
||||||
|
@ -1461,6 +1451,9 @@ _pages:
|
||||||
newPage: "أنشئ صفحة جديدة"
|
newPage: "أنشئ صفحة جديدة"
|
||||||
editPage: "عدّل الصفحة"
|
editPage: "عدّل الصفحة"
|
||||||
readPage: "نُشّط عرض المصدر"
|
readPage: "نُشّط عرض المصدر"
|
||||||
|
created: "نجح إنشاء الصفحة"
|
||||||
|
updated: "نجح تعديل الصفحة"
|
||||||
|
deleted: "نجح حذف الصفحة"
|
||||||
pageSetting: "إعدادات الصفحة"
|
pageSetting: "إعدادات الصفحة"
|
||||||
nameAlreadyExists: "رابط الصفحة موجود مسبقًا"
|
nameAlreadyExists: "رابط الصفحة موجود مسبقًا"
|
||||||
invalidNameTitle: "رابط الصفحة ليس صالحًا"
|
invalidNameTitle: "رابط الصفحة ليس صالحًا"
|
||||||
|
@ -1526,7 +1519,6 @@ _notification:
|
||||||
reaction: "التفاعل"
|
reaction: "التفاعل"
|
||||||
receiveFollowRequest: "طلبات المتابعة"
|
receiveFollowRequest: "طلبات المتابعة"
|
||||||
followRequestAccepted: "طلبات المتابعة المقبولة"
|
followRequestAccepted: "طلبات المتابعة المقبولة"
|
||||||
login: "لِج"
|
|
||||||
app: "إشعارات التطبيقات المرتبطة"
|
app: "إشعارات التطبيقات المرتبطة"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "تابعك بالمثل"
|
followBack: "تابعك بالمثل"
|
||||||
|
@ -1558,34 +1550,6 @@ _webhookSettings:
|
||||||
active: "مُفعّل"
|
active: "مُفعّل"
|
||||||
_events:
|
_events:
|
||||||
reaction: "عند التفاعل"
|
reaction: "عند التفاعل"
|
||||||
_abuseReport:
|
|
||||||
_notificationRecipient:
|
|
||||||
_recipientType:
|
|
||||||
mail: "البريد الإلكتروني "
|
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
suspend: "علِق"
|
suspend: "علِق"
|
||||||
deleteDriveFile: "حُذف الملف"
|
|
||||||
deleteNote: "حُذفت الملاحظة"
|
|
||||||
createGlobalAnnouncement: "أُنشئ إعلان عام"
|
|
||||||
createUserAnnouncement: "أُنشئ إعلان مستخدم"
|
|
||||||
updateGlobalAnnouncement: "حُدث إعلان عام"
|
|
||||||
updateUserAnnouncement: "حُدث إعلان مستخدم"
|
|
||||||
resetPassword: "أعد تعيين كلمتك السرية"
|
resetPassword: "أعد تعيين كلمتك السرية"
|
||||||
createInvitation: "ولِّد دعوة"
|
|
||||||
_reversi:
|
|
||||||
total: "المجموع"
|
|
||||||
lookingForPlayer: "يبحث عن خصم..."
|
|
||||||
gameCanceled: "أُلغيت اللعبة."
|
|
||||||
opponentHasSettingsChanged: "غيَر الخصم إعدادته."
|
|
||||||
showBoardLabels: "اعرض ترقيم الصفوف والأعمدة على اللوح"
|
|
||||||
useAvatarAsStone: "حوَل الحجارة إلى صور مستخدمين"
|
|
||||||
_offlineScreen:
|
|
||||||
title: "غير متصل - يتعذر الاتصال بالخادم"
|
|
||||||
header: "يتعذر الاتصال بالخادم"
|
|
||||||
_remoteLookupErrors:
|
|
||||||
_noSuchObject:
|
|
||||||
title: "غير موجود"
|
|
||||||
_search:
|
|
||||||
searchScopeAll: "الكل"
|
|
||||||
searchScopeLocal: "المحلي"
|
|
||||||
searchScopeUser: "مستخدم محدد"
|
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
_lang_: "বাংলা"
|
_lang_: "বাংলা"
|
||||||
headlineMisskey: "নোট ব্যাবহার করে সংযুক্ত নেটওয়ার্ক"
|
headlineMisskey: "নোট ব্যাবহার করে সংযুক্ত নেটওয়ার্ক"
|
||||||
introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা। \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন 📡\n\"রিঅ্যাকশন\" গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন 👍\nএকটি নতুন দুনিয়া ঘুরে দেখুন 🚀\n"
|
introMisskey: "স্বাগতম! মিসকি একটি ওপেন সোর্স, ডিসেন্ট্রালাইজড মাইক্রোব্লগিং পরিষেবা। \n\"নোট\" তৈরির মাধ্যমে যা ঘটছে তা সবার সাথে শেয়ার করুন 📡\n\"রিঅ্যাকশন\" গুলির মাধ্যমে যেকোনো নোট সম্পর্কে আপনার অনুভূতি ব্যাক্ত করতে পারেন 👍\nএকটি নতুন দুনিয়া ঘুরে দেখুন 🚀\n"
|
||||||
poweredByMisskeyDescription: "{name} হল ওপেন সোর্স প্ল্যাটফর্ম <b>Misskey</b>-এর সার্ভারগুলির একটি৷"
|
|
||||||
monthAndDay: "{day}/{month}"
|
monthAndDay: "{day}/{month}"
|
||||||
search: "খুঁজুন"
|
search: "খুঁজুন"
|
||||||
notifications: "বিজ্ঞপ্তি"
|
notifications: "বিজ্ঞপ্তি"
|
||||||
|
@ -13,14 +12,12 @@ fetchingAsApObject: "ফেডিভার্স থেকে খবর আন
|
||||||
ok: "ঠিক"
|
ok: "ঠিক"
|
||||||
gotIt: "বুঝেছি"
|
gotIt: "বুঝেছি"
|
||||||
cancel: "বাতিল"
|
cancel: "বাতিল"
|
||||||
noThankYou: "না, ধন্যবাদ"
|
|
||||||
enterUsername: "ইউজারনেম লিখুন"
|
enterUsername: "ইউজারনেম লিখুন"
|
||||||
renotedBy: "{user} রিনোট করেছেন"
|
renotedBy: "{user} রিনোট করেছেন"
|
||||||
noNotes: "কোন নোট নেই"
|
noNotes: "কোন নোট নেই"
|
||||||
noNotifications: "কোনো বিজ্ঞপ্তি নেই"
|
noNotifications: "কোনো বিজ্ঞপ্তি নেই"
|
||||||
instance: "ইন্সট্যান্স"
|
instance: "ইন্সট্যান্স"
|
||||||
settings: "সেটিংস"
|
settings: "সেটিংস"
|
||||||
notificationSettings: "বিজ্ঞপ্তির সেটিংস"
|
|
||||||
basicSettings: "সাধারণ সেটিংস"
|
basicSettings: "সাধারণ সেটিংস"
|
||||||
otherSettings: "অন্যান্য সেটিংস"
|
otherSettings: "অন্যান্য সেটিংস"
|
||||||
openInWindow: "নতুন উইন্ডোতে খুলা"
|
openInWindow: "নতুন উইন্ডোতে খুলা"
|
||||||
|
@ -45,20 +42,12 @@ pin: "পিন করা"
|
||||||
unpin: "পিন সরান"
|
unpin: "পিন সরান"
|
||||||
copyContent: "বিষয়বস্তু কপি করুন"
|
copyContent: "বিষয়বস্তু কপি করুন"
|
||||||
copyLink: "লিঙ্ক কপি করুন"
|
copyLink: "লিঙ্ক কপি করুন"
|
||||||
copyLinkRenote: "রিনোট লিঙ্ক কপি করুন"
|
|
||||||
delete: "মুছুন"
|
delete: "মুছুন"
|
||||||
deleteAndEdit: "মুছুন এবং সম্পাদনা করুন"
|
deleteAndEdit: "মুছুন এবং সম্পাদনা করুন"
|
||||||
deleteAndEditConfirm: "আপনি কি এই নোটটি মুছে এটি সম্পাদনা করার বিষয়ে নিশ্চিত? আপনি এটির সমস্ত রিঅ্যাকশন, রিনোট এবং জবাব হারাবেন।"
|
deleteAndEditConfirm: "আপনি কি এই নোটটি মুছে এটি সম্পাদনা করার বিষয়ে নিশ্চিত? আপনি এটির সমস্ত রিঅ্যাকশন, রিনোট এবং জবাব হারাবেন।"
|
||||||
addToList: "লিস্ট এ যোগ করুন"
|
addToList: "লিস্ট এ যোগ করুন"
|
||||||
addToAntenna: "অ্যান্টেনা এ যোগ করুন"
|
|
||||||
sendMessage: "একটি বার্তা পাঠান"
|
sendMessage: "একটি বার্তা পাঠান"
|
||||||
copyRSS: "RSS কপি করুন"
|
|
||||||
copyUsername: "ব্যবহারকারীর নাম কপি করুন"
|
copyUsername: "ব্যবহারকারীর নাম কপি করুন"
|
||||||
copyUserId: "ব্যবহারকারীর ID কপি করুন"
|
|
||||||
copyNoteId: "নোটের ID কপি করুন"
|
|
||||||
copyFileId: "ফাইল ID কপি করুন"
|
|
||||||
copyFolderId: "ফোল্ডার ID কপি করুন"
|
|
||||||
copyProfileUrl: "প্রোফাইল URL কপি করুন"
|
|
||||||
searchUser: "ব্যবহারকারী খুঁজুন..."
|
searchUser: "ব্যবহারকারী খুঁজুন..."
|
||||||
reply: "জবাব"
|
reply: "জবাব"
|
||||||
loadMore: "আরও দেখুন"
|
loadMore: "আরও দেখুন"
|
||||||
|
@ -111,8 +100,6 @@ renoted: "রিনোট করা হয়েছে"
|
||||||
cantRenote: "এই নোটটি রিনোট করা যাবে না।"
|
cantRenote: "এই নোটটি রিনোট করা যাবে না।"
|
||||||
cantReRenote: "রিনোটকে রিনোট করা যাবে না।"
|
cantReRenote: "রিনোটকে রিনোট করা যাবে না।"
|
||||||
quote: "উদ্ধৃতি"
|
quote: "উদ্ধৃতি"
|
||||||
inChannelRenote: "চ্যানেলে রিনোট"
|
|
||||||
inChannelQuote: "চ্যানেলে উদ্ধৃতি"
|
|
||||||
pinnedNote: "পিন করা নোট"
|
pinnedNote: "পিন করা নোট"
|
||||||
pinned: "পিন করা"
|
pinned: "পিন করা"
|
||||||
you: "আপনি"
|
you: "আপনি"
|
||||||
|
@ -121,10 +108,7 @@ sensitive: "সংবেদনশীল বিষয়বস্তু"
|
||||||
add: "যুক্ত করুন"
|
add: "যুক্ত করুন"
|
||||||
reaction: "প্রতিক্রিয়া"
|
reaction: "প্রতিক্রিয়া"
|
||||||
reactions: "প্রতিক্রিয়া"
|
reactions: "প্রতিক্রিয়া"
|
||||||
emojiPicker: "ইমোজি পিকার"
|
reactionSetting: "রিঅ্যাকশন পিকারে যেসকল প্রতিক্রিয়া দেখানো হবে"
|
||||||
pinnedEmojisForReactionSettingDescription: "রিঅ্যাকশন দেয়ার সময় আপনি ইমোজিটিকে পিন করা এবং প্রদর্শিত হওয়ার জন্য সেট করতে পারেন।"
|
|
||||||
pinnedEmojisSettingDescription: "ইমোজি ইনপুট দেয়ার সময় আপনি ইমোজিটিকে পিন করা এবং প্রদর্শিত হওয়ার জন্য সেট করতে পারেন।"
|
|
||||||
emojiPickerDisplay: "পিকার ডিসপ্লে"
|
|
||||||
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
|
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
|
||||||
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
|
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
|
||||||
attachCancel: "অ্যাটাচমেন্ট সরান "
|
attachCancel: "অ্যাটাচমেন্ট সরান "
|
||||||
|
@ -215,6 +199,7 @@ noUsers: "কোন ব্যাবহারকারী নেই"
|
||||||
editProfile: "প্রোফাইল সম্পাদনা করুন"
|
editProfile: "প্রোফাইল সম্পাদনা করুন"
|
||||||
noteDeleteConfirm: "আপনি কি নোট ডিলিট করার ব্যাপারে নিশ্চিত?"
|
noteDeleteConfirm: "আপনি কি নোট ডিলিট করার ব্যাপারে নিশ্চিত?"
|
||||||
pinLimitExceeded: "আপনি আর কোন নোট পিন করতে পারবেন না"
|
pinLimitExceeded: "আপনি আর কোন নোট পিন করতে পারবেন না"
|
||||||
|
intro: "Misskey এর ইন্সটলেশন সম্পন্ন হয়েছে!দয়া করে অ্যাডমিন ইউজার তৈরি করুন।"
|
||||||
done: "সম্পন্ন"
|
done: "সম্পন্ন"
|
||||||
processing: "প্রক্রিয়াধীন..."
|
processing: "প্রক্রিয়াধীন..."
|
||||||
preview: "পূর্বরূপ দেখুন"
|
preview: "পূর্বরূপ দেখুন"
|
||||||
|
@ -251,6 +236,7 @@ removeAreYouSure: "আপনি কি \"{x}\" সরানোর ব্যা
|
||||||
deleteAreYouSure: "আপনি কি \"{x}\" সরানোর ব্যাপারে নিশ্চিত?"
|
deleteAreYouSure: "আপনি কি \"{x}\" সরানোর ব্যাপারে নিশ্চিত?"
|
||||||
resetAreYouSure: "রিসেট করার ব্যাপারে নিশ্চিত?"
|
resetAreYouSure: "রিসেট করার ব্যাপারে নিশ্চিত?"
|
||||||
saved: "সংরক্ষিত হয়েছে"
|
saved: "সংরক্ষিত হয়েছে"
|
||||||
|
messaging: "চ্যাট"
|
||||||
upload: "আপলোড"
|
upload: "আপলোড"
|
||||||
keepOriginalUploading: "আসল ছবি রাখুন"
|
keepOriginalUploading: "আসল ছবি রাখুন"
|
||||||
keepOriginalUploadingDescription: "ছবিটি আপলোড করার সময় আসল সংস্করণটি রাখুন। অপশনটি বন্ধ থাকলে, আপলোডের সময় ওয়েব প্রকাশনার জন্য ছবি ব্রাউজারে তৈরি করা হবে।"
|
keepOriginalUploadingDescription: "ছবিটি আপলোড করার সময় আসল সংস্করণটি রাখুন। অপশনটি বন্ধ থাকলে, আপলোডের সময় ওয়েব প্রকাশনার জন্য ছবি ব্রাউজারে তৈরি করা হবে।"
|
||||||
|
@ -263,6 +249,7 @@ uploadFromUrlMayTakeTime: "URL হতে আপলোড হতে কিছু
|
||||||
explore: "ঘুরে দেখুন"
|
explore: "ঘুরে দেখুন"
|
||||||
messageRead: "পড়া"
|
messageRead: "পড়া"
|
||||||
noMoreHistory: "আর কোন ইতিহাস নেই"
|
noMoreHistory: "আর কোন ইতিহাস নেই"
|
||||||
|
startMessaging: "চ্যাট শুরু করুন"
|
||||||
nUsersRead: "{n} জন পড়েছেন"
|
nUsersRead: "{n} জন পড়েছেন"
|
||||||
agreeTo: "{0} এর প্রতি আমি সম্মত"
|
agreeTo: "{0} এর প্রতি আমি সম্মত"
|
||||||
start: "শুরু করুন"
|
start: "শুরু করুন"
|
||||||
|
@ -336,6 +323,7 @@ enableLocalTimeline: "স্থানীয় টাইমলাইন চাল
|
||||||
enableGlobalTimeline: "গ্লোবাল টাইমলাইন চালু করুন"
|
enableGlobalTimeline: "গ্লোবাল টাইমলাইন চালু করুন"
|
||||||
disablingTimelinesInfo: "আপনি এই টাইমলাইনগুলি বন্ধ করলেও প্রশাসক এবং মডারেটররা এই টাইমলাইনগুলি ব্যাবহার করতে পারবে"
|
disablingTimelinesInfo: "আপনি এই টাইমলাইনগুলি বন্ধ করলেও প্রশাসক এবং মডারেটররা এই টাইমলাইনগুলি ব্যাবহার করতে পারবে"
|
||||||
registration: "নিবন্ধন"
|
registration: "নিবন্ধন"
|
||||||
|
enableRegistration: "নতুন ব্যাবহারকারী নিবন্ধন চালু করুন"
|
||||||
invite: "আমন্ত্রণ"
|
invite: "আমন্ত্রণ"
|
||||||
driveCapacityPerLocalAccount: "প্রত্যেক স্থানীয় ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
driveCapacityPerLocalAccount: "প্রত্যেক স্থানীয় ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
||||||
driveCapacityPerRemoteAccount: "প্রত্যেক রিমোট ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
driveCapacityPerRemoteAccount: "প্রত্যেক রিমোট ব্যাবহারকারীর জন্য ড্রাইভের জায়গা"
|
||||||
|
@ -353,8 +341,6 @@ hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "hCaptcha চালু করুন"
|
enableHcaptcha: "hCaptcha চালু করুন"
|
||||||
hcaptchaSiteKey: "সাইট কী"
|
hcaptchaSiteKey: "সাইট কী"
|
||||||
hcaptchaSecretKey: "সিক্রেট কী"
|
hcaptchaSecretKey: "সিক্রেট কী"
|
||||||
mcaptchaSiteKey: "সাইট কী"
|
|
||||||
mcaptchaSecretKey: "সিক্রেট কী"
|
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "reCAPTCHA চালু করুন"
|
enableRecaptcha: "reCAPTCHA চালু করুন"
|
||||||
recaptchaSiteKey: "সাইট কী"
|
recaptchaSiteKey: "সাইট কী"
|
||||||
|
@ -407,6 +393,7 @@ share: "শেয়ার"
|
||||||
notFound: "পাওয়া যায়নি"
|
notFound: "পাওয়া যায়নি"
|
||||||
notFoundDescription: "এই URL-এর সাথে সম্পর্কিত কোনো পৃষ্ঠা নেই।"
|
notFoundDescription: "এই URL-এর সাথে সম্পর্কিত কোনো পৃষ্ঠা নেই।"
|
||||||
uploadFolder: "আপলোডের জন্য ডিফল্ট ফোল্ডার"
|
uploadFolder: "আপলোডের জন্য ডিফল্ট ফোল্ডার"
|
||||||
|
cacheClear: "ক্যাশ পরিষ্কার করুন"
|
||||||
markAsReadAllNotifications: "সমস্ত বিজ্ঞপ্তিগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
markAsReadAllNotifications: "সমস্ত বিজ্ঞপ্তিগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
||||||
markAsReadAllUnreadNotes: "সমস্ত নোটগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
markAsReadAllUnreadNotes: "সমস্ত নোটগুলি পঠিত হিসাবে চিহ্নিত করুন"
|
||||||
markAsReadAllTalkMessages: "সমস্ত মেসেজ পঠিত হিসাবে চিহ্নিত করুন"
|
markAsReadAllTalkMessages: "সমস্ত মেসেজ পঠিত হিসাবে চিহ্নিত করুন"
|
||||||
|
@ -424,6 +411,8 @@ retype: "পুনঃ প্রবেশ"
|
||||||
noteOf: "{user} এর নোট"
|
noteOf: "{user} এর নোট"
|
||||||
quoteAttached: "উদ্ধৃত"
|
quoteAttached: "উদ্ধৃত"
|
||||||
quoteQuestion: "উদ্ধৃতি হিসাবে সংযুক্ত করবেন?"
|
quoteQuestion: "উদ্ধৃতি হিসাবে সংযুক্ত করবেন?"
|
||||||
|
noMessagesYet: "কোন মেসেজ নেই"
|
||||||
|
newMessageExists: "নতুন মেসেজ পেয়েছেন"
|
||||||
onlyOneFileCanBeAttached: "আপনি মেসেজের সাথে সর্বোচ্চ একটি ফাইল যুক্ত করতে পারবেন"
|
onlyOneFileCanBeAttached: "আপনি মেসেজের সাথে সর্বোচ্চ একটি ফাইল যুক্ত করতে পারবেন"
|
||||||
signinRequired: "দয়া করে লগ ইন করুন"
|
signinRequired: "দয়া করে লগ ইন করুন"
|
||||||
invitations: "আমন্ত্রণ"
|
invitations: "আমন্ত্রণ"
|
||||||
|
@ -445,6 +434,7 @@ or: "অথবা"
|
||||||
language: "ভাষা"
|
language: "ভাষা"
|
||||||
uiLanguage: "UI এর ভাষা"
|
uiLanguage: "UI এর ভাষা"
|
||||||
aboutX: "{x} সম্পর্কে"
|
aboutX: "{x} সম্পর্কে"
|
||||||
|
disableDrawer: "ড্রয়ার মেনু প্রদর্শন করবেন না"
|
||||||
noHistory: "কোনো ইতিহাস নেই"
|
noHistory: "কোনো ইতিহাস নেই"
|
||||||
signinHistory: "প্রবেশ করার ইতিহাস"
|
signinHistory: "প্রবেশ করার ইতিহাস"
|
||||||
doing: "প্রক্রিয়া করছে..."
|
doing: "প্রক্রিয়া করছে..."
|
||||||
|
@ -618,7 +608,10 @@ abuseReported: "আপনার অভিযোগটি দাখিল কর
|
||||||
reporter: "অভিযোগকারী"
|
reporter: "অভিযোগকারী"
|
||||||
reporteeOrigin: "অভিযোগটির উৎস"
|
reporteeOrigin: "অভিযোগটির উৎস"
|
||||||
reporterOrigin: "অভিযোগকারীর উৎস"
|
reporterOrigin: "অভিযোগকারীর উৎস"
|
||||||
|
forwardReport: "রিমোট ইন্সত্যান্সে অভিযোগটি পাঠান"
|
||||||
|
forwardReportIsAnonymous: "আপনার তথ্য রিমোট ইন্সত্যান্সে পাঠানো হবে না এবং একটি বেনামী সিস্টেম অ্যাকাউন্ট হিসাবে প্রদর্শিত হবে।"
|
||||||
send: "পাঠান"
|
send: "পাঠান"
|
||||||
|
abuseMarkAsResolved: "অভিযোগটিকে সমাধাকৃত হিসাবে চিহ্নিত করুন"
|
||||||
openInNewTab: "নতুন ট্যাবে খুলুন"
|
openInNewTab: "নতুন ট্যাবে খুলুন"
|
||||||
openInSideView: "সাইড ভিউতে খুলুন"
|
openInSideView: "সাইড ভিউতে খুলুন"
|
||||||
defaultNavigationBehaviour: "ডিফল্ট নেভিগেশন"
|
defaultNavigationBehaviour: "ডিফল্ট নেভিগেশন"
|
||||||
|
@ -672,6 +665,7 @@ experimentalFeatures: "পরীক্ষামূলক বৈশিষ্ট
|
||||||
developer: "ডেভেলপার"
|
developer: "ডেভেলপার"
|
||||||
makeExplorable: "অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় দেখান"
|
makeExplorable: "অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় দেখান"
|
||||||
makeExplorableDescription: "আপনি এটি বন্ধ করলে, আপনার অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় প্রদর্শিত হবে না।"
|
makeExplorableDescription: "আপনি এটি বন্ধ করলে, আপনার অ্যাকাউন্ট \"ঘুরে দেখুন\" পৃষ্ঠায় প্রদর্শিত হবে না।"
|
||||||
|
showGapBetweenNotesInTimeline: "টাইমলাইন এবং নোটের মাঝে ফাকা জায়গা রাখুন"
|
||||||
duplicate: "প্রতিরূপ"
|
duplicate: "প্রতিরূপ"
|
||||||
left: "বাম"
|
left: "বাম"
|
||||||
center: "মাঝখান"
|
center: "মাঝখান"
|
||||||
|
@ -801,6 +795,8 @@ makeReactionsPublicDescription: "আপনার পূর্ববর্তী
|
||||||
classic: "ক্লাসিক"
|
classic: "ক্লাসিক"
|
||||||
muteThread: "থ্রেড মিউট করুন"
|
muteThread: "থ্রেড মিউট করুন"
|
||||||
unmuteThread: "থ্রেড আনমিউট করুন"
|
unmuteThread: "থ্রেড আনমিউট করুন"
|
||||||
|
ffVisibility: "অনুসরণ/অনুসরণকারীদের দৃশ্যমান্যতা"
|
||||||
|
ffVisibilityDescription: "আপনি কাকে অনুসরণ করেন এবং কে আপনাকে অনুসরণ করে, সেটা কারা দেখতে পাবে তা নির্ধারণ করে।"
|
||||||
continueThread: "আরো থ্রেড দেখুন"
|
continueThread: "আরো থ্রেড দেখুন"
|
||||||
deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?"
|
deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?"
|
||||||
incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।"
|
incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।"
|
||||||
|
@ -844,20 +840,7 @@ youFollowing: "অনুসরণ করা হচ্ছে"
|
||||||
icon: "প্রোফাইল ছবি"
|
icon: "প্রোফাইল ছবি"
|
||||||
replies: "জবাব"
|
replies: "জবাব"
|
||||||
renotes: "রিনোট"
|
renotes: "রিনোট"
|
||||||
sourceCode: "সোর্স কোড"
|
|
||||||
flip: "উল্টান"
|
flip: "উল্টান"
|
||||||
postForm: "নোট লিখুন"
|
|
||||||
information: "আপনার সম্পর্কে"
|
|
||||||
_chat:
|
|
||||||
invitations: "আমন্ত্রণ"
|
|
||||||
noHistory: "কোনো ইতিহাস নেই"
|
|
||||||
members: "সদস্যবৃন্দ"
|
|
||||||
home: "মূল পাতা"
|
|
||||||
send: "পাঠান"
|
|
||||||
_delivery:
|
|
||||||
stop: "স্থগিত করা হয়েছে"
|
|
||||||
_type:
|
|
||||||
none: "প্রকাশ করা হচ্ছে"
|
|
||||||
_role:
|
_role:
|
||||||
priority: "অগ্রাধিকার"
|
priority: "অগ্রাধিকার"
|
||||||
_priority:
|
_priority:
|
||||||
|
@ -996,6 +979,7 @@ _theme:
|
||||||
header: "হেডার"
|
header: "হেডার"
|
||||||
navBg: "সাইডবারের পটভূমি"
|
navBg: "সাইডবারের পটভূমি"
|
||||||
navFg: "সাইডবারের পাঠ্য"
|
navFg: "সাইডবারের পাঠ্য"
|
||||||
|
navHoverFg: "সাইডবারের পাঠ্য (হভার)"
|
||||||
navActive: "সাইডবারের পাঠ্য (অ্যাকটিভ)"
|
navActive: "সাইডবারের পাঠ্য (অ্যাকটিভ)"
|
||||||
navIndicator: "সাইডবারের ইনডিকেটর"
|
navIndicator: "সাইডবারের ইনডিকেটর"
|
||||||
link: "লিংক"
|
link: "লিংক"
|
||||||
|
@ -1017,13 +1001,20 @@ _theme:
|
||||||
buttonBg: "বাটনের পটভূমি"
|
buttonBg: "বাটনের পটভূমি"
|
||||||
buttonHoverBg: "বাটনের পটভূমি (হভার)"
|
buttonHoverBg: "বাটনের পটভূমি (হভার)"
|
||||||
inputBorder: "ইনপুট ফিল্ডের বর্ডার"
|
inputBorder: "ইনপুট ফিল্ডের বর্ডার"
|
||||||
|
listItemHoverBg: "লিস্ট আইটেমের পটভূমি (হোভার)"
|
||||||
|
driveFolderBg: "ড্রাইভ ফোল্ডারের পটভূমি"
|
||||||
|
wallpaperOverlay: "ওয়ালপেপার ওভারলে"
|
||||||
badge: "ব্যাজ"
|
badge: "ব্যাজ"
|
||||||
messageBg: "চ্যাটের পটভূমি"
|
messageBg: "চ্যাটের পটভূমি"
|
||||||
|
accentDarken: "অ্যাকসেন্ট (গাঢ়)"
|
||||||
|
accentLighten: "অ্যাকসেন্ট (হাল্কা)"
|
||||||
fgHighlighted: "হাইলাইট করা পাঠ্য"
|
fgHighlighted: "হাইলাইট করা পাঠ্য"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "নোটগুলি"
|
note: "নোটগুলি"
|
||||||
noteMy: "নোট (আপনার)"
|
noteMy: "নোট (আপনার)"
|
||||||
notification: "বিজ্ঞপ্তি"
|
notification: "বিজ্ঞপ্তি"
|
||||||
|
antenna: "অ্যান্টেনাগুলি"
|
||||||
|
channel: "চ্যানেলের বিজ্ঞপ্তি"
|
||||||
_ago:
|
_ago:
|
||||||
future: "ভবিষ্যৎ"
|
future: "ভবিষ্যৎ"
|
||||||
justNow: "এইমাত্র"
|
justNow: "এইমাত্র"
|
||||||
|
@ -1047,7 +1038,6 @@ _2fa:
|
||||||
step3: "অ্যাপে প্রদর্শিত টোকেনটি লিখুন এবং আপনার কাজ শেষ।"
|
step3: "অ্যাপে প্রদর্শিত টোকেনটি লিখুন এবং আপনার কাজ শেষ।"
|
||||||
step4: "আপনাকে এখন থেকে লগ ইন করার সময়, এইভাবে টোকেন লিখতে হবে।"
|
step4: "আপনাকে এখন থেকে লগ ইন করার সময়, এইভাবে টোকেন লিখতে হবে।"
|
||||||
securityKeyInfo: "আপনি একটি হার্ডওয়্যার সিকিউরিটি কী ব্যবহার করে লগ ইন করতে পারেন যা FIDO2 বা ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর বা পিন সমর্থন করে৷"
|
securityKeyInfo: "আপনি একটি হার্ডওয়্যার সিকিউরিটি কী ব্যবহার করে লগ ইন করতে পারেন যা FIDO2 বা ডিভাইসের ফিঙ্গারপ্রিন্ট সেন্সর বা পিন সমর্থন করে৷"
|
||||||
renewTOTPCancel: "না, ধন্যবাদ"
|
|
||||||
_permissions:
|
_permissions:
|
||||||
"read:account": "অ্যাকাউন্টের তথ্য দেখুন"
|
"read:account": "অ্যাকাউন্টের তথ্য দেখুন"
|
||||||
"write:account": "অ্যাকাউন্টের তথ্য সম্পাদন করুন"
|
"write:account": "অ্যাকাউন্টের তথ্য সম্পাদন করুন"
|
||||||
|
@ -1081,7 +1071,6 @@ _permissions:
|
||||||
"write:gallery": "গ্যালারী সম্পাদনা করুন"
|
"write:gallery": "গ্যালারী সম্পাদনা করুন"
|
||||||
"read:gallery-likes": "গ্যালারীর পছন্দগুলি দেখুন"
|
"read:gallery-likes": "গ্যালারীর পছন্দগুলি দেখুন"
|
||||||
"write:gallery-likes": "গ্যালারীর পছন্দগুলি সম্পাদনা করুন"
|
"write:gallery-likes": "গ্যালারীর পছন্দগুলি সম্পাদনা করুন"
|
||||||
"write:chat": "চ্যাটগুলি সম্পাদনা করুন"
|
|
||||||
_auth:
|
_auth:
|
||||||
shareAccess: "\"{name}\" কে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"
|
shareAccess: "\"{name}\" কে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"
|
||||||
shareAccessAsk: "অ্যাপ্লিকেশনটিকে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"
|
shareAccessAsk: "অ্যাপ্লিকেশনটিকে অ্যাকাউন্টের অ্যাক্সেস দিবেন?"
|
||||||
|
@ -1187,7 +1176,6 @@ _profile:
|
||||||
changeBanner: "ব্যানার পরিবর্তন করুন"
|
changeBanner: "ব্যানার পরিবর্তন করুন"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "সকল নোট"
|
allNotes: "সকল নোট"
|
||||||
clips: "ক্লিপ"
|
|
||||||
followingList: "অনুসরণ করা হচ্ছে"
|
followingList: "অনুসরণ করা হচ্ছে"
|
||||||
muteList: "মিউট"
|
muteList: "মিউট"
|
||||||
blockingList: "ব্লক"
|
blockingList: "ব্লক"
|
||||||
|
@ -1235,6 +1223,9 @@ _pages:
|
||||||
newPage: "নতুন পৃষ্ঠা বানান"
|
newPage: "নতুন পৃষ্ঠা বানান"
|
||||||
editPage: "পৃষ্ঠাটি সম্পাদনা করুন"
|
editPage: "পৃষ্ঠাটি সম্পাদনা করুন"
|
||||||
readPage: "উৎস দেখছেন"
|
readPage: "উৎস দেখছেন"
|
||||||
|
created: "পৃষ্ঠা তৈরি করা হয়েছে"
|
||||||
|
updated: "পৃষ্ঠা সম্পাদনা করা হয়েছে"
|
||||||
|
deleted: "পৃষ্ঠা মুছে ফেলা হয়েছে"
|
||||||
pageSetting: "পৃষ্ঠার সেটিংস"
|
pageSetting: "পৃষ্ঠার সেটিংস"
|
||||||
nameAlreadyExists: "পৃষ্ঠার URLটি ইতিমধ্যেই ব্যাবহার করা হয়েছে"
|
nameAlreadyExists: "পৃষ্ঠার URLটি ইতিমধ্যেই ব্যাবহার করা হয়েছে"
|
||||||
invalidNameTitle: "পৃষ্ঠার URL অবৈধ"
|
invalidNameTitle: "পৃষ্ঠার URL অবৈধ"
|
||||||
|
@ -1303,7 +1294,6 @@ _notification:
|
||||||
pollEnded: "পোল শেষ"
|
pollEnded: "পোল শেষ"
|
||||||
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
|
receiveFollowRequest: "প্রাপ্ত অনুসরণের অনুরোধসমূহ"
|
||||||
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
|
followRequestAccepted: "গৃহীত অনুসরণের অনুরোধসমূহ"
|
||||||
login: "প্রবেশ করুন"
|
|
||||||
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
|
app: "লিঙ্ক করা অ্যাপ থেকে বিজ্ঞপ্তি"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "ফলো ব্যাক করেছে"
|
followBack: "ফলো ব্যাক করেছে"
|
||||||
|
@ -1334,18 +1324,6 @@ _deck:
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
name: "নাম"
|
name: "নাম"
|
||||||
active: "চালু"
|
active: "চালু"
|
||||||
_abuseReport:
|
|
||||||
_notificationRecipient:
|
|
||||||
_recipientType:
|
|
||||||
mail: "ইমেইল"
|
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
suspend: "স্থগিত করা"
|
suspend: "স্থগিত করা"
|
||||||
resetPassword: "পাসওয়ার্ড রিসেট করুন"
|
resetPassword: "পাসওয়ার্ড রিসেট করুন"
|
||||||
_reversi:
|
|
||||||
total: "মোট"
|
|
||||||
_remoteLookupErrors:
|
|
||||||
_noSuchObject:
|
|
||||||
title: "পাওয়া যায়নি"
|
|
||||||
_search:
|
|
||||||
searchScopeAll: "সবগুলো"
|
|
||||||
searchScopeLocal: "স্থানীয়"
|
|
||||||
|
|
2790
locales/ca-ES.yml
2790
locales/ca-ES.yml
File diff suppressed because it is too large
Load diff
|
@ -1,17 +1,13 @@
|
||||||
---
|
---
|
||||||
_lang_: "Čeština"
|
_lang_: "Čeština"
|
||||||
headlineMisskey: "Síť propojená poznámkami"
|
headlineMisskey: "Síť propojená poznámkami"
|
||||||
introMisskey: "Vítejte! Misskey je otevřená a decentralizovaná microblogovací služba.\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! 🚀"
|
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! 🚀"
|
||||||
poweredByMisskeyDescription: "{name} je jeden ze serverů využívající open source platformu <b>Misskey<b> (nazývaná \"Misskey instance\")."
|
poweredByMisskeyDescription: "{name} je jeden ze serverů využívající open source platformu <b>Misskey<b> (nazývaná \"Misskey instance\")."
|
||||||
monthAndDay: "{day}. {month}."
|
monthAndDay: "{day}. {month}."
|
||||||
search: "Vyhledávání"
|
search: "Vyhledávání"
|
||||||
reset: "Obnovit"
|
|
||||||
notifications: "Oznámení"
|
notifications: "Oznámení"
|
||||||
username: "Uživatelské jméno"
|
username: "Uživatelské jméno"
|
||||||
password: "Heslo"
|
password: "Heslo"
|
||||||
initialPasswordForSetup: "Počáteční heslo pro nastavení"
|
|
||||||
initialPasswordIsIncorrect: "Počáteční heslo pro nastavení je nesprávné"
|
|
||||||
initialPasswordForSetupDescription: "Použijte heslo, které jste nastavili v konfiguračním souboru, pokud jste Misskey instalovali ručně.\nPokud užíváte Misskey hostovací službu, použijte poskytnuté heslo.\nPokud jste heslo nenastavovali, zanechte prázdné."
|
|
||||||
forgotPassword: "Zapomenuté heslo"
|
forgotPassword: "Zapomenuté heslo"
|
||||||
fetchingAsApObject: "Načítám data z Fediversu..."
|
fetchingAsApObject: "Načítám data z Fediversu..."
|
||||||
ok: "Potvrdit"
|
ok: "Potvrdit"
|
||||||
|
@ -19,7 +15,7 @@ gotIt: "Rozumím!"
|
||||||
cancel: "Zrušit"
|
cancel: "Zrušit"
|
||||||
noThankYou: "Ne děkuji"
|
noThankYou: "Ne děkuji"
|
||||||
enterUsername: "Zadej uživatelské jméno"
|
enterUsername: "Zadej uživatelské jméno"
|
||||||
renotedBy: "{user} přeposlal*a"
|
renotedBy: "{user} přeposla/a"
|
||||||
noNotes: "Žádné poznámky"
|
noNotes: "Žádné poznámky"
|
||||||
noNotifications: "Žádná oznámení"
|
noNotifications: "Žádná oznámení"
|
||||||
instance: "Instance"
|
instance: "Instance"
|
||||||
|
@ -49,8 +45,6 @@ pin: "Připnout"
|
||||||
unpin: "Odepnout"
|
unpin: "Odepnout"
|
||||||
copyContent: "Zkopírovat obsah"
|
copyContent: "Zkopírovat obsah"
|
||||||
copyLink: "Kopírovat odkaz"
|
copyLink: "Kopírovat odkaz"
|
||||||
copyRemoteLink: "Zkoprírovat vzdálený odkaz"
|
|
||||||
copyLinkRenote: "Zkopírovat odkaz renotu"
|
|
||||||
delete: "Smazat"
|
delete: "Smazat"
|
||||||
deleteAndEdit: "Smazat a upravit"
|
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."
|
||||||
|
@ -65,7 +59,6 @@ copyFileId: "Kopírovat ID souboru"
|
||||||
copyFolderId: "Kopírovat ID složky"
|
copyFolderId: "Kopírovat ID složky"
|
||||||
copyProfileUrl: "Kopírovat URL profilu"
|
copyProfileUrl: "Kopírovat URL profilu"
|
||||||
searchUser: "Vyhledat uživatele"
|
searchUser: "Vyhledat uživatele"
|
||||||
searchThisUsersNotes: "Prohledat poznámky uživatele"
|
|
||||||
reply: "Odpovědět"
|
reply: "Odpovědět"
|
||||||
loadMore: "Zobrazit více"
|
loadMore: "Zobrazit více"
|
||||||
showMore: "Zobrazit více"
|
showMore: "Zobrazit více"
|
||||||
|
@ -127,6 +120,7 @@ sensitive: "NSFW"
|
||||||
add: "Přidat"
|
add: "Přidat"
|
||||||
reaction: "Reakce"
|
reaction: "Reakce"
|
||||||
reactions: "Reakce"
|
reactions: "Reakce"
|
||||||
|
reactionSetting: "Reakce zobrazené ve výběru reakcí"
|
||||||
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"
|
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
|
||||||
attachCancel: "Odstranit přílohu"
|
attachCancel: "Odstranit přílohu"
|
||||||
|
@ -175,9 +169,6 @@ addAccount: "Přidat účet"
|
||||||
reloadAccountsList: "Obnovit list účtů"
|
reloadAccountsList: "Obnovit list účtů"
|
||||||
loginFailed: "Přihlášení se nezdařilo."
|
loginFailed: "Přihlášení se nezdařilo."
|
||||||
showOnRemote: "Více na původním profilu"
|
showOnRemote: "Více na původním profilu"
|
||||||
continueOnRemote: "Pokračujte na původní profil"
|
|
||||||
chooseServerOnMisskeyHub: "Vyberete si server z Misskey Hubu"
|
|
||||||
inputHostName: "Zadejte doménu"
|
|
||||||
general: "Obecně"
|
general: "Obecně"
|
||||||
wallpaper: "Obrázek na pozadí"
|
wallpaper: "Obrázek na pozadí"
|
||||||
setWallpaper: "Nastavení obrázku na pozadí"
|
setWallpaper: "Nastavení obrázku na pozadí"
|
||||||
|
@ -202,7 +193,6 @@ perHour: "za hodinu"
|
||||||
perDay: "za den"
|
perDay: "za den"
|
||||||
stopActivityDelivery: "Přestat zasílat aktivitu"
|
stopActivityDelivery: "Přestat zasílat aktivitu"
|
||||||
blockThisInstance: "Blokovat tuto instanci"
|
blockThisInstance: "Blokovat tuto instanci"
|
||||||
silenceThisInstance: "Utišit tuto instanci"
|
|
||||||
operations: "Operace"
|
operations: "Operace"
|
||||||
software: "Software"
|
software: "Software"
|
||||||
version: "Verze"
|
version: "Verze"
|
||||||
|
@ -229,6 +219,7 @@ noUsers: "Žádní uživatelé"
|
||||||
editProfile: "Upravit můj profil"
|
editProfile: "Upravit můj profil"
|
||||||
noteDeleteConfirm: "Jste si jistí že chcete smazat tuhle poznámku?"
|
noteDeleteConfirm: "Jste si jistí že chcete smazat tuhle poznámku?"
|
||||||
pinLimitExceeded: "Nemůžete připnout další poznámky."
|
pinLimitExceeded: "Nemůžete připnout další poznámky."
|
||||||
|
intro: "Instalace Misskey byla dokončena! Prosím vytvořte admina."
|
||||||
done: "Hotovo"
|
done: "Hotovo"
|
||||||
processing: "Zpracovávám"
|
processing: "Zpracovávám"
|
||||||
preview: "Náhled"
|
preview: "Náhled"
|
||||||
|
@ -266,6 +257,7 @@ removeAreYouSure: "Jste si jistí že chcete smazat \"{x}\"?"
|
||||||
deleteAreYouSure: "Jste si jistí že chcete smazat \"{x}\"?"
|
deleteAreYouSure: "Jste si jistí že chcete smazat \"{x}\"?"
|
||||||
resetAreYouSure: "Opravdu resetovat?"
|
resetAreYouSure: "Opravdu resetovat?"
|
||||||
saved: "Uloženo"
|
saved: "Uloženo"
|
||||||
|
messaging: "Zprávy"
|
||||||
upload: "Nahrát soubory"
|
upload: "Nahrát soubory"
|
||||||
keepOriginalUploading: "Ponechat originální obrázek"
|
keepOriginalUploading: "Ponechat originální obrázek"
|
||||||
keepOriginalUploadingDescription: "Uloží původní nahraný obrázek jak je. Pokud je to vypnuté, vygeneruje se zobrazení verze na webu při nahrátí."
|
keepOriginalUploadingDescription: "Uloží původní nahraný obrázek jak je. Pokud je to vypnuté, vygeneruje se zobrazení verze na webu při nahrátí."
|
||||||
|
@ -278,6 +270,7 @@ uploadFromUrlMayTakeTime: "Může trvat nějakou dobu, dokud nebude dokončeno n
|
||||||
explore: "Objevovat"
|
explore: "Objevovat"
|
||||||
messageRead: "Přečtené"
|
messageRead: "Přečtené"
|
||||||
noMoreHistory: "To je vše"
|
noMoreHistory: "To je vše"
|
||||||
|
startMessaging: "Zahájit chat"
|
||||||
nUsersRead: "přečteno {n} uživateli"
|
nUsersRead: "přečteno {n} uživateli"
|
||||||
agreeTo: "Souhlasím s {0}"
|
agreeTo: "Souhlasím s {0}"
|
||||||
agree: "Souhlasím"
|
agree: "Souhlasím"
|
||||||
|
@ -356,6 +349,7 @@ enableLocalTimeline: "Povolit lokální čas"
|
||||||
enableGlobalTimeline: "Povolit globální čas"
|
enableGlobalTimeline: "Povolit globální čas"
|
||||||
disablingTimelinesInfo: "Administrátoři a Moderátoři budou mít stálý přístup ke všem časovým osám i přes to že nejsou zapnuté."
|
disablingTimelinesInfo: "Administrátoři a Moderátoři budou mít stálý přístup ke všem časovým osám i přes to že nejsou zapnuté."
|
||||||
registration: "Registrace"
|
registration: "Registrace"
|
||||||
|
enableRegistration: "Povolit registraci novým uživatelům"
|
||||||
invite: "Pozvat"
|
invite: "Pozvat"
|
||||||
driveCapacityPerLocalAccount: "Kapacita disku na lokálního uživatele"
|
driveCapacityPerLocalAccount: "Kapacita disku na lokálního uživatele"
|
||||||
driveCapacityPerRemoteAccount: "Kapacita disku na vzdáleného uživatele"
|
driveCapacityPerRemoteAccount: "Kapacita disku na vzdáleného uživatele"
|
||||||
|
@ -373,11 +367,6 @@ hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Aktivovat hCaptchu"
|
enableHcaptcha: "Aktivovat hCaptchu"
|
||||||
hcaptchaSiteKey: "Klíč stránky"
|
hcaptchaSiteKey: "Klíč stránky"
|
||||||
hcaptchaSecretKey: "Tajný Klíč (Secret Key)"
|
hcaptchaSecretKey: "Tajný Klíč (Secret Key)"
|
||||||
mcaptcha: "mCaptcha"
|
|
||||||
enableMcaptcha: "Aktivovat mCaptchu"
|
|
||||||
mcaptchaSiteKey: "Klíč stránky"
|
|
||||||
mcaptchaSecretKey: "Tajný Klíč (Secret Key)"
|
|
||||||
mcaptchaInstanceUrl: "URL mCaptcha serveru"
|
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "Zapnout ReCAPTCHu"
|
enableRecaptcha: "Zapnout ReCAPTCHu"
|
||||||
recaptchaSiteKey: "Klíč stránky"
|
recaptchaSiteKey: "Klíč stránky"
|
||||||
|
@ -439,6 +428,7 @@ share: "Sdílet"
|
||||||
notFound: "Nenalezeno"
|
notFound: "Nenalezeno"
|
||||||
notFoundDescription: "Nebyla nalezená žádná stránka korespondující se zadanou URL."
|
notFoundDescription: "Nebyla nalezená žádná stránka korespondující se zadanou URL."
|
||||||
uploadFolder: "Výchozí lokace pro upload"
|
uploadFolder: "Výchozí lokace pro upload"
|
||||||
|
cacheClear: "Vymazat cache"
|
||||||
markAsReadAllNotifications: "Označit všechna oznámení za přečtená"
|
markAsReadAllNotifications: "Označit všechna oznámení za přečtená"
|
||||||
markAsReadAllUnreadNotes: "Označit všechny příspěvky 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é"
|
markAsReadAllTalkMessages: "Označit všechny zprávy za přečtené"
|
||||||
|
@ -456,6 +446,8 @@ retype: "Zadejte znovu"
|
||||||
noteOf: "{user} poznámky"
|
noteOf: "{user} poznámky"
|
||||||
quoteAttached: "Citace"
|
quoteAttached: "Citace"
|
||||||
quoteQuestion: "Přiložit jako citaci?"
|
quoteQuestion: "Přiložit jako citaci?"
|
||||||
|
noMessagesYet: "Zatím tu nejsou žádné zprávy"
|
||||||
|
newMessageExists: "Máte novou zprávu"
|
||||||
onlyOneFileCanBeAttached: "Ke zprávě můžete přiložit jenom jeden soubor"
|
onlyOneFileCanBeAttached: "Ke zprávě můžete přiložit jenom jeden soubor"
|
||||||
signinRequired: "Přihlašte se, prosím"
|
signinRequired: "Přihlašte se, prosím"
|
||||||
invitations: "Pozvat"
|
invitations: "Pozvat"
|
||||||
|
@ -479,8 +471,7 @@ uiLanguage: "Jazyk uživatelského rozhraní"
|
||||||
aboutX: "O {x}"
|
aboutX: "O {x}"
|
||||||
emojiStyle: "Styl emoji"
|
emojiStyle: "Styl emoji"
|
||||||
native: "Výchozí"
|
native: "Výchozí"
|
||||||
style: "Vzhled"
|
disableDrawer: "Nepoužívat šuplíkové menu"
|
||||||
popup: "Vyskakovací okno"
|
|
||||||
showNoteActionsOnlyHover: "Zobrazit akce poznámky jenom při naběhnutí myši"
|
showNoteActionsOnlyHover: "Zobrazit akce poznámky jenom při naběhnutí myši"
|
||||||
noHistory: "Žádná historie"
|
noHistory: "Žádná historie"
|
||||||
signinHistory: "Historie přihlášení"
|
signinHistory: "Historie přihlášení"
|
||||||
|
@ -543,7 +534,6 @@ showInPage: "Zobrazit na stránce"
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
volume: "Hlasitost"
|
volume: "Hlasitost"
|
||||||
masterVolume: "Celková hlasitost"
|
masterVolume: "Celková hlasitost"
|
||||||
notUseSound: "Zakázat zvuk"
|
|
||||||
details: "Detaily"
|
details: "Detaily"
|
||||||
chooseEmoji: "Vybrat emotikon"
|
chooseEmoji: "Vybrat emotikon"
|
||||||
unableToProcess: "Operace nebyla dokončena."
|
unableToProcess: "Operace nebyla dokončena."
|
||||||
|
@ -668,7 +658,10 @@ abuseReported: "Nahlášení bylo odesláno. Děkujeme převelice."
|
||||||
reporter: "Nahlásil"
|
reporter: "Nahlásil"
|
||||||
reporteeOrigin: "Původ nahlášení"
|
reporteeOrigin: "Původ nahlášení"
|
||||||
reporterOrigin: "Původ nahlasovače"
|
reporterOrigin: "Původ nahlasovače"
|
||||||
|
forwardReport: "Přeposlat nahlášení do vzdálené instance"
|
||||||
|
forwardReportIsAnonymous: "Místo vašeho účtu se ve vzdálené instanci zobrazí anonymní systémový účet jako nahlašovač."
|
||||||
send: "Odeslat"
|
send: "Odeslat"
|
||||||
|
abuseMarkAsResolved: "Označit nahlášení jako vyřešené"
|
||||||
openInNewTab: "Otevřít v nové kartě"
|
openInNewTab: "Otevřít v nové kartě"
|
||||||
openInSideView: "Otevřít v bočním panelu"
|
openInSideView: "Otevřít v bočním panelu"
|
||||||
defaultNavigationBehaviour: "Výchozí chování navigace"
|
defaultNavigationBehaviour: "Výchozí chování navigace"
|
||||||
|
@ -726,6 +719,7 @@ thisIsExperimentalFeature: "Tohle je experimentální funkce. Její funkce se m
|
||||||
developer: "Vývojář"
|
developer: "Vývojář"
|
||||||
makeExplorable: "Udělat účet viditelný v \"Objevit\""
|
makeExplorable: "Udělat účet viditelný v \"Objevit\""
|
||||||
makeExplorableDescription: "Pokud tohle vypnete, tak se účet přestane zobrazovat v sekci \"Objevit\"."
|
makeExplorableDescription: "Pokud tohle vypnete, tak se účet přestane zobrazovat v sekci \"Objevit\"."
|
||||||
|
showGapBetweenNotesInTimeline: "Zobrazit mezeru mezi příspěvkama na časové ose"
|
||||||
duplicate: "Duplikovat"
|
duplicate: "Duplikovat"
|
||||||
left: "Vlevo"
|
left: "Vlevo"
|
||||||
center: "Uprostřed"
|
center: "Uprostřed"
|
||||||
|
@ -862,6 +856,8 @@ makeReactionsPublicDescription: "Tohle zviditelný seznam vašich předchozích
|
||||||
classic: "Klasický"
|
classic: "Klasický"
|
||||||
muteThread: "Ztlumit vlákno"
|
muteThread: "Ztlumit vlákno"
|
||||||
unmuteThread: "Zrušit ztlumení vlákna"
|
unmuteThread: "Zrušit ztlumení vlákna"
|
||||||
|
ffVisibility: "Viditelnost Sledovaných/Sledujících"
|
||||||
|
ffVisibilityDescription: "Umožní vám nastavit kdo uvidí koho sledujete a kdo vás sleduje."
|
||||||
continueThread: "Zobrazit pokračování vlákna"
|
continueThread: "Zobrazit pokračování vlákna"
|
||||||
deleteAccountConfirm: "Tohle nenávratně smaže váš účet, chcete pokračovat?"
|
deleteAccountConfirm: "Tohle nenávratně smaže váš účet, chcete pokračovat?"
|
||||||
incorrectPassword: "Nesprávné heslo."
|
incorrectPassword: "Nesprávné heslo."
|
||||||
|
@ -1011,7 +1007,6 @@ resetPasswordConfirm: "Opravdu chcete resetovat heslo?"
|
||||||
sensitiveWords: "Citlivá slova"
|
sensitiveWords: "Citlivá slova"
|
||||||
sensitiveWordsDescription: "Viditelnost všech poznámek obsahujících některé z nakonfigurovaných slov bude automaticky nastavena na \"Domů\". Můžete jich uvést více tak, že je oddělíte pomocí řádků."
|
sensitiveWordsDescription: "Viditelnost všech poznámek obsahujících některé z nakonfigurovaných slov bude automaticky nastavena na \"Domů\". Můžete jich uvést více tak, že je oddělíte pomocí řádků."
|
||||||
sensitiveWordsDescription2: "Použití mezer vytvoří výrazy AND a obklopení klíčových slov lomítky je změní na regulární výraz."
|
sensitiveWordsDescription2: "Použití mezer vytvoří výrazy AND a obklopení klíčových slov lomítky je změní na regulární výraz."
|
||||||
prohibitedWordsDescription2: "Použití mezer vytvoří výrazy AND a obklopení klíčových slov lomítky je změní na regulární výraz."
|
|
||||||
notesSearchNotAvailable: "Vyhledávání poznámek je nedostupné."
|
notesSearchNotAvailable: "Vyhledávání poznámek je nedostupné."
|
||||||
license: "Licence"
|
license: "Licence"
|
||||||
unfavoriteConfirm: "Opravdu chcete odstranit z oblíbených?"
|
unfavoriteConfirm: "Opravdu chcete odstranit z oblíbených?"
|
||||||
|
@ -1101,22 +1096,7 @@ iHaveReadXCarefullyAndAgree: "Přečetl jsem si text \"{x}\" a souhlasím s ním
|
||||||
icon: "Avatar"
|
icon: "Avatar"
|
||||||
replies: "Odpovědět"
|
replies: "Odpovědět"
|
||||||
renotes: "Přeposlat"
|
renotes: "Přeposlat"
|
||||||
sourceCode: "Zdrojový kód"
|
|
||||||
flip: "Otočit"
|
flip: "Otočit"
|
||||||
lastNDays: "Posledních {n} dnů"
|
|
||||||
surrender: "Zrušit"
|
|
||||||
postForm: "Formulář pro odeslání"
|
|
||||||
information: "Informace"
|
|
||||||
_chat:
|
|
||||||
invitations: "Pozvat"
|
|
||||||
noHistory: "Žádná historie"
|
|
||||||
members: "Členové"
|
|
||||||
home: "Domů"
|
|
||||||
send: "Odeslat"
|
|
||||||
_delivery:
|
|
||||||
stop: "Suspendováno"
|
|
||||||
_type:
|
|
||||||
none: "Publikuji"
|
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
accountCreated: "Váš účet byl úspěšně vytvořen!"
|
accountCreated: "Váš účet byl úspěšně vytvořen!"
|
||||||
letsStartAccountSetup: "Pro začátek si nastavte svůj profil."
|
letsStartAccountSetup: "Pro začátek si nastavte svůj profil."
|
||||||
|
@ -1129,6 +1109,7 @@ _initialAccountSetting:
|
||||||
pushNotificationDescription: "Povolení push oznámení vám umožní přijímat oznámení od {name} přímo ve vašem zařízení."
|
pushNotificationDescription: "Povolení push oznámení vám umožní přijímat oznámení od {name} přímo ve vašem zařízení."
|
||||||
initialAccountSettingCompleted: "Nastavení profilu dokončeno!"
|
initialAccountSettingCompleted: "Nastavení profilu dokončeno!"
|
||||||
haveFun: "Užívejte {name}!"
|
haveFun: "Užívejte {name}!"
|
||||||
|
ifYouNeedLearnMore: "Pokud se chcete dozvědět více o tom, jak používat {name} (Misskey), navštivte {link}."
|
||||||
skipAreYouSure: "Opravdu chcete přeskočit nastavení profilu?"
|
skipAreYouSure: "Opravdu chcete přeskočit nastavení profilu?"
|
||||||
laterAreYouSure: "Opravdu chcete provést nastavení profilu později?"
|
laterAreYouSure: "Opravdu chcete provést nastavení profilu později?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
|
@ -1625,6 +1606,7 @@ _theme:
|
||||||
header: "Nadpis"
|
header: "Nadpis"
|
||||||
navBg: "Pozadí postranního panelu"
|
navBg: "Pozadí postranního panelu"
|
||||||
navFg: "Text na postranním panelu"
|
navFg: "Text na postranním panelu"
|
||||||
|
navHoverFg: "Text na postranním panelu (Hover)"
|
||||||
navActive: "Text na postranním panelu (Aktivní)"
|
navActive: "Text na postranním panelu (Aktivní)"
|
||||||
navIndicator: "Indikátor na postranním panelu"
|
navIndicator: "Indikátor na postranním panelu"
|
||||||
link: "Odkaz"
|
link: "Odkaz"
|
||||||
|
@ -1646,13 +1628,20 @@ _theme:
|
||||||
buttonBg: "Pozadí tlačítka"
|
buttonBg: "Pozadí tlačítka"
|
||||||
buttonHoverBg: "Pozadí tlačítka (Hover)"
|
buttonHoverBg: "Pozadí tlačítka (Hover)"
|
||||||
inputBorder: "Ohraničení vstupního pole"
|
inputBorder: "Ohraničení vstupního pole"
|
||||||
|
listItemHoverBg: "Pozadí položky seznamu (Hover)"
|
||||||
|
driveFolderBg: "Pozadí složky disku"
|
||||||
|
wallpaperOverlay: "Překrytí tapety"
|
||||||
badge: "Odznak"
|
badge: "Odznak"
|
||||||
messageBg: "Pozadí chatu"
|
messageBg: "Pozadí chatu"
|
||||||
|
accentDarken: "Akcent (Ztmavený)"
|
||||||
|
accentLighten: "Akcent (Zesvětlený)"
|
||||||
fgHighlighted: "Zvýrazněný text"
|
fgHighlighted: "Zvýrazněný text"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Poznámky"
|
note: "Poznámky"
|
||||||
noteMy: "Moje poznámka"
|
noteMy: "Moje poznámka"
|
||||||
notification: "Oznámení"
|
notification: "Oznámení"
|
||||||
|
antenna: "Antény"
|
||||||
|
channel: "Oznámení kanálu"
|
||||||
_ago:
|
_ago:
|
||||||
future: "Budoucí"
|
future: "Budoucí"
|
||||||
justNow: "Teď"
|
justNow: "Teď"
|
||||||
|
@ -1669,11 +1658,22 @@ _time:
|
||||||
minute: "Minut"
|
minute: "Minut"
|
||||||
hour: "Hodin"
|
hour: "Hodin"
|
||||||
day: "Dnů"
|
day: "Dnů"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Jak používat Misskey"
|
||||||
|
step1_1: "Toto je \"časová osa\". Zde se chronologicky zobrazují všechny \"poznámky\" odeslané na {name}."
|
||||||
|
step1_2: "Existuje několik různých časových plánů. Například \"Domácí časová osa\" bude obsahovat poznámky uživatelů, které sledujete, a \"Místní časová osa\" bude obsahovat poznámky všech uživatelů {name}."
|
||||||
|
step2_1: "Zkusme zveřejnit poznámku. Můžete tak učinit stisknutím tlačítka s ikonou tužky."
|
||||||
|
step2_2: "Co takhle napsat sebepředstavení, nebo jen \"Ahoj {name}!\", pokud se vám nechce?"
|
||||||
|
step3_1: "Dokončil jsi svou první poznámku?"
|
||||||
|
step3_2: "Na časové ose by se nyní měla zobrazit vaše první poznámka."
|
||||||
|
step4_1: "K poznámkám můžete také připojit \"Reakce\"."
|
||||||
|
step4_2: "Chcete-li připojit reakci, stiskněte na poznámce znaménko \"+\" a vyberte emoji, kterým chcete reagovat."
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "Již jste zaregistrovali dvoufaktorové ověřovací zařízení."
|
alreadyRegistered: "Již jste zaregistrovali dvoufaktorové ověřovací zařízení."
|
||||||
registerTOTP: "Registrovat aplikaci autentizátoru"
|
registerTOTP: "Registrovat aplikaci autentizátoru"
|
||||||
step1: "Nejprve si do zařízení nainstalujte aplikaci pro ověřování (například {a} nebo {b})."
|
step1: "Nejprve si do zařízení nainstalujte aplikaci pro ověřování (například {a} nebo {b})."
|
||||||
step2: "Poté naskenujte QR kód zobrazený na této obrazovce."
|
step2: "Poté naskenujte QR kód zobrazený na této obrazovce."
|
||||||
|
step2Click: "Kliknutím na tento QR kód můžete zaregistrovat 2FA do bezpečnostního klíče nebo aplikace autentizace telefonu."
|
||||||
step3Title: "Zadejte ověřovací kód"
|
step3Title: "Zadejte ověřovací kód"
|
||||||
step3: "Pro dokončení nastavení zadejte token poskytnutý vaší aplikací."
|
step3: "Pro dokončení nastavení zadejte token poskytnutý vaší aplikací."
|
||||||
step4: "Od této chvíle budou všechny budoucí pokusy o přihlášení vyžadovat tento přihlašovací token."
|
step4: "Od této chvíle budou všechny budoucí pokusy o přihlášení vyžadovat tento přihlašovací token."
|
||||||
|
@ -1723,12 +1723,11 @@ _permissions:
|
||||||
"write:gallery": "Upravit galerii"
|
"write:gallery": "Upravit galerii"
|
||||||
"read:gallery-likes": "Zobrazit seznam to se mi líbí příspěvků v galerii"
|
"read:gallery-likes": "Zobrazit seznam to se mi líbí příspěvků v galerii"
|
||||||
"write:gallery-likes": "Upravit seznam to se mi líbí příspěvků v galerii"
|
"write:gallery-likes": "Upravit seznam to se mi líbí příspěvků v galerii"
|
||||||
"write:chat": "Sestavit nebo mazat zprávy chatu"
|
|
||||||
_auth:
|
_auth:
|
||||||
shareAccessTitle: "Udělovat oprávnění k aplikacím"
|
shareAccessTitle: "Udělovat oprávnění k aplikacím"
|
||||||
shareAccess: "Chcete autorizovat \"{name}\" pro přístup k tomuto účtu?"
|
shareAccess: "Chcete autorizovat \"{name}\" pro přístup k tomuto účtu?"
|
||||||
shareAccessAsk: "Opravdu chcete této aplikaci povolit přístup k vašemu účtu?"
|
shareAccessAsk: "Opravdu chcete této aplikaci povolit přístup k vašemu účtu?"
|
||||||
permission: "{name} požaduje tato oprávnění"
|
permission: "{jméno} požaduje tato oprávnění"
|
||||||
permissionAsk: "Tato aplikace požaduje následující oprávnění"
|
permissionAsk: "Tato aplikace požaduje následující oprávnění"
|
||||||
pleaseGoBack: "Vraťte se prosím zpět do aplikace"
|
pleaseGoBack: "Vraťte se prosím zpět do aplikace"
|
||||||
callback: "Návrat k aplikaci"
|
callback: "Návrat k aplikaci"
|
||||||
|
@ -1841,7 +1840,6 @@ _profile:
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Všechny poznámky"
|
allNotes: "Všechny poznámky"
|
||||||
favoritedNotes: "Oblíbené poznámky"
|
favoritedNotes: "Oblíbené poznámky"
|
||||||
clips: "Oříznout"
|
|
||||||
followingList: "Sledovaní"
|
followingList: "Sledovaní"
|
||||||
muteList: "Ztlumit"
|
muteList: "Ztlumit"
|
||||||
blockingList: "Zablokovat"
|
blockingList: "Zablokovat"
|
||||||
|
@ -1898,6 +1896,9 @@ _pages:
|
||||||
newPage: "Vytvořit novou stránku"
|
newPage: "Vytvořit novou stránku"
|
||||||
editPage: "Upravit stránku"
|
editPage: "Upravit stránku"
|
||||||
readPage: "Prohlížení zdroje této stránky"
|
readPage: "Prohlížení zdroje této stránky"
|
||||||
|
created: "Stránka byla úspěšně vytvořena"
|
||||||
|
updated: "Stránka byla úspěšně aktualizována"
|
||||||
|
deleted: "Stránka byla úspěšně smazána"
|
||||||
pageSetting: "Nastavení stránky"
|
pageSetting: "Nastavení stránky"
|
||||||
nameAlreadyExists: "Zadaná adresa URL stránky již existuje"
|
nameAlreadyExists: "Zadaná adresa URL stránky již existuje"
|
||||||
invalidNameTitle: "Zadaná adresa URL stránky je neplatná"
|
invalidNameTitle: "Zadaná adresa URL stránky je neplatná"
|
||||||
|
@ -1949,7 +1950,7 @@ _notification:
|
||||||
youGotMention: "{name} vás zmínil"
|
youGotMention: "{name} vás zmínil"
|
||||||
youGotReply: "{name} vám odpověděl"
|
youGotReply: "{name} vám odpověděl"
|
||||||
youGotQuote: "{name} vás citoval"
|
youGotQuote: "{name} vás citoval"
|
||||||
youRenoted: "Poznámka od {name}"
|
youRenoted: "Poznámka od {jméno}"
|
||||||
youWereFollowed: "Máte nového následovníka"
|
youWereFollowed: "Máte nového následovníka"
|
||||||
youReceivedFollowRequest: "Obdrželi jste žádost o sledování"
|
youReceivedFollowRequest: "Obdrželi jste žádost o sledování"
|
||||||
yourFollowRequestAccepted: "Vaše žádost o sledování byla přijata"
|
yourFollowRequestAccepted: "Vaše žádost o sledování byla přijata"
|
||||||
|
@ -1969,7 +1970,6 @@ _notification:
|
||||||
receiveFollowRequest: "Obdržené žádosti o sledování"
|
receiveFollowRequest: "Obdržené žádosti o sledování"
|
||||||
followRequestAccepted: "Přijaté žádosti o sledování"
|
followRequestAccepted: "Přijaté žádosti o sledování"
|
||||||
achievementEarned: "Úspěch odemčen"
|
achievementEarned: "Úspěch odemčen"
|
||||||
login: "Přihlásit se"
|
|
||||||
app: "Oznámení z propojených aplikací"
|
app: "Oznámení z propojených aplikací"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "vás začal sledovat zpět"
|
followBack: "vás začal sledovat zpět"
|
||||||
|
@ -2017,6 +2017,7 @@ _webhookSettings:
|
||||||
createWebhook: "Vytvořit Webhook"
|
createWebhook: "Vytvořit Webhook"
|
||||||
name: "Jméno"
|
name: "Jméno"
|
||||||
secret: "Tajné"
|
secret: "Tajné"
|
||||||
|
events: "Události Webhook"
|
||||||
active: "Zapnuto"
|
active: "Zapnuto"
|
||||||
_events:
|
_events:
|
||||||
follow: "Při sledování uživatele"
|
follow: "Při sledování uživatele"
|
||||||
|
@ -2026,20 +2027,7 @@ _webhookSettings:
|
||||||
renote: "Při renotaci poznámky"
|
renote: "Při renotaci poznámky"
|
||||||
reaction: "Při obdržení reakce"
|
reaction: "Při obdržení reakce"
|
||||||
mention: "Při zmínce"
|
mention: "Při zmínce"
|
||||||
_abuseReport:
|
|
||||||
_notificationRecipient:
|
|
||||||
_recipientType:
|
|
||||||
mail: "Email"
|
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
suspend: "Zmrazit"
|
suspend: "Zmrazit"
|
||||||
resetPassword: "Resetovat heslo"
|
resetPassword: "Resetovat heslo"
|
||||||
createInvitation: "Vygenerovat pozvánku"
|
createInvitation: "Vygenerovat pozvánku"
|
||||||
_reversi:
|
|
||||||
total: "Celkem"
|
|
||||||
_remoteLookupErrors:
|
|
||||||
_noSuchObject:
|
|
||||||
title: "Nenalezeno"
|
|
||||||
_search:
|
|
||||||
searchScopeAll: "Vše"
|
|
||||||
searchScopeLocal: "Místní"
|
|
||||||
searchScopeUser: "Upřesnit uživatele"
|
|
||||||
|
|
|
@ -1,4 +1,2 @@
|
||||||
---
|
---
|
||||||
_lang_: "Dansk"
|
_lang_: "Dansk"
|
||||||
headlineMisskey: ""
|
|
||||||
introMisskey: "ようこそ!Misskeyは、オープンソースの分散型マイクロブログサービスです。\n「ノート」を作成して、いま起こっていることを共有したり、あなたについて皆に発信しよう📡\n「リアクション」機能で、皆のノートに素早く反応を追加することもできます👍\n新しい世界を探検しよう🚀"
|
|
||||||
|
|
File diff suppressed because it is too large
Load diff
|
@ -104,6 +104,7 @@ clickToShow: "Κάντε κλικ για εμφάνιση"
|
||||||
add: "Προσθέστε"
|
add: "Προσθέστε"
|
||||||
reaction: "Αντιδράσεις"
|
reaction: "Αντιδράσεις"
|
||||||
reactions: "Αντιδράσεις"
|
reactions: "Αντιδράσεις"
|
||||||
|
reactionSetting: "Αντιδράσεις για εμφάνιση στην επιλογή αντίδρασης"
|
||||||
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε, πατήστε \"+\" για να προσθέσετε."
|
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε, πατήστε \"+\" για να προσθέσετε."
|
||||||
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας σημειώματος"
|
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας σημειώματος"
|
||||||
attachCancel: "Διαγραφή αρχείου"
|
attachCancel: "Διαγραφή αρχείου"
|
||||||
|
@ -162,12 +163,14 @@ imageUrl: "URL εικόνας"
|
||||||
remove: "Διαγραφή"
|
remove: "Διαγραφή"
|
||||||
removed: "Η διαγραφή ολοκληρώθηκε επιτυχώς"
|
removed: "Η διαγραφή ολοκληρώθηκε επιτυχώς"
|
||||||
saved: "Αποθηκεύτηκε"
|
saved: "Αποθηκεύτηκε"
|
||||||
|
messaging: "Συνομιλία"
|
||||||
upload: "Ανεβάστε"
|
upload: "Ανεβάστε"
|
||||||
fromDrive: "Από τον Αποθηκευτικό Χώρο"
|
fromDrive: "Από τον Αποθηκευτικό Χώρο"
|
||||||
fromUrl: "Από URL"
|
fromUrl: "Από URL"
|
||||||
uploadFromUrl: "Ανεβάστε από URL"
|
uploadFromUrl: "Ανεβάστε από URL"
|
||||||
explore: "Εξερευνήστε"
|
explore: "Εξερευνήστε"
|
||||||
messageRead: "Διαβάστηκε"
|
messageRead: "Διαβάστηκε"
|
||||||
|
startMessaging: "Ξεκινήστε μία συνομιλία"
|
||||||
nUsersRead: "διαβάστηκε από {n}"
|
nUsersRead: "διαβάστηκε από {n}"
|
||||||
start: "Ας αρχίσουμε"
|
start: "Ας αρχίσουμε"
|
||||||
home: "Κεντρικό"
|
home: "Κεντρικό"
|
||||||
|
@ -225,6 +228,7 @@ userList: "Λίστες"
|
||||||
about: "Πληροφορίες"
|
about: "Πληροφορίες"
|
||||||
moderator: "Συντονιστής"
|
moderator: "Συντονιστής"
|
||||||
moderation: "Συντονισμός"
|
moderation: "Συντονισμός"
|
||||||
|
cacheClear: "Εκκαθάριση προσωρινής μνήμης"
|
||||||
markAsReadAllNotifications: "Όλες οι ειδοποιήσεις διαβάστηκαν"
|
markAsReadAllNotifications: "Όλες οι ειδοποιήσεις διαβάστηκαν"
|
||||||
members: "Μέλη"
|
members: "Μέλη"
|
||||||
transfer: "Μεταφορά"
|
transfer: "Μεταφορά"
|
||||||
|
@ -286,11 +290,6 @@ cannotUploadBecauseNoFreeSpace: "Το ανέβασμα απέτυχε λόγω
|
||||||
icon: "Εικονίδιο"
|
icon: "Εικονίδιο"
|
||||||
replies: "Απάντηση"
|
replies: "Απάντηση"
|
||||||
renotes: "Κοινοποίηση σημειώματος"
|
renotes: "Κοινοποίηση σημειώματος"
|
||||||
postForm: "Φόρμα δημοσίευσης"
|
|
||||||
information: "Πληροφορίες"
|
|
||||||
_chat:
|
|
||||||
members: "Μέλη"
|
|
||||||
home: "Κεντρικό"
|
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "Έχετε ένα νέο ακόλουθο"
|
title: "Έχετε ένα νέο ακόλουθο"
|
||||||
|
@ -304,6 +303,8 @@ _theme:
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Σημειώματα"
|
note: "Σημειώματα"
|
||||||
notification: "Ειδοποιήσεις"
|
notification: "Ειδοποιήσεις"
|
||||||
|
antenna: "Αντένες"
|
||||||
|
channel: "Ειδοποιήσεις καναλιών"
|
||||||
_ago:
|
_ago:
|
||||||
future: "Μελλοντικό"
|
future: "Μελλοντικό"
|
||||||
justNow: "Μόλις τώρα"
|
justNow: "Μόλις τώρα"
|
||||||
|
@ -324,7 +325,6 @@ _permissions:
|
||||||
"write:notifications": "Διαχειριστείτε τις ειδοποιήσεις σας"
|
"write:notifications": "Διαχειριστείτε τις ειδοποιήσεις σας"
|
||||||
"read:pages": "Δείτε τις Σελίδες σας"
|
"read:pages": "Δείτε τις Σελίδες σας"
|
||||||
"write:pages": "Επεξεργαστείτε ή διαγράψτε τις σελίδες σας"
|
"write:pages": "Επεξεργαστείτε ή διαγράψτε τις σελίδες σας"
|
||||||
"write:chat": "Γράψτε ή διαγράψτε μηνύματα συνομιλίας"
|
|
||||||
_antennaSources:
|
_antennaSources:
|
||||||
all: "Όλα τα σημειώματα"
|
all: "Όλα τα σημειώματα"
|
||||||
homeTimeline: "Σημειώματα από μέλη που ακολουθείτε"
|
homeTimeline: "Σημειώματα από μέλη που ακολουθείτε"
|
||||||
|
@ -358,7 +358,6 @@ _profile:
|
||||||
username: "Όνομα μέλους"
|
username: "Όνομα μέλους"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Όλα τα σημειώματα"
|
allNotes: "Όλα τα σημειώματα"
|
||||||
clips: "Κλιπ"
|
|
||||||
followingList: "Ακολουθεί"
|
followingList: "Ακολουθεί"
|
||||||
muteList: "Μέλη σε σίγαση"
|
muteList: "Μέλη σε σίγαση"
|
||||||
blockingList: "Μπλοκαρισμένα μέλη"
|
blockingList: "Μπλοκαρισμένα μέλη"
|
||||||
|
@ -382,7 +381,6 @@ _notification:
|
||||||
renote: "Κοινοποίηση σημειώματος"
|
renote: "Κοινοποίηση σημειώματος"
|
||||||
quote: "Παράθεση"
|
quote: "Παράθεση"
|
||||||
reaction: "Αντιδράσεις"
|
reaction: "Αντιδράσεις"
|
||||||
login: "Σύνδεση"
|
|
||||||
_actions:
|
_actions:
|
||||||
reply: "Απάντηση"
|
reply: "Απάντηση"
|
||||||
renote: "Κοινοποίηση σημειώματος"
|
renote: "Κοινοποίηση σημειώματος"
|
||||||
|
@ -399,7 +397,3 @@ _webhookSettings:
|
||||||
name: "Όνομα"
|
name: "Όνομα"
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
suspend: "Αποβολή"
|
suspend: "Αποβολή"
|
||||||
_reversi:
|
|
||||||
total: "Σύνολο"
|
|
||||||
_search:
|
|
||||||
searchScopeLocal: "Τοπικό"
|
|
||||||
|
|
1008
locales/en-US.yml
1008
locales/en-US.yml
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
File diff suppressed because it is too large
Load diff
|
@ -6,225 +6,68 @@ import ts from 'typescript';
|
||||||
|
|
||||||
const __filename = fileURLToPath(import.meta.url);
|
const __filename = fileURLToPath(import.meta.url);
|
||||||
const __dirname = dirname(__filename);
|
const __dirname = dirname(__filename);
|
||||||
const parameterRegExp = /\{(\w+)\}/g;
|
|
||||||
|
|
||||||
function createMemberType(item) {
|
|
||||||
if (typeof item !== 'string') {
|
|
||||||
return ts.factory.createTypeLiteralNode(createMembers(item));
|
|
||||||
}
|
|
||||||
const parameters = Array.from(
|
|
||||||
item.matchAll(parameterRegExp),
|
|
||||||
([, parameter]) => parameter,
|
|
||||||
);
|
|
||||||
return parameters.length
|
|
||||||
? ts.factory.createTypeReferenceNode(
|
|
||||||
ts.factory.createIdentifier('ParameterizedString'),
|
|
||||||
[
|
|
||||||
ts.factory.createUnionTypeNode(
|
|
||||||
parameters.map((parameter) =>
|
|
||||||
ts.factory.createStringLiteral(parameter),
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
)
|
|
||||||
: ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword);
|
|
||||||
}
|
|
||||||
|
|
||||||
function createMembers(record) {
|
function createMembers(record) {
|
||||||
return Object.entries(record).map(([k, v]) => {
|
return Object.entries(record)
|
||||||
const node = ts.factory.createPropertySignature(
|
.map(([k, v]) => ts.factory.createPropertySignature(
|
||||||
undefined,
|
undefined,
|
||||||
ts.factory.createStringLiteral(k),
|
ts.factory.createStringLiteral(k),
|
||||||
undefined,
|
undefined,
|
||||||
createMemberType(v),
|
typeof v === 'string'
|
||||||
);
|
? ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword)
|
||||||
if (typeof v === 'string') {
|
: ts.factory.createTypeLiteralNode(createMembers(v)),
|
||||||
ts.addSyntheticLeadingComment(
|
));
|
||||||
node,
|
|
||||||
ts.SyntaxKind.MultiLineCommentTrivia,
|
|
||||||
`*
|
|
||||||
* ${v.replace(/\n/g, '\n * ')}
|
|
||||||
`,
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return node;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default function generateDTS() {
|
export default function generateDTS() {
|
||||||
const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8'));
|
const locale = yaml.load(fs.readFileSync(`${__dirname}/ja-JP.yml`, 'utf-8'));
|
||||||
const members = createMembers(locale);
|
const members = createMembers(locale);
|
||||||
const elements = [
|
const elements = [
|
||||||
ts.factory.createVariableStatement(
|
|
||||||
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
|
|
||||||
ts.factory.createVariableDeclarationList(
|
|
||||||
[
|
|
||||||
ts.factory.createVariableDeclaration(
|
|
||||||
ts.factory.createIdentifier('kParameters'),
|
|
||||||
undefined,
|
|
||||||
ts.factory.createTypeOperatorNode(
|
|
||||||
ts.SyntaxKind.UniqueKeyword,
|
|
||||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.SymbolKeyword),
|
|
||||||
),
|
|
||||||
undefined,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
ts.NodeFlags.Const,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
ts.factory.createInterfaceDeclaration(
|
|
||||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
|
||||||
ts.factory.createIdentifier('ParameterizedString'),
|
|
||||||
[
|
|
||||||
ts.factory.createTypeParameterDeclaration(
|
|
||||||
undefined,
|
|
||||||
ts.factory.createIdentifier('T'),
|
|
||||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
|
||||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
undefined,
|
|
||||||
[
|
|
||||||
ts.factory.createPropertySignature(
|
|
||||||
undefined,
|
|
||||||
ts.factory.createComputedPropertyName(
|
|
||||||
ts.factory.createIdentifier('kParameters'),
|
|
||||||
),
|
|
||||||
undefined,
|
|
||||||
ts.factory.createTypeReferenceNode(
|
|
||||||
ts.factory.createIdentifier('T'),
|
|
||||||
undefined,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
ts.factory.createInterfaceDeclaration(
|
|
||||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
|
||||||
ts.factory.createIdentifier('ILocale'),
|
|
||||||
undefined,
|
|
||||||
undefined,
|
|
||||||
[
|
|
||||||
ts.factory.createIndexSignature(
|
|
||||||
undefined,
|
|
||||||
[
|
|
||||||
ts.factory.createParameterDeclaration(
|
|
||||||
undefined,
|
|
||||||
undefined,
|
|
||||||
ts.factory.createIdentifier('_'),
|
|
||||||
undefined,
|
|
||||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
|
||||||
undefined,
|
|
||||||
),
|
|
||||||
],
|
|
||||||
ts.factory.createUnionTypeNode([
|
|
||||||
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
|
||||||
ts.factory.createTypeReferenceNode(
|
|
||||||
ts.factory.createIdentifier('ParameterizedString'),
|
|
||||||
),
|
|
||||||
ts.factory.createTypeReferenceNode(
|
|
||||||
ts.factory.createIdentifier('ILocale'),
|
|
||||||
undefined,
|
|
||||||
),
|
|
||||||
]),
|
|
||||||
),
|
|
||||||
],
|
|
||||||
),
|
|
||||||
ts.factory.createInterfaceDeclaration(
|
ts.factory.createInterfaceDeclaration(
|
||||||
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
[ts.factory.createToken(ts.SyntaxKind.ExportKeyword)],
|
||||||
ts.factory.createIdentifier('Locale'),
|
ts.factory.createIdentifier('Locale'),
|
||||||
undefined,
|
undefined,
|
||||||
[
|
|
||||||
ts.factory.createHeritageClause(ts.SyntaxKind.ExtendsKeyword, [
|
|
||||||
ts.factory.createExpressionWithTypeArguments(
|
|
||||||
ts.factory.createIdentifier('ILocale'),
|
|
||||||
undefined,
|
undefined,
|
||||||
),
|
|
||||||
]),
|
|
||||||
],
|
|
||||||
members,
|
members,
|
||||||
),
|
),
|
||||||
ts.factory.createVariableStatement(
|
ts.factory.createVariableStatement(
|
||||||
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
|
[ts.factory.createToken(ts.SyntaxKind.DeclareKeyword)],
|
||||||
ts.factory.createVariableDeclarationList(
|
ts.factory.createVariableDeclarationList(
|
||||||
[
|
[ts.factory.createVariableDeclaration(
|
||||||
ts.factory.createVariableDeclaration(
|
|
||||||
ts.factory.createIdentifier('locales'),
|
ts.factory.createIdentifier('locales'),
|
||||||
undefined,
|
undefined,
|
||||||
ts.factory.createTypeLiteralNode([
|
ts.factory.createTypeLiteralNode([ts.factory.createIndexSignature(
|
||||||
ts.factory.createIndexSignature(
|
|
||||||
undefined,
|
undefined,
|
||||||
[
|
[ts.factory.createParameterDeclaration(
|
||||||
ts.factory.createParameterDeclaration(
|
|
||||||
undefined,
|
undefined,
|
||||||
undefined,
|
undefined,
|
||||||
ts.factory.createIdentifier('lang'),
|
ts.factory.createIdentifier('lang'),
|
||||||
undefined,
|
undefined,
|
||||||
ts.factory.createKeywordTypeNode(
|
ts.factory.createKeywordTypeNode(ts.SyntaxKind.StringKeyword),
|
||||||
ts.SyntaxKind.StringKeyword,
|
|
||||||
),
|
|
||||||
undefined,
|
undefined,
|
||||||
),
|
)],
|
||||||
],
|
|
||||||
ts.factory.createTypeReferenceNode(
|
ts.factory.createTypeReferenceNode(
|
||||||
ts.factory.createIdentifier('Locale'),
|
ts.factory.createIdentifier('Locale'),
|
||||||
undefined,
|
undefined,
|
||||||
),
|
),
|
||||||
),
|
)]),
|
||||||
]),
|
|
||||||
undefined,
|
undefined,
|
||||||
|
)],
|
||||||
|
ts.NodeFlags.Const | ts.NodeFlags.Ambient | ts.NodeFlags.ContextFlags,
|
||||||
),
|
),
|
||||||
],
|
|
||||||
ts.NodeFlags.Const,
|
|
||||||
),
|
|
||||||
),
|
|
||||||
ts.factory.createFunctionDeclaration(
|
|
||||||
[ts.factory.createModifier(ts.SyntaxKind.ExportKeyword)],
|
|
||||||
undefined,
|
|
||||||
ts.factory.createIdentifier('build'),
|
|
||||||
undefined,
|
|
||||||
[],
|
|
||||||
ts.factory.createTypeReferenceNode(
|
|
||||||
ts.factory.createIdentifier('Locale'),
|
|
||||||
undefined,
|
|
||||||
),
|
|
||||||
undefined,
|
|
||||||
),
|
),
|
||||||
ts.factory.createExportDefault(ts.factory.createIdentifier('locales')),
|
ts.factory.createExportDefault(ts.factory.createIdentifier('locales')),
|
||||||
];
|
];
|
||||||
ts.addSyntheticLeadingComment(
|
const printed = ts.createPrinter({
|
||||||
elements[0],
|
|
||||||
ts.SyntaxKind.MultiLineCommentTrivia,
|
|
||||||
' eslint-disable ',
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
ts.addSyntheticLeadingComment(
|
|
||||||
elements[0],
|
|
||||||
ts.SyntaxKind.SingleLineCommentTrivia,
|
|
||||||
' This file is generated by locales/generateDTS.js',
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
ts.addSyntheticLeadingComment(
|
|
||||||
elements[0],
|
|
||||||
ts.SyntaxKind.SingleLineCommentTrivia,
|
|
||||||
' Do not edit this file directly.',
|
|
||||||
true,
|
|
||||||
);
|
|
||||||
const printed = ts
|
|
||||||
.createPrinter({
|
|
||||||
newLine: ts.NewLineKind.LineFeed,
|
newLine: ts.NewLineKind.LineFeed,
|
||||||
})
|
}).printList(
|
||||||
.printList(
|
|
||||||
ts.ListFormat.MultiLine,
|
ts.ListFormat.MultiLine,
|
||||||
ts.factory.createNodeArray(elements),
|
ts.factory.createNodeArray(elements),
|
||||||
ts.createSourceFile(
|
ts.createSourceFile('index.d.ts', '', ts.ScriptTarget.ESNext, true, ts.ScriptKind.TS),
|
||||||
'index.d.ts',
|
|
||||||
'',
|
|
||||||
ts.ScriptTarget.ESNext,
|
|
||||||
true,
|
|
||||||
ts.ScriptKind.TS,
|
|
||||||
),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
fs.writeFileSync(`${__dirname}/index.d.ts`, printed, 'utf-8');
|
fs.writeFileSync(`${__dirname}/index.d.ts`, `/* eslint-disable */
|
||||||
|
// This file is generated by locales/generateDTS.js
|
||||||
|
// Do not edit this file directly.
|
||||||
|
${printed}`, 'utf-8');
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
---
|
---
|
||||||
_lang_: "Magyar"
|
_lang_: "Japán"
|
||||||
monthAndDay: "{month}.{day}."
|
monthAndDay: "{month}.{day}."
|
||||||
search: "Keresés"
|
search: "Keresés"
|
||||||
notifications: "Értesítések"
|
notifications: "Értesítések"
|
||||||
|
@ -96,7 +96,6 @@ _notification:
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
quote: "Idézet"
|
quote: "Idézet"
|
||||||
reaction: "Reakciók"
|
reaction: "Reakciók"
|
||||||
login: "Bejelentkezés"
|
|
||||||
_actions:
|
_actions:
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
_deck:
|
_deck:
|
||||||
|
|
|
@ -60,7 +60,6 @@ copyFileId: "Salin Berkas"
|
||||||
copyFolderId: "Salin Folder"
|
copyFolderId: "Salin Folder"
|
||||||
copyProfileUrl: "Salin Alamat Web Profil"
|
copyProfileUrl: "Salin Alamat Web Profil"
|
||||||
searchUser: "Cari pengguna"
|
searchUser: "Cari pengguna"
|
||||||
searchThisUsersNotes: "Mencari catatan pengguna"
|
|
||||||
reply: "Balas"
|
reply: "Balas"
|
||||||
loadMore: "Selebihnya"
|
loadMore: "Selebihnya"
|
||||||
showMore: "Selebihnya"
|
showMore: "Selebihnya"
|
||||||
|
@ -82,7 +81,7 @@ exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Sete
|
||||||
importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat."
|
importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat."
|
||||||
lists: "Daftar"
|
lists: "Daftar"
|
||||||
noLists: "Kamu tidak memiliki daftar apapun"
|
noLists: "Kamu tidak memiliki daftar apapun"
|
||||||
note: "Catatan"
|
note: "Catat"
|
||||||
notes: "Catatan"
|
notes: "Catatan"
|
||||||
following: "Ikuti"
|
following: "Ikuti"
|
||||||
followers: "Pengikut"
|
followers: "Pengikut"
|
||||||
|
@ -109,14 +108,11 @@ enterEmoji: "Masukkan emoji"
|
||||||
renote: "Renote"
|
renote: "Renote"
|
||||||
unrenote: "Hapus renote"
|
unrenote: "Hapus renote"
|
||||||
renoted: "Telah direnote"
|
renoted: "Telah direnote"
|
||||||
renotedToX: "{name} telah merenote"
|
|
||||||
cantRenote: "Postingan ini tidak dapat direnote"
|
cantRenote: "Postingan ini tidak dapat direnote"
|
||||||
cantReRenote: "Renote tidak dapat direnote"
|
cantReRenote: "Renote tidak dapat direnote"
|
||||||
quote: "Kutip"
|
quote: "Kutip"
|
||||||
inChannelRenote: "Hanya renote dalam kanal"
|
inChannelRenote: "Hanya renote dalam kanal"
|
||||||
inChannelQuote: "Hanya kutip dalam kanal"
|
inChannelQuote: "Hanya kutip dalam kanal"
|
||||||
renoteToChannel: "Renote ke kanal"
|
|
||||||
renoteToOtherChannel: "Renote ke kanal lainnya"
|
|
||||||
pinnedNote: "Catatan yang disematkan"
|
pinnedNote: "Catatan yang disematkan"
|
||||||
pinned: "Sematkan ke profil"
|
pinned: "Sematkan ke profil"
|
||||||
you: "Kamu"
|
you: "Kamu"
|
||||||
|
@ -125,16 +121,10 @@ sensitive: "Konten sensitif"
|
||||||
add: "Tambahkan"
|
add: "Tambahkan"
|
||||||
reaction: "Reaksi"
|
reaction: "Reaksi"
|
||||||
reactions: "Reaksi"
|
reactions: "Reaksi"
|
||||||
emojiPicker: "Emoji Picker"
|
reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi"
|
||||||
pinnedEmojisForReactionSettingDescription: "Atur sematan emoji pada reaksi"
|
|
||||||
pinnedEmojisSettingDescription: "Atur sematan emoji pada masukan emoji"
|
|
||||||
emojiPickerDisplay: "Tampilan Emoji Picker"
|
|
||||||
overwriteFromPinnedEmojisForReaction: "Timpa dari pengaturan reaksi"
|
|
||||||
overwriteFromPinnedEmojis: "Timpa dari pengaturan umum"
|
|
||||||
reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
||||||
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
||||||
attachCancel: "Hapus lampiran"
|
attachCancel: "Hapus lampiran"
|
||||||
deleteFile: "Berkas dihapus"
|
|
||||||
markAsSensitive: "Tandai sebagai konten sensitif"
|
markAsSensitive: "Tandai sebagai konten sensitif"
|
||||||
unmarkAsSensitive: "Hapus tanda konten sensitif"
|
unmarkAsSensitive: "Hapus tanda konten sensitif"
|
||||||
enterFileName: "Masukkan nama berkas"
|
enterFileName: "Masukkan nama berkas"
|
||||||
|
@ -155,7 +145,6 @@ editList: "Sunting daftar"
|
||||||
selectChannel: "Pilih kanal"
|
selectChannel: "Pilih kanal"
|
||||||
selectAntenna: "Pilih Antena"
|
selectAntenna: "Pilih Antena"
|
||||||
editAntenna: "Sunting antena"
|
editAntenna: "Sunting antena"
|
||||||
createAntenna: "Membuat antena."
|
|
||||||
selectWidget: "Pilih gawit"
|
selectWidget: "Pilih gawit"
|
||||||
editWidgets: "Sunting gawit"
|
editWidgets: "Sunting gawit"
|
||||||
editWidgetsExit: "Selesai"
|
editWidgetsExit: "Selesai"
|
||||||
|
@ -182,10 +171,6 @@ addAccount: "Tambahkan akun"
|
||||||
reloadAccountsList: "Muat ulang daftar akun"
|
reloadAccountsList: "Muat ulang daftar akun"
|
||||||
loginFailed: "Gagal untuk masuk"
|
loginFailed: "Gagal untuk masuk"
|
||||||
showOnRemote: "Lihat profil asli"
|
showOnRemote: "Lihat profil asli"
|
||||||
continueOnRemote: "Lihat di peladen asal"
|
|
||||||
chooseServerOnMisskeyHub: "Pilih peladen dari Misskey Hub"
|
|
||||||
specifyServerHost: "Tentukan domain peladen"
|
|
||||||
inputHostName: "Masukkan nama domain"
|
|
||||||
general: "Umum"
|
general: "Umum"
|
||||||
wallpaper: "Wallpaper"
|
wallpaper: "Wallpaper"
|
||||||
setWallpaper: "Atur wallpaper"
|
setWallpaper: "Atur wallpaper"
|
||||||
|
@ -196,7 +181,6 @@ followConfirm: "Apakah kamu yakin ingin mengikuti {name}?"
|
||||||
proxyAccount: "Akun proksi"
|
proxyAccount: "Akun proksi"
|
||||||
proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebagai pengikut instansi luar untuk pengguna dalam kondisi tertentu. Sebagai contoh, ketika pengguna menambahkan seorang pengguna instansi luar ke dalam daftar, aktivitas dari pengguna instansi luar tidak akan disampaikan ke instansi apabila tidak ada pengguna lokal yang mengikuti pengguna tersebut, dengan begitu akun proksilah yang akan mengikutinya."
|
proxyAccountDescription: "Akun proksi merupakan sebuah akun yang bertindak sebagai pengikut instansi luar untuk pengguna dalam kondisi tertentu. Sebagai contoh, ketika pengguna menambahkan seorang pengguna instansi luar ke dalam daftar, aktivitas dari pengguna instansi luar tidak akan disampaikan ke instansi apabila tidak ada pengguna lokal yang mengikuti pengguna tersebut, dengan begitu akun proksilah yang akan mengikutinya."
|
||||||
host: "Host"
|
host: "Host"
|
||||||
selectSelf: "Pilih diri sendiri"
|
|
||||||
selectUser: "Pilih pengguna"
|
selectUser: "Pilih pengguna"
|
||||||
recipient: "Penerima"
|
recipient: "Penerima"
|
||||||
annotation: "Keterangan konten"
|
annotation: "Keterangan konten"
|
||||||
|
@ -233,7 +217,6 @@ blockedInstances: "Instansi terblokir"
|
||||||
blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi ini."
|
blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi ini."
|
||||||
silencedInstances: "Instansi yang disenyapkan"
|
silencedInstances: "Instansi yang disenyapkan"
|
||||||
silencedInstancesDescription: "Daftar nama host dari instansi yang ingin kamu senyapkan. Semua akun dari instansi yang terdaftar akan diperlakukan sebagai disenyapkan. Hal ini membuat akun hanya dapat membuat permintaan mengikuti, dan tidak dapat menyebutkan akun lokal apabila tidak mengikuti. Hal ini tidak akan mempengaruhi instansi yang diblokir."
|
silencedInstancesDescription: "Daftar nama host dari instansi yang ingin kamu senyapkan. Semua akun dari instansi yang terdaftar akan diperlakukan sebagai disenyapkan. Hal ini membuat akun hanya dapat membuat permintaan mengikuti, dan tidak dapat menyebutkan akun lokal apabila tidak mengikuti. Hal ini tidak akan mempengaruhi instansi yang diblokir."
|
||||||
federationAllowedHosts: "Server yang membolehkan federasi"
|
|
||||||
muteAndBlock: "Bisukan / Blokir"
|
muteAndBlock: "Bisukan / Blokir"
|
||||||
mutedUsers: "Pengguna yang dibisukan"
|
mutedUsers: "Pengguna yang dibisukan"
|
||||||
blockedUsers: "Pengguna yang diblokir"
|
blockedUsers: "Pengguna yang diblokir"
|
||||||
|
@ -241,6 +224,7 @@ noUsers: "Tidak ada pengguna"
|
||||||
editProfile: "Sunting profil"
|
editProfile: "Sunting profil"
|
||||||
noteDeleteConfirm: "Apakah kamu yakin ingin menghapus catatan ini?"
|
noteDeleteConfirm: "Apakah kamu yakin ingin menghapus catatan ini?"
|
||||||
pinLimitExceeded: "Kamu tidak dapat menyematkan catatan lagi"
|
pinLimitExceeded: "Kamu tidak dapat menyematkan catatan lagi"
|
||||||
|
intro: "Instalasi Misskey telah selesai! Mohon untuk membuat pengguna admin."
|
||||||
done: "Selesai"
|
done: "Selesai"
|
||||||
processing: "Memproses"
|
processing: "Memproses"
|
||||||
preview: "Pratinjau"
|
preview: "Pratinjau"
|
||||||
|
@ -277,8 +261,8 @@ removed: "Telah dihapus"
|
||||||
removeAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
removeAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
||||||
deleteAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
deleteAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
||||||
resetAreYouSure: "Yakin mau atur ulang?"
|
resetAreYouSure: "Yakin mau atur ulang?"
|
||||||
areYouSure: "Apakah kamu yakin?"
|
|
||||||
saved: "Telah disimpan"
|
saved: "Telah disimpan"
|
||||||
|
messaging: "Pesan"
|
||||||
upload: "Unggah"
|
upload: "Unggah"
|
||||||
keepOriginalUploading: "Simpan gambar asli"
|
keepOriginalUploading: "Simpan gambar asli"
|
||||||
keepOriginalUploadingDescription: "Simpan gambar yang diunggah sebagaimana gambar aslinya. Bila dimatikan, versi tampilan web akan dihasilkan pada saat diunggah."
|
keepOriginalUploadingDescription: "Simpan gambar yang diunggah sebagaimana gambar aslinya. Bila dimatikan, versi tampilan web akan dihasilkan pada saat diunggah."
|
||||||
|
@ -291,6 +275,7 @@ uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesa
|
||||||
explore: "Jelajahi"
|
explore: "Jelajahi"
|
||||||
messageRead: "Telah dibaca"
|
messageRead: "Telah dibaca"
|
||||||
noMoreHistory: "Tidak ada sejarah lagi"
|
noMoreHistory: "Tidak ada sejarah lagi"
|
||||||
|
startMessaging: "Mulai mengirim pesan"
|
||||||
nUsersRead: "Dibaca oleh {n}"
|
nUsersRead: "Dibaca oleh {n}"
|
||||||
agreeTo: "Saya setuju kepada {0}"
|
agreeTo: "Saya setuju kepada {0}"
|
||||||
agree: "Setuju"
|
agree: "Setuju"
|
||||||
|
@ -321,15 +306,12 @@ selectFile: "Pilih berkas"
|
||||||
selectFiles: "Pilih berkas"
|
selectFiles: "Pilih berkas"
|
||||||
selectFolder: "Pilih folder"
|
selectFolder: "Pilih folder"
|
||||||
selectFolders: "Pilih folder"
|
selectFolders: "Pilih folder"
|
||||||
fileNotSelected: "Tidak ada file yang dipilih"
|
|
||||||
renameFile: "Ubah nama berkas"
|
renameFile: "Ubah nama berkas"
|
||||||
folderName: "Nama folder"
|
folderName: "Nama folder"
|
||||||
createFolder: "Buat folder"
|
createFolder: "Buat folder"
|
||||||
renameFolder: "Ubah nama folder"
|
renameFolder: "Ubah nama folder"
|
||||||
deleteFolder: "Hapus folder"
|
deleteFolder: "Hapus folder"
|
||||||
folder: "Folder"
|
|
||||||
addFile: "Tambahkan berkas"
|
addFile: "Tambahkan berkas"
|
||||||
showFile: "Tampilkan berkas"
|
|
||||||
emptyDrive: "Drive kosong"
|
emptyDrive: "Drive kosong"
|
||||||
emptyFolder: "Folder kosong"
|
emptyFolder: "Folder kosong"
|
||||||
unableToDelete: "Tidak dapat menghapus"
|
unableToDelete: "Tidak dapat menghapus"
|
||||||
|
@ -372,6 +354,7 @@ enableLocalTimeline: "Nyalakan lini masa lokal"
|
||||||
enableGlobalTimeline: "Nyalakan lini masa global"
|
enableGlobalTimeline: "Nyalakan lini masa global"
|
||||||
disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua lini masa meskipun lini masa tersebut tidak diaktifkan."
|
disablingTimelinesInfo: "Admin dan Moderator akan selalu memiliki akses ke semua lini masa meskipun lini masa tersebut tidak diaktifkan."
|
||||||
registration: "Pendaftaran"
|
registration: "Pendaftaran"
|
||||||
|
enableRegistration: "Nyalakan pendaftaran pengguna baru"
|
||||||
invite: "Undang"
|
invite: "Undang"
|
||||||
driveCapacityPerLocalAccount: "Kapasitas drive per pengguna lokal"
|
driveCapacityPerLocalAccount: "Kapasitas drive per pengguna lokal"
|
||||||
driveCapacityPerRemoteAccount: "Kapasitas drive per pengguna remote"
|
driveCapacityPerRemoteAccount: "Kapasitas drive per pengguna remote"
|
||||||
|
@ -389,11 +372,6 @@ hcaptcha: "hCaptcha"
|
||||||
enableHcaptcha: "Nyalakan hCaptcha"
|
enableHcaptcha: "Nyalakan hCaptcha"
|
||||||
hcaptchaSiteKey: "Site Key"
|
hcaptchaSiteKey: "Site Key"
|
||||||
hcaptchaSecretKey: "Secret Key"
|
hcaptchaSecretKey: "Secret Key"
|
||||||
mcaptcha: "mCaptcha"
|
|
||||||
enableMcaptcha: "Nyalakan mCaptcha"
|
|
||||||
mcaptchaSiteKey: "Site key"
|
|
||||||
mcaptchaSecretKey: "Secret Key"
|
|
||||||
mcaptchaInstanceUrl: "URL instansi mCaptcha"
|
|
||||||
recaptcha: "reCAPTCHA"
|
recaptcha: "reCAPTCHA"
|
||||||
enableRecaptcha: "Nyalakan reCAPTCHA"
|
enableRecaptcha: "Nyalakan reCAPTCHA"
|
||||||
recaptchaSiteKey: "Site key"
|
recaptchaSiteKey: "Site key"
|
||||||
|
@ -409,7 +387,6 @@ name: "Nama"
|
||||||
antennaSource: "Sumber Antenna"
|
antennaSource: "Sumber Antenna"
|
||||||
antennaKeywords: "Kata kunci yang diterima"
|
antennaKeywords: "Kata kunci yang diterima"
|
||||||
antennaExcludeKeywords: "Kata kunci yang dikecualikan"
|
antennaExcludeKeywords: "Kata kunci yang dikecualikan"
|
||||||
antennaExcludeBots: "Kecualikan akun bot"
|
|
||||||
antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
||||||
notifyAntenna: "Beritahu untuk catatan baru"
|
notifyAntenna: "Beritahu untuk catatan baru"
|
||||||
withFileAntenna: "Hanya tampilkan catatan dengan berkas yang dilampirkan"
|
withFileAntenna: "Hanya tampilkan catatan dengan berkas yang dilampirkan"
|
||||||
|
@ -460,6 +437,7 @@ share: "Bagikan"
|
||||||
notFound: "Tidak dapat ditemukan"
|
notFound: "Tidak dapat ditemukan"
|
||||||
notFoundDescription: "Tidak ada halaman sesuai dengan URL yang ditentukan."
|
notFoundDescription: "Tidak ada halaman sesuai dengan URL yang ditentukan."
|
||||||
uploadFolder: "Lokasi unggah folder bawaan"
|
uploadFolder: "Lokasi unggah folder bawaan"
|
||||||
|
cacheClear: "Bersihkan tembolok"
|
||||||
markAsReadAllNotifications: "Tandai semua notifikasi telah dibaca"
|
markAsReadAllNotifications: "Tandai semua notifikasi telah dibaca"
|
||||||
markAsReadAllUnreadNotes: "Tandai semua catatan telah dibaca"
|
markAsReadAllUnreadNotes: "Tandai semua catatan telah dibaca"
|
||||||
markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca"
|
markAsReadAllTalkMessages: "Tandai semua pesan telah dibaca"
|
||||||
|
@ -477,7 +455,8 @@ retype: "Masukkan ulang"
|
||||||
noteOf: "Catatan milik {user}"
|
noteOf: "Catatan milik {user}"
|
||||||
quoteAttached: "Dikutip"
|
quoteAttached: "Dikutip"
|
||||||
quoteQuestion: "Apakah kamu ingin menambahkan kutipan?"
|
quoteQuestion: "Apakah kamu ingin menambahkan kutipan?"
|
||||||
attachAsFileQuestion: "Teks dalam papan klip terlalu panjang. Apakah kamu ingin melampirkannya sebagai berkas teks?"
|
noMessagesYet: "Tidak ada pesan"
|
||||||
|
newMessageExists: "Kamu mendapatkan pesan baru"
|
||||||
onlyOneFileCanBeAttached: "Kamu hanya dapat melampirkan satu berkas ke dalam pesan"
|
onlyOneFileCanBeAttached: "Kamu hanya dapat melampirkan satu berkas ke dalam pesan"
|
||||||
signinRequired: "Silahkan login"
|
signinRequired: "Silahkan login"
|
||||||
invitations: "Undangan"
|
invitations: "Undangan"
|
||||||
|
@ -501,10 +480,8 @@ uiLanguage: "Bahasa antarmuka pengguna"
|
||||||
aboutX: "Tentang {x}"
|
aboutX: "Tentang {x}"
|
||||||
emojiStyle: "Gaya emoji"
|
emojiStyle: "Gaya emoji"
|
||||||
native: "Native"
|
native: "Native"
|
||||||
menuStyle: "Gaya menu"
|
disableDrawer: "Jangan gunakan menu bergaya laci"
|
||||||
style: "Gaya"
|
|
||||||
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
|
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
|
||||||
showReactionsCount: "Lihat jumlah reaksi dalam catatan"
|
|
||||||
noHistory: "Tidak ada riwayat"
|
noHistory: "Tidak ada riwayat"
|
||||||
signinHistory: "Riwayat masuk"
|
signinHistory: "Riwayat masuk"
|
||||||
enableAdvancedMfm: "Nyalakan MFM tingkat lanjut"
|
enableAdvancedMfm: "Nyalakan MFM tingkat lanjut"
|
||||||
|
@ -567,8 +544,6 @@ showInPage: "Tampilkan di halaman"
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
volume: "Volume"
|
volume: "Volume"
|
||||||
masterVolume: "Master volume"
|
masterVolume: "Master volume"
|
||||||
notUseSound: "Tidak ada keluaran suara"
|
|
||||||
useSoundOnlyWhenActive: "Hanya keluarkan suara jika Misskey sedang aktif"
|
|
||||||
details: "Selengkapnya"
|
details: "Selengkapnya"
|
||||||
chooseEmoji: "Pilih emoji"
|
chooseEmoji: "Pilih emoji"
|
||||||
unableToProcess: "Operasi tersebut tidak dapat diselesaikan."
|
unableToProcess: "Operasi tersebut tidak dapat diselesaikan."
|
||||||
|
@ -589,10 +564,6 @@ output: "Keluaran"
|
||||||
script: "Script"
|
script: "Script"
|
||||||
disablePagesScript: "Nonaktifkan script pada halaman"
|
disablePagesScript: "Nonaktifkan script pada halaman"
|
||||||
updateRemoteUser: "Perbaharui informasi pengguna instansi luar"
|
updateRemoteUser: "Perbaharui informasi pengguna instansi luar"
|
||||||
unsetUserAvatar: "Hapus avatar"
|
|
||||||
unsetUserAvatarConfirm: "Apakah kamu yakin ingin menghapus avatar?"
|
|
||||||
unsetUserBanner: "Hapus banner"
|
|
||||||
unsetUserBannerConfirm: "Apakah kamu yakin ingin menghapus banner?"
|
|
||||||
deleteAllFiles: "Hapus semua berkas"
|
deleteAllFiles: "Hapus semua berkas"
|
||||||
deleteAllFilesConfirm: "Apakah kamu yakin ingin menghapus semua berkas?"
|
deleteAllFilesConfirm: "Apakah kamu yakin ingin menghapus semua berkas?"
|
||||||
removeAllFollowing: "Batalkan mengikuti semua pengguna"
|
removeAllFollowing: "Batalkan mengikuti semua pengguna"
|
||||||
|
@ -643,7 +614,6 @@ medium: "Sedang"
|
||||||
small: "Kecil"
|
small: "Kecil"
|
||||||
generateAccessToken: "Buat token akses"
|
generateAccessToken: "Buat token akses"
|
||||||
permission: "Izin"
|
permission: "Izin"
|
||||||
adminPermission: "Wewenang Izin Admin"
|
|
||||||
enableAll: "Aktifkan semua"
|
enableAll: "Aktifkan semua"
|
||||||
disableAll: "Nonaktifkan semua"
|
disableAll: "Nonaktifkan semua"
|
||||||
tokenRequested: "Berikan ijin akses ke akun"
|
tokenRequested: "Berikan ijin akses ke akun"
|
||||||
|
@ -665,7 +635,6 @@ smtpSecure: "Gunakan SSL/TLS implisit untuk koneksi SMTP"
|
||||||
smtpSecureInfo: "Matikan ini ketika menggunakan STARTTLS"
|
smtpSecureInfo: "Matikan ini ketika menggunakan STARTTLS"
|
||||||
testEmail: "Tes pengiriman surel"
|
testEmail: "Tes pengiriman surel"
|
||||||
wordMute: "Bisukan kata"
|
wordMute: "Bisukan kata"
|
||||||
hardWordMute: "Pembisuan kata keras"
|
|
||||||
regexpError: "Kesalahan ekspresi reguler"
|
regexpError: "Kesalahan ekspresi reguler"
|
||||||
regexpErrorDescription: "Galat terjadi pada baris {line} ekspresi reguler dari {tab} kata yang dibisukan:"
|
regexpErrorDescription: "Galat terjadi pada baris {line} ekspresi reguler dari {tab} kata yang dibisukan:"
|
||||||
instanceMute: "Bisukan instansi"
|
instanceMute: "Bisukan instansi"
|
||||||
|
@ -687,7 +656,6 @@ useGlobalSettingDesc: "Jika dinyalakan, setelan notifikasi akun kamu akan diguna
|
||||||
other: "Lainnya"
|
other: "Lainnya"
|
||||||
regenerateLoginToken: "Perbarui token login"
|
regenerateLoginToken: "Perbarui token login"
|
||||||
regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout."
|
regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan dilogout."
|
||||||
theKeywordWhenSearchingForCustomEmoji: "Kata kunci ini digunakan untuk mencari emoji kustom yang dicari."
|
|
||||||
setMultipleBySeparatingWithSpace: "Kamu dapat menyetel banyak dengan memisahkannya menggunakan spasi."
|
setMultipleBySeparatingWithSpace: "Kamu dapat menyetel banyak dengan memisahkannya menggunakan spasi."
|
||||||
fileIdOrUrl: "File-ID atau URL"
|
fileIdOrUrl: "File-ID atau URL"
|
||||||
behavior: "Perilaku"
|
behavior: "Perilaku"
|
||||||
|
@ -701,7 +669,10 @@ abuseReported: "Laporan kamu telah dikirimkan. Terima kasih."
|
||||||
reporter: "Pelapor"
|
reporter: "Pelapor"
|
||||||
reporteeOrigin: "Yang dilaporkan"
|
reporteeOrigin: "Yang dilaporkan"
|
||||||
reporterOrigin: "Pelapor"
|
reporterOrigin: "Pelapor"
|
||||||
|
forwardReport: "Teruskan laporan ke instansi luar"
|
||||||
|
forwardReportIsAnonymous: "Untuk melindungi privasi akun kamu, akun anonim dari sistem akan digunakan sebagai pelapor pada instansi luar."
|
||||||
send: "Kirim"
|
send: "Kirim"
|
||||||
|
abuseMarkAsResolved: "Tandai laporan sebagai selesai"
|
||||||
openInNewTab: "Buka di tab baru"
|
openInNewTab: "Buka di tab baru"
|
||||||
openInSideView: "Buka di tampilan samping"
|
openInSideView: "Buka di tampilan samping"
|
||||||
defaultNavigationBehaviour: "Navigasi bawaan"
|
defaultNavigationBehaviour: "Navigasi bawaan"
|
||||||
|
@ -760,6 +731,7 @@ thisIsExperimentalFeature: "Fitur ini eksperimental. Fungsionalitas dari fitur i
|
||||||
developer: "Pengembang"
|
developer: "Pengembang"
|
||||||
makeExplorable: "Buat akun tampil di \"Jelajahi\""
|
makeExplorable: "Buat akun tampil di \"Jelajahi\""
|
||||||
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di menu \"Jelajahi\""
|
makeExplorableDescription: "Jika kamu mematikan ini, akun kamu tidak akan muncul di menu \"Jelajahi\""
|
||||||
|
showGapBetweenNotesInTimeline: "Tampilkan jarak diantara catatan pada lini masa"
|
||||||
duplicate: "Duplikat"
|
duplicate: "Duplikat"
|
||||||
left: "Kiri"
|
left: "Kiri"
|
||||||
center: "Tengah"
|
center: "Tengah"
|
||||||
|
@ -896,8 +868,8 @@ makeReactionsPublicDescription: "Pengaturan ini akan membuat daftar dari semua r
|
||||||
classic: "Klasik"
|
classic: "Klasik"
|
||||||
muteThread: "Bisukan thread"
|
muteThread: "Bisukan thread"
|
||||||
unmuteThread: "Suarakan thread"
|
unmuteThread: "Suarakan thread"
|
||||||
followingVisibility: "Visibilitas mengikuti"
|
ffVisibility: "Visibilitas Mengikuti/Pengikut"
|
||||||
followersVisibility: "Visibilitas pengikut"
|
ffVisibilityDescription: "Mengatur siapa yang dapat melihat pengikutmu dan yang kamu ikuti."
|
||||||
continueThread: "Lihat lanjutan thread"
|
continueThread: "Lihat lanjutan thread"
|
||||||
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
|
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
|
||||||
incorrectPassword: "Kata sandi salah."
|
incorrectPassword: "Kata sandi salah."
|
||||||
|
@ -925,9 +897,6 @@ oneHour: "1 Jam"
|
||||||
oneDay: "1 Hari"
|
oneDay: "1 Hari"
|
||||||
oneWeek: "1 Bulan"
|
oneWeek: "1 Bulan"
|
||||||
oneMonth: "satu bulan"
|
oneMonth: "satu bulan"
|
||||||
threeMonths: "3 bulan"
|
|
||||||
oneYear: "1 tahun"
|
|
||||||
threeDays: "3 hari"
|
|
||||||
reflectMayTakeTime: "Mungkin perlu beberapa saat untuk dicerminkan."
|
reflectMayTakeTime: "Mungkin perlu beberapa saat untuk dicerminkan."
|
||||||
failedToFetchAccountInformation: "Gagal untuk mendapatkan informasi akun"
|
failedToFetchAccountInformation: "Gagal untuk mendapatkan informasi akun"
|
||||||
rateLimitExceeded: "Batas sudah terlampaui"
|
rateLimitExceeded: "Batas sudah terlampaui"
|
||||||
|
@ -1001,7 +970,6 @@ neverShow: "Jangan tampilkan lagi"
|
||||||
remindMeLater: "Mungkin nanti"
|
remindMeLater: "Mungkin nanti"
|
||||||
didYouLikeMisskey: "Apakah kamu mulai menyukai Misskey?"
|
didYouLikeMisskey: "Apakah kamu mulai menyukai Misskey?"
|
||||||
pleaseDonate: "{host} menggunakan perangkat lunak bebas yaitu Misskey. Kami sangat mengapresiasi sekali donasi dari kamu agar pengembangan Misskey tetap dapat berlanjut!"
|
pleaseDonate: "{host} menggunakan perangkat lunak bebas yaitu Misskey. Kami sangat mengapresiasi sekali donasi dari kamu agar pengembangan Misskey tetap dapat berlanjut!"
|
||||||
correspondingSourceIsAvailable: "Sumber kode terkait tersedia di {anchor}"
|
|
||||||
roles: "Peran"
|
roles: "Peran"
|
||||||
role: "Peran"
|
role: "Peran"
|
||||||
noRole: "Peran tidak temukan"
|
noRole: "Peran tidak temukan"
|
||||||
|
@ -1011,7 +979,6 @@ assign: "Tetapkan\n"
|
||||||
unassign: "Batalkan penetapan"
|
unassign: "Batalkan penetapan"
|
||||||
color: "Warna"
|
color: "Warna"
|
||||||
manageCustomEmojis: "Kelola Emoji Kustom"
|
manageCustomEmojis: "Kelola Emoji Kustom"
|
||||||
manageAvatarDecorations: "Kelola dekorasi avatar"
|
|
||||||
youCannotCreateAnymore: "Kamu melewati batas pembuatan."
|
youCannotCreateAnymore: "Kamu melewati batas pembuatan."
|
||||||
cannotPerformTemporary: "Sementara Tidak Tersedia"
|
cannotPerformTemporary: "Sementara Tidak Tersedia"
|
||||||
cannotPerformTemporaryDescription: "Aksi ini tidak dapat dilakukan sementara karena melewati batas eksekusi. Mohon tunggu sejenak dan coba lagi."
|
cannotPerformTemporaryDescription: "Aksi ini tidak dapat dilakukan sementara karena melewati batas eksekusi. Mohon tunggu sejenak dan coba lagi."
|
||||||
|
@ -1052,11 +1019,6 @@ resetPasswordConfirm: "Yakin untuk mereset kata sandimu?"
|
||||||
sensitiveWords: "Kata sensitif"
|
sensitiveWords: "Kata sensitif"
|
||||||
sensitiveWordsDescription: "Visibilitas dari semua catatan mengandung kata yang telah diatur akan dijadikan \"Beranda\" secara otomatis. Kamu dapat mendaftarkan kata tersebut lebih dari satu dengan menuliskannya di baris baru."
|
sensitiveWordsDescription: "Visibilitas dari semua catatan mengandung kata yang telah diatur akan dijadikan \"Beranda\" secara otomatis. Kamu dapat mendaftarkan kata tersebut lebih dari satu dengan menuliskannya di baris baru."
|
||||||
sensitiveWordsDescription2: "Menggunakan spasi akan membuat ekspresi AND dan kata kunci disekitarnya dengan garis miring akan mengubahnya menjadi ekspresi reguler."
|
sensitiveWordsDescription2: "Menggunakan spasi akan membuat ekspresi AND dan kata kunci disekitarnya dengan garis miring akan mengubahnya menjadi ekspresi reguler."
|
||||||
prohibitedWords: "Kata yang dilarang"
|
|
||||||
prohibitedWordsDescription: "Menyalakan kesalahan ketika mencoba untuk memposting catatan dengan set kata-kata yang termasuk. Beberapa kata dapat diatur dan dipisahkan dengan baris baru."
|
|
||||||
prohibitedWordsDescription2: "Menggunakan spasi akan membuat ekspresi AND dan kata kunci disekitarnya dengan garis miring akan mengubahnya menjadi ekspresi reguler."
|
|
||||||
hiddenTags: "Tagar tersembunyi"
|
|
||||||
hiddenTagsDescription: "Pilih tanda yang mana akan tidak diperlihatkan dalam daftar tren.\nTanda lebih dari satu dapat didaftarkan dengan tiap baris."
|
|
||||||
notesSearchNotAvailable: "Pencarian catatan tidak tersedia."
|
notesSearchNotAvailable: "Pencarian catatan tidak tersedia."
|
||||||
license: "Lisensi"
|
license: "Lisensi"
|
||||||
unfavoriteConfirm: "Yakin ingin menghapusnya dari favorit?"
|
unfavoriteConfirm: "Yakin ingin menghapusnya dari favorit?"
|
||||||
|
@ -1069,12 +1031,9 @@ enableChartsForRemoteUser: "Buat bagan data pengguna instansi luar"
|
||||||
enableChartsForFederatedInstances: "Buat bagan data peladen instansi luar"
|
enableChartsForFederatedInstances: "Buat bagan data peladen instansi luar"
|
||||||
showClipButtonInNoteFooter: "Tambahkan \"Klip\" ke menu aksi catatan"
|
showClipButtonInNoteFooter: "Tambahkan \"Klip\" ke menu aksi catatan"
|
||||||
reactionsDisplaySize: "Ukuran tampilan reaksi"
|
reactionsDisplaySize: "Ukuran tampilan reaksi"
|
||||||
limitWidthOfReaction: "Batasi lebar maksimum reaksi dan tampilkan dalam ukuran terbatasi."
|
|
||||||
noteIdOrUrl: "ID catatan atau URL"
|
noteIdOrUrl: "ID catatan atau URL"
|
||||||
video: "Video"
|
video: "Video"
|
||||||
videos: "Video"
|
videos: "Video"
|
||||||
audio: "Suara"
|
|
||||||
audioFiles: "Berkas Suara"
|
|
||||||
dataSaver: "Penghemat data"
|
dataSaver: "Penghemat data"
|
||||||
accountMigration: "Pemindahan akun"
|
accountMigration: "Pemindahan akun"
|
||||||
accountMoved: "Pengguna ini telah berpindah ke akun baru:"
|
accountMoved: "Pengguna ini telah berpindah ke akun baru:"
|
||||||
|
@ -1102,7 +1061,6 @@ preservedUsernames: "Nama pengguna tercadangkan"
|
||||||
preservedUsernamesDescription: "Daftar nama pengguna yang dicadangkan dipisah dengan baris baru. Nama pengguna berikut akan tidak dapat dipakai pada pembuatan akun normal, namun dapat digunakan oleh admin untuk membuat akun baru. Akun yang sudah ada dengan menggunakan nama pengguna ini tidak akan terpengaruh."
|
preservedUsernamesDescription: "Daftar nama pengguna yang dicadangkan dipisah dengan baris baru. Nama pengguna berikut akan tidak dapat dipakai pada pembuatan akun normal, namun dapat digunakan oleh admin untuk membuat akun baru. Akun yang sudah ada dengan menggunakan nama pengguna ini tidak akan terpengaruh."
|
||||||
createNoteFromTheFile: "Buat catatan dari berkas ini"
|
createNoteFromTheFile: "Buat catatan dari berkas ini"
|
||||||
archive: "Arsipkan"
|
archive: "Arsipkan"
|
||||||
archived: "Diarsipkan"
|
|
||||||
channelArchiveConfirmTitle: "Yakin untuk mengarsipkan {name}?"
|
channelArchiveConfirmTitle: "Yakin untuk mengarsipkan {name}?"
|
||||||
channelArchiveConfirmDescription: "Kanal yang diarsipkan tidak akan muncul pada daftar kanal atau hasil pencarian. Postingan baru juga tidak dapat ditambahkan lagi."
|
channelArchiveConfirmDescription: "Kanal yang diarsipkan tidak akan muncul pada daftar kanal atau hasil pencarian. Postingan baru juga tidak dapat ditambahkan lagi."
|
||||||
thisChannelArchived: "Kanal ini telah diarsipkan."
|
thisChannelArchived: "Kanal ini telah diarsipkan."
|
||||||
|
@ -1113,7 +1071,6 @@ preventAiLearning: "Tolak penggunaan Pembelajaran Mesin (AI Generatif)"
|
||||||
preventAiLearningDescription: "Minta perayap web untuk tidak menggunakan materi teks atau gambar yang telah diposting ke dalam set data Pembelajaran Mesin (Prediktif / Generatif). Hal ini dicapai dengan menambahkan flag HTML-Response \"noai\" ke masing-masing konten. Pencegahan penuh mungkin tidak dapat dicapai dengan flag ini, karena juga dapat diabaikan begitu saja."
|
preventAiLearningDescription: "Minta perayap web untuk tidak menggunakan materi teks atau gambar yang telah diposting ke dalam set data Pembelajaran Mesin (Prediktif / Generatif). Hal ini dicapai dengan menambahkan flag HTML-Response \"noai\" ke masing-masing konten. Pencegahan penuh mungkin tidak dapat dicapai dengan flag ini, karena juga dapat diabaikan begitu saja."
|
||||||
options: "Opsi peran"
|
options: "Opsi peran"
|
||||||
specifyUser: "Pengguna spesifik"
|
specifyUser: "Pengguna spesifik"
|
||||||
openTagPageConfirm: "Apakah ingin membuka laman tagar?"
|
|
||||||
failedToPreviewUrl: "Tidak dapat dipratinjau"
|
failedToPreviewUrl: "Tidak dapat dipratinjau"
|
||||||
update: "Perbarui"
|
update: "Perbarui"
|
||||||
rolesThatCanBeUsedThisEmojiAsReaction: "Peran yang dapat menggunakan emoji ini sebagai reaksi"
|
rolesThatCanBeUsedThisEmojiAsReaction: "Peran yang dapat menggunakan emoji ini sebagai reaksi"
|
||||||
|
@ -1172,125 +1129,17 @@ showRenotes: "Tampilkan renote"
|
||||||
edited: "Telah disunting"
|
edited: "Telah disunting"
|
||||||
notificationRecieveConfig: "Pengaturan notifikasi"
|
notificationRecieveConfig: "Pengaturan notifikasi"
|
||||||
mutualFollow: "Saling mengikuti"
|
mutualFollow: "Saling mengikuti"
|
||||||
followingOrFollower: "Mengikuti atau pengikut"
|
|
||||||
fileAttachedOnly: "Hanya catatan dengan berkas"
|
fileAttachedOnly: "Hanya catatan dengan berkas"
|
||||||
showRepliesToOthersInTimeline: "Tampilkan balasan ke pengguna lain dalam lini masa"
|
showRepliesToOthersInTimeline: "Tampilkan balasan ke pengguna lain dalam lini masa"
|
||||||
hideRepliesToOthersInTimeline: "Sembunyikan balasan ke orang lain dari lini masa"
|
hideRepliesToOthersInTimeline: "Sembunyikan balasan ke orang lain dari lini masa"
|
||||||
showRepliesToOthersInTimelineAll: "Tampilkan balasan ke lainnya dari semua orang yang kamu ikuti di lini masa"
|
|
||||||
hideRepliesToOthersInTimelineAll: "Sembuyikan balasan ke lainnya dari semua orang yang kamu ikuti di lini masa"
|
|
||||||
confirmShowRepliesAll: "Operasi ini tidak dapat diubah. Apakah kamu yakin untuk menampilkan balasan ke lainnya dari semua orang yang kamu ikuti di lini masa?"
|
|
||||||
confirmHideRepliesAll: "Operasi ini tidak dapat diubah. Apakah kamu yakin untuk menyembunyikan balasan ke lainnya dari semua orang yang kamu ikuti di lini masa?"
|
|
||||||
externalServices: "Layanan eksternal"
|
externalServices: "Layanan eksternal"
|
||||||
sourceCode: "Sumber kode"
|
|
||||||
sourceCodeIsNotYetProvided: "Sumber kode belum tersedia. Hubungi admin untuk memperbaiki masalah ini."
|
|
||||||
repositoryUrl: "URL Repositori"
|
|
||||||
repositoryUrlDescription: "Jika kamu menggunakan Misskey begitu saja (tanpa ada perubahan dalam kode sumber), masukkan https://github.com/misskey-dev/misskey"
|
|
||||||
repositoryUrlOrTarballRequired: "Apabila kamu masih mempublikasikan repositori, kamu setidaknya harus menyediakan berkas tarball. Lihat .config/example.yml untuk informasi lebih lanjut."
|
|
||||||
feedback: "Umpan balik"
|
|
||||||
feedbackUrl: "URL Umpan balik"
|
|
||||||
impressum: "Impressum"
|
impressum: "Impressum"
|
||||||
impressumUrl: "Tautan Impressum"
|
impressumUrl: "Tautan Impressum"
|
||||||
impressumDescription: "Pada beberapa negara seperti Jerman, inklusi dari informasi kontak operator (sebuah Impressum) diperlukan secara legal untuk situs web komersil."
|
impressumDescription: "Pada beberapa negara seperti Jerman, inklusi dari informasi kontak operator (sebuah Impressum) diperlukan secara legal untuk situs web komersil."
|
||||||
privacyPolicy: "Kebijakan Privasi"
|
privacyPolicy: "Kebijakan Privasi"
|
||||||
privacyPolicyUrl: "Tautan Kebijakan Privasi"
|
privacyPolicyUrl: "Tautan Kebijakan Privasi"
|
||||||
tosAndPrivacyPolicy: "Syarat dan Ketentuan serta Kebijakan Privasi"
|
tosAndPrivacyPolicy: "Syarat dan Ketentuan serta Kebijakan Privasi"
|
||||||
avatarDecorations: "Dekorasi avatar"
|
|
||||||
attach: "Lampirkan"
|
|
||||||
detach: "Hapus"
|
|
||||||
detachAll: "Lepas Semua"
|
|
||||||
angle: "Sudut"
|
|
||||||
flip: "Balik"
|
flip: "Balik"
|
||||||
showAvatarDecorations: "Tampilkan dekorasi avatar"
|
|
||||||
releaseToRefresh: "Lepaskan untuk memuat ulang"
|
|
||||||
refreshing: "Sedang memuat ulang..."
|
|
||||||
pullDownToRefresh: "Tarik ke bawah untuk memuat ulang"
|
|
||||||
useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan"
|
|
||||||
signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa."
|
|
||||||
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
|
|
||||||
doReaction: "Tambahkan reaksi"
|
|
||||||
code: "Kode"
|
|
||||||
reloadRequiredToApplySettings: "Muat ulang diperlukan untuk menerapkan pengaturan."
|
|
||||||
remainingN: "Sisa : {n}"
|
|
||||||
overwriteContentConfirm: "Apakah kamu yakin untuk menimpa konten saat ini?"
|
|
||||||
seasonalScreenEffect: "Efek layar musiman"
|
|
||||||
decorate: "Dekor"
|
|
||||||
addMfmFunction: "Tambahkan dekorasi"
|
|
||||||
enableQuickAddMfmFunction: "Tampilkan pemilih MFM tingkat lanjut"
|
|
||||||
bubbleGame: "Bubble Game"
|
|
||||||
sfx: "Efek Suara"
|
|
||||||
soundWillBePlayed: "Suara yang akan dimainkan"
|
|
||||||
showReplay: "Lihat tayangan ulang"
|
|
||||||
replay: "Tayangan ulang"
|
|
||||||
replaying: "Menayangkan Ulang"
|
|
||||||
endReplay: "Keluat dari tayangan ulang"
|
|
||||||
copyReplayData: "Salin data tayangan ulang"
|
|
||||||
ranking: "Peringkat"
|
|
||||||
lastNDays: "{n} hari terakhir"
|
|
||||||
backToTitle: "Ke Judul"
|
|
||||||
hemisphere: "Letak kamu tinggal"
|
|
||||||
withSensitive: "Lampirkan catatan dengan berkas sensitif"
|
|
||||||
userSaysSomethingSensitive: "Postingan oleh {name} mengandung konten sensitif"
|
|
||||||
enableHorizontalSwipe: "Geser untuk mengganti tab"
|
|
||||||
loading: "Memuat..."
|
|
||||||
surrender: "Batalkan"
|
|
||||||
gameRetry: "Coba lagi"
|
|
||||||
notUsePleaseLeaveBlank: "Kosongi bila tidak digunakan"
|
|
||||||
useTotp: "Gunakan TOTP"
|
|
||||||
useBackupCode: "Gunakan kode cadangan"
|
|
||||||
launchApp: "Luncurkan Aplikasi"
|
|
||||||
useNativeUIForVideoAudioPlayer: "Gunakan antarmuka peramban ketika memainkan video dan audio"
|
|
||||||
keepOriginalFilename: "Simpan nama berkas asli"
|
|
||||||
keepOriginalFilenameDescription: "Apabila pengaturan ini dimatikan, nama berkas akan diganti dengan string acak secara otomatis ketika kamu mengunggah berkas."
|
|
||||||
noDescription: "Tidak ada deskripsi"
|
|
||||||
alwaysConfirmFollow: "Selalu konfirmasi ketika mengikuti"
|
|
||||||
inquiry: "Hubungi kami"
|
|
||||||
tryAgain: "Silahkan coba lagi."
|
|
||||||
createdLists: "Senarai yang dibuat"
|
|
||||||
createdAntennas: "Antena yang dibuat"
|
|
||||||
fromX: "Dari {x}"
|
|
||||||
noteOfThisUser: "Catatan oleh pengguna ini"
|
|
||||||
clipNoteLimitExceeded: "Klip ini tak bisa ditambahi lagi catatan."
|
|
||||||
performance: "Kinerja"
|
|
||||||
modified: "Diubah"
|
|
||||||
thereAreNChanges: "Ada {n} perubahan"
|
|
||||||
prohibitedWordsForNameOfUser: "Kata yang dilarang untuk nama pengguna"
|
|
||||||
postForm: "Buat catatan"
|
|
||||||
information: "Informasi"
|
|
||||||
_chat:
|
|
||||||
invitations: "Undang"
|
|
||||||
noHistory: "Tidak ada riwayat"
|
|
||||||
members: "Anggota"
|
|
||||||
home: "Beranda"
|
|
||||||
send: "Kirim"
|
|
||||||
_settings:
|
|
||||||
webhook: "Webhook"
|
|
||||||
_abuseUserReport:
|
|
||||||
accept: "Setuju"
|
|
||||||
reject: "Tolak"
|
|
||||||
_delivery:
|
|
||||||
status: "Status pengiriman"
|
|
||||||
stop: "Ditangguhkan"
|
|
||||||
resume: "Lanjutkan pengiriman"
|
|
||||||
_type:
|
|
||||||
none: "Sedang menyiarkan langsung"
|
|
||||||
manuallySuspended: "Ditangguhkan manual"
|
|
||||||
goneSuspended: "Sedang ditangguhkan untuk penghapusan peladen"
|
|
||||||
autoSuspendedForNotResponding: "Sedang ditangguhkan karena peladen tidak menjawab"
|
|
||||||
_bubbleGame:
|
|
||||||
howToPlay: "Cara bermain"
|
|
||||||
hold: "Tahan"
|
|
||||||
_score:
|
|
||||||
score: "Skor"
|
|
||||||
scoreYen: "Jumlah uang didapat"
|
|
||||||
highScore: "Skor tertinggi"
|
|
||||||
maxChain: "Jumlah skor berantai"
|
|
||||||
yen: "{yen} Yen"
|
|
||||||
estimatedQty: "{qty} buah"
|
|
||||||
scoreSweets: "{onigiriQtyWithUnit} onigiri"
|
|
||||||
_howToPlay:
|
|
||||||
section1: "Atur posisi dan jatuhkan obyek ke dalam kotak."
|
|
||||||
section2: "Ketika dua obyek menyentuh tipe yang sama satu sama lain, obyek tersebut akan berganti dan kamu mendapatkan poin skor."
|
|
||||||
section3: "Permainan berakhir jika obyek memenuhi kotak. Capai skor tertinggi dengan menggabungkan obyek bersama sambil menghindari obyek tersebut memenuhi kotak permainan!"
|
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "Hanya pengguna yang telah ada"
|
forExistingUsers: "Hanya pengguna yang telah ada"
|
||||||
forExistingUsersDescription: "Pengumuman ini akan dimunculkan ke pengguna yang sudah ada dari titik waktu publikasi jika dinyalakan. Apabila dimatikan, mereka yang baru mendaftar setelah publikasi ini akan juga melihatnya."
|
forExistingUsersDescription: "Pengumuman ini akan dimunculkan ke pengguna yang sudah ada dari titik waktu publikasi jika dinyalakan. Apabila dimatikan, mereka yang baru mendaftar setelah publikasi ini akan juga melihatnya."
|
||||||
|
@ -1300,10 +1149,6 @@ _announcement:
|
||||||
tooManyActiveAnnouncementDescription: "Terlalu banyak pengumuman dapat memperburuk pengalaman pengguna. Mohon pertimbangkan untuk mengarsipkan pengumuman yang sudah usang/tidak relevan."
|
tooManyActiveAnnouncementDescription: "Terlalu banyak pengumuman dapat memperburuk pengalaman pengguna. Mohon pertimbangkan untuk mengarsipkan pengumuman yang sudah usang/tidak relevan."
|
||||||
readConfirmTitle: "Tandai telah dibaca?"
|
readConfirmTitle: "Tandai telah dibaca?"
|
||||||
readConfirmText: "Aksi ini akan menandai konten dari \"{title}\" telah dibaca."
|
readConfirmText: "Aksi ini akan menandai konten dari \"{title}\" telah dibaca."
|
||||||
shouldNotBeUsedToPresentPermanentInfo: "Karena dapat berdampak pada pengalaman pengguna untuk pengguna baru, sangat direkomendasikan untuk menggunakan notifikasi secara mengalir daripada tetap."
|
|
||||||
dialogAnnouncementUxWarn: "Memiliki dua atau lebih gaya dialog notifikasi secara bersamaan dapat berdampak signifikan pada pengalaman pengguna, mohon untuk menggunakannya dengan hati-hati."
|
|
||||||
silence: "Tiada notifikasi"
|
|
||||||
silenceDescription: "Apabila diaktifkan, notifikasi dari pengumuman ini akan dilewatkan dan pengguna tidak perlu membacanya."
|
|
||||||
_initialAccountSetting:
|
_initialAccountSetting:
|
||||||
accountCreated: "Akun kamu telah sukses dibuat!"
|
accountCreated: "Akun kamu telah sukses dibuat!"
|
||||||
letsStartAccountSetup: "Untuk pemula, ayo atur profilmu dulu."
|
letsStartAccountSetup: "Untuk pemula, ayo atur profilmu dulu."
|
||||||
|
@ -1316,77 +1161,9 @@ _initialAccountSetting:
|
||||||
pushNotificationDescription: "Menyalakan notifikasi dorong akan membuatmu menerima notifikasi dari {name} secara langsung ke perangkatmu."
|
pushNotificationDescription: "Menyalakan notifikasi dorong akan membuatmu menerima notifikasi dari {name} secara langsung ke perangkatmu."
|
||||||
initialAccountSettingCompleted: "Pengaturan profil selesai!"
|
initialAccountSettingCompleted: "Pengaturan profil selesai!"
|
||||||
haveFun: "Selamat menikmati, {name}!"
|
haveFun: "Selamat menikmati, {name}!"
|
||||||
youCanContinueTutorial: "Kamu dapat menjutkan ke tutorial dalam bagaimana menggunakan {name} (Misskey) atau kamu dapat keluar dari pemasangan ini dan langsung menggunakannya segera."
|
ifYouNeedLearnMore: "Kalau kamu ingin mempelajari lebih lanjut bagaimana cara menggunakan {name} (Misskey), silahkan kunjungi {link}."
|
||||||
startTutorial: "Mulai Tutorial"
|
|
||||||
skipAreYouSure: "Yakin melewati atur profil?"
|
skipAreYouSure: "Yakin melewati atur profil?"
|
||||||
laterAreYouSure: "Yakin banget untuk atur profil nanti?"
|
laterAreYouSure: "Yakin banget untuk atur profil nanti?"
|
||||||
_initialTutorial:
|
|
||||||
launchTutorial: "Lihat Tutorial"
|
|
||||||
title: "Tutorial"
|
|
||||||
wellDone: "Kerja bagus!"
|
|
||||||
skipAreYouSure: "Berhenti dari Tutorial?"
|
|
||||||
_landing:
|
|
||||||
title: "Selamat datang di Tutorial"
|
|
||||||
description: "Di sini kamu dapat mempelajari dasar-dasar dari penggunaan Misskey dan fitur-fiturnya."
|
|
||||||
_note:
|
|
||||||
title: "Apa itu Catatan?"
|
|
||||||
description: "Postingan di Misskey disebut sebagai 'Catatan'. Catatan ditampilkan secara kronologis pada lini masa dan dimutakhirkan secara real-time."
|
|
||||||
reply: "Klik pada tombol ini untuk membalas ke sebuah pesan. Bisa juga untuk membalas ke sebuah balasan dan melanjutkannya seperti percakapan selayaknya utas."
|
|
||||||
renote: "Kamu dapat membagikan catatan ke lini masa milikmu. Kamu juga dapat mengutipnya dengan komentarmu."
|
|
||||||
reaction: "Kamu dapat menambahkan reaksi ke Catatan. Detil lebih lanjut akan dijelaskan di halaman berikutnya."
|
|
||||||
menu: "Kamu dapat melihat detil catatan, menyalin tautan, dan melakukan aksi lainnya."
|
|
||||||
_reaction:
|
|
||||||
title: "Apa itu Reaksi?"
|
|
||||||
description: "Catatan dapat direaksi dengan berbagai emoji. Reaksi memperbolehkan kamu untuk mengekspresikan nuansa yang tidak dapat disampaikan hanya dengan sebuah \"suka\"."
|
|
||||||
letsTryReacting: "Reaksi dapat ditambahkan dengan mengklik tombol '+' pada catatan. Coba lakukan mereaksi contoh catatan ini!"
|
|
||||||
reactToContinue: "Tambahkan reaksi untuk melanjutkan."
|
|
||||||
reactNotification: "Kamu akan menerima notifikasi real0time ketika seseorang mereaksi catatan kamu."
|
|
||||||
reactDone: "Kamu dapat mengurungkan reaksi dengan menekan tombol '-'."
|
|
||||||
_timeline:
|
|
||||||
title: "Konsep Lini Masa"
|
|
||||||
description1: "Misskey menyediakan berbagai lini masa sesuai dengan penggunaan (beberapa mungkin tidak tersedia karena bergantung dengan kebijakan peladen)."
|
|
||||||
home: "Kamu dapat melihat catatan dari akun yang kamu ikuti."
|
|
||||||
local: "Kamu dapat melihat catatan dari semua pengguna yang ada pada peladen ini."
|
|
||||||
social: "Catatan dari linimasa Beranda dan Lokal akan ditampilkan."
|
|
||||||
global: "Kamu dapat melihat catatan dari semua peladen yang terhubung."
|
|
||||||
description2: "Kamu dapat mengganti linimasa di bagian atas layar kamu kapan saja."
|
|
||||||
description3: "Sebagai tambahan, terdapat juga linimasa daftar dan linimasa kanal. Untuk detil lebih lanjut, silahkan melihat ke tautan berikut: {link}."
|
|
||||||
_postNote:
|
|
||||||
title: "Pengaturan posting Catatan"
|
|
||||||
description1: "Ketika memposting catatan ke Misskey, terdapat beberapa opsi yang tersedia. Form posting terlihat seperti ini."
|
|
||||||
_visibility:
|
|
||||||
description: "Kamu dapat membatasi siapa yang dapat melihat catatan kamu."
|
|
||||||
public: "Perlihatkan catatan ke semua pengguna."
|
|
||||||
home: "Hanya publik ke lini masa Beranda. Pengguna yang mengunjungi profilmu melalui pengikut dan renote dapat melihatnya."
|
|
||||||
followers: "Perlihatkan ke pengikut saja. Hanya pengikut yang dapat melihat postinganmu dan tidak dapat direnote oleh siapapun."
|
|
||||||
direct: "Hanya perlihatkan ke pengguna spesifik dan penerima akan diberi tahu. Dapat juga digunakan sebagai alternatif dari pesan langsung."
|
|
||||||
doNotSendConfidencialOnDirect1: "Hati-hati ketika mengirim informasi yang sensitif!"
|
|
||||||
doNotSendConfidencialOnDirect2: "Admin dari peladen dapat melihat apa yang kamu tulis. Hati-hati dengan informasi sensitif ketika mengirimkan catatan langsung kepada pengguna pada peladen yang tidak dipercaya."
|
|
||||||
localOnly: "Memposting dengan opsi ini tidak akan memfederasi catatan ke peladen lain. Pengguna pada peladen lain tidak akan dapat melihat catatan ini secara langsung, meskipun dengan pengaturan visibilitas yang sudah diatur di atas."
|
|
||||||
_cw:
|
|
||||||
title: "Peringatan Konten (CW)"
|
|
||||||
description: "Alih-alih isinya, konten yang ditulis dalam kolom 'komentar' akan ditampilkan. Menekan 'Selebihnya' akan menampilkan isi konten."
|
|
||||||
_exampleNote:
|
|
||||||
cw: "Peringatan: Bikin Lapar!"
|
|
||||||
note: "Baru aja makan donat berlapis coklat 🍩😋"
|
|
||||||
useCases: "Fungsi ini digunakan ketika mengikutik panduan peladen untuk catatan yang dibutuhkan atau untuk membatasi diri dari teks sensitif atau spoiler."
|
|
||||||
_howToMakeAttachmentsSensitive:
|
|
||||||
title: "Bagaimana menandai lampiran sebagai sensitif?"
|
|
||||||
description: "Fungsi ini digunakan untuk lampiran yang dibutuhkan oleh panduan peladen atau sesuatu yang seharusnya tidak boleh dibiarkan begitu saja dengan cara menambahkan penanda \"sensitif\"."
|
|
||||||
tryThisFile: "Coba tandai gambar yang dilampirkan pada form ini sebagai sensitif!"
|
|
||||||
_exampleNote:
|
|
||||||
note: "Ups, kesalahan banget buka penutup wadah natto..."
|
|
||||||
method: "Untuk menandai lampiran sebagai sensitif, klik gambar pada berkas, buka menu, lalu klik \"Tandai sebagai sensitif\"."
|
|
||||||
sensitiveSucceeded: "Ketika melampirkan berkas, mohon atur sensitifitas sesuai dengan panduan peladen."
|
|
||||||
doItToContinue: "Tandai berkas terlampir sebagai sensitif untuk melanjutkan."
|
|
||||||
_done:
|
|
||||||
title: "Kamu telah menyelesaikan tutorial! 🎉"
|
|
||||||
description: "Fungsi yang diperkenalkan di sini merupakan sebagian kecil dari fitur yang ada. Untuk pemahaman lebih detil dalam menggunakan Misskey, kamu dapat merujuk ke {link}."
|
|
||||||
_timelineDescription:
|
|
||||||
home: "Pada linimasa Beranda, kamu dapat melihat catatan dari akun yang kamu ikuti."
|
|
||||||
local: "Pada linimasa Lokal, kamu dapat melihat catatan dari semua pengguna yang ada pada peladen ini."
|
|
||||||
social: "Linimasa sosial menampilkan catatan dari kedua linimasa Beranda dan Lokal."
|
|
||||||
global: "Pada linimasa Global, kamu dapat melihat catatan dari semua peladen yang terhubung."
|
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "Daftar peraturan akan ditampilkan sebelum pendaftaran. Mengatur ringkasan dari Syarat dan Ketentuan sangat direkomendasikan."
|
description: "Daftar peraturan akan ditampilkan sebelum pendaftaran. Mengatur ringkasan dari Syarat dan Ketentuan sangat direkomendasikan."
|
||||||
_serverSettings:
|
_serverSettings:
|
||||||
|
@ -1398,9 +1175,6 @@ _serverSettings:
|
||||||
manifestJsonOverride: "Ambil alih manifest.json"
|
manifestJsonOverride: "Ambil alih manifest.json"
|
||||||
shortName: "Nama pendek"
|
shortName: "Nama pendek"
|
||||||
shortNameDescription: "Inisial untuk nama instansi yang dapat ditampilkan apabila nama lengkap resmi terlalu panjang."
|
shortNameDescription: "Inisial untuk nama instansi yang dapat ditampilkan apabila nama lengkap resmi terlalu panjang."
|
||||||
fanoutTimelineDescription: "Dapat meningkatkan performa dalam pengambilan data linimasa dan mengurangi beban pada database ketika dinyalakan. Sebagai gantinya, penggunaan memory pada Redis akan meningkan. Pertimbangkan untuk menonaktifkan fitur ini jika mengalami kekurangan memori pada server atau menyebabkan server tidak stabil."
|
|
||||||
fanoutTimelineDbFallback: "Fallback ke database"
|
|
||||||
fanoutTimelineDbFallbackDescription: "Ketika diaktifkan, lini masa akan fallback ke database untuk melakukan kueri tambahan apabila linimasa tidak disimpan dalam cache. Menonaktifkan ini dapat mengurangi beban server dengan mengeliminasi proses fallback, namun dapat berakibat membatasi jarak data dari lini masa yang dapat diambil."
|
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
moveFrom: "Pindahkan akun lain ke akun ini"
|
moveFrom: "Pindahkan akun lain ke akun ini"
|
||||||
moveFromSub: "Buat alias ke akun lain"
|
moveFromSub: "Buat alias ke akun lain"
|
||||||
|
@ -1658,16 +1432,6 @@ _achievements:
|
||||||
_smashTestNotificationButton:
|
_smashTestNotificationButton:
|
||||||
title: "Tes overflow"
|
title: "Tes overflow"
|
||||||
description: "Picu tes notifikasi secara berulang dalam waktu yang sangat pendek"
|
description: "Picu tes notifikasi secara berulang dalam waktu yang sangat pendek"
|
||||||
_tutorialCompleted:
|
|
||||||
title: "Ijazah Sekolah Dasar Misskey"
|
|
||||||
description: "Tutorial selesai"
|
|
||||||
_bubbleGameExplodingHead:
|
|
||||||
title: "🤯"
|
|
||||||
description: "Obyek paling terbesar di permainan gelembung"
|
|
||||||
_bubbleGameDoubleExplodingHead:
|
|
||||||
title: "Ganda 🤯"
|
|
||||||
description: "Dua dari obyek paling terbesar pada permainan gelembung di waktu yang sama"
|
|
||||||
flavor: "Kamu dapat mengisi kotak makan siang seperti ini 🤯 🤯."
|
|
||||||
_role:
|
_role:
|
||||||
new: "Buat peran"
|
new: "Buat peran"
|
||||||
edit: "Sunting peran"
|
edit: "Sunting peran"
|
||||||
|
@ -1678,9 +1442,7 @@ _role:
|
||||||
assignTarget: "Tipe tugas"
|
assignTarget: "Tipe tugas"
|
||||||
descriptionOfAssignTarget: "<b>Manual</b> untuk mengganti secara manual siapa yang mendapatkan peran ini dan siapa yang tidak.\n<b>Kondisional</b> untuk pengguna secara otomatis dimasukkan atau dihapus dari peran berdasarkan kondisi yang ditentukan."
|
descriptionOfAssignTarget: "<b>Manual</b> untuk mengganti secara manual siapa yang mendapatkan peran ini dan siapa yang tidak.\n<b>Kondisional</b> untuk pengguna secara otomatis dimasukkan atau dihapus dari peran berdasarkan kondisi yang ditentukan."
|
||||||
manual: "Manual"
|
manual: "Manual"
|
||||||
manualRoles: "Peran manual"
|
|
||||||
conditional: "Kondisional"
|
conditional: "Kondisional"
|
||||||
conditionalRoles: "Peran kondisional"
|
|
||||||
condition: "Kondisi"
|
condition: "Kondisi"
|
||||||
isConditionalRole: "Ini adalah peran kondisional"
|
isConditionalRole: "Ini adalah peran kondisional"
|
||||||
isPublic: "Publikkan Peran"
|
isPublic: "Publikkan Peran"
|
||||||
|
@ -1708,13 +1470,11 @@ _role:
|
||||||
gtlAvailable: "Dapat melihat lini masa global"
|
gtlAvailable: "Dapat melihat lini masa global"
|
||||||
ltlAvailable: "Dapat melihat lini masa lokal"
|
ltlAvailable: "Dapat melihat lini masa lokal"
|
||||||
canPublicNote: "Dapat mengirim catatan publik"
|
canPublicNote: "Dapat mengirim catatan publik"
|
||||||
mentionMax: "Jumlah maksimum sebutan dalam sebuah catatan"
|
|
||||||
canInvite: "Dapat membuat kode undangan instansi"
|
canInvite: "Dapat membuat kode undangan instansi"
|
||||||
inviteLimit: "Batas jumlah undangan"
|
inviteLimit: "Batas jumlah undangan"
|
||||||
inviteLimitCycle: "Interval Penerbitan Kode Undangan"
|
inviteLimitCycle: "Interval Penerbitan Kode Undangan"
|
||||||
inviteExpirationTime: "Interval kedaluwarsa undangan"
|
inviteExpirationTime: "Interval kedaluwarsa undangan"
|
||||||
canManageCustomEmojis: "Dapat mengelola Emoji kustom"
|
canManageCustomEmojis: "Dapat mengelola Emoji kustom"
|
||||||
canManageAvatarDecorations: "Kelola dekorasi avatar"
|
|
||||||
driveCapacity: "Kapasitas Drive"
|
driveCapacity: "Kapasitas Drive"
|
||||||
alwaysMarkNsfw: "Selalu tandai berkas sebagai NSFW"
|
alwaysMarkNsfw: "Selalu tandai berkas sebagai NSFW"
|
||||||
pinMax: "Jumlah maksimal catatan yang disematkan"
|
pinMax: "Jumlah maksimal catatan yang disematkan"
|
||||||
|
@ -1730,18 +1490,9 @@ _role:
|
||||||
canHideAds: "Dapat menyembunyikan iklan"
|
canHideAds: "Dapat menyembunyikan iklan"
|
||||||
canSearchNotes: "Penggunaan pencarian catatan"
|
canSearchNotes: "Penggunaan pencarian catatan"
|
||||||
canUseTranslator: "Penggunaan penerjemah"
|
canUseTranslator: "Penggunaan penerjemah"
|
||||||
avatarDecorationLimit: "Jumlah maksimum dekorasi avatar yang dapat diterapkan"
|
|
||||||
canImportAntennas: "Izinkan mengimpor antena"
|
|
||||||
canImportUserLists: "Izinkan mengimpor senarai"
|
|
||||||
_condition:
|
_condition:
|
||||||
roleAssignedTo: "Ditugaskan ke peran manual"
|
|
||||||
isLocal: "Pengguna lokal"
|
isLocal: "Pengguna lokal"
|
||||||
isRemote: "Pengguna remote"
|
isRemote: "Pengguna remote"
|
||||||
isCat: "Pengguna Kucing"
|
|
||||||
isBot: "Pengguna Bot"
|
|
||||||
isSuspended: "Pengguna yang ditangguhkan"
|
|
||||||
isLocked: "Akun privat"
|
|
||||||
isExplorable: "Pengguna efektif yang akunnya dapat dicari"
|
|
||||||
createdLessThan: "Telah berlalu kurang dari X sejak pembuatan akun"
|
createdLessThan: "Telah berlalu kurang dari X sejak pembuatan akun"
|
||||||
createdMoreThan: "Telah berlalu lebih dari X sejak pembuatan akun"
|
createdMoreThan: "Telah berlalu lebih dari X sejak pembuatan akun"
|
||||||
followersLessThanOrEq: "Memiliki pengikut X atau kurang dari tersebut"
|
followersLessThanOrEq: "Memiliki pengikut X atau kurang dari tersebut"
|
||||||
|
@ -1767,9 +1518,8 @@ _emailUnavailable:
|
||||||
disposable: "Alamat surel temporer tidak dapat digunakan"
|
disposable: "Alamat surel temporer tidak dapat digunakan"
|
||||||
mx: "Peladen alamat surel ini tidak valid"
|
mx: "Peladen alamat surel ini tidak valid"
|
||||||
smtp: "Peladen alamat surel ini tidak merespon"
|
smtp: "Peladen alamat surel ini tidak merespon"
|
||||||
banned: "Kamu tidak dapat mendaftar dengan alamat surel ini"
|
|
||||||
_ffVisibility:
|
_ffVisibility:
|
||||||
public: "Publik"
|
public: "Terbitkan"
|
||||||
followers: "Tampil untuk pengikut saja"
|
followers: "Tampil untuk pengikut saja"
|
||||||
private: "Tersembunyi"
|
private: "Tersembunyi"
|
||||||
_signup:
|
_signup:
|
||||||
|
@ -1811,7 +1561,6 @@ _plugin:
|
||||||
installWarn: "Mohon jangan memasang plugin yang tidak dapat dipercayai."
|
installWarn: "Mohon jangan memasang plugin yang tidak dapat dipercayai."
|
||||||
manage: "Manajemen plugin"
|
manage: "Manajemen plugin"
|
||||||
viewSource: "Lihat sumber"
|
viewSource: "Lihat sumber"
|
||||||
viewLog: "Tampilkan log"
|
|
||||||
_preferencesBackups:
|
_preferencesBackups:
|
||||||
list: "Cadangan yang dibuat"
|
list: "Cadangan yang dibuat"
|
||||||
saveNew: "Simpan cadangan baru"
|
saveNew: "Simpan cadangan baru"
|
||||||
|
@ -1841,13 +1590,10 @@ _aboutMisskey:
|
||||||
contributors: "Kontributor utama"
|
contributors: "Kontributor utama"
|
||||||
allContributors: "Seluruh kontributor"
|
allContributors: "Seluruh kontributor"
|
||||||
source: "Sumber kode"
|
source: "Sumber kode"
|
||||||
original: "Asli"
|
|
||||||
thisIsModifiedVersion: "{name} menggunakan versi modifikasi dari Misskey yang asli."
|
|
||||||
translation: "Terjemahkan Misskey"
|
translation: "Terjemahkan Misskey"
|
||||||
donate: "Donasi ke Misskey"
|
donate: "Donasi ke Misskey"
|
||||||
morePatrons: "Kami sangat mengapresiasi dukungan dari banyak penolong lain yang tidak tercantum disini. Terima kasih! 🥰"
|
morePatrons: "Kami sangat mengapresiasi dukungan dari banyak penolong lain yang tidak tercantum disini. Terima kasih! 🥰"
|
||||||
patrons: "Pendukung"
|
patrons: "Pendukung"
|
||||||
projectMembers: "Anggota proyek"
|
|
||||||
_displayOfSensitiveMedia:
|
_displayOfSensitiveMedia:
|
||||||
respect: "Sembunyikan media yang ditandai sensitif"
|
respect: "Sembunyikan media yang ditandai sensitif"
|
||||||
ignore: "Tampilkan media yang ditandai sensitif"
|
ignore: "Tampilkan media yang ditandai sensitif"
|
||||||
|
@ -1872,7 +1618,6 @@ _channel:
|
||||||
notesCount: "terdapat {n} catatan"
|
notesCount: "terdapat {n} catatan"
|
||||||
nameAndDescription: "Nama dan deskripsi"
|
nameAndDescription: "Nama dan deskripsi"
|
||||||
nameOnly: "Hanya nama"
|
nameOnly: "Hanya nama"
|
||||||
allowRenoteToExternal: "Perbolehkan catat ulang dan kutipan di luar dari kanal"
|
|
||||||
_menuDisplay:
|
_menuDisplay:
|
||||||
sideFull: "Horisontal"
|
sideFull: "Horisontal"
|
||||||
sideIcon: "Horisontal (Ikon)"
|
sideIcon: "Horisontal (Ikon)"
|
||||||
|
@ -1928,6 +1673,7 @@ _theme:
|
||||||
header: "Header"
|
header: "Header"
|
||||||
navBg: "Latar belakang bilah samping"
|
navBg: "Latar belakang bilah samping"
|
||||||
navFg: "Teks bilah samping"
|
navFg: "Teks bilah samping"
|
||||||
|
navHoverFg: "Teks bilah samping (Mengambang)"
|
||||||
navActive: "Teks bilah samping (Aktif)"
|
navActive: "Teks bilah samping (Aktif)"
|
||||||
navIndicator: "Indikator bilah samping"
|
navIndicator: "Indikator bilah samping"
|
||||||
link: "Tautan"
|
link: "Tautan"
|
||||||
|
@ -1949,22 +1695,20 @@ _theme:
|
||||||
buttonBg: "Latar belakang tombol"
|
buttonBg: "Latar belakang tombol"
|
||||||
buttonHoverBg: "Latar belakang tombol (Mengambang)"
|
buttonHoverBg: "Latar belakang tombol (Mengambang)"
|
||||||
inputBorder: "Batas bidang masukan"
|
inputBorder: "Batas bidang masukan"
|
||||||
|
listItemHoverBg: "Latar belakang daftar item (Mengambang)"
|
||||||
|
driveFolderBg: "Latar belakang folder drive"
|
||||||
|
wallpaperOverlay: "Lapisan wallpaper"
|
||||||
badge: "Lencana"
|
badge: "Lencana"
|
||||||
messageBg: "Latar belakang obrolan"
|
messageBg: "Latar belakang obrolan"
|
||||||
|
accentDarken: "Aksen (Gelap)"
|
||||||
|
accentLighten: "Aksen (Terang)"
|
||||||
fgHighlighted: "Teks yang disorot"
|
fgHighlighted: "Teks yang disorot"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "Catatan"
|
note: "Catatan"
|
||||||
noteMy: "Catatan (Saya)"
|
noteMy: "Catatan (Saya)"
|
||||||
notification: "Notifikasi"
|
notification: "Notifikasi"
|
||||||
reaction: "Ketika memilih reaksi"
|
antenna: "Penerimaan Antenna"
|
||||||
_soundSettings:
|
channel: "Notifikasi Kanal"
|
||||||
driveFile: "Menggunakan berkas audio dalam Drive"
|
|
||||||
driveFileWarn: "Pilih berkas audio dari Drive"
|
|
||||||
driveFileTypeWarn: "Berkas ini tidak didukung"
|
|
||||||
driveFileTypeWarnDescription: "Pilih berkas audio"
|
|
||||||
driveFileDurationWarn: "Audio ini terlalu panjang"
|
|
||||||
driveFileDurationWarnDescription: "Audio panjang dapat mengganggu penggunaan Misskey. Masih ingin melanjutkan?"
|
|
||||||
driveFileError: "Tak bisa memuat audio. Mohon ubah pengaturan"
|
|
||||||
_ago:
|
_ago:
|
||||||
future: "Masa depan"
|
future: "Masa depan"
|
||||||
justNow: "Baru saja"
|
justNow: "Baru saja"
|
||||||
|
@ -1976,24 +1720,27 @@ _ago:
|
||||||
monthsAgo: "{n} bulan lalu"
|
monthsAgo: "{n} bulan lalu"
|
||||||
yearsAgo: "{n} tahun lalu"
|
yearsAgo: "{n} tahun lalu"
|
||||||
invalid: "Tidak ada sama sekali disini"
|
invalid: "Tidak ada sama sekali disini"
|
||||||
_timeIn:
|
|
||||||
seconds: "dalam {n} detik"
|
|
||||||
minutes: "dalam {n} menit"
|
|
||||||
hours: "dalam {n} jam"
|
|
||||||
days: "dalam {n} hari"
|
|
||||||
weeks: "dalam {n} minggu"
|
|
||||||
months: "dalam {n} bulan"
|
|
||||||
years: "dalam {n} tahun"
|
|
||||||
_time:
|
_time:
|
||||||
second: "detik"
|
second: "detik"
|
||||||
minute: "menit"
|
minute: "menit"
|
||||||
hour: "jam"
|
hour: "jam"
|
||||||
day: "hari"
|
day: "hari"
|
||||||
|
_timelineTutorial:
|
||||||
|
title: "Bagaimana cara menggunakan Misskey"
|
||||||
|
step1_1: "Ini adalah \"lini masa\". Semua \"catatan\" yang dikirimkan oleh {name} akan dimunculkan secara kronologis di sini."
|
||||||
|
step1_2: "Ada beberapa lini masa yang berbeda. Seperti contoh, \"Lini masa Beranda\" berisi catatan dari pengguna yang kamu ikuti, dan \"Lini masa lokal\" berisi catatan dari semua pengguna dari {name}."
|
||||||
|
step2_1: "Selanjutnya, mari kita coba memposting sebuah catatan. Kamu dapat melakukanya dengan menekan tombol dengan ikon pensil."
|
||||||
|
step2_2: "Bagaimana dengan menuliskan sedikit perkenalan diri, atau hanya \"Hello {name}\" kalau kamu lagi ngga feeling?"
|
||||||
|
step3_1: "Udah selesai memposting catatan pertamamu?"
|
||||||
|
step3_2: "Catatan pertamamu seharusnya sekarang sudah tampil di lini masa kamu."
|
||||||
|
step4_1: "Kamu dapat menyisipkan \"Reaksi\" ke dalam catatan."
|
||||||
|
step4_2: "Untuk menyisipkan reaksi, tekan tanda \"+\" dalam catatan dan pilih emoji yang kamu suka untuk mereaksi catatan tersebut."
|
||||||
_2fa:
|
_2fa:
|
||||||
alreadyRegistered: "Kamu telah mendaftarkan perangkat autentikasi 2-faktor."
|
alreadyRegistered: "Kamu telah mendaftarkan perangkat autentikasi 2-faktor."
|
||||||
registerTOTP: "Daftarkan aplikasi autentikator"
|
registerTOTP: "Daftarkan aplikasi autentikator"
|
||||||
step1: "Pertama, pasang aplikasi autentikasi (seperti {a} atau {b}) di perangkat kamu."
|
step1: "Pertama, pasang aplikasi autentikasi (seperti {a} atau {b}) di perangkat kamu."
|
||||||
step2: "Lalu, pindai kode QR yang ada di layar."
|
step2: "Lalu, pindai kode QR yang ada di layar."
|
||||||
|
step2Click: "Mengeklik kode QR ini akan membolehkanmu untuk mendaftarkan 2FA ke security-key atau aplikasi autentikator ponsel."
|
||||||
step2Uri: "Masukkan URI berikut jika kamu menggunakan program desktop"
|
step2Uri: "Masukkan URI berikut jika kamu menggunakan program desktop"
|
||||||
step3Title: "Masukkan kode autentikasi"
|
step3Title: "Masukkan kode autentikasi"
|
||||||
step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan pemasangan."
|
step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan pemasangan."
|
||||||
|
@ -2017,7 +1764,6 @@ _2fa:
|
||||||
backupCodesDescription: "Kamu dapat menggunakan kode ini untuk mendapatkan akses ke akun kamu apabila berada dalam situasi tidak dapat menggunakan aplikasi autentikasi 2-faktor yang kamu miliki. Setiap kode hanya dapat digunakan satu kali. Mohon simpan kode ini di tempat yang aman."
|
backupCodesDescription: "Kamu dapat menggunakan kode ini untuk mendapatkan akses ke akun kamu apabila berada dalam situasi tidak dapat menggunakan aplikasi autentikasi 2-faktor yang kamu miliki. Setiap kode hanya dapat digunakan satu kali. Mohon simpan kode ini di tempat yang aman."
|
||||||
backupCodeUsedWarning: "Kode cadangan telah digunakan. Mohon mengatur ulang autentikasi 2-faktor secepatnya apabila kamu sudah tidak dapat menggunakannya lagi."
|
backupCodeUsedWarning: "Kode cadangan telah digunakan. Mohon mengatur ulang autentikasi 2-faktor secepatnya apabila kamu sudah tidak dapat menggunakannya lagi."
|
||||||
backupCodesExhaustedWarning: "Semua kode cadangan telah digunakan. Apabila kamu kehilangan akses pada aplikasi autentikasi 2-faktor milikmu, kamu tidak dapat mengakses akun ini lagi. Mohon atur ulang autentikasi 2-faktor kamu."
|
backupCodesExhaustedWarning: "Semua kode cadangan telah digunakan. Apabila kamu kehilangan akses pada aplikasi autentikasi 2-faktor milikmu, kamu tidak dapat mengakses akun ini lagi. Mohon atur ulang autentikasi 2-faktor kamu."
|
||||||
moreDetailedGuideHere: "Berikut panduan detilnya"
|
|
||||||
_permissions:
|
_permissions:
|
||||||
"read:account": "Lihat informasi akun"
|
"read:account": "Lihat informasi akun"
|
||||||
"write:account": "Sunting informasi akun"
|
"write:account": "Sunting informasi akun"
|
||||||
|
@ -2055,55 +1801,6 @@ _permissions:
|
||||||
"write:flash": "Sunting Play"
|
"write:flash": "Sunting Play"
|
||||||
"read:flash-likes": "Lihat daftar Play yang disukai"
|
"read:flash-likes": "Lihat daftar Play yang disukai"
|
||||||
"write:flash-likes": "Sunting daftar Play yang disukai"
|
"write:flash-likes": "Sunting daftar Play yang disukai"
|
||||||
"read:admin:abuse-user-reports": "Lihat laporan pengguna"
|
|
||||||
"write:admin:delete-account": "Hapus akun pengguna"
|
|
||||||
"write:admin:delete-all-files-of-a-user": "Hapus semua berkas dari seorang pengguna"
|
|
||||||
"read:admin:index-stats": "Lihat statistik indeks basis data"
|
|
||||||
"read:admin:table-stats": "Lihat statistik tabel basis data"
|
|
||||||
"read:admin:user-ips": "Lihat alamat IP pengguna"
|
|
||||||
"read:admin:meta": "Lihat metadata instansi"
|
|
||||||
"write:admin:reset-password": "Atur ulang kata sandi pengguna"
|
|
||||||
"write:admin:resolve-abuse-user-report": "Selesaikan laporan pengguna"
|
|
||||||
"write:admin:send-email": "Mengirim surel"
|
|
||||||
"read:admin:server-info": "Lihat informasi peladen"
|
|
||||||
"read:admin:show-moderation-log": "Lihat log moderasi"
|
|
||||||
"read:admin:show-user": "Lihat informasi pengguna privat"
|
|
||||||
"write:admin:suspend-user": "Tangguhkan pengguna"
|
|
||||||
"write:admin:unset-user-avatar": "Hapus avatar pengguna"
|
|
||||||
"write:admin:unset-user-banner": "Hapus banner pengguna"
|
|
||||||
"write:admin:unsuspend-user": "Batalkan penangguhan pengguna"
|
|
||||||
"write:admin:meta": "Kelola metadata instansi"
|
|
||||||
"write:admin:user-note": "Kelola moderasi catatan"
|
|
||||||
"write:admin:roles": "Kelola peran"
|
|
||||||
"read:admin:roles": "Lihat peran"
|
|
||||||
"write:admin:relays": "Kelola relay"
|
|
||||||
"read:admin:relays": "Lihat relay"
|
|
||||||
"write:admin:invite-codes": "Kelola kode undangan"
|
|
||||||
"read:admin:invite-codes": "Lihat kode undangan"
|
|
||||||
"write:admin:announcements": "Kelola pengumuman"
|
|
||||||
"read:admin:announcements": "Lihat Pengumuman"
|
|
||||||
"write:admin:avatar-decorations": "Kelola dekorasi avatar"
|
|
||||||
"read:admin:avatar-decorations": "Lihat dekorasi avatar"
|
|
||||||
"write:admin:federation": "Kelola data federasi"
|
|
||||||
"write:admin:account": "Kelola akun pengguna"
|
|
||||||
"read:admin:account": "Lihat akun pengguna"
|
|
||||||
"write:admin:emoji": "Kelola emoji"
|
|
||||||
"read:admin:emoji": "Lihat emoji"
|
|
||||||
"write:admin:queue": "Kelola antrian kerja"
|
|
||||||
"read:admin:queue": "Lihat informasi antrian kerja"
|
|
||||||
"write:admin:promo": "Kelola catatan promosi"
|
|
||||||
"write:admin:drive": "Kelola drive pengguna"
|
|
||||||
"read:admin:drive": "Kelola informasi drive pengguna"
|
|
||||||
"read:admin:stream": "Gunakan API WebSocket untuk Admin"
|
|
||||||
"write:admin:ad": "Kelola iklan"
|
|
||||||
"read:admin:ad": "Lihat iklan"
|
|
||||||
"write:invite-codes": "Membuat kode undangan"
|
|
||||||
"read:invite-codes": "Mendapatkan kode undangan"
|
|
||||||
"write:clip-favorite": "Kelola klip yang difavoritkan"
|
|
||||||
"read:clip-favorite": "Lihat klip yang difavoritkan"
|
|
||||||
"read:federation": "Mendapatkan data federasi"
|
|
||||||
"write:report-abuse": "Melaporkan pelanggaran"
|
|
||||||
"write:chat": "Buat atau hapus obrolan"
|
|
||||||
_auth:
|
_auth:
|
||||||
shareAccessTitle: "Mendapatkan ijin akses aplikasi"
|
shareAccessTitle: "Mendapatkan ijin akses aplikasi"
|
||||||
shareAccess: "Apakah kamu ingin mengijinkan \"{name}\" untuk mengakses akun ini?"
|
shareAccess: "Apakah kamu ingin mengijinkan \"{name}\" untuk mengakses akun ini?"
|
||||||
|
@ -2158,7 +1855,6 @@ _widgets:
|
||||||
_userList:
|
_userList:
|
||||||
chooseList: "Pilih daftar"
|
chooseList: "Pilih daftar"
|
||||||
clicker: "Pengeklik"
|
clicker: "Pengeklik"
|
||||||
birthdayFollowings: "Pengguna yang merayakan hari ulang tahunnya hari ini"
|
|
||||||
_cw:
|
_cw:
|
||||||
hide: "Sembunyikan"
|
hide: "Sembunyikan"
|
||||||
show: "Lihat konten"
|
show: "Lihat konten"
|
||||||
|
@ -2221,11 +1917,9 @@ _profile:
|
||||||
changeAvatar: "Ubah avatar"
|
changeAvatar: "Ubah avatar"
|
||||||
changeBanner: "Ubah header"
|
changeBanner: "Ubah header"
|
||||||
verifiedLinkDescription: "Dengan memasukkan URL yang mengandung tautan ke profil kamu di sini, ikon verifikasi kepemilikan dapat ditampilkan di sebelah kolom ini."
|
verifiedLinkDescription: "Dengan memasukkan URL yang mengandung tautan ke profil kamu di sini, ikon verifikasi kepemilikan dapat ditampilkan di sebelah kolom ini."
|
||||||
avatarDecorationMax: "Dapat ditambahkan hingga {max} dekorasi."
|
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Semua catatan"
|
allNotes: "Semua catatan"
|
||||||
favoritedNotes: "Catatan favorit"
|
favoritedNotes: "Catatan favorit"
|
||||||
clips: "Klip"
|
|
||||||
followingList: "Ikuti"
|
followingList: "Ikuti"
|
||||||
muteList: "Bisukan"
|
muteList: "Bisukan"
|
||||||
blockingList: "Blokir"
|
blockingList: "Blokir"
|
||||||
|
@ -2279,11 +1973,13 @@ _play:
|
||||||
title: "Judul"
|
title: "Judul"
|
||||||
script: "Script"
|
script: "Script"
|
||||||
summary: "Deskripsi"
|
summary: "Deskripsi"
|
||||||
visibilityDescription: "Membuat catatan ini privat berarti tidak akan terlihat pada profil kamu, namun siapapun yang memiliki URL dari catatan ini akan dapat mengaksesnya."
|
|
||||||
_pages:
|
_pages:
|
||||||
newPage: "Buat halaman baru"
|
newPage: "Buat halaman baru"
|
||||||
editPage: "Sunting halaman"
|
editPage: "Sunting halaman"
|
||||||
readPage: "Lihat sumber kode aktif"
|
readPage: "Lihat sumber kode aktif"
|
||||||
|
created: "Halaman berhasil dibuat"
|
||||||
|
updated: "Halaman berhasil diperbaharui!"
|
||||||
|
deleted: "Halaman telah dihapus"
|
||||||
pageSetting: "Pengaturan Halaman"
|
pageSetting: "Pengaturan Halaman"
|
||||||
nameAlreadyExists: "URL Halaman yang ditentukan sudah ada"
|
nameAlreadyExists: "URL Halaman yang ditentukan sudah ada"
|
||||||
invalidNameTitle: "URL Halaman yang ditentukan tidak valid"
|
invalidNameTitle: "URL Halaman yang ditentukan tidak valid"
|
||||||
|
@ -2321,8 +2017,6 @@ _pages:
|
||||||
section: "Bagian"
|
section: "Bagian"
|
||||||
image: "Gambar"
|
image: "Gambar"
|
||||||
button: "Tombol"
|
button: "Tombol"
|
||||||
dynamic: "Blok Dinamis"
|
|
||||||
dynamicDescription: "Blok ini telah dihapus. Mohon gunakan {play} dari sekarang."
|
|
||||||
note: "Catatan yang ditanam"
|
note: "Catatan yang ditanam"
|
||||||
_note:
|
_note:
|
||||||
id: "ID Catatan"
|
id: "ID Catatan"
|
||||||
|
@ -2344,18 +2038,12 @@ _notification:
|
||||||
pollEnded: "Hasil Kuesioner telah keluar"
|
pollEnded: "Hasil Kuesioner telah keluar"
|
||||||
newNote: "Catatan baru"
|
newNote: "Catatan baru"
|
||||||
unreadAntennaNote: "Antena {name}"
|
unreadAntennaNote: "Antena {name}"
|
||||||
roleAssigned: "Peran Diberikan"
|
|
||||||
emptyPushNotificationMessage: "Pembaruan notifikasi dorong"
|
emptyPushNotificationMessage: "Pembaruan notifikasi dorong"
|
||||||
achievementEarned: "Pencapaian didapatkan"
|
achievementEarned: "Pencapaian didapatkan"
|
||||||
testNotification: "Tes notifikasi"
|
testNotification: "Tes notifikasi"
|
||||||
checkNotificationBehavior: "Cek tampilan notifikasi"
|
checkNotificationBehavior: "Cek tampilan notifikasi"
|
||||||
sendTestNotification: "Kirim tes notifikasi"
|
sendTestNotification: "Kirim tes notifikasi"
|
||||||
notificationWillBeDisplayedLikeThis: "Notifikasi akan terlihat seperti ini"
|
notificationWillBeDisplayedLikeThis: "Notifikasi akan terlihat seperti ini"
|
||||||
reactedBySomeUsers: "{n} orang memberikan reaksi"
|
|
||||||
likedBySomeUsers: "{n} pengguna menyukai catatan kamu"
|
|
||||||
renotedBySomeUsers: "{n} orang telah merenote"
|
|
||||||
followedBySomeUsers: "{n} orang telah mengikuti"
|
|
||||||
flushNotification: "Bersihkan notifikasi"
|
|
||||||
_types:
|
_types:
|
||||||
all: "Semua"
|
all: "Semua"
|
||||||
note: "Catatan baru"
|
note: "Catatan baru"
|
||||||
|
@ -2368,9 +2056,7 @@ _notification:
|
||||||
pollEnded: "Jajak pendapat berakhir"
|
pollEnded: "Jajak pendapat berakhir"
|
||||||
receiveFollowRequest: "Permintaan mengikuti diterima"
|
receiveFollowRequest: "Permintaan mengikuti diterima"
|
||||||
followRequestAccepted: "Permintaan mengikuti disetujui"
|
followRequestAccepted: "Permintaan mengikuti disetujui"
|
||||||
roleAssigned: "Peran Diberikan"
|
|
||||||
achievementEarned: "Pencapaian didapatkan"
|
achievementEarned: "Pencapaian didapatkan"
|
||||||
login: "Masuk"
|
|
||||||
app: "Notifikasi dari aplikasi tertaut"
|
app: "Notifikasi dari aplikasi tertaut"
|
||||||
_actions:
|
_actions:
|
||||||
followBack: "Ikuti Kembali"
|
followBack: "Ikuti Kembali"
|
||||||
|
@ -2418,9 +2104,9 @@ _drivecleaner:
|
||||||
orderByCreatedAtAsc: "Tanggal (Naik)"
|
orderByCreatedAtAsc: "Tanggal (Naik)"
|
||||||
_webhookSettings:
|
_webhookSettings:
|
||||||
createWebhook: "Buat Webhook"
|
createWebhook: "Buat Webhook"
|
||||||
modifyWebhook: "Sunting Webhook"
|
|
||||||
name: "Nama"
|
name: "Nama"
|
||||||
secret: "Secret"
|
secret: "Secret"
|
||||||
|
events: "Webhook Events"
|
||||||
active: "Aktif"
|
active: "Aktif"
|
||||||
_events:
|
_events:
|
||||||
follow: "Ketika mengikuti pengguna"
|
follow: "Ketika mengikuti pengguna"
|
||||||
|
@ -2430,13 +2116,6 @@ _webhookSettings:
|
||||||
renote: "Ketika direnote"
|
renote: "Ketika direnote"
|
||||||
reaction: "Ketika menerima reaksi"
|
reaction: "Ketika menerima reaksi"
|
||||||
mention: "Ketika sedang disebut"
|
mention: "Ketika sedang disebut"
|
||||||
deleteConfirm: "Apakah kamu yakin ingin menghapus Webhook?"
|
|
||||||
_abuseReport:
|
|
||||||
_notificationRecipient:
|
|
||||||
_recipientType:
|
|
||||||
mail: "Surel"
|
|
||||||
webhook: "Webhook"
|
|
||||||
keywords: "Kata kunci"
|
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
createRole: "Peran telah dibuat"
|
createRole: "Peran telah dibuat"
|
||||||
deleteRole: "Peran telah dihapus"
|
deleteRole: "Peran telah dihapus"
|
||||||
|
@ -2461,7 +2140,6 @@ _moderationLogTypes:
|
||||||
resetPassword: "Atur ulang kata sandi"
|
resetPassword: "Atur ulang kata sandi"
|
||||||
suspendRemoteInstance: "Instansi luar telah ditangguhkan"
|
suspendRemoteInstance: "Instansi luar telah ditangguhkan"
|
||||||
unsuspendRemoteInstance: "Instansi luar batal ditangguhkan"
|
unsuspendRemoteInstance: "Instansi luar batal ditangguhkan"
|
||||||
updateRemoteInstanceNote: "Catatan moderasi telah diperbaharui untuk peladen luar."
|
|
||||||
markSensitiveDriveFile: "Berkas ditandai sensitif"
|
markSensitiveDriveFile: "Berkas ditandai sensitif"
|
||||||
unmarkSensitiveDriveFile: "Berkas batal ditandai sensitif"
|
unmarkSensitiveDriveFile: "Berkas batal ditandai sensitif"
|
||||||
resolveAbuseReport: "Laporan terselesaikan"
|
resolveAbuseReport: "Laporan terselesaikan"
|
||||||
|
@ -2469,12 +2147,6 @@ _moderationLogTypes:
|
||||||
createAd: "Iklan telah dibuat"
|
createAd: "Iklan telah dibuat"
|
||||||
deleteAd: "Iklan telah dihapus"
|
deleteAd: "Iklan telah dihapus"
|
||||||
updateAd: "Iklan telah diperbaharui"
|
updateAd: "Iklan telah diperbaharui"
|
||||||
createAvatarDecoration: "Buat dekorasi avatar"
|
|
||||||
updateAvatarDecoration: "Perbarui dekorasi avatar"
|
|
||||||
deleteAvatarDecoration: "Hapus dekorasi avatar"
|
|
||||||
unsetUserAvatar: "Hapus avatar pengguna"
|
|
||||||
unsetUserBanner: "Hapus banner pengguna"
|
|
||||||
deleteAccount: "Akun dihapus"
|
|
||||||
_fileViewer:
|
_fileViewer:
|
||||||
title: "Rincian berkas"
|
title: "Rincian berkas"
|
||||||
type: "Jenis berkas"
|
type: "Jenis berkas"
|
||||||
|
@ -2483,128 +2155,3 @@ _fileViewer:
|
||||||
uploadedAt: "Diunggah pada"
|
uploadedAt: "Diunggah pada"
|
||||||
attachedNotes: "Catatan yang dilampirkan"
|
attachedNotes: "Catatan yang dilampirkan"
|
||||||
thisPageCanBeSeenFromTheAuthor: "Halaman ini hanya dapat dilihat oleh pengguna yang mengunggah bekas ini."
|
thisPageCanBeSeenFromTheAuthor: "Halaman ini hanya dapat dilihat oleh pengguna yang mengunggah bekas ini."
|
||||||
_externalResourceInstaller:
|
|
||||||
title: "Pasang dari situs eksternal"
|
|
||||||
checkVendorBeforeInstall: "Pastikan sumber dari sumber daya ini terpercaya sebelum melakukan pemasangan."
|
|
||||||
_plugin:
|
|
||||||
title: "Apakah kamu ingin memasang plugin ini?"
|
|
||||||
_theme:
|
|
||||||
title: "Apakah kamu ingin memasang tema ini?"
|
|
||||||
_meta:
|
|
||||||
base: "Skema warna dasar"
|
|
||||||
_vendorInfo:
|
|
||||||
title: "Informasi sumber"
|
|
||||||
endpoint: "Referensi Endpoint"
|
|
||||||
hashVerify: "Verifikasi hash"
|
|
||||||
_errors:
|
|
||||||
_invalidParams:
|
|
||||||
title: "Parameter tidak valid"
|
|
||||||
description: "Tidak cukup informasi untuk memuat data dari situs eksternal. Mohon konfirmasi kembali URL yang dimasukkan."
|
|
||||||
_resourceTypeNotSupported:
|
|
||||||
title: "Sumber daya eksternal ini tidak didukung"
|
|
||||||
description: "Tipe sumber daya eksternal ini tidak didukung. Mohon kontak administrator dari situs tersebut."
|
|
||||||
_failedToFetch:
|
|
||||||
title: "Gagal memuat data"
|
|
||||||
fetchErrorDescription: "Kesalahan terjadi ketika menghubungkan dengan situs eksternal. Jika percobaan kembali tidak dapat memperbaiki masalah ini, mohon hubungi administrator dari situs tersebut."
|
|
||||||
parseErrorDescription: "Kesalahan terjadi dalam memproses data yang dimuat dari situs eksternal. Mohon hubungi administrator dari situs tersebut."
|
|
||||||
_hashUnmatched:
|
|
||||||
title: "Verifikasi data gagal"
|
|
||||||
description: "Kesalahan terjadi dalam memverifikasi integritas data yang diambil. Sebagai pencegahan keamanan, pemasangan tidak dapat dilanjutkan. Mohon hubungi administrator dari situs tersebut."
|
|
||||||
_pluginParseFailed:
|
|
||||||
title: "Kesalahan AiScript"
|
|
||||||
description: "Data yang diminta telah diambil dengan sukses, namun kesalahan terjadi ketika AiScript melakukan parsing. Mohon hubungi pembuat plugin. Detil kesalahan dapat dilihat pada konsol Javascript."
|
|
||||||
_pluginInstallFailed:
|
|
||||||
title: "Pemasangan plugin gagal"
|
|
||||||
description: "Kesalahan terjadi ketika pemasangan plugin. Mohon coba lagi. Detil kesalahan dapat dilihat pada konsol Javascript."
|
|
||||||
_themeParseFailed:
|
|
||||||
title: "Parsing tema gagal"
|
|
||||||
description: "Data yang diminta telah diambil dengan sukses, namun kesalahan terjadi ketika tema melakukan parsing. Mohon hubungi pembuat tema. Detil kesalahan dapat dilihat pada konsol Javascript."
|
|
||||||
_themeInstallFailed:
|
|
||||||
title: "Pemasangan tema gagal"
|
|
||||||
description: "Kesalahan terjadi ketika pemasangan tema. Mohon coba lagi. Detil kesalahan dapat dilihat pada konsol Javascript."
|
|
||||||
_dataSaver:
|
|
||||||
_media:
|
|
||||||
title: "Memuat media"
|
|
||||||
description: "Mencegah gambar/video dimuat secara otomatis. Menyembunyikan gambar/video dan akan dimuat ketika diketuk."
|
|
||||||
_avatar:
|
|
||||||
title: "Gambar avatar"
|
|
||||||
description: "Hentikan animasi gambar avatar. Gambar animasi dapat berukuran lebih besar dari gambar biasa, berpotensi pada pengurangan lalu lintas data lebih jauh."
|
|
||||||
_code:
|
|
||||||
title: "Penyorotan kode"
|
|
||||||
description: "Jika notasi penyorotan kode digunakan di MFM, dll. Fungsi tersebut tidak akan dimuat apabila tidak diketuk. Penyorotan sintaks membutuhkan pengunduhan berkas definisi penyorotan untuk setiap bahasa pemrograman. Oleh sebab itu, menonaktifkan pemuatan otomatis dari berkas ini dilakukan untuk mengurangi jumlah komunikasi data."
|
|
||||||
_hemisphere:
|
|
||||||
N: "Bumi belahan utara"
|
|
||||||
S: "Bumi belahan selatan"
|
|
||||||
caption: "Digunakan dalam beberapa pengaturan klien untuk menentukan musim."
|
|
||||||
_reversi:
|
|
||||||
reversi: "Reversi"
|
|
||||||
gameSettings: "Pengaturan permainan"
|
|
||||||
chooseBoard: "Pilih papan"
|
|
||||||
blackOrWhite: "Hitam/Putih"
|
|
||||||
blackIs: "{name} bermain sebagai Hitam"
|
|
||||||
rules: "Aturan"
|
|
||||||
thisGameIsStartedSoon: "Permainan akan segera dimulai"
|
|
||||||
waitingForOther: "Menunggu langkah giliran dari lawan"
|
|
||||||
waitingForMe: "Menungguh langkah giliran dari kamu"
|
|
||||||
waitingBoth: "Bersiap"
|
|
||||||
ready: "Siap"
|
|
||||||
cancelReady: "Belum siap"
|
|
||||||
opponentTurn: "Giliran lawan"
|
|
||||||
myTurn: "Giliran kamu"
|
|
||||||
turnOf: "Giliran {name}"
|
|
||||||
pastTurnOf: "Giliran {name}"
|
|
||||||
surrender: "Menyerah"
|
|
||||||
surrendered: "Telah menyerah"
|
|
||||||
timeout: "Waktu habis"
|
|
||||||
drawn: "Seri"
|
|
||||||
won: "{name} menang"
|
|
||||||
black: "Hitam"
|
|
||||||
white: "Putih"
|
|
||||||
total: "Jumlah"
|
|
||||||
turnCount: "Langkah ke {count}"
|
|
||||||
myGames: "Rondeku"
|
|
||||||
allGames: "Semua ronde"
|
|
||||||
ended: "Selesai"
|
|
||||||
playing: "Sedang bermain"
|
|
||||||
isLlotheo: "Pemain dengan batu yang sedikit menang (Llotheo)"
|
|
||||||
loopedMap: "Peta melingkar"
|
|
||||||
canPutEverywhere: "Keping dapat ditaruh dimana saja"
|
|
||||||
timeLimitForEachTurn: "Batas waktu untuk gantian"
|
|
||||||
freeMatch: "Pertandingan bebas"
|
|
||||||
lookingForPlayer: "Mencari lawan..."
|
|
||||||
gameCanceled: "Permainan ini telah dibatalkan."
|
|
||||||
shareToTlTheGameWhenStart: "Bagikan permainan ke lini masa ketika dimulai"
|
|
||||||
iStartedAGame: "Permainan telah dimulai! #MisskeyReversi"
|
|
||||||
opponentHasSettingsChanged: "Lawan telah mengganti pengaturan mereka."
|
|
||||||
allowIrregularRules: "Aturan non-reguler (bebas sepenuhnya)"
|
|
||||||
disallowIrregularRules: "Tanpa aturan non-reguler"
|
|
||||||
showBoardLabels: "Tampilkan penomoran baris dan kolom pada papan"
|
|
||||||
useAvatarAsStone: "Ubah batu menjadi avatar pengguna"
|
|
||||||
_offlineScreen:
|
|
||||||
title: "Luring - tidak dapat terhubung ke peladen"
|
|
||||||
header: "Tidak dapat tersambung ke server"
|
|
||||||
_urlPreviewSetting:
|
|
||||||
title: "Pengaturan pratinjau URL"
|
|
||||||
enable: "Aktifkan pratinjau URL"
|
|
||||||
timeout: "Waktu timeout pratinjau URL (ms)"
|
|
||||||
timeoutDescription: "Apabila ini memakan waktu lama dari nilai yang ditentukan untuk mendapatkan pratinjau, pratinjau tidak akan dibuat."
|
|
||||||
maximumContentLength: "Content-Length Maksimum (bytes)"
|
|
||||||
maximumContentLengthDescription: "Apabila Content-Length lebih besar dari nilai ini, pratinjau tidak akan dibuat."
|
|
||||||
requireContentLength: "Buat pratinjau hanya ketika Content-Length dapat didapatkan"
|
|
||||||
requireContentLengthDescription: "Apabila peladen lain tidak memberika Content-Length, pratinjau tidak akan dibuat."
|
|
||||||
userAgent: "User-Agent"
|
|
||||||
userAgentDescription: "Atur User-Agent yang digunakan untuk mengambil pratinjau. Apabila dibiarkan kosong, User-Agent bawaan akan digunakan."
|
|
||||||
summaryProxy: "Titik akhir proksi yang membuat pratinjau"
|
|
||||||
summaryProxyDescription: "Bukan untuk Misskey, namun untuk menghasilkan pratinjau menggunakan Summaly Proxy."
|
|
||||||
summaryProxyDescription2: "Parameter berikut tertautkan dengan proksi sebagai string kueri. Apabila proksi tidak mendukung tersebut, nilai di dalamnya diabaikan."
|
|
||||||
_mediaControls:
|
|
||||||
pip: "Gambar dalam Gambar"
|
|
||||||
playbackRate: "Kecepatan Pemutaran"
|
|
||||||
loop: "Ulangi Pemutaran"
|
|
||||||
_remoteLookupErrors:
|
|
||||||
_noSuchObject:
|
|
||||||
title: "Tidak dapat ditemukan"
|
|
||||||
_search:
|
|
||||||
searchScopeAll: "Semua"
|
|
||||||
searchScopeLocal: "Lokal"
|
|
||||||
searchScopeUser: "Pengguna spesifik"
|
|
||||||
|
|
11238
locales/index.d.ts
vendored
11238
locales/index.d.ts
vendored
File diff suppressed because it is too large
Load diff
|
@ -15,7 +15,6 @@ const merge = (...args) => args.reduce((a, c) => ({
|
||||||
|
|
||||||
const languages = [
|
const languages = [
|
||||||
'ar-SA',
|
'ar-SA',
|
||||||
'ca-ES',
|
|
||||||
'cs-CZ',
|
'cs-CZ',
|
||||||
'da-DK',
|
'da-DK',
|
||||||
'de-DE',
|
'de-DE',
|
||||||
|
@ -52,28 +51,10 @@ const primaries = {
|
||||||
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
||||||
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
|
const clean = (text) => text.replace(new RegExp(String.fromCodePoint(0x08), 'g'), '');
|
||||||
|
|
||||||
export function build() {
|
const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, import.meta.url), 'utf-8'))) || {}, a), {});
|
||||||
// vitestの挙動を調整するため、一度ローカル変数化する必要がある
|
|
||||||
// https://github.com/vitest-dev/vitest/issues/3988#issuecomment-1686599577
|
|
||||||
// https://github.com/misskey-dev/misskey/pull/14057#issuecomment-2192833785
|
|
||||||
const metaUrl = import.meta.url;
|
|
||||||
const locales = languages.reduce((a, c) => (a[c] = yaml.load(clean(fs.readFileSync(new URL(`${c}.yml`, metaUrl), 'utf-8'))) || {}, a), {});
|
|
||||||
|
|
||||||
// 空文字列が入ることがあり、フォールバックが動作しなくなるのでプロパティごと消す
|
export default Object.entries(locales)
|
||||||
const removeEmpty = (obj) => {
|
.reduce((a, [k ,v]) => (a[k] = (() => {
|
||||||
for (const [k, v] of Object.entries(obj)) {
|
|
||||||
if (v === '') {
|
|
||||||
delete obj[k];
|
|
||||||
} else if (typeof v === 'object') {
|
|
||||||
removeEmpty(v);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return obj;
|
|
||||||
};
|
|
||||||
removeEmpty(locales);
|
|
||||||
|
|
||||||
return Object.entries(locales)
|
|
||||||
.reduce((a, [k, v]) => (a[k] = (() => {
|
|
||||||
const [lang] = k.split('-');
|
const [lang] = k.split('-');
|
||||||
switch (k) {
|
switch (k) {
|
||||||
case 'ja-JP': return v;
|
case 'ja-JP': return v;
|
||||||
|
@ -82,11 +63,8 @@ export function build() {
|
||||||
default: return merge(
|
default: return merge(
|
||||||
locales['ja-JP'],
|
locales['ja-JP'],
|
||||||
locales['en-US'],
|
locales['en-US'],
|
||||||
locales[`${lang}-${primaries[lang]}`] ?? {},
|
locales[`${lang}-${primaries[lang]}`] || {},
|
||||||
v
|
v
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
})(), a), {});
|
})(), a), {});
|
||||||
}
|
|
||||||
|
|
||||||
export default build();
|
|
||||||
|
|
1293
locales/it-IT.yml
1293
locales/it-IT.yml
File diff suppressed because it is too large
Load diff
1070
locales/ja-JP.yml
1070
locales/ja-JP.yml
File diff suppressed because it is too large
Load diff
1188
locales/ja-KS.yml
1188
locales/ja-KS.yml
File diff suppressed because it is too large
Load diff
|
@ -104,7 +104,3 @@ _deck:
|
||||||
_columns:
|
_columns:
|
||||||
notifications: "Ilɣuyen"
|
notifications: "Ilɣuyen"
|
||||||
list: "Tibdarin"
|
list: "Tibdarin"
|
||||||
_abuseReport:
|
|
||||||
_notificationRecipient:
|
|
||||||
_recipientType:
|
|
||||||
mail: "Imayl"
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Reference in a new issue