🎉 First Commit
release: v20240729 Co-authored-by: Laura Hausmann <laura@hausmann.dev> Co-authored-by: GitLab CI <project_7_bot_1bfaee5701aed20091a86249a967a6c1@noreply.firefish.dev> Co-authored-by: Hosted Weblate <hosted@weblate.org> Co-authored-by: Saamkhaih Kyakya <70475761+hiohlan@users.noreply.github.com> See merge request firefish/firefish!11214
This commit is contained in:
commit
d096da02e6
2161 changed files with 286465 additions and 0 deletions
13
.config/LICENSE
Normal file
13
.config/LICENSE
Normal file
|
@ -0,0 +1,13 @@
|
|||
Copyright 2023 Firefish
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
11
.config/ci.yml
Normal file
11
.config/ci.yml
Normal file
|
@ -0,0 +1,11 @@
|
|||
url: http://localhost:3000
|
||||
port: 3000
|
||||
db:
|
||||
host: postgres
|
||||
port: 5432
|
||||
db: firefish_db
|
||||
user: firefish
|
||||
pass: password
|
||||
redis:
|
||||
host: redis
|
||||
port: 6379
|
20
.config/devenv.yml
Normal file
20
.config/devenv.yml
Normal file
|
@ -0,0 +1,20 @@
|
|||
url: http://localhost:3030
|
||||
port: 3030
|
||||
|
||||
db:
|
||||
host: firefish_db
|
||||
port: 5432
|
||||
|
||||
db: firefish_db
|
||||
user: firefish
|
||||
pass: password
|
||||
|
||||
redis:
|
||||
host: firefish_redis
|
||||
port: 6379
|
||||
|
||||
#allowedPrivateNetworks: [
|
||||
# '10.69.1.0/24'
|
||||
#]
|
||||
|
||||
maxLogLevel: 'debug'
|
4
.config/docker_ci.env
Normal file
4
.config/docker_ci.env
Normal file
|
@ -0,0 +1,4 @@
|
|||
# db settings
|
||||
POSTGRES_PASSWORD=test
|
||||
POSTGRES_USER=postgres
|
||||
POSTGRES_DB=postgres
|
4
.config/docker_example.env
Normal file
4
.config/docker_example.env
Normal file
|
@ -0,0 +1,4 @@
|
|||
# db settings
|
||||
POSTGRES_PASSWORD=example-firefish-pass
|
||||
POSTGRES_USER=example-firefish-user
|
||||
POSTGRES_DB=firefish
|
238
.config/example.yml
Normal file
238
.config/example.yml
Normal file
|
@ -0,0 +1,238 @@
|
|||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Firefish configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
# After starting your server, please don't change the URL! Doing so will break federation.
|
||||
|
||||
# ┌─────┐
|
||||
#───┘ URL └─────────────────────────────────────────────────────
|
||||
|
||||
# Final accessible URL seen by a user.
|
||||
url: https://example.com/
|
||||
|
||||
# ┌───────────────────────┐
|
||||
#───┘ Port and TLS settings └───────────────────────────────────
|
||||
|
||||
#
|
||||
# Firefish requires a reverse proxy to support HTTPS connections.
|
||||
#
|
||||
# +----- https://example.com/ ------------+
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# | User | ---> || Proxy (443) | ---> | Firefish (3000) ||
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# +---------------------------------------+
|
||||
#
|
||||
# You need to set up a reverse proxy. (e.g. nginx, caddy)
|
||||
# An encrypted connection with HTTPS is highly recommended
|
||||
# because tokens may be transferred in GET requests.
|
||||
|
||||
# The port that your Firefish server should listen on.
|
||||
port: 3000
|
||||
|
||||
# The bind host your Firefish server should listen on.
|
||||
# If unspecified, the wildcard address will be used.
|
||||
#bind: 127.0.0.1
|
||||
|
||||
# ┌──────────────────────────┐
|
||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||
|
||||
db:
|
||||
host: localhost
|
||||
port: 5432
|
||||
#ssl: false
|
||||
# Database name
|
||||
db: firefish_db
|
||||
|
||||
# Auth
|
||||
user: firefish
|
||||
pass: password
|
||||
|
||||
# Whether disable Caching queries
|
||||
#disableCache: true
|
||||
|
||||
# Extra Connection options
|
||||
#extra:
|
||||
# ssl:
|
||||
# host: localhost
|
||||
# rejectUnauthorized: false
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
#tls:
|
||||
# host: localhost
|
||||
# rejectUnauthorized: false
|
||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
#pass: example-pass
|
||||
#prefix: example-prefix
|
||||
#db: 1
|
||||
#user: default
|
||||
|
||||
# ┌─────────────────────────────┐
|
||||
#───┘ Cache server configuration └─────────────────────────────────────
|
||||
|
||||
# A Redis-compatible server (DragonflyDB, Keydb, Redis) for caching
|
||||
# If left blank, it will use the Redis server from above
|
||||
|
||||
#cacheServer:
|
||||
#host: localhost
|
||||
#port: 6379
|
||||
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
#pass: example-pass
|
||||
#prefix: example-prefix
|
||||
#db: 1
|
||||
|
||||
# ┌───────────────┐
|
||||
#───┘ ID generation └───────────────────────────────────────────
|
||||
|
||||
# No need to uncomment in most cases, but you may want to change
|
||||
# these settings if you plan to run a large and/or distributed server.
|
||||
|
||||
# cuid:
|
||||
# # Min 16, Max 24
|
||||
# length: 16
|
||||
#
|
||||
# # Set this to a unique string across workers (e.g., machine's hostname)
|
||||
# # if your workers are running in multiple hosts.
|
||||
# fingerprint: my-fingerprint
|
||||
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
# Maximum length of a post (default 3000, max 100000)
|
||||
#maxNoteLength: 3000
|
||||
|
||||
# Maximum length of an image caption (default 1500, max 8192)
|
||||
#maxCaptionLength: 1500
|
||||
|
||||
# Reserved usernames that only the administrator can register with
|
||||
reservedUsernames: [
|
||||
'root',
|
||||
'admin',
|
||||
'administrator',
|
||||
'me',
|
||||
'system'
|
||||
]
|
||||
|
||||
# Whether disable HSTS
|
||||
#disableHsts: true
|
||||
|
||||
# Number of worker processes by type.
|
||||
# The sum must not exceed the number of available cores.
|
||||
#clusterLimits:
|
||||
# web: 1
|
||||
# queue: 1
|
||||
|
||||
# Job concurrency per worker
|
||||
# deliverJobConcurrency: 128
|
||||
# inboxJobConcurrency: 16
|
||||
|
||||
# Job rate limiter
|
||||
# deliverJobPerSec: 128
|
||||
# inboxJobPerSec: 16
|
||||
|
||||
# Job attempts
|
||||
# deliverJobMaxAttempts: 12
|
||||
# inboxJobMaxAttempts: 8
|
||||
|
||||
# Local address used for outgoing requests
|
||||
#outgoingAddress: 127.0.0.1
|
||||
|
||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||
#outgoingAddressFamily: ipv4
|
||||
|
||||
# Log level (error, warning, info, debug, trace)
|
||||
# Production env: info
|
||||
# Production env whose storage space or IO is tight: warning
|
||||
# Debug/Test env or Troubleshooting: debug (or trace)
|
||||
maxLogLevel: info
|
||||
|
||||
# Syslog option
|
||||
#syslog:
|
||||
# host: localhost
|
||||
# port: 514
|
||||
|
||||
# Proxy for HTTP/HTTPS
|
||||
#proxy: http://127.0.0.1:3128
|
||||
|
||||
#proxyBypassHosts: [
|
||||
# 'web.kaiteki.app',
|
||||
# 'example.com',
|
||||
# '192.0.2.8'
|
||||
#]
|
||||
|
||||
# Proxy for SMTP/SMTPS
|
||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||
|
||||
# Media Proxy
|
||||
#mediaProxy: https://example.com/proxy
|
||||
|
||||
# Proxy remote files (default: true)
|
||||
#proxyRemoteFiles: true
|
||||
|
||||
#allowedPrivateNetworks: [
|
||||
# '127.0.0.1/32'
|
||||
#]
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
||||
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Congrats, you've reached the end of the config file needed for most deployments!
|
||||
# Enjoy your Firefish server!
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
|
||||
|
||||
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Managed hosting settings
|
||||
# >>> NORMAL SELF-HOSTERS, STAY AWAY! <<<
|
||||
# >>> YOU DON'T NEED THIS! <<<
|
||||
# Each category is optional, but if each item in each category is mandatory!
|
||||
# If you mess this up, that's on you, you've been warned...
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
#maxUserSignups: 100
|
||||
#isManagedHosting: true
|
||||
#deepl:
|
||||
# managed: true
|
||||
# authKey: ''
|
||||
# isPro: false
|
||||
#
|
||||
#email:
|
||||
# managed: true
|
||||
# address: 'example@email.com'
|
||||
# host: 'email.com'
|
||||
# port: 587
|
||||
# user: 'example@email.com'
|
||||
# pass: ''
|
||||
# useImplicitSslTls: false
|
||||
#
|
||||
#objectStorage:
|
||||
# managed: true
|
||||
# baseUrl: ''
|
||||
# bucket: ''
|
||||
# prefix: ''
|
||||
# endpoint: ''
|
||||
# region: ''
|
||||
# accessKey: ''
|
||||
# secretKey: ''
|
||||
# useSsl: true
|
||||
# connnectOverProxy: false
|
||||
# setPublicReadOnUpload: true
|
||||
# s3ForcePathStyle: true
|
||||
|
||||
# !!!!!!!!!!
|
||||
# >>>>>> AGAIN, NORMAL SELF-HOSTERS, STAY AWAY! <<<<<<
|
||||
# >>>>>> YOU DON'T NEED THIS, ABOVE SETTINGS ARE FOR MANAGED HOSTING ONLY! <<<<<<
|
||||
# !!!!!!!!!!
|
||||
|
||||
# Seriously. Do NOT fill out the above settings if you're self-hosting.
|
||||
# They're much better off being set from the control panel.
|
82
.config/helm_values_example.yml
Normal file
82
.config/helm_values_example.yml
Normal file
|
@ -0,0 +1,82 @@
|
|||
replicaCount: 1
|
||||
|
||||
resources:
|
||||
requests:
|
||||
cpu: 0.5
|
||||
memory: 512Mi
|
||||
limits:
|
||||
cpu: 1
|
||||
memory: 1Gi
|
||||
|
||||
firefish:
|
||||
domain: example.tld
|
||||
smtp:
|
||||
from_address: noreply@example.tld
|
||||
port: 587
|
||||
server: smtp.gmail.com
|
||||
useImplicitSslTls: false
|
||||
login: me@example.tld
|
||||
password: CHANGEME
|
||||
objectStorage:
|
||||
baseUrl: https://example-bucket.nyc3.cdn.digitaloceanspaces.com
|
||||
access_key: CHANGEME
|
||||
access_secret: CHANGEME
|
||||
bucket: example-bucket
|
||||
endpoint: nyc3.digitaloceanspaces.com:443
|
||||
region: nyc3
|
||||
allowedPrivateNetworks: []
|
||||
|
||||
ingress:
|
||||
enabled: true
|
||||
annotations:
|
||||
cert-manager.io/cluster-issuer: letsencrypt
|
||||
hosts:
|
||||
- host: example.tld
|
||||
paths:
|
||||
- path: /
|
||||
pathType: ImplementationSpecific
|
||||
tls:
|
||||
- secretName: example-tld-certificate
|
||||
hosts:
|
||||
- example.tld
|
||||
|
||||
elasticsearch:
|
||||
enabled: false
|
||||
|
||||
postgresql:
|
||||
auth:
|
||||
password: CHANGEME
|
||||
postgresPassword: CHANGEME
|
||||
primary:
|
||||
persistence:
|
||||
enabled: true
|
||||
storageClass: vultr-block-storage
|
||||
size: 25Gi
|
||||
resources:
|
||||
requests:
|
||||
cpu: 0.25
|
||||
memory: 256Mi
|
||||
limits:
|
||||
cpu: 0.5
|
||||
memory: 512Mi
|
||||
metrics:
|
||||
enabled: true
|
||||
|
||||
redis:
|
||||
auth:
|
||||
password: CHANGEME
|
||||
master:
|
||||
resources:
|
||||
requests:
|
||||
cpu: 0.25
|
||||
memory: 256Mi
|
||||
limits:
|
||||
cpu: 0.5
|
||||
memory: 256Mi
|
||||
persistence:
|
||||
storageclass: vultr-block-storage
|
||||
size: 10Gi
|
||||
replica:
|
||||
replicaCount: 0
|
||||
metrics:
|
||||
enabled: true
|
62
.dockerignore
Normal file
62
.dockerignore
Normal file
|
@ -0,0 +1,62 @@
|
|||
# Visual Studio Code
|
||||
.vscode
|
||||
|
||||
# Intelij-IDEA
|
||||
.idea
|
||||
|
||||
# Node.js
|
||||
node_modules
|
||||
**/node_modules
|
||||
report.*.json
|
||||
|
||||
# Rust
|
||||
/target
|
||||
|
||||
# Coverage
|
||||
coverage
|
||||
|
||||
# config
|
||||
/.config
|
||||
|
||||
# misskey
|
||||
built
|
||||
db
|
||||
elasticsearch
|
||||
redis
|
||||
npm-debug.log
|
||||
*.pem
|
||||
run.bat
|
||||
api-docs.json
|
||||
*.log
|
||||
*.code-workspace
|
||||
.DS_Store
|
||||
files
|
||||
ormconfig.json
|
||||
packages/backend/assets/instance.css
|
||||
|
||||
# dockerignore custom
|
||||
.git
|
||||
.gitignore
|
||||
.gitattributes
|
||||
.weblate
|
||||
animated.svg
|
||||
compose.yml
|
||||
docker-compose.yml
|
||||
docker-compose.example.yml
|
||||
title.svg
|
||||
/.gitlab
|
||||
/ci
|
||||
/dev
|
||||
/docs
|
||||
/scripts
|
||||
!/scripts/copy-index.mjs
|
||||
!/scripts/copy-assets.mjs
|
||||
biome.json
|
||||
CODE_OF_CONDUCT.md
|
||||
CONTRIBUTING.md
|
||||
Dockerfile
|
||||
Makefile
|
||||
README.md
|
||||
SECURITY.md
|
||||
patrons.json
|
||||
renovate.json
|
14
.editorconfig
Normal file
14
.editorconfig
Normal file
|
@ -0,0 +1,14 @@
|
|||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = tab
|
||||
indent_size = 2
|
||||
charset = utf-8
|
||||
insert_final_newline = true
|
||||
|
||||
[*.rs]
|
||||
indent_style = space
|
||||
indent_size = 4
|
||||
|
||||
[*.yml]
|
||||
indent_style = space
|
7
.gitattributes
vendored
Normal file
7
.gitattributes
vendored
Normal file
|
@ -0,0 +1,7 @@
|
|||
*.svg -diff -text
|
||||
*.psd -diff -text
|
||||
*.ai -diff -text
|
||||
*.mqo -diff -text
|
||||
*.glb -diff -text
|
||||
*.blend -diff -text
|
||||
*.afdesign -diff -text
|
79
.gitignore
vendored
Normal file
79
.gitignore
vendored
Normal file
|
@ -0,0 +1,79 @@
|
|||
# Visual Studio Code
|
||||
/.vscode
|
||||
!/.vscode/extensions.json
|
||||
!/.vscode/launch.json
|
||||
/.history/
|
||||
|
||||
# Intelij-IDEA
|
||||
/.idea
|
||||
packages/backend/.idea/backend.iml
|
||||
packages/backend/.idea/modules.xml
|
||||
packages/backend/.idea/vcs.xml
|
||||
|
||||
# Node.js
|
||||
node_modules
|
||||
report.*.json
|
||||
|
||||
# Cargo
|
||||
/.cargo
|
||||
/target
|
||||
|
||||
# Cypress
|
||||
cypress/screenshots
|
||||
cypress/videos
|
||||
|
||||
# Coverage
|
||||
coverage
|
||||
|
||||
# config
|
||||
/.config/*
|
||||
!/.config/example.yml
|
||||
!/.config/devenv.yml
|
||||
!/.config/docker_example.env
|
||||
!/.config/docker_ci.env
|
||||
!/.config/helm_values_example.yml
|
||||
!/.config/LICENSE
|
||||
/docker-compose.yml
|
||||
/compose.yml
|
||||
/custom/*
|
||||
!/custom/LICENSE
|
||||
|
||||
# ESLint
|
||||
.eslintcache
|
||||
|
||||
# misskey
|
||||
built
|
||||
/db
|
||||
/redis
|
||||
npm-debug.log
|
||||
*.pem
|
||||
run.bat
|
||||
api-docs.json
|
||||
*.log
|
||||
*.code-workspace
|
||||
.DS_Store
|
||||
/files
|
||||
ormconfig.json
|
||||
packages/backend/assets/instance.css
|
||||
packages/backend/assets/sounds/None.mp3
|
||||
packages/backend/assets/LICENSE
|
||||
|
||||
dev/container/firefish
|
||||
dev/container/db
|
||||
dev/container/redis
|
||||
dev/config.env
|
||||
|
||||
# blender backups
|
||||
*.blend1
|
||||
*.blend2
|
||||
*.blend3
|
||||
*.blend4
|
||||
*.blend5
|
||||
|
||||
# old yarn
|
||||
.yarn
|
||||
yarn*
|
||||
|
||||
# Cargo cache for Docker
|
||||
/.cargo-cache
|
||||
/.cargo-target
|
366
.gitlab-ci.yml
Normal file
366
.gitlab-ci.yml
Normal file
|
@ -0,0 +1,366 @@
|
|||
image: docker.io/rust:slim-bookworm
|
||||
|
||||
services:
|
||||
- name: docker.io/groonga/pgroonga:latest-alpine-12-slim
|
||||
alias: postgres
|
||||
pull_policy: if-not-present
|
||||
- name: docker.io/redis:7-alpine
|
||||
alias: redis
|
||||
pull_policy: if-not-present
|
||||
|
||||
workflow:
|
||||
rules:
|
||||
- if: $CI_PROJECT_PATH == 'firefish/firefish' || $CI_MERGE_REQUEST_PROJECT_PATH == 'firefish/firefish'
|
||||
changes:
|
||||
paths:
|
||||
- packages/**/*
|
||||
- locales/**/*
|
||||
- scripts/**/*
|
||||
- package.json
|
||||
- Cargo.toml
|
||||
- Cargo.lock
|
||||
- Dockerfile
|
||||
- .dockerignore
|
||||
when: always
|
||||
- when: never
|
||||
|
||||
stages:
|
||||
- test
|
||||
- doc
|
||||
- build
|
||||
- dependency
|
||||
- clean
|
||||
- manage
|
||||
|
||||
variables:
|
||||
POSTGRES_DB: 'firefish_db'
|
||||
POSTGRES_USER: 'firefish'
|
||||
POSTGRES_PASSWORD: 'password'
|
||||
POSTGRES_HOST_AUTH_METHOD: 'trust'
|
||||
DEBIAN_FRONTEND: 'noninteractive'
|
||||
NODE_OPTIONS: '--max_old_space_size=3072'
|
||||
CARGO_PROFILE_DEV_OPT_LEVEL: '0'
|
||||
CARGO_PROFILE_DEV_LTO: 'off'
|
||||
CARGO_PROFILE_DEV_DEBUG: 'none'
|
||||
CARGO_TERM_COLOR: 'always'
|
||||
GIT_CLEAN_FLAGS: -ffdx -e node_modules/ -e built/ -e target/ -e packages/backend-rs/built/ -e ci/target-msrv/
|
||||
|
||||
default:
|
||||
before_script:
|
||||
- apt-get update && apt-get -y upgrade
|
||||
- apt-get -y --no-install-recommends install curl
|
||||
- curl -fsSL 'https://deb.nodesource.com/setup_18.x' | bash -
|
||||
- apt-get install -y --no-install-recommends build-essential clang mold python3 perl nodejs postgresql-client
|
||||
- corepack enable
|
||||
- corepack prepare pnpm@latest --activate
|
||||
- cp .config/ci.yml .config/default.yml
|
||||
- cp ci/cargo/config.toml /usr/local/cargo/config.toml
|
||||
- export PGPASSWORD="${POSTGRES_PASSWORD}"
|
||||
- psql --host postgres --user "${POSTGRES_USER}" --dbname "${POSTGRES_DB}" --command 'CREATE EXTENSION pgroonga'
|
||||
|
||||
test:build:
|
||||
stage: test
|
||||
rules:
|
||||
- if: $TEST == 'true'
|
||||
when: always
|
||||
- if: $TEST == 'false'
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == 'develop' || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
|
||||
changes:
|
||||
paths:
|
||||
- packages/backend-rs/**/*
|
||||
- packages/macro-rs/**/*
|
||||
- scripts/**/*
|
||||
- package.json
|
||||
- Cargo.toml
|
||||
- Cargo.lock
|
||||
when: always
|
||||
needs:
|
||||
- job: cargo:clippy
|
||||
optional: true
|
||||
- job: cargo:test
|
||||
optional: true
|
||||
script:
|
||||
- pnpm install --frozen-lockfile
|
||||
- pnpm run build:debug
|
||||
- pnpm run migrate
|
||||
- psql --host postgres --user "${POSTGRES_USER}" --dbname "${POSTGRES_DB}" --command "$(cat docs/downgrade.sql)"
|
||||
|
||||
test:build:backend_ts:
|
||||
stage: test
|
||||
rules:
|
||||
- if: $TEST == 'true'
|
||||
when: always
|
||||
- if: $TEST == 'false'
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == 'develop' || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
|
||||
changes:
|
||||
paths:
|
||||
- packages/backend-rs/**/*
|
||||
- packages/macro-rs/**/*
|
||||
- scripts/**/*
|
||||
- package.json
|
||||
- Cargo.toml
|
||||
- Cargo.lock
|
||||
- docs/downgrade.sql
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == 'develop' || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
|
||||
changes:
|
||||
paths:
|
||||
- packages/backend/**/*
|
||||
- packages/firefish-js/**/*
|
||||
when: always
|
||||
before_script:
|
||||
- apt-get update && apt-get -y upgrade
|
||||
- apt-get -y --no-install-recommends install curl
|
||||
- curl -fsSL 'https://deb.nodesource.com/setup_18.x' | bash -
|
||||
- apt-get install -y --no-install-recommends build-essential clang mold python3 perl nodejs postgresql-client
|
||||
- corepack enable
|
||||
- corepack prepare pnpm@latest --activate
|
||||
- mkdir -p packages/backend-rs/built
|
||||
- cp packages/backend-rs/index.js packages/backend-rs/built/index.js
|
||||
- cp packages/backend-rs/index.d.ts packages/backend-rs/built/index.d.ts
|
||||
- cp ci/cargo/config.toml /usr/local/cargo/config.toml
|
||||
- test -f packages/backend-rs/built/backend-rs.linux-x64-gnu.node || pnpm install --frozen-lockfile
|
||||
- test -f packages/backend-rs/built/backend-rs.linux-x64-gnu.node || pnpm --filter 'backend-rs' run build:debug
|
||||
- cp .config/ci.yml .config/default.yml
|
||||
- export PGPASSWORD="${POSTGRES_PASSWORD}"
|
||||
- psql --host postgres --user "${POSTGRES_USER}" --dbname "${POSTGRES_DB}" --command 'CREATE EXTENSION pgroonga'
|
||||
script:
|
||||
- pnpm install --frozen-lockfile
|
||||
- pnpm --filter 'backend' --filter 'firefish-js' run build:debug
|
||||
- pnpm run migrate
|
||||
- psql --host postgres --user "${POSTGRES_USER}" --dbname "${POSTGRES_DB}" --command "$(cat docs/downgrade.sql)"
|
||||
|
||||
test:build:client:
|
||||
stage: test
|
||||
rules:
|
||||
- if: $TEST == 'true'
|
||||
when: always
|
||||
- if: $TEST == 'false'
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == 'develop' || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
|
||||
changes:
|
||||
paths:
|
||||
- packages/backend-rs/**/*
|
||||
- packages/macro-rs/**/*
|
||||
- scripts/**/*
|
||||
- package.json
|
||||
- Cargo.toml
|
||||
- Cargo.lock
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == 'develop' || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
|
||||
changes:
|
||||
paths:
|
||||
- packages/client/**/*
|
||||
- packages/firefish-js/**/*
|
||||
- packages/sw/**/*
|
||||
- locales/**/*
|
||||
when: always
|
||||
services: []
|
||||
before_script:
|
||||
- apt-get update && apt-get -y upgrade
|
||||
- apt-get -y --no-install-recommends install curl
|
||||
- curl -fsSL 'https://deb.nodesource.com/setup_18.x' | bash -
|
||||
- apt-get install -y --no-install-recommends build-essential python3 perl nodejs
|
||||
- corepack enable
|
||||
- corepack prepare pnpm@latest --activate
|
||||
- cp .config/ci.yml .config/default.yml
|
||||
script:
|
||||
- pnpm install --frozen-lockfile
|
||||
- pnpm --filter 'firefish-js' --filter 'client' --filter 'sw' run build:debug
|
||||
|
||||
build:container:
|
||||
stage: build
|
||||
image: docker.io/debian:trixie-slim
|
||||
services: []
|
||||
rules:
|
||||
- if: $BUILD && $CI_PIPELINE_SOURCE == 'schedule'
|
||||
variables:
|
||||
STORAGE_DRIVER: overlay
|
||||
before_script:
|
||||
- apt-get update && apt-get -y upgrade
|
||||
- |-
|
||||
sed -i -r 's/"version": "([-0-9]+)",/"version": "\1-dev",/' package.json
|
||||
- apt-get install -y --no-install-recommends ca-certificates fuse-overlayfs buildah
|
||||
- echo "${CI_REGISTRY_PASSWORD}" | buildah login --username "${CI_REGISTRY_USER}" --password-stdin "${CI_REGISTRY}"
|
||||
- export IMAGE_TAG_1="${CI_REGISTRY}/${CI_PROJECT_PATH}/develop:not-for-production"
|
||||
- export IMAGE_TAG_2="${CI_REGISTRY}/${CI_PROJECT_PATH}/develop:not-for-production-$(date +%Y%m%d)"
|
||||
- buildah version
|
||||
script:
|
||||
- |-
|
||||
buildah build \
|
||||
--isolation chroot \
|
||||
--device=/dev/fuse:rw \
|
||||
--security-opt seccomp=unconfined \
|
||||
--security-opt apparmor=unconfined \
|
||||
--cap-add all \
|
||||
--platform linux/amd64 \
|
||||
--tag "${IMAGE_TAG_1}" \
|
||||
--tag "${IMAGE_TAG_2}" \
|
||||
.
|
||||
- buildah inspect "${IMAGE_TAG_1}"
|
||||
- buildah push "${IMAGE_TAG_1}"
|
||||
- buildah push "${IMAGE_TAG_2}"
|
||||
|
||||
cargo:check:msrv:
|
||||
stage: test
|
||||
image: docker.io/rust:1.74-slim-bookworm
|
||||
rules:
|
||||
- if: $TEST == 'true'
|
||||
when: always
|
||||
- if: $TEST == 'false'
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == 'develop' || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
|
||||
changes:
|
||||
paths:
|
||||
- packages/backend-rs/**/*
|
||||
- packages/macro-rs/**/*
|
||||
- Cargo.toml
|
||||
- Cargo.lock
|
||||
when: always
|
||||
services: []
|
||||
before_script:
|
||||
- apt-get update && apt-get -y upgrade
|
||||
- apt-get install -y --no-install-recommends build-essential clang mold python3 perl nodejs postgresql-client
|
||||
- cp ci/cargo/config.toml /usr/local/cargo/config.toml
|
||||
- export CARGO_TARGET_DIR='ci/target-msrv'
|
||||
script:
|
||||
- cargo fetch --locked --manifest-path Cargo.toml
|
||||
- cargo check --locked --frozen --all-features
|
||||
|
||||
cargo:test:
|
||||
stage: test
|
||||
rules:
|
||||
- if: $TEST == 'true'
|
||||
when: always
|
||||
- if: $TEST == 'false'
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == 'develop' || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
|
||||
changes:
|
||||
paths:
|
||||
- packages/backend-rs/**/*
|
||||
- packages/macro-rs/**/*
|
||||
- Cargo.toml
|
||||
- Cargo.lock
|
||||
when: always
|
||||
script:
|
||||
- curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C /usr/local/cargo/bin
|
||||
- cargo test --doc
|
||||
- cargo nextest run
|
||||
|
||||
cargo:clippy:
|
||||
stage: test
|
||||
rules:
|
||||
- if: $TEST == 'true'
|
||||
when: always
|
||||
- if: $TEST == 'false'
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == 'develop' || $CI_MERGE_REQUEST_TARGET_BRANCH_NAME == 'develop'
|
||||
changes:
|
||||
paths:
|
||||
- packages/backend-rs/**/*
|
||||
- packages/macro-rs/**/*
|
||||
when: always
|
||||
services: []
|
||||
before_script:
|
||||
- apt-get update && apt-get -y upgrade
|
||||
- apt-get install -y --no-install-recommends build-essential clang mold perl
|
||||
- cp ci/cargo/config.toml /usr/local/cargo/config.toml
|
||||
- rustup component add clippy
|
||||
script:
|
||||
- cargo clippy -- -D warnings
|
||||
|
||||
cargo:doc:
|
||||
stage: doc
|
||||
rules:
|
||||
- if: $DOC == 'true'
|
||||
when: always
|
||||
- if: $DOC == 'false'
|
||||
when: never
|
||||
- if: $CI_COMMIT_BRANCH == 'develop'
|
||||
changes:
|
||||
paths:
|
||||
- packages/backend-rs/**/*
|
||||
- packages/macro-rs/**/*
|
||||
- Cargo.toml
|
||||
- Cargo.lock
|
||||
- package.json
|
||||
when: always
|
||||
services: []
|
||||
before_script:
|
||||
- apt-get update
|
||||
- apt-get install -y --no-install-recommends build-essential clang mold nodejs npm
|
||||
- cp ci/cargo/config.toml /usr/local/cargo/config.toml
|
||||
script:
|
||||
- cargo doc --document-private-items
|
||||
- printf 'window.ALL_CRATES = ["backend_rs", "macros", "macros_impl"];' > target/doc/crates.js
|
||||
- printf '<meta http-equiv="refresh" content="0; url=%s">' 'backend_rs' > target/doc/index.html
|
||||
- cd target/doc
|
||||
- npx --yes netlify-cli deploy --prod --site="${CARGO_DOC_SITE_ID}" --dir=.
|
||||
|
||||
cargo:test:miri:
|
||||
stage: test
|
||||
rules:
|
||||
- if: $MIRI
|
||||
script:
|
||||
- export RUST_BACKTRACE=1
|
||||
- export CARGO_TARGET_DIR='ci/target-miri'
|
||||
- export MIRI_NIGHTLY=nightly-$(curl -s https://rust-lang.github.io/rustup-components-history/x86_64-unknown-linux-gnu/miri)
|
||||
- curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C /usr/local/cargo/bin
|
||||
- rustup set profile minimal
|
||||
- rustup override set "${MIRI_NIGHTLY}"
|
||||
- rustup component add miri
|
||||
- MIRIFLAGS='-Zmiri-disable-isolation' cargo miri nextest run -j$(nproc --all)
|
||||
|
||||
renovate:
|
||||
stage: dependency
|
||||
image:
|
||||
name: docker.io/renovate/renovate:37-slim
|
||||
entrypoint: [""]
|
||||
rules:
|
||||
- if: $RENOVATE && $CI_PIPELINE_SOURCE == 'schedule'
|
||||
services: []
|
||||
before_script: []
|
||||
script:
|
||||
- renovate --platform gitlab --token "${API_TOKEN}" --endpoint "${CI_SERVER_URL}/api/v4" "${CI_PROJECT_PATH}"
|
||||
|
||||
clean:
|
||||
stage: clean
|
||||
rules:
|
||||
- if: $CLEAN && $CI_PIPELINE_SOURCE == 'schedule'
|
||||
services: []
|
||||
before_script:
|
||||
- apt-get update && apt-get -y upgrade
|
||||
- apt-get -y --no-install-recommends install curl
|
||||
- curl -fsSL 'https://deb.nodesource.com/setup_18.x' | bash -
|
||||
- apt-get install -y --no-install-recommends nodejs
|
||||
- corepack enable
|
||||
- corepack prepare pnpm@latest --activate
|
||||
- pnpm install --frozen-lockfile
|
||||
script:
|
||||
- pnpm run clean-all
|
||||
|
||||
add-issue-labels:
|
||||
stage: manage
|
||||
rules:
|
||||
- if: $ADD_LABEL && $CI_PIPELINE_SOURCE == 'schedule'
|
||||
image: registry.firefish.dev/firefish/gitlab-issue-labels
|
||||
variables:
|
||||
GITLAB_HOST: "firefish.dev"
|
||||
services: []
|
||||
before_script: []
|
||||
script:
|
||||
- gitlab-issue-labels
|
||||
|
||||
close-stalled-issues:
|
||||
stage: manage
|
||||
rules:
|
||||
- if: $CLOSE_STALLED && $CI_PIPELINE_SOURCE == 'schedule'
|
||||
image: registry.firefish.dev/firefish/gitlab-issue-labels
|
||||
variables:
|
||||
GITLAB_HOST: "firefish.dev"
|
||||
services: []
|
||||
before_script: []
|
||||
script:
|
||||
- gitlab-issue-labels
|
99
.gitlab/issue_templates/default.md
Normal file
99
.gitlab/issue_templates/default.md
Normal file
|
@ -0,0 +1,99 @@
|
|||
<!--
|
||||
This issue template is for bug reports.
|
||||
There are other issue templates for feature requests, refactor proposals, and discussions,
|
||||
so please use them if this is not a bug report.
|
||||
|
||||
Also, you don't need to prefix the issue title with "Bug:", because it's
|
||||
managed by issue labels.
|
||||
-->
|
||||
|
||||
<!-- 💖 Thanks for taking the time to fill out this bug report!
|
||||
💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/#firefish-community:nitro.chat)
|
||||
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://firefish.dev/firefish/firefish/-/blob/develop/SECURITY.md)
|
||||
🤝 By submitting this issue, you agree to follow our [Contribution Guidelines.](https://firefish.dev/firefish/firefish/-/blob/develop/CONTRIBUTING.md) -->
|
||||
|
||||
## What type of issue is this?
|
||||
<!-- If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. -->
|
||||
|
||||
<!-- Uncomment (remove surrounding arrow signs) the following line(s) to specify the category of this issue. -->
|
||||
<!-- * label: Server -->
|
||||
<!-- * label: Client -->
|
||||
<!-- * label: Mobile -->
|
||||
<!-- * label: Third-party-client -->
|
||||
<!-- * label: Docs -->
|
||||
<!-- * label: Locale -->
|
||||
<!-- * label: Build from source -->
|
||||
<!-- * label: Container -->
|
||||
<!-- * label: Firefish API -->
|
||||
<!-- * label: Mastodon API -->
|
||||
|
||||
<!-- Please do not edit the next line -->
|
||||
* label: Bug
|
||||
|
||||
## What happened?
|
||||
<!-- Please give us a brief description of what happened. -->
|
||||
|
||||
|
||||
## What did you expect to happen?
|
||||
<!-- Please give us a brief description of what you expected to happen. -->
|
||||
|
||||
|
||||
## Steps to reproduce the issue
|
||||
<!-- Please describe how to reproduce this issue (preferably, in a ordered list) -->
|
||||
|
||||
|
||||
## Reproduces how often
|
||||
<!-- Is it always reproducible, or is it conditional/probabilistic ? -->
|
||||
|
||||
|
||||
## What did you try to solve the issue / Do you have any insights
|
||||
<!-- Not to repeat the same thing, let us share what you have tried so far. -->
|
||||
|
||||
|
||||
## Version
|
||||
<!-- What version of firefish is your instance running? You can find this by the instance information page. -->
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
### Instance
|
||||
<!-- What instance of firefish are you using? -->
|
||||
|
||||
|
||||
### What browser are you using? (client-side issues only)
|
||||
|
||||
|
||||
### What operating system are you using? (client-side issues only)
|
||||
|
||||
|
||||
### How do you deploy Firefish on your server? (server-side issues only)
|
||||
|
||||
|
||||
### What operating system are you using? (Server-side issues only)
|
||||
|
||||
|
||||
### Relevant log output
|
||||
<!-- Please copy and paste any relevant log output. -->
|
||||
|
||||
|
||||
</details>
|
||||
|
||||
## Contribution Guidelines
|
||||
By submitting this issue, you agree to follow our [Contribution Guidelines](https://firefish.dev/firefish/firefish/-/blob/develop/CONTRIBUTING.md)
|
||||
- [ ] I agree to follow this project's Contribution Guidelines
|
||||
- [ ] I have searched the issue tracker for similar issues, and this is not a duplicate.
|
||||
|
||||
## Are you willing to fix this bug? (optional)
|
||||
- [ ] Yes, I will open a merge request that closes this ticket.
|
||||
|
||||
<!--
|
||||
Please tell us how to fix this bug.
|
||||
As noted in the contribution guidelines, there is a good chance that your
|
||||
merge request will not be merged if there is no agreement with the project maintainers.
|
||||
However, we are currently so understaffed that it is virtually impossible to
|
||||
respond to every single proposal. So, feel free to implement it if there is no response
|
||||
for more than a week or there is a thumbs-up emoji reaction from the project maintainer(s).
|
||||
|
||||
Many thanks for your involvement!
|
||||
-->
|
||||
|
82
.gitlab/issue_templates/discussion.md
Normal file
82
.gitlab/issue_templates/discussion.md
Normal file
|
@ -0,0 +1,82 @@
|
|||
<!--
|
||||
This issue template is for discussions.
|
||||
There are other issue templates for bug reports, feature requests, and refactor proposals,
|
||||
so please use them if this is not a discussion issue.
|
||||
|
||||
Also, you don't need to prefix the issue title with "Discussion:", because it's
|
||||
managed by issue labels.
|
||||
-->
|
||||
|
||||
<!-- 💖 Thanks for taking the time to fill out this bug report!
|
||||
💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/#firefish-community:nitro.chat)
|
||||
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://firefish.dev/firefish/firefish/-/blob/develop/SECURITY.md)
|
||||
🤝 By submitting this issue, you agree to follow our [Contribution Guidelines.](https://firefish.dev/firefish/firefish/-/blob/develop/CONTRIBUTING.md) -->
|
||||
|
||||
## What type of issue is this?
|
||||
<!-- If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. -->
|
||||
|
||||
<!-- Uncomment (remove surrounding arrow signs) the following line(s) to specify the category of this issue. -->
|
||||
<!-- * label: Server -->
|
||||
<!-- * label: Client -->
|
||||
<!-- * label: Mobile -->
|
||||
<!-- * label: Third-party-client -->
|
||||
<!-- * label: Docs -->
|
||||
<!-- * label: Locale -->
|
||||
<!-- * label: Build from source -->
|
||||
<!-- * label: Container -->
|
||||
<!-- * label: Firefish API -->
|
||||
<!-- * label: Mastodon API -->
|
||||
|
||||
<!-- Please do not edit the next line -->
|
||||
* label: Discussion
|
||||
|
||||
## What do you think needs to be discussed?
|
||||
<!-- Please tell us your idea. -->
|
||||
|
||||
|
||||
## Relevant information (optional)
|
||||
|
||||
|
||||
## Version
|
||||
<!-- What version of firefish is your instance running? You can find this by the instance information page. -->
|
||||
|
||||
|
||||
<details>
|
||||
|
||||
### Instance
|
||||
<!-- What instance of firefish are you using? -->
|
||||
|
||||
|
||||
### What browser are you using? (client-side issues only)
|
||||
|
||||
|
||||
### What operating system are you using? (client-side issues only)
|
||||
|
||||
|
||||
### How do you deploy Firefish on your server? (server-side issues only)
|
||||
|
||||
|
||||
### What operating system are you using? (Server-side issues only)
|
||||
|
||||
|
||||
</details>
|
||||
|
||||
## Contribution Guidelines
|
||||
By submitting this issue, you agree to follow our [Contribution Guidelines](https://firefish.dev/firefish/firefish/-/blob/develop/CONTRIBUTING.md)
|
||||
- [ ] I agree to follow this project's Contribution Guidelines
|
||||
- [ ] I have searched the issue tracker for similar issues, and this is not a duplicate.
|
||||
|
||||
## Are you willing to open a merge request? (optional)
|
||||
- [ ] Yes, I will open a merge request that closes this ticket.
|
||||
|
||||
<!--
|
||||
Please tell us how do you want to implement your idea.
|
||||
As noted in the contribution guidelines, there is a good chance that your
|
||||
merge request will not be merged if there is no agreement with the project maintainers.
|
||||
However, we are currently so understaffed that it is virtually impossible to
|
||||
respond to every single proposal. So, feel free to implement it if there is no response
|
||||
for more than a week or there is a thumbs-up emoji reaction from the project maintainer(s).
|
||||
|
||||
Many thanks for your involvement!
|
||||
-->
|
||||
|
67
.gitlab/issue_templates/feature.md
Normal file
67
.gitlab/issue_templates/feature.md
Normal file
|
@ -0,0 +1,67 @@
|
|||
<!--
|
||||
This issue template is for feature requests.
|
||||
There are other issue templates for bug reports, refactor proposals, and discussions,
|
||||
so please use them if this is not a feature request.
|
||||
|
||||
Also, you don't need to prefix the issue title with "Feature:", because it's
|
||||
managed by issue labels.
|
||||
-->
|
||||
|
||||
<!-- 💖 Thanks for taking the time to fill out this feature request!
|
||||
💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/#firefish-community:nitro.chat)
|
||||
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://firefish.dev/firefish/firefish/-/blob/develop/SECURITY.md)
|
||||
🤝 By submitting this refactor proposal, you agree to follow our [Contribution Guidelines.](https://firefish.dev/firefish/firefish/-/blob/develop/CONTRIBUTING.md) -->
|
||||
|
||||
## What type of feature is this?
|
||||
<!-- If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. -->
|
||||
|
||||
<!-- Uncomment (remove surrounding arrow signs) the following line(s) to specify the category of this issue. -->
|
||||
<!-- * label: Server -->
|
||||
<!-- * label: Client -->
|
||||
<!-- * label: Mobile -->
|
||||
<!-- * label: Third-party-client -->
|
||||
<!-- * label: Docs -->
|
||||
<!-- * label: Locale -->
|
||||
<!-- * label: Build from source -->
|
||||
<!-- * label: Container -->
|
||||
<!-- * label: Firefish API -->
|
||||
<!-- * label: Mastodon API -->
|
||||
|
||||
<!-- Please do not edit the next line -->
|
||||
* label: Feature
|
||||
|
||||
## What feature would you like implemented?
|
||||
<!-- Please give us a brief description of what you'd like to be refactored. -->
|
||||
|
||||
|
||||
## Why should we add this feature?
|
||||
<!-- Please give us a brief description of why your feature is important. -->
|
||||
|
||||
|
||||
## Version
|
||||
<!-- What version of firefish is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. -->
|
||||
|
||||
|
||||
## Instance
|
||||
<!-- What instance of Firefish are you using? -->
|
||||
|
||||
|
||||
## Contribution Guidelines
|
||||
By submitting this issue, you agree to follow our [Contribution Guidelines](https://firefish.dev/firefish/firefish/-/blob/develop/CONTRIBUTING.md)
|
||||
- [ ] I agree to follow this project's Contribution Guidelines
|
||||
- [ ] I have searched the issue tracker for similar requests, and this is not a duplicate.
|
||||
|
||||
## Are you willing to implement this feature? (optional)
|
||||
- [ ] Yes, I will open a merge request that closes this ticket.
|
||||
|
||||
<!--
|
||||
Please tell us how to implement this feature.
|
||||
As noted in the contribution guidelines, there is a good chance that your
|
||||
merge request will not be merged if there is no agreement with the project maintainers.
|
||||
However, we are currently so understaffed that it is virtually impossible to
|
||||
respond to every single proposal. So, feel free to implement it if there is no response
|
||||
for more than a week or there is a thumbs-up emoji reaction from the project maintainer(s).
|
||||
|
||||
Many thanks for your involvement!
|
||||
-->
|
||||
|
67
.gitlab/issue_templates/refactor.md
Normal file
67
.gitlab/issue_templates/refactor.md
Normal file
|
@ -0,0 +1,67 @@
|
|||
<!--
|
||||
This issue template is for refactor proposals.
|
||||
There are other issue templates for bug reports, feature requests, and discussions,
|
||||
so please use them if this is not a refactor proposal.
|
||||
|
||||
Also, you don't need to prefix the issue title with "Refactor:", because it's
|
||||
managed by issue labels.
|
||||
-->
|
||||
|
||||
<!-- 💖 Thanks for taking the time to fill out this report!
|
||||
💁 Having trouble with deployment? [Ask the support chat.](https://matrix.to/#/#firefish-community:nitro.chat)
|
||||
🔒 Found a security vulnerability? [Please disclose it responsibly.](https://firefish.dev/firefish/firefish/-/blob/develop/SECURITY.md)
|
||||
🤝 By submitting this feature request, you agree to follow our [Contribution Guidelines.](https://firefish.dev/firefish/firefish/-/blob/develop/CONTRIBUTING.md) -->
|
||||
|
||||
## What type of refactoring is this?
|
||||
<!-- If this happens on your device and has to do with the user interface, it's client-side. If this happens on either with the API or the backend, or you got a server-side error in the client, it's server-side. -->
|
||||
|
||||
<!-- Uncomment (remove surrounding arrow signs) the following line(s) to specify the category of this issue. -->
|
||||
<!-- * label: Server -->
|
||||
<!-- * label: Client -->
|
||||
<!-- * label: Mobile -->
|
||||
<!-- * label: Third-party-client -->
|
||||
<!-- * label: Docs -->
|
||||
<!-- * label: Locale -->
|
||||
<!-- * label: Build from source -->
|
||||
<!-- * label: Container -->
|
||||
<!-- * label: Firefish API -->
|
||||
<!-- * label: Mastodon API -->
|
||||
|
||||
<!-- Please do not edit the next line -->
|
||||
* label: Refactor
|
||||
|
||||
## What parts of the code do you think should be refactored?
|
||||
<!-- Please give us a brief description of what you'd like. -->
|
||||
|
||||
|
||||
## Why should the code be refactored that way?
|
||||
<!-- Please give us a brief description of the reason of your proposal. -->
|
||||
|
||||
|
||||
## Version
|
||||
<!-- What version of firefish is your instance running? You can find this by clicking your instance's logo at the bottom left and then clicking instance information. -->
|
||||
|
||||
|
||||
## Instance
|
||||
<!-- What instance of Firefish are you using? -->
|
||||
|
||||
|
||||
## Contribution Guidelines
|
||||
By submitting this issue, you agree to follow our [Contribution Guidelines](https://firefish.dev/firefish/firefish/-/blob/develop/CONTRIBUTING.md)
|
||||
- [ ] I agree to follow this project's Contribution Guidelines
|
||||
- [ ] I have searched the issue tracker for similar requests, and this is not a duplicate.
|
||||
|
||||
## Are you willing to refactor the code? (optional)
|
||||
- [ ] Yes, I will open a merge request that closes this ticket.
|
||||
|
||||
<!--
|
||||
Please tell us how to refactor the code.
|
||||
As noted in the contribution guidelines, there is a good chance that your
|
||||
merge request will not be merged if there is no agreement with the project maintainers.
|
||||
However, we are currently so understaffed that it is virtually impossible to
|
||||
respond to every single proposal. So, feel free to implement it if there is no response
|
||||
for more than a week or there is a thumbs-up emoji reaction from the project maintainer(s).
|
||||
|
||||
Many thanks for your involvement!
|
||||
-->
|
||||
|
18
.gitlab/merge_request_templates/default.md
Normal file
18
.gitlab/merge_request_templates/default.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
<!-- Thanks for taking the time to make Firefish better! -->
|
||||
|
||||
## What does this merge request do?
|
||||
<!-- Please give us a brief description of what this merge request does. -->
|
||||
|
||||
|
||||
## Contribution Guidelines
|
||||
By submitting this merge request, you agree to follow our [Contribution Guidelines](https://firefish.dev/firefish/firefish/-/blob/develop/CONTRIBUTING.md)
|
||||
- [ ] This closes #0000 (please substitute the issue number or open a new one unless this is a minor fix/refactor)
|
||||
- [ ] I agree to follow this project's Contribution Guidelines
|
||||
- [ ] I have made sure to test this merge request
|
||||
- [ ] I have made sure to run `pnpm run format` before submitting this merge request
|
||||
|
||||
If this merge request makes changes to API, please update `docs/api-change.md`
|
||||
- [ ] I updated the document / This merge request doesn't include API changes
|
||||
|
||||
<!-- Uncomment if your merge request has multiple authors -->
|
||||
<!-- Co-authored-by: Name <email@example.com> -->
|
18
.gitlab/merge_request_templates/release.md
Normal file
18
.gitlab/merge_request_templates/release.md
Normal file
|
@ -0,0 +1,18 @@
|
|||
<!-- This template is used only when merging the develop branch into the main branch. Please don't use this for other merge requests. -->
|
||||
/label Release
|
||||
|
||||
## Checklist
|
||||
|
||||
- [ ] There are no pending changes on Weblate
|
||||
|
||||
I have updated...
|
||||
|
||||
- [ ] `package.json`
|
||||
- [ ] `docs/changelog.md`
|
||||
- [ ] `docs/notice-for-admins.md`
|
||||
- [ ] `docs/api-change.md`
|
||||
- [ ] `packages/backend-rs/index.js`
|
||||
- [ ] OCI container image
|
||||
|
||||
## Remarks
|
||||
|
22
.vscode/extensions.json
vendored
Normal file
22
.vscode/extensions.json
vendored
Normal file
|
@ -0,0 +1,22 @@
|
|||
{
|
||||
"recommendations": [
|
||||
"editorconfig.editorconfig",
|
||||
"vue.volar",
|
||||
"arcanis.vscode-zipfs",
|
||||
"orta.vscode-twoslash-queries",
|
||||
"antfu.iconify",
|
||||
"vivaxy.vscode-conventional-commits",
|
||||
"ms-azuretools.vscode-docker",
|
||||
"gitlab.gitlab-workflow",
|
||||
"mrmlnc.vscode-json5",
|
||||
"esbenp.prettier-vscode",
|
||||
"redhat.vscode-yaml",
|
||||
"yoavbls.pretty-ts-errors",
|
||||
"biomejs.biome",
|
||||
"rust-lang.rust-analyzer",
|
||||
"vadimcn.vscode-lldb",
|
||||
"fill-labs.dependi",
|
||||
"tamasfe.even-better-toml",
|
||||
"aaron-bond.better-comments"
|
||||
]
|
||||
}
|
20
.vscode/launch.json
vendored
Normal file
20
.vscode/launch.json
vendored
Normal file
|
@ -0,0 +1,20 @@
|
|||
{
|
||||
// Use IntelliSense to learn about possible attributes.
|
||||
// Hover to view descriptions of existing attributes.
|
||||
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"type": "node",
|
||||
"request": "launch",
|
||||
"name": "Launch PNPM Debug Script",
|
||||
"skipFiles": [
|
||||
"<node_internals>/**"
|
||||
],
|
||||
"runtimeExecutable": "pnpm",
|
||||
"runtimeArgs": [
|
||||
"run", "debug"
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
3
.weblate
Normal file
3
.weblate
Normal file
|
@ -0,0 +1,3 @@
|
|||
[weblate]
|
||||
url = https://hosted.weblate.org/api/
|
||||
translation = firefish/locales
|
136
CODE_OF_CONDUCT.md
Normal file
136
CODE_OF_CONDUCT.md
Normal file
|
@ -0,0 +1,136 @@
|
|||
|
||||
# Contributor Covenant Code of Conduct
|
||||
|
||||
## Our Pledge
|
||||
|
||||
We as members, contributors, and leaders pledge to make participation in our
|
||||
community a harassment-free experience for everyone, regardless of age, body
|
||||
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||
identity and expression, level of experience, education, socio-economic status,
|
||||
nationality, personal appearance, race, caste, color, religion, or sexual
|
||||
identity and orientation.
|
||||
|
||||
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||
diverse, inclusive, and healthy community.
|
||||
|
||||
## Our Standards
|
||||
|
||||
Examples of behavior that contributes to a positive environment for our
|
||||
community include:
|
||||
|
||||
* Demonstrating empathy and kindness toward other people
|
||||
* Being respectful of differing opinions, viewpoints, and experiences
|
||||
* Giving and gracefully accepting constructive feedback
|
||||
* Accepting responsibility and apologizing to those affected by our mistakes,
|
||||
and learning from the experience
|
||||
* Focusing on what is best not just for us as individuals, but for the overall
|
||||
community
|
||||
|
||||
Examples of unacceptable behavior include:
|
||||
|
||||
* The use of sexualized language or imagery, and sexual attention or advances of
|
||||
any kind
|
||||
* Trolling, insulting or derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or email address,
|
||||
without their explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a
|
||||
professional setting
|
||||
|
||||
## Enforcement Responsibilities
|
||||
|
||||
Community leaders are responsible for clarifying and enforcing our standards of
|
||||
acceptable behavior and will take appropriate and fair corrective action in
|
||||
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||
or harmful.
|
||||
|
||||
Community leaders have the right and responsibility to remove, edit, or reject
|
||||
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||
decisions when appropriate.
|
||||
|
||||
## Scope
|
||||
|
||||
This Code of Conduct applies within all community spaces, and also applies when
|
||||
an individual is officially representing the community in public spaces.
|
||||
Examples of representing our community include using an official e-mail address,
|
||||
posting via an official social media account, or acting as an appointed
|
||||
representative at an online or offline event.
|
||||
|
||||
## Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||
reported to the community leaders responsible for enforcement at
|
||||
@thatonecalculator on Codeberg,
|
||||
`@kainoa@firefish.social` on the Fediverse,
|
||||
or kainoa@t1c.dev via email.
|
||||
All complaints will be reviewed and investigated promptly and fairly.
|
||||
|
||||
All community leaders are obligated to respect the privacy and security of the
|
||||
reporter of any incident.
|
||||
|
||||
## Enforcement Guidelines
|
||||
|
||||
Community leaders will follow these Community Impact Guidelines in determining
|
||||
the consequences for any action they deem in violation of this Code of Conduct:
|
||||
|
||||
### 1. Correction
|
||||
|
||||
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||
unprofessional or unwelcome in the community.
|
||||
|
||||
**Consequence**: A private, written warning from community leaders, providing
|
||||
clarity around the nature of the violation and an explanation of why the
|
||||
behavior was inappropriate. A public apology may be requested.
|
||||
|
||||
### 2. Warning
|
||||
|
||||
**Community Impact**: A violation through a single incident or series of
|
||||
actions.
|
||||
|
||||
**Consequence**: A warning with consequences for continued behavior. No
|
||||
interaction with the people involved, including unsolicited interaction with
|
||||
those enforcing the Code of Conduct, for a specified period of time. This
|
||||
includes avoiding interactions in community spaces as well as external channels
|
||||
like social media. Violating these terms may lead to a temporary or permanent
|
||||
ban.
|
||||
|
||||
### 3. Temporary Ban
|
||||
|
||||
**Community Impact**: A serious violation of community standards, including
|
||||
sustained inappropriate behavior.
|
||||
|
||||
**Consequence**: A temporary ban from any sort of interaction or public
|
||||
communication with the community for a specified period of time. No public or
|
||||
private interaction with the people involved, including unsolicited interaction
|
||||
with those enforcing the Code of Conduct, is allowed during this period.
|
||||
Violating these terms may lead to a permanent ban.
|
||||
|
||||
### 4. Permanent Ban
|
||||
|
||||
**Community Impact**: Demonstrating a pattern of violation of community
|
||||
standards, including sustained inappropriate behavior, harassment of an
|
||||
individual, or aggression toward or disparagement of classes of individuals.
|
||||
|
||||
**Consequence**: A permanent ban from any sort of public interaction within the
|
||||
community.
|
||||
|
||||
## Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||
version 2.1, available at
|
||||
[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1].
|
||||
|
||||
Community Impact Guidelines were inspired by
|
||||
[Mozilla's code of conduct enforcement ladder][Mozilla CoC].
|
||||
|
||||
For answers to common questions about this code of conduct, see the FAQ at
|
||||
[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at
|
||||
[https://www.contributor-covenant.org/translations][translations].
|
||||
|
||||
[homepage]: https://www.contributor-covenant.org
|
||||
[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html
|
||||
[Mozilla CoC]: https://github.com/mozilla/diversity
|
||||
[FAQ]: https://www.contributor-covenant.org/faq
|
||||
[translations]: https://www.contributor-covenant.org/translations
|
||||
|
80
CONTRIBUTING.md
Normal file
80
CONTRIBUTING.md
Normal file
|
@ -0,0 +1,80 @@
|
|||
# Contribution guide
|
||||
We're glad you're interested in contributing Firefish! In this document you will find the information you need to contribute to the project.
|
||||
|
||||
## Translation (i18n)
|
||||
Firefish uses [Weblate](https://hosted.weblate.org/engage/firefish/) for translation and internationalization management.
|
||||
|
||||
If your language is not listed in Weblate, please open an issue.
|
||||
|
||||
You can contribute without knowing how to code by helping translate here:
|
||||
|
||||
[](https://hosted.weblate.org/engage/firefish/)
|
||||
|
||||
[](https://hosted.weblate.org/engage/firefish/)
|
||||
|
||||
## Issues
|
||||
Before creating an issue, please check the following:
|
||||
- To avoid duplication, please search for similar issues before creating a new issue.
|
||||
- Do not use Issues to ask questions or troubleshooting.
|
||||
- Issues should only be used to feature requests, suggestions, and bug tracking.
|
||||
- Please ask questions or troubleshooting in the [Matrix room](https://matrix.to/#/#firefish-community:nitro.chat).
|
||||
|
||||
> **Warning**
|
||||
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
|
||||
|
||||
## Coding
|
||||
|
||||
### Preparing a development environment
|
||||
|
||||
You can prepare your local Firefish environment in multiple ways:
|
||||
|
||||
- [Run Firefish and databases on your host](../dev/docs/local-installation.md)
|
||||
- [Run Firefish on your host and databases in containers](../dev/docs/db-container.md)
|
||||
- [Run Firefish and databases in containers](../dev/docs/container.md)
|
||||
|
||||
### Before implementation
|
||||
When you want to add a feature or fix a bug, **first have the design and policy reviewed in an Issue** (if it is not there, please make one). Without this step, there is a high possibility that the MR will not be merged even if it is implemented.
|
||||
|
||||
At this point, you also need to clarify the goals of the MR you will create, and make sure that the other members of the team are aware of them.
|
||||
MRs that do not have a clear set of do's and don'ts tend to be bloated and difficult to review.
|
||||
|
||||
Also, when you start implementation, assign yourself to the Issue (if you cannot do it yourself, ask another member to assign you). By expressing your intention to work the Issue, you can prevent conflicts in the work.
|
||||
|
||||
### Well-known branches
|
||||
- The **`main`** branch is tracking the latest release and used for production purposes.
|
||||
- The **`develop`** branch is where we work for the next release.
|
||||
- When you create a MR, basically target it to this branch. **But create a different branch**
|
||||
- The **`l10n_develop`** branch is reserved for localization management.
|
||||
- **`feature/*`** branches are reserved for the development of a specific feature
|
||||
|
||||
### Creating a merge request (MR)
|
||||
Thank you for your MR! Before creating a MR, please check the following:
|
||||
- If possible, prefix the title with a keyword that identifies the type of this MR, as shown below.
|
||||
- `fix` / `refactor` / `feat` / `enhance` / `perf` / `chore` etc. You are also welcome to use gitmoji. This is important as we use these to A) easier read the git history and B) generate our changelog. Without propper prefixing it is possible that your MR is rejected.
|
||||
- Also, make sure that the granularity of this MR is appropriate. Please do not include more than one type of change or interest in a single MR.
|
||||
- If there is an Issue which will be resolved by this MR, please include a reference to the Issue in the text. Good examples include `Closing: #21` or `Resolves: #21`
|
||||
- Check if there are any documents that need to be created or updated due to this change.
|
||||
- For example, you need to update `docs/api-change.md` if the MR includes API changes.
|
||||
- If you have added a feature or fixed a bug, please add a test case if possible.
|
||||
- Please make sure that formatting, tests and Lint are passed in advance.
|
||||
- You can run it with `pnpm run format`, `pnpm run test` and `pnpm run lint`. [See more info](#testing)
|
||||
- If this MR includes UI changes, please attach a screenshot in the text.
|
||||
|
||||
Thanks for your cooperation 🤗
|
||||
|
||||
## Reviewers guide
|
||||
Be willing to comment on the good points and not just the things you want fixed 💯
|
||||
|
||||
### Review perspective
|
||||
- Scope
|
||||
- Are the goals of the MR clear?
|
||||
- Is the granularity of the MR appropriate?
|
||||
- Security
|
||||
- Does merging this MR create a vulnerability?
|
||||
- Performance
|
||||
- Will merging this MR cause unexpected performance degradation?
|
||||
- Is there a more efficient way?
|
||||
- Testing
|
||||
- Does the test ensure the expected behavior?
|
||||
- Are there any omissions or gaps?
|
||||
- Does it check for anomalies?
|
60
COPYING
Normal file
60
COPYING
Normal file
|
@ -0,0 +1,60 @@
|
|||
Unless specified otherwise, the entirety of this repository is subject to the following:
|
||||
Copyright (c) 2014-2023 syuilo and contributors
|
||||
Copyright (c) 2022-2023 Kainoa Kanter and contributors
|
||||
Copyright (c) 2024 Firefish contributors
|
||||
|
||||
And is distributed under The GNU Affero General Public License Version 3, you should have received a copy of the license file as LICENSE.
|
||||
|
||||
---
|
||||
|
||||
The packages/macro-rs directory and their contents are
|
||||
Copyright (c) 2024 Firefish contributors
|
||||
|
||||
And are distributed under either of The Apache Licence, Version 2.0
|
||||
or The MIT License at your option. See these files for details:
|
||||
|
||||
- packages/macro-rs/LICENSE-MIT
|
||||
- packages/macro-rs/LICENSE-APACHE
|
||||
|
||||
---
|
||||
|
||||
The packages/firefish-js directory and their contents are
|
||||
Copyright (c) 2021-2022 syuilo and contributors
|
||||
Copyright (c) 2022-2023 Kainoa Kanter and contributors
|
||||
Copyright (c) 2024 Firefish contributors
|
||||
|
||||
And are distributed under The MIT License.
|
||||
See packages/firefish-js/LICENSE for details.
|
||||
|
||||
---
|
||||
|
||||
These specific configuration directories:
|
||||
|
||||
- .config/
|
||||
- custom/
|
||||
|
||||
and their contents are
|
||||
Copyright (c) 2022-2023 Kainoa Kanter and contributors
|
||||
Copyright (c) 2024 Firefish contributors
|
||||
|
||||
And are distributed under The Apache License, Version 2.0, you should have received a copy of the license file as LICENSE in each specified directory.
|
||||
|
||||
---
|
||||
|
||||
Firefish includes several third-party open-source softwares and software libraries.
|
||||
|
||||
RsaSignature2017 implementation by Transmute Industries Inc
|
||||
License: MIT
|
||||
https://github.com/transmute-industries/RsaSignature2017/blob/master/LICENSE
|
||||
|
||||
Chiptune2.js by Simon Gündling
|
||||
License: MIT
|
||||
https://github.com/deskjet/chiptune2.js#license
|
||||
|
||||
bb8-redis by Kyle Huey
|
||||
License: MIT
|
||||
https://github.com/djc/bb8/blob/62597aa45ac1746780b08cb6a68cf7d65452a23a/LICENSE
|
||||
|
||||
Licenses for all softwares and software libraries installed via the Node Package Manager ("npm") can be found by running the following shell command in the root directory of this repository:
|
||||
|
||||
pnpm licenses list
|
4481
Cargo.lock
generated
Normal file
4481
Cargo.lock
generated
Normal file
File diff suppressed because it is too large
Load diff
64
Cargo.toml
Normal file
64
Cargo.toml
Normal file
|
@ -0,0 +1,64 @@
|
|||
[workspace]
|
||||
members = ["packages/backend-rs", "packages/macro-rs/macros", "packages/macro-rs/macros-impl"]
|
||||
resolver = "2"
|
||||
|
||||
[workspace.package]
|
||||
edition = "2021"
|
||||
rust-version = "1.74"
|
||||
|
||||
[workspace.dependencies]
|
||||
macros = { path = "packages/macro-rs/macros" }
|
||||
macros-impl = { path = "packages/macro-rs/macros-impl" }
|
||||
|
||||
napi = "3.0.0-alpha.8"
|
||||
napi-derive = "3.0.0-alpha.7"
|
||||
napi-build = "2.1.3"
|
||||
|
||||
argon2 = { version = "0.5.3", default-features = false }
|
||||
async-trait = { version = "0.1.81", default-features = false }
|
||||
basen = { version = "0.1.0", default-features = false }
|
||||
bb8 = { version = "0.8.5", default-features = false }
|
||||
bcrypt = { version = "0.15.1", default-features = false }
|
||||
chrono = { version = "0.4.38", default-features = false }
|
||||
convert_case = { version = "0.6.0", default-features = false }
|
||||
cuid2 = { version = "0.1.2", default-features = false }
|
||||
emojis = { version = "0.6.3", default-features = false }
|
||||
futures-util = { version = "0.3.30", default-features = false }
|
||||
idna = { version = "1.0.2", default-features = false }
|
||||
image = { version = "0.25.2", default-features = false }
|
||||
isahc = { version = "1.7.2", default-features = false }
|
||||
nom-exif = { version = "1.3.0", default-features = false }
|
||||
once_cell = { version = "1.19.0", default-features = false }
|
||||
pretty_assertions = { version = "1.4.0", default-features = false }
|
||||
proc-macro2 = { version = "1.0.86", default-features = false }
|
||||
quote = { version = "1.0.36", default-features = false }
|
||||
rand = { version = "0.8.5", default-features = false }
|
||||
redis = { version = "0.26.0", default-features = false }
|
||||
regex = { version = "1.10.5", default-features = false }
|
||||
rmp-serde = { version = "1.3.0", default-features = false }
|
||||
sea-orm = { version = "0.12.15", default-features = false }
|
||||
serde = { version = "1.0.204", default-features = false }
|
||||
serde_json = { version = "1.0.120", default-features = false }
|
||||
serde_yaml = { version = "0.9.34", default-features = false }
|
||||
syn = { version = "2.0.72", default-features = false }
|
||||
sysinfo = { version = "0.30.13", default-features = false }
|
||||
thiserror = { version = "1.0.63", default-features = false }
|
||||
tokio = { version = "1.39.2", default-features = false }
|
||||
tokio-test = { version = "0.4.4", default-features = false }
|
||||
tracing = { version = "0.1.40", default-features = false }
|
||||
tracing-subscriber = { version = "0.3.18", default-features = false }
|
||||
url = { version = "2.5.2", default-features = false }
|
||||
urlencoding = { version = "2.1.3", default-features = false }
|
||||
web-push = { git = "https://github.com/pimeys/rust-web-push.git", rev = "40febe4085e3cef9cdfd539c315e3e945aba0656", default-features = false }
|
||||
zhconv = "0.3.1"
|
||||
|
||||
# subdependencies
|
||||
## explicitly list OpenSSL to use the vendored version
|
||||
openssl = "0.10.66"
|
||||
|
||||
## some subdependencies require higher Rust version than 1.74 (our MSRV)
|
||||
## cargo update && cargo update ravif --precise 0.11.5 && cargo update bitstream-io --precise 2.3.0
|
||||
## to pin their versions if needed
|
||||
|
||||
[profile.release]
|
||||
lto = true
|
52
Dockerfile
Normal file
52
Dockerfile
Normal file
|
@ -0,0 +1,52 @@
|
|||
# Install dev and compilation dependencies, build files
|
||||
FROM docker.io/node:20-alpine AS build
|
||||
WORKDIR /firefish
|
||||
|
||||
# Install build tools and work around the linker name issue
|
||||
RUN apk update && apk add --no-cache build-base linux-headers curl ca-certificates python3 perl
|
||||
RUN ln -s $(which gcc) /usr/bin/aarch64-linux-musl-gcc
|
||||
|
||||
# Install Rust toolchain
|
||||
RUN curl --proto '=https' --tlsv1.2 --silent --show-error --fail https://sh.rustup.rs | sh -s -- -y
|
||||
ENV PATH="/root/.cargo/bin:${PATH}"
|
||||
|
||||
# Configure pnpm
|
||||
RUN corepack enable && corepack prepare pnpm@latest --activate
|
||||
|
||||
# Build
|
||||
COPY . ./
|
||||
RUN pnpm install --frozen-lockfile
|
||||
RUN cargo fetch --locked --manifest-path Cargo.toml
|
||||
RUN NODE_ENV='production' NODE_OPTIONS='--max_old_space_size=3072' pnpm run build
|
||||
|
||||
# Trim down the dependencies to only those for production
|
||||
RUN find . -path '*/node_modules/*' -delete && pnpm install --prod --frozen-lockfile
|
||||
|
||||
# Runtime container
|
||||
FROM docker.io/node:20-alpine
|
||||
WORKDIR /firefish
|
||||
|
||||
# Install runtime dependencies
|
||||
RUN apk update && apk add --no-cache zip unzip tini ffmpeg curl
|
||||
|
||||
COPY . ./
|
||||
|
||||
# Copy node modules
|
||||
COPY --from=build /firefish/node_modules /firefish/node_modules
|
||||
COPY --from=build /firefish/packages/backend/node_modules /firefish/packages/backend/node_modules
|
||||
# COPY --from=build /firefish/packages/sw/node_modules /firefish/packages/sw/node_modules
|
||||
# COPY --from=build /firefish/packages/client/node_modules /firefish/packages/client/node_modules
|
||||
COPY --from=build /firefish/packages/firefish-js/node_modules /firefish/packages/firefish-js/node_modules
|
||||
|
||||
# Copy the build artifacts
|
||||
COPY --from=build /firefish/built /firefish/built
|
||||
COPY --from=build /firefish/packages/backend/built /firefish/packages/backend/built
|
||||
COPY --from=build /firefish/packages/backend/assets/instance.css /firefish/packages/backend/assets/instance.css
|
||||
COPY --from=build /firefish/packages/backend-rs/built /firefish/packages/backend-rs/built
|
||||
COPY --from=build /firefish/packages/firefish-js/built /firefish/packages/firefish-js/built
|
||||
|
||||
RUN corepack enable && corepack prepare pnpm@latest --activate
|
||||
ENV NODE_ENV=production
|
||||
VOLUME "/firefish/files"
|
||||
ENTRYPOINT [ "/sbin/tini", "--" ]
|
||||
CMD [ "pnpm", "run", "start:container" ]
|
661
LICENSE
Normal file
661
LICENSE
Normal file
|
@ -0,0 +1,661 @@
|
|||
GNU AFFERO GENERAL PUBLIC LICENSE
|
||||
Version 3, 19 November 2007
|
||||
|
||||
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
Preamble
|
||||
|
||||
The GNU Affero General Public License is a free, copyleft license for
|
||||
software and other kinds of works, specifically designed to ensure
|
||||
cooperation with the community in the case of network server software.
|
||||
|
||||
The licenses for most software and other practical works are designed
|
||||
to take away your freedom to share and change the works. By contrast,
|
||||
our General Public Licenses are intended to guarantee your freedom to
|
||||
share and change all versions of a program--to make sure it remains free
|
||||
software for all its users.
|
||||
|
||||
When we speak of free software, we are referring to freedom, not
|
||||
price. Our General Public Licenses are designed to make sure that you
|
||||
have the freedom to distribute copies of free software (and charge for
|
||||
them if you wish), that you receive source code or can get it if you
|
||||
want it, that you can change the software or use pieces of it in new
|
||||
free programs, and that you know you can do these things.
|
||||
|
||||
Developers that use our General Public Licenses protect your rights
|
||||
with two steps: (1) assert copyright on the software, and (2) offer
|
||||
you this License which gives you legal permission to copy, distribute
|
||||
and/or modify the software.
|
||||
|
||||
A secondary benefit of defending all users' freedom is that
|
||||
improvements made in alternate versions of the program, if they
|
||||
receive widespread use, become available for other developers to
|
||||
incorporate. Many developers of free software are heartened and
|
||||
encouraged by the resulting cooperation. However, in the case of
|
||||
software used on network servers, this result may fail to come about.
|
||||
The GNU General Public License permits making a modified version and
|
||||
letting the public access it on a server without ever releasing its
|
||||
source code to the public.
|
||||
|
||||
The GNU Affero General Public License is designed specifically to
|
||||
ensure that, in such cases, the modified source code becomes available
|
||||
to the community. It requires the operator of a network server to
|
||||
provide the source code of the modified version running there to the
|
||||
users of that server. Therefore, public use of a modified version, on
|
||||
a publicly accessible server, gives the public access to the source
|
||||
code of the modified version.
|
||||
|
||||
An older license, called the Affero General Public License and
|
||||
published by Affero, was designed to accomplish similar goals. This is
|
||||
a different license, not a version of the Affero GPL, but Affero has
|
||||
released a new version of the Affero GPL which permits relicensing under
|
||||
this license.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow.
|
||||
|
||||
TERMS AND CONDITIONS
|
||||
|
||||
0. Definitions.
|
||||
|
||||
"This License" refers to version 3 of the GNU Affero General Public License.
|
||||
|
||||
"Copyright" also means copyright-like laws that apply to other kinds of
|
||||
works, such as semiconductor masks.
|
||||
|
||||
"The Program" refers to any copyrightable work licensed under this
|
||||
License. Each licensee is addressed as "you". "Licensees" and
|
||||
"recipients" may be individuals or organizations.
|
||||
|
||||
To "modify" a work means to copy from or adapt all or part of the work
|
||||
in a fashion requiring copyright permission, other than the making of an
|
||||
exact copy. The resulting work is called a "modified version" of the
|
||||
earlier work or a work "based on" the earlier work.
|
||||
|
||||
A "covered work" means either the unmodified Program or a work based
|
||||
on the Program.
|
||||
|
||||
To "propagate" a work means to do anything with it that, without
|
||||
permission, would make you directly or secondarily liable for
|
||||
infringement under applicable copyright law, except executing it on a
|
||||
computer or modifying a private copy. Propagation includes copying,
|
||||
distribution (with or without modification), making available to the
|
||||
public, and in some countries other activities as well.
|
||||
|
||||
To "convey" a work means any kind of propagation that enables other
|
||||
parties to make or receive copies. Mere interaction with a user through
|
||||
a computer network, with no transfer of a copy, is not conveying.
|
||||
|
||||
An interactive user interface displays "Appropriate Legal Notices"
|
||||
to the extent that it includes a convenient and prominently visible
|
||||
feature that (1) displays an appropriate copyright notice, and (2)
|
||||
tells the user that there is no warranty for the work (except to the
|
||||
extent that warranties are provided), that licensees may convey the
|
||||
work under this License, and how to view a copy of this License. If
|
||||
the interface presents a list of user commands or options, such as a
|
||||
menu, a prominent item in the list meets this criterion.
|
||||
|
||||
1. Source Code.
|
||||
|
||||
The "source code" for a work means the preferred form of the work
|
||||
for making modifications to it. "Object code" means any non-source
|
||||
form of a work.
|
||||
|
||||
A "Standard Interface" means an interface that either is an official
|
||||
standard defined by a recognized standards body, or, in the case of
|
||||
interfaces specified for a particular programming language, one that
|
||||
is widely used among developers working in that language.
|
||||
|
||||
The "System Libraries" of an executable work include anything, other
|
||||
than the work as a whole, that (a) is included in the normal form of
|
||||
packaging a Major Component, but which is not part of that Major
|
||||
Component, and (b) serves only to enable use of the work with that
|
||||
Major Component, or to implement a Standard Interface for which an
|
||||
implementation is available to the public in source code form. A
|
||||
"Major Component", in this context, means a major essential component
|
||||
(kernel, window system, and so on) of the specific operating system
|
||||
(if any) on which the executable work runs, or a compiler used to
|
||||
produce the work, or an object code interpreter used to run it.
|
||||
|
||||
The "Corresponding Source" for a work in object code form means all
|
||||
the source code needed to generate, install, and (for an executable
|
||||
work) run the object code and to modify the work, including scripts to
|
||||
control those activities. However, it does not include the work's
|
||||
System Libraries, or general-purpose tools or generally available free
|
||||
programs which are used unmodified in performing those activities but
|
||||
which are not part of the work. For example, Corresponding Source
|
||||
includes interface definition files associated with source files for
|
||||
the work, and the source code for shared libraries and dynamically
|
||||
linked subprograms that the work is specifically designed to require,
|
||||
such as by intimate data communication or control flow between those
|
||||
subprograms and other parts of the work.
|
||||
|
||||
The Corresponding Source need not include anything that users
|
||||
can regenerate automatically from other parts of the Corresponding
|
||||
Source.
|
||||
|
||||
The Corresponding Source for a work in source code form is that
|
||||
same work.
|
||||
|
||||
2. Basic Permissions.
|
||||
|
||||
All rights granted under this License are granted for the term of
|
||||
copyright on the Program, and are irrevocable provided the stated
|
||||
conditions are met. This License explicitly affirms your unlimited
|
||||
permission to run the unmodified Program. The output from running a
|
||||
covered work is covered by this License only if the output, given its
|
||||
content, constitutes a covered work. This License acknowledges your
|
||||
rights of fair use or other equivalent, as provided by copyright law.
|
||||
|
||||
You may make, run and propagate covered works that you do not
|
||||
convey, without conditions so long as your license otherwise remains
|
||||
in force. You may convey covered works to others for the sole purpose
|
||||
of having them make modifications exclusively for you, or provide you
|
||||
with facilities for running those works, provided that you comply with
|
||||
the terms of this License in conveying all material for which you do
|
||||
not control copyright. Those thus making or running the covered works
|
||||
for you must do so exclusively on your behalf, under your direction
|
||||
and control, on terms that prohibit them from making any copies of
|
||||
your copyrighted material outside their relationship with you.
|
||||
|
||||
Conveying under any other circumstances is permitted solely under
|
||||
the conditions stated below. Sublicensing is not allowed; section 10
|
||||
makes it unnecessary.
|
||||
|
||||
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
|
||||
|
||||
No covered work shall be deemed part of an effective technological
|
||||
measure under any applicable law fulfilling obligations under article
|
||||
11 of the WIPO copyright treaty adopted on 20 December 1996, or
|
||||
similar laws prohibiting or restricting circumvention of such
|
||||
measures.
|
||||
|
||||
When you convey a covered work, you waive any legal power to forbid
|
||||
circumvention of technological measures to the extent such circumvention
|
||||
is effected by exercising rights under this License with respect to
|
||||
the covered work, and you disclaim any intention to limit operation or
|
||||
modification of the work as a means of enforcing, against the work's
|
||||
users, your or third parties' legal rights to forbid circumvention of
|
||||
technological measures.
|
||||
|
||||
4. Conveying Verbatim Copies.
|
||||
|
||||
You may convey verbatim copies of the Program's source code as you
|
||||
receive it, in any medium, provided that you conspicuously and
|
||||
appropriately publish on each copy an appropriate copyright notice;
|
||||
keep intact all notices stating that this License and any
|
||||
non-permissive terms added in accord with section 7 apply to the code;
|
||||
keep intact all notices of the absence of any warranty; and give all
|
||||
recipients a copy of this License along with the Program.
|
||||
|
||||
You may charge any price or no price for each copy that you convey,
|
||||
and you may offer support or warranty protection for a fee.
|
||||
|
||||
5. Conveying Modified Source Versions.
|
||||
|
||||
You may convey a work based on the Program, or the modifications to
|
||||
produce it from the Program, in the form of source code under the
|
||||
terms of section 4, provided that you also meet all of these conditions:
|
||||
|
||||
a) The work must carry prominent notices stating that you modified
|
||||
it, and giving a relevant date.
|
||||
|
||||
b) The work must carry prominent notices stating that it is
|
||||
released under this License and any conditions added under section
|
||||
7. This requirement modifies the requirement in section 4 to
|
||||
"keep intact all notices".
|
||||
|
||||
c) You must license the entire work, as a whole, under this
|
||||
License to anyone who comes into possession of a copy. This
|
||||
License will therefore apply, along with any applicable section 7
|
||||
additional terms, to the whole of the work, and all its parts,
|
||||
regardless of how they are packaged. This License gives no
|
||||
permission to license the work in any other way, but it does not
|
||||
invalidate such permission if you have separately received it.
|
||||
|
||||
d) If the work has interactive user interfaces, each must display
|
||||
Appropriate Legal Notices; however, if the Program has interactive
|
||||
interfaces that do not display Appropriate Legal Notices, your
|
||||
work need not make them do so.
|
||||
|
||||
A compilation of a covered work with other separate and independent
|
||||
works, which are not by their nature extensions of the covered work,
|
||||
and which are not combined with it such as to form a larger program,
|
||||
in or on a volume of a storage or distribution medium, is called an
|
||||
"aggregate" if the compilation and its resulting copyright are not
|
||||
used to limit the access or legal rights of the compilation's users
|
||||
beyond what the individual works permit. Inclusion of a covered work
|
||||
in an aggregate does not cause this License to apply to the other
|
||||
parts of the aggregate.
|
||||
|
||||
6. Conveying Non-Source Forms.
|
||||
|
||||
You may convey a covered work in object code form under the terms
|
||||
of sections 4 and 5, provided that you also convey the
|
||||
machine-readable Corresponding Source under the terms of this License,
|
||||
in one of these ways:
|
||||
|
||||
a) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by the
|
||||
Corresponding Source fixed on a durable physical medium
|
||||
customarily used for software interchange.
|
||||
|
||||
b) Convey the object code in, or embodied in, a physical product
|
||||
(including a physical distribution medium), accompanied by a
|
||||
written offer, valid for at least three years and valid for as
|
||||
long as you offer spare parts or customer support for that product
|
||||
model, to give anyone who possesses the object code either (1) a
|
||||
copy of the Corresponding Source for all the software in the
|
||||
product that is covered by this License, on a durable physical
|
||||
medium customarily used for software interchange, for a price no
|
||||
more than your reasonable cost of physically performing this
|
||||
conveying of source, or (2) access to copy the
|
||||
Corresponding Source from a network server at no charge.
|
||||
|
||||
c) Convey individual copies of the object code with a copy of the
|
||||
written offer to provide the Corresponding Source. This
|
||||
alternative is allowed only occasionally and noncommercially, and
|
||||
only if you received the object code with such an offer, in accord
|
||||
with subsection 6b.
|
||||
|
||||
d) Convey the object code by offering access from a designated
|
||||
place (gratis or for a charge), and offer equivalent access to the
|
||||
Corresponding Source in the same way through the same place at no
|
||||
further charge. You need not require recipients to copy the
|
||||
Corresponding Source along with the object code. If the place to
|
||||
copy the object code is a network server, the Corresponding Source
|
||||
may be on a different server (operated by you or a third party)
|
||||
that supports equivalent copying facilities, provided you maintain
|
||||
clear directions next to the object code saying where to find the
|
||||
Corresponding Source. Regardless of what server hosts the
|
||||
Corresponding Source, you remain obligated to ensure that it is
|
||||
available for as long as needed to satisfy these requirements.
|
||||
|
||||
e) Convey the object code using peer-to-peer transmission, provided
|
||||
you inform other peers where the object code and Corresponding
|
||||
Source of the work are being offered to the general public at no
|
||||
charge under subsection 6d.
|
||||
|
||||
A separable portion of the object code, whose source code is excluded
|
||||
from the Corresponding Source as a System Library, need not be
|
||||
included in conveying the object code work.
|
||||
|
||||
A "User Product" is either (1) a "consumer product", which means any
|
||||
tangible personal property which is normally used for personal, family,
|
||||
or household purposes, or (2) anything designed or sold for incorporation
|
||||
into a dwelling. In determining whether a product is a consumer product,
|
||||
doubtful cases shall be resolved in favor of coverage. For a particular
|
||||
product received by a particular user, "normally used" refers to a
|
||||
typical or common use of that class of product, regardless of the status
|
||||
of the particular user or of the way in which the particular user
|
||||
actually uses, or expects or is expected to use, the product. A product
|
||||
is a consumer product regardless of whether the product has substantial
|
||||
commercial, industrial or non-consumer uses, unless such uses represent
|
||||
the only significant mode of use of the product.
|
||||
|
||||
"Installation Information" for a User Product means any methods,
|
||||
procedures, authorization keys, or other information required to install
|
||||
and execute modified versions of a covered work in that User Product from
|
||||
a modified version of its Corresponding Source. The information must
|
||||
suffice to ensure that the continued functioning of the modified object
|
||||
code is in no case prevented or interfered with solely because
|
||||
modification has been made.
|
||||
|
||||
If you convey an object code work under this section in, or with, or
|
||||
specifically for use in, a User Product, and the conveying occurs as
|
||||
part of a transaction in which the right of possession and use of the
|
||||
User Product is transferred to the recipient in perpetuity or for a
|
||||
fixed term (regardless of how the transaction is characterized), the
|
||||
Corresponding Source conveyed under this section must be accompanied
|
||||
by the Installation Information. But this requirement does not apply
|
||||
if neither you nor any third party retains the ability to install
|
||||
modified object code on the User Product (for example, the work has
|
||||
been installed in ROM).
|
||||
|
||||
The requirement to provide Installation Information does not include a
|
||||
requirement to continue to provide support service, warranty, or updates
|
||||
for a work that has been modified or installed by the recipient, or for
|
||||
the User Product in which it has been modified or installed. Access to a
|
||||
network may be denied when the modification itself materially and
|
||||
adversely affects the operation of the network or violates the rules and
|
||||
protocols for communication across the network.
|
||||
|
||||
Corresponding Source conveyed, and Installation Information provided,
|
||||
in accord with this section must be in a format that is publicly
|
||||
documented (and with an implementation available to the public in
|
||||
source code form), and must require no special password or key for
|
||||
unpacking, reading or copying.
|
||||
|
||||
7. Additional Terms.
|
||||
|
||||
"Additional permissions" are terms that supplement the terms of this
|
||||
License by making exceptions from one or more of its conditions.
|
||||
Additional permissions that are applicable to the entire Program shall
|
||||
be treated as though they were included in this License, to the extent
|
||||
that they are valid under applicable law. If additional permissions
|
||||
apply only to part of the Program, that part may be used separately
|
||||
under those permissions, but the entire Program remains governed by
|
||||
this License without regard to the additional permissions.
|
||||
|
||||
When you convey a copy of a covered work, you may at your option
|
||||
remove any additional permissions from that copy, or from any part of
|
||||
it. (Additional permissions may be written to require their own
|
||||
removal in certain cases when you modify the work.) You may place
|
||||
additional permissions on material, added by you to a covered work,
|
||||
for which you have or can give appropriate copyright permission.
|
||||
|
||||
Notwithstanding any other provision of this License, for material you
|
||||
add to a covered work, you may (if authorized by the copyright holders of
|
||||
that material) supplement the terms of this License with terms:
|
||||
|
||||
a) Disclaiming warranty or limiting liability differently from the
|
||||
terms of sections 15 and 16 of this License; or
|
||||
|
||||
b) Requiring preservation of specified reasonable legal notices or
|
||||
author attributions in that material or in the Appropriate Legal
|
||||
Notices displayed by works containing it; or
|
||||
|
||||
c) Prohibiting misrepresentation of the origin of that material, or
|
||||
requiring that modified versions of such material be marked in
|
||||
reasonable ways as different from the original version; or
|
||||
|
||||
d) Limiting the use for publicity purposes of names of licensors or
|
||||
authors of the material; or
|
||||
|
||||
e) Declining to grant rights under trademark law for use of some
|
||||
trade names, trademarks, or service marks; or
|
||||
|
||||
f) Requiring indemnification of licensors and authors of that
|
||||
material by anyone who conveys the material (or modified versions of
|
||||
it) with contractual assumptions of liability to the recipient, for
|
||||
any liability that these contractual assumptions directly impose on
|
||||
those licensors and authors.
|
||||
|
||||
All other non-permissive additional terms are considered "further
|
||||
restrictions" within the meaning of section 10. If the Program as you
|
||||
received it, or any part of it, contains a notice stating that it is
|
||||
governed by this License along with a term that is a further
|
||||
restriction, you may remove that term. If a license document contains
|
||||
a further restriction but permits relicensing or conveying under this
|
||||
License, you may add to a covered work material governed by the terms
|
||||
of that license document, provided that the further restriction does
|
||||
not survive such relicensing or conveying.
|
||||
|
||||
If you add terms to a covered work in accord with this section, you
|
||||
must place, in the relevant source files, a statement of the
|
||||
additional terms that apply to those files, or a notice indicating
|
||||
where to find the applicable terms.
|
||||
|
||||
Additional terms, permissive or non-permissive, may be stated in the
|
||||
form of a separately written license, or stated as exceptions;
|
||||
the above requirements apply either way.
|
||||
|
||||
8. Termination.
|
||||
|
||||
You may not propagate or modify a covered work except as expressly
|
||||
provided under this License. Any attempt otherwise to propagate or
|
||||
modify it is void, and will automatically terminate your rights under
|
||||
this License (including any patent licenses granted under the third
|
||||
paragraph of section 11).
|
||||
|
||||
However, if you cease all violation of this License, then your
|
||||
license from a particular copyright holder is reinstated (a)
|
||||
provisionally, unless and until the copyright holder explicitly and
|
||||
finally terminates your license, and (b) permanently, if the copyright
|
||||
holder fails to notify you of the violation by some reasonable means
|
||||
prior to 60 days after the cessation.
|
||||
|
||||
Moreover, your license from a particular copyright holder is
|
||||
reinstated permanently if the copyright holder notifies you of the
|
||||
violation by some reasonable means, this is the first time you have
|
||||
received notice of violation of this License (for any work) from that
|
||||
copyright holder, and you cure the violation prior to 30 days after
|
||||
your receipt of the notice.
|
||||
|
||||
Termination of your rights under this section does not terminate the
|
||||
licenses of parties who have received copies or rights from you under
|
||||
this License. If your rights have been terminated and not permanently
|
||||
reinstated, you do not qualify to receive new licenses for the same
|
||||
material under section 10.
|
||||
|
||||
9. Acceptance Not Required for Having Copies.
|
||||
|
||||
You are not required to accept this License in order to receive or
|
||||
run a copy of the Program. Ancillary propagation of a covered work
|
||||
occurring solely as a consequence of using peer-to-peer transmission
|
||||
to receive a copy likewise does not require acceptance. However,
|
||||
nothing other than this License grants you permission to propagate or
|
||||
modify any covered work. These actions infringe copyright if you do
|
||||
not accept this License. Therefore, by modifying or propagating a
|
||||
covered work, you indicate your acceptance of this License to do so.
|
||||
|
||||
10. Automatic Licensing of Downstream Recipients.
|
||||
|
||||
Each time you convey a covered work, the recipient automatically
|
||||
receives a license from the original licensors, to run, modify and
|
||||
propagate that work, subject to this License. You are not responsible
|
||||
for enforcing compliance by third parties with this License.
|
||||
|
||||
An "entity transaction" is a transaction transferring control of an
|
||||
organization, or substantially all assets of one, or subdividing an
|
||||
organization, or merging organizations. If propagation of a covered
|
||||
work results from an entity transaction, each party to that
|
||||
transaction who receives a copy of the work also receives whatever
|
||||
licenses to the work the party's predecessor in interest had or could
|
||||
give under the previous paragraph, plus a right to possession of the
|
||||
Corresponding Source of the work from the predecessor in interest, if
|
||||
the predecessor has it or can get it with reasonable efforts.
|
||||
|
||||
You may not impose any further restrictions on the exercise of the
|
||||
rights granted or affirmed under this License. For example, you may
|
||||
not impose a license fee, royalty, or other charge for exercise of
|
||||
rights granted under this License, and you may not initiate litigation
|
||||
(including a cross-claim or counterclaim in a lawsuit) alleging that
|
||||
any patent claim is infringed by making, using, selling, offering for
|
||||
sale, or importing the Program or any portion of it.
|
||||
|
||||
11. Patents.
|
||||
|
||||
A "contributor" is a copyright holder who authorizes use under this
|
||||
License of the Program or a work on which the Program is based. The
|
||||
work thus licensed is called the contributor's "contributor version".
|
||||
|
||||
A contributor's "essential patent claims" are all patent claims
|
||||
owned or controlled by the contributor, whether already acquired or
|
||||
hereafter acquired, that would be infringed by some manner, permitted
|
||||
by this License, of making, using, or selling its contributor version,
|
||||
but do not include claims that would be infringed only as a
|
||||
consequence of further modification of the contributor version. For
|
||||
purposes of this definition, "control" includes the right to grant
|
||||
patent sublicenses in a manner consistent with the requirements of
|
||||
this License.
|
||||
|
||||
Each contributor grants you a non-exclusive, worldwide, royalty-free
|
||||
patent license under the contributor's essential patent claims, to
|
||||
make, use, sell, offer for sale, import and otherwise run, modify and
|
||||
propagate the contents of its contributor version.
|
||||
|
||||
In the following three paragraphs, a "patent license" is any express
|
||||
agreement or commitment, however denominated, not to enforce a patent
|
||||
(such as an express permission to practice a patent or covenant not to
|
||||
sue for patent infringement). To "grant" such a patent license to a
|
||||
party means to make such an agreement or commitment not to enforce a
|
||||
patent against the party.
|
||||
|
||||
If you convey a covered work, knowingly relying on a patent license,
|
||||
and the Corresponding Source of the work is not available for anyone
|
||||
to copy, free of charge and under the terms of this License, through a
|
||||
publicly available network server or other readily accessible means,
|
||||
then you must either (1) cause the Corresponding Source to be so
|
||||
available, or (2) arrange to deprive yourself of the benefit of the
|
||||
patent license for this particular work, or (3) arrange, in a manner
|
||||
consistent with the requirements of this License, to extend the patent
|
||||
license to downstream recipients. "Knowingly relying" means you have
|
||||
actual knowledge that, but for the patent license, your conveying the
|
||||
covered work in a country, or your recipient's use of the covered work
|
||||
in a country, would infringe one or more identifiable patents in that
|
||||
country that you have reason to believe are valid.
|
||||
|
||||
If, pursuant to or in connection with a single transaction or
|
||||
arrangement, you convey, or propagate by procuring conveyance of, a
|
||||
covered work, and grant a patent license to some of the parties
|
||||
receiving the covered work authorizing them to use, propagate, modify
|
||||
or convey a specific copy of the covered work, then the patent license
|
||||
you grant is automatically extended to all recipients of the covered
|
||||
work and works based on it.
|
||||
|
||||
A patent license is "discriminatory" if it does not include within
|
||||
the scope of its coverage, prohibits the exercise of, or is
|
||||
conditioned on the non-exercise of one or more of the rights that are
|
||||
specifically granted under this License. You may not convey a covered
|
||||
work if you are a party to an arrangement with a third party that is
|
||||
in the business of distributing software, under which you make payment
|
||||
to the third party based on the extent of your activity of conveying
|
||||
the work, and under which the third party grants, to any of the
|
||||
parties who would receive the covered work from you, a discriminatory
|
||||
patent license (a) in connection with copies of the covered work
|
||||
conveyed by you (or copies made from those copies), or (b) primarily
|
||||
for and in connection with specific products or compilations that
|
||||
contain the covered work, unless you entered into that arrangement,
|
||||
or that patent license was granted, prior to 28 March 2007.
|
||||
|
||||
Nothing in this License shall be construed as excluding or limiting
|
||||
any implied license or other defenses to infringement that may
|
||||
otherwise be available to you under applicable patent law.
|
||||
|
||||
12. No Surrender of Others' Freedom.
|
||||
|
||||
If conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot convey a
|
||||
covered work so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you may
|
||||
not convey it at all. For example, if you agree to terms that obligate you
|
||||
to collect a royalty for further conveying from those to whom you convey
|
||||
the Program, the only way you could satisfy both those terms and this
|
||||
License would be to refrain entirely from conveying the Program.
|
||||
|
||||
13. Remote Network Interaction; Use with the GNU General Public License.
|
||||
|
||||
Notwithstanding any other provision of this License, if you modify the
|
||||
Program, your modified version must prominently offer all users
|
||||
interacting with it remotely through a computer network (if your version
|
||||
supports such interaction) an opportunity to receive the Corresponding
|
||||
Source of your version by providing access to the Corresponding Source
|
||||
from a network server at no charge, through some standard or customary
|
||||
means of facilitating copying of software. This Corresponding Source
|
||||
shall include the Corresponding Source for any work covered by version 3
|
||||
of the GNU General Public License that is incorporated pursuant to the
|
||||
following paragraph.
|
||||
|
||||
Notwithstanding any other provision of this License, you have
|
||||
permission to link or combine any covered work with a work licensed
|
||||
under version 3 of the GNU General Public License into a single
|
||||
combined work, and to convey the resulting work. The terms of this
|
||||
License will continue to apply to the part which is the covered work,
|
||||
but the work with which it is combined will remain governed by version
|
||||
3 of the GNU General Public License.
|
||||
|
||||
14. Revised Versions of this License.
|
||||
|
||||
The Free Software Foundation may publish revised and/or new versions of
|
||||
the GNU Affero General Public License from time to time. Such new versions
|
||||
will be similar in spirit to the present version, but may differ in detail to
|
||||
address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the
|
||||
Program specifies that a certain numbered version of the GNU Affero General
|
||||
Public License "or any later version" applies to it, you have the
|
||||
option of following the terms and conditions either of that numbered
|
||||
version or of any later version published by the Free Software
|
||||
Foundation. If the Program does not specify a version number of the
|
||||
GNU Affero General Public License, you may choose any version ever published
|
||||
by the Free Software Foundation.
|
||||
|
||||
If the Program specifies that a proxy can decide which future
|
||||
versions of the GNU Affero General Public License can be used, that proxy's
|
||||
public statement of acceptance of a version permanently authorizes you
|
||||
to choose that version for the Program.
|
||||
|
||||
Later license versions may give you additional or different
|
||||
permissions. However, no additional obligations are imposed on any
|
||||
author or copyright holder as a result of your choosing to follow a
|
||||
later version.
|
||||
|
||||
15. Disclaimer of Warranty.
|
||||
|
||||
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
|
||||
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
|
||||
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
|
||||
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
|
||||
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
|
||||
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
|
||||
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. Limitation of Liability.
|
||||
|
||||
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
|
||||
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
|
||||
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
|
||||
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
|
||||
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
|
||||
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
|
||||
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
|
||||
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGES.
|
||||
|
||||
17. Interpretation of Sections 15 and 16.
|
||||
|
||||
If the disclaimer of warranty and limitation of liability provided
|
||||
above cannot be given local legal effect according to their terms,
|
||||
reviewing courts shall apply local law that most closely approximates
|
||||
an absolute waiver of all civil liability in connection with the
|
||||
Program, unless a warranty or assumption of liability accompanies a
|
||||
copy of the Program in return for a fee.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
How to Apply These Terms to Your New Programs
|
||||
|
||||
If you develop a new program, and you want it to be of the greatest
|
||||
possible use to the public, the best way to achieve this is to make it
|
||||
free software which everyone can redistribute and change under these terms.
|
||||
|
||||
To do so, attach the following notices to the program. It is safest
|
||||
to attach them to the start of each source file to most effectively
|
||||
state the exclusion of warranty; and each file should have at least
|
||||
the "copyright" line and a pointer to where the full notice is found.
|
||||
|
||||
<one line to give the program's name and a brief idea of what it does.>
|
||||
Copyright (C) <year> <name of author>
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU Affero General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU Affero General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU Affero General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
Also add information on how to contact you by electronic and paper mail.
|
||||
|
||||
If your software can interact with users remotely through a computer
|
||||
network, you should also make sure that it provides a way for users to
|
||||
get its source. For example, if your program is a web application, its
|
||||
interface could display a "Source" link that leads users to an archive
|
||||
of the code. There are many ways you could offer source, and different
|
||||
solutions will be better for different programs; see section 13 for the
|
||||
specific requirements.
|
||||
|
||||
You should also get your employer (if you work as a programmer) or school,
|
||||
if any, to sign a "copyright disclaimer" for the program, if necessary.
|
||||
For more information on this, and how to apply and follow the GNU AGPL, see
|
||||
<http://www.gnu.org/licenses/>.
|
44
Makefile
Normal file
44
Makefile
Normal file
|
@ -0,0 +1,44 @@
|
|||
include ./dev/config.env
|
||||
export
|
||||
|
||||
|
||||
.PHONY: pre-commit
|
||||
pre-commit: format entities napi
|
||||
|
||||
.PHONY: format
|
||||
format:
|
||||
pnpm run format
|
||||
|
||||
.PHONY: entities
|
||||
entities:
|
||||
rm --recursive --force ./packages/backend/built
|
||||
pnpm --filter=backend run build:debug
|
||||
pnpm run migrate
|
||||
$(MAKE) -C ./packages/backend-rs regenerate-entities
|
||||
|
||||
.PHONY: napi
|
||||
napi:
|
||||
$(MAKE) -C ./packages/backend-rs update-index
|
||||
|
||||
|
||||
.PHONY: build
|
||||
build:
|
||||
corepack prepare pnpm@latest --activate
|
||||
pnpm install
|
||||
NODE_OPTIONS='--max_old_space_size=3072' pnpm run build:debug
|
||||
pnpm run migrate
|
||||
|
||||
|
||||
.PHONY: db.up db.down db.init
|
||||
db.up:
|
||||
$(MAKE) -C ./dev/db-container up
|
||||
db.down:
|
||||
$(MAKE) -C ./dev/db-container down
|
||||
db.init:
|
||||
$(MAKE) -C ./dev/db-container init
|
||||
|
||||
.PHONY: psql redis-cli
|
||||
psql:
|
||||
$(MAKE) -C ./dev/db-container psql
|
||||
redis-cli:
|
||||
$(MAKE) -C ./dev/db-container redis-cli
|
36
README.md
Normal file
36
README.md
Normal file
|
@ -0,0 +1,36 @@
|
|||
<div align="center">
|
||||
<img src="./title.svg" alt="Firefish logo" style="border-radius:50%" width="400"/>
|
||||
|
||||
**🌎 Firefish is an open source, decentralized social media platform that's free forever! 🚀**
|
||||
|
||||
</div>
|
||||
|
||||
<div>
|
||||
|
||||
<img src="./animated.svg" align="right" height="320px"/>
|
||||
|
||||
Firefish is based off of Misskey, a powerful microblogging server on ActivityPub with features such as emoji reactions, a customizable web UI, rich chatting, and much more!
|
||||
|
||||
</div>
|
||||
|
||||
<div style="clear: both;"></div>
|
||||
|
||||
# Documents
|
||||
|
||||
- [Installation guide](https://firefish.dev/firefish/firefish/-/blob/main/docs/install.md)
|
||||
- [Contributing guide](./CONTRIBUTING.md)
|
||||
- [Changelog](https://firefish.dev/firefish/firefish/-/blob/main/docs/changelog.md)
|
||||
|
||||
# Links
|
||||
|
||||
- Donations: <https://opencollective.com/firefish>
|
||||
- Matrix space: <https://matrix.to/#/#firefish-community:nitro.chat>
|
||||
- Official account: <a href="https://info.firefish.dev/@firefish" rel="me">`@firefish@info.firefish.dev`</a>
|
||||
- Weblate: <https://hosted.weblate.org/engage/firefish/>
|
||||
|
||||
# Want to get involved? Great!
|
||||
|
||||
- If you know how to program in TypeScript, Vue, or Rust, please read the [contributing guide](./CONTRIBUTING.md).
|
||||
- If you have the means to, [donations](https://opencollective.com/firefish) are a great way to keep us going.
|
||||
- If you know a non-English language, translating Firefish on [Weblate](https://hosted.weblate.org/engage/firefish/) help bring Firefish to more people. No technical experience needed!
|
||||
|
5
SECURITY.md
Normal file
5
SECURITY.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
# Reporting Security Issues
|
||||
|
||||
If you discover a security issue, please report it as a confidential issue. You can create a confidential issue by checking the "This issue is confidential and should only be visible to team members with at least Reporter access." checkbox in <https://firefish.dev/firefish/firefish/-/issues/new>.
|
||||
|
||||
Thanks for helping make Firefish safe for everyone.
|
153
animated.svg
Normal file
153
animated.svg
Normal file
|
@ -0,0 +1,153 @@
|
|||
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" viewBox="0 0 1792 1792">
|
||||
|
||||
<style>
|
||||
/* Eyes */
|
||||
@keyframes firefish-logo-blink {
|
||||
95% {
|
||||
transform: scaleY(1);
|
||||
}
|
||||
|
||||
97.5% {
|
||||
transform: scaleY(0);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: scaleY(1);
|
||||
}
|
||||
}
|
||||
|
||||
#firefish-logo-eye-l,
|
||||
#firefish-logo-eye-r {
|
||||
transform-origin: center;
|
||||
transform-box: fill-box;
|
||||
animation-name: firefish-logo-blink;
|
||||
animation-duration: 3s;
|
||||
animation-iteration-count: infinite;
|
||||
animation-timing-function: ease-in-out;
|
||||
}
|
||||
|
||||
/* Bubbles */
|
||||
@keyframes firefish-logo-bloop {
|
||||
0% {
|
||||
transform: translateY(400px);
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
20% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
30% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
80% {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
90% {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: translateY(-400px);
|
||||
}
|
||||
}
|
||||
|
||||
.firefish-logo-bubble {
|
||||
animation-name: firefish-logo-bloop;
|
||||
animation-fill-mode: forwards;
|
||||
animation-iteration-count: infinite;
|
||||
animation-duration: 2s;
|
||||
animation-timing-function: ease-out;
|
||||
fill: #31748f;
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
#firefish-logo-bubble-1 {
|
||||
animation-delay: 0s;
|
||||
}
|
||||
|
||||
#firefish-logo-bubble-2 {
|
||||
animation-delay: .2s;
|
||||
}
|
||||
|
||||
#firefish-logo-bubble-3 {
|
||||
animation-delay: .6s;
|
||||
}
|
||||
|
||||
#firefish-logo-bubble-4 {
|
||||
animation-delay: .8s;
|
||||
}
|
||||
|
||||
#firefish-logo-bubble-5 {
|
||||
animation-delay: 1s;
|
||||
}
|
||||
</style>
|
||||
|
||||
<defs>
|
||||
<linearGradient id="firefish-logo-linear-gradient" x1="26.41" y1="1765.71" x2="1492.49" y2="299.62"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#ec476d" />
|
||||
<stop offset="1" stop-color="#f6ae4a" />
|
||||
</linearGradient>
|
||||
<linearGradient id="firefish-logo-linear-gradient-purple" x1="512" y1="1788" x2="512" y2="1398.68"
|
||||
gradientUnits="userSpaceOnUse">
|
||||
<stop offset="0" stop-color="#db44db" stop-opacity=".3" />
|
||||
<stop offset=".11" stop-color="#db44db" stop-opacity=".21" />
|
||||
<stop offset=".27" stop-color="#db44db" stop-opacity=".12" />
|
||||
<stop offset=".44" stop-color="#db44db" stop-opacity=".05" />
|
||||
<stop offset=".65" stop-color="#db44db" stop-opacity=".01" />
|
||||
<stop offset="1" stop-color="#db44db" stop-opacity="0" />
|
||||
</linearGradient>
|
||||
<linearGradient id="firefish-logo-linear-gradient-3" x1="-351.25" y1="1382.82" x2="1150.74" y2="-119.17"
|
||||
xlink:href="#firefish-logo-linear-gradient" />
|
||||
<linearGradient id="firefish-logo-linear-gradient-4" x1="412.3" y1="2147.8" x2="1915.31" y2="644.8"
|
||||
xlink:href="#firefish-logo-linear-gradient" />
|
||||
<linearGradient id="firefish-logo-linear-gradient-5" x1="28.25" y1="1763.75" x2="1531.25" y2="260.75"
|
||||
xlink:href="#firefish-logo-linear-gradient" />
|
||||
</defs>
|
||||
|
||||
<!-- Bubbles -->
|
||||
<circle id="firefish-logo-bubble-1" class="firefish-logo-bubble" cx="205" cy="500" r="40" />
|
||||
<circle id="firefish-logo-bubble-2" class="firefish-logo-bubble" cx="140" cy="500" r="80" />
|
||||
<circle id="firefish-logo-bubble-3" class="firefish-logo-bubble" cx="95" cy="500" r="70" />
|
||||
<circle id="firefish-logo-bubble-4" class="firefish-logo-bubble" cx="200" cy="500" r="40" />
|
||||
<circle id="firefish-logo-bubble-5" class="firefish-logo-bubble" cx="95" cy="500" r="20" />
|
||||
|
||||
<g id="firefish-logo-firefish">
|
||||
<g id="firefish-logo-fish">
|
||||
<g id="firefish-logo-body">
|
||||
<path
|
||||
d="m928,768.11H96c-53.02,0-96,42.98-96,96v832c0,53.02,42.98,96,96,96h832c53.02,0,96-42.98,96-96v-832c0-53.02-42.98-96-96-96Z"
|
||||
fill="url(#firefish-logo-linear-gradient)" />
|
||||
</g>
|
||||
<g id="firefish-logo-body-purple-grad">
|
||||
<path
|
||||
d="m928,768.11H96C42.98,768.11,0,811.09,0,864.11v832c0,53.02,42.98,96,96,96h832c53.02,0,96-42.98,96-96v-832c0-53.02-42.98-96-96-96Z"
|
||||
fill="url(#firefish-logo-linear-gradient-purple)" />
|
||||
</g>
|
||||
<g id="firefish-logo-fin-l">
|
||||
<path
|
||||
d="m927.66,639.79h-439.94c-52.98,0-95.94-42.95-95.94-95.94V103.91c0-85.47,103.34-128.27,163.77-67.84l439.94,439.94c60.44,60.44,17.63,163.77-67.84,163.77Z"
|
||||
fill="url(#firefish-logo-linear-gradient-3)" />
|
||||
</g>
|
||||
<g id="firefish-logo-fin-b">
|
||||
<path
|
||||
d="m1694.66,1408.11h-445.51c-53.65,0-97.15-43.5-97.15-97.15v-445.51c0-86.55,104.64-129.9,165.84-68.7l445.51,445.51c61.2,61.2,17.86,165.84-68.7,165.84Z"
|
||||
fill="url(#firefish-logo-linear-gradient-4)" />
|
||||
</g>
|
||||
<g id="firefish-logo-fin-r">
|
||||
<path
|
||||
d="m1694.66,640h-445.51c-53.65,0-97.15-43.5-97.15-97.15V97.34c0-86.55,104.64-129.9,165.84-68.7l445.51,445.51c61.2,61.2,17.86,165.84-68.7,165.84Z"
|
||||
fill="url(#firefish-logo-linear-gradient-5)" />
|
||||
</g>
|
||||
<g id="firefish-logo-eye-l">
|
||||
<circle cx="256" cy="1408.11" r="128" fill="#fff" />
|
||||
</g>
|
||||
<g id="firefish-logo-eye-r">
|
||||
<circle cx="576" cy="1408.11" r="128" fill="#fff" />
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
After Width: | Height: | Size: 4.9 KiB |
416
biome.json
Normal file
416
biome.json
Normal file
|
@ -0,0 +1,416 @@
|
|||
{
|
||||
"$schema": "https://biomejs.dev/schemas/1.8.2/schema.json",
|
||||
"organizeImports": { "enabled": false },
|
||||
"linter": {
|
||||
"enabled": true,
|
||||
"rules": {
|
||||
"recommended": false,
|
||||
"complexity": {
|
||||
"noBannedTypes": "error",
|
||||
"noExtraBooleanCast": "error",
|
||||
"noMultipleSpacesInRegularExpressionLiterals": "error",
|
||||
"noUselessCatch": "error",
|
||||
"noUselessConstructor": "off",
|
||||
"noUselessLoneBlockStatements": "error",
|
||||
"noUselessRename": "error",
|
||||
"noUselessTernary": "error",
|
||||
"noUselessThisAlias": "error",
|
||||
"noUselessTypeConstraint": "error",
|
||||
"noVoid": "error",
|
||||
"noWith": "error",
|
||||
"useLiteralKeys": "error",
|
||||
"useRegexLiterals": "error"
|
||||
},
|
||||
"correctness": {
|
||||
"noConstAssign": "error",
|
||||
"noConstantCondition": "error",
|
||||
"noEmptyCharacterClassInRegex": "error",
|
||||
"noEmptyPattern": "error",
|
||||
"noGlobalObjectCalls": "error",
|
||||
"noInvalidConstructorSuper": "error",
|
||||
"noInvalidUseBeforeDeclaration": "error",
|
||||
"noNewSymbol": "error",
|
||||
"noPrecisionLoss": "error",
|
||||
"noSelfAssign": "error",
|
||||
"noSwitchDeclarations": "error",
|
||||
"noUndeclaredVariables": "error",
|
||||
"noUnreachable": "error",
|
||||
"noUnreachableSuper": "error",
|
||||
"noUnsafeFinally": "error",
|
||||
"noUnusedVariables": "off",
|
||||
"useArrayLiterals": "off",
|
||||
"useIsNan": "error"
|
||||
},
|
||||
"security": { "noGlobalEval": "error" },
|
||||
"style": {
|
||||
"noCommaOperator": "error",
|
||||
"noInferrableTypes": "error",
|
||||
"noNonNullAssertion": "warn",
|
||||
"noUselessElse": "off",
|
||||
"noVar": "error",
|
||||
"useAsConstAssertion": "error",
|
||||
"useBlockStatements": "off",
|
||||
"useConst": "error",
|
||||
"useImportType": "error",
|
||||
"useSingleVarDeclarator": "warn"
|
||||
},
|
||||
"suspicious": {
|
||||
"noAssignInExpressions": "error",
|
||||
"noAsyncPromiseExecutor": "error",
|
||||
"noCatchAssign": "error",
|
||||
"noClassAssign": "error",
|
||||
"noCompareNegZero": "error",
|
||||
"noConfusingLabels": "off",
|
||||
"noConsoleLog": "warn",
|
||||
"noControlCharactersInRegex": "error",
|
||||
"noDebugger": "warn",
|
||||
"noDoubleEquals": "error",
|
||||
"noDuplicateCase": "error",
|
||||
"noDuplicateClassMembers": "error",
|
||||
"noDuplicateObjectKeys": "error",
|
||||
"noDuplicateParameters": "error",
|
||||
"noEmptyBlockStatements": "error",
|
||||
"noEmptyInterface": "error",
|
||||
"noExplicitAny": "warn",
|
||||
"noExtraNonNullAssertion": "error",
|
||||
"noFallthroughSwitchClause": "error",
|
||||
"noFunctionAssign": "error",
|
||||
"noGlobalAssign": "error",
|
||||
"noImportAssign": "error",
|
||||
"noMisleadingCharacterClass": "error",
|
||||
"noMisleadingInstantiator": "error",
|
||||
"noPrototypeBuiltins": "off",
|
||||
"noRedeclare": "error",
|
||||
"noSelfCompare": "error",
|
||||
"noShadowRestrictedNames": "error",
|
||||
"noUnsafeNegation": "error",
|
||||
"useAwait": "off",
|
||||
"useDefaultSwitchClauseLast": "error",
|
||||
"useNamespaceKeyword": "error",
|
||||
"useValidTypeof": "error"
|
||||
}
|
||||
},
|
||||
"ignore": [
|
||||
"**/*.json5",
|
||||
"**/*.min.*",
|
||||
"**/dist",
|
||||
"**/LICENSE*",
|
||||
"**/output",
|
||||
"**/coverage",
|
||||
"**/public",
|
||||
"**/temp",
|
||||
"**/packages-lock.json",
|
||||
"**/pnpm-lock.yaml",
|
||||
"**/yarn.lock",
|
||||
"**/__snapshots__"
|
||||
]
|
||||
},
|
||||
"javascript": {
|
||||
"globals": [
|
||||
"jest",
|
||||
"withDefaults",
|
||||
"$computed",
|
||||
"$shallowRef",
|
||||
"defineExpose",
|
||||
"$toRef",
|
||||
"h",
|
||||
"$customRef",
|
||||
"navigator",
|
||||
"window",
|
||||
"defineEmits",
|
||||
"$ref",
|
||||
"defineProps",
|
||||
"document"
|
||||
]
|
||||
},
|
||||
"overrides": [
|
||||
{
|
||||
"include": ["**/__tests__/*.{j,t}s?(x)", "**/*.spec.{j,t}s?(x)"],
|
||||
"linter": { "rules": { "suspicious": { "noConsoleLog": "off" } } }
|
||||
},
|
||||
{
|
||||
"include": ["*.vue"],
|
||||
"linter": { "rules": { "correctness": { "noUnusedVariables": "off" } } }
|
||||
},
|
||||
{
|
||||
"include": ["**/__tests__/*.{j,t}s?(x)", "**/*.spec.{j,t}s?(x)"],
|
||||
"linter": { "rules": { "suspicious": { "noConsoleLog": "off" } } }
|
||||
},
|
||||
{ "include": ["*.vue"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.json", "*.json5"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.yaml", "*.yml"], "linter": { "rules": {} } },
|
||||
{ "include": ["package.json"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.d.ts"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.js"] },
|
||||
{
|
||||
"include": ["scripts/**/*.*", "cli.*"],
|
||||
"linter": { "rules": { "suspicious": { "noConsoleLog": "off" } } }
|
||||
},
|
||||
{
|
||||
"include": ["*.test.ts", "*.test.js", "*.spec.ts", "*.spec.js"],
|
||||
"linter": { "rules": {} }
|
||||
},
|
||||
{
|
||||
"include": ["**/*.md/*.*"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnusedVariables": "off"
|
||||
},
|
||||
"suspicious": { "noConsoleLog": "off" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "include": ["*.js"], "linter": { "rules": {} } },
|
||||
{
|
||||
"include": ["**/*.md/*.*"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noInvalidUseBeforeDeclaration": "off",
|
||||
"noUnusedVariables": "off"
|
||||
},
|
||||
"suspicious": { "noRedeclare": "off" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "include": ["*.json", "*.json5"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.yaml", "*.yml"], "linter": { "rules": {} } },
|
||||
{ "include": ["package.json"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.d.ts"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.js"] },
|
||||
{
|
||||
"include": ["scripts/**/*.*", "cli.*"],
|
||||
"linter": { "rules": { "suspicious": { "noConsoleLog": "off" } } }
|
||||
},
|
||||
{
|
||||
"include": ["*.test.ts", "*.test.js", "*.spec.ts", "*.spec.js"],
|
||||
"linter": { "rules": {} }
|
||||
},
|
||||
{
|
||||
"include": ["**/*.md/*.*"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnusedVariables": "off"
|
||||
},
|
||||
"suspicious": { "noConsoleLog": "off" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "include": ["*.js"], "linter": { "rules": {} } },
|
||||
{
|
||||
"include": ["**/*.md/*.*"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noInvalidUseBeforeDeclaration": "off",
|
||||
"noUnusedVariables": "off"
|
||||
},
|
||||
"suspicious": { "noRedeclare": "off" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"include": ["*.ts", "*.tsx", "*.mts", "*.cts"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noConstAssign": "off",
|
||||
"noGlobalObjectCalls": "off",
|
||||
"noInvalidConstructorSuper": "off",
|
||||
"noNewSymbol": "off",
|
||||
"noSetterReturn": "off",
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnreachable": "off",
|
||||
"noUnreachableSuper": "off"
|
||||
},
|
||||
"style": {
|
||||
"noArguments": "error",
|
||||
"noVar": "error",
|
||||
"useConst": "error"
|
||||
},
|
||||
"suspicious": {
|
||||
"noDuplicateClassMembers": "off",
|
||||
"noDuplicateObjectKeys": "off",
|
||||
"noDuplicateParameters": "off",
|
||||
"noFunctionAssign": "off",
|
||||
"noImportAssign": "off",
|
||||
"noRedeclare": "off",
|
||||
"noUnsafeNegation": "off",
|
||||
"useGetterReturn": "off",
|
||||
"useValidTypeof": "off"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "include": ["*.json", "*.json5"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.yaml", "*.yml"], "linter": { "rules": {} } },
|
||||
{ "include": ["package.json"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.d.ts"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.js"], "linter": { "rules": {} } },
|
||||
{
|
||||
"include": ["*.ts", "*.tsx", "*.mts", "*.cts"],
|
||||
"linter": { "rules": { "complexity": { "noVoid": "error" } } }
|
||||
},
|
||||
{
|
||||
"include": ["script/**/*.*", "scripts/**/*.*", "cli.*"],
|
||||
"linter": { "rules": { "suspicious": { "noConsoleLog": "off" } } }
|
||||
},
|
||||
{
|
||||
"include": ["*.test.ts", "*.test.js", "*.spec.ts", "*.spec.js"],
|
||||
"linter": { "rules": {} }
|
||||
},
|
||||
{
|
||||
"include": ["**/*.md/*.*"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noInvalidUseBeforeDeclaration": "off",
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnusedVariables": "off"
|
||||
},
|
||||
"style": { "useImportType": "off" },
|
||||
"suspicious": { "noConsoleLog": "off", "noRedeclare": "off" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "include": ["*.json", "*.json5"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.yaml", "*.yml"], "linter": { "rules": {} } },
|
||||
{ "include": ["package.json"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.d.ts"], "linter": { "rules": {} } },
|
||||
{ "include": ["*.js"], "linter": { "rules": {} } },
|
||||
{
|
||||
"include": ["*.ts", "*.tsx", "*.mts", "*.cts"],
|
||||
"linter": { "rules": { "complexity": { "noVoid": "error" } } }
|
||||
},
|
||||
{
|
||||
"include": ["script/**/*.*", "scripts/**/*.*", "cli.*"],
|
||||
"linter": { "rules": { "suspicious": { "noConsoleLog": "off" } } }
|
||||
},
|
||||
{
|
||||
"include": ["*.test.ts", "*.test.js", "*.spec.ts", "*.spec.js"],
|
||||
"linter": { "rules": {} }
|
||||
},
|
||||
{
|
||||
"include": ["**/*.md/*.*"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noInvalidUseBeforeDeclaration": "off",
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnusedVariables": "off"
|
||||
},
|
||||
"style": { "useImportType": "off" },
|
||||
"suspicious": { "noConsoleLog": "off", "noRedeclare": "off" }
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "include": ["*.md"] },
|
||||
{
|
||||
"include": ["**/*.md/**"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnusedVariables": "off"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"include": ["*.ts", "*.tsx", "*.mts", "*.cts"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noConstAssign": "off",
|
||||
"noGlobalObjectCalls": "off",
|
||||
"noInvalidConstructorSuper": "off",
|
||||
"noNewSymbol": "off",
|
||||
"noSetterReturn": "off",
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnreachable": "off",
|
||||
"noUnreachableSuper": "off"
|
||||
},
|
||||
"style": {
|
||||
"noArguments": "error",
|
||||
"noVar": "error",
|
||||
"useConst": "error"
|
||||
},
|
||||
"suspicious": {
|
||||
"noDuplicateClassMembers": "off",
|
||||
"noDuplicateObjectKeys": "off",
|
||||
"noDuplicateParameters": "off",
|
||||
"noFunctionAssign": "off",
|
||||
"noImportAssign": "off",
|
||||
"noRedeclare": "off",
|
||||
"noUnsafeNegation": "off",
|
||||
"useGetterReturn": "off",
|
||||
"useValidTypeof": "off"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{ "include": ["*.md"] },
|
||||
{
|
||||
"include": ["**/*.md/**"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnusedVariables": "off"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"include": ["*.ts", "*.tsx", "*.mts", "*.cts"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"correctness": {
|
||||
"noConstAssign": "off",
|
||||
"noGlobalObjectCalls": "off",
|
||||
"noInvalidConstructorSuper": "off",
|
||||
"noNewSymbol": "off",
|
||||
"noSetterReturn": "off",
|
||||
"noUndeclaredVariables": "off",
|
||||
"noUnreachable": "off",
|
||||
"noUnreachableSuper": "off"
|
||||
},
|
||||
"style": {
|
||||
"noArguments": "error",
|
||||
"noVar": "error",
|
||||
"useConst": "error"
|
||||
},
|
||||
"suspicious": {
|
||||
"noDuplicateClassMembers": "off",
|
||||
"noDuplicateObjectKeys": "off",
|
||||
"noDuplicateParameters": "off",
|
||||
"noFunctionAssign": "off",
|
||||
"noImportAssign": "off",
|
||||
"noRedeclare": "off",
|
||||
"noUnsafeNegation": "off",
|
||||
"useGetterReturn": "off",
|
||||
"useValidTypeof": "off"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"include": ["packages/backend/src/server/api/mastodon/**/*.ts"],
|
||||
"linter": {
|
||||
"rules": {
|
||||
"style": {
|
||||
"noParameterAssign": "off"
|
||||
},
|
||||
"complexity": {
|
||||
"noStaticOnlyClass": "off",
|
||||
"noThisInStatic": "off"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
2
ci/.gitignore
vendored
Normal file
2
ci/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
target-msrv/
|
||||
target-miri/
|
3
ci/cargo/config.toml
Normal file
3
ci/cargo/config.toml
Normal file
|
@ -0,0 +1,3 @@
|
|||
[target.x86_64-unknown-linux-gnu]
|
||||
linker = "/usr/bin/clang"
|
||||
rustflags = ["-C", "link-arg=--ld-path=/usr/bin/mold"]
|
13
custom/LICENSE
Normal file
13
custom/LICENSE
Normal file
|
@ -0,0 +1,13 @@
|
|||
Copyright 2023 Firefish
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
BIN
custom/assets/badges/error.webp
Normal file
BIN
custom/assets/badges/error.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 41 KiB |
BIN
custom/assets/badges/info.webp
Normal file
BIN
custom/assets/badges/info.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 35 KiB |
BIN
custom/assets/badges/not-found.webp
Normal file
BIN
custom/assets/badges/not-found.webp
Normal file
Binary file not shown.
After Width: | Height: | Size: 33 KiB |
7
custom/assets/instance.css
Normal file
7
custom/assets/instance.css
Normal file
|
@ -0,0 +1,7 @@
|
|||
/*
|
||||
* !!! WARNING !!!
|
||||
* Editing this file may cause your instance to break for EVERYONE.
|
||||
* Please know what you're doing and test it out with regular user custom CSS.
|
||||
* With that said, GLHF!
|
||||
* This may eventuallly be replaced with a function in the admin panel.
|
||||
*/
|
14
custom/assets/robots.txt
Normal file
14
custom/assets/robots.txt
Normal file
|
@ -0,0 +1,14 @@
|
|||
User-agent: *
|
||||
Allow: /
|
||||
|
||||
# Uncomment the following to block CommonCrawl
|
||||
#
|
||||
# User-agent: CCBot
|
||||
# User-agent: CCBot/2.0
|
||||
# User-agent: CCBot/3.1
|
||||
# Disallow: /
|
||||
|
||||
# Uncomment the following to block ChatGPT
|
||||
#
|
||||
# User-agent: GPTBot
|
||||
# Disallow: /
|
0
custom/locales/.gitkeep
Normal file
0
custom/locales/.gitkeep
Normal file
4
dev/config.example.env
Normal file
4
dev/config.example.env
Normal file
|
@ -0,0 +1,4 @@
|
|||
COMPOSE='podman-compose'
|
||||
POSTGRES_PASSWORD=password
|
||||
POSTGRES_USER=firefish
|
||||
POSTGRES_DB=firefish_db
|
49
dev/container/docker-compose.yml
Normal file
49
dev/container/docker-compose.yml
Normal file
|
@ -0,0 +1,49 @@
|
|||
version: "3"
|
||||
|
||||
services:
|
||||
web:
|
||||
image: docker.io/node:18.19.0-bookworm
|
||||
container_name: firefish_web
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
- db
|
||||
- redis
|
||||
ports:
|
||||
- "3030:3030"
|
||||
networks:
|
||||
- firefishnet
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
PGPASSWORD: password
|
||||
URL: http://localhost:3030
|
||||
volumes:
|
||||
- ./firefish:/firefish:rw
|
||||
- ./docker-entrypoint.sh:/docker-entrypoint.sh:ro
|
||||
entrypoint: /docker-entrypoint.sh
|
||||
|
||||
redis:
|
||||
restart: unless-stopped
|
||||
image: docker.io/redis:7.0-alpine
|
||||
container_name: firefish_redis
|
||||
networks:
|
||||
- firefishnet
|
||||
ports:
|
||||
- "26379:6379"
|
||||
volumes:
|
||||
- ./redis:/data
|
||||
|
||||
db:
|
||||
restart: unless-stopped
|
||||
image: docker.io/groonga/pgroonga:3.1.8-alpine-12
|
||||
container_name: firefish_db
|
||||
networks:
|
||||
- firefishnet
|
||||
env_file:
|
||||
- ../config.env
|
||||
ports:
|
||||
- "25432:5432"
|
||||
volumes:
|
||||
- ./db:/var/lib/postgresql/data
|
||||
|
||||
networks:
|
||||
firefishnet:
|
65
dev/container/docker-entrypoint.sh
Executable file
65
dev/container/docker-entrypoint.sh
Executable file
|
@ -0,0 +1,65 @@
|
|||
#!/bin/sh
|
||||
|
||||
set -xeu
|
||||
node --version
|
||||
|
||||
# Check Environment Initialized Flag
|
||||
if [ ! -f '/.firefish_env_initialized' ]; then
|
||||
|
||||
# Install entrypoint dependencies
|
||||
apt-get update
|
||||
DEBIAN_FRONTEND='noninteractive' apt-get install -y --no-install-recommends wget curl ca-certificates lsb-release gnupg
|
||||
|
||||
# Create the PostgreSQL file repository configuration
|
||||
sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
|
||||
|
||||
# Import the PostgreSQL repository signing key
|
||||
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | apt-key add -
|
||||
|
||||
# Install compilation dependencies
|
||||
apt-get update
|
||||
DEBIAN_FRONTEND='noninteractive' apt-get install -y --no-install-recommends build-essential python3 ffmpeg git postgresql-client-12
|
||||
curl -vvv --proto '=https' --tlsv1.2 --show-error --fail https://sh.rustup.rs | sh -s -- -y
|
||||
|
||||
# Add Cargo PATH
|
||||
PATH="/root/.cargo/bin:${PATH}"
|
||||
|
||||
# If Firefish not exist
|
||||
if [ ! -f '/firefish/README.md' ]; then
|
||||
|
||||
# Clone Firefish
|
||||
cd /
|
||||
git clone -v https://firefish.dev/firefish/firefish.git
|
||||
|
||||
# Configuring a new server
|
||||
cd /firefish
|
||||
cp .config/devenv.yml .config/default.yml
|
||||
|
||||
URL="$(echo "${URL}" | sed 's#/#\\/#g')"
|
||||
sed -i'.bak' "s/http:\/\/localhost:3030/${URL}/" .config/default.yml
|
||||
|
||||
fi
|
||||
|
||||
# Configure postgres, add pgroonga search
|
||||
psql --user=firefish --host=firefish_db --dbname=firefish_db --command='CREATE EXTENSION IF NOT EXISTS pgroonga;'
|
||||
|
||||
# Configure pnpm, and install dev mode dependencies for compilation
|
||||
cd /firefish
|
||||
corepack enable
|
||||
corepack prepare pnpm@latest --activate
|
||||
pnpm install --prod false
|
||||
|
||||
fi
|
||||
|
||||
# Add Environment Initialized Flag
|
||||
touch /.firefish_env_initialized
|
||||
|
||||
# Add Cargo PATH
|
||||
PATH="/root/.cargo/bin:${PATH}"
|
||||
|
||||
# Start a new server
|
||||
cd /firefish
|
||||
pnpm install --prod false
|
||||
pnpm run build:debug
|
||||
pnpm run migrate
|
||||
pnpm run start
|
14
dev/db-container/Makefile
Normal file
14
dev/db-container/Makefile
Normal file
|
@ -0,0 +1,14 @@
|
|||
.PHONY: up down init
|
||||
up:
|
||||
$(COMPOSE) up --detach
|
||||
down:
|
||||
$(COMPOSE) down
|
||||
init:
|
||||
$(COMPOSE) down --volumes
|
||||
$(COMPOSE) up --detach
|
||||
|
||||
.PHONY: psql redis-cli
|
||||
psql:
|
||||
$(COMPOSE) exec db psql --user=$(POSTGRES_USER) --dbname=$(POSTGRES_DB)
|
||||
redis-cli:
|
||||
$(COMPOSE) exec redis redis-cli
|
24
dev/db-container/docker-compose.yml
Normal file
24
dev/db-container/docker-compose.yml
Normal file
|
@ -0,0 +1,24 @@
|
|||
version: "3"
|
||||
|
||||
services:
|
||||
redis:
|
||||
image: docker.io/redis:7-alpine
|
||||
ports:
|
||||
- "26379:6379"
|
||||
volumes:
|
||||
- "redis-data:/data"
|
||||
db:
|
||||
image: docker.io/groonga/pgroonga:3.1.8-alpine-12
|
||||
env_file:
|
||||
- ../config.env
|
||||
ports:
|
||||
- "25432:5432"
|
||||
volumes:
|
||||
- "./install.sql:/docker-entrypoint-initdb.d/install.sql:ro"
|
||||
- "postgres-data:/var/lib/postgresql/data"
|
||||
|
||||
volumes:
|
||||
redis-data:
|
||||
name: redis-data
|
||||
postgres-data:
|
||||
name: postgres-data
|
1
dev/db-container/install.sql
Normal file
1
dev/db-container/install.sql
Normal file
|
@ -0,0 +1 @@
|
|||
CREATE EXTENSION pgroonga;
|
34
dev/docs/container.md
Normal file
34
dev/docs/container.md
Normal file
|
@ -0,0 +1,34 @@
|
|||
# Set up a fully-containerized development environment
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Container runtime installation
|
||||
- [Docker](https://docs.docker.com/get-docker/)
|
||||
- [Podman](https://podman.io/docs/installation) and [Podman Compose](https://github.com/containers/podman-compose)
|
||||
- [containerd](https://github.com/containerd/containerd) and [nerdctl](https://github.com/containerd/nerdctl)
|
||||
- or whatever you want to use
|
||||
- The following ports are not in use
|
||||
- 3030
|
||||
- 25432
|
||||
- 26379
|
||||
|
||||
## Start up the environment
|
||||
|
||||
1. Download the [`dev/container` directory](./dev/container) and execute `chmod +x docker-entrypoint.sh`
|
||||
- Alternatively, you can use `git clone https://firefish.dev/firefish/firefish.git && cd firefish/dev/container`, although this will clone the entire repository.
|
||||
1. Copy the example config file
|
||||
```sh
|
||||
cp config.example.env config.env
|
||||
```
|
||||
1. Edit `docker-compose.yml` and set `URL` to the URL you want to use (or leave it as `http://localhost:3030`)
|
||||
1. Run `docker compose up`
|
||||
- This will build the environment, install dependencies and prepare the needed config files.
|
||||
- If you use Podman, you should run `podman-compose up` instead.
|
||||
1. Wait until the following message shows up
|
||||
```log
|
||||
DONE * [core boot] All workers started
|
||||
DONE * [core boot] Now listening on port 3030 on https://your_firefish_url.example.com
|
||||
```
|
||||
1. A fresh Firefish environment is created on the URL you have set!
|
||||
|
||||
When you want to restart the dev server, you just need to terminate the process (a.k.a. press `Ctrl+C`) and run `docker compose up` again.
|
105
dev/docs/db-container.md
Normal file
105
dev/docs/db-container.md
Normal file
|
@ -0,0 +1,105 @@
|
|||
# Set up database containers and run Firefish locally
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Dependencies
|
||||
- git
|
||||
- Node.js
|
||||
- pnpm
|
||||
- Rust toolchain and [cargo-nextest](https://nexte.st/)
|
||||
- Python 3
|
||||
- Perl
|
||||
- FFmpeg
|
||||
- Container runtime
|
||||
- [Docker](https://docs.docker.com/get-docker/)
|
||||
- [Podman](https://podman.io/docs/installation) and [Podman Compose](https://github.com/containers/podman-compose)
|
||||
- [containerd](https://github.com/containerd/containerd) and [nerdctl](https://github.com/containerd/nerdctl)
|
||||
- or whatever you want to use
|
||||
- GNU Make
|
||||
- The following ports are not in use
|
||||
- 25432
|
||||
- 26379
|
||||
|
||||
You can refer to [local-installation.md](./local-installation.md) to install the dependencies.
|
||||
|
||||
## Configure the environment
|
||||
|
||||
1. Fork the Firefish repository on GitLab
|
||||
1. Clone your Firefish repository
|
||||
```sh
|
||||
git clone https://firefish.dev/your-user-name/firefish.git
|
||||
cd firefish
|
||||
```
|
||||
1. Copy example config file
|
||||
```sh
|
||||
cp dev/config.example.env dev/config.env
|
||||
# If you use container runtime other than Podman, you need to modify the "COMPOSE" variable
|
||||
# vim dev/config.env
|
||||
```
|
||||
1. Create `.config/default.yml` with the following content
|
||||
```yaml
|
||||
# You can change the port if 3000 is already used
|
||||
url: http://localhost:3000
|
||||
port: 3000
|
||||
|
||||
db:
|
||||
host: localhost
|
||||
port: 25432
|
||||
db: firefish_db
|
||||
user: firefish
|
||||
pass: password
|
||||
|
||||
redis:
|
||||
host: localhost
|
||||
port: 26379
|
||||
|
||||
maxlogLevel: 'debug' # or 'trace'
|
||||
```
|
||||
1. Start database containers
|
||||
```sh
|
||||
make db.up
|
||||
```
|
||||
|
||||
## Build and start Firefish
|
||||
|
||||
1. Build Firefish
|
||||
```sh
|
||||
pnpm install
|
||||
pnpm run build:debug
|
||||
```
|
||||
1. Execute database migrations
|
||||
```sh
|
||||
pnpm run migrate
|
||||
```
|
||||
1. Start Firefish
|
||||
```sh
|
||||
pnpm run start
|
||||
```
|
||||
You can access to the local Firefish server on http://localhost:3000 after this message shows up!
|
||||
```
|
||||
DONE * [core boot] All workers started
|
||||
DONE * [core boot] Now listening on port 3000 on http://localhost:3000
|
||||
```
|
||||
|
||||
## Update auto-generated files in `package/backend-rs`
|
||||
|
||||
You need to install `sea-orm-cli` to regenerate database entities.
|
||||
|
||||
```sh
|
||||
cargo install sea-orm-cli
|
||||
```
|
||||
|
||||
```sh
|
||||
make entities
|
||||
make napi
|
||||
```
|
||||
|
||||
## Reset the environment
|
||||
|
||||
You can recreate a fresh local Firefish environment by recreating the database containers:
|
||||
|
||||
```sh
|
||||
make db.init
|
||||
pnpm run migrate
|
||||
pnpm run start
|
||||
```
|
182
dev/docs/local-installation.md
Normal file
182
dev/docs/local-installation.md
Normal file
|
@ -0,0 +1,182 @@
|
|||
# Set up a development environment by installing all dependencies locally
|
||||
|
||||
This document demonstrates an example procedure to set up a Firefish development environment on Debian 12. You can refer to this document if you prefer to install all dependencies (Node.js, PostgreSQL, Redis, etc.) locally.
|
||||
|
||||
Make sure that you can use the `sudo` command before proceeding.
|
||||
|
||||
## 1. Install dependencies
|
||||
|
||||
### Utilities
|
||||
|
||||
```sh
|
||||
sudo apt update
|
||||
sudo apt install build-essential python3 curl wget git lsb-release
|
||||
```
|
||||
|
||||
### Node.js
|
||||
|
||||
Firefish requires Node.js v18.19.0 or later. While you can choose any versions between v18.19.0 and the latest version (v22.2.0 as of writing), we recommend that you install v18.x so as not to use new features inadvertently and introduce incompatibility issues.
|
||||
|
||||
Instructions can be found at [this repository](https://github.com/nodesource/distributions).
|
||||
|
||||
```sh
|
||||
NODE_MAJOR=18
|
||||
curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | sudo -E bash -
|
||||
sudo apt install nodejs
|
||||
|
||||
# check version
|
||||
node --version
|
||||
```
|
||||
|
||||
### Rust toolchain
|
||||
|
||||
Instructions can be found at [this page](https://www.rust-lang.org/tools/install).
|
||||
|
||||
```sh
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||
. "${HOME}/.cargo/env"
|
||||
|
||||
# check version
|
||||
cargo --version
|
||||
```
|
||||
|
||||
### Cargo nextest
|
||||
|
||||
Instructions can be found at [this page](https://nexte.st/book/pre-built-binaries).
|
||||
|
||||
```sh
|
||||
curl -LsSf https://get.nexte.st/latest/linux | tar zxf - -C ${CARGO_HOME:-~/.cargo}/bin
|
||||
```
|
||||
|
||||
### PostgreSQL and PGroonga
|
||||
|
||||
Firefish requires PostgreSQL v12 or later. We recommend that you install v12.x for the same reason as Node.js.
|
||||
|
||||
PostgreSQL install instructions can be found at [this page](https://www.postgresql.org/download/).
|
||||
|
||||
```sh
|
||||
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
|
||||
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
|
||||
sudo apt update
|
||||
sudo apt install postgresql-12
|
||||
|
||||
sudo systemctl enable --now postgresql
|
||||
|
||||
# check version
|
||||
psql --version
|
||||
```
|
||||
|
||||
PGroonga install instructions can be found at [this page](https://pgroonga.github.io/install/).
|
||||
|
||||
```sh
|
||||
wget "https://apache.jfrog.io/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
sudo apt install "./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
wget "https://packages.groonga.org/debian/groonga-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
sudo apt install "./groonga-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
sudo apt update
|
||||
sudo apt install postgresql-12-pgdg-pgroonga
|
||||
|
||||
rm "apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb" "groonga-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
```
|
||||
|
||||
### Redis
|
||||
|
||||
Instructions can be found at [this page](https://redis.io/docs/install/install-redis/).
|
||||
|
||||
```sh
|
||||
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
|
||||
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
|
||||
sudo apt update
|
||||
sudo apt install redis
|
||||
|
||||
sudo systemctl enable --now redis-server
|
||||
|
||||
# check version
|
||||
redis-cli --version
|
||||
```
|
||||
|
||||
### FFmpeg
|
||||
|
||||
```sh
|
||||
sudo apt install ffmpeg
|
||||
```
|
||||
|
||||
## 2. Set up a database
|
||||
|
||||
1. Create a database user
|
||||
```sh
|
||||
sudo -u postgres createuser --no-createdb --no-createrole --no-superuser --encrypted --pwprompt firefish
|
||||
```
|
||||
If you forgot the password you typed, you can reset it by executing `sudo -u postgres psql -c "ALTER USER firefish PASSWORD 'password';"`.
|
||||
2. Create a database
|
||||
```sh
|
||||
sudo -u postgres createdb --encoding='UTF8' --owner=firefish firefish_db
|
||||
```
|
||||
3. Enable PGronnga extension
|
||||
```sh
|
||||
sudo -u postgres psql --command='CREATE EXTENSION pgroonga;' --dbname=firefish_db
|
||||
```
|
||||
|
||||
## 3. Configure Firefish
|
||||
|
||||
1. Fork the Firefish repository on GitLab
|
||||
1. Clone your Firefish repository
|
||||
```sh
|
||||
git clone https://firefish.dev/your-user-name/firefish.git
|
||||
```
|
||||
1. Copy the example database config file
|
||||
```sh
|
||||
cp dev/config.example.env dev/config.env
|
||||
```
|
||||
1. Create a config file for Firefish
|
||||
```sh
|
||||
cd firefish
|
||||
vim .config/default.yml
|
||||
```
|
||||
|
||||
```yaml
|
||||
url: http://localhost:3000
|
||||
port: 3000
|
||||
|
||||
db:
|
||||
host: localhost
|
||||
port: 5432
|
||||
db: firefish_db
|
||||
user: firefish
|
||||
pass: password
|
||||
|
||||
redis:
|
||||
host: localhost
|
||||
port: 6379
|
||||
|
||||
maxLogLevel: 'debug' # or 'trace'
|
||||
```
|
||||
|
||||
## 4. Build and start Firefish
|
||||
|
||||
1. Install pnpm
|
||||
```sh
|
||||
sudo corepack enable
|
||||
corepack prepare pnpm@latest --activate
|
||||
|
||||
# check version
|
||||
pnpm --version
|
||||
```
|
||||
1. Build
|
||||
```sh
|
||||
pnpm install
|
||||
pnpm run build:debug
|
||||
```
|
||||
1. Execute database migrations
|
||||
```sh
|
||||
pnpm run migrate
|
||||
```
|
||||
1. Start Firefish
|
||||
```sh
|
||||
pnpm run start
|
||||
```
|
||||
You can access to the local Firefish server on http://localhost:3000 after this message shows up!
|
||||
```
|
||||
DONE * [core boot] All workers started
|
||||
DONE * [core boot] Now listening on port 3000 on http://localhost:3000
|
||||
```
|
77
docker-compose.example.yml
Normal file
77
docker-compose.example.yml
Normal file
|
@ -0,0 +1,77 @@
|
|||
version: "3"
|
||||
|
||||
services:
|
||||
web:
|
||||
image: registry.firefish.dev/firefish/firefish:latest
|
||||
container_name: firefish_web
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
redis:
|
||||
condition: service_healthy
|
||||
ports:
|
||||
- "3000:3000"
|
||||
networks:
|
||||
- calcnet
|
||||
# - web
|
||||
environment:
|
||||
NODE_ENV: production
|
||||
NODE_OPTIONS: --max-old-space-size=3072
|
||||
volumes:
|
||||
- ./custom:/firefish/custom:ro
|
||||
- ./files:/firefish/files
|
||||
- ./.config:/firefish/.config:ro
|
||||
healthcheck:
|
||||
test: curl -f http://localhost:3000 || exit 1
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
# deploy:
|
||||
# resources:
|
||||
# limits:
|
||||
# memory: 2048M
|
||||
|
||||
redis:
|
||||
restart: unless-stopped
|
||||
image: docker.io/redis:7.0-alpine
|
||||
container_name: firefish_redis
|
||||
networks:
|
||||
- calcnet
|
||||
volumes:
|
||||
- ./redis:/data
|
||||
healthcheck:
|
||||
test: redis-cli ping
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
# deploy:
|
||||
# resources:
|
||||
# limits:
|
||||
# memory: 256M
|
||||
|
||||
db:
|
||||
restart: unless-stopped
|
||||
image: docker.io/groonga/pgroonga:3.1.8-alpine-16-slim
|
||||
container_name: firefish_db
|
||||
networks:
|
||||
- calcnet
|
||||
env_file:
|
||||
- .config/docker.env
|
||||
volumes:
|
||||
- ./db:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: pg_isready --user="$${POSTGRES_USER}" --dbname="$${POSTGRES_DB}"
|
||||
interval: 5s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
# deploy:
|
||||
# resources:
|
||||
# limits:
|
||||
# memory: 2048M
|
||||
|
||||
networks:
|
||||
calcnet:
|
||||
# web:
|
||||
# external:
|
||||
# name: web
|
10
docs/activitypub-extensions.md
Normal file
10
docs/activitypub-extensions.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
# Firefish's ActivityPub extensions
|
||||
|
||||
These are the extensions to ActivityPub that Firefish implements. This page uses [compact IRIs](https://www.w3.org/TR/json-ld/#dfn-compact-iri). The `firefish` prefix is used to refer to `https://firefish.dev/ns#`.
|
||||
|
||||
## speakAsCat
|
||||
|
||||
- Compact IRI: `firefish:speakAsCat`
|
||||
- Canonical IRI: `https://firefish.dev/ns#speakAsCat`
|
||||
|
||||
Used on actors to indicate that they not only identify as a cat, but also want to have their text be transformed to speak like one, expressed as a boolean value. If this property is set to true, displaying the actor’s posts will make them speak with “nya” instead of “na” and other cat-related text mannerisms. Used in combination with [misskey:isCat](https://misskey-hub.net/ns/#iscat).
|
282
docs/api-change.md
Normal file
282
docs/api-change.md
Normal file
|
@ -0,0 +1,282 @@
|
|||
# Changes to the Firefish API
|
||||
|
||||
Breaking changes are indicated by the :warning: icon.
|
||||
|
||||
## v20240728
|
||||
|
||||
- Added `name`, `category`, `aliases`, `license` optional parameters to `admin/emoji/add` endpoint.
|
||||
- Added `name` optional parameter to `drive/files/upload-from-url` endpoint.
|
||||
|
||||
## v20240725
|
||||
|
||||
- Added `i/export-followers` endpoint.
|
||||
|
||||
## v20240714
|
||||
|
||||
- The old Mastodon API has been replaced with a new implementation based on Iceshrimp’s.
|
||||
- :warning: The new API uses a new format to manage Mastodon sessions in the database, whereas old implementation uses Misskey sessions. All previous client app and token registrations will not work with the new API. All clients need to be re-registered and all users need to re-authenticate.
|
||||
- :warning: All IDs (of statuses/notes, notifications, users, etc.) will be using the alphanumerical format, aligning with the Firefish/Misskey API. The old numerical IDs will not work when queried against the new API.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Available endpoints (under <code>https://instance-domain/api/</code>)</summary>
|
||||
|
||||
| method | endpoint | note |
|
||||
|----------|------------------------------------|--------------------------------------------|
|
||||
| `POST` | `oauth/token` | |
|
||||
| `POST` | `oauth/revoke` | |
|
||||
| `POST` | `v1/apps` | |
|
||||
| `GET` | `v1/apps/verify_credentials` | |
|
||||
| `POST` | `v1/firefish/apps/info` | Firefish extension, uses MiAuth |
|
||||
| `POST` | `v1/firefish/auth/code` | Firefish extension, uses MiAuth |
|
||||
| | | |
|
||||
| `GET` | `v1/accounts/verify_credentials` | |
|
||||
| `PATCH` | `v1/accounts/update_credentials` | |
|
||||
| `GET` | `v1/accounts/lookup` | |
|
||||
| `GET` | `v1/accounts/relationships` | |
|
||||
| `GET` | `v1/accounts/search` | |
|
||||
| `GET` | `v1/accounts/:id` | |
|
||||
| `GET` | `v1/accounts/:id/statuses` | |
|
||||
| `GET` | `v1/accounts/:id/featured_tags` | |
|
||||
| `GET` | `v1/accounts/:id/followers` | |
|
||||
| `GET` | `v1/accounts/:id/following` | |
|
||||
| `GET` | `v1/accounts/:id/lists` | |
|
||||
| `POST` | `v1/accounts/:id/follow` | |
|
||||
| `POST` | `v1/accounts/:id/unfollow` | |
|
||||
| `POST` | `v1/accounts/:id/block` | |
|
||||
| `POST` | `v1/accounts/:id/unblock` | |
|
||||
| `POST` | `v1/accounts/:id/mute` | |
|
||||
| `POST` | `v1/accounts/:id/unmute` | |
|
||||
| | | |
|
||||
| `GET` | `v1/featured_tags` | always returns an empty list |
|
||||
| `GET` | `v1/followed_tags` | always returns an empty list |
|
||||
| `GET` | `v1/bookmarks` | |
|
||||
| `GET` | `v1/favourites` | |
|
||||
| | | |
|
||||
| `GET` | `v1/mutes` | |
|
||||
| `GET` | `v1/blocks` | |
|
||||
| `GET` | `v1/follow_requests` | |
|
||||
| `POST` | `v1/follow_requests/:id/authorize` | |
|
||||
| `POST` | `v1/follow_requests/:id/reject` | |
|
||||
| | | |
|
||||
| `GET` | `v1/filters` | |
|
||||
| `POST` | `v1/filters` | |
|
||||
| `GET` | `v2/filters` | |
|
||||
| `POST` | `v2/filters` | |
|
||||
| | | |
|
||||
| `GET` | `v1/lists` | |
|
||||
| `POST` | `v1/lists` | |
|
||||
| `GET` | `v1/lists/:id` | |
|
||||
| `PUT` | `v1/lists/:id` | |
|
||||
| `DELETE` | `v1/lists/:id` | |
|
||||
| `GET` | `v1/lists/:id/accounts` | |
|
||||
| `POST` | `v1/lists/:id/accounts` | |
|
||||
| `DELETE` | `v1/lists/:id/accounts` | |
|
||||
| | | |
|
||||
| `GET` | `v1/media/:id` | |
|
||||
| `PUT` | `v1/media/:id` | |
|
||||
| `POST` | `v1/media` | |
|
||||
| `POST` | `v2/media` | |
|
||||
| | | |
|
||||
| `GET` | `v1/custom_emojis` | |
|
||||
| `GET` | `v1/instance` | |
|
||||
| `GET` | `v2/instance` | |
|
||||
| `GET` | `v1/announcements` | |
|
||||
| `POST` | `v1/announcements/:id/dismiss` | |
|
||||
| `GET` | `v1/trends` | pagination is unimplemented |
|
||||
| `GET` | `v1/trends/tags` | pagination is unimplemented |
|
||||
| `GET` | `v1/trends/statuses` | |
|
||||
| `GET` | `v1/trends/links` | always returns an empty list |
|
||||
| `GET` | `v1/preferences` | |
|
||||
| `GET` | `v2/suggestions` | |
|
||||
| | | |
|
||||
| `GET` | `v1/notifications` | |
|
||||
| `GET` | `v1/notifications/:id` | |
|
||||
| `POST` | `v1/notifications/clear` | |
|
||||
| `POST` | `v1/notifications/:id/dismiss` | |
|
||||
| `POST` | `v1/conversations/:id/read` | |
|
||||
| `GET` | `v1/push/subscription` | |
|
||||
| `POST` | `v1/push/subscription` | |
|
||||
| `DELETE` | `v1/push/subscription` | |
|
||||
| | | |
|
||||
| `GET` | `v1/search` | |
|
||||
| `GET` | `v2/search` | |
|
||||
| | | |
|
||||
| `POST` | `v1/statuses` | |
|
||||
| `PUT` | `v1/statuses/:id` | |
|
||||
| `GET` | `v1/statuses/:id` | |
|
||||
| `DELETE` | `v1/statuses/:id` | |
|
||||
| `GET` | `v1/statuses/:id/context` | |
|
||||
| `GET` | `v1/statuses/:id/history` | |
|
||||
| `GET` | `v1/statuses/:id/source` | |
|
||||
| `GET` | `v1/statuses/:id/reblogged_by` | |
|
||||
| `GET` | `v1/statuses/:id/favourited_by` | |
|
||||
| `POST` | `v1/statuses/:id/favourite` | |
|
||||
| `POST` | `v1/statuses/:id/unfavourite` | |
|
||||
| `POST` | `v1/statuses/:id/reblog` | |
|
||||
| `POST` | `v1/statuses/:id/unreblog` | |
|
||||
| `POST` | `v1/statuses/:id/bookmark` | |
|
||||
| `POST` | `v1/statuses/:id/unbookmark` | |
|
||||
| `POST` | `v1/statuses/:id/pin` | |
|
||||
| `POST` | `v1/statuses/:id/unpin` | |
|
||||
| `POST` | `v1/statuses/:id/react/:name` | |
|
||||
| `POST` | `v1/statuses/:id/unreact/:name` | |
|
||||
| `POST` | `v1/statuses/:id/translate` | |
|
||||
| | | |
|
||||
| `GET` | `v1/polls/:id` | |
|
||||
| `POST` | `v1/polls/:id/votes` | |
|
||||
| | | |
|
||||
| `GET` | `v1/scheduled_statuses` | |
|
||||
| `GET` | `v1/scheduled_statuses/:id` | reschedule (`PUT` method) is unimplemented |
|
||||
| `DELETE` | `v1/scheduled_statuses/:id` | |
|
||||
| | | |
|
||||
| `GET` | `v1/streaming/health` | |
|
||||
| | | |
|
||||
| `GET` | `v1/timelines/public` | |
|
||||
| `GET` | `v1/timelines/tag/:hashtag` | |
|
||||
| `GET` | `v1/timelines/home` | |
|
||||
| `GET` | `v1/timelines/list/:listId` | |
|
||||
| `GET` | `v1/conversations` | |
|
||||
| `GET` | `v1/markers` | |
|
||||
| `POST` | `v1/markers` | |
|
||||
|
||||
</details>
|
||||
|
||||
## v20240710
|
||||
|
||||
- Added `readCatLanguage` field to the response of `i` and request of `i/update` (optional).
|
||||
|
||||
## v20240607
|
||||
|
||||
- `GET` request is now allowed for the `latest-version` endpoint.
|
||||
|
||||
## v20240523
|
||||
|
||||
- Added `scheduledAt` optional parameter to `notes/create` (!10789)
|
||||
|
||||
## v20240516
|
||||
|
||||
- :warning: `server-info` (an endpoint to get server hardware information) now requires credentials.
|
||||
- :warning: `net` (server's default network interface) has been removed from `admin/server-info`.
|
||||
- Adding `lang` to the response of `i` and the request parameter of `i/update`.
|
||||
|
||||
## v20240504
|
||||
|
||||
- :warning: Removed `release` endpoint.
|
||||
|
||||
## v20240424
|
||||
|
||||
- Added `antennaLimit` field to the response of `meta` and `admin/meta`, and the request of `admin/update-meta` (optional).
|
||||
- Added `filter` optional parameter to `notes/renotes` endpoint to filter the types of renotes. It can take the following values:
|
||||
- `all` (default)
|
||||
- `renote`
|
||||
- `quote`
|
||||
- :warning: Removed the following optional parameters in `notes/reactions`, as they were never taken into account due to a bug:
|
||||
- `sinceId`
|
||||
- `untilId`
|
||||
|
||||
## v20240413
|
||||
|
||||
- :warning: Removed `patrons` endpoint.
|
||||
|
||||
## v20240405
|
||||
|
||||
- Added `notes/history` endpoint.
|
||||
|
||||
## v20240319
|
||||
|
||||
- :warning: `followingCount` and `followersCount` in `users/show` will be `null` (instead of 0) if these values are unavailable.
|
||||
- :warning: `admin/search/index-all` is removed since posts are now indexed automatically.
|
||||
- New optional parameters are added to `notes/search` endpoint:
|
||||
- `sinceDate`
|
||||
- `untilDate`
|
||||
- `withFiles`
|
||||
- `searchCwAndAlt`
|
||||
- Added `enableGuestTimeline` field to the response of `meta` and `admin/meta`, and the request of `admin/update-meta` (optional).
|
||||
|
||||
## v20240301
|
||||
|
||||
- With the addition of new features, the following endpoints are added:
|
||||
- check your follow requests that haven't been approved
|
||||
- `following/requests/sent`
|
||||
- per-user reply mutes
|
||||
- `reply-mute/create`
|
||||
- `reply-mute/delete`
|
||||
- `reply-mute/list`
|
||||
- :warning: The following (horrible) endpoints are removed:
|
||||
- `admin/vacuum`
|
||||
- `reset-db`
|
||||
|
||||
## v20240228
|
||||
|
||||
- :warning: The following endpoints are removed:
|
||||
- `charts/ap-request`
|
||||
- `charts/drive`
|
||||
- `charts/federation`
|
||||
- `charts/hashtag`
|
||||
- `charts/instance`
|
||||
- `charts/notes`
|
||||
- `charts/user/drive`
|
||||
- `charts/user/following`
|
||||
- `charts/user/notes`
|
||||
- `charts/user/reactions`
|
||||
- `charts/users`
|
||||
|
||||
## v20240221
|
||||
|
||||
- Added `admin/set-emoji-moderator` endpoint, where moderators can give these permissions to regular users:
|
||||
- `add`: Add new custom emojis, set tag/category/license to newly added custom emojis
|
||||
- `mod`: `add` permission + edit the name/category/tag/license of the existing custom emojis
|
||||
- `full`: `mod` permission + delete existing custom emojis
|
||||
- Emoji moderators are able to access to the endpoints under `admin/emoji/`
|
||||
- Removed `lang` from the response of `i` and the request parameter of `i/update`.
|
||||
- Added `notes/make-private` endpoint.
|
||||
|
||||
## v20240217
|
||||
|
||||
- :warning: Since the auto NSFW media detection has been removed, these endpoints are affected:
|
||||
- `admin/meta`
|
||||
- These parameter(s) are removed from the response field:
|
||||
- `sensitiveMediaDetection`
|
||||
- `sensitiveMediaDetectionSensitivity`
|
||||
- `setSensitiveFlagAutomatically`
|
||||
- `enableSensitiveMediaDetectionForVideos`
|
||||
- `admin/update-meta`
|
||||
- These parameter(s) are removed from the request field:
|
||||
- `sensitiveMediaDetection`
|
||||
- `sensitiveMediaDetectionSensitivity`
|
||||
- `setSensitiveFlagAutomatically`
|
||||
- `enableSensitiveMediaDetectionForVideos`
|
||||
- `admin/show-user`
|
||||
- These parameter(s) are removed from the response field:
|
||||
- `autoSensitive`
|
||||
- `i/update`
|
||||
- These parameter(s) are removed from the request field:
|
||||
- `autoSensitive`
|
||||
- `/api/emojis` endpoint has been added.
|
||||
|
||||
## v20240212
|
||||
|
||||
- :warning: The field name of the response of `latest-version` has been changed from `tag_name` to `latest_version`.
|
||||
|
||||
## v1.0.5-rc
|
||||
|
||||
- `admin/update-meta` can now take `moreUrls` parameter, and response of `admin/meta` now includes `moreUrls`
|
||||
- These URLs are used for the help menu ([related merge request](https://firefish.dev/firefish/firefish/-/merge_requests/10640))
|
||||
- :warning: response of `meta` no longer includes the following:
|
||||
- `enableTwitterIntegration`
|
||||
- `enableGithubIntegration`
|
||||
- `enableDiscordIntegration`
|
||||
- :warning: parameter of `admin/update-meta` and response of `admin/meta` no longer include the following:
|
||||
- `enableTwitterIntegration`
|
||||
- `enableGithubIntegration`
|
||||
- `enableDiscordIntegration`
|
||||
- `twitterConsumerKey`
|
||||
- `twitterConsumerSecret`
|
||||
- `githubClientId`
|
||||
- `githubClientSecret`
|
||||
- `discordClientId`
|
||||
- `discordClientSecret`
|
||||
- :warning: response of `admin/show-user` no longer includes `integrations`.
|
||||
- Added `lang` parameter to `notes/create` and `notes/edit`.
|
||||
- :warning: `notes/translate` now requires credentials.
|
5
docs/api-doc.md
Normal file
5
docs/api-doc.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
# API Documentation
|
||||
|
||||
You can find interactive API documentation at any Firefish instance /api-doc endpoint. By the way, API console can be found at /api-console endpoint.
|
||||
|
||||
You can also find more about firefish-js [here](../packages/firefish-js/README.md).
|
263
docs/changelog.md
Normal file
263
docs/changelog.md
Normal file
|
@ -0,0 +1,263 @@
|
|||
# Changelog
|
||||
|
||||
Critical security updates are indicated by the :warning: icon.
|
||||
|
||||
This changelog is not an exhaustive list. Code refactorings, minor bug fixes, documentation/dependency updates, etc. are usually not listed here. If you want to see all changes, click on the version number and check the commit history.
|
||||
|
||||
- Server administrators must check [notice-for-admins.md](https://firefish.dev/firefish/firefish/-/blob/main/docs/notice-for-admins.md) as well.
|
||||
- Third-party client/bot developers may want to check [api-change.md](https://firefish.dev/firefish/firefish/-/blob/main/docs/api-change.md) as well.
|
||||
|
||||
## [v20240729](https://firefish.dev/firefish/firefish/-/merge_requests/11214/commits)
|
||||
|
||||
- Fix bugs (including a medium severity security issue)
|
||||
- We are very thankful to Laura Hausmann for kindly sharing the information about the security issue.
|
||||
|
||||
## [v20240728](https://firefish.dev/firefish/firefish/-/merge_requests/11211/commits)
|
||||
|
||||
- Improve `admin/emoji/add` API
|
||||
- Fix bugs
|
||||
|
||||
## [v20240725](https://firefish.dev/firefish/firefish/-/merge_requests/11196/commits)
|
||||
|
||||
- Add followers list export feature
|
||||
- Add description about excluding conditions (e.g., 'firefish -info.firefish.dev', '(sleepy OR eepy) -morning') in post search
|
||||
- Technically this is not a new feature
|
||||
- Fix bugs
|
||||
|
||||
## [v20240714](https://firefish.dev/firefish/firefish/-/merge_requests/11146/commits)
|
||||
|
||||
- Mastodon API implementation was ported from Iceshrimp, with added Firefish extensions including push notifications, post languages, schedule post support, and more. (#10880)
|
||||
- Fix bugs
|
||||
|
||||
### Acknowledgement
|
||||
|
||||
The new Mastodon API support would not have been possible without the significant dedication of Laura Hausmann (Iceshrimp lead developer). We thank her and other Iceshrimp contributors from the bottom of our hearts.
|
||||
|
||||
### Breaking changes
|
||||
|
||||
- The new Mastodon API uses a new format to manage Mastodon sessions in the database, whereas old implementation uses Misskey sessions. All previous client app and token registrations will not work with the new API. All clients need to be re-registered and all users need to re-authenticate.
|
||||
- All IDs (of statuses/notes, notifications, users, etc.) will be using the alphanumerical format, aligning with the Firefish/Misskey API. The old numerical IDs will not work when queried against the new API.
|
||||
|
||||
### Important Notice
|
||||
|
||||
The new Mastodon API support still contains some incompatibilities and unimplemented features, so please keep in mind that you may experience glitchy behavior, and please do NOT report such issues to Mastodon client apps. Such a “bug” is likely due to our implementation, and Mastodon client developers should not be bothered by such an invalid bug report. In the worst scenario, they may simply block non-Mastodon implementations (some clients already do that).
|
||||
|
||||
If you find an incompatibility issue (a bug not reproducible with a vanilla Mastodon server), file it to the Firefish repository instead. However, please remember that it is impossible to achieve 100% compatibility, given that Mastodon servers don’t behave exactly like its own documentation.
|
||||
|
||||
## [v20240710](https://firefish.dev/firefish/firefish/-/merge_requests/11110/commits)
|
||||
|
||||
- Add ability to disable the cat language conversion (nyaification)
|
||||
- Fix bugs
|
||||
|
||||
## [v20240630](https://firefish.dev/firefish/firefish/-/merge_requests/11072/commits)
|
||||
|
||||
- Add ability to automatically append #Alt4Me hashtag when posting a file without an alt text ([What is #Alt4Me?](https://social.growyourown.services/@FediTips/112055775451305236))
|
||||
- Fix a build issue on some environments
|
||||
- Fix bugs
|
||||
|
||||
## [v20240623](https://firefish.dev/firefish/firefish/-/merge_requests/11049/commits)
|
||||
|
||||
- Fix bugs
|
||||
|
||||
## [v20240613](https://firefish.dev/firefish/firefish/-/merge_requests/11003/commits)
|
||||
|
||||
This update contains code refactoring and dependency updates, with no major user-facing changes.
|
||||
|
||||
## [v20240607](https://firefish.dev/firefish/firefish/-/merge_requests/10978/commits)
|
||||
|
||||
- Add the ability to share posts via QR code
|
||||
- Update the API document page (`/api-doc`)
|
||||
- Fix bugs
|
||||
|
||||
## [v20240601](https://firefish.dev/firefish/firefish/-/merge_requests/10943/commits)
|
||||
|
||||
- Fix bugs
|
||||
|
||||
## [v20240523](https://firefish.dev/firefish/firefish/-/merge_requests/10898/commits)
|
||||
|
||||
- Add scheduled posts
|
||||
- Fix bugs
|
||||
|
||||
## [v20240516](https://firefish.dev/firefish/firefish/-/merge_requests/10854/commits)
|
||||
|
||||
- Improve timeline UX (you can restore the original appearance by settings)
|
||||
- Remove `$[center]` MFM function
|
||||
- This function was suddenly added last year (https://firefish.dev/firefish/firefish/-/commit/1a971efa689323d54eebb4d3646e102fb4d1d95a), but according to the [MFM spec](https://github.com/misskey-dev/mfm.js/blob/6aaf68089023c6adebe44123eebbc4dcd75955e0/docs/syntax.md#fn), `$[something]` must be an inline element (while `center` is a block element), so such a syntax is not expected by MFM renderers. Please use `<center></center>` instead.
|
||||
- Fix bugs
|
||||
|
||||
## [v20240504](https://firefish.dev/firefish/firefish/-/merge_requests/10790/commits)
|
||||
|
||||
- Fix bugs
|
||||
|
||||
## :warning: [v20240430](https://firefish.dev/firefish/firefish/-/merge_requests/10781/commits)
|
||||
|
||||
- Add ability to group similar notifications
|
||||
- Add features to share links to an account in the three dots menu on the profile page
|
||||
- Improve server logs
|
||||
- Fix bugs (including a critical security issue)
|
||||
- We are very thankful to @tesaguri and Laura Hausmann for helping to fix the security issue.
|
||||
|
||||
## [v20240424](https://firefish.dev/firefish/firefish/-/merge_requests/10765/commits)
|
||||
|
||||
- Improve the usability of the feature to prevent forgetting to write alt texts
|
||||
- Add a server-wide setting for the maximum number of antennas each user can create
|
||||
- Fix bugs (including a medium severity security issue)
|
||||
- We are very thankful to @mei23 for kindly sharing the information about the security issue.
|
||||
|
||||
## [v20240421](https://firefish.dev/firefish/firefish/-/merge_requests/10756/commits)
|
||||
|
||||
- Fix bugs
|
||||
|
||||
## [v20240413](https://firefish.dev/firefish/firefish/-/merge_requests/10741/commits)
|
||||
|
||||
- Add "Media" tab to user page
|
||||
- Improve federation and rendering of mathematical expressions
|
||||
- Remove donor information from the web client
|
||||
- See also: https://info.firefish.dev/notes/9s1n283sb10rh869
|
||||
- Fix bugs
|
||||
|
||||
## [v20240405](https://firefish.dev/firefish/firefish/-/merge_requests/10733/commits)
|
||||
|
||||
- Add ability to view the history of post edits (!10714)
|
||||
- Fix bugs
|
||||
|
||||
## [v20240401](https://firefish.dev/firefish/firefish/-/merge_requests/10724/commits)
|
||||
|
||||
- Fix bugs
|
||||
|
||||
## :warning: [v20240330](https://firefish.dev/firefish/firefish/-/merge_requests/10719/commits)
|
||||
|
||||
- Fix bugs (including a critical security issue)
|
||||
- We are very thankful to Oneric (the reporter of the security issue) and Laura Hausmann (Iceshrimp maintainer) for kindly and securely sharing the information to fix the issue.
|
||||
|
||||
## [v20240326](https://firefish.dev/firefish/firefish/-/merge_requests/10713/commits)
|
||||
|
||||
- Fix bugs
|
||||
- Add an icon in the posting form to indicate that attached files have alt text
|
||||
- Add a toggleable setting to show a warning if the post language setting might be incorrect
|
||||
|
||||
## [v20240319](https://firefish.dev/firefish/firefish/-/compare/v20240301...v20240319?from_project_id=7&straight=false)
|
||||
|
||||
- Introduce new full-text search engine and post search filters
|
||||
- Refactoring
|
||||
- Show unlisted posts from following users in antennas (similar to [Fedibird](https://github.com/fedibird/mastodon/tree/fedibird) and [kmyblue](https://github.com/kmycode/mastodon), unlisted posts from people you don't follow won't be shown)
|
||||
- Add ability to publish the Local and Global timelines on `/timeline` page
|
||||
- Add langage annotation to post contents (!10687)
|
||||
- Add a toggleable setting to show a warning when you attempt to post files without alt text
|
||||
- Fix bugs
|
||||
- Update documents and example config files
|
||||
- Added `/authorize_interaction` page, allowing users to jump from a remote Mastodon post/user page to the corresponding page in Firefish (!10702)
|
||||
|
||||
## [v20240301](https://firefish.dev/firefish/firefish/-/compare/v20240229...v20240301?from_project_id=7&straight=false)
|
||||
|
||||
- Add a page (`/my/follow-requests/sent`) to check your follow requests that haven't been approved
|
||||
- Add ability to hide replies from certain users in timelines
|
||||
- Admins are now allowed to migrate their account
|
||||
- This was requested by personal server admins
|
||||
- Change default client settings (you can restore the previous settings)
|
||||
- Use system's font
|
||||
- This is for accessibility reasons (related discussion: <https://github.com/misskey-dev/misskey/issues/10192>)
|
||||
- Disable vibrations
|
||||
- Don't show gaps between posts in timelines
|
||||
- Show the instance ticker on local posts
|
||||
- Change default user settings (existing users are not affected)
|
||||
- Reject crawler indexing
|
||||
- Set reaction history to public
|
||||
- Change default server settings (existing servers are not affected)
|
||||
- Disable new user registration
|
||||
- Fix bugs
|
||||
|
||||
## [v20240229](https://firefish.dev/firefish/firefish/-/compare/v20240228...v20240229?from_project_id=7&straight=false)
|
||||
|
||||
- Add ability to pull-down-to-refresh timelines in PWA
|
||||
- Make passkey/security key independent of TOTP (!10670)
|
||||
- Fix bugs
|
||||
|
||||
## [v20240228](https://firefish.dev/firefish/firefish/-/compare/v20240225...v20240228?from_project_id=7&straight=false)
|
||||
|
||||
- Update "About Firefish" page (!10673)
|
||||
- Fix bugs (!10675 !10676 !10678 !10679)
|
||||
- Remove charts generation to improve performance (#10611)
|
||||
|
||||
## [v20240225](https://firefish.dev/firefish/firefish/-/compare/v20240222...v20240225?from_project_id=7&straight=false)
|
||||
|
||||
- Fix bugs
|
||||
- Add syntax highlighting in MFM code blocks in various programming languages
|
||||
|
||||
## [v20240222](https://firefish.dev/firefish/firefish/-/compare/v20240221-1...v20240222?from_project_id=7&straight=false)
|
||||
|
||||
- Enhance Mastodon post import feature (!10652)
|
||||
- Minor style change in the web client
|
||||
- Refactoring
|
||||
|
||||
## [v20240221-1](https://firefish.dev/firefish/firefish/-/compare/v20240221...v20240221-1?from_project_id=7&straight=false)
|
||||
|
||||
- Fix a bug
|
||||
|
||||
## [v20240221](https://firefish.dev/firefish/firefish/-/compare/v20240217-1...v20240221?from_project_id=7&straight=false)
|
||||
|
||||
- Add the ability to give regular (non-moderator) users permission to manage custom emojis
|
||||
- Fix a bug that made impossible to update user profiles under some conditions
|
||||
- Add "private" (only me) post visibility
|
||||
- It's just a paraphrase of DMs without recipients
|
||||
- You can also convert your existing public posts to private posts
|
||||
|
||||
## :warning: [v20240217-1](https://firefish.dev/firefish/firefish/-/compare/v20240217...v20240217-1?from_project_id=7&straight=false)
|
||||
|
||||
- Fix a [security issue](https://github.com/misskey-dev/misskey/security/advisories/GHSA-qqrm-9grj-6v32)
|
||||
|
||||
## [v20240217](https://firefish.dev/firefish/firefish/-/compare/v20240216...v20240217?from_project_id=7&straight=false)
|
||||
|
||||
- Add ability to specify the search engine used in the search bar MFM
|
||||
- Remove auto NSFW media detection
|
||||
- The "Hide NSFW media" config is now per device and per account
|
||||
- Increase the max number of pinned posts from 5 to 15
|
||||
- Change the second tab on the notifications page from "unread" to "reactions"
|
||||
- Add ability to show a huge post button on the posting form
|
||||
- This is a joke feature inspired by https://mstdn.poyo.me/@prime/110668364208741253
|
||||
- Fix bugs
|
||||
- Add `/api/emojis` endpoint (compatible with Misskey v13) for better experiences with Misskey clients
|
||||
- This does not mean we will continue to maintain API compatibility with Misskey. Instead, we plan to improve the compatibility with the Mastodon API.
|
||||
|
||||
## [v20240216](https://firefish.dev/firefish/firefish/-/compare/v20240215...v20240216?from_project_id=7&straight=false)
|
||||
|
||||
- Style changes in the web client (a770ef4314e21f17fdce1f19feb3758953b04486 ab39ff5954a392cc6688a02f1723e1702df5e35c 4eefd534d8150e2cd5cf31dddd327edceb5b84dc)
|
||||
- Clicking the "like" button now sends the actual emoji reaction (star, good, heart, etc.) instead of an empty "like"
|
||||
|
||||
## [v20240215](https://firefish.dev/firefish/firefish/-/compare/v20240214...v20240215?from_project_id=7&straight=false)
|
||||
|
||||
- Separate settings for displaying rounded avatars for cat and non-cat accounts
|
||||
- Add a toggleable setting to replace the chat button with account menu on mobile
|
||||
- Reduce the size of the container image (!10667)
|
||||
|
||||
## [v20240214](https://firefish.dev/firefish/firefish/-/compare/v20240213...v20240214?from_project_id=7&straight=false)
|
||||
|
||||
- Fix container images
|
||||
|
||||
## [v20240213](https://firefish.dev/firefish/firefish/-/compare/v20240212...v20240213?from_project_id=7&straight=false)
|
||||
|
||||
- Fix bugs
|
||||
- Refactoring
|
||||
|
||||
## [v20240212](https://firefish.dev/firefish/firefish/-/compare/v20240210...v20240212?from_project_id=7&straight=false)
|
||||
|
||||
- Refactoring
|
||||
- Add a toggleable setting to hide follow buttons in a misclickable position
|
||||
- Add a toggleable setting to show preview in posting form by default
|
||||
|
||||
## [v20240210](https://firefish.dev/firefish/firefish/-/compare/v20240208...v20240210?from_project_id=7&straight=false)
|
||||
|
||||
- Security update (cf5b42a160ae8a4d94bf3dcea04ce12935ca4f76)
|
||||
- Refactoring
|
||||
|
||||
## [v20240208](https://firefish.dev/firefish/firefish/-/compare/v20240206...v20240208?from_project_id=7&straight=false)
|
||||
|
||||
- Fix bugs (!10654 !10665)
|
||||
- Enlarge profile picture by clicking it (!10659)
|
||||
- Support Pleroma chat (!10660)
|
||||
- [Add documentation about downgrading](./docs/downgrade.md)
|
||||
|
||||
## [v20240206](https://firefish.dev/firefish/firefish/-/compare/v1.0.5-rc...v20240206?from_project_id=7&straight=false)
|
||||
|
||||
- Fix many bugs
|
||||
- Per-post language selector (!10616)
|
78
docs/downgrade.md
Normal file
78
docs/downgrade.md
Normal file
|
@ -0,0 +1,78 @@
|
|||
# Downgrading to `v20240206`
|
||||
|
||||
## systemd/pm2
|
||||
|
||||
1. Stop the Firefish service
|
||||
```sh
|
||||
sudo systemctl stop your-firefish-service.service
|
||||
# or pm2 stop firefish
|
||||
```
|
||||
1. Take a backup
|
||||
1. Revert database migrations
|
||||
```sh
|
||||
sudo --user=postgres psql --file=docs/downgrade.sql --dbname=database_name
|
||||
```
|
||||
|
||||
The database name can be found in `.config/default.yml`.
|
||||
```yaml
|
||||
db:
|
||||
port: 5432
|
||||
db: database_name # this one
|
||||
user: firefish
|
||||
pass: password
|
||||
```
|
||||
1. Switch back to the `v20240206` tag
|
||||
```sh
|
||||
git switch --detach v20240206
|
||||
```
|
||||
1. Rebuild Firefish
|
||||
```sh
|
||||
pnpm install --frozen-lockfile
|
||||
NODE_ENV='production' NODE_OPTIONS='--max_old_space_size=3072' pnpm run rebuild
|
||||
```
|
||||
1. Start the Firefish service and confirm that Firefish is downgraded
|
||||
```sh
|
||||
sudo systemctl start your-firefish-service.service
|
||||
# or pm2 start firefish
|
||||
```
|
||||
|
||||
## Docker/Podman
|
||||
|
||||
1. Stop the container
|
||||
```sh
|
||||
docker-compose down
|
||||
# or podman-compose down
|
||||
```
|
||||
1. Take a backup
|
||||
1. Revert database migrations
|
||||
```sh
|
||||
docker-compose exec db psql --command="$(cat docs/downgrade.sql)" --user=user_name --dbname=database_name
|
||||
# or podman-compose exec db psql --command="$(cat docs/revert.sql)" --user=user_name --dbname=database_name
|
||||
```
|
||||
|
||||
The user and database name can be found in `.config/docker.env`.
|
||||
```env
|
||||
POSTGRES_PASSWORD=password
|
||||
POSTGRES_USER=user_name # user name
|
||||
POSTGRES_DB=database_name # database name
|
||||
```
|
||||
1. Change Firefish image tag from `latest` to `v20240206`
|
||||
```sh
|
||||
vim docker-compose.yml
|
||||
```
|
||||
|
||||
```yaml
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
web:
|
||||
image: registry.firefish.dev/firefish/firefish:v20240206 # here
|
||||
```
|
||||
1. Change database image from `docker.io/groonga/pgroonga` to `docker.io/postgres`
|
||||
|
||||
Please make sure to use the same PostgreSQL version. For example, if you are using `docker.io/groonga/pgroonga:3.1.8-alpine-16`, you should change it to `docker.io/postgres:16-alpine`. PGroonga images are tagged as `{PGroonga version}-{alpine or debian}-{PostgreSQL major version}`. PostgreSQL image tags can be found at <https://hub.docker.com/_/postgres/tags>.
|
||||
1. Start the container and confirm that Firefish is downgraded
|
||||
```sh
|
||||
docker-compose up --detach
|
||||
# or podman-compose up --detach
|
||||
```
|
844
docs/downgrade.sql
Normal file
844
docs/downgrade.sql
Normal file
|
@ -0,0 +1,844 @@
|
|||
BEGIN;
|
||||
|
||||
DELETE FROM "migrations" WHERE name IN (
|
||||
'SetAccessTokenName1722134626110',
|
||||
'CreateSystemActors1720618854585',
|
||||
'AddMastodonSubscriptionType1715181461692',
|
||||
'SwSubscriptionAccessToken1709395223611',
|
||||
'UserProfileMentions1711075007936',
|
||||
'ClientCredentials1713108561474',
|
||||
'TurnOffCatLanguage1720107645050',
|
||||
'RefactorScheduledPosts1716804636187',
|
||||
'RemoveEnumTypenameSuffix1716462794927',
|
||||
'CreateScheduledNote1714728200194',
|
||||
'AddBackTimezone1715351290096',
|
||||
'UserprofileJsonbToArray1714270605574',
|
||||
'DropUnusedUserprofileColumns1714259023878',
|
||||
'AntennaJsonbToArray1714192520471',
|
||||
'AddUserProfileLanguage1714888400293',
|
||||
'DropUnusedIndexes1714643926317',
|
||||
'AlterAkaType1714099399879',
|
||||
'AddDriveFileUsage1713451569342',
|
||||
'ConvertCwVarcharToText1713225866247',
|
||||
'FixChatFileConstraint1712855579316',
|
||||
'DropTimeZone1712425488543',
|
||||
'ExpandNoteEdit1711936358554',
|
||||
'markLocalFilesNsfwByDefault1709305200000',
|
||||
'FixMutingIndices1710690239308',
|
||||
'NoteFile1710304584214',
|
||||
'RenameMetaColumns1705944717480',
|
||||
'SeparateHardMuteWordsAndPatterns1706413792769',
|
||||
'IndexAltTextAndCw1708872574733',
|
||||
'Pgroonga1698420787202',
|
||||
'ChangeDefaultConfigs1709251460718',
|
||||
'AddReplyMuting1704851359889',
|
||||
'FixNoteUrlIndex1709129810501',
|
||||
'RemoveCharts1709047957489',
|
||||
'DropUserProfileLanguage1708452631156',
|
||||
'EmojiModerator1692825433698',
|
||||
'RemoveNsfwDetection1705848938166',
|
||||
'FirefishUrlMove1707850084123',
|
||||
'RemoveNativeUtilsMigration1705877093218'
|
||||
);
|
||||
|
||||
-- addMastodonSubscriptionType
|
||||
ALTER TABLE "sw_subscription" DROP COLUMN "subscriptionTypes";
|
||||
DROP TYPE "push_subscription_type";
|
||||
|
||||
-- sw-subscription-per-access-token
|
||||
ALTER TABLE "sw_subscription" DROP CONSTRAINT "FK_98a1aa2db2a5253924f42f38767";
|
||||
ALTER TABLE "sw_subscription" DROP COLUMN "appAccessTokenId";
|
||||
|
||||
-- user-profile-mentions
|
||||
ALTER TABLE "user_profile" DROP COLUMN "mentions";
|
||||
|
||||
-- client-credential-support
|
||||
ALTER TABLE "access_token" ALTER COLUMN "userId" SET NOT NULL;
|
||||
|
||||
-- turn-off-cat-language
|
||||
ALTER TABLE "user" DROP COLUMN "readCatLanguage";
|
||||
|
||||
-- refactor-scheduled-post
|
||||
CREATE TABLE "scheduled_note" (
|
||||
"id" character varying(32) NOT NULL PRIMARY KEY,
|
||||
"noteId" character varying(32) NOT NULL,
|
||||
"userId" character varying(32) NOT NULL,
|
||||
"scheduledAt" TIMESTAMP WITH TIME ZONE NOT NULL
|
||||
);
|
||||
COMMENT ON COLUMN "scheduled_note"."noteId" IS 'The ID of the temporarily created note that corresponds to the schedule.';
|
||||
CREATE EXTENSION pgcrypto;
|
||||
CREATE FUNCTION generate_scheduled_note_id(size int) RETURNS text AS $$ DECLARE
|
||||
characters text := 'abcdefghijklmnopqrstuvwxyz0123456789';
|
||||
bytes bytea := gen_random_bytes(size);
|
||||
l int := length(characters);
|
||||
i int := 0;
|
||||
output text := '';
|
||||
BEGIN
|
||||
WHILE i < size LOOP
|
||||
output := output || substr(characters, get_byte(bytes, i) % l + 1, 1);
|
||||
i := i + 1;
|
||||
END LOOP;
|
||||
RETURN output;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql VOLATILE;
|
||||
INSERT INTO "scheduled_note" ("id", "noteId", "userId", "scheduledAt") (SELECT generate_scheduled_note_id(16), "id", "userId", "scheduledAt" FROM "note" WHERE "note"."scheduledAt" IS NOT NULL);
|
||||
DROP EXTENSION pgcrypto;
|
||||
DROP FUNCTION "generate_scheduled_note_id";
|
||||
CREATE INDEX "IDX_noteId_ScheduledNote" ON "scheduled_note" ("noteId");
|
||||
CREATE INDEX "IDX_userId_ScheduledNote" ON "scheduled_note" ("userId");
|
||||
ALTER TABLE "scheduled_note" ADD FOREIGN KEY ("noteId") REFERENCES "note"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
ALTER TABLE "scheduled_note" ADD FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
ALTER TABLE "note" DROP COLUMN "scheduledAt";
|
||||
|
||||
-- remove-enum-typename-suffix
|
||||
ALTER TYPE "antenna_src" RENAME TO "antenna_src_enum";
|
||||
ALTER TYPE "drive_file_usage_hint" RENAME TO "drive_file_usage_hint_enum";
|
||||
ALTER TYPE "muted_note_reason" RENAME TO "muted_note_reason_enum";
|
||||
ALTER TYPE "note_visibility" RENAME TO "note_visibility_enum";
|
||||
ALTER TYPE "notification_type" RENAME TO "notification_type_enum";
|
||||
ALTER TYPE "page_visibility" RENAME TO "page_visibility_enum";
|
||||
ALTER TYPE "poll_note_visibility" RENAME TO "poll_notevisibility_enum";
|
||||
ALTER TYPE "relay_status" RENAME TO "relay_status_enum";
|
||||
ALTER TYPE "user_emoji_mod_perm" RENAME TO "user_emojimodperm_enum";
|
||||
ALTER TYPE "user_profile_ffvisibility" RENAME TO "user_profile_ffvisibility_enum";
|
||||
ALTER TYPE "user_profile_muting_notification_types" RENAME TO "user_profile_mutingnotificationtypes_enum";
|
||||
|
||||
-- create-scheduled-note
|
||||
DROP TABLE "scheduled_note";
|
||||
|
||||
-- userprofile-jsonb-to-array
|
||||
ALTER TABLE "user_profile" RENAME COLUMN "mutedInstances" TO "mutedInstances_old";
|
||||
ALTER TABLE "user_profile" ADD COLUMN "mutedInstances" jsonb NOT NULL DEFAULT '[]';
|
||||
UPDATE "user_profile" SET "mutedInstances" = to_jsonb("mutedInstances_old");
|
||||
ALTER TABLE "user_profile" DROP COLUMN "mutedInstances_old";
|
||||
ALTER TABLE "user_profile" RENAME COLUMN "mutedWords" TO "mutedWords_old";
|
||||
ALTER TABLE "user_profile" ADD COLUMN "mutedWords" jsonb NOT NULL DEFAULT '[]';
|
||||
CREATE TEMP TABLE "BCrsGgLCUeMMLARy" ("userId" character varying(32), "kws" jsonb NOT NULL DEFAULT '[]');
|
||||
INSERT INTO "BCrsGgLCUeMMLARy" ("userId", "kws") SELECT "userId", jsonb_agg("X"."w") FROM (SELECT "userId", to_jsonb(string_to_array(unnest("mutedWords_old"), ' ')) AS "w" FROM "user_profile") AS "X" GROUP BY "userId";
|
||||
UPDATE "user_profile" SET "mutedWords" = "kws" FROM "BCrsGgLCUeMMLARy" WHERE "user_profile"."userId" = "BCrsGgLCUeMMLARy"."userId";
|
||||
ALTER TABLE "user_profile" DROP COLUMN "mutedWords_old";
|
||||
|
||||
-- drop-unused-userprofile-columns
|
||||
ALTER TABLE "user_profile" ADD "room" jsonb NOT NULL DEFAULT '{}';
|
||||
COMMENT ON COLUMN "user_profile"."room" IS 'The room data of the User.';
|
||||
ALTER TABLE "user_profile" ADD "clientData" jsonb NOT NULL DEFAULT '{}';
|
||||
COMMENT ON COLUMN "user_profile"."clientData" IS 'The client-specific data of the User.';
|
||||
|
||||
-- antenna-jsonb-to-array
|
||||
UPDATE "antenna" SET "instances" = '{""}' WHERE "instances" = '{}';
|
||||
ALTER TABLE "antenna" RENAME COLUMN "instances" TO "instances_old";
|
||||
ALTER TABLE "antenna" ADD COLUMN "instances" jsonb NOT NULL DEFAULT '[]';
|
||||
UPDATE "antenna" SET "instances" = to_jsonb("instances_old");
|
||||
ALTER TABLE "antenna" DROP COLUMN "instances_old";
|
||||
UPDATE "antenna" SET "keywords" = '{""}' WHERE "keywords" = '{}';
|
||||
ALTER TABLE "antenna" RENAME COLUMN "keywords" TO "keywords_old";
|
||||
ALTER TABLE "antenna" ADD COLUMN "keywords" jsonb NOT NULL DEFAULT '[]';
|
||||
CREATE TEMP TABLE "QvPNcMitBFkqqBgm" ("id" character varying(32), "kws" jsonb NOT NULL DEFAULT '[]');
|
||||
INSERT INTO "QvPNcMitBFkqqBgm" ("id", "kws") SELECT "id", jsonb_agg("X"."w") FROM (SELECT "id", to_jsonb(string_to_array(unnest("keywords_old"), ' ')) AS "w" FROM "antenna") AS "X" GROUP BY "id";
|
||||
UPDATE "antenna" SET "keywords" = "kws" FROM "QvPNcMitBFkqqBgm" WHERE "antenna"."id" = "QvPNcMitBFkqqBgm"."id";
|
||||
ALTER TABLE "antenna" DROP COLUMN "keywords_old";
|
||||
UPDATE "antenna" SET "excludeKeywords" = '{""}' WHERE "excludeKeywords" = '{}';
|
||||
ALTER TABLE "antenna" RENAME COLUMN "excludeKeywords" TO "excludeKeywords_old";
|
||||
ALTER TABLE "antenna" ADD COLUMN "excludeKeywords" jsonb NOT NULL DEFAULT '[]';
|
||||
CREATE TEMP TABLE "MZvVSjHzYcGXmGmz" ("id" character varying(32), "kws" jsonb NOT NULL DEFAULT '[]');
|
||||
INSERT INTO "MZvVSjHzYcGXmGmz" ("id", "kws") SELECT "id", jsonb_agg("X"."w") FROM (SELECT "id", to_jsonb(string_to_array(unnest("excludeKeywords_old"), ' ')) AS "w" FROM "antenna") AS "X" GROUP BY "id";
|
||||
UPDATE "antenna" SET "excludeKeywords" = "kws" FROM "MZvVSjHzYcGXmGmz" WHERE "antenna"."id" = "MZvVSjHzYcGXmGmz"."id";
|
||||
ALTER TABLE "antenna" DROP COLUMN "excludeKeywords_old";
|
||||
|
||||
-- drop-unused-indexes
|
||||
CREATE INDEX "IDX_01f4581f114e0ebd2bbb876f0b" ON "note_reaction" ("createdAt");
|
||||
CREATE INDEX "IDX_0610ebcfcfb4a18441a9bcdab2" ON "poll" ("userId");
|
||||
CREATE INDEX "IDX_25dfc71b0369b003a4cd434d0b" ON "note" ("attachedFileTypes");
|
||||
CREATE INDEX "IDX_2710a55f826ee236ea1a62698f" ON "hashtag" ("mentionedUsersCount");
|
||||
CREATE INDEX "IDX_4c02d38a976c3ae132228c6fce" ON "hashtag" ("mentionedRemoteUsersCount");
|
||||
CREATE INDEX "IDX_51c063b6a133a9cb87145450f5" ON "note" ("fileIds");
|
||||
CREATE INDEX "IDX_54ebcb6d27222913b908d56fd8" ON "note" ("mentions");
|
||||
CREATE INDEX "IDX_7fa20a12319c7f6dc3aed98c0a" ON "poll" ("userHost");
|
||||
CREATE INDEX "IDX_88937d94d7443d9a99a76fa5c0" ON "note" ("tags");
|
||||
CREATE INDEX "IDX_b11a5e627c41d4dc3170f1d370" ON "notification" ("createdAt");
|
||||
CREATE INDEX "IDX_c8dfad3b72196dd1d6b5db168a" ON "drive_file" ("createdAt");
|
||||
CREATE INDEX "IDX_d57f9030cd3af7f63ffb1c267c" ON "hashtag" ("attachedUsersCount");
|
||||
CREATE INDEX "IDX_e5848eac4940934e23dbc17581" ON "drive_file" ("uri");
|
||||
CREATE INDEX "IDX_fa99d777623947a5b05f394cae" ON "user" ("tags");
|
||||
|
||||
-- alter-aka-type
|
||||
ALTER TABLE "user" RENAME COLUMN "alsoKnownAs" TO "alsoKnownAsOld";
|
||||
ALTER TABLE "user" ADD COLUMN "alsoKnownAs" text;
|
||||
UPDATE "user" SET "alsoKnownAs" = array_to_string("alsoKnownAsOld", ',');
|
||||
COMMENT ON COLUMN "user"."alsoKnownAs" IS 'URIs the user is known as too';
|
||||
ALTER TABLE "user" DROP COLUMN "alsoKnownAsOld";
|
||||
|
||||
-- AddDriveFileUsage
|
||||
ALTER TABLE "drive_file" DROP COLUMN "usageHint";
|
||||
DROP TYPE "drive_file_usage_hint_enum";
|
||||
|
||||
-- convert-cw-varchar-to-text
|
||||
DROP INDEX "IDX_8e3bbbeb3df04d1a8105da4c8f";
|
||||
ALTER TABLE "note" ALTER COLUMN "cw" TYPE character varying(512);
|
||||
CREATE INDEX "IDX_8e3bbbeb3df04d1a8105da4c8f" ON "note" USING "pgroonga" ("cw" pgroonga_varchar_full_text_search_ops_v2);
|
||||
|
||||
-- fix-chat-file-constraint
|
||||
ALTER TABLE "messaging_message" DROP CONSTRAINT "FK_535def119223ac05ad3fa9ef64b";
|
||||
ALTER TABLE "messaging_message" ADD CONSTRAINT "FK_535def119223ac05ad3fa9ef64b" FOREIGN KEY ("fileId") REFERENCES "drive_file"("id") ON DELETE CASCADE ON UPDATE NO ACTION;
|
||||
|
||||
-- expand-note-edit
|
||||
ALTER TABLE "note_edit" DROP COLUMN "emojis";
|
||||
|
||||
-- markLocalFilesNsfwByDefault
|
||||
ALTER TABLE "meta" DROP COLUMN "markLocalFilesNsfwByDefault";
|
||||
|
||||
-- fix-muting-indices
|
||||
DROP INDEX "IDX_renote_muting_createdAt";
|
||||
DROP INDEX "IDX_renote_muting_muteeId";
|
||||
DROP INDEX "IDX_renote_muting_muterId";
|
||||
DROP INDEX "IDX_reply_muting_createdAt";
|
||||
DROP INDEX "IDX_reply_muting_muteeId";
|
||||
DROP INDEX "IDX_reply_muting_muterId";
|
||||
CREATE INDEX "IDX_renote_muting_createdAt" ON "muting" ("createdAt");
|
||||
CREATE INDEX "IDX_renote_muting_muteeId" ON "muting" ("muteeId");
|
||||
CREATE INDEX "IDX_renote_muting_muterId" ON "muting" ("muterId");
|
||||
|
||||
-- note-file
|
||||
DROP TABLE "note_file";
|
||||
|
||||
-- rename-meta-columns
|
||||
ALTER TABLE "meta" RENAME COLUMN "tosUrl" TO "ToSUrl";
|
||||
ALTER TABLE "meta" RENAME COLUMN "objectStorageUseSsl" TO "objectStorageUseSSL";
|
||||
ALTER TABLE "meta" RENAME COLUMN "customMotd" TO "customMOTD";
|
||||
|
||||
-- separate-hard-mute-words-and-patterns
|
||||
UPDATE "user_profile" SET "mutedWords" = "mutedWords" || array_to_json("mutedPatterns")::jsonb;
|
||||
ALTER TABLE "user_profile" DROP "mutedPatterns";
|
||||
|
||||
-- index-alt-text-and-cw
|
||||
DROP INDEX "IDX_f4f7b93d05958527300d79ac82";
|
||||
DROP INDEX "IDX_8e3bbbeb3df04d1a8105da4c8f";
|
||||
|
||||
-- pgroonga
|
||||
DROP INDEX "IDX_f27f5d88941e57442be75ba9c8";
|
||||
DROP INDEX "IDX_065d4d8f3b5adb4a08841eae3c";
|
||||
DROP INDEX "IDX_fcb770976ff8240af5799e3ffc";
|
||||
DROP EXTENSION pgroonga CASCADE;
|
||||
|
||||
-- change-default-configs
|
||||
ALTER TABLE "user_profile" ALTER COLUMN "noCrawle" SET DEFAULT false;
|
||||
ALTER TABLE "user_profile" ALTER COLUMN "publicReactions" SET DEFAULT false;
|
||||
ALTER TABLE "meta" ALTER COLUMN "disableRegistration" SET DEFAULT false;
|
||||
|
||||
-- reply-muting
|
||||
DROP TABLE "reply_muting";
|
||||
|
||||
-- remove-charts
|
||||
CREATE TABLE public.__chart__ap_request (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"___deliverFailed" integer DEFAULT 0 NOT NULL,
|
||||
"___deliverSucceeded" integer DEFAULT 0 NOT NULL,
|
||||
"___inboxReceived" integer DEFAULT 0 NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__ap_request_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__ap_request_id_seq OWNED BY public.__chart__ap_request.id;
|
||||
|
||||
CREATE TABLE public.__chart__drive (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"___local_incCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___local_incSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___local_decCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___local_decSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___remote_incCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___remote_incSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___remote_decCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___remote_decSize" integer DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__drive_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__drive_id_seq OWNED BY public.__chart__drive.id;
|
||||
|
||||
CREATE TABLE public.__chart__federation (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"unique_temp___deliveredInstances" character varying[] DEFAULT '{}'::character varying[] NOT NULL,
|
||||
"___deliveredInstances" smallint DEFAULT '0'::smallint NOT NULL,
|
||||
"unique_temp___inboxInstances" character varying[] DEFAULT '{}'::character varying[] NOT NULL,
|
||||
"___inboxInstances" smallint DEFAULT '0'::smallint NOT NULL,
|
||||
unique_temp___stalled character varying[] DEFAULT '{}'::character varying[] NOT NULL,
|
||||
___stalled smallint DEFAULT '0'::smallint NOT NULL,
|
||||
___sub smallint DEFAULT '0'::smallint NOT NULL,
|
||||
___pub smallint DEFAULT '0'::smallint NOT NULL,
|
||||
___pubsub smallint DEFAULT '0'::smallint NOT NULL,
|
||||
"___subActive" smallint DEFAULT '0'::smallint NOT NULL,
|
||||
"___pubActive" smallint DEFAULT '0'::smallint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__federation_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__federation_id_seq OWNED BY public.__chart__federation.id;
|
||||
|
||||
CREATE TABLE public.__chart__hashtag (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___local_users integer DEFAULT 0 NOT NULL,
|
||||
___remote_users integer DEFAULT 0 NOT NULL,
|
||||
unique_temp___local_users character varying[] DEFAULT '{}'::character varying[] NOT NULL,
|
||||
unique_temp___remote_users character varying[] DEFAULT '{}'::character varying[] NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__hashtag_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__hashtag_id_seq OWNED BY public.__chart__hashtag.id;
|
||||
|
||||
CREATE TABLE public.__chart__instance (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___requests_failed smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___requests_succeeded smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___requests_received smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_inc integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_dec integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_diffs_normal integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_diffs_reply integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_diffs_renote integer DEFAULT '0'::bigint NOT NULL,
|
||||
___users_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___users_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___users_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___following_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___following_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___following_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___followers_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___followers_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___followers_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_totalFiles" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_incFiles" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_incUsage" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_decFiles" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_decUsage" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___notes_diffs_withFile" integer DEFAULT 0 NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__instance_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__instance_id_seq OWNED BY public.__chart__instance.id;
|
||||
|
||||
CREATE TABLE public.__chart__network (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"___incomingRequests" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___outgoingRequests" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___totalTime" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___incomingBytes" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___outgoingBytes" integer DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__network_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__network_id_seq OWNED BY public.__chart__network.id;
|
||||
|
||||
CREATE TABLE public.__chart__notes (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
___local_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_inc integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_dec integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_diffs_normal integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_diffs_reply integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_diffs_renote integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_inc integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_dec integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_diffs_normal integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_diffs_reply integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_diffs_renote integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___local_diffs_withFile" integer DEFAULT 0 NOT NULL,
|
||||
"___remote_diffs_withFile" integer DEFAULT 0 NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__notes_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__notes_id_seq OWNED BY public.__chart__notes.id;
|
||||
|
||||
CREATE TABLE public.__chart__per_user_drive (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
"___totalCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___totalSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___incCount" smallint DEFAULT '0'::bigint NOT NULL,
|
||||
"___incSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___decCount" smallint DEFAULT '0'::bigint NOT NULL,
|
||||
"___decSize" integer DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__per_user_drive_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__per_user_drive_id_seq OWNED BY public.__chart__per_user_drive.id;
|
||||
|
||||
CREATE TABLE public.__chart__per_user_following (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___local_followings_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followings_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followings_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followers_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followers_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followers_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followings_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followings_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followings_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followers_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followers_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followers_dec smallint DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__per_user_following_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__per_user_following_id_seq OWNED BY public.__chart__per_user_following.id;
|
||||
|
||||
CREATE TABLE public.__chart__per_user_notes (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___diffs_normal smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___diffs_reply smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___diffs_renote smallint DEFAULT '0'::bigint NOT NULL,
|
||||
"___diffs_withFile" smallint DEFAULT '0'::smallint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__per_user_notes_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__per_user_notes_id_seq OWNED BY public.__chart__per_user_notes.id;
|
||||
|
||||
CREATE TABLE public.__chart__per_user_reaction (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___local_count smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_count smallint DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__per_user_reaction_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__per_user_reaction_id_seq OWNED BY public.__chart__per_user_reaction.id;
|
||||
|
||||
CREATE TABLE public.__chart__test (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128),
|
||||
___foo_total bigint NOT NULL,
|
||||
___foo_inc bigint NOT NULL,
|
||||
___foo_dec bigint NOT NULL
|
||||
);
|
||||
CREATE TABLE public.__chart__test_grouped (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128),
|
||||
___foo_total bigint NOT NULL,
|
||||
___foo_inc bigint NOT NULL,
|
||||
___foo_dec bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__test_grouped_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__test_grouped_id_seq OWNED BY public.__chart__test_grouped.id;
|
||||
|
||||
CREATE SEQUENCE public.__chart__test_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__test_id_seq OWNED BY public.__chart__test.id;
|
||||
|
||||
CREATE TABLE public.__chart__test_unique (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128),
|
||||
___foo character varying[] DEFAULT '{}'::character varying[] NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__test_unique_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__test_unique_id_seq OWNED BY public.__chart__test_unique.id;
|
||||
|
||||
CREATE TABLE public.__chart__users (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
___local_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___local_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_dec smallint DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart__users_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart__users_id_seq OWNED BY public.__chart__users.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__ap_request (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"___deliverFailed" integer DEFAULT 0 NOT NULL,
|
||||
"___deliverSucceeded" integer DEFAULT 0 NOT NULL,
|
||||
"___inboxReceived" integer DEFAULT 0 NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__ap_request_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__ap_request_id_seq OWNED BY public.__chart_day__ap_request.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__drive (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"___local_incCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___local_incSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___local_decCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___local_decSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___remote_incCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___remote_incSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___remote_decCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___remote_decSize" integer DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__drive_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__drive_id_seq OWNED BY public.__chart_day__drive.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__federation (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"unique_temp___deliveredInstances" character varying[] DEFAULT '{}'::character varying[] NOT NULL,
|
||||
"___deliveredInstances" smallint DEFAULT '0'::smallint NOT NULL,
|
||||
"unique_temp___inboxInstances" character varying[] DEFAULT '{}'::character varying[] NOT NULL,
|
||||
"___inboxInstances" smallint DEFAULT '0'::smallint NOT NULL,
|
||||
unique_temp___stalled character varying[] DEFAULT '{}'::character varying[] NOT NULL,
|
||||
___stalled smallint DEFAULT '0'::smallint NOT NULL,
|
||||
___sub smallint DEFAULT '0'::smallint NOT NULL,
|
||||
___pub smallint DEFAULT '0'::smallint NOT NULL,
|
||||
___pubsub smallint DEFAULT '0'::smallint NOT NULL,
|
||||
"___subActive" smallint DEFAULT '0'::smallint NOT NULL,
|
||||
"___pubActive" smallint DEFAULT '0'::smallint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__federation_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__federation_id_seq OWNED BY public.__chart_day__federation.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__hashtag (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___local_users integer DEFAULT 0 NOT NULL,
|
||||
___remote_users integer DEFAULT 0 NOT NULL,
|
||||
unique_temp___local_users character varying[] DEFAULT '{}'::character varying[] NOT NULL,
|
||||
unique_temp___remote_users character varying[] DEFAULT '{}'::character varying[] NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__hashtag_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__hashtag_id_seq OWNED BY public.__chart_day__hashtag.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__instance (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___requests_failed smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___requests_succeeded smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___requests_received smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_inc integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_dec integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_diffs_normal integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_diffs_reply integer DEFAULT '0'::bigint NOT NULL,
|
||||
___notes_diffs_renote integer DEFAULT '0'::bigint NOT NULL,
|
||||
___users_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___users_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___users_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___following_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___following_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___following_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___followers_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___followers_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___followers_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_totalFiles" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_incFiles" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_incUsage" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_decFiles" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___drive_decUsage" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___notes_diffs_withFile" integer DEFAULT 0 NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__instance_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__instance_id_seq OWNED BY public.__chart_day__instance.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__network (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"___incomingRequests" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___outgoingRequests" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___totalTime" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___incomingBytes" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___outgoingBytes" integer DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__network_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__network_id_seq OWNED BY public.__chart_day__network.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__notes (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
___local_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_inc integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_dec integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_diffs_normal integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_diffs_reply integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_diffs_renote integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_inc integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_dec integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_diffs_normal integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_diffs_reply integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_diffs_renote integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___local_diffs_withFile" integer DEFAULT 0 NOT NULL,
|
||||
"___remote_diffs_withFile" integer DEFAULT 0 NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__notes_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__notes_id_seq OWNED BY public.__chart_day__notes.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__per_user_drive (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
"___totalCount" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___totalSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___incCount" smallint DEFAULT '0'::bigint NOT NULL,
|
||||
"___incSize" integer DEFAULT '0'::bigint NOT NULL,
|
||||
"___decCount" smallint DEFAULT '0'::bigint NOT NULL,
|
||||
"___decSize" integer DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__per_user_drive_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__per_user_drive_id_seq OWNED BY public.__chart_day__per_user_drive.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__per_user_following (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___local_followings_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followings_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followings_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followers_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followers_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___local_followers_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followings_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followings_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followings_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followers_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followers_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_followers_dec smallint DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__per_user_following_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__per_user_following_id_seq OWNED BY public.__chart_day__per_user_following.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__per_user_notes (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___diffs_normal smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___diffs_reply smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___diffs_renote smallint DEFAULT '0'::bigint NOT NULL,
|
||||
"___diffs_withFile" smallint DEFAULT '0'::smallint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__per_user_notes_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__per_user_notes_id_seq OWNED BY public.__chart_day__per_user_notes.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__per_user_reaction (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
"group" character varying(128) NOT NULL,
|
||||
___local_count smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_count smallint DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__per_user_reaction_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__per_user_reaction_id_seq OWNED BY public.__chart_day__per_user_reaction.id;
|
||||
|
||||
CREATE TABLE public.__chart_day__users (
|
||||
id integer NOT NULL,
|
||||
date integer NOT NULL,
|
||||
___local_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___local_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___local_dec smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_total integer DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_inc smallint DEFAULT '0'::bigint NOT NULL,
|
||||
___remote_dec smallint DEFAULT '0'::bigint NOT NULL
|
||||
);
|
||||
CREATE SEQUENCE public.__chart_day__users_id_seq
|
||||
AS integer
|
||||
START WITH 1
|
||||
INCREMENT BY 1
|
||||
NO MINVALUE
|
||||
NO MAXVALUE
|
||||
CACHE 1;
|
||||
ALTER SEQUENCE public.__chart_day__users_id_seq OWNED BY public.__chart_day__users.id;
|
||||
|
||||
-- emoji-moderator
|
||||
ALTER TABLE "user" DROP COLUMN "emojiModPerm";
|
||||
DROP TYPE "public"."user_emojimodperm_enum";
|
||||
|
||||
-- remove-nsfw-detection
|
||||
ALTER TABLE "user_profile" ADD "autoSensitive" boolean NOT NULL DEFAULT false;
|
||||
ALTER TABLE "meta" ADD "enableSensitiveMediaDetectionForVideos" boolean NOT NULL DEFAULT false;
|
||||
ALTER TABLE "meta" ADD "setSensitiveFlagAutomatically" boolean NOT NULL DEFAULT false;
|
||||
CREATE TYPE "public"."meta_sensitivemediadetectionsensitivity_enum" AS ENUM('medium', 'low', 'high', 'veryLow', 'veryHigh');
|
||||
ALTER TABLE "meta" ADD "sensitiveMediaDetectionSensitivity" "public"."meta_sensitivemediadetectionsensitivity_enum" NOT NULL DEFAULT 'medium';
|
||||
CREATE TYPE "public"."meta_sensitivemediadetection_enum" AS ENUM('none', 'all', 'local', 'remote');
|
||||
ALTER TABLE "meta" ADD "sensitiveMediaDetection" "public"."meta_sensitivemediadetection_enum" NOT NULL DEFAULT 'none';
|
||||
ALTER TABLE "drive_file" ADD "maybePorn" boolean NOT NULL DEFAULT false;
|
||||
ALTER TABLE "drive_file" ADD "maybeSensitive" boolean NOT NULL DEFAULT false;
|
||||
COMMENT ON COLUMN "drive_file"."maybeSensitive" IS 'Whether the DriveFile is NSFW. (predict)';
|
||||
|
||||
-- firefish-url-move
|
||||
UPDATE "meta" SET "repositoryUrl" = 'https://git.joinfirefish.org/firefish/firefish';
|
||||
UPDATE "meta" SET "feedbackUrl" = 'https://git.joinfirefish.org/firefish/firefish/issues';
|
||||
|
||||
-- remove-native-utils-migration
|
||||
CREATE TABLE "seaql_migrations" (
|
||||
version character varying NOT NULL,
|
||||
applied_at bigint NOT NULL
|
||||
);
|
||||
INSERT INTO "seaql_migrations" (version, applied_at)
|
||||
VALUES
|
||||
('m20230531_180824_drop_reversi', 1705876632),
|
||||
('m20230627_185451_index_note_url', 1705876632),
|
||||
('m20230709_000510_move_antenna_to_cache', 1705876632),
|
||||
('m20230806_170616_fix_antenna_stream_ids', 1705876632),
|
||||
('m20230904_013244_is_indexable', 1705876632),
|
||||
('m20231002_143323_remove_integrations', 1705876632)
|
||||
;
|
||||
|
||||
COMMIT;
|
72
docs/firefish.nginx.conf
Normal file
72
docs/firefish.nginx.conf
Normal file
|
@ -0,0 +1,72 @@
|
|||
# Replace example.tld with your domain
|
||||
|
||||
# For WebSocket
|
||||
map $http_upgrade $connection_upgrade {
|
||||
default upgrade;
|
||||
'' close;
|
||||
}
|
||||
|
||||
proxy_cache_path /tmp/nginx_cache levels=1:2 keys_zone=cache1:16m max_size=1g inactive=720m use_temp_path=off;
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name example.tld;
|
||||
|
||||
# For SSL domain validation
|
||||
root /var/www/html;
|
||||
location /.well-known/acme-challenge/ { allow all; }
|
||||
location /.well-known/pki-validation/ { allow all; }
|
||||
location / { return 301 https://$server_name$request_uri; }
|
||||
}
|
||||
|
||||
server {
|
||||
listen 443 ssl http2;
|
||||
listen [::]:443 ssl http2;
|
||||
server_name example.tld;
|
||||
|
||||
ssl_session_timeout 1d;
|
||||
ssl_session_cache shared:ssl_session_cache:10m;
|
||||
ssl_session_tickets off;
|
||||
|
||||
# To use Let's Encrypt certificate
|
||||
ssl_certificate /etc/letsencrypt/live/example.tld/fullchain.pem;
|
||||
ssl_certificate_key /etc/letsencrypt/live/example.tld/privkey.pem;
|
||||
|
||||
# To use Debian/Ubuntu's self-signed certificate (For testing or before issuing a certificate)
|
||||
#ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
|
||||
#ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
|
||||
|
||||
# SSL protocol settings
|
||||
ssl_protocols TLSv1.2 TLSv1.3;
|
||||
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
|
||||
ssl_prefer_server_ciphers off;
|
||||
ssl_stapling on;
|
||||
ssl_stapling_verify on;
|
||||
|
||||
# Change to your upload limit
|
||||
client_max_body_size 80m;
|
||||
|
||||
# Proxy to Node
|
||||
location / {
|
||||
proxy_pass http://127.0.0.1:3000;
|
||||
proxy_set_header Host $host;
|
||||
proxy_http_version 1.1;
|
||||
proxy_redirect off;
|
||||
|
||||
# If it's behind another reverse proxy or CDN, remove the following.
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
|
||||
# For WebSocket
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection $connection_upgrade;
|
||||
|
||||
# Cache settings
|
||||
proxy_cache cache1;
|
||||
proxy_cache_lock on;
|
||||
proxy_cache_use_stale updating;
|
||||
add_header X-Cache $upstream_cache_status;
|
||||
}
|
||||
}
|
54
docs/install-container.md
Normal file
54
docs/install-container.md
Normal file
|
@ -0,0 +1,54 @@
|
|||
# Running a Firefish server with containers
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Latest [Docker](https://docs.docker.com/get-docker/) installation
|
||||
- You can also use [Podman](https://podman.io/docs/installation) and [Podman Compose](https://github.com/containers/podman-compose).
|
||||
|
||||
## Configuration
|
||||
|
||||
Copy the example config files:
|
||||
|
||||
```sh
|
||||
cp docker-compose.example.yml docker-compose.yml
|
||||
cp .config/example.yml .config/default.yml
|
||||
cp .config/docker_example.env .config/docker.env
|
||||
```
|
||||
|
||||
then edit them according to your environment.
|
||||
You can configure `docker.env` with anything you like, but you will have to pay attention to the `default.yml` file:
|
||||
|
||||
- `url` should be set to the URL you will be hosting the web interface for the server at.
|
||||
- `host`, `db`, `user`, `pass` will have to be configured in the `PostgreSQL configuration` section - `host` is the name of the postgres container (eg: *firefish_db_1*), and the others should match your `docker.env`.
|
||||
- `host`will need to be configured in the *Redis configuration* section - it is the name of the redis container (eg: *firefish_redis_1*)
|
||||
|
||||
Everything else can be left as-is.
|
||||
|
||||
## Pull the container image
|
||||
|
||||
The image tag is [`registry.firefish.dev/firefish/firefish:latest`](https://firefish.dev/firefish/firefish/container_registry/1).
|
||||
|
||||
```sh
|
||||
docker pull registry.firefish.dev/firefish/firefish:latest
|
||||
# or podman pull registry.firefish.dev/firefish/firefish:latest
|
||||
```
|
||||
|
||||
## Enable database extension
|
||||
|
||||
```sh
|
||||
docker-compose up db --detach && sleep 5 && docker-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
|
||||
# or podman-compose up db --detach && sleep 5 && podman-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
|
||||
```
|
||||
|
||||
## Run
|
||||
|
||||
```sh
|
||||
docker compose up --detach
|
||||
# or podman-compose up --detach
|
||||
```
|
||||
|
||||
NOTE: This will take some time to come fully online, even after download and extracting the container images, and it may emit some error messages before completing successfully. Specifically, the `db` container needs to initialize and so isn't available to the `web` container right away. Only once the `db` container comes online does the `web` container start building and initializing the firefish tables.
|
||||
|
||||
Once the server is up you can use a web browser to access the web interface at `http://serverip:3000` (where `serverip` is the IP of the server you are running the firefish server on).
|
||||
|
||||
To publish your server, please follow the instructions in [section 5 of this installation guide](https://firefish.dev/firefish/firefish/-/blob/main/docs/install.md#5-preparation-for-publishing-a-server).
|
482
docs/install.md
Normal file
482
docs/install.md
Normal file
|
@ -0,0 +1,482 @@
|
|||
# Install Firefish
|
||||
|
||||
Please check the [v20240206 release note](https://firefish.dev/firefish/firefish/-/releases/v20240206) first. This project is barely maintained for those who really want to keep using Firefish. Please understand this before proceeding.
|
||||
|
||||
## Dependencies
|
||||
|
||||
Firefish depends on the following software.
|
||||
|
||||
### Runtime dependencies
|
||||
|
||||
- At least [NodeJS](https://nodejs.org/en/) v18.19.0 (v20/v22 recommended)
|
||||
- At least [PostgreSQL](https://www.postgresql.org/) v12 (v16 recommended) with [PGroonga](https://pgroonga.github.io/) extension
|
||||
- At least [Redis](https://redis.io/) v7 or [Valkey](https://valkey.io/) v7
|
||||
- Web Proxy (one of the following)
|
||||
- Caddy (recommended)
|
||||
- Nginx (recommended)
|
||||
- Apache
|
||||
- [FFmpeg](https://ffmpeg.org/) for video transcoding (**optional**)
|
||||
- Caching server (**optional**, one of the following)
|
||||
- [DragonflyDB](https://www.dragonflydb.io/)
|
||||
- [KeyDB](https://keydb.dev/)
|
||||
- Another [Redis](https://redis.io/) / [Valkey](https://valkey.io/) server
|
||||
|
||||
### Build dependencies
|
||||
|
||||
- At least [Rust](https://www.rust-lang.org/) v1.74
|
||||
- C/C++ compiler & build tools (like [GNU Make](https://www.gnu.org/software/make/))
|
||||
- `build-essential` on Debian/Ubuntu Linux
|
||||
- `base-devel` on Arch Linux
|
||||
- `"Development Tools"` on Fedora/Red Hat Linux
|
||||
- [Python 3](https://www.python.org/)
|
||||
- [Perl](https://www.perl.org/)
|
||||
|
||||
This document shows an example procedure for installing these dependencies and Firefish on Debian 12. Note that there is much room for customizing the server setup; this document merely demonstrates a simple installation.
|
||||
|
||||
### Install on non-Linux systems
|
||||
|
||||
We don't test Firefish on non-Linux systems, so please install Firefish on such an environment **only if you can address any problems yourself**. There is absolutely no support. That said, it is possible to install Firefish on some non-Linux systems.
|
||||
|
||||
<details>
|
||||
|
||||
<summary>Possible setup on FreeBSD (as of version <code>20240725</code>)</summary>
|
||||
|
||||
You can install Firefish on FreeBSD by adding these extra steps to the standard instructions:
|
||||
|
||||
1. Install `vips` package
|
||||
2. Add the following block to [`package.json`](../package.json)
|
||||
```json
|
||||
"pnpm": {
|
||||
"overrides": {
|
||||
"rollup": "npm:@rollup/wasm-node
|
||||
}
|
||||
}
|
||||
```
|
||||
3. Create an rc script for Firefish
|
||||
```sh
|
||||
#!/bin/sh
|
||||
|
||||
# PROVIDE: firefish
|
||||
# REQUIRE: DAEMON redis caddy postgresql
|
||||
# KEYWORD: shutdown
|
||||
|
||||
. /etc/rc.subr
|
||||
|
||||
name=firefish
|
||||
rcvar=firefish_enable
|
||||
|
||||
desc="Firefish daemon"
|
||||
|
||||
load_rc_config ${name}
|
||||
|
||||
: ${firefish_chdir:="/path/to/firefish/local/repository"}
|
||||
: ${firefish_env:="npm_config_cache=/tmp NODE_ENV=production NODE_OPTIONS=--max-old-space-size=3072"}
|
||||
|
||||
pidfile="/var/run/${name}.pid"
|
||||
command=/usr/sbin/daemon
|
||||
command_args="-f -S -u firefish -P ${pidfile} /usr/local/bin/pnpm run start"
|
||||
|
||||
run_rc_command "$1"
|
||||
```
|
||||
|
||||
</details>
|
||||
|
||||
Please let us know if you deployed Firefish on a curious environment :smile:
|
||||
|
||||
### Use Docker/Podman containers
|
||||
|
||||
If you want to use the pre-built container image, please refer to [`install-container.md`](./install-container.md).
|
||||
|
||||
## 1. Install dependencies
|
||||
|
||||
Make sure that you can use the `sudo` command before proceeding.
|
||||
|
||||
### Utilities
|
||||
|
||||
```sh
|
||||
sudo apt update
|
||||
sudo apt install build-essential python3 curl wget git lsb-release
|
||||
```
|
||||
|
||||
### Node.js and pnpm
|
||||
|
||||
Instructions can be found at [this repository](https://github.com/nodesource/distributions).
|
||||
|
||||
```sh
|
||||
NODE_MAJOR=20
|
||||
curl -fsSL "https://deb.nodesource.com/setup_${NODE_MAJOR}.x" | sudo -E bash -
|
||||
sudo apt install nodejs
|
||||
|
||||
# check version
|
||||
node --version
|
||||
```
|
||||
|
||||
You also need to enable `pnpm`.
|
||||
```sh
|
||||
sudo corepack enable
|
||||
corepack prepare pnpm@latest --activate
|
||||
|
||||
# check version
|
||||
pnpm --version
|
||||
```
|
||||
|
||||
### PostgreSQL and PGroonga
|
||||
|
||||
PostgreSQL install instructions can be found at [this page](https://www.postgresql.org/download/).
|
||||
|
||||
```sh
|
||||
sudo sh -c 'echo "deb https://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
|
||||
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
|
||||
sudo apt update
|
||||
sudo apt install postgresql-16
|
||||
|
||||
sudo systemctl enable --now postgresql
|
||||
|
||||
# check version
|
||||
psql --version
|
||||
```
|
||||
|
||||
PGroonga install instructions can be found at [this page](https://pgroonga.github.io/install/).
|
||||
|
||||
```sh
|
||||
wget "https://apache.jfrog.io/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
sudo apt install "./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
wget "https://packages.groonga.org/debian/groonga-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
sudo apt install "./groonga-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
sudo apt update
|
||||
sudo apt install postgresql-16-pgdg-pgroonga
|
||||
|
||||
rm "apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb" "groonga-apt-source-latest-$(lsb_release --codename --short).deb"
|
||||
```
|
||||
|
||||
### Redis
|
||||
|
||||
Instructions can be found at [this page](https://redis.io/docs/install/install-redis/).
|
||||
|
||||
```sh
|
||||
curl -fsSL https://packages.redis.io/gpg | sudo gpg --dearmor -o /usr/share/keyrings/redis-archive-keyring.gpg
|
||||
echo "deb [signed-by=/usr/share/keyrings/redis-archive-keyring.gpg] https://packages.redis.io/deb $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/redis.list
|
||||
sudo apt update
|
||||
sudo apt install redis
|
||||
|
||||
sudo systemctl enable --now redis-server
|
||||
|
||||
# check version
|
||||
redis-cli --version
|
||||
```
|
||||
|
||||
### FFmpeg
|
||||
|
||||
```sh
|
||||
sudo apt install ffmpeg
|
||||
```
|
||||
|
||||
## 2. Set up a database
|
||||
|
||||
1. Create a database user
|
||||
```sh
|
||||
sudo -u postgres createuser --no-createdb --no-createrole --no-superuser --encrypted --pwprompt firefish
|
||||
```
|
||||
If you forgot the password you typed, you can reset it by executing `sudo -u postgres psql -c "ALTER USER firefish PASSWORD 'password';"`.
|
||||
2. Create a database
|
||||
```sh
|
||||
sudo -u postgres createdb --encoding='UTF8' --owner=firefish firefish_db
|
||||
```
|
||||
3. Enable PGronnga extension
|
||||
```sh
|
||||
sudo -u postgres psql --command='CREATE EXTENSION pgroonga;' --dbname=firefish_db
|
||||
```
|
||||
|
||||
## 3. Configure Firefish
|
||||
|
||||
1. Create an user for Firefish and switch user
|
||||
```sh
|
||||
sudo useradd --create-home --user-group --shell /bin/bash firefish
|
||||
sudo su --login firefish
|
||||
|
||||
# check the current working directory
|
||||
# the result should be /home/firefish
|
||||
pwd
|
||||
```
|
||||
1. Install Rust toolchain
|
||||
|
||||
Instructions can be found at [this page](https://www.rust-lang.org/tools/install).
|
||||
|
||||
```sh
|
||||
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
|
||||
. "${HOME}/.cargo/env"
|
||||
|
||||
# check version
|
||||
cargo --version
|
||||
```
|
||||
3. Clone the Firefish repository
|
||||
```sh
|
||||
git clone --branch=main https://firefish.dev/firefish/firefish.git
|
||||
```
|
||||
1. Copy and edit the config file
|
||||
```sh
|
||||
cd firefish
|
||||
cp .config/example.yml .config/default.yml
|
||||
nano .config/default.yml
|
||||
```
|
||||
|
||||
```yaml
|
||||
url: https://your-server-domain.example.com # change here
|
||||
port: 3000
|
||||
|
||||
db:
|
||||
host: localhost
|
||||
port: 5432
|
||||
db: firefish_db
|
||||
user: firefish
|
||||
pass: your-database-password # and here
|
||||
```
|
||||
|
||||
## 4. Build Firefish
|
||||
|
||||
1. Build
|
||||
```sh
|
||||
pnpm install --frozen-lockfile
|
||||
NODE_ENV=production NODE_OPTIONS='--max-old-space-size=3072' pnpm run build
|
||||
```
|
||||
1. Execute database migrations
|
||||
```sh
|
||||
pnpm run migrate
|
||||
```
|
||||
1. Logout from `firefish` user
|
||||
```sh
|
||||
exit
|
||||
```
|
||||
|
||||
## 5. Preparation for publishing a server
|
||||
|
||||
### 1. Set up a firewall
|
||||
|
||||
To expose your server securely, you may want to set up a firewall. We use [ufw](https://launchpad.net/ufw) in this instruction.
|
||||
|
||||
```sh
|
||||
sudo apt install ufw
|
||||
# if you use SSH
|
||||
# SSH_PORT=22
|
||||
# sudo ufw limit "${SSH_PORT}/tcp"
|
||||
sudo ufw default deny
|
||||
sudo ufw allow 80
|
||||
sudo ufw allow 443
|
||||
sudo ufw --force enable
|
||||
|
||||
# check status
|
||||
sudo ufw status
|
||||
```
|
||||
|
||||
### 2. Set up a reverse proxy
|
||||
|
||||
In this instruction, we use [Caddy](https://caddyserver.com/) to make the Firefish server accesible from internet. However, you can also use [Nginx](https://nginx.org/en/) if you want ([example Nginx config file](./firefish.nginx.conf)).
|
||||
|
||||
1. Install Caddy
|
||||
```sh
|
||||
sudo apt install debian-keyring debian-archive-keyring apt-transport-https
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/gpg.key' | sudo gpg --dearmor -o /usr/share/keyrings/caddy-stable-archive-keyring.gpg
|
||||
curl -1sLf 'https://dl.cloudsmith.io/public/caddy/stable/debian.deb.txt' | sudo tee /etc/apt/sources.list.d/caddy-stable.list
|
||||
sudo apt update
|
||||
sudo apt install caddy
|
||||
|
||||
# check version
|
||||
caddy version
|
||||
```
|
||||
1. Replace the config file
|
||||
```sh
|
||||
sudo mv /etc/caddy/Caddyfile /etc/caddy/Caddyfile.bak
|
||||
sudo nano /etc/caddy/Caddyfile
|
||||
```
|
||||
|
||||
```Caddyfile
|
||||
your-server-domain.example.com {
|
||||
reverse_proxy http://127.0.0.1:3000
|
||||
|
||||
log {
|
||||
output file /var/log/caddy/firefish.log
|
||||
}
|
||||
}
|
||||
```
|
||||
1. Restart Caddy
|
||||
```sh
|
||||
sudo systemctl restart caddy
|
||||
```
|
||||
|
||||
## 6. Publish your Firefish server
|
||||
|
||||
1. Create a service file
|
||||
```sh
|
||||
sudo nano /etc/systemd/system/firefish.service
|
||||
```
|
||||
|
||||
```service
|
||||
[Unit]
|
||||
Description=Firefish daemon
|
||||
Requires=redis.service caddy.service postgresql.service
|
||||
After=redis.service caddy.service postgresql.service network-online.target
|
||||
|
||||
[Service]
|
||||
Type=simple
|
||||
User=firefish
|
||||
Group=firefish
|
||||
UMask=0027
|
||||
ExecStart=/usr/bin/pnpm run start
|
||||
WorkingDirectory=/home/firefish/firefish
|
||||
Environment="NODE_ENV=production"
|
||||
Environment="npm_config_cache=/tmp"
|
||||
Environment="NODE_OPTIONS=--max-old-space-size=3072"
|
||||
# uncomment the following line if you use jemalloc (note that the path varies on different environments)
|
||||
# Environment="LD_PRELOAD=/usr/lib/x86_64-linux-gnu/libjemalloc.so.2"
|
||||
StandardOutput=journal
|
||||
StandardError=journal
|
||||
SyslogIdentifier=firefish
|
||||
TimeoutSec=60
|
||||
Restart=always
|
||||
|
||||
CapabilityBoundingSet=
|
||||
DevicePolicy=closed
|
||||
NoNewPrivileges=true
|
||||
LockPersonality=true
|
||||
PrivateDevices=true
|
||||
PrivateIPC=true
|
||||
PrivateMounts=true
|
||||
PrivateUsers=true
|
||||
ProtectClock=true
|
||||
ProtectControlGroups=true
|
||||
ProtectHostname=true
|
||||
ProtectKernelTunables=true
|
||||
ProtectKernelModules=true
|
||||
ProtectKernelLogs=true
|
||||
ProtectProc=invisible
|
||||
RestrictNamespaces=true
|
||||
RestrictRealtime=true
|
||||
RestrictSUIDSGID=true
|
||||
SecureBits=noroot-locked
|
||||
SystemCallArchitectures=native
|
||||
SystemCallFilter=~@chown @clock @cpu-emulation @debug @ipc @keyring @memlock @module @mount @obsolete @privileged @raw-io @reboot @resources @setuid @swap
|
||||
SystemCallFilter=capset pipe pipe2 setpriority
|
||||
|
||||
[Install]
|
||||
WantedBy=multi-user.target
|
||||
```
|
||||
1. Start Firefish
|
||||
```sh
|
||||
sudo systemctl enable --now firefish
|
||||
```
|
||||
|
||||
# Maintain the server
|
||||
|
||||
## Upgrade Firefish version
|
||||
|
||||
Please refer to the [upgrade instruction](https://firefish.dev/firefish/firefish/-/blob/main/docs/upgrade.md). Be sure to switch to `firefish` user and go to the Firefish directory before executing the `git` command:
|
||||
|
||||
```sh
|
||||
sudo su --login firefish
|
||||
cd ~/firefish
|
||||
```
|
||||
|
||||
## Rotate logs
|
||||
|
||||
As the server runs longer and longer, the size of the log files increases, filling up the disk space. To prevent this, you should set up a log rotation (removing old logs automatically).
|
||||
|
||||
You can edit the `SystemMaxUse` value in the `[journal]` section of `/etc/systemd/journald.conf` to do it:
|
||||
|
||||
```conf
|
||||
[journal]
|
||||
... (omitted)
|
||||
SystemMaxUse=500M
|
||||
...
|
||||
```
|
||||
|
||||
Make sure to remove the leading `#` to uncomment the line. After editing the config file, you need to restart `systemd-journald` service.
|
||||
|
||||
```sh
|
||||
sudo systemctl restart systemd-journald
|
||||
```
|
||||
|
||||
It is also recommended that you change the [PGroonga log level](https://pgroonga.github.io/reference/parameters/log-level.html). The default level is `notice`, but this is too verbose for daily use.
|
||||
|
||||
To control the log level, add this line to your `postgresql.conf`:
|
||||
|
||||
```conf
|
||||
pgroonga.log_level = error
|
||||
```
|
||||
|
||||
You can check the `postgresql.conf` location by this command:
|
||||
|
||||
```sh
|
||||
sudo --user=postgres psql --command='SHOW config_file'
|
||||
```
|
||||
|
||||
The PGroonga log file (`pgroonga.log`) is located under this directory:
|
||||
|
||||
```sh
|
||||
sudo --user=postgres psql --command='SHOW data_directory'
|
||||
```
|
||||
|
||||
## Tune database configuration
|
||||
|
||||
The default PostgreSQL configuration is not suitable for running a Firefish server. So, it is highly recommended that you use [PGTune](https://pgtune.leopard.in.ua/) to tweak the configuration.
|
||||
|
||||
Here is an example set of parameters you can provide to PGTune:
|
||||
|
||||
| Parameter | Value |
|
||||
|----------------------:|---------------------------------------------------------|
|
||||
| DB version | 16 (your PostgreSQL major version) |
|
||||
| OS Type | Linux |
|
||||
| DB Type | Data warehouse |
|
||||
| Total Memory | [total physical memory] minus 700 MB |
|
||||
| Number of CPUs | number of CPU threads (or lower value if you have many) |
|
||||
| Number of connections | 200 |
|
||||
| Data storage | SSD storage |
|
||||
|
||||
Since a Firefish server is not a dedicated database server, be sure to leave some memory space for other software such as Firefish, Redis, and reverse proxy.
|
||||
|
||||
Once you have entered the appropriate values for your environment, click the "Generate" button to generate a configuration and replace the values in `postgresql.conf` with the suggested values.
|
||||
|
||||
After that, you need to restart the PostgreSQL service.
|
||||
|
||||
```sh
|
||||
sudo systemctl stop firefish
|
||||
sudo systemctl restart postgresql
|
||||
sudo systemctl start firefish
|
||||
```
|
||||
|
||||
## VACUUM your database
|
||||
|
||||
If the database runs long, accumulated "garbage" can degrade its performance or cause problems. To prevent this, you should `VACUUM` your database regularly.
|
||||
|
||||
```sh
|
||||
sudo systemctl stop firefish
|
||||
sudo --user=postgres psql --dbname=firefish_db --command='VACUUM FULL VERBOSE ANALYZE'
|
||||
sudo systemctl start firefish
|
||||
```
|
||||
|
||||
Note that this operation takes some time.
|
||||
|
||||
## Customize
|
||||
|
||||
- To add custom CSS for all users, edit `./custom/assets/instance.css`.
|
||||
- To add static assets (such as images for the splash screen), place them in the `./custom/assets/` directory. They'll then be available on `https://yourserver.tld/static-assets/filename.ext`.
|
||||
- To add custom locales, place them in the `./custom/locales/` directory. If you name your custom locale the same as an existing locale, it will overwrite it. If you give it a unique name, it will be added to the list. Also make sure that the first part of the filename matches the locale you're basing it on. (Example: `en-FOO.yml`)
|
||||
- To add custom error images, place them in the `./custom/assets/badges` directory, replacing the files already there.
|
||||
- To add custom sounds, place only mp3 files in the `./custom/assets/sounds` directory.
|
||||
- To update custom assets without rebuilding, just run `pnpm run build:assets`.
|
||||
- To block ChatGPT, CommonCrawl, or other crawlers from indexing your instance, uncomment the respective rules in `./custom/robots.txt`.
|
||||
|
||||
## Tips & Tricks
|
||||
|
||||
- When editing the config file, please don't fill out the settings at the bottom. They're designed *only* for managed hosting, not self hosting. Those settings are much better off being set in Firefish's control panel.
|
||||
- Port 3000 (used in the default config) might be already used on your server for something else. To find an open port for Firefish, run `for p in {3000..4000}; do ss -tlnH | tr -s ' ' | cut -d" " -sf4 | grep -q "${p}$" || echo "${p}"; done | head -n 1`. Replace 3000 with the minimum port and 4000 with the maximum port if you need it.
|
||||
- We'd recommend you use a S3 Bucket/CDN for Object Storage, especially if you use containers.
|
||||
- When using object storage, setting a proper `Access-Control-Allow-Origin` response header is highly recommended.
|
||||
- We'd recommend against using CloudFlare, but if you do, make sure to turn code minification off.
|
||||
- For push notifications, run `npx web-push generate-vapid-keys`, then put the public and private keys into Control Panel > General > ServiceWorker.
|
||||
- For translations, make a [DeepL](https://deepl.com) account and generate an API key, then put it into Control Panel > General > DeepL Translation.
|
||||
- To add another admin account:
|
||||
- Go to the user's page > 3 Dots > About > Moderation > turn on "Moderator"
|
||||
- Go back to Overview > click the clipboard icon next to the ID
|
||||
- Run `psql -d firefish` (or whatever the database name is)
|
||||
- Run `UPDATE "user" SET "isAdmin" = true WHERE id='999999';` (replace `999999` with the copied ID)
|
||||
- Restart your Firefish server
|
410
docs/notice-for-admins.md
Normal file
410
docs/notice-for-admins.md
Normal file
|
@ -0,0 +1,410 @@
|
|||
# Notice for server administrators
|
||||
|
||||
You can skip intermediate versions when upgrading from an old version, but please read the notices and follow the instructions for each intermediate version before [upgrading](https://firefish.dev/firefish/firefish/-/blob/main/docs/upgrade.md).
|
||||
|
||||
## Upcoming breaking change (unreleased)
|
||||
|
||||
Please take a look at #10947.
|
||||
|
||||
## v20240725
|
||||
|
||||
### For LibreTranslate self-hosters
|
||||
|
||||
Previously, neither the DeepL API nor the LibreTranslate API provided traditional Chinese translations, so we used to provide traditional Chinese post translations using manual conversion from simplified Chinese translations.
|
||||
|
||||
However, now that LibreTranslate API supports traditional Chinese translations, we have removed the manual conversion process for LibreTranslate. So, if you are hosting your LibreTranslate instance, please ensure your LibreTranslate version is new enough to support traditional Chinese.
|
||||
|
||||
## v20240714
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
You can remove the `packages/megalodon` directory after pulling the latest source code (`git pull --ff origin main`).
|
||||
|
||||
```sh
|
||||
rm --recursive --force packages/megalodon
|
||||
```
|
||||
|
||||
## v20240710
|
||||
|
||||
### For all users
|
||||
|
||||
This is not related to the recent changes, but we have added a new section called "[Maintain the server](https://firefish.dev/firefish/firefish/-/blob/v20240710/docs/install.md#maintain-the-server)" in the installation guide. We suggest that you take a look at it (and we welcome your docs contributions)!
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
It is highly recommended that you upgrade Node.js, since [there is a new security release](<https://nodejs.org/en/blog/vulnerability/july-2024-security-releases>).
|
||||
|
||||
The new versions are:
|
||||
- Node v18.20.4 (v18.x LTS)
|
||||
- Node v20.15.1 (v20.x LTS)
|
||||
- Node v22.4.1 (v22.x)
|
||||
|
||||
[Node v21.x is end-of-life](<https://github.com/nodejs/Release?tab=readme-ov-file#end-of-life-releases>).
|
||||
|
||||
### :warning: For Docker/Podman users
|
||||
|
||||
This is a security release for you, since the container image for this version is based on the updated Node.js image.
|
||||
|
||||
## v20240607
|
||||
|
||||
The following environment variables are deprecated and no longer have any effect:
|
||||
- `MK_ONLY_QUEUE`
|
||||
- `MK_ONLY_SERVER`
|
||||
- `MK_NO_DAEMONS`
|
||||
- `MK_DISABLE_CLUSTERING`
|
||||
- `MK_VERBOSE`
|
||||
- `MK_WITH_LOG_TIME`
|
||||
- `MK_SLOW`
|
||||
|
||||
## v20240601
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
Required Node.js version has been bumped from v18.17.0 to v18.19.0. Also, as written in the [v20240430 note](https://firefish.dev/firefish/firefish/-/blob/d3394b97f021dea323ec3ae36e39930680242482/docs/notice-for-admins.md#v20240430), it is highly recommended that you use an even newer version since v18.19.0 has known vulnerabilities.
|
||||
|
||||
## v20240523
|
||||
|
||||
### For all users
|
||||
|
||||
We regret to inform you that the upgrade may take a long time to fix a regression we have introduced. The time required to upgrade should be the same as [v20240413](<https://firefish.dev/firefish/firefish/-/blob/main/docs/notice-for-admins.md#v20240413>). This is not a security fix, so please upgrade your server when you have enough time. We are sorry for the inconvenience.
|
||||
|
||||
<details>
|
||||
|
||||
There are two data types in PostgreSQL to store time: `timestamptz` (`timestamp with time zone`) and `timestamp` (`timestamp without time zone`) [[ref]](<https://www.postgresql.org/docs/current/datatype-datetime.html>).
|
||||
|
||||
In Node.js, we manipulate the database using [TypeORM](<https://typeorm.io/>). TypeORM handles time data as a JavaScript `Date` object. Since `Date` doesn't have timezone information [[ref]](<https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date#date_components_and_time_zones>), we don't use the timezone information in the Node.js backend, and both `timestamptz` and `timestamp` behave in the same way. (Technically, the type names are a little confusing, and `timestamptz` (`timestamp with time zone`) doesn't store the timezone data either. Please read PostgreSQL documentation for more information.)
|
||||
|
||||
In Rust, we manipulate the database using [SeaORM](<https://www.sea-ql.org/SeaORM/>), which does distinguish between `timestamptz` and `timestamp`. `timestamptz` is converted to [`DateTime<FixedOffset>`](<https://docs.rs/chrono/latest/chrono/struct.DateTime.html>) type, whereas `timestamp` is converted to [`NaiveDateTime`](<https://docs.rs/chrono/latest/chrono/struct.NaiveDateTime.html>).
|
||||
|
||||
We are using [napi-rs](<https://napi.rs/>) to implement some of the backend features in Rust, which did not support `DateTime<FixedOffset>`. We used to store time data as `timestamptz`, but we converted them to `timestamp` for this reason. As we don't use timezone data, we thought this was okay, and indeed it worked fine.
|
||||
|
||||
However, we did not consider the case of migrating a server (hardware) to another timezone. With `timestamp`, there may be inconsistencies in the time data if you migrate your server to another system with a different timezone setting (Docker/Podman users should not be affected by this, as UTC is always used in containers unless you explicitly set one).
|
||||
|
||||
Therefore, we have contributed to napi-rs to add support for `DateTime<FixedOffset>` (<https://github.com/napi-rs/napi-rs/pull/2074>) and decided to migrate back from `timestamp` to `timestamptz` to properly address this problem. The migration process takes time roughly proportional to the number of stored posts.
|
||||
|
||||
</details>
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
There is a bug where `pnpm install --frozen-lockfile` may fail on Linux 6.9.0, 6.9.1, and 6.9.2 ([GitHub issue](<https://github.com/nodejs/node/issues/53051>)).
|
||||
|
||||
To check your Linux kernel version, run:
|
||||
|
||||
```sh
|
||||
uname --kernel-release
|
||||
```
|
||||
|
||||
## v20240516
|
||||
|
||||
### For all users
|
||||
|
||||
Firefish is now compatible with [Node v22](https://nodejs.org/en/blog/announcements/v22-release-announce). The pre-built OCI container image will still be using the latest LTS version (v20.13.1 as of now).
|
||||
|
||||
## v20240430
|
||||
|
||||
### For all users
|
||||
|
||||
You can control the verbosity of the server log by adding `maxLogLevel` in `.config/default.yml`. `logLevels` has been deprecated in favor of this setting. (see also: <https://firefish.dev/firefish/firefish/-/blob/eac0c1c47cd23789dcc395ab08b074934409fd96/.config/example.yml#L152>)
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
- You need to install Perl to build Firefish. Since Git depends on Perl in many packaging systems, you probably already have Perl installed on your system. You can check the Perl version by this command:
|
||||
```sh
|
||||
perl --version
|
||||
```
|
||||
- Not only Firefish but also Node.js has recently fixed a few security issues:
|
||||
- https://nodejs.org/en/blog/vulnerability/april-2024-security-releases
|
||||
- https://nodejs.org/en/blog/vulnerability/april-2024-security-releases-2
|
||||
|
||||
So, it is highly recommended that you upgrade your Node.js version as well. The new versions are
|
||||
- Node v18.20.2 (v18.x LTS)
|
||||
- Node v20.12.2 (v20.x LTS)
|
||||
- Node v21.7.3 (v21.x)
|
||||
|
||||
You can check your Node.js version by this command:
|
||||
```sh
|
||||
node --version
|
||||
```
|
||||
[Node v22](https://nodejs.org/en/blog/announcements/v22-release-announce) was also released several days ago, but we have not yet tested Firefish with this version.
|
||||
|
||||
## v20240413
|
||||
|
||||
### For all users
|
||||
|
||||
Upgrading may take a long time due to the large changes in the database. Please make sure to perform the operations when you have time.
|
||||
|
||||
The time required to upgrade varies greatly depending on the database size and the environment. For reference, we have checked that the database migration takes
|
||||
|
||||
- 70 seconds if the database stores 600,000 posts
|
||||
- 28 minutes if the database stores 12,000,000 posts
|
||||
|
||||
(i.e., it takes roughly (𝑛 / 470,000) minutes where 𝑛 is the number of posts) on a server with 2 GB of RAM. You may want to tweak your database configuration (`postgres.conf`) if the process is significantly slower than our experimental result.
|
||||
|
||||
The number of posts stored on your database can be found at `https://yourserver.example.com/admin/database` (or `notesCount` of `stats` API response).
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
- Please remove `packages/backend-rs/target` before building Firefish.
|
||||
```sh
|
||||
rm --recursive --force packages/backend-rs/target
|
||||
```
|
||||
- Please do not terminate `pnpm run migrate` even if it appears to be frozen.
|
||||
|
||||
### For Docker/Podman users
|
||||
|
||||
You may not be able to access your server for a while after starting the container.
|
||||
|
||||
## v20240326
|
||||
|
||||
### For Docker/Podman users
|
||||
|
||||
The Firefish OCI container image is now based on [`docker.io/node:20-alpine`](https://hub.docker.com/layers/library/node/20-alpine/images/sha256-121edf6661770d20483818426b32042da33323b6fd30fc1ad4cd6890a817e240) (migrated from Debian to Alpine). This is a notification only and no action is required.
|
||||
|
||||
## v20240319
|
||||
|
||||
The full-text search engine used in Firefish has been changed to [PGroonga](https://pgroonga.github.io/). This is no longer an optional feature, so please enable PGroonga on your system. If you are using Sonic, Meilisearch, or Elasticsearch, you can also uninstall it from your system and remove the settings from `.config/default.yml`.
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
- Required Node.js version has been bumped from v18.16.0 to v18.17.0.
|
||||
- You need to install PGroonga on your system. Please follow the instructions below.
|
||||
|
||||
[Edit (2024/03/23 23:55 UTC+9)] ~~**Warning**: You may fail to install PGroonga, since the package registry of Apache Arrow (one of the subdependencies of PGroonga) is currently down ([GitHub issue](https://github.com/apache/arrow/issues/40759)). We recommend that you hold off on upgrading until this problem is resolved.~~
|
||||
|
||||
[Edit (2024/03/25 22:31 UTC+9)] The Apache Arrow repository is now back up and running again.
|
||||
|
||||
#### 1. Install PGroonga
|
||||
|
||||
Please execute `psql --version` to check your PostgreSQL major version. This will print a message like this:
|
||||
|
||||
```text
|
||||
psql (PostgreSQL) 16.1
|
||||
```
|
||||
|
||||
In this case, your PostgreSQL major version is `16`.
|
||||
|
||||
There are official installation instructions for many operating systems on <https://pgroonga.github.io/install>, so please follow the instructions on this page. However, since many users are using Ubuntu LTS or Debian, and there are no instructions for Arch Linux and Fedora, we explicitly list the instructions for Ubuntu LTS, Debian, Arch Linux and Fedora here. Please keep in mind that this is not official information and the procedures may change.
|
||||
|
||||
##### Ubuntu LTS
|
||||
|
||||
1. Install subdependencies
|
||||
```sh
|
||||
sudo apt install -y software-properties-common
|
||||
sudo add-apt-repository -y universe
|
||||
sudo add-apt-repository -y ppa:groonga/ppa
|
||||
sudo apt install -y wget lsb-release
|
||||
wget https://packages.groonga.org/ubuntu/groonga-apt-source-latest-$(lsb_release --codename --short).deb
|
||||
sudo apt install -y -V ./groonga-apt-source-latest-$(lsb_release --codename --short).deb
|
||||
```
|
||||
2. Install PGroonga (replace `16` with your PostgreSQL version)
|
||||
```sh
|
||||
sudo apt install postgresql-16-pgdg-pgroonga
|
||||
|
||||
# Depending on your PostgreSQL installation method,
|
||||
# the above command may fail and you need to run
|
||||
# the following instead:
|
||||
# sudo apt install postgresql-16-pgroonga
|
||||
```
|
||||
|
||||
##### Debian
|
||||
|
||||
1. Install subdependencies
|
||||
```sh
|
||||
sudo apt install -y -V ca-certificates lsb-release wget
|
||||
wget https://apache.jfrog.io/artifactory/arrow/$(lsb_release --id --short | tr 'A-Z' 'a-z')/apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
|
||||
sudo apt install -y -V ./apache-arrow-apt-source-latest-$(lsb_release --codename --short).deb
|
||||
wget https://packages.groonga.org/debian/groonga-apt-source-latest-$(lsb_release --codename --short).deb
|
||||
sudo apt install -y -V ./groonga-apt-source-latest-$(lsb_release --codename --short).deb
|
||||
```
|
||||
2. Install PGroonga (replace `16` with your PostgreSQL version)
|
||||
```sh
|
||||
sudo apt install postgresql-16-pgdg-pgroonga
|
||||
|
||||
# Depending on your PostgreSQL installation method,
|
||||
# the above command may fail and you need to run
|
||||
# the following instead:
|
||||
# sudo apt install postgresql-16-pgroonga
|
||||
```
|
||||
|
||||
##### Arch Linux
|
||||
|
||||
You can install PGroonga from the Arch User Repository.
|
||||
|
||||
```sh
|
||||
git clone https://aur.archlinux.org/pgroonga.git && cd pgroonga && makepkg -si
|
||||
# or paru -S pgroonga
|
||||
# or yay -S pgroonga
|
||||
```
|
||||
|
||||
##### Fedora
|
||||
|
||||
You need to build PGroonga from source and create a policy package.
|
||||
|
||||
```sh
|
||||
sudo dnf install make groonga-devel postgresql-server-devel redhat-rpm-config
|
||||
wget https://packages.groonga.org/source/pgroonga/pgroonga-3.1.8.tar.gz
|
||||
tar xvf pgroonga-3.1.8.tar.gz
|
||||
cd pgroonga-3.1.8
|
||||
make
|
||||
sudo make install
|
||||
```
|
||||
|
||||
```sh
|
||||
cat > pgroonga.te << EOF
|
||||
module pgroonga 1.0;
|
||||
|
||||
require {
|
||||
type postgresql_t;
|
||||
type postgresql_db_t;
|
||||
class file map;
|
||||
}
|
||||
|
||||
allow postgresql_t postgresql_db_t:file map;
|
||||
EOF
|
||||
```
|
||||
|
||||
```sh
|
||||
checkmodule -M -m -o pgroonga.mod pgroonga.te
|
||||
semodule_package -o pgroonga.pp -m pgroonga.mod
|
||||
sudo semodule -i pgroonga.pp
|
||||
```
|
||||
|
||||
#### 2. Enable PGroonga
|
||||
|
||||
After the instllation, please execute this command to enable PGroonga:
|
||||
|
||||
```sh
|
||||
sudo --user=postgres psql --dbname=your_database_name --command='CREATE EXTENSION pgroonga;'
|
||||
```
|
||||
|
||||
The database name can be found in `.config/default.yml`.
|
||||
```yaml
|
||||
db:
|
||||
port: 5432
|
||||
db: database_name # substitute your_database_name with this
|
||||
user: firefish
|
||||
pass: password
|
||||
```
|
||||
|
||||
### For Docker/Podman users
|
||||
|
||||
Please edit your `docker-compose.yml` to replace the database container image from `docker.io/postgres` to `docker.io/groonga/pgroonga`.
|
||||
|
||||
The list of tags can be found on <https://hub.docker.com/r/groonga/pgroonga/tags>. Tags are named as `{PGroonga version}-{alpine or debian}-{PostgreSQL major version}`.
|
||||
|
||||
Please make sure to use the same PostgreSQL version. If you are using `docker.io/postgres:16-alpine` (PostgreSQL v16), the corresponding image is `docker.io/groonga/pgroonga:3.1.8-alpine-16` (or `docker.io/groonga/pgroonga:3.1.8-alpine-16-slim`). There are also tags called `latest-alpine-16` and `latest-alpine-16-slim`, but please be careful if you use these tags since [PGroonga may introduce breaking changes](https://pgroonga.github.io/upgrade/), similar to PostgreSQL.
|
||||
|
||||
```yaml
|
||||
db:
|
||||
restart: unless-stopped
|
||||
image: docker.io/groonga/pgroonga:3.1.8-alpine-16-slim # change here
|
||||
container_name: firefish_db
|
||||
```
|
||||
|
||||
After that, execute this command to enable PGroonga:
|
||||
|
||||
```sh
|
||||
docker-compose up db --detach && sleep 5 && docker-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
|
||||
# or podman-compose up db --detach && sleep 5 && podman-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
|
||||
```
|
||||
|
||||
Once this is done, you can start Firefish as usual.
|
||||
|
||||
```sh
|
||||
docker pull registry.firefish.dev/firefish/firefish && docker-compose up --detach
|
||||
# or podman pull registry.firefish.dev/firefish/firefish && podman-compose up --detach
|
||||
```
|
||||
|
||||
## v20240301
|
||||
|
||||
### For all users
|
||||
|
||||
A new setting item has been added to control the log levels, so please consider updating your `.config/default.yml`. ([example settings](https://firefish.dev/firefish/firefish/-/blob/e7689fb302a0eed192b9515162258a39800f838a/.config/example.yml#L170-179))
|
||||
|
||||
## v20240225
|
||||
|
||||
### For Docker/Podman users
|
||||
|
||||
- The bug where `custom` directory was not working has (finally) been fixed. Please add the `custom` directory to `volumes` in your `docker-compose.yml`:
|
||||
```yaml
|
||||
services:
|
||||
web:
|
||||
image: registry.firefish.dev/firefish/firefish:latest
|
||||
# and so on ...
|
||||
|
||||
volumes:
|
||||
- ./custom:/firefish/custom:ro # <- Please add this line
|
||||
- ./files:/firefish/files
|
||||
- ./.config:/firefish/.config:ro
|
||||
```
|
||||
|
||||
## v20240222
|
||||
|
||||
### For Docker/Podman users
|
||||
|
||||
- You only need to pull the new container image (`docker/podman pull`) to upgrade your server, so we assume that many of you don't update the code (`git pull --ff`), but it's still worth noting here that we have renamed `docker-compose.yml` to `docker-compose.example.yml` in the repository, and `docker-compose.yml` is now set to be untracked by git.
|
||||
- Since `docker-compose.yml` may be edited by users (e.g., change port number, add reverse proxy), it shouldn't have been tracked by git in the first place.
|
||||
- If you want to update the repository (`git pull --ff`), please take the following steps to keep your `docker-compose.yml`:
|
||||
1. Backup (make a copy) your `docker-compose.yml`
|
||||
```sh
|
||||
cp docker-compose.yml /tmp/my-docker-compose.yml # or somewhere else
|
||||
```
|
||||
2. Restore the original `docker-compose.yml` so it doesn't conflict with the upstream changes
|
||||
```sh
|
||||
git checkout -- docker-compose.yml
|
||||
```
|
||||
3. Pull the new code
|
||||
```sh
|
||||
git switch main
|
||||
git pull --ff
|
||||
```
|
||||
4. Bring back your `docker-compose.yml`
|
||||
```sh
|
||||
mv /tmp/my-docker-compose.yml docker-compose.yml
|
||||
```
|
||||
- If any modifications are needed to `docker-compose.yml` in the future, we will provide a notice.
|
||||
- Also, PostgreSQL v12.2 (`docker.io/postgres:12.2-alpine`) has been used in this compose file, but we highly recommend that you upgrade it to a newer version (e.g., `docker.io/postgres:16-alpine`).
|
||||
- Note: some manual (painful) operations are needed to upgrade the PostgreSQL major version, so please be careful when performing upgrades: <https://github.com/docker-library/postgres/issues/37>
|
||||
|
||||
## v20240214
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
- Required Rust version has been bumped from v1.70 to v1.74.
|
||||
```sh
|
||||
cargo --version # check version
|
||||
rustup update # update version
|
||||
```
|
||||
|
||||
## v20240213
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
- `packages/backend/native-utils` can be removed.
|
||||
- This directory was removed in the repository, but it's not completely removed from your system by `git pull --ff`, because some folders like `packages/backend/native-utils/built` are not tracked by git.
|
||||
|
||||
```sh
|
||||
rm --recursive --force packages/backend/native-utils
|
||||
```
|
||||
|
||||
## v20240206
|
||||
|
||||
### For all users
|
||||
|
||||
- The git repository has been moved, so please update the `git remote` url.
|
||||
```sh
|
||||
git remote set-url origin https://firefish.dev/firefish/firefish.git
|
||||
```
|
||||
|
||||
### For systemd/pm2 users
|
||||
|
||||
- Required Rust version has been bumped from v1.68 to v1.70.
|
||||
- `libvips` is no longer required (unless your server OS is *BSD), so you may uninstall it from your system. Make sure to execute the following commands after that:
|
||||
```sh
|
||||
pnpm clean-npm
|
||||
pnpm install
|
||||
```
|
||||
|
||||
### For Docker/Podman users
|
||||
|
||||
- The image tag has been changed to `registry.firefish.dev/firefish/firefish:latest`, so please update `docker-compose.yml`.
|
41
docs/upgrade.md
Normal file
41
docs/upgrade.md
Normal file
|
@ -0,0 +1,41 @@
|
|||
# Upgrade instruction
|
||||
|
||||
## For systemd/pm2 users
|
||||
|
||||
1. Check [`docs/notice-for-admins.md`](https://firefish.dev/firefish/firefish/-/blob/main/docs/notice-for-admins.md)
|
||||
1. Stop the server
|
||||
```sh
|
||||
sudo systemctl stop your-firefish-service.service
|
||||
# or pm2 stop firefish
|
||||
```
|
||||
1. Pull the latest source code
|
||||
```sh
|
||||
git checkout -- packages/backend/assets
|
||||
git pull --ff origin main
|
||||
```
|
||||
1. Build Firefish and apply changes to the database
|
||||
```sh
|
||||
corepack prepare pnpm@latest --activate
|
||||
pnpm install --frozen-lockfile
|
||||
NODE_ENV='production' NODE_OPTIONS='--max_old_space_size=3072' pnpm run rebuild
|
||||
pnpm run migrate
|
||||
```
|
||||
1. Start the server
|
||||
```sh
|
||||
sudo systemctl start your-firefish-service.service
|
||||
# or pm2 start firefish
|
||||
```
|
||||
|
||||
## For Docker/Podman users
|
||||
|
||||
1. Check [`docs/notice-for-admins.md`](https://firefish.dev/firefish/firefish/-/blob/main/docs/notice-for-admins.md)
|
||||
1. Pull the latest container image
|
||||
```sh
|
||||
docker pull registry.firefish.dev/firefish/firefish:latest
|
||||
# or podman pull registry.firefish.dev/firefish/firefish:latest
|
||||
```
|
||||
1. Start the container
|
||||
```sh
|
||||
docker compose up --detach
|
||||
# or podman-compose up --detach
|
||||
```
|
1582
locales/ar-SA.yml
Normal file
1582
locales/ar-SA.yml
Normal file
File diff suppressed because it is too large
Load diff
958
locales/bg-BG.yml
Normal file
958
locales/bg-BG.yml
Normal file
|
@ -0,0 +1,958 @@
|
|||
_lang_: Български
|
||||
cancel: Отказ
|
||||
noNotes: Няма публикации
|
||||
settings: Настройки
|
||||
headlineFirefish: Децентрализирана социална медийна платформа с отворен код, която
|
||||
е свободна завинаги! 🚀
|
||||
notifications: Известия
|
||||
forgotPassword: Забравена парола
|
||||
uploading: Качване...
|
||||
addInstance: Добавяне на сървър
|
||||
favorite: Добавяне към отметките
|
||||
delete: Изтриване
|
||||
unpin: Откачане от профила
|
||||
copyLink: Копиране на връзката
|
||||
pin: Закачане в профила
|
||||
deleted: Изтрито
|
||||
deleteAndEditConfirm: Сигурни ли сте, че искате да изтриете тази публикация и да я
|
||||
редактирате? Ще загубите всички реакции, подсилвания и отговори към нея.
|
||||
copyUsername: Копиране на потребителското име
|
||||
searchUser: Търсене на потребител
|
||||
reply: Отговор
|
||||
showMore: Показване на повече
|
||||
loadMore: Зареди още
|
||||
followRequestAccepted: Заявката за последване е приета
|
||||
importAndExport: Импорт/експорт на данни
|
||||
import: Импортиране
|
||||
download: Изтегляне
|
||||
export: Експортиране
|
||||
files: Файлове
|
||||
unblock: Отблокиране
|
||||
_sensitiveMediaDetection:
|
||||
setSensitiveFlagAutomatically: Маркиране като деликатно
|
||||
searchWith: 'Търсене: {q}'
|
||||
smtpUser: Потребителско име
|
||||
notificationType: Тип известие
|
||||
searchResult: Резултати от търсенето
|
||||
markAsReadAllNotifications: Маркиране на всички известия като прочетени
|
||||
settingGuide: Препоръчителни настройки
|
||||
smtpPass: Парола
|
||||
newPasswordIs: Новата парола е "{password}"
|
||||
members: Членове
|
||||
help: Помощ
|
||||
hide: Скриване
|
||||
group: Група
|
||||
groups: Групи
|
||||
incorrectPassword: Грешна парола.
|
||||
leaveGroup: Напускане на групата
|
||||
numberOfColumn: Брой колони
|
||||
passwordLessLogin: Влизане без парола
|
||||
newPasswordRetype: Повтори новата парола
|
||||
saveAs: Запазване като...
|
||||
resetPassword: Нулиране на паролата
|
||||
saveConfirm: Запазване на промените?
|
||||
inputNewFolderName: Въведи ново име на папка
|
||||
upload: Качване
|
||||
retypedNotMatch: Въвежданията не съвпадат.
|
||||
_ago:
|
||||
weeksAgo: пр. {n}сед
|
||||
secondsAgo: пр. {n}сек
|
||||
hoursAgo: пр. {n}ч
|
||||
minutesAgo: пр. {n}мин
|
||||
daysAgo: пр. {n}д
|
||||
monthsAgo: пр. {n}мес
|
||||
yearsAgo: пр. {n}г
|
||||
future: Бъдеще
|
||||
justNow: Току-що
|
||||
folderName: Име на папка
|
||||
renameFile: Преименуване на файла
|
||||
_widgets:
|
||||
activity: Дейност
|
||||
notifications: Известия
|
||||
timeline: Хронология
|
||||
clock: Часовник
|
||||
trends: Актуални
|
||||
photos: Снимки
|
||||
unixClock: UNIX часовник
|
||||
calendar: Календар
|
||||
digitalClock: Дигитален часовник
|
||||
button: Бутон
|
||||
slideshow: Слайдшоу
|
||||
_userList:
|
||||
chooseList: Избор на списък
|
||||
instanceSecurity: Сигурност на сървъра
|
||||
uploadFolder: Папка по подразбиране за качвания
|
||||
instanceInfo: Информация за сървъра
|
||||
statistics: Статистика
|
||||
fileName: Име на файл
|
||||
selectFile: Избор на файл
|
||||
editProfile: Редактиране на профила
|
||||
instances: Сървъри
|
||||
selectUser: Избор на потребител
|
||||
createNew: Създаване на ново
|
||||
blockThisInstance: Блокиране на този сървър
|
||||
_profile:
|
||||
metadata: Допълнителна информация
|
||||
username: Потребителско име
|
||||
name: Име
|
||||
description: Биография
|
||||
metadataContent: Съдържание
|
||||
metadataLabel: Етикет
|
||||
metadataEdit: Редактиране на допълнителната информация
|
||||
changeAvatar: Промяна на профилната снимка
|
||||
youCanIncludeHashtags: Можеш също да включиш хаштагове в биографията си.
|
||||
changeBanner: Промяна на банера
|
||||
addAccount: Добавяне на акаунт
|
||||
followRequestPending: Заявка за последване в изчакване
|
||||
signinHistory: История на вписванията
|
||||
or: Или
|
||||
noUsers: Няма потребители
|
||||
notes: Публикации
|
||||
newNoteRecived: Има нови публикации
|
||||
note: Публикация
|
||||
instanceFollowing: Последвани на сървъра
|
||||
_filters:
|
||||
followersOnly: Само последователи
|
||||
notesAfter: Публикации след
|
||||
fromDomain: От домейн
|
||||
fromUser: От потребител
|
||||
withFile: С файл
|
||||
notesBefore: Публикации преди
|
||||
followingOnly: Само последвани
|
||||
_notification:
|
||||
_types:
|
||||
follow: Нови последователи
|
||||
mention: Споменавания
|
||||
reaction: Реакции
|
||||
reply: Отговора
|
||||
all: Всички
|
||||
quote: Цитирания
|
||||
pollEnded: Приключване на анкети
|
||||
app: Известия от свързани приложения
|
||||
renote: Подсилвания
|
||||
pollVote: Гласувания в анкети
|
||||
receiveFollowRequest: Получени заявки за следване
|
||||
followRequestAccepted: Приети заявки за следване
|
||||
groupInvited: Покани в групи
|
||||
youGotReply: '{name} ти отговори'
|
||||
fileUploaded: Файлът е качен успешно
|
||||
youWereFollowed: те последва
|
||||
_actions:
|
||||
reply: Отговор
|
||||
renote: Подсилвания
|
||||
youGotQuote: '{name} те цитира'
|
||||
youGotMention: '{name} те спомена'
|
||||
youGotMessagingMessageFromUser: '{name} ти изпрати чат съобщение'
|
||||
_channel:
|
||||
notesCount: '{n} Публикации'
|
||||
nameOnly: Само име
|
||||
nameAndDescription: Име и описание
|
||||
create: Създаване на канал
|
||||
unfollow: Отследване
|
||||
noLists: Нямаш никакви списъци
|
||||
markAsReadAllUnreadNotes: Маркиране на всички публикации като прочетени
|
||||
markAsReadAllTalkMessages: Маркиране на всички съобщения като прочетени
|
||||
_time:
|
||||
second: Секунди
|
||||
hour: Часа
|
||||
day: Дни
|
||||
minute: Минути
|
||||
create: Създаване
|
||||
lists: Списъци
|
||||
reportAbuseOf: Докладване на {name}
|
||||
reporter: Докладчик
|
||||
abuseReports: Доклади
|
||||
logoImageUrl: URL на лого изображение
|
||||
reportAbuse: Докладване
|
||||
latestRequestReceivedAt: Последно получена заявка
|
||||
location: Местоположение
|
||||
keepOriginalUploading: Запазване на оригиналното изображение
|
||||
renotesCount: Брой изпратени подсилвания
|
||||
license: Лиценз
|
||||
lastUsedDate: Последно използвано на
|
||||
rename: Преименуване
|
||||
customEmojis: Персон. емоджита
|
||||
emoji: Емоджи
|
||||
_aboutFirefish:
|
||||
translation: Преведи Firefish
|
||||
source: Програмен код
|
||||
contributors: Основни сътрудници
|
||||
allContributors: Всички сътрудници
|
||||
translatedFrom: Преведено от {x}
|
||||
i18nInfo: Firefish се превежда на различни езици от доброволци. Можете да помогнете
|
||||
на адрес {link}.
|
||||
image: Изображение
|
||||
recipient: Получател(и)
|
||||
notesAndReplies: Публикации и отговори
|
||||
noSuchUser: Потребителят не е намерен
|
||||
pinnedPages: Закачени страници
|
||||
pinLimitExceeded: Не може да закачаш повече публикации
|
||||
flagShowTimelineReplies: Показване на отговори в хронологията
|
||||
followersCount: Брой последователи
|
||||
receivedReactionsCount: Брой получени реакции
|
||||
federation: Федерация
|
||||
today: Днес
|
||||
yearX: '{year}'
|
||||
registeredAt: Регистриран на
|
||||
monthX: '{month}'
|
||||
dayX: '{day}'
|
||||
registration: Регистрация
|
||||
popularUsers: Популярни потребители
|
||||
details: Подробности
|
||||
tenMinutes: 10 минути
|
||||
oneDay: Един ден
|
||||
file: Файл
|
||||
oneHour: Един час
|
||||
video: Видео
|
||||
createNewClip: Създаване на нова подборка
|
||||
clips: Подборки
|
||||
active: Активен
|
||||
menu: Меню
|
||||
itsOff: Изключено
|
||||
remindMeLater: Може би по-късно
|
||||
removed: Успешно изтриване
|
||||
deleteAllFiles: Изтриване на всички файлове
|
||||
deletedNote: Изтрита публикация
|
||||
deleteConfirm: Потвърждавате ли изтриването?
|
||||
hasChildFilesOrFolders: Тъй като тази папка не е празна, тя не може да бъде изтрита.
|
||||
nsfw: Деликатно
|
||||
default: По подразбиране
|
||||
_theme:
|
||||
defaultValue: Стойност по подразбиране
|
||||
keys:
|
||||
mention: Споменаване
|
||||
renote: Подсилване
|
||||
link: Връзка
|
||||
hashtag: Хаштаг
|
||||
fg: Текст
|
||||
color: Цвят
|
||||
explore: Разглеждане на темите
|
||||
description: Описание
|
||||
manage: Управление на темите
|
||||
install: Инсталиране на тема
|
||||
code: Код на темата
|
||||
builtinThemes: Вградени теми
|
||||
func: Функции
|
||||
key: Ключ
|
||||
argument: Аргумент
|
||||
installedThemes: Инсталирани теми
|
||||
constant: Константа
|
||||
addConstant: Добавяне на константа
|
||||
make: Направа на тема
|
||||
_pages:
|
||||
script:
|
||||
blocks:
|
||||
_dailyRannum:
|
||||
arg1: Минимална стойност
|
||||
arg2: Максимална стойност
|
||||
_join:
|
||||
arg1: Списъци
|
||||
add: Добави
|
||||
_rannum:
|
||||
arg1: Минимална стойност
|
||||
arg2: Максимална стойност
|
||||
_seedRannum:
|
||||
arg3: Максимална стойност
|
||||
arg2: Минимална стойност
|
||||
_strPick:
|
||||
arg1: Текст
|
||||
_if:
|
||||
arg3: Иначе
|
||||
arg2: Тогава
|
||||
arg1: Ако
|
||||
_randomPick:
|
||||
arg1: Списък
|
||||
fn: Функция
|
||||
_strLen:
|
||||
arg1: Текст
|
||||
_strReplace:
|
||||
arg1: Текст
|
||||
_strReverse:
|
||||
arg1: Текст
|
||||
_stringToNumber:
|
||||
arg1: Текст
|
||||
text: Текст
|
||||
_splitStrByLine:
|
||||
arg1: Текст
|
||||
_listLen:
|
||||
arg1: Списък
|
||||
_dailyRandomPick:
|
||||
arg1: Списък
|
||||
_seedRandomPick:
|
||||
arg2: Списък
|
||||
_pick:
|
||||
arg1: Списък
|
||||
categories:
|
||||
value: Стойности
|
||||
list: Списъци
|
||||
fn: Функции
|
||||
types:
|
||||
string: Текст
|
||||
array: Списък
|
||||
blocks:
|
||||
_textInput:
|
||||
default: Стойност по подразбиране
|
||||
text: Заглавие
|
||||
_switch:
|
||||
default: Стойност по подразбиране
|
||||
text: Заглавие
|
||||
_textareaInput:
|
||||
default: Стойност по подразбиране
|
||||
text: Заглавие
|
||||
_numberInput:
|
||||
default: Стойност по подразбиране
|
||||
text: Заглавие
|
||||
_radioButton:
|
||||
default: Стойност по подразбиране
|
||||
title: Заглавие
|
||||
_if:
|
||||
variable: Променлива
|
||||
_counter:
|
||||
text: Заглавие
|
||||
inc: Стъпка
|
||||
button: Бутон
|
||||
if: Ако
|
||||
image: Изображения
|
||||
text: Текст
|
||||
_post:
|
||||
text: Съдържание
|
||||
_button:
|
||||
_action:
|
||||
_dialog:
|
||||
content: Съдържание
|
||||
text: Заглавие
|
||||
created: Страницата е създадена успешно
|
||||
editPage: Редактиране на тази страница
|
||||
editThisPage: Редактиране на тази страница
|
||||
updated: Страницата е редактирана успешно
|
||||
featured: Популярни
|
||||
liked: Харесани страници
|
||||
contentBlocks: Съдържание
|
||||
contents: Съдържание
|
||||
deleted: Страницата е изтрита успешно
|
||||
newPage: Създаване на нова страница
|
||||
like: Харесване
|
||||
font: Шрифт
|
||||
title: Заглавие
|
||||
my: Моите страници
|
||||
pageSetting: Настройки на страницата
|
||||
url: Адрес на страницата
|
||||
summary: Кратко обобщение
|
||||
alignCenter: Центриране на елементите
|
||||
variables: Променливи
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: Известия
|
||||
mentions: Споменавания
|
||||
tl: Хронология
|
||||
direct: Директни съобщения
|
||||
list: Списък
|
||||
antenna: Антена
|
||||
addColumn: Добавяне на колона
|
||||
_mfm:
|
||||
mention: Споменаване
|
||||
search: Търсене
|
||||
link: Връзка
|
||||
hashtag: Хаштаг
|
||||
url: URL адрес
|
||||
font: Шрифт
|
||||
_messaging:
|
||||
groups: Групи
|
||||
dms: Лични
|
||||
apps: Приложения
|
||||
introFirefish: Добре дошли! Firefish е децентрализирана социална медийна платформа
|
||||
с отворен код, която е свободна завинаги! 🚀
|
||||
monthAndDay: '{day}/{month}'
|
||||
search: Търсене
|
||||
searchPlaceholder: Търсене във Firefish
|
||||
username: Потребителско име
|
||||
password: Парола
|
||||
fetchingAsApObject: Извличане от Федивселената
|
||||
ok: Добре
|
||||
gotIt: Разбрах!
|
||||
noThankYou: Не, благодаря
|
||||
enterUsername: Въведи потребителско име
|
||||
renotedBy: Подсилено от {user}
|
||||
noNotifications: Няма известия
|
||||
instance: Сървър
|
||||
basicSettings: Основни настройки
|
||||
otherSettings: Други настройки
|
||||
openInWindow: Отваряне в прозорец
|
||||
profile: Профил
|
||||
timeline: Хронология
|
||||
noAccountDescription: Този потребител все още не е написал своята биография.
|
||||
login: Вход
|
||||
loggingIn: Вписване
|
||||
logout: Изход
|
||||
signup: Регистрация
|
||||
save: Запазване
|
||||
users: Потребители
|
||||
addUser: Добавяне на потребител
|
||||
favorites: Отметки
|
||||
unfavorite: Премахване от отметките
|
||||
favorited: Добавено към отметките.
|
||||
alreadyFavorited: Вече е добавено към отметките.
|
||||
cantFavorite: Неуспешно добавяне към отметките.
|
||||
copyContent: Копиране на съдържанието
|
||||
deleteAndEdit: Изтриване и редактиране
|
||||
editNote: Редактиране на публикацията
|
||||
edited: Редактирано на {date} {time}
|
||||
addToList: Добавяне към списък
|
||||
sendMessage: Изпращане на съобщение
|
||||
jumpToPrevious: Премини към предишно
|
||||
newer: по-ново
|
||||
older: по-старо
|
||||
showLess: Показване на по-малко
|
||||
youGotNewFollower: те последва
|
||||
receiveFollowRequest: Заявка за последване получена
|
||||
mention: Споменаване
|
||||
mentions: Споменавания
|
||||
directNotes: Директни съобщения
|
||||
cw: Предупреждение за съдържание
|
||||
followers: Последователи
|
||||
following: Последвани
|
||||
followsYou: Следва те
|
||||
createList: Създаване на списък
|
||||
error: Грешка
|
||||
manageLists: Управление на списъците
|
||||
retry: Повторен опит
|
||||
follow: Последване
|
||||
followRequest: Заявка за последване
|
||||
followRequests: Заявки за последване
|
||||
defaultNoteVisibility: Видимост по подразбиране
|
||||
unrenote: Отмяна на подсилването
|
||||
renoted: Подсилено.
|
||||
cantRenote: Тази публикация не може да бъде подсилена.
|
||||
renote: Подсилване
|
||||
enterEmoji: Въведи емоджи
|
||||
sensitive: Деликатно
|
||||
add: Добавяне
|
||||
pinned: Закачено в профила
|
||||
quote: Цитат
|
||||
pinnedNote: Закачена публикация
|
||||
cantReRenote: Подсилване не може да бъде подсилено.
|
||||
clickToShow: Щракни за показване
|
||||
you: Ти
|
||||
reaction: Реакции
|
||||
removeReaction: Премахване на реакцията
|
||||
enterFileName: Въведи име на файл
|
||||
unmarkAsSensitive: Отмаркиране като деликатно
|
||||
markAsSensitive: Маркиране като деликатно
|
||||
block: Блокиране
|
||||
emojis: Емоджита
|
||||
addEmoji: Добавяне
|
||||
emojiName: Име на емоджи
|
||||
emojiUrl: URL адрес на емоджи
|
||||
loginFailed: Неуспешно вписване
|
||||
flagAsCat: Котка ли си? 😺
|
||||
flagSpeakAsCat: Говорене като котка
|
||||
youHaveNoLists: Нямаш никакви списъци
|
||||
selectInstance: Избор на сървър
|
||||
annotation: Коментари
|
||||
latestRequestSentAt: Последно изпратена заявка
|
||||
stopActivityDelivery: Спиране на изпращането на дейности
|
||||
version: Версия
|
||||
clearCachedFiles: Изчистване на кеша
|
||||
noInstances: Няма сървъри
|
||||
federating: Федериране
|
||||
defaultValueIs: 'По подразбиране: {value}'
|
||||
noCustomEmojis: Няма емоджи
|
||||
changePassword: Промяна на паролата
|
||||
currentPassword: Текуща парола
|
||||
instanceUsers: Потребители на този сървър
|
||||
security: Сигурност
|
||||
instanceFollowers: Последователи на сървъра
|
||||
newPassword: Нова парола
|
||||
more: Още!
|
||||
remove: Изтриване
|
||||
saved: Запазени
|
||||
messaging: Чат
|
||||
birthday: Рожден ден
|
||||
images: Изображения
|
||||
activity: Дейност
|
||||
createFolder: Създаване на папка
|
||||
renameFolder: Преименуване на тази папка
|
||||
selectFolders: Избор на папки
|
||||
selectFolder: Избор на папка
|
||||
selectFiles: Избор на файлове
|
||||
addFile: Добавяне на файл
|
||||
inputNewFileName: Въведи ново име на файл
|
||||
deleteFolder: Изтриване на тази папка
|
||||
emptyFolder: Тази папка е празна
|
||||
copyUrl: Копиране на URL адреса
|
||||
pages: Страници
|
||||
thisYear: Година
|
||||
thisMonth: Месец
|
||||
pinnedNotes: Закачени публикации
|
||||
pinnedUsers: Закачени потребители
|
||||
hcaptcha: hCaptcha
|
||||
recaptcha: reCAPTCHA
|
||||
name: Име
|
||||
enableRecaptcha: Включване на reCAPTCHA
|
||||
enableHcaptcha: Включване на hCaptcha
|
||||
exploreUsersCount: Има {count} потребители
|
||||
userList: Списъци
|
||||
moderator: Модератор
|
||||
moderation: Модерация
|
||||
administrator: Администратор
|
||||
lastUsed: Последно използвано
|
||||
unregister: Отрегистрация
|
||||
share: Споделяне
|
||||
notFound: Не е намерено
|
||||
inputMessageHere: Въведи съобщение тук
|
||||
createGroup: Създаване на група
|
||||
close: Затваряне
|
||||
next: Следващо
|
||||
title: Заглавие
|
||||
messagingWithGroup: Групов чат
|
||||
enable: Включване
|
||||
retype: Въведи отново
|
||||
noteOf: Публикация от {user}
|
||||
quoteAttached: Цитат
|
||||
newMessageExists: Има нови съобщения
|
||||
noMessagesYet: Все още няма съобщения
|
||||
language: Език
|
||||
createAccount: Създаване на акаунт
|
||||
existingAccount: Съществуващ акаунт
|
||||
deleteAll: Изтриване на всички
|
||||
enableAll: Включване на всички
|
||||
disableAll: Изключване на всички
|
||||
copy: Копиране
|
||||
reporteeOrigin: Произход на докладвания
|
||||
reporterOrigin: Произход на докладчика
|
||||
clip: Подборка
|
||||
unclip: Премахни от подборка
|
||||
followingCount: Брой последвани акаунти
|
||||
renotedCount: Брой получени подсилвания
|
||||
notesCount: Брой публикации
|
||||
repliesCount: Брой изпратени отговори
|
||||
repliedCount: Брой получени отговори
|
||||
sentReactionsCount: Брой изпратени реакции
|
||||
yes: Да
|
||||
no: Не
|
||||
alwaysMarkSensitive: Маркиране като деликатно по подразбиране
|
||||
noteFavoritesCount: Брой публикации с отметки
|
||||
left: Ляво
|
||||
nNotes: '{n} Публикации'
|
||||
value: Стойност
|
||||
createdAt: Създадено на
|
||||
invalidValue: Невалидна стойност.
|
||||
currentVersion: Настояща версия
|
||||
latestVersion: Най-нова версия
|
||||
typingUsers: '{users} пише'
|
||||
user: Потребител
|
||||
enabled: Включено
|
||||
disabled: Изключено
|
||||
whatIsNew: Показване на промените
|
||||
translate: Превеждане
|
||||
itsOn: Включено
|
||||
oneWeek: Една седмица
|
||||
audio: Звук
|
||||
removeQuote: Премахване на цитата
|
||||
_sfx:
|
||||
notification: Известия
|
||||
chat: Чат
|
||||
antenna: Антени
|
||||
note: Нова публикация
|
||||
_permissions:
|
||||
"read:favorites": Преглед на списъка ви с отметки
|
||||
"write:favorites": Редактиране на списъка ви с отметки
|
||||
_visibility:
|
||||
followers: Последователи
|
||||
specified: Директна
|
||||
localOnly: Само местни
|
||||
public: Общодостъпна
|
||||
publicDescription: Публикацията ще бъде видима във всички публични хронологии
|
||||
home: Скрита
|
||||
localOnlyDescription: Не е видима за отдалечени потребители
|
||||
specifiedDescription: Видима само за определени потребители
|
||||
followersDescription: Видима само за последователите ти и споменатите потребители
|
||||
homeDescription: Публикуване само в началната хронология
|
||||
explore: Разглеждане
|
||||
theme: Теми
|
||||
wallpaper: Тапет
|
||||
setWallpaper: Задаване на тапет
|
||||
removeWallpaper: Премахване на тапета
|
||||
themeForLightMode: Тема за използване в светъл режим
|
||||
themeForDarkMode: Тема за използване в тъмен режим
|
||||
light: Светла
|
||||
dark: Тъмна
|
||||
darkThemes: Тъмни теми
|
||||
invitations: Покани
|
||||
invitationCode: Код на поканата
|
||||
checking: Проверка...
|
||||
available: Свободно
|
||||
unavailable: Не е свободно
|
||||
tooShort: Твърде кратко
|
||||
tooLong: Твърде дълго
|
||||
weakPassword: Слаба парола
|
||||
veryStrongPassword: Силна парола
|
||||
passwordMatched: Съвпада
|
||||
passwordNotMatched: Не съвпада
|
||||
signinWith: Вход с {x}
|
||||
aboutX: Относно {x}
|
||||
openInNewTab: Отваряне в нов раздел
|
||||
_tutorial:
|
||||
step2_1: Първо, моля, попълнете своя профил.
|
||||
step2_2: Предоставянето на известна информация за това кой сте вие ще улесни другите
|
||||
да разберат дали искат да видят вашите публикации или да ви следват.
|
||||
title: Как се използва Firefish
|
||||
step1_1: Добре дошли!
|
||||
step5_1: Хронологии, хронологии навсякъде!
|
||||
step3_1: Сега е време да последвате няколко хора!
|
||||
step1_2: Нека да ви настроим. Ще бъдете готови за нула време!
|
||||
step5_3: Началната {icon} хронология е мястото, където можете да видите публикации
|
||||
от акаунтите, които следвате.
|
||||
step6_1: И така, какво е това място?
|
||||
step5_7: Глобалната {icon} хронология е мястото, където можете да видите публикации
|
||||
от всеки друг свързан сървър.
|
||||
step4_2: За първата си публикация някои хора обичат да правят публикация {introduction}
|
||||
или просто „Здравей свят!“
|
||||
step5_2: Вашият сървър има активирани {timelines} различни хронологии.
|
||||
step5_4: Местната {icon} хронология е мястото, където можете да видите публикации
|
||||
от всички останали на този сървър.
|
||||
step5_5: Социалната {icon} хронология е комбинация от Началната и Местната хронология.
|
||||
step5_6: Препоръчаната {icon} хронология е мястото, където можете да видите публикации
|
||||
от сървъри, препоръчани от администраторите.
|
||||
step6_4: Сега отидете, изследвайте и се забавлявайте!
|
||||
step6_3: Всеки сървър работи по различни начини и не всички сървъри работят с Firefish.
|
||||
Този обаче го прави! Малко е сложно, но ще разберете за нула време.
|
||||
openImageInNewTab: Отваряне на изображенията в нов раздел
|
||||
showOnRemote: Отваряне на първообразната страница
|
||||
lightThemes: Светли теми
|
||||
syncDeviceDarkMode: Синхронизиране на тъмния режим с настройките на устройството
|
||||
text: Текст
|
||||
normalPassword: Средна парола
|
||||
usernameInvalidFormat: Можете да използвате главни и малки букви, цифри и долни черти.
|
||||
signinFailed: Неуспешно вписване. Въведените потребителско име или парола са неправилни.
|
||||
signinRequired: Моля, регистрирайте се или се впишете, преди да продължите
|
||||
start: Започване
|
||||
confirm: Потвърждаване
|
||||
failedToUpload: Неуспешно качване
|
||||
_preferencesBackups:
|
||||
cannotSave: Неуспешно запазване
|
||||
cannotLoad: Неуспешно зареждане
|
||||
saveNew: Запазване на ново резервно копие
|
||||
inputName: Моля, въведи име за това резервно копие
|
||||
deleteConfirm: Изтриване на резервното копие {name}?
|
||||
loadFile: Зареждане от файл
|
||||
save: Запазване на промените
|
||||
apply: Прилагане към това устройство
|
||||
list: Създадени резервни копия
|
||||
saveConfirm: Запазване на резервното копие като {name}?
|
||||
createdAt: 'Създадено на: {date} {time}'
|
||||
updatedAt: 'Обновено на: {date} {time}'
|
||||
editWidgetsExit: Готово
|
||||
done: Готово
|
||||
emailRequiredForSignup: Изискване на адрес за ел. поща за регистриране
|
||||
preview: Преглед
|
||||
privacy: Поверителност
|
||||
about: Относно
|
||||
aboutFirefish: Относно Firefish
|
||||
author: Автор
|
||||
software: Софтуер
|
||||
category: Категория
|
||||
renotes: Подсилвания
|
||||
quotes: Цитирания
|
||||
reactions: Реакции
|
||||
attachCancel: Премахване на прикачен файл
|
||||
mute: Заглушаване
|
||||
unmute: Отмяна на заглушаването
|
||||
selectAntenna: Избор на антена
|
||||
selectList: Избор на списък
|
||||
editWidgets: Редактиране на джаджите
|
||||
flagAsCatDescription: Ще получиш котешки уши и ще говориш като котка!
|
||||
host: Хост
|
||||
perHour: За час
|
||||
perDay: За ден
|
||||
operations: Операции
|
||||
mutedUsers: Заглушени потребители
|
||||
imageUrl: URL адрес на изображение
|
||||
announcements: Оповестявания
|
||||
removeAreYouSure: Сигурни ли сте, че искате да премахнете "{x}"?
|
||||
fromUrl: От URL адрес
|
||||
manageGroups: Управление на групите
|
||||
nUsersRead: прочетено от {n}
|
||||
home: Начало
|
||||
registeredDate: Присъединяване
|
||||
avatar: Профилна снимка
|
||||
watch: Наблюдаване
|
||||
antennas: Антени
|
||||
manageAntennas: Управление на антените
|
||||
popularTags: Популярни тагове
|
||||
cacheClear: Изчистване на кеша
|
||||
groupName: Име на групата
|
||||
local: Местни
|
||||
total: Общо
|
||||
remote: Отдалечени
|
||||
accountSettings: Настройки на акаунта
|
||||
showInPage: Показване в страницата
|
||||
install: Инсталиране
|
||||
uninstall: Деинсталиране
|
||||
invisibleNote: Невидима публикация
|
||||
poll: Анкета
|
||||
useCw: Скриване на съдържание
|
||||
smtpHost: Хост
|
||||
preferencesBackups: Резервни копия
|
||||
emailServer: Ел. пощенски сървър
|
||||
overview: Обзор
|
||||
reloadToApplySetting: Тази настройка ще се приложи само след презареждане на страницата.
|
||||
Презареждане сега?
|
||||
markAllAsRead: Маркиране на всички като прочетени
|
||||
addDescription: Добавяне на описание
|
||||
userInfo: Информация за потребителя
|
||||
switchAccount: Превключване на акаунт
|
||||
gallery: Галерия
|
||||
priority: Приоритет
|
||||
unread: Непрочетени
|
||||
filter: Филтриране
|
||||
manageAccounts: Управление на акаунтите
|
||||
deleteAccount: Изтриване на акаунта
|
||||
fast: Бърза
|
||||
remoteOnly: Само отдалечени
|
||||
move: Преместване
|
||||
navbar: Навигационна лента
|
||||
moveTo: Преместване на текущия акаунт в нов акаунт
|
||||
moveAccount: Преместване на акаунта!
|
||||
_gallery:
|
||||
my: Моята галерия
|
||||
like: Харесване
|
||||
liked: Харесани публикации
|
||||
_registry:
|
||||
keys: Ключове
|
||||
key: Ключ
|
||||
createKey: Създаване на ключ
|
||||
domain: Домейн
|
||||
_weekday:
|
||||
tuesday: Вторник
|
||||
wednesday: Сряда
|
||||
thursday: Четвъртък
|
||||
saturday: Събота
|
||||
monday: Понеделник
|
||||
friday: Петък
|
||||
sunday: Неделя
|
||||
_antennaSources:
|
||||
users: Публикации от конкретни потребители
|
||||
userGroup: Публикации от потребители в конкретна група
|
||||
instances: Публикации от всички потребители на сървър
|
||||
all: Всички публикации
|
||||
homeTimeline: Публикации от последвани потребители
|
||||
userList: Публикации от конкретен списък с потребители
|
||||
_poll:
|
||||
choiceN: Избор {n}
|
||||
infinite: Никога
|
||||
totalVotes: '{n} гласа общо'
|
||||
votesCount: '{n} гласа'
|
||||
expiration: Приключване на анкетата
|
||||
_timelines:
|
||||
local: Местни
|
||||
home: Начало
|
||||
global: Глобални
|
||||
recommended: Препоръчани
|
||||
social: Социални
|
||||
_feeds:
|
||||
copyFeed: Копиране на емисия
|
||||
rss: RSS
|
||||
atom: Atom
|
||||
jsonFeed: JSON feed
|
||||
general: Общи
|
||||
metadata: Метаданни
|
||||
disk: Диск
|
||||
featured: Препоръчано
|
||||
yearsOld: на {age} години
|
||||
reload: Опресняване
|
||||
invites: Покани
|
||||
blockedInstances: Блокирани сървъри
|
||||
inMb: В мегабайти
|
||||
unfollowConfirm: Сигурни ли сте, че искате да прекратите следването на {name}?
|
||||
somethingHappened: Възникна грешка
|
||||
pageLoadError: Възникна грешка при зареждането на страницата.
|
||||
enterListName: Въведи име за списъка
|
||||
shareWithNote: Споделяне чрез публикация
|
||||
flagAsBot: Маркиране на този акаунт като автоматизиран
|
||||
selectChannel: Избор на канал
|
||||
all: Всичко
|
||||
muteAndBlock: Заглушени и блокирани
|
||||
blockedUsers: Блокирани потребители
|
||||
noteDeleteConfirm: Сигурни ли сте, че искате да изтриете тази публикация?
|
||||
hiddenTags: Скрити хаштагове
|
||||
deleteAreYouSure: Сигурни ли сте, че искате да изтриете "{x}"?
|
||||
startMessaging: Започване на нов чат
|
||||
uploadFromUrl: Качване от URL адрес
|
||||
instanceName: Име на сървъра
|
||||
instanceDescription: Описание на сървъра
|
||||
accept: Приемане
|
||||
enableLocalTimeline: Включване на местната хронология
|
||||
enableGlobalTimeline: Включване на глобалната хронология
|
||||
removeMember: Премахване на член
|
||||
isAdmin: Администратор
|
||||
isModerator: Модератор
|
||||
_menuDisplay:
|
||||
hide: Скриване
|
||||
_exportOrImport:
|
||||
allNotes: Всички публикации
|
||||
followingList: Следвани потребители
|
||||
blockingList: Блокирани потребители
|
||||
muteList: Заглушени потребители
|
||||
exploreFediverse: Разглеждане на Федивселената
|
||||
recentlyUpdatedUsers: Последно активни потребители
|
||||
uiLanguage: Език на потребителския интерфейс
|
||||
dashboard: Табло
|
||||
tags: Тагове
|
||||
youHaveNoGroups: Нямаш групи
|
||||
accessibility: Достъпност
|
||||
email: Ел. поща
|
||||
emailAddress: Адрес за ел. поща
|
||||
addItem: Добавяне на елемент
|
||||
visibility: Видимост
|
||||
description: Описание
|
||||
_relayStatus:
|
||||
accepted: Прието
|
||||
other: Други
|
||||
channel: Канали
|
||||
accountInfo: Информация за акаунта
|
||||
send: Изпращане
|
||||
clearCache: Изчистване на кеша
|
||||
closeAccount: Затваряне на акаунта
|
||||
onlineUsersCount: '{n} потребители на линия'
|
||||
nUsers: '{n} Потребители'
|
||||
developer: Разработчик
|
||||
popularPosts: Популярни страници
|
||||
info: Относно
|
||||
recentPosts: Последни страници
|
||||
offline: Извън линия
|
||||
onlineStatus: Онлайн състояние
|
||||
online: На линия
|
||||
goBack: Назад
|
||||
editCode: Редактиране на кода
|
||||
publish: Публикувай
|
||||
breakFollow: Премахване на последовател
|
||||
learnMore: Научи повече
|
||||
hashtags: Хаштагове
|
||||
document: Документация
|
||||
accounts: Акаунти
|
||||
smartphone: Смартфон
|
||||
isBot: Този акаунт е автоматизиран
|
||||
size: Размер
|
||||
tablet: Таблет
|
||||
numberOfPageCache: Брой кеширани страници
|
||||
localOnly: Само местни
|
||||
beta: Бета
|
||||
slow: Бавна
|
||||
speed: Скорост
|
||||
account: Акаунт
|
||||
migration: Прехвърляне
|
||||
moveToLabel: 'Акаунт, към който се местиш:'
|
||||
withFiles: С прикачени файлове
|
||||
renoteUnmute: Отмяна на заглушаването на подсилванията
|
||||
selectWidget: Избор на джаджа
|
||||
remoteUserCaution: Информацията от отдалечени потребители може да е непълна.
|
||||
attachFile: Прикачване на файлове
|
||||
unwatch: Спиране на наблюдаването
|
||||
invite: Поканване
|
||||
_wordMute:
|
||||
mutedNotes: Заглушени публикации
|
||||
_postForm:
|
||||
_placeholders:
|
||||
b: Какво се случва около теб?
|
||||
recentlyDiscoveredUsers: Новооткрити потребители
|
||||
recentlyRegisteredUsers: Новоприсъединени потребители
|
||||
inviteToGroup: Поканване в група
|
||||
nothing: Няма нищо за гледане тук
|
||||
chooseEmoji: Избор на емоджи
|
||||
switchUi: Оформление
|
||||
previewNoteText: Показване на преглед
|
||||
apply: Прилагане
|
||||
selectAccount: Избор на акаунт
|
||||
muteThread: Заглушаване на нишката
|
||||
ffVisibility: Видимост на Последвани/Последователи
|
||||
renoteMute: Заглуш. на подсилванията в хронолог.
|
||||
replyMute: Заглуш. на отговорите в хронолог.
|
||||
blockConfirm: Сигурни ли сте, че искате да блокирате този акаунт?
|
||||
appearance: Облик
|
||||
fontSize: Размер на шрифта
|
||||
describeFile: Добавяне на описание
|
||||
unblockConfirm: Сигурни ли сте, че искате да отблокирате този акаунт?
|
||||
followConfirm: Сигурни ли сте, че искате да последвате {name}?
|
||||
accountMoved: 'Потребителят се премести на нов акаунт:'
|
||||
inputNewDescription: Въведете ново описание
|
||||
tos: Условия за ползване
|
||||
agreeTo: Съгласен съм с {0}
|
||||
withFileAntenna: Само публикации с файлове
|
||||
updateRemoteUser: Обновяване на инфо. за отдалечения потребител
|
||||
receiveAnnouncementFromInstance: Получаване на известия от този сървър
|
||||
userPagePinTip: Можеш да показваш публикации тук, като избереш "Закачане в профила"
|
||||
от менюто на отделните публикации.
|
||||
_ffVisibility:
|
||||
public: Общодостъпна
|
||||
private: Частна
|
||||
followers: Видима само за последователи
|
||||
_charts:
|
||||
activeUsers: Дейни потребители
|
||||
edit: Редактиране
|
||||
toReply: Отговаряне
|
||||
toPost: Публикуване
|
||||
toQuote: Цитиране
|
||||
charts: Диаграми
|
||||
disablePagesScript: Изключване на AiScript в Страниците
|
||||
updatedAt: Обновено на
|
||||
privateDescription: Видима само за теб
|
||||
enableTimelineStreaming: Автоматично обновяване на хронологиите
|
||||
toEdit: Редактиране
|
||||
showEmojisInReactionNotifications: Показване на емоджита в известията за реакции
|
||||
rememberNoteVisibility: Запомняне на настройките за видимост на публикациите
|
||||
drive: Диск
|
||||
banner: Банер
|
||||
public: Общодостъпна
|
||||
makeExplorable: Акаунтът да е видим в "Разглеждане"
|
||||
hideOnlineStatus: Скриване на онлайн състоянието
|
||||
customCss: Персонализиран CSS
|
||||
keepCw: Запазване на предупрежденията за съдържание
|
||||
makeReactionsPublic: Историята на реакциите да е общодостъпна
|
||||
noEmailServerWarning: Сървърът за ел. поща не е конфигуриран.
|
||||
languageForTranslation: Език за превеждане на публикации
|
||||
private: Частна
|
||||
replies: Отговори
|
||||
wordMute: Заглушаване на думи и езици
|
||||
instanceMute: Заглушаване на сървъри
|
||||
notificationSettingDesc: Избиране на какви известия да се показват.
|
||||
preventAiLearning: Предотвратяване на ИИ scraping
|
||||
indexable: Индексируем
|
||||
showPreviewByDefault: Показване на преглед при публикуване по подразбиране
|
||||
showNoAltTextWarning: Показване на предупреждение при опит за публикуване на файлове
|
||||
без описание
|
||||
makeFollowManuallyApprove: Заявките за последване да изискват одобряване
|
||||
enableEmojiReactions: Включване на реакциите с емоджи
|
||||
autoAcceptFollowed: Автоматично одобряване на заявките за последване от последвани
|
||||
потребители
|
||||
expandOnNoteClick: Отваряне на публикацията при кликване
|
||||
enableInfiniteScroll: Автоматично зареждане на повече
|
||||
noCrawle: Предотвратяване на индексирането от търсачки
|
||||
misskeyUpdated: Firefish бе обновен!
|
||||
emailNotConfiguredWarning: Адресът за ел. поща не е зададен.
|
||||
notificationSetting: Настройки за известията
|
||||
emailNotification: Известия по ел. поща
|
||||
clientSettings: Настройки за устройството
|
||||
behavior: Поведение
|
||||
detectPostLanguage: Автоматично откриване на езика и показване на бутон за превеждане
|
||||
за публикации на чужди езици
|
||||
replyUnmute: Отмяна на заглушаването на отговорите
|
||||
searchWords: Думи за търсене / ID или URL за поглеждане
|
||||
reloadConfirm: Искате ли да опресните хронологията?
|
||||
enableRecommendedTimeline: Включване на препоръчаната хронология
|
||||
showGapBetweenNotesInTimeline: Показване на празнина между публикациите в хронологията
|
||||
lookup: Поглеждане
|
||||
media: Мултимедия
|
||||
welcomeBackWithName: Добре дошли отново, {name}
|
||||
reduceUiAnimation: Намаляване на UI анимациите
|
||||
clickToFinishEmailVerification: Моля, натиснете [{ok}], за да завършите потвърждаването
|
||||
на ел. поща.
|
||||
_cw:
|
||||
show: Показване на съдържанието
|
||||
remoteFollow: Отдалечено последване
|
||||
messagingUnencryptedInfo: Чатовете във Firefish не са шифровани от край до край. Не
|
||||
споделяйте чувствителна информация през Firefish.
|
||||
noteEditHistory: История на редакциите на публик.
|
||||
withReplies: Включително отговори
|
||||
getQrCode: Показване на QR код
|
||||
copyRemoteFollowUrl: Копиране на адреса за отдалечено последване
|
1771
locales/bn-BD.yml
Normal file
1771
locales/bn-BD.yml
Normal file
File diff suppressed because it is too large
Load diff
2329
locales/ca-ES.yml
Normal file
2329
locales/ca-ES.yml
Normal file
File diff suppressed because it is too large
Load diff
1008
locales/cs-CZ.yml
Normal file
1008
locales/cs-CZ.yml
Normal file
File diff suppressed because it is too large
Load diff
236
locales/da-DK.yml
Normal file
236
locales/da-DK.yml
Normal file
|
@ -0,0 +1,236 @@
|
|||
_lang_: "Dansk"
|
||||
monthAndDay: '{month}/{day}'
|
||||
search: Søge
|
||||
notifications: Notifikationer
|
||||
username: Brugernavn
|
||||
password: Adgangskode
|
||||
forgotPassword: Glemt adgangskode
|
||||
fetchingAsApObject: Henter fra Fediverset
|
||||
ok: OK
|
||||
gotIt: Forstået!
|
||||
cancel: Annullere
|
||||
enterUsername: Indtast brugernavn
|
||||
instance: Instans
|
||||
renotedBy: Forstærket fra {user}
|
||||
noNotes: Ingen opslag
|
||||
otherSettings: Andre Indstillinger
|
||||
profile: Profil
|
||||
timeline: Tidslinje
|
||||
signup: Registrere
|
||||
logout: Log Ud
|
||||
login: Log ind
|
||||
uploading: Uploader...
|
||||
save: Gem
|
||||
users: Brugere
|
||||
favorited: Tilsat til bogmærker.
|
||||
unfavorite: Fjerne fra bogmærker
|
||||
alreadyFavorited: Allerede inden i bogmærker.
|
||||
pin: Fastgøre til profil
|
||||
unpin: Løse fra profil
|
||||
delete: Slet
|
||||
addToList: Tilsæt til liste
|
||||
deleteAndEdit: Slet og ændre
|
||||
reply: Svar
|
||||
loadMore: Indlæs mere
|
||||
receiveFollowRequest: Følgeanmodning er blevet sendt
|
||||
import: Importere
|
||||
export: Eksportere
|
||||
driveFileDeleteConfirm: Er du sikker på at du vil slette filen "{name}"? Denne vil
|
||||
blive slettet fra alle tilknyttede opslage.
|
||||
unfollowConfirm: Er du sikker på at du vil ikke følge {name} længere?
|
||||
privacy: Privatlivs
|
||||
enterListName: Indtast navnen for denne list
|
||||
makeFollowManuallyApprove: Følgeanmodninger kræver godkendelse
|
||||
unrenote: Fratag forstærkelse
|
||||
renote: Forstærk
|
||||
add: Tilsæt
|
||||
reactionSetting: Reaktioner til at vise i reaktion-vælgeren
|
||||
reactionSettingDescription2: Bevæg til at flytte om på, tryk til at slette og indtast
|
||||
"+" til at tilsætte.
|
||||
rememberNoteVisibility: Husk opslagsynlidhedsindstillinger
|
||||
emojis: Emoji
|
||||
flagShowTimelineReplies: Vis svare i tidslinjen
|
||||
flagAsCatDescription: Du kommer til at få katøre og tale som en kat!
|
||||
showOnRemote: Vis på fjerninstans
|
||||
general: Generelt
|
||||
accountMoved: 'Bruger har flyttet til et nyt konto:'
|
||||
settings: Indstillinger
|
||||
basicSettings: Primær Indstillinger
|
||||
openInWindow: Åben i vindue
|
||||
noAccountDescription: Denne bruger har ikke skrevet deres bio endnu.
|
||||
loggingIn: Logger ind
|
||||
cantFavorite: Kunne ikke tilsætte til bogmærker.
|
||||
copyUsername: Kopi brugernavn
|
||||
copyContent: Kopi indholdet
|
||||
copyLink: Kopi link
|
||||
searchUser: Søg for en bruger
|
||||
files: Filer
|
||||
noLists: Du har ingen liste
|
||||
lists: Lister
|
||||
reaction: Reaktioner
|
||||
sensitive: NSFW
|
||||
emoji: Emoji
|
||||
cacheRemoteFilesDescription: Når denne indstilling er deaktiveret, fremmed filer bliver
|
||||
indlæset direkte fra denne fjerneinstans. Hvis du deaktivere dette så vil det formindske
|
||||
brugte opbevaringsplads men det vil også få netværktraffic til at stige fordi miniaturebilleder
|
||||
vil ikke blive skabt.
|
||||
flagAsBot: Markere denne konto som en robot
|
||||
flagShowTimelineRepliesDescription: Vis svare af brugere til opslage af andre brugere
|
||||
i tidslinjen hvis den bliver tændt.
|
||||
loginFailed: Kunne ikke logge ind
|
||||
silenceThisInstance: Nedtone denne instans
|
||||
deleteAndEditConfirm: Er du sikker på at du vil slet denne opslag og ændre det? Du
|
||||
vil tabe alle reaktioner, forstærkninger og svarer indenfor denne opslag.
|
||||
editNote: Ændre note
|
||||
deleted: Slettet
|
||||
edited: 'Ændret den {date} {time}'
|
||||
sendMessage: Send en besked
|
||||
youShouldUpgradeClient: Til at vise denne side, vær sød at refresh til at opdatere
|
||||
din brugerenhed.
|
||||
defaultNoteVisibility: Standard synlighed
|
||||
follow: Følge
|
||||
followRequest: Følge
|
||||
followRequests: Følgeanmodninger
|
||||
unfollow: Følge ikke længere
|
||||
followRequestPending: Følgeanmodning ventes på
|
||||
enterEmoji: Indtast en emoji
|
||||
renoted: Forstærket.
|
||||
cantRenote: Denne opslag kunne ikke forstærkes.
|
||||
cantReRenote: En forstærkelse kan ikke forstærkes.
|
||||
quote: Citere
|
||||
pinnedNote: Fastgjort opslag
|
||||
pinned: Fastgøre til profil
|
||||
you: Dig
|
||||
clickToShow: Tryk til at vise
|
||||
unblock: Blokere ikke længere
|
||||
suspend: Suspendere
|
||||
unsuspend: Suspendere ikke længere
|
||||
blockConfirm: Er du sikker på at du vil blokere denne konto?
|
||||
unblockConfirm: Er du sikker på at du vil ikke blokere denne konto endnu længere?
|
||||
suspendConfirm: Er du sikker på at du vil suspendere denne konto?
|
||||
selectAntenna: Vælg en antenne
|
||||
selectWidget: Vælg en widget
|
||||
editWidgets: Ændre widgettere
|
||||
customEmojis: Brugerdefineret emoji
|
||||
emojiName: Emoji navn
|
||||
operations: Operationer
|
||||
software: Software
|
||||
metadata: Metadata
|
||||
version: Version
|
||||
monitor: Vagt
|
||||
jobQueue: Jobkø
|
||||
statistics: Statistik
|
||||
cpuAndMemory: CPU og hukommelse
|
||||
network: Netværk
|
||||
disk: Disk
|
||||
instanceInfo: Instans information
|
||||
noThankYou: Nej tak
|
||||
noNotifications: Intet notifikationer
|
||||
addUser: Indsæt en bruger
|
||||
addInstance: Indsæt en instans
|
||||
favorite: Indsæt til bogmærker
|
||||
favorites: Bogmærker
|
||||
showMore: Vis mere
|
||||
showLess: Luk
|
||||
youGotNewFollower: følgte dig
|
||||
followRequestAccepted: Følgeanmodning accepteret
|
||||
mention: Nævne
|
||||
mentions: Nævnene
|
||||
directNotes: Direkt beskeder
|
||||
importAndExport: Importere/Eksporter data
|
||||
download: Download
|
||||
exportRequested: Du har bedt om en eksport. Det vil tage noget tid. Den vil blive
|
||||
tilsæt til din Drev når den er færdig.
|
||||
importRequested: Du har bedt om en eksport. Det vil tage noget tid.
|
||||
note: Opslag
|
||||
notes: Opslage
|
||||
following: Følger
|
||||
followers: Følgere
|
||||
followsYou: Følger dig
|
||||
createList: Skab en list
|
||||
manageLists: Administrere lister
|
||||
error: Fejl
|
||||
somethingHappened: En fejl har opstået
|
||||
retry: Gentage
|
||||
pageLoadError: En fejl har opstået ved indlæsning af siden.
|
||||
pageLoadErrorDescription: Dette er normalt på grund af netværksproblemer eller din
|
||||
browser's cache. Prøv at ryd cachen og så gentage efter et styk tid.
|
||||
serverIsDead: Serveren svarer ikke. Vær sød at vente et styk tid og prøv igen.
|
||||
editWidgetsExit: Færdig
|
||||
headlineFirefish: En åben-kildekode, decentraliseret social-media platform som er
|
||||
frit forevigt! 🚀
|
||||
introFirefish: Velkommen! Firefish er en åbent-kildekode, decentraliseret social-media
|
||||
platform som er frit forevigt!🚀
|
||||
enableEmojiReactions: Aktivere emoji reaktioner
|
||||
unsuspendConfirm: Er du sikker på at du vil ikke suspendere denne konto endnu længere?
|
||||
selectList: Vælg en list
|
||||
showEmojisInReactionNotifications: Vis emoji i reaktion notifikationer
|
||||
attachCancel: Fjern tilknyttelse
|
||||
markAsSensitive: Markere som NSFW
|
||||
unmarkAsSensitive: Markere ikke som NSFW længere
|
||||
enterFileName: Indtast filnavn
|
||||
mute: Nedtone
|
||||
unmute: Nedtone ikke længere
|
||||
renoteMute: Nedtone forstærkninger
|
||||
renoteUnmute: Nedtone forstærkninger ikke længere
|
||||
block: Blokere
|
||||
cacheRemoteFiles: Cachere fremmed filer
|
||||
flagAsBotDescription: Aktivere denne valgmulighed hvis denne konto er kontrolleret
|
||||
af en komputerprogram. Hvis den et tændt så vil det signalere til andre udviklere
|
||||
som arbejder på komputer-kontrolleret social-media kontoer og det vil også adjustere
|
||||
Firefish's indresystemer til at behandle denne konto som en robot.
|
||||
flagAsCat: Er du en kat? 😺
|
||||
flagSpeakAsCat: Tale som en kat
|
||||
emojiUrl: Emoji URL
|
||||
addEmoji: Tilsæt
|
||||
settingGuide: Anbefalet indstillinger
|
||||
flagSpeakAsCatDescription: Din opslage vil blive nyaniferet når du er i kat-mode
|
||||
autoAcceptFollowed: Automatisk godkende følgeanmodninger fra brugere som du selv følger
|
||||
addAccount: Tilsæt konto
|
||||
wallpaper: Baggrund
|
||||
setWallpaper: Sæt baggrund
|
||||
removeWallpaper: Fjern baggrund
|
||||
host: Host
|
||||
selectUser: Vælg en bruger
|
||||
searchWith: 'Søge: {q}'
|
||||
youHaveNoLists: Du har ingen liste
|
||||
followConfirm: Er du sikker på at du vil gerne følge {name}?
|
||||
proxyAccount: Proxykonto
|
||||
proxyAccountDescription: En proxykonto er en konto som virker som en fremmed følger
|
||||
for bruger under særlige konditioner. For eksempel, når en bruger tilsætter en fjernbruger
|
||||
til denne list, vil denne fjernbruger's aktivitet ikke blive leveret til den instans
|
||||
hvis ingen lokalebruger følger fjernbrugeren, så denne proxykonto vil følge den
|
||||
istedetfor.
|
||||
instances: Instanser
|
||||
registeredAt: Registreret på
|
||||
latestRequestSentAt: Sidste anmodning sendt
|
||||
latestRequestReceivedAt: Sidste anmodning modtaget
|
||||
selectInstance: Vælg en instans
|
||||
recipient: Recipient(er)
|
||||
annotation: Kommentarer
|
||||
federation: Føderation
|
||||
latestStatus: Senest status
|
||||
storageUsage: Opbevaringspladsbrug
|
||||
charts: Grafer
|
||||
perHour: Hver time
|
||||
perDay: Hver dag
|
||||
stopActivityDelivery: Stop med at sende aktiviteter
|
||||
blockThisInstance: Blokere denne instans
|
||||
muteAndBlock: Mutes og blokeringer
|
||||
mutedUsers: Mutede brugere
|
||||
newer: nyere
|
||||
older: ældre
|
||||
silencedInstances: Nedtonede servere
|
||||
clearQueue: Ryd kø
|
||||
clearQueueConfirmTitle: Er du sikker på, at du ønsker at rydde køen?
|
||||
clearCachedFiles: Ryd cache
|
||||
clearCachedFilesConfirm: Er du sikker på, at du ønsker at slette alle cachede eksterne
|
||||
filer?
|
||||
blockedInstances: Blokerede servere
|
||||
blockedInstancesDescription: Listen af navne på servere, du ønsker at blokere. Servere
|
||||
på listen vil ikke længere kunne kommunikere med denne server.
|
||||
hiddenTags: Skjulte hashtags
|
||||
clearQueueConfirmText: De indlæg i denne kø, der ikke allerede er leveret, vil ikke
|
||||
blive federeret. Denne operation er almindeligvis ikke påkrævet.
|
||||
jumpToPrevious: Spring til tidligere
|
||||
cw: Advarsel om indhold
|
2344
locales/de-DE.yml
Normal file
2344
locales/de-DE.yml
Normal file
File diff suppressed because it is too large
Load diff
815
locales/el-GR.yml
Normal file
815
locales/el-GR.yml
Normal file
|
@ -0,0 +1,815 @@
|
|||
_lang_: "Ελληνικά"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Αναζήτηση"
|
||||
notifications: "Ειδοποιήσεις"
|
||||
username: "Όνομα μέλους"
|
||||
password: "Κωδικός πρόσβασης"
|
||||
forgotPassword: "Ξέχασα τον κωδικό πρόσβασης"
|
||||
fetchingAsApObject: "Άντληση από το Fediverse"
|
||||
ok: "Εντάξει"
|
||||
gotIt: "Τό'πιασα!"
|
||||
cancel: "Ακύρωση"
|
||||
enterUsername: "Εισαγωγή ονόματος μέλους"
|
||||
renotedBy: "Προωθήθηκε από {user}"
|
||||
noNotes: "Δεν υπάρχουν δημοσιεύσεις"
|
||||
noNotifications: "Δεν υπάρχουν ειδοποιήσεις"
|
||||
settings: "Ρυθμίσεις"
|
||||
basicSettings: "Βασικές Ρυθμίσεις"
|
||||
otherSettings: "Άλλες Ρυθμίσεις"
|
||||
openInWindow: "Άνοιγμα σε παράθυρο"
|
||||
profile: "Προφίλ"
|
||||
timeline: "Χρονολόγιο"
|
||||
noAccountDescription: "Αυτό το μέλος δεν έχει γράψει βιογραφικό ακόμη."
|
||||
login: "Σύνδεση"
|
||||
loggingIn: "Συνδέεστε"
|
||||
logout: "Αποσύνδεση"
|
||||
signup: "Εγγραφή"
|
||||
uploading: "Ανέβασμα..."
|
||||
save: "Αποθήκευση"
|
||||
users: "Μέλη"
|
||||
addUser: "Προσθήκη μέλους"
|
||||
favorite: "Προσθήκη στους σελιδοδείκτες"
|
||||
favorites: "Σελιδοδείκτες"
|
||||
unfavorite: "Αφαίρεση από τους σελιδοδείκτες"
|
||||
favorited: "Προστέθηκε στους σελιδοδείκτες."
|
||||
alreadyFavorited: "Έχει ήδη προστεθεί στους σελιδοδείκτες."
|
||||
cantFavorite: "Αδυναμία προσθήκης στους σελιδοδείκτες."
|
||||
pin: "Καρφίτσωμα στο προφίλ"
|
||||
unpin: "Ξεκαρφίτσωμα από το προφίλ"
|
||||
copyContent: "Αντιγραφή περιεχομένων"
|
||||
copyLink: "Αντιγραφή συνδέσμου"
|
||||
delete: "Διαγραφή"
|
||||
deleteAndEdit: "Διαγραφή και επεξεργασία"
|
||||
deleteAndEditConfirm: "Σίγουρα θέλετε να διαγράψετε αυτή τη δημοσίευση και να την
|
||||
επεξεργαστείτε; Θα χάσετε όλες τις αντιδράσεις, προωθήσεις και απαντήσεις σε αυτήν."
|
||||
addToList: "Προσθήκη στη λίστα"
|
||||
sendMessage: "Αποστολή μηνύματος"
|
||||
copyUsername: "Αντιγραφή ονόματος μέλους"
|
||||
searchUser: "Αναζήτηση μέλους"
|
||||
reply: "Απάντηση"
|
||||
loadMore: "Φόρτωσε περισσότερα"
|
||||
showMore: "Δείξε περισσότερα"
|
||||
showLess: "Κλείσιμο"
|
||||
youGotNewFollower: "σε ακολούθησε"
|
||||
receiveFollowRequest: "Λάβατε αίτημα ακολούθησης"
|
||||
followRequestAccepted: "Το αίτημα ακολούθησης έγινε δεκτό"
|
||||
mention: "Επισήμανση"
|
||||
mentions: "Επισημάνσεις"
|
||||
directNotes: "Απευθείας μηνύματα"
|
||||
importAndExport: "Εισαγωγή/Εξαγωγή Δεδομένων"
|
||||
import: "Εισαγωγή"
|
||||
export: "Εξαγωγή"
|
||||
files: "Αρχεία"
|
||||
download: "Κατέβασμα"
|
||||
driveFileDeleteConfirm: "Θέλετε σίγουρα να διαγράψετε το αρχείο \"{name}\"; Οι δημοσιεύσεις
|
||||
με αυτό το συνημμένο αρχείο επίσης θα διαγραφούν."
|
||||
unfollowConfirm: "Θέλετε σίγουρα να σταματήσετε να ακολουθείτε το μέλος {name};"
|
||||
exportRequested: "Ζητήσατε μία εξαγωγή. Αυτό μπορεί να πάρει κάποιον χρόνο. Θα προστεθεί
|
||||
στον Αποθηκευτικό Χώρο σας μόλις ολοκληρωθεί."
|
||||
importRequested: "Ζητήσατε μια εισαγωγή. Αυτό μπορεί να πάρει κάποιον χρόνο."
|
||||
lists: "Λίστες"
|
||||
noLists: "Δεν έχετε λίστες"
|
||||
note: "Δημοσίευση"
|
||||
notes: "Δημοσιεύσεις"
|
||||
following: "Ακολουθεί"
|
||||
followers: "Ακολουθούν"
|
||||
followsYou: "Σε ακολουθεί"
|
||||
createList: "Δημιουργία λίστας"
|
||||
manageLists: "Διαχείριση λιστών"
|
||||
error: "Σφάλμα"
|
||||
somethingHappened: "Προέκυψε ένα σφάλμα"
|
||||
retry: "Προσπάθεια ξανά"
|
||||
pageLoadError: "Ένα σφάλμα προέκυψε φορτώνοντας τη σελίδα."
|
||||
pageLoadErrorDescription: "Αυτό κανονικά προκαλείται από σφάλματα δικτύου ή από την
|
||||
προσωρινή μνήμη του προγράμματος περιήγησης. Δοκιμάστε να σβήσετε την προσωρινή
|
||||
μνήμη (cache) και να δοκιμάσετε ξανά μετά από λίγο."
|
||||
serverIsDead: "Αυτός ο διακομιστής (server) δεν αποκρίνεται. Παρακαλώ περιμένετε λίγο
|
||||
και δοκιμάστε ξανά."
|
||||
youShouldUpgradeClient: "Για να δείτε αυτή τη σελίδα, παρακαλώ επαναφορτώστε για να
|
||||
γίνει ενημέρωση."
|
||||
enterListName: "Πληκτρολογήστε ένα όνομα για τη λίστα"
|
||||
privacy: "Ιδιωτικότητα"
|
||||
makeFollowManuallyApprove: "Τα αιτήματα ακολούθησης χρειάζονται έγκριση"
|
||||
defaultNoteVisibility: "Προεπιλεγμένη ορατότητα"
|
||||
follow: "Ακολουθήστε"
|
||||
followRequest: "Ακολουθήστε"
|
||||
followRequests: "Αιτήματα ακολούθησης"
|
||||
unfollow: "Να μην ακολουθώ"
|
||||
followRequestPending: "Το αίτημα ακολούθησης εκκρεμεί"
|
||||
enterEmoji: "Εισάγετε ένα emoji"
|
||||
renote: "Προώθηση"
|
||||
unrenote: "Αναίρεση προώθησης"
|
||||
renoted: "Προωθήθηκε."
|
||||
cantRenote: "Αυτή η δημοσίευση δεν μπορεί να προωθηθεί."
|
||||
cantReRenote: "Μία προώθηση δεν μπορεί να προωθηθεί."
|
||||
quote: "Παράθεση"
|
||||
pinnedNote: "Καρφιτσωμένη δημοσίευση"
|
||||
pinned: "Καρφίτσωμα στο προφίλ"
|
||||
you: "Εσύ"
|
||||
clickToShow: "Κάντε κλικ για εμφάνιση"
|
||||
add: "Προσθήκη"
|
||||
reaction: "Αντιδράσεις"
|
||||
reactionSetting: "Αντιδράσεις που θα εμφανίζονται στον επιλογέα"
|
||||
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε,
|
||||
πατήστε \"+\" για να προσθέσετε."
|
||||
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας για τις δημοσιεύσεις"
|
||||
attachCancel: "Αφαίρεση επισυναπτόμενου"
|
||||
enterFileName: "Πληκτρολογήστε όνομα αρχείου"
|
||||
mute: "Σίγαση"
|
||||
unmute: "Διακοπή σίγασης"
|
||||
block: "Μπλοκάρισμα"
|
||||
unblock: "Διακοπή μπλοκαρίσματος"
|
||||
suspend: "Αποβολή"
|
||||
unsuspend: "Διακοπή αποβολής"
|
||||
blockConfirm: "Θέλετε σίγουρα να μπλοκάρετε αυτόν τον λογαριασμό;"
|
||||
unblockConfirm: "Θέλετε σίγουρα να ξεμπλοκάρετε αυτόν τον λογαριασμό;"
|
||||
suspendConfirm: "Θέλετε σίγουρα να αποβάλετε αυτόν τον λογαριασμό;"
|
||||
unsuspendConfirm: "Θέλετε σίγουρα να άρετε την αποβολή αυτού του λογαριασμού;"
|
||||
selectList: "Επιλέξτε μια λίστα"
|
||||
selectAntenna: "Επιλέξτε μια αντένα"
|
||||
selectWidget: "Επιλέξτε ένα πρόσθετο"
|
||||
editWidgets: "Επεξεργασία πρόσθετων"
|
||||
editWidgetsExit: "Ολοκληρώθηκε"
|
||||
customEmojis: "Προσαρμοσμένα Emoji"
|
||||
emojiName: "Όνομα emoji"
|
||||
addEmoji: "Προσθήκη"
|
||||
settingGuide: "Προτεινόμενες ρυθμίσεις"
|
||||
flagAsBot: "Δήλωση αυτού του λογαριασμού ως bot"
|
||||
flagAsCat: "Είσαι γατί; 😺"
|
||||
flagShowTimelineReplies: "Εμφάνιση απαντήσεων στο χρονολόγιο"
|
||||
addAccount: "Προσθήκη λογαριασμού"
|
||||
general: "Γενικές"
|
||||
wallpaper: "Ταπετσαρία"
|
||||
setWallpaper: "Ορισμός ταπετσαρίας"
|
||||
removeWallpaper: "Αφαίρεση ταπετσαρίας"
|
||||
searchWith: "Αναζήτηση: {q}"
|
||||
youHaveNoLists: "Δεν έχετε λίστες"
|
||||
followConfirm: "Θέλετε σίγουρα να ακολουθήσετε τον λογαριασμό {name};"
|
||||
host: "Φιλοξενεί (Host)"
|
||||
selectUser: "Επιλέξτε ένα μέλος"
|
||||
recipient: "Αποδέκτης-τρια(-ες)"
|
||||
annotation: "Σχόλια"
|
||||
federation: "Ομοσπονδία"
|
||||
storageUsage: "Χρήση χώρου"
|
||||
version: "Έκδοση"
|
||||
metadata: "Μεταδεδομένα"
|
||||
network: "Δίκτυο"
|
||||
disk: "Δίσκος"
|
||||
instanceInfo: "Πληροφορίες Instance"
|
||||
statistics: "Στατιστικά"
|
||||
clearQueue: "Εκκαθάριση ουράς"
|
||||
clearQueueConfirmTitle: "Θέλετε να διαγράψετε την ουρά;"
|
||||
clearCachedFiles: "Εκκαθάριση προσωρινής μνήμης (cache)"
|
||||
done: "Ολοκληρώθηκε"
|
||||
attachFile: "Επισύναψη αρχείων"
|
||||
more: "Περισσότερα!"
|
||||
noSuchUser: "Το μέλος δεν βρέθηκε"
|
||||
announcements: "Ανακοινώσεις"
|
||||
imageUrl: "URL εικόνας"
|
||||
remove: "Διαγραφή"
|
||||
removed: "Η διαγραφή ολοκληρώθηκε επιτυχώς"
|
||||
saved: "Αποθηκεύτηκε"
|
||||
messaging: "Συνομιλία"
|
||||
upload: "Ανεβάστε"
|
||||
fromDrive: "Από τον Αποθηκευτικό Χώρο"
|
||||
fromUrl: "Από URL"
|
||||
uploadFromUrl: "Ανέβασμα από URL"
|
||||
explore: "Εξερεύνηση"
|
||||
messageRead: "Διαβάστηκε"
|
||||
startMessaging: "Ξεκινήστε μια νέα συνομιλία"
|
||||
nUsersRead: "διαβάστηκε από {n}"
|
||||
tos: "Όροι Χρήσης"
|
||||
start: "Ας αρχίσουμε"
|
||||
home: "Κεντρικό"
|
||||
activity: "Δραστηριότητα"
|
||||
images: "Εικόνες"
|
||||
birthday: "Γενέθλια"
|
||||
registeredDate: "Έγινε μέλος στις"
|
||||
location: "Τοποθεσία"
|
||||
theme: "Θέματα"
|
||||
light: "Φωτεινό"
|
||||
dark: "Σκοτεινό"
|
||||
drive: "Αποθηκευτικός Χώρος"
|
||||
fileName: "Όνομα αρχείου"
|
||||
selectFile: "Επιλέξτε ένα αρχείο"
|
||||
selectFiles: "Επιλέξτε αρχεία"
|
||||
selectFolder: "Επιλέξτε φάκελο"
|
||||
selectFolders: "Επιλέξτε φακέλους"
|
||||
renameFile: "Μετονομασία αρχείου"
|
||||
addFile: "Προσθέστε ένα αρχείο"
|
||||
emptyDrive: "Ο Αποθηκευτικός Χώρος σας είναι άδειος"
|
||||
copyUrl: "Αντιγραφή διεύθυνσης URL"
|
||||
rename: "Μετονομασία"
|
||||
avatar: "Άβαταρ"
|
||||
banner: "Εξώφυλλο"
|
||||
reload: "Ανανέωση"
|
||||
doNothing: "Αγνόηση"
|
||||
watch: "Παρακολούθηση"
|
||||
unwatch: "Διακοπή παρακολούθησης"
|
||||
accept: "Αποδοχή"
|
||||
reject: "Απόρριψη"
|
||||
normal: "Κανονικό"
|
||||
instanceName: "Όνομα instance"
|
||||
thisYear: "Έτος"
|
||||
thisMonth: "Μήνας"
|
||||
today: "Σήμερα"
|
||||
dayX: "{day}"
|
||||
pages: "Σελίδες"
|
||||
registration: "Εγγραφή"
|
||||
pinnedPages: "Καρφιτσωμένες Σελίδες"
|
||||
pinnedNotes: "Καρφιτσωμένες δημοσιεύσεις"
|
||||
antennas: "Αντένες"
|
||||
manageAntennas: "Διαχείριση Αντενών"
|
||||
name: "Όνομα"
|
||||
antennaSource: "Πηγή Αντένας"
|
||||
antennaKeywords: "Λέξεις-κλειδιά για παρακολούθηση"
|
||||
antennaExcludeKeywords: "Λέξεις-κλειδιά για εξαίρεση"
|
||||
notifyAntenna: "Ειδοποίηση για νέες δημοσιεύσεις"
|
||||
withFileAntenna: "Μόνο δημοσιεύσεις με αρχεία"
|
||||
caseSensitive: "Διάκριση Πεζών-Κεφαλαίων"
|
||||
popularTags: "Δημοφιλείς ετικέτες"
|
||||
userList: "Λίστες"
|
||||
about: "Σχετικά με"
|
||||
moderator: "Συντονιστής/στρια"
|
||||
moderation: "Συντονισμός"
|
||||
cacheClear: "Εκκαθάριση προσωρινής μνήμης (cache)"
|
||||
markAsReadAllNotifications: "Σημειώστε όλες τις ειδοποιήσεις ως διαβασμένες"
|
||||
group: "Ομάδα"
|
||||
groups: "Ομάδες"
|
||||
createGroup: "Δημιουργία ομάδας"
|
||||
ownedGroups: "Οι ομάδες σας"
|
||||
groupName: "Όνομα ομάδας"
|
||||
members: "Μέλη"
|
||||
transfer: "Μεταφορά"
|
||||
messagingWithUser: "Προσωπική συνομιλία"
|
||||
messagingWithGroup: "Ομαδική συνομιλία"
|
||||
title: "Τίτλος"
|
||||
text: "Κείμενο"
|
||||
enable: "Ενεργοποίηση"
|
||||
next: "Επόμενο"
|
||||
noteOf: "Δημοσίευση από {user}"
|
||||
inviteToGroup: "Πρόσκληση στην ομάδα"
|
||||
quoteAttached: "Παράθεση"
|
||||
signinRequired: "Παρακαλούμε δημιουργήστε λογαριασμό ή συνδεθείτε πριν συνεχίσετε"
|
||||
category: "Κατηγορία"
|
||||
tags: "Ετικέτες"
|
||||
createAccount: "Δημιουργία λογαριασμού"
|
||||
local: "Τοπικό"
|
||||
remote: "Απομακρυσμένο"
|
||||
total: "Σύνολο"
|
||||
appearance: "Εμφάνιση"
|
||||
accountSettings: "Ρυθμίσεις Λογαριασμού"
|
||||
sounds: "Ήχοι"
|
||||
sound: "Ήχοι"
|
||||
listen: "Ακρόαση"
|
||||
showInPage: "Εμφάνιση στη σελίδα"
|
||||
volume: "Ένταση"
|
||||
masterVolume: "Κεντρική ένταση"
|
||||
details: "Λεπτομέρειες"
|
||||
install: "Εγκαταστήστε"
|
||||
uninstall: "Απεγκατάσταση"
|
||||
manage: "Διαχείριση"
|
||||
smtpHost: "Φιλοξενεί (Host)"
|
||||
smtpUser: "Όνομα μέλους"
|
||||
smtpPass: "Κωδικός"
|
||||
notificationSetting: "Ρυθμίσεις ειδοποιήσεων"
|
||||
notificationSettingDesc: "Επιλέξτε τους τύπους ειδοποιήσεων για προβολή."
|
||||
switchUi: "Διάταξη"
|
||||
clip: "Κλιπ"
|
||||
driveFilesCount: "Αριθμός αρχείων Αποθηκευτικού Χώρου"
|
||||
driveUsage: "Χρήση Αποθηκευτικού Χώρου"
|
||||
noteFavoritesCount: "Αριθμός αγαπημένων σημειωμάτων"
|
||||
clips: "Κλιπ"
|
||||
clearCache: "Εκκαθάριση προσωρινής μνήμης"
|
||||
emailNotification: "Ειδοποιήσεις μέσω mail"
|
||||
inChannelSearch: "Αναζήτηση στο κανάλι"
|
||||
info: "Πληροφορίες"
|
||||
notRecommended: "Δεν προτείνεται"
|
||||
switchAccount: "Αλλαγή λογαριασμού"
|
||||
user: "Μέλη"
|
||||
administration: "Διαχείριση"
|
||||
switch: "Εναλλαγή"
|
||||
gallery: "Γκαλερί"
|
||||
global: "Παγκόσμιο"
|
||||
searchResult: "Αποτελέσματα αναζήτησης"
|
||||
learnMore: "Μάθετε περισσότερα"
|
||||
controlPanel: "Πίνακας ελέγχου"
|
||||
manageAccounts: "Διαχείριση Λογαριασμών"
|
||||
file: "Αρχεία"
|
||||
recommended: "Προτεινόμενα"
|
||||
cannotUploadBecauseNoFreeSpace: "Το ανέβασμα απέτυχε λόγω ανεπαρκούς Αποθηκευτικού
|
||||
Χώρου."
|
||||
_email:
|
||||
_follow:
|
||||
title: "Έχετε ένα νέο ακόλουθο"
|
||||
_mfm:
|
||||
mention: "Επισήμανση"
|
||||
quote: "Παράθεση"
|
||||
emoji: "Επιπλέον emoji"
|
||||
search: "Αναζήτηση"
|
||||
_channel:
|
||||
featured: "Δημοφιλή"
|
||||
_theme:
|
||||
keys:
|
||||
panel: "Πίνακας"
|
||||
mention: "Επισήμανση"
|
||||
renote: "Κοινοποίηση σημειώματος"
|
||||
_sfx:
|
||||
note: "Σημειώματα"
|
||||
notification: "Ειδοποιήσεις"
|
||||
chat: "Συνομιλία"
|
||||
chatBg: "Συνομιλία (Παρασκήνιο)"
|
||||
antenna: "Αντένες"
|
||||
channel: "Ειδοποιήσεις καναλιών"
|
||||
_ago:
|
||||
future: "Μελλοντικό"
|
||||
justNow: "Μόλις τώρα"
|
||||
secondsAgo: "{n} δευτερόλεπτο(α) πριν"
|
||||
minutesAgo: "{n} λεπτό(ά) πριν"
|
||||
hoursAgo: "{n} ώρα(ες) πριν"
|
||||
daysAgo: "{n} μέρα(ες) πριν"
|
||||
weeksAgo: "{n} εβδομάδα(ες) πριν"
|
||||
monthsAgo: "{n} μήνα(ες) πριν"
|
||||
yearsAgo: "{n} έτος(η) πριν"
|
||||
_permissions:
|
||||
"write:drive": "Επεξεργαστείτε ή διαγράψτε τα αρχεία και τους φακέλους του Αποθηκευτικού
|
||||
Χώρου σας"
|
||||
"read:favorites": "Δείτε τη λίστα με τους σελιδοδείκτες σας"
|
||||
"write:favorites": "Επεξεργαστείτε τη λίστα με τους σελιδοδείκτες σας"
|
||||
"read:messaging": "Δείτε τις συνομιλίες σας"
|
||||
"write:messaging": "Γράψτε ή διαγράψτε μηνύματα συνομιλίας"
|
||||
"read:notifications": "Δείτε τις ειδοποιήσεις σας"
|
||||
"write:notifications": "Διαχειριστείτε τις ειδοποιήσεις σας"
|
||||
"read:pages": "Δείτε τις Σελίδες σας"
|
||||
"write:pages": "Επεξεργαστείτε ή διαγράψτε τις σελίδες σας"
|
||||
"write:gallery-likes": Επεξεργασία της λίστας των αγαπημένων σας δημοσιεύσεων γκαλερί
|
||||
"read:gallery": Δείτε την γκαλερί σας
|
||||
"write:gallery": Επεξεργασία της γκαλερί σας
|
||||
"read:gallery-likes": Δείτε τη λίστα των αγαπημένων σας δημοσιεύσεων γκαλερί
|
||||
_antennaSources:
|
||||
all: "Όλα τα σημειώματα"
|
||||
homeTimeline: "Σημειώματα από μέλη που ακολουθείτε"
|
||||
users: "Σημειώματα από συγκεκριμένα μέλη"
|
||||
userList: "Σημειώματα από καθορισμένη λίστα μελών"
|
||||
userGroup: "Σημειώματα από μέλη καθορισμένης ομάδας"
|
||||
_widgets:
|
||||
profile: "Προφίλ"
|
||||
instanceInfo: "Πληροφορίες του instance"
|
||||
notifications: "Ειδοποιήσεις"
|
||||
timeline: "Χρονολόγιο"
|
||||
calendar: "Ημερολόγιο"
|
||||
trends: "Δημοφιλή"
|
||||
clock: "Ρολόι"
|
||||
activity: "Δραστηριότητα"
|
||||
photos: "Φωτογραφίες"
|
||||
digitalClock: "Ψηφιακό ρολόι"
|
||||
federation: "Ομοσπονδία"
|
||||
postForm: "Φόρμα δημοσίευσης"
|
||||
button: "Κουμπί"
|
||||
onlineUsers: "Συνδεδεμένα μέλη"
|
||||
_userList:
|
||||
chooseList: "Επιλέξτε μία λίστα"
|
||||
_cw:
|
||||
show: "Δείτε περισσότερα"
|
||||
_visibility:
|
||||
home: "Κεντρικό"
|
||||
homeDescription: "Δημοσίευση στο κεντρικό χρονολόγιο μόνο"
|
||||
followers: "Ακολουθούν"
|
||||
_profile:
|
||||
name: "Όνομα"
|
||||
username: "Όνομα μέλους"
|
||||
changeAvatar: Αλλαγή άβαταρ
|
||||
_exportOrImport:
|
||||
allNotes: "Όλα τα σημειώματα"
|
||||
followingList: "Ακολουθεί"
|
||||
muteList: "Μέλη σε σίγαση"
|
||||
blockingList: "Μπλοκαρισμένα μέλη"
|
||||
userLists: "Λίστες"
|
||||
_charts:
|
||||
federation: "Ομοσπονδία"
|
||||
_timelines:
|
||||
home: "Κεντρικό"
|
||||
local: "Τοπικό"
|
||||
social: "Κοινωνικό"
|
||||
global: "Παγκόσμιο"
|
||||
_pages:
|
||||
viewPage: "Δείτε τις Σελίδες σας"
|
||||
blocks:
|
||||
image: "Εικόνες"
|
||||
_notification:
|
||||
youGotMessagingMessageFromUser: "{name} σάς έστειλε ένα μήνυμα συνομιλίας"
|
||||
youWereFollowed: "σε ακολούθησε"
|
||||
_types:
|
||||
follow: "Νέοι ακόλουθοι"
|
||||
mention: "Επισήμανση"
|
||||
renote: "Κοινοποίηση σημειώματος"
|
||||
quote: "Παράθεση"
|
||||
reaction: "Αντιδράσεις"
|
||||
_actions:
|
||||
reply: "Απάντηση"
|
||||
renote: "Κοινοποίηση σημειώματος"
|
||||
_deck:
|
||||
widgetsIntroduction: "Παρακαλούμε επιλέξτε \"Επεξεργασία πρόσθετων\" στο μενού και
|
||||
προσθέστε μαραφέτι."
|
||||
_columns:
|
||||
widgets: "Πρόσθετα"
|
||||
notifications: "Ειδοποιήσεις"
|
||||
tl: "Χρονολόγιο"
|
||||
antenna: "Αντένες"
|
||||
list: "Λίστα"
|
||||
mentions: "Επισημάνσεις"
|
||||
sensitive: Ευαίσθητο περιεχόμενο (NSFW)
|
||||
createFolder: Δημιουργία φακέλου
|
||||
uploadFromUrlDescription: Το URL του αρχείου που θέλετε να ανεβάσετε
|
||||
emptyFolder: Αυτός ο φάκελος είναι άδειος
|
||||
unableToDelete: Αδυναμία διαγραφής
|
||||
recentlyUpdatedUsers: Πρόσφατα ενεργά μέλη
|
||||
recentlyRegisteredUsers: Νέα μέλη
|
||||
exploreUsersCount: Υπάρχουν {count} μέλη
|
||||
help: Βοήθεια
|
||||
inputNewFileName: Πληκτρολογήστε ένα νέο όνομα αρχείου
|
||||
nothing: Δεν υπάρχει τίποτα να δείτε εδώ
|
||||
newNoteRecived: Υπάρχουν νέες δημοσιεύσεις
|
||||
passwordMatched: Ταιριάζει
|
||||
unmarkAsSensitive: Αναίρεση επισήμανσης ως Ευαίσθητο Περιεχόμενο (NSFW)
|
||||
blockedUsers: Μπλοκαρισμένα μέλη
|
||||
noteDeleteConfirm: Θέλετε σίγουρα να διαγράψετε αυτή τη δημοσίευση;
|
||||
preview: Προεπισκόπηση
|
||||
noCustomEmojis: Δεν υπάρχουν emoji
|
||||
tosUrl: URL Όρων Χρήσης
|
||||
monthX: '{month}'
|
||||
markAsReadAllTalkMessages: Σημειώστε όλα τα μηνύματα ως διαβασμένα
|
||||
inputMessageHere: Γράψτε εδώ το μήνυμά σας
|
||||
close: Κλείσιμο
|
||||
newMessageExists: Υπάρχουν νέα μηνύματα
|
||||
usernameInvalidFormat: Μπορείτε να χρησιμοποιήσετε κεφαλαία και μικρά γράμματα, αριθμούς,
|
||||
και κάτω παύλες.
|
||||
tooShort: Πολύ σύντομο
|
||||
passwordNotMatched: Δεν ταιριάζει
|
||||
existingAccount: Υπάρχων λογαριασμός
|
||||
deleteAll: Διαγραφή όλων
|
||||
chooseEmoji: Επιλέξτε ένα emoji
|
||||
sort: Ταξινόμηση
|
||||
descendingOrder: Φθίνουσα
|
||||
deleteAllFiles: Διαγραφή όλων των αρχείων
|
||||
userSuspended: Αυτό το μέλος έχει αποβληθεί.
|
||||
menu: Μενού
|
||||
divider: Χώρισμα
|
||||
deletedNote: Διαγραμμένη δημοσίευση
|
||||
useCw: Απόκρυψη περιεχομένου
|
||||
description: Περιγραφή
|
||||
width: Πλάτος
|
||||
disableAll: Απενεργοποίηση όλων
|
||||
notificationType: Τύπος ειδοποίησης
|
||||
wordMute: Σίγαση λέξεων
|
||||
userSaysSomething: '{name} είπε κάτι'
|
||||
metrics: Μετρήσεις
|
||||
overview: Γενική εικόνα
|
||||
database: Βάση δεδομένων
|
||||
channel: Κανάλια
|
||||
other: Άλλα
|
||||
abuseReports: Αναφορές
|
||||
reportAbuse: Αναφορά
|
||||
unclip: Ακύρωση κλιπ
|
||||
public: Δημόσιο
|
||||
renotedCount: Αριθμός προωθήσεων που ελήφθησαν
|
||||
alwaysMarkSensitive: Επισήμανση ως ευαίσθητο περιεχόμενο (NSFW) ως προεπιλογή
|
||||
markAllAsRead: Σημειώστε τα όλα ως διαβασμένα
|
||||
_gallery:
|
||||
like: Μου αρέσει
|
||||
liked: Αγαπημένες δημοσιεύσεις
|
||||
my: Η Γκαλερί μου
|
||||
unlike: Δεν μου αρέσει
|
||||
showOnRemote: Δείτε στο απομακρυσμένο instance
|
||||
perDay: Ανά Ημέρα
|
||||
software: Λογισμικό
|
||||
cpuAndMemory: CPU και Μνήμη
|
||||
noUsers: Δεν υπάρχουν μέλη
|
||||
processing: Επεξεργασία
|
||||
changePassword: Αλλαγή κωδικού
|
||||
security: Ασφάλεια
|
||||
featured: Προτεινόμενα
|
||||
keepOriginalUploading: Διατήρηση πρωτότυπης εικόνας
|
||||
manageGroups: Διαχείριση ομάδων
|
||||
deleteFolder: Διαγραφή φακέλου
|
||||
nsfw: Ευαίσθητο περιεχόμενο (NSFW)
|
||||
nUsersMentioned: Έχει αναφερθεί από {n} μέλη
|
||||
notFound: Δεν βρέθηκε
|
||||
markAsReadAllUnreadNotes: Σημειώστε όλες τις δημοσιεύσεις ως διαβασμένες
|
||||
invites: Προσκλήσεις
|
||||
quoteQuestion: Να προστεθεί ως Παράθεση;
|
||||
noMessagesYet: Δεν υπάρχουν μηνύματα ακόμη
|
||||
onlyOneFileCanBeAttached: Μπορείτε να επισυνάψετε μόνο ένα αρχείο σε ένα μήνυμα
|
||||
tooLong: Υπερβολικά μακροσκελές
|
||||
or: Ή
|
||||
language: Γλώσσα
|
||||
groupInvited: Προσκληθήκατε σε μία ομάδα
|
||||
ascendingOrder: Αύξουσα
|
||||
visibility: Ορατότητα
|
||||
invisibleNote: Αόρατη δημοσίευση
|
||||
enableInfiniteScroll: Αυτόματη φόρτωση περισσοτέρων
|
||||
poll: Ψηφοφορία
|
||||
enablePlayer: Άνοιγμα προβολής βίντεο
|
||||
large: Μεγάλο
|
||||
medium: Μεσαίο
|
||||
small: Μικρό
|
||||
postToGallery: Δημιουργία νέας δημοσίευσης γκαλερί
|
||||
reloadConfirm: Θα θέλατε να ανανεώσετε το χρονολόγιο;
|
||||
enableAll: Ενεργοποίηση όλων
|
||||
permission: Εξουσιοδοτήσεις
|
||||
sample: Δείγμα
|
||||
copy: Αντιγραφή
|
||||
display: Προβολή
|
||||
send: Αποστολή
|
||||
behavior: Συμπεριφορά
|
||||
useGlobalSetting: Χρήση παγκόσμιων ρυθμίσεων
|
||||
abuseMarkAsResolved: Επισήμανση της αναφοράς ως επιλυμένης
|
||||
openInNewTab: Άνοιγμα σε νέα καρτέλα
|
||||
_sensitiveMediaDetection:
|
||||
setSensitiveFlagAutomatically: Επισήμανση ως ευαίσθητο περιεχόμενο (NSFW)
|
||||
defaultNavigationBehaviour: Προεπιλεγμένη συμπεριφορά περιήγησης
|
||||
system: Σύστημα
|
||||
createNew: Δημιουργία νέου
|
||||
createNewClip: Δημιουργία νέου κλιπ
|
||||
repliesCount: Αριθμός απεσταλμένων απαντήσεων
|
||||
optional: Προαιρετικό
|
||||
renotesCount: Αριθμός προωθήσεων σε δημοσιεύσεις άλλων
|
||||
addItem: Προσθήκη αντικειμένου
|
||||
disablePlayer: Κλείσιμο προβολής βίντεο
|
||||
describeFile: Προσθήκη περιγραφής
|
||||
enterFileDescription: Πληκτρολογήστε περιγραφή
|
||||
author: Συντάκτης/τρια
|
||||
setMultipleBySeparatingWithSpace: Διαχωρίστε πολλαπλές καταχωρήσεις με κενά.
|
||||
random: Τυχαίο
|
||||
accountInfo: Πληροφορίες Λογαριασμού
|
||||
notesCount: Αριθμός δημοσιεύσεων
|
||||
repliedCount: Αριθμός απαντήσεων που ελήφθησαν
|
||||
flagAsCatDescription: Θα έχεις γατοαυτιά και θα μιλάς σαν γατί!
|
||||
muteAndBlock: Σιγάσεις και Μπλοκαρίσματα
|
||||
mutedUsers: Σιγασμένα μέλη
|
||||
editProfile: Επεξεργασία προφίλ
|
||||
pinLimitExceeded: Δεν μπορείτε να καρφιτσώσετε άλλες δημοσιεύσεις
|
||||
currentPassword: Τρέχων κωδικός
|
||||
newPassword: Νέος κωδικός
|
||||
newPasswordRetype: Ξαναπληκτρολογήστε τον νέο κωδικό
|
||||
notesAndReplies: Δημοσιεύσεις και απαντήσεις
|
||||
popularUsers: Δημοφιλή μέλη
|
||||
share: Κοινοποίηση
|
||||
retype: Πληκτρολογήστε ξανά
|
||||
invitations: Προσκλήσεις
|
||||
available: Διαθέσιμο
|
||||
unavailable: Μη διαθέσιμο
|
||||
youHaveNoGroups: Δεν έχετε ομάδες
|
||||
doing: Επεξεργασία...
|
||||
yourAccountSuspendedTitle: Αυτός ο λογαριασμός έχει αποβληθεί
|
||||
leaveConfirm: Υπάρχουν αλλαγές που δεν έχουν σωθεί. Θέλετε να τις απορρίψετε;
|
||||
height: Ύψος
|
||||
edit: Επεξεργασία
|
||||
headlineFirefish: Μία ανοιχτού λογισμικού, αποκεντρωμένη πλατφόρμα κοινωνικής δικτύωσης
|
||||
που θα είναι για πάντα ελεύθερη! 🚀
|
||||
introFirefish: Καλώς ήρθατε! Το Firefish είναι μία ανοιχτού λογισμικού, αποκεντρωμένη
|
||||
πλατφόρμα κοινωνικής δικτύωσης που θα είναι για πάντα ελεύθερη! 🚀
|
||||
markAsSensitive: Επισήμανση ως Ευαίσθητο Περιεχόμενο (NSFW)
|
||||
autoAcceptFollowed: Αυτόματη έγκριση αιτημάτων ακολούθησης από λογαριασμούς που ακολουθείτε
|
||||
loginFailed: Αποτυχία σύνδεσης
|
||||
accountMoved: 'Έχει μεταφερθεί σε νέο λογαριασμό:'
|
||||
perHour: Ανά Ώρα
|
||||
remoteUserCaution: Οι πληροφορίες από απομακρυσμένους λογαριασμούς μπορεί να είναι
|
||||
ατελείς.
|
||||
folderName: Όνομα φακέλου
|
||||
renameFolder: Μετονομασία φακέλου
|
||||
recentUsed: Χρησιμοποιήθηκαν πρόσφατα
|
||||
deleteAllFilesConfirm: Σίγουρα θέλετε να διαγράψετε όλα τα αρχεία;
|
||||
removeAllFollowing: Διακοπή ακολούθησης όλων των ακολουθούμενων μελών
|
||||
userSilenced: Αυτό το μέλος είναι υπό σιώπηση.
|
||||
makeActive: Ενεργοποίηση
|
||||
create: Δημιουργία
|
||||
reportAbuseOf: Αναφορά {name}
|
||||
cacheRemoteFilesDescription: Όταν αυτή η ρύθμιση είναι απενεργοποιημένη, τα απομακρυσμένα
|
||||
αρχεία φορτώνονται απευθείας από το απομακρυσμένο instance. Η απενεργοποίηση θα
|
||||
μειώσει τη χρήση του δίσκου σας, αλλά θα αυξήσει την κίνηση δεδομένων, καθώς δεν
|
||||
θα δημιουργούνται σμικρύνσεις αρχείων (thumbnails).
|
||||
registeredAt: Εγγράφηκε στις
|
||||
latestStatus: Τελευταία κατάσταση
|
||||
charts: Πίνακες
|
||||
stopActivityDelivery: Σταμάτα να στέλνεις δραστηριότητες
|
||||
operations: Λειτουργίες
|
||||
monitor: Παρακολούθηση
|
||||
jobQueue: Ουρά εργασιών
|
||||
blockedInstances: Μπλοκαρισμένα Instances
|
||||
blockedInstancesDescription: Παραθέστε τις διευθύνσεις (hostnames) των instances που
|
||||
θέλετε να μπλοκάρετε. Τα παρακάτω instances δεν θα μπορούν πλέον να επικοινωνούν
|
||||
με αυτό το instance.
|
||||
intro: Η εγκατάσταση του Firefish τελείωσε! Παρακαλώ δημιουργήστε ένα μέλος διαχειριστή/στρια.
|
||||
noThankYou: Όχι, ευχαριστώ
|
||||
addInstance: Προσθήκη instance
|
||||
renoteMute: Σίγαση προωθήσεων
|
||||
emojiUrl: Διεύθυνση emoji (URL)
|
||||
cacheRemoteFiles: Προσωρινή αποθήκευση απομακρυσμένων αρχείων
|
||||
flagSpeakAsCat: Να μιλάς σαν γατί
|
||||
flagSpeakAsCatDescription: Οι δημοσιεύσεις σου θα nyaοποιούνται όταν είσαι γατί
|
||||
selectInstance: Επιλέξτε ένα instance
|
||||
latestRequestSentAt: Τελευταίο αίτημα στάλθηκε
|
||||
hiddenTags: Κρυμμένες Ετικέτες (Hashtags)
|
||||
noInstances: Δεν υπάρχουν instances
|
||||
renoteUnmute: Διακοπή σίγασης προωθήσεων
|
||||
flagAsBotDescription: Ενεργοποιήστε αυτή την επιλογή αν αυτός ο λογαριασμός ελέγχεται
|
||||
από ένα πρόγραμμα. Αν ενεργοποιηθεί, θα λειτουργεί σαν σημάδι για τους προγραμματιστές,
|
||||
ώστε να αποφύγουν ατέρμονη αλληλεπίδραση με άλλα bots και για να ρυθμίσει τα εσωτερικά
|
||||
συστήματα του Firefish ώστε να αντιμετωπίζουν αυτόν τον λογαριασμό ως bot.
|
||||
flagShowTimelineRepliesDescription: Εμφάνιση απαντήσεων μελών σε δημοσιεύσεις άλλων
|
||||
μελών στο χρονολόγιο.
|
||||
latestRequestReceivedAt: Τελευταίο αίτημα ελήφθη
|
||||
blockThisInstance: Μπλοκάρισμα αυτού του instance
|
||||
clearQueueConfirmText: Τυχόν δημοσιεύσεις στην ουρά που δεν έχουν αποσταλεί δεν θα
|
||||
ομοσπονδοποιηθούν. Συνήθως αυτή η λειτουργία δεν χρειάζεται.
|
||||
clearCachedFilesConfirm: Σίγουρα θέλετε να διαγράψετε όλα τα προσωρινά αποθηκευμένα
|
||||
απομακρυσμένα αρχεία;
|
||||
default: Προεπιλεγμένο
|
||||
defaultValueIs: 'Προεπιλεγμένο: {value}'
|
||||
noJobs: Δεν υπάρχουν εργασίες (jobs)
|
||||
federating: Ομοσπονδοποιείται
|
||||
blocked: Μπλοκαρισμένο
|
||||
suspended: Σε αποβολή
|
||||
instanceFollowing: Ακολουθεί στο instance
|
||||
instanceFollowers: Ακόλουθοι του instance
|
||||
instanceUsers: Μέλη αυτού του instance
|
||||
retypedNotMatch: Οι καταχωρήσεις δεν ταιριάζουν.
|
||||
usernameOrUserId: Όνομα μέλους ή ταυτότητα μέλους (id)
|
||||
removeAreYouSure: Θέλετε σίγουρα να αφαιρέσετε το "{x}";
|
||||
deleteAreYouSure: Θέλετε σίγουρα να διαγράψετε το "{x}";
|
||||
resetAreYouSure: Σίγουρα επανεκκίνηση;
|
||||
uploadFromUrlMayTakeTime: Ίσως πάρει λίγο χρόνο μέχρι το ανέβασμα να ολοκληρωθεί.
|
||||
noMoreHistory: Δεν υπάρχει περαιτέρω ιστορικό
|
||||
agreeTo: Συμφωνώ στο {0}
|
||||
yearsOld: '{age} ετών'
|
||||
themeForDarkMode: Θέμα για τη Σκοτεινή Λειτουργία
|
||||
syncDeviceDarkMode: Συγχρονισμός της Σκοτεινής Λειτουργίας με τις ρυθμίσεις της συσκευής
|
||||
σας
|
||||
inputNewDescription: Προσθέστε νέα περιγραφή
|
||||
whenServerDisconnected: Όταν χάνεται η σύνδεση στον σέρβερ
|
||||
disconnectedFromServer: Η σύνδεση στον σέρβερ έχει χαθεί
|
||||
instanceDescription: Περιγραφή instance
|
||||
maintainerEmail: Διεύθυνση email προγραμματιστή/στριας
|
||||
yearX: '{year}'
|
||||
enableGlobalTimeline: Ενεργοποίηση παγκόσμιου χρονολογίου
|
||||
enableLocalTimeline: Ενεργοποίηση τοπικού χρονολογίου
|
||||
enableRegistration: Ενεργοποίηση εγγραφής νέων μελών
|
||||
invite: Πρόσκληση
|
||||
disablingTimelinesInfo: Οι Διαχειρίστριες-ες και οι Συντονιστές-στριες θα έχουν πάντα
|
||||
πρόσβαση σε όλα τα χρονολόγια, ακόμα κι αν δεν είναι ενεργοποιημένα.
|
||||
inMb: Σε megabytes
|
||||
iconUrl: Διεύθυνση URL εικονιδίου
|
||||
bannerUrl: Διεύθυνση URL εικόνας Εξώφυλλου
|
||||
pinnedUsers: Καρφιτσωμένα μέλη
|
||||
hcaptchaSiteKey: Κλειδί του site
|
||||
recaptcha: Προστασία reCAPTCHA
|
||||
enableServiceworker: Ενεργοποίηση Ειδοποιήσεων Push για τον browser σας
|
||||
recentlyDiscoveredUsers: Μέλη που ανακαλύφθηκαν πρόσφατα
|
||||
twoStepAuthentication: Επαλήθευση δύο παραγόντων
|
||||
securityKey: Κλειδί ασφάλειας
|
||||
registerSecurityKey: Καταχωρήστε ένα κλειδί ασφάλειας
|
||||
resetPassword: Επαναφορά κωδικού
|
||||
newPasswordIs: Ο νέος κωδικός είναι "{password}"
|
||||
uploadFolder: Προεπιλεγμένος φάκελος για ανέβασμα αρχείων
|
||||
joinedGroups: Οι ομάδες που είστε μέλος
|
||||
checking: Έλεγχος...
|
||||
invitationCode: Κωδικός πρόσκλησης
|
||||
normalPassword: Μέτριος κωδικός
|
||||
weakPassword: Αδύναμος κωδικός
|
||||
veryStrongPassword: Δυνατός κωδικός
|
||||
signinWith: Συνδεθείτε με {x}
|
||||
tapSecurityKey: Βάλτε το κλειδί ασφάλειας
|
||||
signinFailed: Αδυναμία σύνδεσης. Το όνομα μέλους ή ο κωδικός είναι λάθος.
|
||||
aboutX: Σχετικά με {x}
|
||||
useOsNativeEmojis: Χρήση των Emoji του λειτουργικού συστήματος
|
||||
uiLanguage: Γλώσσα διεπαφής
|
||||
disableDrawer: Να μη χρησιμοποιούνται μενού σε στιλ συρταριού
|
||||
noHistory: Δεν υπάρχει διαθέσιμο ιστορικό
|
||||
joinOrCreateGroup: Λάβετε πρόσκληση για μία ομάδα ή δημιουργήστε τη δική σας.
|
||||
docSource: Πηγή αυτού του εγγράφου
|
||||
regenerate: Επαναδημιουργία
|
||||
fontSize: Μέγεθος γραμματοσειράς
|
||||
noFollowRequests: Δεν έχετε αιτήματα ακολούθησης σε αναμονή
|
||||
dashboard: Ταμπλό
|
||||
clientSettings: Ρυθμίσεις διεπαφής
|
||||
numberOfDays: Αριθμός ημερών
|
||||
hideThisNote: Απόκρυψη αυτής της δημοσίευσης
|
||||
showFeaturedNotesInTimeline: Εμφάνιση προτεινόμενων δημοσιεύσεων στα χρονολόγια
|
||||
objectStorage: Αποθήκευση Object Storage
|
||||
useObjectStorage: Χρήση object storage
|
||||
objectStorageBucket: ''
|
||||
showFixedPostForm: Εμφάνιση της φόρμας δημοσίευσης στο πάνω μέρος των χρονολογίων
|
||||
none: Κανένα
|
||||
unableToProcess: Η επιχείρηση ήταν αδύνατο να ολοκληρωθεί
|
||||
installedApps: Εφαρμογές με εξουσιοδότηση
|
||||
state: Κατάσταση
|
||||
installedDate: Εξουσιοδοτήθηκε στις
|
||||
lastUsedDate: Χρησιμοποιήθηκε τελευταία φορά στις
|
||||
scratchpadDescription: Το σημειωματάριο παρέχει ένα περιβάλλον για πειραματισμό με
|
||||
AiScript. Σε αυτό μπορείτε να γράψετε, να εκτελέσετε, και να δοκιμάσετε τα αποτελέσματα
|
||||
της αλληλεπίδρασης του AiScript με το Firefish.
|
||||
scratchpad: Σημειωματάριο
|
||||
output: Αποτέλεσμα
|
||||
updateRemoteUser: Ανανέωση πληροφοριών απομακρυσμένου μέλους
|
||||
disablePagesScript: Απενεργοποίηση του AiScript στις Σελίδες
|
||||
removeAllFollowingDescription: Η εκτέλεση θα διακόψη την ακολούθηση όλων των μελών
|
||||
από {host}. Παρακαλούμε εκτελέστε το αν το instance π.χ. δεν υπάρχει πια.
|
||||
caption: Αυτόματη Περιγραφή
|
||||
all: Όλα
|
||||
subscribing: Εγγραφή σε συνδρομή
|
||||
publishing: Δημοσιεύεται
|
||||
notResponding: Δεν αποκρίνεται
|
||||
keepOriginalUploadingDescription: Αποθηκεύει το πρωτότυπο αρχείο όπως είναι. Αν απενεργοποιηθεί,
|
||||
μία έκδοση για προβολή στο ίντερνετ θα δημιουργηθεί κατά το ανέβασμα.
|
||||
lookup: Αναζήτηση
|
||||
lightThemes: Φωτεινά θέματα
|
||||
darkThemes: Σκοτεινά θέματα
|
||||
inputNewFolderName: Πληκτρολογήστε ένα νέο όνομα φακέλου
|
||||
hasChildFilesOrFolders: Εφόσον αυτός ο φάκελος δεν είναι άδειος, δεν μπορεί να διαγραφεί.
|
||||
enableRecommendedTimeline: Ενεργοποίηση χρονολογίου προτεινόμενων
|
||||
driveCapacityPerLocalAccount: Μέγεθος Αποθηκευτικού Χώρου ανά τοπικό μέλος
|
||||
driveCapacityPerRemoteAccount: Μέγεθος Αποθηκευτικού Χώρου ανά απομακρυσμένο μέλος
|
||||
basicInfo: Βασικές πληροφορίες
|
||||
pinnedClipId: Ταυτότητα (id) του κλιπ για καρφίτσωμα
|
||||
hcaptcha: Προστασία hCaptcha
|
||||
enableHcaptcha: Ενεργοποίηση hCaptcha
|
||||
hcaptchaSecretKey: Μυστικό κλειδί
|
||||
enableRecaptcha: Ενεργοποίηση reCAPTCHA
|
||||
recaptchaSiteKey: Κλειδί του site
|
||||
recaptchaSecretKey: Μυστικό κλειδί
|
||||
antennaKeywordsDescription: Διαχωρίστε με κενά για συνθήκη ΚΑΙ ή με αλλαγή γραμμής
|
||||
για συνθήκη Ή.
|
||||
antennaUsersDescription: Παραθέστε ένα όνομα μέλους ανά γραμμή
|
||||
antennaInstancesDescription: Παραθέστε ένα instance host ανά γραμμή
|
||||
withReplies: Να περιλαμβάνονται οι απαντήσεις
|
||||
withFiles: Να περιλαμβάνουν αρχεία
|
||||
silence: Σιώπηση
|
||||
silenceConfirm: Θέλετε σίγουρα να σιωπήσετε αυτό το μέλος;
|
||||
unsilenceConfirm: Σίγουρα θέλετε να αναιρέσετε τη σιώπηση αυτού του μέλους;
|
||||
securityKeyName: Όνομα κλειδιού
|
||||
lastUsed: Τελευταία χρήση
|
||||
unregister: Απεγγραφή
|
||||
notFoundDescription: Δεν ήταν δυνατό να βρεθεί σελίδα που να ανταποκρίνεται σε αυτή
|
||||
τη διεύθυνση URL.
|
||||
signinHistory: Ιστορικό συνδέσεων
|
||||
disableAnimatedMfm: Απενεργοποίηση του MFM με κίνηση
|
||||
dayOverDayChanges: Αλλαγές την τελευταία ημέρα
|
||||
promotion: Προμοταρισμένα
|
||||
promote: Προμοτάρισμα
|
||||
squareAvatars: Εμφάνιση τετραγωνισμένων άβαταρ
|
||||
aboutFirefish: Σχετικά με το Firefish
|
||||
maintainerName: Προγραμματιστής/στρια
|
||||
uploadFromUrlRequested: Το ανέβασμα ζητήθηκε
|
||||
themeForLightMode: Θέμα για τη Φωτεινή Λειτουργία
|
||||
circularReferenceFolder: Ο φάκελος του προορισμού είναι υποφάκελος του φακέλου που
|
||||
θέλετε να μετακινήσετε.
|
||||
backgroundImageUrl: Διεύθυνση URL εικόνας φόντου
|
||||
pinnedUsersDescription: Παραθέστε τα ονόματα μελών που θα είναι καρφιτσωμένα στην
|
||||
καρτέλα "Εξερεύνηση" χωρίζοντάς τα με αλλαγή γραμμής.
|
||||
openImageInNewTab: Άνοιγμα εικόνων σε νέα καρτέλα
|
||||
weekOverWeekChanges: Αλλαγές την τελευταία εβδομάδα
|
||||
exploreFediverse: Εξερευνήστε το Fediverse
|
||||
unsilence: Αναίρεση σιώπησης
|
||||
administrator: Διαχειριστής/στρια
|
||||
passwordLessLogin: Σύνδεση χωρίς κωδικό
|
||||
reduceUiAnimation: Ελάττωση των κινούμενων εικόνων
|
||||
serviceworkerInfo: Πρέπει να είναι ενεργοποιημένο για ειδοποιήσεις push.
|
||||
expandTweet: Διεύρυνση τουιτ
|
||||
themeEditor: Επεξεργασία θεμάτων
|
||||
deck: Ντεκ
|
||||
undeck: Έξοδος από το Ντεκ
|
||||
useFullReactionPicker: Χρήση επιλογέα αντιδράσεων πλήρους μεγέθους
|
||||
tokenRequested: Παροχή πρόσβασης στον λογαριασμό
|
||||
emailServer: Σέρβερ email
|
||||
enableEmail: Ενεργοποίηση του email distribution
|
||||
emailAddress: Διεύθυνση email
|
||||
emailConfigInfo: Χρησιμοποιείται για επιβεβαίωση του email σας κατά την εγγραφή ή
|
||||
αν ξεχάσετε τον κωδικό σας
|
||||
regenerateLoginToken: Επαναδημιουργία token σύνδεσης
|
||||
fileIdOrUrl: Ταυτότητα αρχείου (ID) ή διεύθυνση URL
|
||||
typingUsers: '{users} πληκτρολογεί'
|
||||
yourAccountSuspendedDescription: Αυτός ο λογαριασμός έχει αποβληθεί λόγω μη συμμόρφωσης
|
||||
με τους κανόνες του σέρβερ ή κάτι παρόμοιο. Επικοινωνήστε με τον διαχειριστή/στρια
|
||||
αν θα θέλατε έναν πιο λεπτομερή λόγο. Παρακαλούμε μη δημιουργήσετε νέο λογαριασμό.
|
||||
inboxUrl: Διεύθυνση URL των Εισερχομένων
|
||||
generateAccessToken: Δημιουργία token πρόσβασης
|
||||
emptyToDisableSmtpAuth: Αφήστε το όνομα μέλους και τον κωδικό άδεια για να απενεργοποιήσετε
|
||||
την επαλήθευση SMTP
|
||||
instanceMute: Σιγάσεις instance
|
||||
userSaysSomethingReason: '{name} είπε {reason}'
|
||||
logs: Αρχεία καταγραφής
|
||||
abuseReported: Η αναφορά σας στάλθηκε. Ευχαριστούμε πολύ.
|
||||
reporter: Έκανε την αναφορά
|
||||
reporteeOrigin: Καταγωγή αναφερόμενου λογαριασμού
|
||||
reporterOrigin: Καταγωγή λογαριασμού που έκανε την αναφορά
|
||||
forwardReport: Προώθηση της αναφοράς στο απομακρυσμένο instance
|
||||
openInSideView: Άνοιγμα σε προβολή παράθεσης
|
||||
delayed: Με καθυστέρηση
|
||||
useGlobalSettingDesc: Αν ενεργοποιηθεί, οι ρυθμίσεις ειδοποιήσεων του λογαριασμού
|
||||
σας θα χρησιμοποιηθούν. Αν απενεργοποιηθεί, μπορούν να γίνουν ανεξάρτητες ρυθμίσεις.
|
||||
fillAbuseReportDescription: Παρακαλούμε συμπληρώστε λεπτομέρειες σχετικά με αυτή την
|
||||
αναφορά. Αν πρόκειται για συγκεκριμένη δημοσίευση, παρακαλούμε συμπεριλάβετε τη
|
||||
διεύθυνση URL της δημοσίευσης.
|
||||
forwardReportIsAnonymous: Αντί για τον λογαριασμό σας, μία ανώνυμη αναφορά από λογαριασμό
|
||||
του συστήματος θα εμφανιστεί στο απομακρυσμένο instance.
|
2270
locales/en-US.yml
Normal file
2270
locales/en-US.yml
Normal file
File diff suppressed because it is too large
Load diff
11
locales/eo.yml
Normal file
11
locales/eo.yml
Normal file
|
@ -0,0 +1,11 @@
|
|||
_lang_: "Esperanto"
|
||||
introFirefish: Bonvenon Firefish estas malfermkoda, ne centra socia platformo kiu
|
||||
estos senpage ĉiam! 🚀
|
||||
headlineFirefish: Malfermkoda, ne centra socia platformo kiu estos senpage ĉiam 🚀
|
||||
monthAndDay: '{monato}/{tago}'
|
||||
search: Serĉi
|
||||
searchPlaceholder: Serĉi Firefish
|
||||
notifications: Sciigoj
|
||||
username: Uzantnomo
|
||||
password: Pasvorto
|
||||
forgotPassword: Forgesa pasvorto
|
2223
locales/es-ES.yml
Normal file
2223
locales/es-ES.yml
Normal file
File diff suppressed because it is too large
Load diff
966
locales/fi.yml
Normal file
966
locales/fi.yml
Normal file
|
@ -0,0 +1,966 @@
|
|||
_lang_: "Suomi"
|
||||
username: Käyttäjänimi
|
||||
fetchingAsApObject: Hae Fedeversestä
|
||||
gotIt: Selvä!
|
||||
cancel: Peruuta
|
||||
enterUsername: Anna käyttäjänimi
|
||||
renotedBy: Buustannut {user}
|
||||
noNotes: Ei lähetyksiä
|
||||
noNotifications: Ei ilmoituksia
|
||||
instance: Instanssi
|
||||
settings: Asetukset
|
||||
basicSettings: Perusasetukset
|
||||
otherSettings: Muut asetukset
|
||||
openInWindow: Avaa ikkunaan
|
||||
profile: Profiili
|
||||
timeline: Aikajana
|
||||
noAccountDescription: Käyttäjä ei ole vielä kirjoittanut kuvaustaan vielä.
|
||||
login: Kirjaudu sisään
|
||||
loggingIn: Kirjautuu sisään
|
||||
logout: Kirjaudu ulos
|
||||
uploading: Tallentaa ylös...
|
||||
save: Tallenna
|
||||
favorites: Kirjanmerkit
|
||||
unfavorite: Poista kirjanmerkeistä
|
||||
favorited: Lisätty kirjanmerkkeihin.
|
||||
alreadyFavorited: Lisätty jo kirjanmerkkeihin.
|
||||
cantFavorite: Ei voitu lisätä kirjanmerkkeihin.
|
||||
pin: Kiinnitä profiiliin
|
||||
unpin: Irroita profiilista
|
||||
delete: Poista
|
||||
forgotPassword: Unohtunut salasana
|
||||
search: Etsi
|
||||
notifications: Ilmoitukset
|
||||
password: Salasana
|
||||
ok: OK
|
||||
noThankYou: Ei kiitos
|
||||
signup: Rekisteröidy
|
||||
users: Käyttäjät
|
||||
addUser: Lisää käyttäjä
|
||||
addInstance: Lisää instanssi
|
||||
favorite: Lisää kirjanmerkkeihin
|
||||
copyContent: Kopioi sisältö
|
||||
deleteAndEdit: Poista ja muokkaa
|
||||
copyLink: Kopioi linkki
|
||||
makeFollowManuallyApprove: Seuraajapyyntö vaatii hyväksymistä
|
||||
follow: Seuraa
|
||||
pinned: Kiinnitä profiiliin
|
||||
followRequestPending: Seuraajapyyntö odottaa
|
||||
you: Sinä
|
||||
unrenote: Peruuta buustaus
|
||||
reaction: Reaktiot
|
||||
reactionSettingDescription2: Vedä uudelleenjärjestelläksesi, napsauta poistaaksesi,
|
||||
paina "+" lisätäksesi.
|
||||
attachCancel: Poista liite
|
||||
enterFileName: Anna tiedostonimi
|
||||
mute: Hiljennä
|
||||
unmute: Poista hiljennys
|
||||
headlineFirefish: Avoimen lähdekoodin, hajautettu sosiaalisen median alusta, joka
|
||||
on ikuisesti ilmainen! 🚀
|
||||
monthAndDay: '{day}/{month}'
|
||||
deleteAndEditConfirm: Oletko varma, että haluat poistaa tämän lähetyksen ja muokata
|
||||
sitä? Menetät kaikki reaktiot, buustaukset ja vastaukset lähetyksestäsi.
|
||||
addToList: Lisää listaan
|
||||
sendMessage: Lähetä viesti
|
||||
reply: Vastaa
|
||||
loadMore: Lataa enemmän
|
||||
showMore: Näytä enemmän
|
||||
receiveFollowRequest: Seuraajapyyntö vastaanotettu
|
||||
followRequestAccepted: Seuraajapyyntö hyväksytty
|
||||
mentions: Maininnat
|
||||
importAndExport: Tuo/Vie Tietosisältö
|
||||
import: Tuo
|
||||
export: Vie
|
||||
files: Tiedostot
|
||||
download: Lataa
|
||||
unfollowConfirm: Oletko varma, ettet halua seurata enää käyttäjää {name}?
|
||||
noLists: Sinulla ei ole listoja
|
||||
note: Viesti
|
||||
notes: Viestit
|
||||
following: Seuraa
|
||||
createList: Luo lista
|
||||
manageLists: Hallitse listoja
|
||||
error: Virhe
|
||||
somethingHappened: On tapahtunut virhe
|
||||
retry: Yritä uudelleen
|
||||
pageLoadError: Virhe ladattaessa sivua.
|
||||
serverIsDead: Tämä palvelin ei vastaa. Yritä hetken kuluttua uudelleen.
|
||||
youShouldUpgradeClient: Nähdäksesi tämän sivun, virkistä päivittääksesi asiakasohjelmasi.
|
||||
privacy: Tietosuoja
|
||||
defaultNoteVisibility: Oletusnäkyvyys
|
||||
followRequest: Seuraajapyyntö
|
||||
followRequests: Seuraajapyynnöt
|
||||
unfollow: Poista seuraaminen
|
||||
enterEmoji: Syötä emoji
|
||||
renote: Buustaa
|
||||
renoted: Buustattu.
|
||||
cantRenote: Tätä lähetystä ei voi buustata.
|
||||
cantReRenote: Buustausta ei voi buustata.
|
||||
quote: Lainaus
|
||||
pinnedNote: Lukittu lähetys
|
||||
clickToShow: Napsauta nähdäksesi
|
||||
sensitive: Herkkää sisältöä (NSFW)
|
||||
add: Lisää
|
||||
enableEmojiReactions: Ota käyttöön emoji-reaktiot
|
||||
showEmojisInReactionNotifications: Näytä emojit reaktioilmoituksissa
|
||||
reactionSetting: Reaktiot näytettäväksi reaktiovalitsimessa
|
||||
rememberNoteVisibility: Muista lähetyksen näkyvyysasetukset
|
||||
markAsSensitive: Merkitse herkäksi sisällöksi (NSFW)
|
||||
unmarkAsSensitive: Poista merkintä herkkää sisältöä (NSFW)
|
||||
renoteMute: Hiljennä buustit
|
||||
renoteUnmute: Poista buustien hiljennys
|
||||
block: Estä
|
||||
unblock: Poista esto
|
||||
unsuspend: Poista keskeytys
|
||||
suspend: Keskeytys
|
||||
blockConfirm: Oletko varma, että haluat estää tämän tilin?
|
||||
unblockConfirm: Oletko varma, että haluat poistaa tämän tilin eston?
|
||||
selectAntenna: Valitse antenni
|
||||
selectWidget: Valitse vimpain
|
||||
editWidgets: Muokkaa vimpaimia
|
||||
editWidgetsExit: Valmis
|
||||
emoji: Emoji
|
||||
emojis: Emojit
|
||||
emojiName: Emojin nimi
|
||||
emojiUrl: Emojin URL-linkki
|
||||
cacheRemoteFiles: Taltioi etätiedostot välimuistiin
|
||||
flagAsBot: Merkitse tili botiksi
|
||||
flagAsBotDescription: Ota tämä vaihtoehto käyttöön, jos tätä tiliä ohjaa ohjelma.
|
||||
Jos se on käytössä, se toimii lippuna muille kehittäjille, jotta estetään loputtomat
|
||||
vuorovaikutusketjut muiden bottien kanssa ja säädetään Firefishn sisäiset järjestelmät
|
||||
käsittelemään tätä tiliä botina.
|
||||
flagAsCat: Oletko kissa? 🐱
|
||||
flagAsCatDescription: Saat kissan korvat ja puhut kuin kissa!
|
||||
flagSpeakAsCat: Puhu kuin kissa
|
||||
flagShowTimelineReplies: Näytä vastaukset aikajanalla
|
||||
addAccount: Lisää tili
|
||||
loginFailed: Kirjautuminen epäonnistui
|
||||
showOnRemote: Katsele etäinstanssilla
|
||||
general: Yleistä
|
||||
accountMoved: 'Käyttäjä on muuttanut uuteen tiliin:'
|
||||
wallpaper: Taustakuva
|
||||
setWallpaper: Aseta taustakuva
|
||||
searchWith: 'Etsi: {q}'
|
||||
youHaveNoLists: Sinulla ei ole listoja
|
||||
followConfirm: Oletko varma, että haluat seurata käyttäjää {name}?
|
||||
host: Isäntä
|
||||
selectUser: Valitse käyttäjä
|
||||
annotation: Kommentit
|
||||
registeredAt: Rekisteröity
|
||||
latestRequestReceivedAt: Viimeisin pyyntö vastaanotettu
|
||||
latestRequestSentAt: Viimeisin pyyntö lähetetty
|
||||
storageUsage: Tallennustilan käyttö
|
||||
charts: Kaaviot
|
||||
stopActivityDelivery: Lopeta toimintojen lähettäminen
|
||||
blockThisInstance: Estä tämä instanssi
|
||||
operations: Toiminnot
|
||||
metadata: Metatieto
|
||||
monitor: Seuranta
|
||||
jobQueue: Työjono
|
||||
cpuAndMemory: Prosessori ja muisti
|
||||
network: Verkko
|
||||
disk: Levy
|
||||
clearCachedFiles: Tyhjennä välimuisti
|
||||
clearCachedFilesConfirm: Oletko varma, että haluat tyhjentää kaikki välimuistiin tallennetut
|
||||
etätiedostot?
|
||||
blockedInstances: Estetyt instanssit
|
||||
hiddenTags: Piilotetut asiatunnisteet
|
||||
mention: Maininta
|
||||
copyUsername: Kopioi käyttäjänimi
|
||||
searchUser: Etsi käyttäjää
|
||||
showLess: Sulje
|
||||
youGotNewFollower: seurasi sinua
|
||||
directNotes: Yksityisviestit
|
||||
driveFileDeleteConfirm: Oletko varma, että haluat poistaa tiedoston " {name}"? Se
|
||||
poistetaan kaikista viesteistä, jotka sisältävät sen liitetiedostona.
|
||||
importRequested: Olet pyytänyt viemistä. Tämä voi viedä hetken.
|
||||
exportRequested: Olet pyytänyt tuomista. Tämä voi viedä hetken. Se lisätään asemaan
|
||||
kun tuonti valmistuu.
|
||||
lists: Listat
|
||||
followers: Seuraajat
|
||||
followsYou: Seuraa sinua
|
||||
pageLoadErrorDescription: Tämä yleensä johtuu verkkovirheistä tai selaimen välimuistista.
|
||||
Kokeile tyhjentämällä välimuisti ja yritä sitten hetken kuluttua uudelleen.
|
||||
enterListName: Anna listalle nimi
|
||||
instanceInfo: Instanssin tiedot
|
||||
clearQueue: Tyhjennä jono
|
||||
suspendConfirm: Oletko varma, että haluat keskeyttää tämän tilin?
|
||||
unsuspendConfirm: Oletko varma, että haluat poistaa tämän tilin keskeytyksen?
|
||||
selectList: Valitse lista
|
||||
customEmojis: Kustomoitu Emoji
|
||||
addEmoji: Lisää
|
||||
settingGuide: Suositellut asetukset
|
||||
cacheRemoteFilesDescription: Kun tämä asetus ei ole käytössä, etätiedostot on ladattu
|
||||
suoraan etäinstanssilta. Asetuksen poistaminen käytöstä vähentää tallennustilan
|
||||
käyttöä, mutta lisää verkkoliikennettä kun pienoiskuvat eivät muodostu.
|
||||
flagSpeakAsCatDescription: Lähetyksesi nyanifioidaan, kun olet kissatilassa
|
||||
flagShowTimelineRepliesDescription: Näyttää käyttäjien vastaukset muiden käyttäjien
|
||||
lähetyksiin aikajanalla, jos se on päällä.
|
||||
autoAcceptFollowed: Automaattisesti hyväksy seuraamispyynnöt käyttäjiltä, joita seuraat
|
||||
perHour: Tunnissa
|
||||
removeWallpaper: Poista taustakuva
|
||||
recipient: Vastaanottaja(t)
|
||||
federation: Federaatio
|
||||
software: Ohjelmisto
|
||||
proxyAccount: Proxy-tili
|
||||
proxyAccountDescription: Välitystili (Proxy-tili) on tili, joka toimii käyttäjien
|
||||
etäseuraajana tietyin edellytyksin. Kun käyttäjä esimerkiksi lisää etäkäyttäjän
|
||||
luetteloon, etäkäyttäjän toimintaa ei toimiteta instanssiin, jos yksikään paikallinen
|
||||
käyttäjä ei seuraa kyseistä käyttäjää, joten välitystili seuraa sen sijaan.
|
||||
latestStatus: Viimeisin tila
|
||||
selectInstance: Valitse instanssi
|
||||
instances: Instanssit
|
||||
perDay: Päivässä
|
||||
version: Versio
|
||||
statistics: Tilastot
|
||||
clearQueueConfirmTitle: Oletko varma, että haluat tyhjentää jonon?
|
||||
introFirefish: Tervetuloa! Firefish on avoimen lähdekoodin, hajautettu sosiaalisen
|
||||
median alusta, joka on ikuisesti ilmainen! 🚀
|
||||
clearQueueConfirmText: Mitkään välittämättömät lähetykset, jotka ovat jonossa, eivät
|
||||
federoidu. Yleensä tätä toimintoa ei tarvita.
|
||||
blockedInstancesDescription: Lista instanssien isäntänimistä, jotka haluat estää.
|
||||
Listatut instanssit eivät kykene kommunikoimaan enää tämän instanssin kanssa.
|
||||
security: Turvallisuus
|
||||
retypedNotMatch: Syöte ei kelpaa.
|
||||
fromDrive: Asemasta
|
||||
keepOriginalUploading: Säilytä alkuperäinen kuva
|
||||
uploadFromUrlDescription: Tiedoston URL, jonka haluat ylösladata
|
||||
themeForLightMode: Teema vaaleassa tilassa
|
||||
theme: Teemat
|
||||
themeForDarkMode: Teema tummassa tilassa
|
||||
drive: Asema
|
||||
darkThemes: Tummat teemat
|
||||
copyUrl: Kopioi URL-linkki
|
||||
rename: Uudelleennimeä
|
||||
maintainerName: Ylläpitäjä
|
||||
maintainerEmail: Ylläpitäjän sähköposti
|
||||
tosUrl: Palvelun ehdot URL-linkki
|
||||
thisYear: Vuosi
|
||||
backgroundImageUrl: Taustakuvan URL-linkki
|
||||
basicInfo: Perustiedot
|
||||
pinnedPagesDescription: Kirjoita niiden sivujen polut, jotka haluat liittää tämän
|
||||
instanssin yläsivulle rivinvaihdoin erotettuna.
|
||||
hcaptchaSiteKey: Sivuston avain
|
||||
hcaptchaSecretKey: Salausavain
|
||||
silencedInstances: Hiljennetyt instanssit
|
||||
muteAndBlock: Hiljennykset ja estetyt
|
||||
mutedUsers: Hiljennetyt käyttäjät
|
||||
blockedUsers: Estetyt käyttäjät
|
||||
noUsers: Ei yhtään käyttäjää
|
||||
noInstances: Ei yhtään instanssia
|
||||
editProfile: Muokkaa profiilia
|
||||
noteDeleteConfirm: Oletko varma, että haluat poistaa tämän viestin?
|
||||
pinLimitExceeded: Et voi kiinnittää enempää viestejä
|
||||
intro: Firefish -asennus valmis! Ole hyvä ja luo admin-käyttäjä.
|
||||
done: Valmis
|
||||
processing: Suorittaa
|
||||
preview: Esikatselu
|
||||
default: Oletus
|
||||
defaultValueIs: 'Oletus: {value}'
|
||||
noCustomEmojis: Ei emojia
|
||||
noJobs: Ei töitä
|
||||
federating: Federoi
|
||||
blocked: Estetty
|
||||
silenced: Hiljennetty
|
||||
suspended: Keskeytetty
|
||||
all: Kaikki
|
||||
publishing: Julkaisee
|
||||
subscribing: Tilaa
|
||||
notResponding: Ei vastaa
|
||||
instanceFollowing: Seuraa instanssia
|
||||
instanceFollowers: Instanssin seuraajat
|
||||
instanceUsers: Instanssin käyttäjät
|
||||
changePassword: Muuta salasana
|
||||
newPasswordRetype: Uudelleensyötä uusi salasana
|
||||
more: Lisää!
|
||||
featured: Esillä
|
||||
usernameOrUserId: Käyttäjänimi tai käyttäjä id
|
||||
noSuchUser: Käyttäjää ei löydy
|
||||
lookup: Hae
|
||||
announcements: Tiedoitteet
|
||||
imageUrl: Kuva URL-linkki
|
||||
removed: Onnistuneesti poistettu
|
||||
removeAreYouSure: Oletko varma, että haluat poistaa " {x}"?
|
||||
resetAreYouSure: Haluatko nollata?
|
||||
saved: Tallennettu
|
||||
messaging: Juttele
|
||||
upload: Lataa ylös
|
||||
fromUrl: URL:stä
|
||||
uploadFromUrl: Ylöslataa URL:stä
|
||||
uploadFromUrlRequested: Ylöslataus pyydetty
|
||||
uploadFromUrlMayTakeTime: Voi viedä hetki, kun ylöslataus on valmis.
|
||||
explore: Tutustu
|
||||
messageRead: Lue
|
||||
noMoreHistory: Ei lisää historiaa
|
||||
startMessaging: Aloita uusi juttelu
|
||||
manageGroups: Hallitse ryhmiä
|
||||
nUsersRead: lukenut {n}
|
||||
agreeTo: Hyväksyn {0}
|
||||
tos: Palvelun ehdot
|
||||
start: Aloita
|
||||
home: Koti
|
||||
remoteUserCaution: Etäkäyttäjän tiedot saattavat olla puutteellisia.
|
||||
light: Vaalea
|
||||
dark: Tumma
|
||||
lightThemes: Vaaleat teemat
|
||||
syncDeviceDarkMode: Synkronoi tumma tila laitteen asetuksen mukaan
|
||||
fileName: Tiedostonimi
|
||||
selectFile: Valitse tiedosto
|
||||
selectFiles: Valitse tiedostot
|
||||
selectFolder: Valitse kansio
|
||||
selectFolders: Valitse kansiot
|
||||
renameFile: Uudelleennimeä tiedosto
|
||||
folderName: Kansionimi
|
||||
createFolder: Luo kansio
|
||||
renameFolder: Uudelleennimeä kansio
|
||||
deleteFolder: Poista kansio
|
||||
addFile: Lisää tiedosto
|
||||
emptyDrive: Asemasi on tyhjä
|
||||
emptyFolder: Tämä kansio on tyhjä
|
||||
unableToDelete: Ei voitu poistaa
|
||||
inputNewFileName: Syötä uusi tiedostonimi
|
||||
inputNewDescription: Syötä uusi kuvateksti
|
||||
inputNewFolderName: Syötä uusi kansionimi
|
||||
hasChildFilesOrFolders: Koska kansio ei ole tyhjä, sitä ei voi poistaa.
|
||||
avatar: Kuvake
|
||||
banner: Banneri
|
||||
nsfw: Herkkää sisältöä (NSFW)
|
||||
whenServerDisconnected: Kun yhteys palvelimeen menetetään
|
||||
disconnectedFromServer: Yhteys palvelimeen katkennut
|
||||
reload: Päivitä
|
||||
doNothing: Hylkää
|
||||
reloadConfirm: Haluaisitko päivittää aikajanan?
|
||||
unwatch: Lopeta katselu
|
||||
watch: Katsele
|
||||
accept: Hyväksy
|
||||
reject: Hylkää
|
||||
normal: Normaali
|
||||
instanceName: Instanssin nimi
|
||||
thisMonth: Kuukausi
|
||||
today: Tänään
|
||||
monthX: '{month}'
|
||||
enableLocalTimeline: Ota käyttöön paikallinen aikajana
|
||||
enableGlobalTimeline: Ota käyttöön globaali aikajana
|
||||
enableRecommendedTimeline: Ota käyttöön suositellut -aikajana
|
||||
registration: Rekisteröinti
|
||||
enableRegistration: Ota käyttöön uuden käyttäjän rekisteröinti
|
||||
driveCapacityPerLocalAccount: Aseman kapasiteetti paikallista käyttäjää kohti
|
||||
driveCapacityPerRemoteAccount: Aseman kapasiteetti etäkäyttäjää kohti
|
||||
inMb: megatavuissa
|
||||
bannerUrl: Bannerikuvan URL-linkki
|
||||
pinnedUsers: Kiinnitetyt käyttäjät
|
||||
pinnedPages: Kiinnitetyt sivut
|
||||
pinnedClipId: Kiinnitettävän leikkeen ID
|
||||
enableHcaptcha: Ota käyttöön hCaptcha-tunnistus
|
||||
recaptcha: CAPTCHA uudelleen
|
||||
enableRecaptcha: Ota käyttöön CAPTCHA uudelleen
|
||||
recaptchaSiteKey: Sivuston avain
|
||||
recaptchaSecretKey: Salausavain
|
||||
silenceThisInstance: Hiljennä tämä instanssi
|
||||
silencedInstancesDescription: Lista isäntänimistä, joka haluat hiljentää. Tilejä listassa
|
||||
kohdellaan "hiljennettynä", ne voivat tehdä seuraajapyyntöjä ja eivät voi tehdä
|
||||
mainintoja paikallistileistä jossei seurattu. Tämä ei vaikuta estettyihin instansseihin.
|
||||
hiddenTagsDescription: 'Listaa aihetunnisteet (ilman #-merkkiä) aihetunnisteet, jotka
|
||||
haluat piilottaa trendaavista ja Tutustu-osiosta. Piilotetut aihetunnisteet ovat
|
||||
kuitenkin löydettävissä muilla keinoilla. Estetyt instanssit eivät vaikuta, vaikka
|
||||
listattu tähän.'
|
||||
currentPassword: Nykyinen salasana
|
||||
newPassword: Uusi salasana
|
||||
attachFile: Liitetyt tiedostot
|
||||
keepOriginalUploadingDescription: Tallentaa alkuperäisen kuvan sellaisenaan. Jos kytketty
|
||||
päältä, webissä näytettävä versio luodaan ylöslatauksen yhteydessä.
|
||||
remove: Poista
|
||||
circularReferenceFolder: Kohdekansio on kansion alikansio, jonka haluat siirtää.
|
||||
deleteAreYouSure: Oletko varma, että haluat poistaa kokonaan" {x}"?
|
||||
yearsOld: '{age} vuotias'
|
||||
activity: Aktiivisuus
|
||||
images: Kuvat
|
||||
birthday: Syntymäpäivä
|
||||
registeredDate: Liittynyt
|
||||
location: Sijainti
|
||||
disablingTimelinesInfo: Järjestelmänvalvojilla ja moderaattoreilla on aina pääsy kaikille
|
||||
aikajanoille, vaikka olisikin poistettu käytöstä.
|
||||
dayX: '{day}'
|
||||
yearX: '{year}'
|
||||
pages: Sivut
|
||||
instanceDescription: Instanssin kuvaus
|
||||
invite: Kutsu
|
||||
iconUrl: Ikoni URL-linkki
|
||||
pinnedUsersDescription: Listaa käyttäjänimet eroteltuna rivivaihdoin kiinnittääksesi
|
||||
ne "Tutustu" välilehteen.
|
||||
pinnedNotes: Kiinnitetyt viestit
|
||||
hcaptcha: hCaptcha-tunnistus
|
||||
antennaSource: Antennin lähde
|
||||
invitationCode: Kutsukoodi
|
||||
checking: Tarkistetaan...
|
||||
passwordNotMatched: Ei vastaa
|
||||
doing: Käsittelee...
|
||||
category: Kategoria
|
||||
tags: Tagit
|
||||
disableAnimatedMfm: Poista MFM -animaatiot käytöstä
|
||||
openImageInNewTab: Avaa kuvat uuteen välilehteen
|
||||
dashboard: Kojelauta
|
||||
local: Paikallinen
|
||||
remote: Etä
|
||||
total: Yhteensä
|
||||
weekOverWeekChanges: Muutokset viime viikkoon
|
||||
objectStorageRegion: Alue
|
||||
popout: Ulosvedettävä
|
||||
volume: Äänenvoimakkuus
|
||||
masterVolume: Master äänenvoimakkuus
|
||||
details: Yksityiskohdat
|
||||
chooseEmoji: Valitse emoji
|
||||
descendingOrder: Laskevasti
|
||||
scratchpad: Raaputusalusta
|
||||
output: Ulostulo
|
||||
invisibleNote: Näkymätön viesti
|
||||
enableInfiniteScroll: Lataa enemmän automaattisesti
|
||||
visibility: Näkyvyys
|
||||
useCw: Piilota sisältö
|
||||
poll: Kysely
|
||||
enablePlayer: Avaa videotoistimeen
|
||||
enterFileDescription: Syötä tiedostokuvaus
|
||||
author: Kirjoittaja
|
||||
manage: Hallinta
|
||||
description: Kuvaus
|
||||
describeFile: Lisää tiedostokuvaus
|
||||
height: Korkeus
|
||||
large: Suuri
|
||||
medium: Keskikokoinen
|
||||
small: Pieni
|
||||
other: Muu
|
||||
create: Luo
|
||||
regenerateLoginTokenDescription: Luo uudelleen kirjautumisen aikana sisäisesti käytettävän
|
||||
tunnuksen. Normaalisti tämä toiminto ei ole tarpeen. Jos tunniste luodaan uudelleen,
|
||||
kaikki laitteet kirjautuvat ulos.
|
||||
setMultipleBySeparatingWithSpace: Erottele useat merkinnät välilyönneillä.
|
||||
fileIdOrUrl: Tiedosto ID tai URL-linkki
|
||||
behavior: Käytös
|
||||
instanceTicker: Viestejä koskevat instanssitiedot
|
||||
waitingFor: Odottaa {x}
|
||||
random: Satunnainen
|
||||
system: Järjestelmä
|
||||
switchUi: Ulkoasu
|
||||
createNew: Luo uusi
|
||||
followersCount: Seuraajien määrä
|
||||
renotedCount: Saatujen buustausten määrä
|
||||
followingCount: Seurattujen tilien määrä
|
||||
notSet: Ei asetettu
|
||||
nUsers: '{n} Käyttäjää'
|
||||
nNotes: '{n} Viestiä'
|
||||
sendErrorReports: Lähetä virheraportteja
|
||||
backgroundColor: Taustaväri
|
||||
accentColor: Korostusväri
|
||||
textColor: Tekstin väri
|
||||
advanced: Edistynyt
|
||||
saveAs: Tallenna nimellä...
|
||||
invalidValue: Epäkelpo arvo.
|
||||
registry: Rekisteri
|
||||
closeAccount: Sulje tili
|
||||
currentVersion: Nykyinen versio
|
||||
capacity: Kapasiteetti
|
||||
clear: Palaa
|
||||
_theme:
|
||||
explore: Tutustu teemoihin
|
||||
silenceConfirm: Oletko varma, että haluat hiljentää tämän käyttäjän?
|
||||
notesAndReplies: Viestit ja vastaukset
|
||||
withFiles: Tiedostot sisältyvät
|
||||
silence: Hiljennä
|
||||
popularTags: Suositut tagit
|
||||
userList: Listat
|
||||
about: Tietoja
|
||||
aboutFirefish: Tietoja Firefishstä
|
||||
exploreFediverse: Tutustu fediverseen
|
||||
recentlyUpdatedUsers: Vastikään lisätyt käyttäjät
|
||||
recentlyRegisteredUsers: Uudet liittyneet jäyttäjät
|
||||
recentlyDiscoveredUsers: Vastikään löydetyt käyttäjät
|
||||
exploreUsersCount: Täällä on {count} käyttäjää
|
||||
share: Jaa
|
||||
moderation: Sisällön valvonta
|
||||
nUsersMentioned: Mainittu {n} käyttäjältä
|
||||
securityKey: Turva-avain
|
||||
securityKeyName: Avainnimi
|
||||
registerSecurityKey: Rekisteröi turva-avain
|
||||
lastUsed: Viimeksi käytetty
|
||||
unregister: Poista rekisteröinti
|
||||
passwordLessLogin: Salasanaton sisäänkirjautuminen
|
||||
cacheClear: Tyhjennä välimuisti
|
||||
markAsReadAllNotifications: Merkitse kaikki ilmoitukset luetuksi
|
||||
markAsReadAllUnreadNotes: Merkitse kaikki viestit luetuiksi
|
||||
uploadFolder: Oletuskansio ylöslatauksille
|
||||
createGroup: Luo ryhmä
|
||||
group: Ryhmä
|
||||
groups: Ryhmät
|
||||
ownedGroups: Omistetut ryhmät
|
||||
help: Apua
|
||||
inputMessageHere: Syötä viesti tähän
|
||||
close: Sulje
|
||||
joinedGroups: Liittyneet ryhmät
|
||||
invites: Kutsut
|
||||
groupName: Ryhmänimi
|
||||
members: Jäsenet
|
||||
language: Kieli
|
||||
signinHistory: Kirjautumishistoria
|
||||
docSource: Tämän dokumentin lähde
|
||||
createAccount: Luo tili
|
||||
existingAccount: Olemassa oleva tili
|
||||
promotion: Edistetty
|
||||
promote: Edistää
|
||||
numberOfDays: Päivien määrä
|
||||
accountSettings: Tilin asetukset
|
||||
objectStorage: Objektitallennus
|
||||
useObjectStorage: Käytä objektitallennusta
|
||||
objectStorageBaseUrl: Perus URL-linkki
|
||||
objectStorageBaseUrlDesc: "Viitteenä käytetty URL-linkki. Määritä CDN:n tai välityspalvelimen
|
||||
URL-linkki, jos käytät kumpaakin.\nKäytä S3:lle 'https://<bucket>.s3.amazonaws.com'
|
||||
ja GCS:lle tai vastaaville palveluille 'https://storage.googleapis.com/<bucket>'
|
||||
jne."
|
||||
objectStorageBucket: Kauha
|
||||
newNoteRecived: Uusia viestejä
|
||||
smtpPort: Portti
|
||||
instanceMute: Instanssin mykistys
|
||||
repliesCount: Lähetettyjen vastausten määrä
|
||||
updatedAt: Päivitetty
|
||||
notFound: Ei löydy
|
||||
useOsNativeEmojis: Käytä käyttöjärjestelmän natiivi-Emojia
|
||||
joinOrCreateGroup: Tule kutsutuksi ryhmään tai luo oma ryhmä.
|
||||
text: Teksti
|
||||
usernameInvalidFormat: Käytä isoja ja pieniä kirjaimia, numeroita ja erikoismerkkejä.
|
||||
unsilenceConfirm: Oletko varma, että haluat poistaa käyttäjän hiljennyksen?
|
||||
popularUsers: Suositut käyttäjät
|
||||
moderator: Moderaattori
|
||||
twoStepAuthentication: Kaksivaiheinen tunnistus
|
||||
notFoundDescription: URL-linkkiin liittyvää sivua ei löytynyt.
|
||||
antennaKeywords: Kuunneltavat avainsanat
|
||||
antennaExcludeKeywords: Poislasketut avainsanat
|
||||
antennaKeywordsDescription: Erottele välilyönneillä AND-ehtoa varten tai rivinvaihdolla
|
||||
OR-ehtoa varten.
|
||||
notifyAntenna: Ilmoita uusista viesteistä
|
||||
withFileAntenna: Vain viestit tiedoston kanssa
|
||||
enableServiceworker: Ota käyttöön Push-notifikaatiot selaimessasi
|
||||
antennaUsersDescription: Luettele yksi käyttäjänimi rivi kohti
|
||||
antennaInstancesDescription: Luettele yksi instanssi riviä kohti
|
||||
caseSensitive: Isot ja pienet kirjaimet
|
||||
withReplies: Sisällytä vastaukset
|
||||
connectedTo: Seuraavat tili(t) on yhdistetty
|
||||
unsilence: Poista hiljennys
|
||||
administrator: Järjestelmänvalvoja
|
||||
token: Merkki
|
||||
resetPassword: Resetoi salasana
|
||||
reduceUiAnimation: Vähennä käyttöliittymän animaatioita
|
||||
transfer: Siirrä
|
||||
messagingWithUser: Yksityisjuttelu
|
||||
title: Otsikko
|
||||
enable: Ota käyttöön
|
||||
next: Seuraava
|
||||
retype: Syötä uudelleen
|
||||
noteOf: Lähettänyt {user}
|
||||
inviteToGroup: Kutsu ryhmään
|
||||
quoteAttached: Lainaus
|
||||
quoteQuestion: Liitä lainauksena?
|
||||
noMessagesYet: Ei vielä viestejä
|
||||
newMessageExists: Uusia viestejä
|
||||
onlyOneFileCanBeAttached: Voit liittää vain yhden tiedoston viestiin
|
||||
signinRequired: Ole hyvä ja rekisteröidy tai kirjaudu sisään jatkaaksesi
|
||||
invitations: Kutsut
|
||||
available: Saatavilla
|
||||
unavailable: Ei saatavissa
|
||||
tooShort: Liian lyhyt
|
||||
tooLong: Liian pitkä
|
||||
weakPassword: Heikko salasana
|
||||
normalPassword: Kohtalainen salasana
|
||||
veryStrongPassword: Vahva salasana
|
||||
passwordMatched: Vastaa
|
||||
signinWith: Kirjaudu sisään {x}
|
||||
signinFailed: Ei voitu kirjautua sisään. Annettu käyttäjänimi tai salasana virheellinen.
|
||||
tapSecurityKey: Napsauta turva-avaintasi
|
||||
or: Tai
|
||||
uiLanguage: Anna käyttöliittymän kieli
|
||||
groupInvited: Sinut on kutsuttu ryhmään
|
||||
aboutX: Tietoja {x}
|
||||
disableDrawer: Älä käytä laatikkotyyppisiä valikoita
|
||||
youHaveNoGroups: Sinulla ei ole ryhmiä
|
||||
noHistory: Ei historiaa saatavilla
|
||||
regenerate: Uudelleenluo
|
||||
fontSize: Kirjasinkoko
|
||||
dayOverDayChanges: Muutokset eiliseen
|
||||
clientSettings: Asiakkaan asetukset
|
||||
hideThisNote: Piilota tämä viesti
|
||||
showFeaturedNotesInTimeline: Näytä esillä olevat viestit aikajanalla
|
||||
objectStorageBucketDesc: Määritä palveluntarjoajasi käyttämä kauhan nimi.
|
||||
objectStoragePrefix: Etuliite
|
||||
objectStorageEndpoint: Päätepiste
|
||||
objectStorageRegionDesc: Määritä alue, kuten "xx-east-1". Jos palvelusi ei tee eroa
|
||||
alueiden välillä, jätä tämä kohta tyhjäksi tai kirjoita "us-east-1".
|
||||
objectStorageUseSSL: Käytä SSL-salausta
|
||||
objectStorageUseSSLDesc: Poista tämä käytöstä, jos et aio käyttää HTTPS:ää API-yhteyksissä
|
||||
objectStorageUseProxy: Yhdistä välityspalvelimen kautta
|
||||
objectStorageUseProxyDesc: Poista tämä käytöstä, jos et aio käyttää välityspalvelinta
|
||||
API-yhteyksiä varten
|
||||
objectStorageSetPublicRead: Aseta "public-read" ylöslataukseen
|
||||
serverLogs: Palvelimen lokit
|
||||
deleteAll: Poista kaikki
|
||||
showFixedPostForm: Näytä viesti-ikkuna aikajanan yläpuolella
|
||||
sounds: Äänet
|
||||
listen: Kuuntele
|
||||
none: Ei mitään
|
||||
showInPage: Näytä sivulla
|
||||
recentUsed: Vastikään käytetty
|
||||
install: Asenna
|
||||
uninstall: Poista asennus
|
||||
installedApps: Hyväksytyt sovellukset
|
||||
nothing: Ei nähtävää täällä
|
||||
state: Tila
|
||||
sort: Järjestä
|
||||
ascendingOrder: Nousevasti
|
||||
scratchpadDescription: Raaputusalusta tarjoaa ympäristön AiScript-kokeiluja varten.
|
||||
Voit kirjoittaa, suorittaa ja tarkistaa sen tulokset vuorovaikutuksessa siinä olevan
|
||||
Firefishn kanssa.
|
||||
script: Skripti
|
||||
disablePagesScript: Poista AiScript käytöstä sivuilla
|
||||
updateRemoteUser: Päivitä etäkäyttäjän tiedot
|
||||
deleteAllFiles: Poista kaikki tiedostot
|
||||
deleteAllFilesConfirm: Oletko varma, että haluat poistaa kaikki tiedostot?
|
||||
removeAllFollowing: Poista seuraaminen kaikista seuratuista käyttäjistä
|
||||
removeAllFollowingDescription: Tämän suorittaminen poistaa kaikki {host}:n tilit.
|
||||
Suorita tämä, jos instanssia ei esimerkiksi enää ole olemassa.
|
||||
userSuspended: Tämä käyttäjä on hyllytetty.
|
||||
userSilenced: Tämä käyttäjä on hiljennetty.
|
||||
yourAccountSuspendedTitle: Tämä tili on hyllytetty
|
||||
yourAccountSuspendedDescription: Tämä tili on hyllytetty palvelimen palveluehtojen
|
||||
tai vastaavien rikkomisen vuoksi. Ota yhteyttä ylläpitäjään, jos haluat tietää tarkemman
|
||||
syyn. Älä luo uutta tiliä.
|
||||
menu: Valikko
|
||||
divider: Jakaja
|
||||
addItem: Lisää kohde
|
||||
relays: Releet
|
||||
addRelay: Lisää rele
|
||||
inboxUrl: Saavuneen postin URL
|
||||
addedRelays: Lisätyt releet
|
||||
serviceworkerInfo: Pitää ottaa käyttöön Push-notifikaatioissa.
|
||||
deletedNote: Poistetut viestit
|
||||
disablePlayer: Sulje videotoistin
|
||||
expandTweet: Laajenna twiittiä
|
||||
themeEditor: Teemaeditori
|
||||
leaveConfirm: Tallentamattomia muutoksia olemassa. Hylätäänkö ne?
|
||||
plugins: Liitännäiset
|
||||
preferencesBackups: Asetusten varmuuskopiot
|
||||
deck: Kansi
|
||||
undeck: Jätä kansi
|
||||
useBlurEffectForModal: Käytä blur-efektiä modaaleissa
|
||||
useFullReactionPicker: Käytä täysikokoista reaktiovalitsinta
|
||||
width: Leveys
|
||||
generateAccessToken: Luo käyttöoikeustunniste
|
||||
enableAll: Ota käyttöön kaikki
|
||||
disableAll: Poista käytöstä kaikki
|
||||
tokenRequested: Myönnä oikeus tiliin
|
||||
notificationType: Ilmoituksen tyyppi
|
||||
edit: Muokkaa
|
||||
emailServer: Sähköpostipalvelin
|
||||
enableEmail: Ota sähköpostin jakelu käyttöön
|
||||
emailConfigInfo: Käytetään vahvistamaan sähköpostiosoitteesi rekisteröitymisen yhteydessä
|
||||
tai jos unohdat salasanasi
|
||||
email: Sähköposti
|
||||
smtpHost: Isäntä
|
||||
smtpUser: Käyttäjänimi
|
||||
smtpPass: Salasana
|
||||
emptyToDisableSmtpAuth: Jätä käyttäjänimi ja salasana tyhjäksi ohittaaksesi SMTP verifioinnin
|
||||
smtpSecureInfo: Kytke tämä päältä kun käytät STARTTLS
|
||||
testEmail: Kokeile email-lähetystä
|
||||
wordMute: Sanan hiljennys
|
||||
regexpError: Säännöllinen lausekevirhe
|
||||
userSaysSomething: '{name} sanoi jotakin'
|
||||
userSaysSomethingReason: '{name} sanoi {reason}'
|
||||
makeActive: Aktivoi
|
||||
display: Näyttö
|
||||
copy: Kopioi
|
||||
metrics: Mittarit
|
||||
overview: Yleiskatsaus
|
||||
logs: Lokit
|
||||
delayed: Viivästynyt
|
||||
database: Tietokanta
|
||||
channel: Kanavat
|
||||
notificationSetting: Ilmoitusasetukset
|
||||
notificationSettingDesc: Valitse näytettävät ilmoitustyypit.
|
||||
useGlobalSetting: Käytä globaaleja asetuksia
|
||||
regenerateLoginToken: Luo kirjautumistunniste uudelleen
|
||||
sample: Näyte
|
||||
abuseReports: Raportit
|
||||
reportAbuse: Raportti
|
||||
reportAbuseOf: Raportti {name}
|
||||
fillAbuseReportDescription: Täytä tätä raporttia koskevat tiedot. Jos se koskee tiettyä
|
||||
viestiä, ilmoita sen URL-linkki.
|
||||
abuseReported: Raporttisi on lähetetty. Kiitoksia paljon.
|
||||
reporter: Raportoija
|
||||
reporteeOrigin: Ilmoittajan alkuperä
|
||||
reporterOrigin: Raportoijan alkuperä
|
||||
forwardReport: Välitä raportti etäinstanssille
|
||||
forwardReportIsAnonymous: Tilisi sijasta anonyymi järjestelmätili näytetään toimittajana
|
||||
etäinstanssissa.
|
||||
send: Lähetä
|
||||
abuseMarkAsResolved: Merkitse raportti ratkaistuksi
|
||||
openInNewTab: Avaa uuteen välilehteen
|
||||
openInSideView: Avaa sivunäkymään
|
||||
defaultNavigationBehaviour: Navigoinnin oletuskäyttäytyminen
|
||||
editTheseSettingsMayBreakAccount: Näiden asetusten muuttaminen voi vahingoittaa tiliäsi.
|
||||
desktop: Työpöytä
|
||||
clip: Leike
|
||||
optional: Vaihtoehtoinen
|
||||
createNewClip: Luo uusi leike
|
||||
unclip: Poista leike
|
||||
confirmToUnclipAlreadyClippedNote: Tämä viesti on jo osa "{name}"-leikettä. Haluatko
|
||||
sen sijaan poistaa sen tästä leikkeestä?
|
||||
manageAccessTokens: Hallitse käyttöoikeuskoodeja
|
||||
accountInfo: Tilin tiedot
|
||||
notesCount: Viestien määrä
|
||||
renotesCount: Lähetettyjen buustausten määrä
|
||||
repliedCount: Saatujen vastausten määrä
|
||||
sentReactionsCount: Lähetettyjen reaktioiden määrä
|
||||
receivedReactionsCount: Saatujen reaktioiden määrä
|
||||
pollVotesCount: Lähetettyjen kyselyäänien määrä
|
||||
pollVotedCount: Saatujen kyselyäänien määrä
|
||||
yes: Kyllä
|
||||
no: Ei
|
||||
driveFilesCount: Tiedostojen määrä asemalla
|
||||
driveUsage: Aseman tilankäyttö
|
||||
noCrawle: Hylkää hakukoneindeksointi
|
||||
noCrawleDescription: Pyydä hakukoneita olemaan indeksoimatta profiilisivuasi, viestejäsi,
|
||||
sivujasi jne.
|
||||
alwaysMarkSensitive: Merkitse oletusarvoisesti herkäksi sisällöksi (NSFW)
|
||||
loadRawImages: Alkuperäisten kuvien lataaminen pikkukuvien näyttämisen sijaan
|
||||
disableShowingAnimatedImages: Älä näytä animoituja kuvia
|
||||
verificationEmailSent: Vahvistussähköposti on lähetetty. Seuraa mukana olevaa linkkiä
|
||||
suorittaaksesi vahvistuksen loppuun.
|
||||
emailVerified: Sähköposti on vahvistettu
|
||||
noteFavoritesCount: Kirjanmerkittyjen viestien määrä
|
||||
pageLikedCount: Saatujen Sivu-tykkäysten määrä
|
||||
pageLikesCount: Sivut-tykkäysten määrä
|
||||
contact: Yhteystieto
|
||||
useSystemFont: Käytä järjestelmän oletuskirjasinta
|
||||
clips: Leikkeet
|
||||
experimentalFeatures: Kokeiluluontoiset ominaisuudet
|
||||
developer: Kehittäjä
|
||||
makeExplorable: Tee tili näkyväksi osiossa "Tutustu"
|
||||
makeExplorableDescription: Jos otat tämän pois käytöstä, tilisi ei näy "Tutustu"-osiossa.
|
||||
showGapBetweenNotesInTimeline: Näytä väli viestien välissä aikajanalla
|
||||
duplicate: Monista
|
||||
left: Vasen
|
||||
center: Keskellä
|
||||
wide: Leveä
|
||||
narrow: Kapea
|
||||
reloadToApplySetting: Asetus otetaan käyttöön vain uudelleenladattaessa. Ladataanko
|
||||
uudelleen nyt?
|
||||
showTitlebar: Näytä otsikkorivi
|
||||
clearCache: Tyhjennä välimuisti
|
||||
onlineUsersCount: '{n} käyttäjää online-tilassa'
|
||||
myTheme: Minun teemani
|
||||
value: Arvo
|
||||
saveConfirm: Tallenna muutokset?
|
||||
deleteConfirm: Poistetaanko tosiaan?
|
||||
latestVersion: Uusin versio
|
||||
newVersionOfClientAvailable: Asiakasohjelmiston uudempi versio saatavilla.
|
||||
usageAmount: Käyttö
|
||||
inUse: Käytetty
|
||||
editCode: Muokkaa koodia
|
||||
apply: Käytä
|
||||
receiveAnnouncementFromInstance: Vastaanota ilmoituksia tästä instanssista
|
||||
emailNotification: Sähköposti-ilmoitukset
|
||||
publish: Julkaise
|
||||
inChannelSearch: Etsi kanavalta
|
||||
useReactionPickerForContextMenu: Avaa reaktiovalitsin napsauttamalla oikeaa
|
||||
typingUsers: '{users} kirjoittaa'
|
||||
jumpToSpecifiedDate: Hyppää tiettyyn päivään
|
||||
markAllAsRead: Merkitse kaikki luetuksi
|
||||
goBack: Takaisin
|
||||
unlikeConfirm: Poistatko todella tykkäyksesi?
|
||||
fullView: Täysi koko
|
||||
quitFullView: Poistu täydestä koosta
|
||||
addDescription: Lisää kuvaus
|
||||
markAsReadAllTalkMessages: Merkitse kaikki yksityisviestit luetuiksi
|
||||
appearance: Ulkonäkö
|
||||
messagingWithGroup: Ryhmäjuttelu
|
||||
newPasswordIs: Uusi salasana on "{password}"
|
||||
noFollowRequests: Sinulla ei ole odottavia seuraajapyyntöjä
|
||||
objectStoragePrefixDesc: Tiedostot tallennetaan hakemistoihin tällä etuliitteellä.
|
||||
objectStorageEndpointDesc: Jätä tämä tyhjäksi, jos käytät AWS S3:a. Muuten määritä
|
||||
päätepisteeksi '<host>' tai '<host>:<port>' käyttämästäsi palvelusta riippuen.
|
||||
unableToProcess: Toimenpidettä ei voida suorittaa loppuun
|
||||
installedDate: Hyväksynyt
|
||||
lastUsedDate: Viimeksi käytetty
|
||||
pluginTokenRequestedDescription: Tämä litännäinen voi käyttää tässä asetettuja käyttöoikeuksia.
|
||||
permission: Oikeudet
|
||||
smtpConfig: Lähtevän sähköpostin palvelimen (SMTP) asetukset
|
||||
regexpErrorDescription: 'Säännöllisessä lausekkeessa tapahtui virhe rivillä {line}
|
||||
sanan {tab} sanan mykistäminen rivillä {line}:'
|
||||
emailAddress: Sähköpostiosoite
|
||||
smtpSecure: Käytä implisiittistä SSL/TLS:ää SMTP-yhteyksissä
|
||||
useGlobalSettingDesc: Jos se on päällä, käytetään tilisi ilmoitusasetuksia. Jos se
|
||||
on pois päältä, voit tehdä yksilöllisiä asetuksia.
|
||||
public: Julkinen
|
||||
i18nInfo: Vapaaehtoiset kääntävät Firefishta eri kielille. Voit auttaa osoitteessa
|
||||
{link}.
|
||||
lockedAccountInfo: Ellet aseta postauksen näkyvyydeksi "Vain seuraajille", postauksesi
|
||||
näkyvät kaikille, vaikka vaatisitkin seuraajilta manuaalista hyväksyntää.
|
||||
sendErrorReportsDescription: "Kun tämä on päällä, yksityiskohtaiset virhetiedot jaetaan
|
||||
Firefishn kanssa ongelman ilmetessä, mikä auttaa parantamaan Firefishn laatua.\n
|
||||
Näihin tietoihin sisältyy esimerkiksi käyttöjärjestelmäversio, käyttämäsi selain,
|
||||
toimintasi Firefishssä jne."
|
||||
createdAt: Luotu
|
||||
youAreRunningUpToDateClient: Käytössäsi on asiakasohjelman uusin versio.
|
||||
needReloadToApply: Uudelleenlataus vaaditaan, jotta tämä näkyy.
|
||||
showingPastTimeline: Näytetään parhaillaan vanhaa aikajanaa
|
||||
userPagePinTip: Voit näyttää viestit täällä valitsemalla yksittäisten viestien valikosta
|
||||
"Kiinnitä profiiliin".
|
||||
notSpecifiedMentionWarning: Tämä viesti sisältää mainintoja käyttäjistä, joita ei
|
||||
ole mainittu vastaanottajina
|
||||
name: Nimi
|
||||
allowedInstances: Sallitut (whitelisted) instanssit
|
||||
hashtags: Aihetunnisteet
|
||||
troubleshooting: Vianetsintä
|
||||
received: Vastaanotettu
|
||||
searchResult: Hakutulokset
|
||||
filter: Suodatin
|
||||
antennas: Antennit
|
||||
noMaintainerInformationWarning: Ylläpitäjän tietoja ei ole konfiguroitu.
|
||||
controlPanel: Hallintapaneeli
|
||||
manageAccounts: Hallitse tilejä
|
||||
makeReactionsPublic: Aseta reaktiohistoria julkiseksi
|
||||
unread: Lukematon
|
||||
deleted: Poistettu
|
||||
editNote: Muokkaa viestiä
|
||||
edited: 'Muokattu klo {date} {time}'
|
||||
avoidMultiCaptchaConfirm: Useiden Captcha-järjestelmien käyttö voi aiheuttaa häiriöitä
|
||||
niiden välillä. Haluatko poistaa käytöstä muut tällä hetkellä käytössä olevat Captcha-järjestelmät?
|
||||
Jos haluat, että ne pysyvät käytössä, paina peruutusnäppäintä.
|
||||
manageAntennas: Hallitse antenneja
|
||||
info: Tietoja
|
||||
userInfo: Käyttäjätiedot
|
||||
unknown: Tuntematon
|
||||
onlineStatus: Online-tila
|
||||
hideOnlineStatus: Piilota Online-tila
|
||||
hideOnlineStatusDescription: Online-tilasi piilottaminen vähentää joidenkin toimintojen,
|
||||
kuten haun, käyttömukavuutta.
|
||||
online: Online
|
||||
active: Aktiivinen
|
||||
offline: Offline
|
||||
botProtection: Botti-suojaus
|
||||
instanceBlocking: Federaatio Esto/Hiljennys
|
||||
enabled: Otettu käyttöön
|
||||
quickAction: Pikatoiminnot
|
||||
user: Käyttäjä
|
||||
accounts: Tilit
|
||||
switch: Vaihda
|
||||
noBotProtectionWarning: Botti-suojausta ei ole konfiguroitu.
|
||||
configure: Konfiguroi
|
||||
postToGallery: Luo uusi galleriaviesti
|
||||
gallery: Galleria
|
||||
recentPosts: Viimeaikaiset sivut
|
||||
popularPosts: Suositut sivut
|
||||
ads: Mainokset
|
||||
expiration: Aikaraja
|
||||
memo: Muistio
|
||||
priority: Prioriteetti
|
||||
high: Korkea
|
||||
middle: Keskitaso
|
||||
low: Alhainen
|
||||
emailNotConfiguredWarning: Sähköpostiosoitetta ei ole asetettu.
|
||||
ratio: Suhde
|
||||
secureMode: Suojattu moodi (Valtuutettu nouto)
|
||||
instanceSecurity: Instanssiturvallisuus
|
||||
allowedInstancesDescription: Federaatiota varten sallitulle listalle (whitelisted)
|
||||
otettavien instanssien isännät, kukin erotettuna uudella rivillä (sovelletaan vain
|
||||
yksityisessä tilassa).
|
||||
previewNoteText: Näytä esikatselu
|
||||
customCss: Kustomoitu CSS
|
||||
customCssWarn: Tätä asetusta tulisi käyttää vain, jos tiedät, mitä se tekee. Vääränlaisten
|
||||
arvojen syöttäminen voi aiheuttaa sen, että asiakasohjelma lakkaa toimimasta normaalisti.
|
||||
recommended: Suositeltu
|
||||
squareAvatars: Näytä neliön malliset kuvakkeet
|
||||
seperateRenoteQuote: Erilliset buustaa ja lainaa -napit
|
||||
sent: Lähetetty
|
||||
useBlurEffect: Käytä blur-efektejä käyttöliittymässä
|
||||
misskeyUpdated: Firefish on päivitetty!
|
||||
whatIsNew: Näytä muutokset
|
||||
translate: Käännä
|
||||
translatedFrom: Käännetty kielestä {x}
|
||||
accountDeletionInProgress: Tilin poistaminen on parhaillaan menossa
|
||||
usernameInfo: Nimi, joka erottaa tilisi muista tällä palvelimella olevista tileistä. Voit
|
||||
käyttää aakkosia (a~z, A~Z), numeroita (0~9) tai alaviivoja (_). Käyttäjätunnuksia
|
||||
ei voi muuttaa myöhemmin.
|
||||
aiChanMode: Ai-chan klassisessa käyttöliittymässä
|
||||
keepCw: Pidä sisältövaroitukset
|
||||
pubSub: Pub/Sub tilit
|
||||
lastCommunication: Viimeisin kommunikaatio
|
||||
unresolved: Ratkaisematon
|
||||
breakFollow: Poista seuraaja
|
||||
breakFollowConfirm: Oletko varma, että haluat poistaa seuraajan?
|
||||
itsOn: Otettu käyttöön
|
||||
itsOff: Poistettu käytöstä
|
||||
emailRequiredForSignup: Vaadi sähköpostiosoitetta sisäänkirjautumiseen
|
||||
makeReactionsPublicDescription: Tämä laittaa viimeisimmät reaktiosi julkisesti näkyväksi.
|
||||
classic: Klassinen
|
||||
muteThread: Mykistä lanka
|
||||
unmuteThread: Poista langan mykistys
|
||||
ffVisibility: Seurataan/Seurattavien näkyvyys
|
||||
notRecommended: Ei suositeltu
|
||||
disabled: Poistettu käytöstä
|
||||
selectAccount: Valitse tili
|
||||
switchAccount: Vaihda tili
|
||||
administration: Hallinta
|
||||
shareWithNote: Jaa viestin kanssa
|
||||
secureModeInfo: Kun pyydät muista instansseista, älä lähetä takaisin ilman todisteita.
|
||||
privateMode: Yksityinen moodi
|
||||
privateModeInfo: Kun tämä on käytössä, vain sallittujen (whitelisted) luetteloon merkityt
|
||||
instanssit voivat liittyä instansseihisi. Kaikki viestit piilotetaan yleisöltä.
|
||||
global: Globaali
|
||||
resolved: Ratkaistu
|
||||
learnMore: Opi lisää
|
||||
continueThread: Jatka lankaa
|
||||
file: Tiedosto
|
||||
cropImageAsk: Haluatko rajata tätä kuvaa?
|
||||
recentNHours: Viimeiset {n} tuntia
|
||||
rateLimitExceeded: Nopeusraja ylittynyt
|
||||
cropImage: Rajaa kuvaa
|
||||
socialTimeline: Sosiaalinen aikajana
|
||||
themeColor: Instanssi Ticker Väri
|
||||
check: Tarkista
|
||||
ffVisibilityDescription: Antaa sinun konfiguroida, kuka voi nähdä ketä seuraat ja
|
||||
kuka seuraa sinua.
|
||||
homeTimeline: Koti aikajana
|
||||
size: Koko
|
||||
showLocalPosts: 'Näytä paikalliset viestit:'
|
||||
oneDay: Päivä
|
||||
instanceDefaultDarkTheme: Instanssikattava tumma oletusteema
|
||||
recentNDays: Viimeiset {n} päivää
|
||||
reflectMayTakeTime: Voi kestää jonkin aikaa, ennen kuin tämä näkyy.
|
||||
failedToFetchAccountInformation: Ei voitu hakea tietoja
|
||||
requireAdminForView: Sinun tulee kirjautua järjestelmänvalvojana nähdäksesi tämän.
|
||||
driveCapOverrideCaption: Resetoi oletusarvoon syöttämällä arvo 0 tai alempi.
|
||||
isSystemAccount: Järjestelmän luoma ja automaattisesti käyttämä tili.
|
||||
userSaysSomethingReasonReply: '{name} vastasi viestiin sisältäen {reason}'
|
||||
userSaysSomethingReasonRenote: '{name} buustasi viestiin sisältäen {reason}'
|
||||
voteConfirm: Vahvista äänesi vaihtoehdolle "{choice}"?
|
||||
hide: Piilota
|
||||
leaveGroup: Poistu ryhmästä
|
||||
leaveGroupConfirm: Oletko varma, että haluat poistua ryhmästä "{name}"?
|
||||
welcomeBackWithName: Tervetuloa takaisin, {name}
|
||||
clickToFinishEmailVerification: Klikkaa [{ok}] viimeistelläksesi sähköpostivahvistuksen.
|
||||
overridedDeviceKind: Laitetyyppi
|
||||
tablet: Tabletti
|
||||
numberOfColumn: Sarakkeiden määrä
|
||||
mutePeriod: Vaiennuksen kesto
|
||||
indefinitely: Pysyvästi
|
||||
tenMinutes: 10 minuuttia
|
||||
oneHour: Tunti
|
||||
thereIsUnresolvedAbuseReportWarning: On ratkaisemattomia raportteja.
|
||||
driveCapOverrideLabel: Muuta aseman kapasiteetti tälle käyttäjälle
|
||||
userSaysSomethingReasonQuote: '{name} lainasi viestiä sisältäen {reason}'
|
||||
deleteAccountConfirm: Tämä peruuttamattomasti poistaa tilisi. Jatketaanko?
|
||||
incorrectPassword: Väärä salasana.
|
||||
useDrawerReactionPickerForMobile: Näytä reaktiovalitsin mobiilissa laatikkomallisena
|
||||
smartphone: Älypuhelin
|
||||
auto: Automaattinen
|
||||
oneWeek: Viikko
|
||||
instanceDefaultLightTheme: Instanssin kattava vaalea oletusteema
|
||||
instanceDefaultThemeDescription: Anna teemakoodi objektiformaatille.
|
||||
noEmailServerWarning: Sähköpostipalvelinta ei konfiguroituna.
|
2353
locales/fr-FR.yml
Normal file
2353
locales/fr-FR.yml
Normal file
File diff suppressed because it is too large
Load diff
378
locales/gl.yml
Normal file
378
locales/gl.yml
Normal file
|
@ -0,0 +1,378 @@
|
|||
_lang_: Galego
|
||||
introFirefish: Benvida! Firefish é unha plataforma de medios sociais de código aberto,
|
||||
descentralizada e gratuíta para sempre!🚀
|
||||
monthAndDay: '{day}/{month}'
|
||||
notifications: Notificacións
|
||||
password: Contrasinal
|
||||
forgotPassword: Esquecín o contrasinal
|
||||
gotIt: Vale!
|
||||
cancel: Cancelar
|
||||
noThankYou: Non, grazas
|
||||
headlineFirefish: Plataforma de medios sociais de código aberto e descentralizada,
|
||||
gratuíta para sempre!🚀
|
||||
search: Buscar
|
||||
searchPlaceholder: Buscar en Firefish
|
||||
username: Identificador
|
||||
fetchingAsApObject: Descargando desde o Fediverso
|
||||
ok: OK
|
||||
youShouldUpgradeClient: Actualiza esta páxina para recibir os últimos contidos no
|
||||
teu cliente.
|
||||
privacy: Privacidade
|
||||
makeFollowManuallyApprove: As solicitudes de seguimento requiren aprobación
|
||||
defaultNoteVisibility: Visibilidade por defecto
|
||||
follow: Seguir
|
||||
followRequests: Solicitudes de seguimento
|
||||
followRequestPending: Solicitude de seguimento pendente
|
||||
renote: Promover
|
||||
unrenote: Retirar promoción
|
||||
renoted: Promovida.
|
||||
cantReRenote: Unha promoción non pode ser promovida.
|
||||
quote: Citar
|
||||
pinnedNote: Publicación fixada
|
||||
pinned: Fixar no perfil
|
||||
you: Ti
|
||||
clickToShow: Preme para mostrar
|
||||
sensitive: NSFW
|
||||
add: Engadir
|
||||
reaction: Reaccións
|
||||
removeReaction: Quitar a túa reacción
|
||||
enableEmojiReactions: Activar as reaccións con emojis
|
||||
showEmojisInReactionNotifications: Mostrar emojis nas notificacións das reaccións
|
||||
reactionSetting: Reaccións mostradas no selector de reaccións
|
||||
reactionSettingDescription2: Arrastra para reordenar, preme para eliminar, preme "+"
|
||||
para engadir.
|
||||
rememberNoteVisibility: Lembrar os axustes da visibilidade da publicación
|
||||
attachCancel: Quitar o anexo
|
||||
markAsSensitive: Marcar como NSFW
|
||||
unmarkAsSensitive: Retirar marca NSFW
|
||||
enterFileName: Escribe nome do ficheiro
|
||||
mute: Acalar
|
||||
unmute: Reactivar
|
||||
renoteMute: Acalar promocións
|
||||
renoteUnmute: Reactivar promocións
|
||||
block: Bloquear
|
||||
unblock: Desbloquear
|
||||
suspend: Suspender
|
||||
unsuspend: Retirar suspensión
|
||||
timeline: Cronoloxía
|
||||
noAccountDescription: Esta usuaria aínda non escribiu a súa bio.
|
||||
login: Acceder
|
||||
loggingIn: Accedendo
|
||||
logout: Pechar sesión
|
||||
signup: Crear conta
|
||||
uploading: Subindo...
|
||||
save: Gardar
|
||||
users: Usuarias
|
||||
addUser: Engadir unha usuaria
|
||||
addInstance: Engadir un servidor
|
||||
favorite: Engadir aos marcadores
|
||||
favorites: Marcadores
|
||||
unfavorite: Quitar dos marcadores
|
||||
favorited: Engadido aos marcadores.
|
||||
alreadyFavorited: Xa está nos marcadores.
|
||||
cantFavorite: Non se puido engadir aos marcadores.
|
||||
pin: Fixar no perfil
|
||||
unpin: Soltar do perfil
|
||||
copyContent: Copiar contidos
|
||||
copyLink: Copiar ligazón
|
||||
delete: Eliminar
|
||||
deleted: Eliminado
|
||||
deleteAndEdit: Eliminar e editar
|
||||
blockConfirm: Tes a certeza de querer bloquear esta conta?
|
||||
deleteAndEditConfirm: Tes a certeza de querer eliminar esta publicación e editala?
|
||||
Perderás todas as súas reaccións, promocións e respostas.
|
||||
editNote: Editar publicación
|
||||
edited: Editado o {date} {time}
|
||||
sendMessage: Enviar unha mensaxe
|
||||
copyUsername: Copiar identificador
|
||||
searchUser: Buscar unha usuaria
|
||||
reply: Responder
|
||||
jumpToPrevious: Ir á anterior
|
||||
loadMore: Cargar máis
|
||||
showMore: Mostrar máis
|
||||
newer: máis novo
|
||||
older: máis antigo
|
||||
showLess: Pechar
|
||||
youGotNewFollower: seguíute
|
||||
receiveFollowRequest: Recibida solicitude de seguimento
|
||||
followRequestAccepted: Solicitude de seguimento aceptada
|
||||
mention: Mención
|
||||
mentions: Mencións
|
||||
directNotes: Mensaxes directas
|
||||
cw: Aviso sobre o contido
|
||||
importAndExport: Importar/Exportar datos
|
||||
import: Importar
|
||||
export: Exportar
|
||||
files: Ficheiros
|
||||
download: Descargar
|
||||
unblockConfirm: Tes a certeza de querer retirarlle o bloqueo a esta conta?
|
||||
suspendConfirm: Tes a certeza de querer suspender esta conta?
|
||||
unsuspendConfirm: Tes a certeza de querer retirarlle a suspensión a esta conta?
|
||||
selectList: Elixe unha lista
|
||||
selectAntenna: Elixe unha antena
|
||||
selectWidget: Elixe un widget
|
||||
selectChannel: Elixe unha canle
|
||||
editWidgets: Editar widgets
|
||||
editWidgetsExit: Feito
|
||||
customEmojis: Emoji personalizado
|
||||
emoji: Emoji
|
||||
emojis: Emoji
|
||||
emojiName: Nome do emoji
|
||||
emojiUrl: URL do emoji
|
||||
addEmoji: Engadir
|
||||
settingGuide: Axustes recomendados
|
||||
cacheRemoteFiles: Gardar na caché ficheiros remotos
|
||||
cacheRemoteFilesDescription: Se desactivas este axuste, os ficheiros remotos cárganse
|
||||
directamente desde o servidor remoto. Ao desactivalo diminuirá a almacenaxe usada,
|
||||
pero incrementarás o tráfico, xa que non se crearán miniaturas.
|
||||
flagAsBotDescription: Activa esta opción se esta conta está controlada por un programa.
|
||||
Se está activada, será unha marca para que outras desenvolvedoras eviten interaccións
|
||||
en bucle con outros bots e axustará os sistemas internos de Firefish para tratar
|
||||
esta conta como un bot.
|
||||
flagAsCat: Es un gato? 😺
|
||||
flagAsCatDescription: Vas ter orellas de gato e falar como un gato!
|
||||
flagSpeakAsCat: Fala como un gato
|
||||
flagSpeakAsCatDescription: As túas publicacións serán gatificadas ao estar no modo
|
||||
gato
|
||||
flagShowTimelineReplies: Mostrar respostas na cronoloxía
|
||||
flagShowTimelineRepliesDescription: Se está activado mostra as respostas das usuarias
|
||||
a publicacións de outras usuarias na cronoloxía.
|
||||
autoAcceptFollowed: Aprobar automáticamente as solicitudes de seguimento das persoas
|
||||
que ti xa segues
|
||||
addAccount: Engadir conta
|
||||
loginFailed: Fallou o inicio de sesión
|
||||
showOnRemote: Abrir páxina orixinal
|
||||
general: Xeral
|
||||
accountMoved: 'A usuaria está nunha nova conta:'
|
||||
wallpaper: Fondo de pantalla
|
||||
setWallpaper: Establecer fondo
|
||||
removeWallpaper: Eliminar fondo
|
||||
searchWith: 'Buscar: {q}'
|
||||
youHaveNoLists: Non tes ningunha lista
|
||||
stopActivityDelivery: Deixar de enviar actividades
|
||||
perDay: Por día
|
||||
blockThisInstance: Bloquear este servidor
|
||||
silenceThisInstance: Acalar este servidor
|
||||
operations: Operacións
|
||||
software: Software
|
||||
version: Versión
|
||||
metadata: Metadatos
|
||||
monitor: Monitor
|
||||
cantRenote: Non se pode promover esta publicación.
|
||||
clearCachedFiles: Limpar caché
|
||||
jobQueue: Cola de tarefas
|
||||
cpuAndMemory: CPU e Memoria
|
||||
network: Rede
|
||||
disk: Disco
|
||||
instanceInfo: Información do servidor
|
||||
statistics: Estatísticas
|
||||
clearQueue: Limpar cola
|
||||
clearQueueConfirmTitle: Tes a certeza de querer limpara a cola?
|
||||
clearQueueConfirmText: Todas as publicacións que aínda non fosen entregadas non estarán
|
||||
federadas. Esta operación, normalmente, non é necesaria.
|
||||
clearCachedFilesConfirm: Tes a certeza de que queres eliminar todos os ficheiros remotos
|
||||
da caché?
|
||||
blockedInstances: Servidores bloqueados
|
||||
blockedInstancesDescription: Lista dos nomes dos servidores que queres bloquear. Os
|
||||
servidores da lista non poderán comunicarse con este servidor.
|
||||
silencedInstances: Servidores acalados
|
||||
silencedInstancesDescription: Lista cos nomes de servidores que queres acalar. As
|
||||
contas dos servidores acalados serán tratadas como "Silenciadas", só poden facer
|
||||
solicitudes de seguimento e non poden mencionar contas locais se non a están a seguir.
|
||||
Isto non afecta aos servidores bloqueados.
|
||||
hiddenTags: Cancelos agochados
|
||||
hiddenTagsDescription: 'Lista cos cancelos (sen o #) que queres ocultar das seccións
|
||||
descubrir e en voga. Os cancelos agochados seguirán sendo accesibles por outros
|
||||
medios.'
|
||||
muteAndBlock: Bloquear e Silenciar
|
||||
mutedUsers: Usuarias acaladas
|
||||
blockedUsers: Usuarias bloqueadas
|
||||
noUsers: Sen usuarias
|
||||
noInstances: Sen servidores
|
||||
editProfile: Editar perfil
|
||||
noteDeleteConfirm: Tes a certeza de querer eliminar esta publicación?
|
||||
pinLimitExceeded: Xa non podes fixar máis publicacións
|
||||
intro: Rematou a instalación de Fishfox! Por favor crea a usuaria administradora.
|
||||
done: Feito
|
||||
processing: Procesando
|
||||
preview: Vista previa
|
||||
default: Por defecto
|
||||
defaultValueIs: 'Por defecto: {value}'
|
||||
noCustomEmojis: Non hai emojis
|
||||
noJobs: Non hai tarefas
|
||||
blocked: Bloqueado
|
||||
federating: Federación
|
||||
silenced: Acalado
|
||||
suspended: Suspendido
|
||||
all: Todo
|
||||
subscribing: Subscrición
|
||||
publishing: Publicar
|
||||
notResponding: Non responde
|
||||
instanceFollowing: Seguindo no servidor
|
||||
instanceFollowers: Seguidoras desde o servidor
|
||||
instanceUsers: Usuarias neste servidor
|
||||
security: Seguridade
|
||||
retypedNotMatch: Os valores escritos non concordan.
|
||||
changePassword: Cambiar contrasinal
|
||||
currentPassword: Contrasinal actual
|
||||
newPassword: Novo contrasinal
|
||||
newPasswordRetype: Volve escribir o contrasinal
|
||||
attachFile: Adxunta ficheiros
|
||||
more: Máis!
|
||||
featured: Destacado
|
||||
usernameOrUserId: Identificador ou id de usuaria
|
||||
noSuchUser: Non se atopa a usuaria
|
||||
remove: Eliminar
|
||||
removed: Eliminada correctamente
|
||||
removeAreYouSure: Tes a certeza de querer eliminar "{x}"?
|
||||
announcements: Anuncios
|
||||
imageUrl: URL da imaxe
|
||||
enterUsername: Escribir identificador
|
||||
renotedBy: Promovido por {user}
|
||||
noNotes: Sen publicacións
|
||||
noNotifications: Sen notificacións
|
||||
instance: Servidor
|
||||
settings: Axustes
|
||||
basicSettings: Axustes básicos
|
||||
otherSettings: Outros axustes
|
||||
openInWindow: Abrir na ventá
|
||||
profile: Perfil
|
||||
addToList: Engadir á lista
|
||||
lists: Listas
|
||||
listsDesc: As listas permítenche crear cronoloxías coas usuarias escollidas. Podes
|
||||
acceder a elas desde a páxina de cronoloxías.
|
||||
noLists: Non tes ningunha lista
|
||||
note: Publicación
|
||||
notes: Publicacións
|
||||
following: Seguindo
|
||||
followers: Seguidoras
|
||||
followsYou: Séguete
|
||||
createList: Crear lista
|
||||
manageLists: Xestionar listas
|
||||
error: Erro
|
||||
somethingHappened: Houbo un fallo
|
||||
retry: Volver a intentar
|
||||
pageLoadError: Algo fallou ao cargar a páxina.
|
||||
pageLoadErrorDescription: Normalmente isto débese a problemas na rede ou na caché
|
||||
do navegador. Intenta limpar a caché e volve a intentalo dentro dun anaco.
|
||||
serverIsDead: Este servidor non responde. Agarda un anaco e volve intentalo.
|
||||
enterListName: Dalle un nome á lista
|
||||
unfollow: Deixar de seguir
|
||||
enterEmoji: Escribe un emoji
|
||||
flagAsBot: Marcar a conta como bot
|
||||
followConfirm: Tes a certeza de querer seguir a {name}?
|
||||
proxyAccount: Conta proxy
|
||||
proxyAccountDescription: Unha conta proxy é unha conta que en determinadas situacións
|
||||
actúa como unha seguidora remota para as usuarias. Por exemplo, cando unha usuaria
|
||||
engade unha usuaria remota a unha lista, a actividade da usuaria remota non se entrega
|
||||
ao servidor se a usuaria local non segue a esa outra usuaria, así a conta proxy
|
||||
fará o seguimento no seu lugar.
|
||||
host: Hóspede
|
||||
selectUser: Escolle unha usuaria
|
||||
selectInstance: Escolle un servidor
|
||||
recipient: Correpondente(s)
|
||||
annotation: Comentarios
|
||||
federation: Federación
|
||||
instances: Servidores
|
||||
registeredAt: Data do rexistro
|
||||
latestRequestSentAt: Última solicitude enviada
|
||||
latestRequestReceivedAt: Última solicitude recibida
|
||||
latestStatus: Último estado
|
||||
storageUsage: Uso da almacenaxe
|
||||
charts: Gráficas
|
||||
perHour: Por hora
|
||||
followRequest: Solicitar seguimento
|
||||
messageRead: Ler
|
||||
noMoreHistory: Non hai máis historial
|
||||
images: Imaxes
|
||||
manageGroups: Xestionar grupos
|
||||
unableToDelete: Non se puido eliminar
|
||||
syncDeviceDarkMode: Syncr Modo Escuro cos axustes do teu dispositivo
|
||||
uploadFromUrl: Subir desde un URL
|
||||
emptyDrive: O teu Disco está baleiro
|
||||
copyUrl: Copiar URL
|
||||
nUsersRead: lido por {n}
|
||||
uploadFromUrlRequested: Solicitaches unha subida
|
||||
circularReferenceFolder: O cartafol de destino é un subcartafol do cartafol que queres
|
||||
mover.
|
||||
selectFile: Elexir un ficheiro
|
||||
inputNewFileName: Escribe o novo nome
|
||||
agreeTo: Acepto os {0}
|
||||
whenServerDisconnected: Cando se perda a conexión co servidor
|
||||
selectFolder: Elexir un cartafol
|
||||
saved: Gardado
|
||||
selectFiles: Elexir ficheiros
|
||||
fileName: Nome do ficheiro
|
||||
explore: Descubrir
|
||||
keepOriginalUploadingDescription: Garda a imaxe subida orixinalmente tal como é. Se
|
||||
o desactivas, a versión que se mostrará na web será creada ao subila.
|
||||
folderName: Nome do cartafol
|
||||
lightThemes: Decorados claros
|
||||
rename: Cambiar nome
|
||||
activity: Actividade
|
||||
fromUrl: Desde URL
|
||||
darkThemes: Decorados escuros
|
||||
birthday: Aniversario
|
||||
registeredDate: Conta creada en
|
||||
fromDrive: Desde Disco
|
||||
uploadFromUrlMayTakeTime: Podería tardar una anaco en completarse a subida.
|
||||
theme: Decorados
|
||||
renameFolder: Cambiar nome a este cartafol
|
||||
resetAreYouSure: Queres restablecer?
|
||||
startMessaging: Comezar un novo chat
|
||||
light: Claro
|
||||
themeForLightMode: Decorado a usar no Modo Claro
|
||||
inputNewDescription: Escribe a descrición
|
||||
start: Comezar
|
||||
selectFolders: Elexir cartafoles
|
||||
remoteUserCaution: A información das usuarias remotas podería estar incompleta.
|
||||
exportRequested: Solicitaches unha exportación. Vainos levar un pouco. Vai ser engadida
|
||||
ao teu Disco cando estea completa.
|
||||
deleteFolder: Eliminar este cartafol
|
||||
drive: Disco
|
||||
importRequested: Solicitaches unha importación. Vainos levar un anaco.
|
||||
uploadFromUrlDescription: URL do ficheiro que queres subir
|
||||
location: Localización
|
||||
unfollowConfirm: Tes a certeza de que queres deixar de seguir a {name}?
|
||||
banner: Cabeceira
|
||||
dark: Escuro
|
||||
home: Inicio
|
||||
keepOriginalUploading: Manter imaxe orixinal
|
||||
upload: Subir
|
||||
yearsOld: '{age} anos de idade'
|
||||
emptyFolder: Este cartafol está baleiro
|
||||
messaging: Chat
|
||||
nsfw: NSFW
|
||||
addFile: Engadir un ficheiro
|
||||
tos: Termos do Servizo
|
||||
themeForDarkMode: Decorado a usar no Modo Escuro
|
||||
deleteAreYouSure: Tes a certeza de querer desbotar "{x}"?
|
||||
createFolder: Crear un cartafol
|
||||
renameFile: Cambiar nome ao ficheiro
|
||||
lookup: Buscar
|
||||
avatar: Avatar
|
||||
driveFileDeleteConfirm: Tes a certeza de querer eliminar o ficheiro "{name}"? Vai
|
||||
ser retirado de todas as publicacións nas que estea como anexo.
|
||||
inputNewFolderName: Escribe o novo nome do cartafol
|
||||
hasChildFilesOrFolders: Como o cartafol non está baleiro, non pode ser eliminado.
|
||||
dayX: '{day}'
|
||||
reloadConfirm: Queres actualizar a cronoloxía?
|
||||
watch: Ver
|
||||
normal: Normal
|
||||
monthX: '{month}'
|
||||
instanceDescription: Descrición do servidor
|
||||
disconnectedFromServer: Perdeuse a conexión co servidor
|
||||
enableLocalTimeline: Activar cronoloxía local
|
||||
reload: Actualizar
|
||||
doNothing: Ignorar
|
||||
instanceName: Nome do servidor
|
||||
yearX: '{year}'
|
||||
thisYear: Ano
|
||||
unwatch: Deixar de ver
|
||||
tosUrl: URL dos Termos do Servizo
|
||||
thisMonth: Mes
|
||||
pages: Páxinas
|
||||
reject: Rexeitar
|
||||
accept: Aceptar
|
||||
maintainerName: Mantido por
|
||||
today: Hoxe
|
3
locales/hi.yml
Normal file
3
locales/hi.yml
Normal file
|
@ -0,0 +1,3 @@
|
|||
_lang_: "हिन्दी"
|
||||
headlineFirefish: एक ओपन सोर्स , डिसेंट्रलाइज़्ड सोशल मीडिया प्लेटफ़ॉर्म जो हमेशा के
|
||||
लिए मुफ़्त है! 🚀
|
1
locales/hu.yml
Normal file
1
locales/hu.yml
Normal file
|
@ -0,0 +1 @@
|
|||
_lang_: "Magyar nyelv"
|
2306
locales/id-ID.yml
Normal file
2306
locales/id-ID.yml
Normal file
File diff suppressed because it is too large
Load diff
3
locales/index.d.ts
vendored
Normal file
3
locales/index.d.ts
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
declare const locales: { [lang: string]: any };
|
||||
|
||||
export = locales;
|
90
locales/index.mjs
Normal file
90
locales/index.mjs
Normal file
|
@ -0,0 +1,90 @@
|
|||
/**
|
||||
* Languages Loader
|
||||
*/
|
||||
|
||||
import fs from "node:fs";
|
||||
import yaml from "js-yaml";
|
||||
|
||||
import { dirname } from "node:path";
|
||||
import { fileURLToPath } from "node:url";
|
||||
|
||||
const __dirname = dirname(fileURLToPath(import.meta.url));
|
||||
|
||||
const languages = [];
|
||||
const languages_custom = [];
|
||||
|
||||
const merge = (...args) =>
|
||||
args.reduce(
|
||||
(a, c) => ({
|
||||
...a,
|
||||
...c,
|
||||
...Object.entries(a)
|
||||
.filter(([k]) => c && typeof c[k] === "object")
|
||||
.reduce((a, [k, v]) => ((a[k] = merge(v, c[k])), a), {}),
|
||||
}),
|
||||
{},
|
||||
);
|
||||
|
||||
fs.readdirSync(__dirname).forEach((file) => {
|
||||
if (file.includes(".yml")) {
|
||||
file = file.slice(0, file.indexOf("."));
|
||||
languages.push(file);
|
||||
}
|
||||
});
|
||||
|
||||
fs.readdirSync(__dirname + "/../custom/locales").forEach((file) => {
|
||||
if (file.includes(".yml")) {
|
||||
file = file.slice(0, file.indexOf("."));
|
||||
languages_custom.push(file);
|
||||
}
|
||||
});
|
||||
|
||||
const primaries = {
|
||||
en: "US",
|
||||
ja: "JP",
|
||||
zh: "CN",
|
||||
};
|
||||
|
||||
// 何故か文字列にバックスペース文字が混入することがあり、YAMLが壊れるので取り除く
|
||||
const clean = (text) =>
|
||||
text.replace(new RegExp(String.fromCodePoint(0x08), "g"), "");
|
||||
|
||||
const locales = languages.reduce(
|
||||
(a, c) => (
|
||||
(a[c] =
|
||||
yaml.load(clean(fs.readFileSync(`${__dirname}/${c}.yml`, "utf-8"))) ||
|
||||
{}),
|
||||
a
|
||||
),
|
||||
{},
|
||||
);
|
||||
const locales_custom = languages_custom.reduce(
|
||||
(a, c) => (
|
||||
(a[c] =
|
||||
yaml.load(
|
||||
clean(
|
||||
fs.readFileSync(`${__dirname}/../custom/locales/${c}.yml`, "utf-8"),
|
||||
),
|
||||
) || {}),
|
||||
a
|
||||
),
|
||||
{},
|
||||
);
|
||||
Object.assign(locales, locales_custom);
|
||||
|
||||
export default Object.entries(locales).reduce(
|
||||
(a, [k, v]) => (
|
||||
(a[k] = (() => {
|
||||
const [lang] = k.split("-");
|
||||
return k === "en-US"
|
||||
? v
|
||||
: merge(
|
||||
locales["en-US"],
|
||||
locales[`${lang}-${primaries[lang]}`] || {},
|
||||
v,
|
||||
);
|
||||
})()),
|
||||
a
|
||||
),
|
||||
{},
|
||||
);
|
2205
locales/it-IT.yml
Normal file
2205
locales/it-IT.yml
Normal file
File diff suppressed because it is too large
Load diff
2092
locales/ja-JP.yml
Normal file
2092
locales/ja-JP.yml
Normal file
File diff suppressed because it is too large
Load diff
1467
locales/ja-KS.yml
Normal file
1467
locales/ja-KS.yml
Normal file
File diff suppressed because it is too large
Load diff
124
locales/kab.yml
Normal file
124
locales/kab.yml
Normal file
|
@ -0,0 +1,124 @@
|
|||
---
|
||||
_lang_: "Taqbaylit"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Nadi"
|
||||
notifications: "Ilɣuyen"
|
||||
username: "Isem n umseqdac"
|
||||
password: "Awal uffir"
|
||||
ok: "IH"
|
||||
settings: "Iɣewwaṛen"
|
||||
otherSettings: "Iɣewwaren nniḍen"
|
||||
profile: "Amaɣnu"
|
||||
signup: "Jerred"
|
||||
save: "Sekles"
|
||||
delete: "Kkes"
|
||||
addToList: "Rnu ɣer tebdart"
|
||||
reply: "Err"
|
||||
loadMore: "Wali ugar"
|
||||
showMore: "Wali ugar"
|
||||
youGotNewFollower: "Yeṭṭafaṛ-ik·em-id"
|
||||
mention: "Bder"
|
||||
import: "Kter"
|
||||
export: "Sifeḍ"
|
||||
files: "Ifuyla"
|
||||
download: "Sider"
|
||||
lists: "Tibdarin"
|
||||
noLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
|
||||
following: "Ig ṭṭafaṛ"
|
||||
followers: "Imeḍfaṛen"
|
||||
followsYou: "Yeṭṭafaṛ-ik·em-id"
|
||||
createList: "Snulfu-d tabdart"
|
||||
enterListName: "Isem n tebdart"
|
||||
privacy: "Tabaḍnit"
|
||||
follow: "Ḍfeṛ"
|
||||
you: "Kečči·mmi"
|
||||
selectList: "Fren tabdart"
|
||||
youHaveNoLists: "Ulac ɣur-k·m ula d yiwet n tabdart"
|
||||
security: "Taɣellist"
|
||||
remove: "Kkes"
|
||||
userList: "Tibdarin"
|
||||
securityKey: "Tasarutt n tɣellist"
|
||||
securityKeyName: "Isem n tsarutt"
|
||||
signinRequired: "Ttxil jerred"
|
||||
signinWith: "Tuqqna s {x}"
|
||||
tapSecurityKey: "Sekcem tasarutt-ik·im n tɣellist"
|
||||
uiLanguage: "Tutlayt n wegrudem"
|
||||
accountSettings: "Iɣewwaṛen n umiḍan"
|
||||
plugins: "Izegrar"
|
||||
email: "Imayl"
|
||||
emailAddress: "Tansa imayl"
|
||||
smtpUser: "Isem n umseqdac"
|
||||
smtpPass: "Awal uffir"
|
||||
other: "Wiyyaḍ"
|
||||
accountInfo: "Talɣut n umiḍan"
|
||||
emailNotification: "Ilɣa imayl"
|
||||
selectAccount: "Fren amiḍan"
|
||||
accounts: "Imiḍan"
|
||||
file: "Ifuyla"
|
||||
account: "Imiḍan"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Yeṭṭafaṛ-ik·em-id"
|
||||
_mfm:
|
||||
mention: "Bder"
|
||||
search: "Nadi"
|
||||
font: "Tasefsit"
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Bder"
|
||||
_sfx:
|
||||
notification: "Ilɣuyen"
|
||||
_permissions:
|
||||
"write:account": "Ẓreg talɣut n umiḍan-ik·im"
|
||||
_widgets:
|
||||
notifications: "Ilɣuyen"
|
||||
_cw:
|
||||
show: "Wali ugar"
|
||||
_visibility:
|
||||
followers: "Imeḍfaṛen"
|
||||
_profile:
|
||||
username: "Isem n umseqdac"
|
||||
_exportOrImport:
|
||||
followingList: "Ig ṭṭafaṛ"
|
||||
muteList: "Sgugem"
|
||||
blockingList: "Seḥbes"
|
||||
userLists: "Tibdarin"
|
||||
_pages:
|
||||
contents: "Agbur"
|
||||
font: "Tasefsit"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans Serif"
|
||||
eyeCatchingImageRemove: "Kkes tugna i d-ijebden"
|
||||
selectType: "Fren anaw"
|
||||
contentBlocks: "Agbur"
|
||||
inputBlocks: "Anekcum"
|
||||
specialBlocks: "Uzzig"
|
||||
script:
|
||||
categories:
|
||||
list: "Tibdarin"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Tibdarin"
|
||||
_randomPick:
|
||||
arg1: "Tibdarin"
|
||||
_dailyRandomPick:
|
||||
arg1: "Tibdarin"
|
||||
_seedRandomPick:
|
||||
arg2: "Tibdarin"
|
||||
_pick:
|
||||
arg1: "Tibdarin"
|
||||
_listLen:
|
||||
arg1: "Tibdarin"
|
||||
types:
|
||||
array: "Tibdarin"
|
||||
_notification:
|
||||
youWereFollowed: "Yeṭṭafaṛ-ik·em-id"
|
||||
_types:
|
||||
follow: "Ig ṭṭafaṛ"
|
||||
mention: "Bder"
|
||||
_actions:
|
||||
reply: "Err"
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: "Ilɣuyen"
|
||||
list: "Tibdarin"
|
85
locales/kn-IN.yml
Normal file
85
locales/kn-IN.yml
Normal file
|
@ -0,0 +1,85 @@
|
|||
---
|
||||
_lang_: "ಕನ್ನಡ"
|
||||
introFirefish: "ಸ್ವಾಗತ! Firefish ಓಪನ್ ಸೋರ್ಸ್ ಒಕ್ಕೂಟ ಮೈಕ್ರೋಬ್ಲಾಗಿಂಗ್ ಸೇವೆಯಾಗಿದೆ.\n ಏನಾಗುತ್ತಿದೆ ಎಂಬುದನ್ನು ಹಂಚಿಕೊಳ್ಳಲು ಅಥವಾ ನಿಮ್ಮ ಬಗ್ಗೆ ಎಲ್ಲರಿಗೂ ಹೇಳಲು \"ಟಿಪ್ಪಣಿ\"ಗಳನ್ನು ರಚಿಸಿ📡\n \"ಸ್ಪಂದನೆ\" ಕ್ರಿಯೆಯೊಂದಿಗೆ, ನೀವು ಎಲ್ಲರ ಟಿಪ್ಪಣಿಗಳಿಗೆ ತ್ವರಿತವಾಗಿ ಸ್ಪಂದನೆಗಳನ್ನು ಕೂಡ ಸೇರಿಸಬಹುದು.👍\n ಹೊಸ ಜಗತ್ತನ್ನು ಅನ್ವೇಷಿಸಿ🚀"
|
||||
monthAndDay: "{month}ನೇ ತಿಂಗಳ {day}ನೇ ದಿನ"
|
||||
search: "ಹುಡುಕು"
|
||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
username: "ಬಳಕೆಹೆಸರು"
|
||||
password: "ಗುಪ್ತಪದ"
|
||||
fetchingAsApObject: "ಒಕ್ಕೂಟದಿಂದ ಪಡೆಯಲಾಗುತ್ತಿದೆ"
|
||||
ok: "ಸರಿ"
|
||||
gotIt: "ಅರ್ಥವಾಯಿತು!"
|
||||
cancel: "ರದ್ದು"
|
||||
enterUsername: "ಬಳಕೆಹೆಸರನ್ನು ಭರ್ತಿ ಮಾಡಿ"
|
||||
renotedBy: "{user} ಪುನರಾವರ್ತಿಸಿದರು"
|
||||
noNotes: "ಟಿಪ್ಪಣಿಗಳಿಲ್ಲ"
|
||||
noNotifications: "ಅಧಿಸೂಚನೆಗಳಿಲ್ಲ"
|
||||
instance: "ನಿದರ್ಶನ"
|
||||
settings: "ಸಿದ್ಧತೆಗಳು"
|
||||
profile: "ಪ್ರೊಫೈಲು"
|
||||
timeline: "ಸಮಯಸಾಲು"
|
||||
noAccountDescription: "ಇವರು ಸ್ವಯಂ ಪರಿಚಯ ರಚಿಸಿಲ್ಲ"
|
||||
login: "ಪ್ರವೇಶ"
|
||||
loggingIn: "ಪ್ರವೇಶಿಸುತ್ತಾ..."
|
||||
logout: "ಆಚೆಗೆ"
|
||||
signup: "ನೋಂದಣಿ"
|
||||
uploading: "ಅಪ್ಲೋಡಾಗುತ್ತಿದೆ"
|
||||
save: "ಉಳಿಸಿ"
|
||||
users: "ಬಳಕೆದಾರ"
|
||||
addUser: "ಬಳಕೆದಾರರನ್ನು ಸೇರಿಸಿ"
|
||||
favorite: "ಮೆಚ್ಚಿನ"
|
||||
favorites: "ಮೆಚ್ಚಿನವುಗಳು"
|
||||
unfavorite: "ಮೆಚ್ಚುಗೆ ಅಳಿಸು"
|
||||
pin: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು"
|
||||
unpin: "ಪ್ರೊಫ಼ೈಲಿಂದ ಅಂಟುತೆಗೆ"
|
||||
copyContent: "ವಿಷಯವನ್ನು ನಕಲಿಸು"
|
||||
copyLink: "ಲಿಂಕನ್ನು ನಕಲಿಸು"
|
||||
delete: "ಅಳಿಸು"
|
||||
addToList: "ಪಟ್ಟಿಗೆ ಸೇರಿಸು"
|
||||
sendMessage: "ಸಂದೇಶ ಕಳುಹಿಸು"
|
||||
copyUsername: "ಬಳಕೆಹೆಸರು ನಕಲಿಸು"
|
||||
reply: "ಉತ್ತರಿಸು"
|
||||
loadMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||
showMore: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||
youGotNewFollower: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
receiveFollowRequest: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಬಂದಿದೆ"
|
||||
followRequestAccepted: "ಹಿಂಬಾಲನೆ ವಿನಂತಿ ಸ್ವೀಕರಿಸಲಾಯಿತು"
|
||||
mentions: "ಹೆಸರಿಸಿದ"
|
||||
directNotes: "ನೇರ ಟಿಪ್ಪಣಿಗಳು"
|
||||
importAndExport: "ಆಮದು/ರಫ್ತು"
|
||||
import: "ಆಮದು"
|
||||
export: "ರಫ್ತು"
|
||||
files: "ಕಡತಗಳು"
|
||||
download: "ಜಾಲದಿಂದಿಳಿಸು"
|
||||
driveFileDeleteConfirm: "\"{name}\" ಕಡತವನ್ನು ಅಳಿಸಲು ನೀವು ಬಯಸುವಿರಾ? ಈ ನೋಡಿರಿ ಲಗತ್ತಿಸಲಾದ ಟಿಪ್ಪಣಿ ಸಹ ಕಣ್ಮರೆಯಾಗುತ್ತದೆ."
|
||||
unfollowConfirm: "{name}ಅನ್ನು ಹಿಂಬಾಲಿಸದಿರುವುದೇ?"
|
||||
pinned: "ಪ್ರೊಫ಼ೈಲಿಗೆ ಅಂಟಿಸು"
|
||||
instances: "ನಿದರ್ಶನ"
|
||||
remove: "ಅಳಿಸು"
|
||||
smtpUser: "ಬಳಕೆಹೆಸರು"
|
||||
smtpPass: "ಗುಪ್ತಪದ"
|
||||
user: "ಬಳಕೆದಾರ"
|
||||
file: "ಕಡತಗಳು"
|
||||
_email:
|
||||
_follow:
|
||||
title: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
_mfm:
|
||||
search: "ಹುಡುಕು"
|
||||
_sfx:
|
||||
notification: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
_widgets:
|
||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
timeline: "ಸಮಯಸಾಲು"
|
||||
_cw:
|
||||
show: "ಇನ್ನಷ್ಟು ನೋಡು"
|
||||
_profile:
|
||||
username: "ಬಳಕೆಹೆಸರು"
|
||||
_notification:
|
||||
youWereFollowed: "ಹಿಂಬಾಲಿಸಿದರು"
|
||||
_actions:
|
||||
reply: "ಉತ್ತರಿಸು"
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: "ಅಧಿಸೂಚನೆಗಳು"
|
||||
tl: "ಸಮಯಸಾಲು"
|
||||
mentions: "ಹೆಸರಿಸಿದ"
|
2004
locales/ko-KR.yml
Normal file
2004
locales/ko-KR.yml
Normal file
File diff suppressed because it is too large
Load diff
709
locales/nl-NL.yml
Normal file
709
locales/nl-NL.yml
Normal file
|
@ -0,0 +1,709 @@
|
|||
_lang_: "Nederlands"
|
||||
headlineFirefish: "Een open source, gedecentraliseerd, social media platform dat voor
|
||||
altijd gratis is! 🚀"
|
||||
introFirefish: "Welkom! Firefish is een open source, gedecentraliseerde microblogdienst.\n
|
||||
Maak \"notities\" om je gedachten te delen met iedereen om je heen. 📡\nMet \"reacties\"\
|
||||
\ kun je ook snel je mening geven over berichten van anderen. 👍\nLaten we een nieuwe
|
||||
wereld verkennen! 🚀"
|
||||
monthAndDay: "{day} {month}"
|
||||
search: "Zoeken"
|
||||
notifications: "Meldingen"
|
||||
username: "Gebruikersnaam"
|
||||
password: "Wachtwoord"
|
||||
forgotPassword: "Wachtwoord vergeten"
|
||||
fetchingAsApObject: "Ophalen vanuit de Fediverse"
|
||||
ok: "Ok"
|
||||
gotIt: "Begrepen!"
|
||||
cancel: "Annuleren"
|
||||
enterUsername: "Voer een gebruikersnaam in"
|
||||
renotedBy: "Hergedeeld door {user}"
|
||||
noNotes: "Geen notities"
|
||||
noNotifications: "Geen meldingen"
|
||||
instance: "Server"
|
||||
settings: "Instellingen"
|
||||
basicSettings: "Basisinstellingen"
|
||||
otherSettings: "Overige instellingen"
|
||||
openInWindow: "In een venster openen"
|
||||
profile: "Profiel"
|
||||
timeline: "Tijdlijn"
|
||||
noAccountDescription: "Deze gebruiker heeft nog geen bio geschreven"
|
||||
login: "Inloggen"
|
||||
loggingIn: "Aan het inloggen"
|
||||
logout: "Afmelden"
|
||||
signup: "Registreren"
|
||||
uploading: "Bezig met uploaden"
|
||||
save: "Opslaan"
|
||||
users: "Gebruikers"
|
||||
addUser: "Toevoegen gebruiker"
|
||||
favorite: "Favorieten"
|
||||
favorites: "Favorieten"
|
||||
unfavorite: "Verwijderen uit favorieten"
|
||||
favorited: "Toegevoegd aan favorieten."
|
||||
alreadyFavorited: "Al toegevoegd aan favorieten"
|
||||
cantFavorite: "Kon niet toevoegen aan favorieten."
|
||||
pin: "Vastmaken aan profielpagina"
|
||||
unpin: "Losmaken van profielpagina"
|
||||
copyContent: "Kopiëren inhoud"
|
||||
copyLink: "Kopiëren link"
|
||||
delete: "Verwijderen"
|
||||
deleteAndEdit: "Verwijderen en bewerken"
|
||||
deleteAndEditConfirm: "Weet je zeker dat je deze post wilt verwijderen en dan bewerken?
|
||||
Je verliest alle reacties, boosts en antwoorden erop."
|
||||
addToList: "Aan lijst toevoegen"
|
||||
sendMessage: "Verstuur bericht"
|
||||
copyUsername: "Gebruikersnaam kopiëren"
|
||||
searchUser: "Zoek een gebruiker"
|
||||
reply: "Antwoord"
|
||||
loadMore: "Laad meer"
|
||||
showMore: "Toon meer"
|
||||
youGotNewFollower: "volgt jou"
|
||||
receiveFollowRequest: "Volgverzoek ontvangen"
|
||||
followRequestAccepted: "Volgverzoek geaccepteerd"
|
||||
mention: "Vermelding"
|
||||
mentions: "Vermeldingen"
|
||||
directNotes: "Directe notities"
|
||||
importAndExport: "Import / export"
|
||||
import: "Import"
|
||||
export: "Export"
|
||||
files: "Bestanden"
|
||||
download: "Downloaden"
|
||||
driveFileDeleteConfirm: "Weet je zeker dat je het bestand \"{name}\" wilt verwijderen?
|
||||
Posts met dit bestand als bijlage worden ook verwijderd."
|
||||
unfollowConfirm: "Weet je zeker dat je {name} wilt ontvolgen?"
|
||||
exportRequested: "Je hebt een export aangevraagd. Dit kan een tijdje duren. Het wordt
|
||||
toegevoegd aan je Drive zodra het is voltooid."
|
||||
importRequested: "Je hebt een import aangevraagd. Dit kan even duren."
|
||||
lists: "Lijsten"
|
||||
noLists: "Je hebt geen lijsten"
|
||||
note: "Notitie"
|
||||
notes: "Notities"
|
||||
following: "Volgend"
|
||||
followers: "Volgers"
|
||||
followsYou: "Volgt jou"
|
||||
createList: "Creëer lijst"
|
||||
manageLists: "Lijsten beheren"
|
||||
error: "Fout"
|
||||
somethingHappened: "Er is iets misgegaan."
|
||||
retry: "Probeer opnieuw"
|
||||
pageLoadError: "Pagina laden mislukt"
|
||||
pageLoadErrorDescription: "Dit wordt normaal gesproken veroorzaakt door netwerkfouten
|
||||
of door de cache van de browser. Probeer de cache te wissen en probeer het na een
|
||||
tijdje wachten opnieuw."
|
||||
serverIsDead: "De server reageert niet. Wacht even en probeer het opnieuw."
|
||||
youShouldUpgradeClient: "Werk je client bij om deze pagina te zien."
|
||||
enterListName: "Voer de naam van de lijst in"
|
||||
privacy: "Privacy"
|
||||
makeFollowManuallyApprove: "Volgverzoeken vergen een goedkeuring"
|
||||
defaultNoteVisibility: "Standaard zichtbaarheid"
|
||||
follow: "Volgen"
|
||||
followRequest: "Verzoek om te mogen volgen"
|
||||
followRequests: "Volgverzoeken"
|
||||
unfollow: "Ontvolgen"
|
||||
followRequestPending: "Wachten op goedkeuring volgverzoek"
|
||||
enterEmoji: "Voer een emoji in"
|
||||
renote: "Boost"
|
||||
unrenote: "Boost intrekken"
|
||||
renoted: "Boosted."
|
||||
cantRenote: "Dit bericht kan niet worden geboost."
|
||||
cantReRenote: "Een boost kan niet worden geboost."
|
||||
quote: "Quote"
|
||||
pinnedNote: "Vastgemaakte post"
|
||||
pinned: "Vastmaken aan profielpagina"
|
||||
you: "Jij"
|
||||
clickToShow: "Klik om te bekijken"
|
||||
sensitive: "NSFW"
|
||||
add: "Toevoegen"
|
||||
reaction: "Reacties"
|
||||
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen,
|
||||
Druk op \"+\" om toe te voegen"
|
||||
rememberNoteVisibility: "Onthoud post zichtbaarheidsinstellingen"
|
||||
attachCancel: "Verwijder bijlage"
|
||||
markAsSensitive: "Markeren als NSFW"
|
||||
unmarkAsSensitive: "Geen NSFW"
|
||||
enterFileName: "Bestandsnaam invoeren"
|
||||
mute: "Dempen"
|
||||
unmute: "Stop dempen"
|
||||
block: "Blokkeren"
|
||||
unblock: "Deblokkeren"
|
||||
suspend: "Opschorten"
|
||||
unsuspend: "Heractiveren"
|
||||
blockConfirm: "Weet je zeker dat je dit account wil blokkeren?"
|
||||
unblockConfirm: "Ben je zeker dat je deze account wil blokkeren?"
|
||||
suspendConfirm: "Ben je zeker dat je deze account wil suspenderen?"
|
||||
unsuspendConfirm: "Ben je zeker dat je deze account wil opnieuw aanstellen?"
|
||||
flagAsBot: "Markeer dit account als een robot"
|
||||
flagAsBotDescription: "Als dit account van een programma wordt beheerd, zet deze vlag
|
||||
aan. Het aanzetten helpt andere ontwikkelaars om bijvoorbeeld onbedoelde feedback
|
||||
loops te doorbreken of om Firefish meer geschikt te maken."
|
||||
flagAsCat: "Markeer dit account als een kat."
|
||||
flagAsCatDescription: "Zet deze vlag aan als je wilt aangeven dat dit account een
|
||||
kat is."
|
||||
flagShowTimelineReplies: "Toon antwoorden op de tijdlijn"
|
||||
flagShowTimelineRepliesDescription: "Als je deze vlag aanzet, toont de tijdlijn ook
|
||||
antwoorden op andere en niet alleen jouw eigen post."
|
||||
autoAcceptFollowed: "Accepteer verzoeken om jezelf te volgen vanzelf als je de verzoeker
|
||||
al volgt"
|
||||
addAccount: "Account toevoegen"
|
||||
loginFailed: "Aanmelding mislukt."
|
||||
showOnRemote: "Bekijk op de externe server"
|
||||
general: "Algemeen"
|
||||
wallpaper: "Achtergrond"
|
||||
setWallpaper: "Achtergrond instellen"
|
||||
removeWallpaper: "Achtergrond verwijderen"
|
||||
searchWith: "Zoeken: {q}"
|
||||
youHaveNoLists: "Je hebt geen lijsten"
|
||||
followConfirm: "Weet je zeker dat je {name} wilt volgen?"
|
||||
proxyAccount: "Proxy account"
|
||||
proxyAccountDescription: "Een proxy-account is een account dat onder bepaalde voorwaarden
|
||||
fungeert als externe volger voor gebruikers. Als een gebruiker bijvoorbeeld een
|
||||
externe gebruiker aan de lijst toevoegt, wordt de activiteit van de externe gebruiker
|
||||
niet aan de server geleverd als geen lokale gebruiker die gebruiker volgt, dus het
|
||||
proxy-account volgt in plaats daarvan."
|
||||
host: "Server"
|
||||
selectUser: "Kies een gebruiker"
|
||||
recipient: "Ontvanger(s)"
|
||||
annotation: "Reacties"
|
||||
federation: "Federatie"
|
||||
instances: "Servers"
|
||||
registeredAt: "Geregistreerd op"
|
||||
latestRequestSentAt: "Laatste aanvraag verstuurd"
|
||||
latestRequestReceivedAt: "Laatste aanvraag ontvangen"
|
||||
latestStatus: "Laatste status"
|
||||
storageUsage: "Gebruikte opslagruimte"
|
||||
charts: "Grafieken"
|
||||
perHour: "Per uur"
|
||||
perDay: "Per dag"
|
||||
stopActivityDelivery: "Stop met versturen activiteiten"
|
||||
blockThisInstance: "Blokkeer deze server"
|
||||
operations: "Verwerkingen"
|
||||
software: "Software"
|
||||
version: "Versie"
|
||||
metadata: "Metadata"
|
||||
monitor: "Monitor"
|
||||
jobQueue: "Job Queue"
|
||||
cpuAndMemory: "CPU en geheugen"
|
||||
network: "Netwerk"
|
||||
disk: "Schijfruimte"
|
||||
instanceInfo: "Serverinformatie"
|
||||
statistics: "Statistieken"
|
||||
clearQueue: "Wachtrij wissen"
|
||||
clearQueueConfirmTitle: "Weet je zeker dat je de wachtrji leeg wil maken?"
|
||||
clearQueueConfirmText: "Niet-bezorgde posts die nog in de wachtrij staan, worden niet
|
||||
gefedereerd. Meestal is deze operatie niet nodig."
|
||||
clearCachedFiles: "Cache opschonen"
|
||||
clearCachedFilesConfirm: "Weet je zeker dat je alle externe bestanden in de cache
|
||||
wilt verwijderen?"
|
||||
blockedInstances: "Geblokkeerde servers"
|
||||
blockedInstancesDescription: "Maak een lijst van de servers die moeten worden geblokkeerd,
|
||||
gescheiden door regeleinden. Geblokkeerde servers kunnen niet meer communiceren
|
||||
met deze server."
|
||||
muteAndBlock: "Gedempt en geblokkeerd"
|
||||
mutedUsers: "Gedempte gebruikers"
|
||||
blockedUsers: "Geblokkeerde gebruikers"
|
||||
noUsers: "Er zijn geen gebruikers."
|
||||
editProfile: "Bewerk Profiel"
|
||||
noteDeleteConfirm: "Ben je zeker dat je deze post wil verwijderen?"
|
||||
pinLimitExceeded: "Je kunt geen posts meer vastprikken"
|
||||
intro: "Installatie van Firefish geëindigd! Maak nu een beheerder aan."
|
||||
done: "Klaar"
|
||||
processing: "Bezig met verwerken"
|
||||
preview: "Voorbeeld"
|
||||
default: "Standaard"
|
||||
noCustomEmojis: "Er zijn geen emojis"
|
||||
noJobs: "Er zijn geen taken"
|
||||
federating: "Federeren"
|
||||
blocked: "Geblokkeerd"
|
||||
suspended: "Opgeschort"
|
||||
all: "Alle"
|
||||
subscribing: "Abonneren"
|
||||
publishing: "Publiceren"
|
||||
notResponding: "Reageert niet"
|
||||
instanceFollowing: "Volgend op server"
|
||||
instanceFollowers: "Volgers op server"
|
||||
instanceUsers: "Gebruikers van deze server"
|
||||
changePassword: "Wachtwoord wijzigen"
|
||||
security: "Beveiliging"
|
||||
retypedNotMatch: "Invoer komt niet overeen"
|
||||
currentPassword: "Huidig wachtwoord"
|
||||
newPassword: "Nieuwe wachtwoord"
|
||||
newPasswordRetype: "Nieuw wachtwoord (herhalen)"
|
||||
attachFile: "Bestanden toevoegen"
|
||||
more: "Meer!"
|
||||
featured: "Uitgelicht"
|
||||
usernameOrUserId: "Gebruikersnaam of id"
|
||||
noSuchUser: "Gebruiker niet gevonden"
|
||||
lookup: "Opzoeken"
|
||||
announcements: "Aankondigingen"
|
||||
imageUrl: "AfbeeldingsURL"
|
||||
remove: "Verwijderen"
|
||||
removed: "Succesvol verwijderd"
|
||||
removeAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?"
|
||||
deleteAreYouSure: "Weet je zeker dat je \"{x}\" wil verwijderen?"
|
||||
resetAreYouSure: "Resetten?"
|
||||
saved: "Opgeslagen"
|
||||
messaging: "Chat"
|
||||
upload: "Uploaden"
|
||||
keepOriginalUploading: "Origineel beeld behouden."
|
||||
keepOriginalUploadingDescription: "Bewaar de originele versie bij het uploaden van
|
||||
afbeeldingen. Indien uitgeschakeld, wordt bij het uploaden een alternatieve versie
|
||||
voor webpublicatie genereert."
|
||||
fromDrive: "Van schijf"
|
||||
fromUrl: "Van URL"
|
||||
uploadFromUrl: "Uploaden vanaf een URL"
|
||||
uploadFromUrlDescription: "URL van het bestand dat je wil uploaden"
|
||||
uploadFromUrlRequested: "Uploadverzoek"
|
||||
uploadFromUrlMayTakeTime: "Het kan even duren voordat het uploaden voltooid is."
|
||||
explore: "Verkennen"
|
||||
messageRead: "Lezen"
|
||||
noMoreHistory: "Er is geen verdere geschiedenis"
|
||||
startMessaging: "Start een gesprek"
|
||||
nUsersRead: "gelezen door {n}"
|
||||
agreeTo: "Ik stem in met {0}"
|
||||
tos: "Gebruiksvoorwaarden"
|
||||
start: "Aan de slag"
|
||||
home: "Startpagina"
|
||||
remoteUserCaution: "Aangezien deze gebruiker van een externe server afkomstig is,
|
||||
kan de weergegeven informatie onvolledig zijn."
|
||||
activity: "Activiteit"
|
||||
images: "Afbeeldingen"
|
||||
birthday: "Geboortedatum"
|
||||
yearsOld: "{age} jaar"
|
||||
registeredDate: "Inschrijvingsdatum"
|
||||
location: "Locatie"
|
||||
theme: "Thema's"
|
||||
themeForLightMode: "Thema voor gebruik in de lichte modus"
|
||||
themeForDarkMode: "Thema voor gebruik in de donkere modus"
|
||||
light: "Licht"
|
||||
dark: "Donker"
|
||||
lightThemes: "Licht thema's"
|
||||
darkThemes: "Donkere thema's"
|
||||
syncDeviceDarkMode: "Synchroniseer donkere modus met je apparaatinstellingen"
|
||||
drive: "Schijf"
|
||||
fileName: "Bestandsnaam"
|
||||
selectFile: "Kies een bestand"
|
||||
selectFiles: "Selecteer bestanden"
|
||||
selectFolder: "Kies een map"
|
||||
selectFolders: "Kies mappen"
|
||||
renameFile: "Wijzig bestandsnaam"
|
||||
folderName: "Mapnaam"
|
||||
createFolder: "Map aanmaken"
|
||||
renameFolder: "Map hernoemen"
|
||||
deleteFolder: "Map verwijderen"
|
||||
addFile: "Bestand toevoegen"
|
||||
emptyDrive: "Jouw Drive is leeg."
|
||||
emptyFolder: "Deze map is leeg"
|
||||
unableToDelete: "Kan niet worden verwijderd"
|
||||
inputNewFileName: "Voer een nieuwe naam in"
|
||||
copyUrl: "URL kopiëren"
|
||||
rename: "Hernoemen"
|
||||
avatar: "Avatar"
|
||||
banner: "Banner"
|
||||
nsfw: "NSFW"
|
||||
whenServerDisconnected: "Wanneer de verbinding met de server wordt onderbroken"
|
||||
disconnectedFromServer: "Verbinding met de server onderbroken."
|
||||
inMb: "in megabytes"
|
||||
pinnedNotes: "Vastgemaakte posts"
|
||||
userList: "Lijsten"
|
||||
aboutFirefish: "Over Firefish"
|
||||
administrator: "Beheerder"
|
||||
token: "Token"
|
||||
securityKeyName: "Sleutelnaam"
|
||||
registerSecurityKey: "Zekerheids-Sleutel registreren"
|
||||
lastUsed: "Laatst gebruikt"
|
||||
unregister: "Uitschrijven"
|
||||
passwordLessLogin: "Inloggen zonder wachtwoord"
|
||||
resetPassword: "Wachtwoord terugzetten"
|
||||
newPasswordIs: "Het nieuwe wachtwoord is „{password}”."
|
||||
reduceUiAnimation: "Verminder beweging in de UI"
|
||||
share: "Delen"
|
||||
notFound: "Niet gevonden"
|
||||
cacheClear: "Cache verwijderen"
|
||||
smtpHost: "Server"
|
||||
smtpUser: "Gebruikersnaam"
|
||||
smtpPass: "Wachtwoord"
|
||||
clearCache: "Cache opschonen"
|
||||
user: "Gebruikers"
|
||||
muteThread: "Discussies dempen "
|
||||
unmuteThread: "Dempen van discussie ongedaan maken"
|
||||
hide: "Verbergen"
|
||||
cropImage: "Afbeelding bijsnijden"
|
||||
cropImageAsk: "Bijsnijdengevraagd"
|
||||
file: "Bestanden"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Je hebt een nieuwe volger"
|
||||
_mfm:
|
||||
mention: "Vermelding"
|
||||
quote: "Quote"
|
||||
search: "Zoeken"
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Vermelding"
|
||||
renote: "Herdelen"
|
||||
_sfx:
|
||||
note: "Notities"
|
||||
notification: "Meldingen"
|
||||
chat: "Chat"
|
||||
_widgets:
|
||||
notifications: "Meldingen"
|
||||
timeline: "Tijdlijn"
|
||||
activity: "Activiteit"
|
||||
federation: "Federatie"
|
||||
jobQueue: "Job Queue"
|
||||
_cw:
|
||||
show: "Laad meer"
|
||||
_visibility:
|
||||
home: "Startpagina"
|
||||
followers: "Volgers"
|
||||
_profile:
|
||||
username: "Gebruikersnaam"
|
||||
_exportOrImport:
|
||||
followingList: "Volgend"
|
||||
muteList: "Dempen"
|
||||
blockingList: "Blokkeren"
|
||||
userLists: "Lijsten"
|
||||
excludeMutingUsers: "Negeer gedempte gebruikers"
|
||||
excludeInactiveUsers: "Negeer inactieve gebruikers"
|
||||
_charts:
|
||||
federation: "Federatie"
|
||||
_timelines:
|
||||
home: "Startpagina"
|
||||
_pages:
|
||||
blocks:
|
||||
image: "Afbeeldingen"
|
||||
script:
|
||||
categories:
|
||||
list: "Lijsten"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Lijsten"
|
||||
_randomPick:
|
||||
arg1: "Lijsten"
|
||||
_dailyRandomPick:
|
||||
arg1: "Lijsten"
|
||||
_seedRandomPick:
|
||||
arg2: "Lijsten"
|
||||
_pick:
|
||||
arg1: "Lijsten"
|
||||
_listLen:
|
||||
arg1: "Lijsten"
|
||||
types:
|
||||
array: "Lijsten"
|
||||
_notification:
|
||||
youWereFollowed: "volgt jou"
|
||||
_types:
|
||||
follow: "Volgend"
|
||||
mention: "Vermelding"
|
||||
renote: "Herdelen"
|
||||
quote: "Quote"
|
||||
reaction: "Reacties"
|
||||
_actions:
|
||||
reply: "Antwoord"
|
||||
renote: "Herdelen"
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: "Meldingen"
|
||||
tl: "Tijdlijn"
|
||||
list: "Lijsten"
|
||||
mentions: "Vermeldingen"
|
||||
showLess: Sluiten
|
||||
emoji: Emoji
|
||||
selectList: Selecteer een lijst
|
||||
selectAntenna: Selecteer een antenne
|
||||
deleted: Verwijderd
|
||||
editNote: Bewerk post
|
||||
edited: 'Bewerkt om {date} {time}'
|
||||
emojis: Emojis
|
||||
emojiName: Emoji naam
|
||||
emojiUrl: Emoji URL
|
||||
addEmoji: Voeg toe
|
||||
settingGuide: Aanbevolen instellingen
|
||||
flagSpeakAsCat: Praat als een kat
|
||||
accountMoved: 'Gebruiker is naar een nieuw account verhuisd:'
|
||||
showEmojisInReactionNotifications: Toon emojis in reactie notificaties
|
||||
selectWidget: Selecteer een widget
|
||||
editWidgetsExit: Klaar
|
||||
noThankYou: Nee bedankt
|
||||
addInstance: Voeg een server toe
|
||||
enableEmojiReactions: Schakel emoji reacties in
|
||||
editWidgets: Bewerk widgets
|
||||
thisYear: Jaar
|
||||
thisMonth: Maand
|
||||
registration: Registreren
|
||||
_ffVisibility:
|
||||
public: Openbaar
|
||||
private: Privé
|
||||
followers: Alleen zichtbaar voor volgers
|
||||
noInstances: Er zijn geen servers
|
||||
_signup:
|
||||
almostThere: Bijna klaar
|
||||
emailAddressInfo: Voer je emailadres in. Deze zal niet openbaar gemaakt worden.
|
||||
_ad:
|
||||
back: Terug
|
||||
reduceFrequencyOfThisAd: Toon deze advertentie minder
|
||||
pushNotificationNotSupported: Je browser of server ondersteunt geen pushmeldingen
|
||||
sendPushNotificationReadMessage: Verwijder pushmeldingen wanneer de relevante meldingen
|
||||
of berichten zijn gelezen
|
||||
customEmojis: Custom emoji
|
||||
cacheRemoteFiles: Cache externe bestanden
|
||||
hiddenTags: Verborgen hashtags
|
||||
enableRecommendedTimeline: Schakel aanbevolen tijdlijn in
|
||||
_forgotPassword:
|
||||
enterEmail: Voer het emailadres in dat je gebruikte om te registreren. Een link
|
||||
waarmee je je wachtwoord opnieuw kunt instellen zal daar naartoe gestuurd worden.
|
||||
jumpToReply: Spring naar Antwoord
|
||||
newer: nieuwer
|
||||
older: ouder
|
||||
selectInstance: Kies een server
|
||||
defaultValueIs: 'Standaard: {value}'
|
||||
reload: Hernieuwen
|
||||
doNothing: Negeren
|
||||
today: Vandaag
|
||||
inputNewDescription: Voer een nieuw onderschrift in
|
||||
inputNewFolderName: Voer een nieuwe mapnaam in
|
||||
circularReferenceFolder: De bestemmingsmap is een submap van de map die je wil verplaatsen.
|
||||
hasChildFilesOrFolders: Omdat deze map niet leeg is, kan deze niet verwijderd worden.
|
||||
enableLocalTimeline: Schakel lokale tijdlijn in
|
||||
enableGlobalTimeline: Schakel globale tijdlijn in
|
||||
enableRegistration: Nieuwe gebruikersregistratie inschakelen
|
||||
invite: Uitnodigen
|
||||
move: Verplaatsen
|
||||
showAds: Toon advertenties
|
||||
pushNotification: Pushmeldingen
|
||||
_gallery:
|
||||
my: Mijn Gallerij
|
||||
reactionSetting: Reacties om te tonen in het reactie selectie menu
|
||||
dayX: '{day}'
|
||||
renoteMute: Demp boosts
|
||||
reloadConfirm: Wil je de tijdlijn hernieuwen?
|
||||
watch: Volgen
|
||||
unwatch: Ontvolgen
|
||||
accept: Accepteren
|
||||
reject: Afwijzen
|
||||
normal: Normaal
|
||||
pages: Pagina's
|
||||
monthX: '{month}'
|
||||
yearX: '{year}'
|
||||
instanceName: Servernaam
|
||||
instanceDescription: Server omschrijving
|
||||
maintainerName: Onderhouder
|
||||
maintainerEmail: Onderhouder email
|
||||
tosUrl: Algemene Voorwaarden URL
|
||||
unread: Ongelezen
|
||||
manageGroups: Beheer groepen
|
||||
subscribePushNotification: Pushmeldingen inschakelen
|
||||
unsubscribePushNotification: Pushmeldingen uitschakelen
|
||||
pushNotificationAlreadySubscribed: Pushmeldingen zijn al ingeschakeld
|
||||
antennaSource: Antenne bron
|
||||
antennaKeywords: Trefwoorden om naar te luisteren
|
||||
antennaExcludeKeywords: Trefwoorden om te negeren
|
||||
driveCapacityPerRemoteAccount: Schijfruimte per externe gebruiker
|
||||
backgroundImageUrl: Achtergrondafbeelding URL
|
||||
basicInfo: Basis informatie
|
||||
pinnedUsers: Vastgezette gebruikers
|
||||
pinnedPages: Vastgezette Pagina's
|
||||
driveCapacityPerLocalAccount: Schijfruimte per lokale gebruiker
|
||||
iconUrl: Icoon URL
|
||||
bannerUrl: Banner afbeelding URL
|
||||
manageAntennas: Beheer Antennes
|
||||
name: Naam
|
||||
notifyAntenna: Meld nieuwe posts
|
||||
withFileAntenna: Alleen posts met bestanden
|
||||
enableServiceworker: Schakel pushmeldingen voor je browser in
|
||||
renoteUnmute: Ontdemp boosts
|
||||
jumpToPrevious: Spring naar vorige
|
||||
caseSensitive: Hoofdlettergevoelig
|
||||
cw: Inhoudswaarschuwing
|
||||
recaptcha: reCAPTCHA
|
||||
enableRecaptcha: reCAPTCHA inschakelen
|
||||
recaptchaSiteKey: Site sleutel
|
||||
notFoundDescription: Een pagina met deze URL kon niet worden gevonden.
|
||||
uploadFolder: Standaard map voor uploads
|
||||
markAsReadAllNotifications: Markeer alle notificaties als gelezen
|
||||
text: Tekst
|
||||
enable: Inschakelen
|
||||
or: Of
|
||||
language: Taal
|
||||
securityKey: Veiligheidssleutel
|
||||
groupInvited: Je bent voor een groep uitgenodigd
|
||||
docSource: Bron van dit document
|
||||
createAccount: Maak account aan
|
||||
groupName: Groepsnaam
|
||||
members: Leden
|
||||
messagingWithUser: Privé chat
|
||||
messagingWithGroup: Groepschat
|
||||
title: Titel
|
||||
createGroup: Maak een groep
|
||||
ownedGroups: Beheerde groepen
|
||||
invites: Uitnodigingen
|
||||
useOsNativeEmojis: Gebruik je standaard besturingssysteem Emojis
|
||||
disableDrawer: Gebruik niet de lade-stijl menus
|
||||
joinOrCreateGroup: Krijg een uitnodiging voor een groep of maak er zelf eentje aan.
|
||||
noHistory: Geen geschiedenis beschikbaar
|
||||
signinHistory: Inloggeschiedenis
|
||||
available: Beschikbaar
|
||||
unavailable: Niet beschikbaar
|
||||
tooShort: Te kort
|
||||
signinFailed: Niet gelukt om in te loggen. Gebruikersnaam of wachtwoord is incorrect.
|
||||
tapSecurityKey: Tik je veiligheidssleutel aan
|
||||
recaptchaSecretKey: Geheime sleutel
|
||||
antennas: Antennes
|
||||
antennaUsersDescription: Zet één gebruikersnaam per regel neer
|
||||
notesAndReplies: Posts en antwoorden
|
||||
withFiles: Met bestanden
|
||||
popularUsers: Populaire gebruikers
|
||||
recentlyUpdatedUsers: Recente actieve gebruikers
|
||||
recentlyRegisteredUsers: Nieuwe gebruikers
|
||||
recentlyDiscoveredUsers: Nieuwe ontdekte gebruikers
|
||||
exploreUsersCount: Er zijn {count} gebruikers
|
||||
about: Over
|
||||
exploreFediverse: Ontdek de Fediverse
|
||||
popularTags: Populaire labels
|
||||
moderation: Moderatie
|
||||
nUsersMentioned: Genoemd door {n} gebruikers
|
||||
markAsReadAllUnreadNotes: Markeer alle posts als gelezen
|
||||
markAsReadAllTalkMessages: Markeer alle berichten als gelezen
|
||||
help: Help
|
||||
inputMessageHere: Schrijf hier je bericht
|
||||
close: Sluiten
|
||||
group: Groep
|
||||
groups: Groepen
|
||||
newMessageExists: Er zijn nieuwe berichten
|
||||
next: Volgende
|
||||
noteOf: Post door {user}
|
||||
inviteToGroup: Nodig uit voor de groep
|
||||
quoteAttached: Quote
|
||||
noMessagesYet: Nog geen berichten
|
||||
weakPassword: Zwak wachtwoord
|
||||
normalPassword: Middelmatig wachtwoord
|
||||
veryStrongPassword: Sterk wachtwoord
|
||||
onlyOneFileCanBeAttached: Je kan maar één bestand toevoegen aan je bericht
|
||||
invitationCode: Uitnodigingscode
|
||||
checking: Controleren...
|
||||
uiLanguage: Gebruikersinterface taal
|
||||
aboutX: Over {x}
|
||||
youHaveNoGroups: Je hebt geen groepen
|
||||
disableAnimatedMfm: Schakel MFM met animaties uit
|
||||
passwordMatched: Komt overeen
|
||||
passwordNotMatched: Komt niet overeen
|
||||
signinWith: Log in met {x}
|
||||
fontSize: Tekstgrootte
|
||||
openImageInNewTab: Open afbeeldingen in een nieuwe tab
|
||||
category: Categorie
|
||||
tags: Labels
|
||||
existingAccount: Bestaand account
|
||||
regenerate: Hernieuwen
|
||||
dayOverDayChanges: Verschillen met gisteren
|
||||
appearance: Uiterlijk
|
||||
local: Lokaal
|
||||
remote: Extern
|
||||
total: Totaal
|
||||
weekOverWeekChanges: Verschillen met vorige week
|
||||
hcaptcha: hCaptcha
|
||||
enableHcaptcha: hCaptcha inschakelen
|
||||
hcaptchaSiteKey: Site sleutel
|
||||
hcaptchaSecretKey: Geheime sleutel
|
||||
withReplies: Met antwoorden
|
||||
twoStepAuthentication: Tweefactorauthenticatie
|
||||
moderator: Moderator
|
||||
invitations: Uitnodigingen
|
||||
tooLong: Te lang
|
||||
doing: Verwerken...
|
||||
silencedInstances: Gedempte Servers
|
||||
cacheRemoteFilesDescription: Als deze instelling is uitgeschakeld, worden externe
|
||||
bestanden direct van de externe server geladen. Het uitschakelen zal opslagruimte
|
||||
verminderen, maar verkeer zal toenemen, omdat er geen thumbnails gemaakt zullen
|
||||
worden.
|
||||
flagSpeakAsCatDescription: Je posts zullen worden ge-'nyanified' als je in kat-modus
|
||||
zit
|
||||
avoidMultiCaptchaConfirm: Het gebruik van meerdere Captcha systemen kan voor storing
|
||||
zorgen tussen ze. Wil je de andere actieve Captcha systemen uitschakelen? Als je
|
||||
ze ingeschakeld wilt houden, klik op annuleren.
|
||||
silence: Dempen
|
||||
silenceConfirm: Weet je zeker dat je deze gebruiker wilt dempen?
|
||||
unsilence: Ontdempen
|
||||
unsilenceConfirm: Weet je zeker dat je het dempen van deze gebruiker ongedaan wilt
|
||||
maken?
|
||||
silenceThisInstance: Demp deze server
|
||||
silenced: Gedempt
|
||||
disablingTimelinesInfo: Beheerders en moderators zullen altijd toegang hebben tot
|
||||
alle tijdlijnen, zelfs als deze uitgeschakeld zijn.
|
||||
accountSettings: Account Instellingen
|
||||
numberOfDays: Aantal dagen
|
||||
hideThisNote: Verberg deze post
|
||||
dashboard: Dashboard
|
||||
accessibility: Toegankelijkheid
|
||||
promotion: Gepromoot
|
||||
promote: Promoten
|
||||
objectStorage: Objectopslag
|
||||
useObjectStorage: Gebruik objectopslag
|
||||
objectStorageBaseUrl: Basis -URL
|
||||
objectStorageUseSSLDesc: Schakel dit uit als je geen HTTPS voor je API connecties
|
||||
gebruikt
|
||||
objectStorageUseProxy: Verbind over Proxy
|
||||
objectStorageUseProxyDesc: Schakel dit uit als je geen Proxy voor je API connecties
|
||||
gebruikt
|
||||
sounds: Geluiden
|
||||
lastUsedDate: Laatst gebruikt op
|
||||
installedDate: Geautoriseerd op
|
||||
sort: Sorteren
|
||||
output: Uitvoer
|
||||
script: Script
|
||||
popout: Pop-out
|
||||
descendingOrder: Aflopend
|
||||
showInPage: Toon in de pagina
|
||||
chooseEmoji: Kies een emoji
|
||||
ascendingOrder: Oplopend
|
||||
volume: Volume
|
||||
masterVolume: Master volume
|
||||
details: Details
|
||||
unableToProcess: Deze operatie kon niet worden voltooid
|
||||
nothing: Niks te zien hier
|
||||
scratchpad: Kladblok
|
||||
recentUsed: Recentelijk gebruikt
|
||||
install: Installeer
|
||||
uninstall: Verwijderen
|
||||
installedApps: Geautoriseerde Applicaties
|
||||
state: Status
|
||||
updateRemoteUser: Update externe gebruikersinformatie
|
||||
listen: Luister
|
||||
none: Geen
|
||||
scratchpadDescription: Het kladblok is een omgeving voor AiScript experimenten. Je
|
||||
kan hier schrijven, uitvoeren, en de resultaten bekijken van de interactie met Firefish.
|
||||
disablePagesScript: Zet AiScript op Pages uit
|
||||
deleteAllFiles: Verwijder alle bestanden
|
||||
deleteAllFilesConfirm: Weet je zeker dat je alle bestanden wil verwijderen?
|
||||
removeAllFollowing: Ontvolg alle gevolgde gebruikers
|
||||
serverLogs: Server logboek
|
||||
deleteAll: Verwijder alles
|
||||
showFixedPostForm: Toon het post formulier bovenaan de tijdlijn
|
||||
newNoteRecived: Er zijn nieuwe posts
|
||||
pinnedUsersDescription: Lijst gebruikersnamen gescheiden door regeleinden om vast
|
||||
te pinnen in het tabblad "Verkennen".
|
||||
silencedInstancesDescription: Geef de hostnames op van de servers die je het zwijgen
|
||||
wilt opleggen. Accounts op de vermelde servers worden als "Stil" behandeld, kunnen
|
||||
alleen volgverzoeken doen en kunnen geen lokale accounts vermelden als ze niet worden
|
||||
gevolgd. Dit heeft geen invloed op de geblokkeerde servers.
|
||||
searchPlaceholder: Doorzoek Firefish
|
||||
pinnedPagesDescription: Voer de paden in van de pagina's die je aan de bovenste pagina
|
||||
van deze server wilt vastmaken, gescheiden door regeleinden.
|
||||
_permissions:
|
||||
"read:favorites": Lijst van uw favorieten
|
||||
"write:favorites": Beheer uw favorieten
|
||||
clipsDesc: Paperclips zijn deelbare gebundelde favorieten. Je kunt paperclips maken
|
||||
vanuit het menu van individuele posts.
|
||||
selectChannel: Selecteer een kanaal
|
||||
removeReaction: Uw reactie verwijderen
|
||||
antennasDesc: "Antennes geven nieuwe berichten weer die voldoen aan de criteria die
|
||||
je hebt ingesteld!\nZe zijn toegankelijk via de pagina Tijdlijnen."
|
||||
pinnedClipId: ID van de paperclip om vast te pinnen
|
||||
hiddenTagsDescription: 'Vermeld de hashtags (zonder #) van de hashtags die je wilt
|
||||
verbergen voor trending en verkennen. Verborgen hashtags zijn nog steeds op andere
|
||||
manieren te ontdekken.'
|
||||
listsDesc: Met lijsten kun je tijdlijnen aanmaken met gespecificeerde gebruikers.
|
||||
Ze zijn toegankelijk via de pagina Tijdlijnen.
|
||||
markLocalFilesNsfwByDefault: Alle nieuwe lokale bestanden als NSFW markeren
|
||||
toReply: Reageren
|
||||
toPost: Publiceren
|
||||
replies: Reacties
|
||||
sentFollowRequests: Stuur volgverzoek
|
1906
locales/no-NO.yml
Normal file
1906
locales/no-NO.yml
Normal file
File diff suppressed because it is too large
Load diff
2031
locales/pl-PL.yml
Normal file
2031
locales/pl-PL.yml
Normal file
File diff suppressed because it is too large
Load diff
254
locales/pt-BR.yml
Normal file
254
locales/pt-BR.yml
Normal file
|
@ -0,0 +1,254 @@
|
|||
_lang_: Português (Brasil)
|
||||
username: Nome de usuário
|
||||
ok: OK
|
||||
headlineFirefish: Uma plataforma de mídia social descentralizada e de código aberto
|
||||
que é gratuita para sempre! 🚀
|
||||
search: Pesquisar
|
||||
gotIt: Entendi!
|
||||
introFirefish: Bem vindo! Firefish é uma plataforma de mídia social descentralizada
|
||||
e de código aberto que é gratuita para sempre! 🚀
|
||||
searchPlaceholder: Pesquise no Firefish
|
||||
notifications: Notificações
|
||||
password: Senha
|
||||
forgotPassword: Esqueci a senha
|
||||
cancel: Cancelar
|
||||
noThankYou: Não, obrigade
|
||||
save: Salvar
|
||||
enterUsername: Insira nome de usuário
|
||||
cw: Aviso de conteúdo
|
||||
driveFileDeleteConfirm: Tem a certeza de que pretende apagar o arquivo "{name}"? O
|
||||
arquivo será removido de todas as mensagens que o contenham como anexo.
|
||||
deleteAndEdit: Deletar e editar
|
||||
import: Importar
|
||||
exportRequested: Você pediu uma exportação. Isso pode demorar um pouco. Será adicionado
|
||||
ao seu Drive quando for completo.
|
||||
note: Postar
|
||||
notes: Postagens
|
||||
deleteAndEditConfirm: Você tem certeza que quer deletar esse post e edita-lo? Você
|
||||
vai perder todas as reações, impulsionamentos e respostas dele.
|
||||
showLess: Fechar
|
||||
importRequested: Você requisitou uma importação. Isso pode demorar um pouco.
|
||||
listsDesc: Listas deixam você criar linhas do tempo com usuários específicos. Elas
|
||||
podem ser acessadas pela página de linhas do tempo.
|
||||
edited: 'Editado às {date} {time}'
|
||||
sendMessage: Enviar uma mensagem
|
||||
older: antigo
|
||||
createList: Criar lista
|
||||
loadMore: Carregar mais
|
||||
mentions: Menções
|
||||
importAndExport: Importar/Exportar Dados
|
||||
files: Arquivos
|
||||
lists: Listas
|
||||
manageLists: Gerenciar listas
|
||||
error: Erro
|
||||
somethingHappened: Ocorreu um erro
|
||||
retry: Tentar novamente
|
||||
renotedBy: Impulsionado por {user}
|
||||
noNotes: Nenhum post
|
||||
noNotifications: Nenhuma notificação
|
||||
instance: Servidor
|
||||
settings: Configurações
|
||||
basicSettings: Configurações Básicas
|
||||
otherSettings: Outras Configurações
|
||||
openInWindow: Abrir em janela
|
||||
profile: Perfil
|
||||
noAccountDescription: Esse usuário ainda não escreveu sua bio.
|
||||
login: Entrar
|
||||
loggingIn: Entrando
|
||||
logout: Sair
|
||||
signup: Criar conta
|
||||
uploading: Enviando...
|
||||
users: Usuários
|
||||
addUser: Adicione um usuário
|
||||
addInstance: Adicionar um servidor
|
||||
cantFavorite: Não foi possível adicionar aos marcadores.
|
||||
pin: Fixar no perfil
|
||||
unpin: Desfixar do perfil
|
||||
copyContent: Copiar conteúdos
|
||||
copyLink: Copiar link
|
||||
delete: Deletar
|
||||
deleted: Deletado
|
||||
editNote: Editar anotação
|
||||
addToList: Adicionar a lista
|
||||
copyUsername: Copiar nome de usuário
|
||||
searchUser: Procurar por um usuário
|
||||
reply: Responder
|
||||
jumpToPrevious: Pular para o anterior
|
||||
showMore: Mostrar mais
|
||||
newer: novo
|
||||
youGotNewFollower: seguiu você
|
||||
mention: Mencionar
|
||||
directNotes: Mensagens diretas
|
||||
export: Exportar
|
||||
unfollowConfirm: Você tem certez que deseja para de seguir {name}?
|
||||
noLists: Você não possui nenhuma lista
|
||||
following: Seguindo
|
||||
followers: Seguidores
|
||||
followsYou: Segue você
|
||||
fetchingAsApObject: Buscando do Fediverse
|
||||
timeline: Linha do tempo
|
||||
favorite: Adicionar aos marcadores
|
||||
favorites: Marcadores
|
||||
unfavorite: Remover dos marcadores
|
||||
favorited: Adicionado aos marcadores.
|
||||
alreadyFavorited: Já foi adicionado aos marcadores.
|
||||
download: Download
|
||||
pageLoadError: Ocorreu um erro ao carregar a página.
|
||||
pageLoadErrorDescription: Isso normalmente é causado por erros de rede ou pelo cache
|
||||
do navegador. Tente limpar o cache e, depois de esperar um pouquinho, tente novamente.
|
||||
serverIsDead: Esse servidos não está respondendo. Por favor espere um pouco e tente
|
||||
novamente.
|
||||
youShouldUpgradeClient: Para visualizar essa página, favor reiniciar para atualizar
|
||||
seu cliente.
|
||||
enterListName: Insira um nome para a lista
|
||||
privacy: Privacidade
|
||||
defaultNoteVisibility: Visibilidade padrão
|
||||
makeFollowManuallyApprove: Pedidos de seguimento precisam de aprovação
|
||||
follow: Seguir
|
||||
followRequest: Seguir
|
||||
followRequests: Pedidos de seguimento
|
||||
unfollow: Parar de seguir
|
||||
followRequestPending: Pedido de seguimento pendente
|
||||
enterEmoji: Insira um emoji
|
||||
itsOff: Desativado
|
||||
itsOn: Ativado
|
||||
removeReaction: Retirar sua reação
|
||||
reactionSettingDescription2: Arraste para reordenar, clique para deletar, pressione
|
||||
“+” para adicionar.
|
||||
rememberNoteVisibility: Lembrar configurações de visibilidade de postagem
|
||||
enterFileName: Preencha o nome do arquivo
|
||||
block: Bloquear
|
||||
unblock: Desbloquear
|
||||
suspend: Suspender
|
||||
blockConfirm: Você tem certeza de que quer bloquear esta conta?
|
||||
unblockConfirm: Você tem certeza de que quer desbloquear esta conta?
|
||||
suspendConfirm: Você tem certeza de que quer suspender esta conta?
|
||||
selectList: Selecione uma lista
|
||||
selectChannel: Selecione um canal
|
||||
addEmoji: Adicionar Emoji
|
||||
settingGuide: Configurações recomendadas
|
||||
cacheRemoteFilesDescription: Quando esta configuração está desativada, arquivos remotos
|
||||
serão carregados diretamente do servidor remoto. Desativar isso irá diminuir o uso
|
||||
de armazenamento, mas aumentar o tráfego, já que as thumbnails não serão geradas.
|
||||
flagAsBot: Marcar esta conta como robô
|
||||
flagAsCat: Você é um gato? 😺
|
||||
flagAsCatDescription: Você receberá orelhas de gato e falará como um!
|
||||
flagSpeakAsCat: Falar como um gato
|
||||
dashboard: Painel
|
||||
showFeaturedNotesInTimeline: Mostrar postagens em destaque nas linhas do tempo
|
||||
objectStorage: Armazenamento de objetos
|
||||
useObjectStorage: Utilizar armazenamento de objetos
|
||||
objectStorageBaseUrl: URL base
|
||||
objectStorageBucket: Balde
|
||||
objectStorageBucketDesc: Por favor, especifique o nome do balde usado no seu provedor.
|
||||
objectStorageRegion: Região
|
||||
objectStorageRegionDesc: Especifique uma região como "xx-east-1". Se o seu serviço
|
||||
não distingue entre as regiões, deixe esta em branco ou insira 'us-east-1'.
|
||||
objectStorageUseSSL: Utilizar SSL
|
||||
objectStorageUseSSLDesc: Desligue isso se você não utilizará HTTPS para conexões de
|
||||
API
|
||||
objectStorageUseProxy: Conecte-se por Proxy
|
||||
lastUsedDate: Última utilização em
|
||||
state: Estado
|
||||
objectStorageUseProxyDesc: Desligue isso se você não utilizará um Proxy para conexões
|
||||
com API
|
||||
serverLogs: Logs de Servidor
|
||||
details: Detalhes
|
||||
nothing: Não há nada para ver aqui
|
||||
installedDate: Autorizado em
|
||||
sort: Ordenar
|
||||
ascendingOrder: Ascendente
|
||||
descendingOrder: Descendente
|
||||
output: Saída
|
||||
expandOnNoteClick: Abrir postagem ao clicar
|
||||
updateRemoteUser: Atualizar informações do usuário remoto
|
||||
deleteAllFiles: Excluir todos os arquivos
|
||||
deleteAllFilesConfirm: Você tem certeza de que deseja excluir todos os arquivos?
|
||||
yourAccountSuspendedTitle: Esta conta está suspensa
|
||||
yourAccountSuspendedDescription: Esta conta foi suspensa por quebrar os termos de
|
||||
serviço do servidor ou similares. Entre em contato com o administrador se você quiser
|
||||
saber um motivo mais detalhado. Por favor, não crie uma nova conta.
|
||||
menu: Menu
|
||||
divider: Divisor
|
||||
addItem: Adicionar Item
|
||||
inboxUrl: URL da caixa de entrada
|
||||
left: Esquerda
|
||||
center: Centro
|
||||
wide: Largo
|
||||
narrow: Estreito
|
||||
isModerator: Moderador
|
||||
monthAndDay: '{day}/{month}'
|
||||
pinned: Fixar ao perfil
|
||||
pinnedNote: Postagem fixada
|
||||
you: Você
|
||||
clickToShow: Clique para exibir
|
||||
showEmojisInReactionNotifications: Mostrar emojis nas notificações de reação
|
||||
reactionSetting: Reações a exibir no seletor de reações
|
||||
customEmojis: Emojis personalizados
|
||||
emojis: Emojis
|
||||
emojiName: Nome do Emoji
|
||||
emoji: Emoji
|
||||
emojiUrl: URL do Emoji
|
||||
editWidgetsExit: Pronto
|
||||
userSilenced: Este usuário está sendo silenciado.
|
||||
objectStoragePrefix: Prefixo
|
||||
volume: Volume
|
||||
objectStorageS3ForcePathStyle: Use URLs de endpoint baseadas em caminho
|
||||
none: Nenhum
|
||||
masterVolume: Volume mestre
|
||||
showInPage: Mostrar na página
|
||||
expandOnNoteClickDesc: Se desativado, você ainda pode abrir postagens no menu do botão
|
||||
direito do mouse ou clicando no timestamp.
|
||||
disablePagesScript: Desativar o AiScript nas Páginas
|
||||
isPatron: Patrono do Firefish
|
||||
invite: Convite
|
||||
inMb: Em megabytes
|
||||
iconUrl: URL do Ícone
|
||||
basicInfo: Informações básicas
|
||||
pinnedUsers: Usuários fixados
|
||||
fontSize: Tamanho da fonte
|
||||
noFollowRequests: Você não tem nenhuma solicitação de seguimento pendente
|
||||
openImageInNewTab: Abrir imagens em nova guia
|
||||
local: Local
|
||||
remote: Remoto
|
||||
total: Total
|
||||
appearance: Aparência
|
||||
accessibility: Acessibilidade
|
||||
accountSettings: Configurações de Conta
|
||||
numberOfDays: Número de dias
|
||||
hideThisNote: Esconder esta postagem
|
||||
objectStoragePrefixDesc: Os arquivos serão armazenados em diretórios com este prefixo.
|
||||
objectStorageEndpointDesc: Deixe isso vazio se você estiver usando AWS S3, de outra
|
||||
forma especifique o endpoint como '<host>' ou '<host>:<port>', dependendo do serviço
|
||||
que você está usando.
|
||||
deleteAll: Excluir tudo
|
||||
showFixedPostForm: Exibir o formulário de postagem no topo da linha do tempo
|
||||
newNoteRecived: Há novas postagens
|
||||
sounds: Sons
|
||||
chooseEmoji: Selecione um emoji
|
||||
unableToProcess: A operação não pôde ser concluída
|
||||
recentUsed: Recentemente usado
|
||||
install: Instalar
|
||||
uninstall: Desinstalar
|
||||
installedApps: Aplicações Autorizadas
|
||||
removeAllFollowing: Parar de seguir todos os usuários seguidos
|
||||
removeAllFollowingDescription: Executar isso faz parar de seguir todas as contas de
|
||||
{host}. Por favor, execute isso se o servidor, por exemplo, não existir mais.
|
||||
userSuspended: Este usuário foi suspenso.
|
||||
isAdmin: Administrador
|
||||
receiveFollowRequest: Solicitação de seguir recebida
|
||||
followRequestAccepted: Solicitação de seguir aceita
|
||||
add: Adicionar
|
||||
reaction: Reações
|
||||
enableEmojiReactions: Ativar reações com emoji
|
||||
attachCancel: Remover anexo
|
||||
flagShowTimelineReplies: Mostrar respostas na linha do tempo
|
||||
addAccount: Adicionar conta
|
||||
toReply: Responder
|
||||
sentFollowRequests: Enviou solicitações para seguir
|
||||
toPost: Postar
|
||||
renotes: Impulsionamentos
|
||||
renote: Impulsionar
|
||||
unrenote: Retirar o impulsionamento
|
||||
renoted: Impulsionado.
|
||||
replies: Respostas
|
767
locales/pt-PT.yml
Normal file
767
locales/pt-PT.yml
Normal file
|
@ -0,0 +1,767 @@
|
|||
_lang_: "Português (Portugal)"
|
||||
headlineFirefish: "Uma rede ligada por notas"
|
||||
introFirefish: "Bem-vindo! Firefish é um serviço de microblogue descentralizado de
|
||||
código aberto, gratuito para sempre! 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Buscar"
|
||||
notifications: "Notificações"
|
||||
username: "Nome de usuário"
|
||||
password: "Senha"
|
||||
forgotPassword: "Esqueci a senha"
|
||||
fetchingAsApObject: "Buscando no Fediverso"
|
||||
ok: "OK"
|
||||
gotIt: "Entendi"
|
||||
cancel: "Cancelar"
|
||||
enterUsername: "Digite o nome de usuário"
|
||||
renotedBy: "Repostado por {user}"
|
||||
noNotes: "Sem posts"
|
||||
noNotifications: "Sem notificações"
|
||||
instance: "Instância"
|
||||
settings: "Configurações"
|
||||
basicSettings: "Configurações básicas"
|
||||
otherSettings: "Outras configurações"
|
||||
openInWindow: "Abrir numa janela"
|
||||
profile: "Perfil"
|
||||
timeline: "Timeline"
|
||||
noAccountDescription: "Este usuário não tem uma descrição."
|
||||
login: "Iniciar sessão"
|
||||
loggingIn: "Iniciando sessão…"
|
||||
logout: "Sair"
|
||||
signup: "Registrar-se"
|
||||
uploading: "Enviando…"
|
||||
save: "Guardar"
|
||||
users: "Usuários"
|
||||
addUser: "Adicionar usuário"
|
||||
favorite: "Favoritar"
|
||||
favorites: "Favoritar"
|
||||
unfavorite: "Remover dos favoritos"
|
||||
favorited: "Adicionado aos favoritos."
|
||||
alreadyFavorited: "Já adicionado aos favoritos."
|
||||
cantFavorite: "Não foi possível adicionar aos favoritos."
|
||||
pin: "Afixar no perfil"
|
||||
unpin: "Desafixar do perfil"
|
||||
copyContent: "Copiar conteúdos"
|
||||
copyLink: "Copiar hiperligação"
|
||||
delete: "Eliminar"
|
||||
deleteAndEdit: "Eliminar e editar"
|
||||
deleteAndEditConfirm: "Tens a certeza que pretendes eliminar esta nota e editá-la?
|
||||
Irás perder todas as suas reações, renotas e respostas."
|
||||
addToList: "Adicionar a lista"
|
||||
sendMessage: "Enviar uma mensagem"
|
||||
copyUsername: "Copiar nome de utilizador"
|
||||
searchUser: "Pesquisar utilizador"
|
||||
reply: "Responder"
|
||||
loadMore: "Carregar mais"
|
||||
showMore: "Ver mais"
|
||||
showLess: "Fechar"
|
||||
youGotNewFollower: "Você tem um novo seguidor"
|
||||
receiveFollowRequest: "Pedido de seguimento recebido"
|
||||
followRequestAccepted: "Pedido de seguir aceito"
|
||||
mention: "Menção"
|
||||
mentions: "Menções"
|
||||
directNotes: "Notas diretas"
|
||||
importAndExport: "Importar/Exportar"
|
||||
import: "Importar"
|
||||
export: "Exportar"
|
||||
files: "Ficheiros"
|
||||
download: "Descarregar"
|
||||
driveFileDeleteConfirm: "Tens a certeza que pretendes apagar o ficheiro \"{name}\"\
|
||||
? As notas que tenham este ficheiro anexado serão também apagadas."
|
||||
unfollowConfirm: "Tens a certeza que queres deixar de seguir {name}?"
|
||||
exportRequested: "Pediste uma exportação. Este processo pode demorar algum tempo.
|
||||
Será adicionado à tua Drive após a conclusão do processo."
|
||||
importRequested: "Pediste uma importação. Este processo pode demorar algum tempo."
|
||||
lists: "Listas"
|
||||
noLists: "Não tens nenhuma lista"
|
||||
note: "Post"
|
||||
notes: "Posts"
|
||||
following: "Seguindo"
|
||||
followers: "Seguidores"
|
||||
followsYou: "Segue-te"
|
||||
createList: "Criar lista"
|
||||
manageLists: "Gerir listas"
|
||||
error: "Erro"
|
||||
somethingHappened: "Ocorreu um erro"
|
||||
retry: "Tentar novamente"
|
||||
pageLoadError: "Ocorreu um erro ao carregar a página."
|
||||
pageLoadErrorDescription: "Isto é normalmente causado por erros de rede ou pela cache
|
||||
do browser. Experimenta limpar a cache e tenta novamente após algum tempo."
|
||||
serverIsDead: "O servidor não está respondendo. Por favor espere um pouco e tente
|
||||
novamente."
|
||||
youShouldUpgradeClient: "Para visualizar essa página, por favor recarregue-a para
|
||||
atualizar seu cliente."
|
||||
enterListName: "Insira um nome para a lista"
|
||||
privacy: "Privacidade"
|
||||
makeFollowManuallyApprove: "Pedidos de seguimento precisam ser aprovados"
|
||||
defaultNoteVisibility: "Visibilidade padrão"
|
||||
follow: "Seguindo"
|
||||
followRequest: "Mandar pedido de seguimento"
|
||||
followRequests: "Pedidos de seguimento"
|
||||
unfollow: "Deixar de seguir"
|
||||
followRequestPending: "Pedido de seguimento pendente"
|
||||
enterEmoji: "Inserir emoji"
|
||||
renote: "Repostar"
|
||||
unrenote: "Desmarcar"
|
||||
renoted: "Repostado"
|
||||
cantRenote: "Não pode repostar"
|
||||
cantReRenote: "Não pode repostar este repost"
|
||||
quote: "Citar"
|
||||
pinnedNote: "Post fixado"
|
||||
pinned: "Afixar no perfil"
|
||||
you: "Você"
|
||||
clickToShow: "Clique para ver"
|
||||
sensitive: "Conteúdo sensível"
|
||||
add: "Adicionar"
|
||||
reaction: "Reações"
|
||||
reactionSetting: "Quais reações a mostrar no selecionador de reações"
|
||||
reactionSettingDescription2: "Arraste para reordenar, clique para excluir, pressione
|
||||
+ para adicionar."
|
||||
rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas"
|
||||
attachCancel: "Remover anexo"
|
||||
markAsSensitive: "Marcar como sensível"
|
||||
unmarkAsSensitive: "Desmarcar como sensível"
|
||||
clickToShowPatterns: "Clique para mostrar os padrões do módulo"
|
||||
enterFileName: "Digite o nome do ficheiro"
|
||||
mute: "Silenciar"
|
||||
unmute: "Dessilenciar"
|
||||
block: "Bloquear"
|
||||
unblock: "Desbloquear"
|
||||
suspend: "Suspender"
|
||||
unsuspend: "Cancelar suspensão"
|
||||
blockConfirm: "Tem certeza que gostaria de bloquear essa conta?"
|
||||
unblockConfirm: "Tem certeza que gostaria de desbloquear essa conta?"
|
||||
suspendConfirm: "Tem certeza que gostaria de suspender essa conta?"
|
||||
unsuspendConfirm: "Tem certeza que gostaria de cancelar a suspensão dessa conta?"
|
||||
selectList: "Escolhe uma lista"
|
||||
selectAntenna: "Escolhe uma antena"
|
||||
selectWidget: "Escolhe um widget"
|
||||
editWidgets: "Editar widgets"
|
||||
editWidgetsExit: "Pronto"
|
||||
customEmojis: "Emoji personalizado"
|
||||
emoji: "Emoji"
|
||||
emojis: "Emojis"
|
||||
emojiName: "Nome do Emoji"
|
||||
emojiUrl: "URL do Emoji"
|
||||
addEmoji: "Adicionar um Emoji"
|
||||
settingGuide: "Guia de configuração"
|
||||
cacheRemoteFiles: "Memória transitória de arquivos remotos"
|
||||
cacheRemoteFilesDescription: "Se você desabilitar essa configuração, os arquivos remotos
|
||||
não serão armazenados em memória transitória e serão vinculados diretamente. Economiza
|
||||
o armazenamento do servidor, mas não gera miniaturas, o que aumenta o tráfego."
|
||||
flagAsBot: "Marcar conta como robô"
|
||||
flagAsBotDescription: "Se esta conta for operada por um programa, ative este sinalizador.
|
||||
Quando ativado, serve como um sinalizador para evitar o encadeamento de reações
|
||||
para outros programadores, e o manuseio do sistema do Firefish é adequado para ‘bots’."
|
||||
flagAsCat: "Marcar conta como gato"
|
||||
flagAsCatDescription: "Ative essa opção para marcar essa conta como gato."
|
||||
flagShowTimelineReplies: "Mostrar respostas na linha de tempo"
|
||||
flagShowTimelineRepliesDescription: "Quando ativado, a linha do tempo mostra as respostas
|
||||
às outras notas do utilizador, além da nota do utilizador."
|
||||
autoAcceptFollowed: "Aprove automaticamente os seguidores dos seguintes utilizadores"
|
||||
addAccount: "Adicionar Conta"
|
||||
loginFailed: "Não consegui logar"
|
||||
showOnRemote: "Exibir remotamente"
|
||||
general: "Geral"
|
||||
wallpaper: "Papel de parede"
|
||||
setWallpaper: "Definir papel de parede"
|
||||
removeWallpaper: "Remover papel de parede"
|
||||
searchWith: "Buscar: {q}"
|
||||
youHaveNoLists: "Não tem nenhuma lista"
|
||||
followConfirm: "Tem certeza que quer deixar de seguir {name}?"
|
||||
proxyAccount: "Conta proxy"
|
||||
proxyAccountDescription: "Uma conta proxy é uma conta que atua como seguidora remota
|
||||
para utilizadores sob determinadas condições. Por exemplo, quando um utilizador
|
||||
lista um utilizador remoto, a atividade não será entregue à instância, a menos que
|
||||
alguém esteja seguindo o utilizador listado, portanto, a conta proxy deve seguir."
|
||||
host: "hospedeiro"
|
||||
selectUser: "Selecionar utilizador"
|
||||
recipient: "Morada"
|
||||
annotation: "Anotação"
|
||||
federation: "União"
|
||||
instances: "Instância"
|
||||
registeredAt: "Registrado em"
|
||||
latestRequestSentAt: "Enviar a solicitação mais recente"
|
||||
latestRequestReceivedAt: "Recebeu a última solicitação"
|
||||
latestStatus: "Status mais recente"
|
||||
storageUsage: "Uso de armazenamento"
|
||||
charts: "gráfico"
|
||||
perHour: "por hora"
|
||||
perDay: "por dia"
|
||||
stopActivityDelivery: "Parar a entrega de atividades"
|
||||
blockThisInstance: "Bloquear esta instância"
|
||||
operations: "operar"
|
||||
software: "Programas"
|
||||
version: "versão"
|
||||
metadata: "Metadados"
|
||||
monitor: "monitor"
|
||||
jobQueue: "Fila de trabalhos"
|
||||
cpuAndMemory: "CPU e memória"
|
||||
network: "rede"
|
||||
disk: "disco"
|
||||
instanceInfo: "Informações da instância"
|
||||
statistics: "Estatisticas"
|
||||
clearQueue: "Limpar a fila"
|
||||
clearQueueConfirmTitle: "Quer limpar a fila?"
|
||||
clearQueueConfirmText: "Postagens não entregues não serão mais entregues. Normalmente
|
||||
você não precisa fazer isso."
|
||||
clearCachedFiles: "Limpar memória transitória"
|
||||
clearCachedFilesConfirm: "Tem certeza de que deseja excluir todos os arquivos remotos
|
||||
armazenados em memória transitória?"
|
||||
blockedInstances: "Instância bloqueada"
|
||||
blockedInstancesDescription: "Defina os anfitriões das instâncias que deseja bloquear,
|
||||
separados por quebras de linha. Uma instância bloqueada não poderá interagir com
|
||||
esta instância."
|
||||
muteAndBlock: "Silenciar e bloquear"
|
||||
mutedUsers: "Silenciar utilizador"
|
||||
blockedUsers: "Utilizadores bloqueados"
|
||||
noUsers: "Sem usuários"
|
||||
editProfile: "Editar Perfil"
|
||||
noteDeleteConfirm: "Deseja excluir esta nota?"
|
||||
pinLimitExceeded: "Não consigo mais fixar"
|
||||
intro: "A instalação do Firefish está completa! Crie uma conta de administrador."
|
||||
done: "Concluído"
|
||||
processing: "Em Progresso"
|
||||
preview: "Pré-visualizar"
|
||||
default: "Padrão"
|
||||
noCustomEmojis: "Não há emojis"
|
||||
noJobs: "Sem trabalho"
|
||||
federating: "federar"
|
||||
blocked: "Bloqueado"
|
||||
suspended: "Cancelar subscrição"
|
||||
all: "Todos"
|
||||
subscribing: "Subscrito"
|
||||
publishing: "Executando"
|
||||
notResponding: "Sem resposta"
|
||||
instanceFollowing: "Seguir a instância"
|
||||
instanceFollowers: "Seguidores da instância"
|
||||
instanceUsers: "Utilizador da instância"
|
||||
changePassword: "Mudar senha"
|
||||
security: "Segurança"
|
||||
retypedNotMatch: "As entradas não coincidem."
|
||||
currentPassword: "Palavra-passe atual"
|
||||
newPassword: "Nova palavra-passe"
|
||||
newPasswordRetype: "Nova senha (redigite)"
|
||||
attachFile: "Anexar arquivo"
|
||||
more: "Mais!"
|
||||
featured: "Destaques"
|
||||
usernameOrUserId: "Nome de utilizador ou ID de utilizador"
|
||||
noSuchUser: "Utilizador não encontrado"
|
||||
lookup: "Buscando"
|
||||
announcements: "Notícia"
|
||||
imageUrl: "URL da imagem"
|
||||
remove: "Eliminar"
|
||||
removed: "Foi deletado"
|
||||
removeAreYouSure: "Deseja excluir \"{x}\"?"
|
||||
deleteAreYouSure: "Deseja excluir \"{x}\"?"
|
||||
resetAreYouSure: "Redefinir agora?"
|
||||
saved: "Salvo"
|
||||
messaging: "Chat"
|
||||
upload: "Enviando"
|
||||
keepOriginalUploading: "Manter a imagem original"
|
||||
keepOriginalUploadingDescription: "Mantenha a versão original ao carregar a imagem.
|
||||
Quando desligado, a imagem para publicação na web será gerada no navegador no momento
|
||||
do upload."
|
||||
fromDrive: "\nDa unidade"
|
||||
fromUrl: "Da URL"
|
||||
uploadFromUrl: "Carregamento de URL"
|
||||
uploadFromUrlDescription: "URL do arquivo que você deseja enviar"
|
||||
uploadFromUrlRequested: "Upload solicitado"
|
||||
uploadFromUrlMayTakeTime: "Pode levar algum tempo para que o upload seja concluído."
|
||||
explore: "Explorar"
|
||||
messageRead: "Lida"
|
||||
noMoreHistory: "Sem mais história"
|
||||
startMessaging: "Iniciar conversação"
|
||||
nUsersRead: "{n} Pessoas leem"
|
||||
agreeTo: "Eu concordo com {0}"
|
||||
tos: "Termos de serviço"
|
||||
start: "começar"
|
||||
home: "casa"
|
||||
remoteUserCaution: "As informações estão incompletas porque é um utilizador remoto."
|
||||
activity: "atividade"
|
||||
images: "imagem"
|
||||
birthday: "aniversário"
|
||||
yearsOld: "{age} anos"
|
||||
registeredDate: "Data de registro"
|
||||
location: "Lugar, colocar"
|
||||
theme: "tema"
|
||||
themeForLightMode: "Tema a usar no Modo Diurno"
|
||||
themeForDarkMode: "Temas usados no Modo Noturno"
|
||||
light: "Claro"
|
||||
dark: "Escuro"
|
||||
lightThemes: "Tema claro"
|
||||
darkThemes: "Tema escuro"
|
||||
syncDeviceDarkMode: "Sincronize com o modo escuro do dispositivo"
|
||||
drive: "Unidades"
|
||||
fileName: "Nome do Ficheiro"
|
||||
selectFile: "Selecione o arquivo"
|
||||
selectFiles: "Selecione os arquivos"
|
||||
selectFolder: "Selecionar uma pasta"
|
||||
selectFolders: "Selecionar uma pasta"
|
||||
renameFile: "Renomear ficheiro"
|
||||
folderName: "Nome da pasta"
|
||||
createFolder: "Criar pasta"
|
||||
renameFolder: "Renomear Pasta"
|
||||
deleteFolder: "Eliminar Pasta"
|
||||
addFile: "Adicionar arquivo"
|
||||
emptyDrive: "A unidade está vazia"
|
||||
emptyFolder: "A pasta está vazia"
|
||||
unableToDelete: "Não é possível eliminar"
|
||||
inputNewFileName: "Por favor, digite um novo nome para a pasta!"
|
||||
inputNewDescription: "Insira uma nova legenda"
|
||||
inputNewFolderName: "Por favor, digite um novo nome para a pasta"
|
||||
circularReferenceFolder: "A pasta de destino é uma subpasta da pasta que você deseja
|
||||
mover."
|
||||
hasChildFilesOrFolders: "Esta pasta não está vazia e não pode ser excluída."
|
||||
copyUrl: "Copiar URL"
|
||||
rename: "Renomear"
|
||||
avatar: "Avatar"
|
||||
banner: "Capa"
|
||||
nsfw: "Conteúdo sensível"
|
||||
whenServerDisconnected: "Quando a conexão com o servidor é perdida"
|
||||
disconnectedFromServer: "Desconectado do servidor"
|
||||
reload: "Recarregar"
|
||||
doNothing: "Nenhuma ação adicional"
|
||||
reloadConfirm: "Quer recarregar?"
|
||||
watch: "ver"
|
||||
unwatch: "Não observar"
|
||||
accept: "Aceitar"
|
||||
reject: "Rejeitar"
|
||||
normal: "Normal"
|
||||
instanceName: "Nome da instância"
|
||||
instanceDescription: "Descrição da instância"
|
||||
maintainerName: "Nome do administrador"
|
||||
maintainerEmail: "E-mail do Administrador:"
|
||||
tosUrl: "URL dos Termos de Uso"
|
||||
thisYear: "Este ano"
|
||||
thisMonth: "Este mês"
|
||||
today: "Hoje"
|
||||
dayX: " Dia {day}"
|
||||
monthX: "mês de {month}"
|
||||
yearX: "Ano {year}"
|
||||
pages: "Páginas"
|
||||
enableLocalTimeline: "Ativar linha do tempo local"
|
||||
enableGlobalTimeline: "Ativar linha do tempo global"
|
||||
disablingTimelinesInfo: "Se você desabilitar essas linhas do tempo, administradores
|
||||
e moderadores ainda poderão usá-las por conveniência."
|
||||
registration: "Registar"
|
||||
enableRegistration: "Permitir que qualquer pessoa se registre"
|
||||
invite: "Convidar"
|
||||
driveCapacityPerLocalAccount: "Capacidade da unidade por utilizador local"
|
||||
driveCapacityPerRemoteAccount: "Capacidade da unidade por utilizador remoto"
|
||||
inMb: "Em ‘megabytes’"
|
||||
iconUrl: "URL da imagem do ícone (favicon, etc.)"
|
||||
bannerUrl: "URL da imagem do ‘banner’"
|
||||
backgroundImageUrl: "URL da imagem de fundo"
|
||||
basicInfo: "Informações básicas"
|
||||
pinnedUsers: "Utilizador fixado"
|
||||
pinnedUsersDescription: "Descreva os utilizadores que você deseja fixar na página
|
||||
\"Localizar\", etc., separados por quebras de linha."
|
||||
pinnedPages: "Página fixada"
|
||||
pinnedPagesDescription: "Descreva o caminho da página que você deseja fixar na página
|
||||
superior da instância, separada por quebras de linha."
|
||||
pinnedClipId: "ID do clipe a ser fixado"
|
||||
pinnedNotes: "Post fixado"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Ativar hCaptcha"
|
||||
hcaptchaSiteKey: "Chave do sítio ‘web’"
|
||||
hcaptchaSecretKey: "Chave secreta"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Habilitar reCAPTCHA"
|
||||
recaptchaSiteKey: "Chave do sítio ‘web’"
|
||||
recaptchaSecretKey: "Chave secreta"
|
||||
avoidMultiCaptchaConfirm: "O uso de vários captchas pode causar interferência. Deseja
|
||||
desativar outros captchas? Você também pode cancelar e deixar vários captchas ativados."
|
||||
antennas: "Antenas"
|
||||
manageAntennas: "Gestão de antena"
|
||||
name: "Nome"
|
||||
antennaSource: "Origem de entrada"
|
||||
antennaKeywords: "Palavras-chave recebidas"
|
||||
antennaExcludeKeywords: "Palavras-chave negativas"
|
||||
antennaKeywordsDescription: "Se você separá-lo com um espaço, será uma especificação
|
||||
AND, e se você separá-lo com uma quebra de linha, será uma especificação OR."
|
||||
notifyAntenna: "Notificar novas notas"
|
||||
withFileAntenna: "Apenas notas com arquivos anexados"
|
||||
enableServiceworker: "Ative as notificações push para o seu navegador"
|
||||
antennaUsersDescription: "Especificar nomes de utilizador separados por quebras de
|
||||
linha"
|
||||
caseSensitive: "Maiúsculas e minúsculas"
|
||||
withReplies: "Incluindo resposta"
|
||||
connectedTo: "Você está conectado à seguinte conta"
|
||||
notesAndReplies: "Publicações e respostas"
|
||||
withFiles: "Com arquivo"
|
||||
silence: "Silenciado"
|
||||
silenceConfirm: "Quer silenciar?"
|
||||
unsilence: "Liberar silenciar"
|
||||
unsilenceConfirm: "Quer liberar o silêncio?"
|
||||
popularUsers: "Utilizadores populares"
|
||||
recentlyUpdatedUsers: "Utilizadores postados recentemente"
|
||||
recentlyRegisteredUsers: "Utilizadores registrados recentemente"
|
||||
recentlyDiscoveredUsers: "Utilizadores descobertos recentemente"
|
||||
exploreUsersCount: "Há um utilizador de {count}"
|
||||
exploreFediverse: "Explorar Fediverse"
|
||||
popularTags: "Tags populares"
|
||||
userList: "Listas"
|
||||
about: "Informações"
|
||||
aboutFirefish: "Sobre Firefish"
|
||||
administrator: "Administrador"
|
||||
token: "Símbolo"
|
||||
twoStepAuthentication: "Verificação em duas etapas"
|
||||
moderator: "Moderador"
|
||||
nUsersMentioned: "Postado por {n} pessoas"
|
||||
securityKey: "Chave de segurança"
|
||||
securityKeyName: "Nome chave"
|
||||
registerSecurityKey: "Registre a chave de segurança"
|
||||
lastUsed: "Último uso"
|
||||
unregister: "Cancelar registro"
|
||||
passwordLessLogin: "Entrar sem senha"
|
||||
resetPassword: "Redefinir senha"
|
||||
newPasswordIs: "A nova senha é \"{password}\""
|
||||
reduceUiAnimation: "Reduzir a animação da ‘interface’ do utilizador"
|
||||
share: "Compartilhar"
|
||||
notFound: "Não encontrado"
|
||||
notFoundDescription: "Não havia página correspondente ao URL especificado."
|
||||
uploadFolder: "Destino de ‘upload’ padrão"
|
||||
cacheClear: "Excluir memória transitória"
|
||||
markAsReadAllNotifications: "Marcar todas as notificações como lidas"
|
||||
markAsReadAllUnreadNotes: "Marcar todas as postagens como lidas"
|
||||
markAsReadAllTalkMessages: "Marcar todas as conversas como lidas"
|
||||
help: "Ajuda"
|
||||
inputMessageHere: "Escrever mensagem aqui"
|
||||
close: "Fechar"
|
||||
group: "Grupos"
|
||||
groups: "Grupos"
|
||||
createGroup: "Criar grupo"
|
||||
ownedGroups: "Grupo próprio"
|
||||
invites: "Convidar"
|
||||
invitations: "Convidar"
|
||||
tags: "Etiquetas"
|
||||
docSource: "Fonte deste documento"
|
||||
createAccount: "Criar conta"
|
||||
existingAccount: "Contas existentes"
|
||||
regenerate: "Gerar novamente"
|
||||
fontSize: "Tamanho do texto"
|
||||
noFollowRequests: "Não há aplicação de acompanhamento"
|
||||
openImageInNewTab: "Abrir a imagem numa nova aba"
|
||||
dashboard: "Painel de controle"
|
||||
local: "Local"
|
||||
remote: "Remoto"
|
||||
total: "Total"
|
||||
weekOverWeekChanges: "Em comparação com a semana anterior"
|
||||
dayOverDayChanges: "Dia anterior"
|
||||
appearance: "Aparência"
|
||||
clientSettings: "Configurações do cliente"
|
||||
accountSettings: "Configurações da conta"
|
||||
promotion: "Promoção"
|
||||
promote: "Promover"
|
||||
numberOfDays: "Dias"
|
||||
hideThisNote: "Ocultar esta nota"
|
||||
showFeaturedNotesInTimeline: "Mostrar notas recomendadas na linha do tempo"
|
||||
objectStorage: "Armazenamento de objetos"
|
||||
useObjectStorage: "Usar armazenamento de objetos"
|
||||
objectStorageBaseUrl: "URL base"
|
||||
objectStorageBaseUrlDesc: "O URL usado para referência. Se você estiver usando um
|
||||
CDN ou Proxy, seu URL, S3:'https: // <bucket> .s3.amazonaws.com', GCS, etc .:'https://storage.googleapis.com/
|
||||
<bucket>' ."
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "Especifique o nome do bucket do serviço a ser usado."
|
||||
objectStoragePrefix: "Prefixo"
|
||||
objectStoragePrefixDesc: "Ele é armazenado neste diretório de prefixo."
|
||||
objectStorageEndpoint: "Ponto final"
|
||||
objectStorageEndpointDesc: "Especifique vazio para S3, caso contrário, especifique
|
||||
o ponto final para cada serviço. Especifique como'<host>'ou'<host>: <port>'."
|
||||
objectStorageRegion: "Região"
|
||||
objectStorageRegionDesc: "Especifique uma região como 'xx-east-1'. Caso seu serviço
|
||||
não tenha o conceito de região, ele deve estar vazio ou 'us-east-1'."
|
||||
objectStorageUseSSL: "Usar SSL"
|
||||
objectStorageUseSSLDesc: "Desative-o se não quiser usar https para conexões de API"
|
||||
objectStorageUseProxy: "Usar proxy"
|
||||
objectStorageUseProxyDesc: "Se você não usa proxy para conexão de API, desative-o."
|
||||
objectStorageSetPublicRead: "Definir 'public-read' ao fazer o upload"
|
||||
serverLogs: "Registro do servidor"
|
||||
deleteAll: "Apagar Tudo"
|
||||
showFixedPostForm: "Exibir o formulário de postagem na parte superior da linha do
|
||||
tempo"
|
||||
newNoteRecived: "Nova nota recebida"
|
||||
sounds: "Sons"
|
||||
listen: "Ouvir"
|
||||
none: "Nenhum"
|
||||
showInPage: "Ver na página"
|
||||
popout: "Sair"
|
||||
volume: "Volume"
|
||||
masterVolume: "volume principal"
|
||||
details: "Detalhes"
|
||||
output: "Resultado"
|
||||
smtpHost: "hospedeiro"
|
||||
smtpUser: "Nome de usuário"
|
||||
smtpPass: "Senha"
|
||||
clearCache: "Limpar memória transitória"
|
||||
info: "Informações"
|
||||
user: "Usuários"
|
||||
file: "Ficheiros"
|
||||
_email:
|
||||
_follow:
|
||||
title: "Você tem um novo seguidor"
|
||||
_mfm:
|
||||
mention: "Menção"
|
||||
quote: "Citar"
|
||||
emoji: "Emoji personalizado"
|
||||
search: "Buscar"
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Menção"
|
||||
renote: "Repostar"
|
||||
_sfx:
|
||||
note: "Posts"
|
||||
notification: "Notificações"
|
||||
chat: "Chat"
|
||||
_widgets:
|
||||
notifications: "Notificações"
|
||||
timeline: "Timeline"
|
||||
activity: "atividade"
|
||||
federation: "União"
|
||||
jobQueue: "Fila de trabalhos"
|
||||
_cw:
|
||||
show: "Carregar mais"
|
||||
_visibility:
|
||||
home: "casa"
|
||||
followers: "Seguidores"
|
||||
_profile:
|
||||
name: "Nome"
|
||||
username: "Nome de usuário"
|
||||
_exportOrImport:
|
||||
followingList: "Seguindo"
|
||||
muteList: "Silenciar"
|
||||
blockingList: "Bloquear"
|
||||
userLists: "Listas"
|
||||
_charts:
|
||||
federation: "União"
|
||||
_timelines:
|
||||
home: "casa"
|
||||
_pages:
|
||||
blocks:
|
||||
image: "imagem"
|
||||
_button:
|
||||
_action:
|
||||
_pushEvent:
|
||||
event: "Nome do evento"
|
||||
message: "Mostrar mensagem quando ativado"
|
||||
variable: "Variável a mandar"
|
||||
no-variable: "Nenhum"
|
||||
callAiScript: "Invocar AiScript"
|
||||
_callAiScript:
|
||||
functionName: "Nome da função"
|
||||
radioButton: "Escolha"
|
||||
_radioButton:
|
||||
values: "Lista de escolhas separadas por quebras de texto"
|
||||
script:
|
||||
categories:
|
||||
logical: "Operação lógica"
|
||||
operation: "Cálculos"
|
||||
comparison: "Comparação"
|
||||
list: "Listas"
|
||||
blocks:
|
||||
_strReplace:
|
||||
arg2: "Texto que irá ser substituído"
|
||||
arg3: "Substituir com"
|
||||
strReverse: "Virar texto"
|
||||
join: "Sequência de texto"
|
||||
_join:
|
||||
arg1: "Listas"
|
||||
arg2: "Separador"
|
||||
add: "Somar"
|
||||
_add:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
subtract: "Subtrair"
|
||||
_subtract:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
multiply: "Multiplicar"
|
||||
_multiply:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
divide: "Dividir"
|
||||
_divide:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
mod: "O resto de"
|
||||
_mod:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
round: "Arredondar decimal"
|
||||
_round:
|
||||
arg1: "Numérico"
|
||||
eq: "A e B são iguais"
|
||||
_eq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
notEq: "A e B são diferentes"
|
||||
_notEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
and: "A e B"
|
||||
_and:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
or: "A OU B"
|
||||
_or:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
lt: "< A é menor do que B"
|
||||
_lt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
gt: "> A é maior do que B"
|
||||
_gt:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
ltEq: "<= A é maior ou igual a B"
|
||||
_ltEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
gtEq: ">= A é maior ou igual a B"
|
||||
_gtEq:
|
||||
arg1: "A"
|
||||
arg2: "B"
|
||||
if: "Galho"
|
||||
_if:
|
||||
arg1: "Se"
|
||||
arg2: "Então"
|
||||
arg3: "Se não"
|
||||
not: "NÃO"
|
||||
_not:
|
||||
arg1: "NÃO"
|
||||
random: "Aleatório"
|
||||
_random:
|
||||
arg1: "Probabilidade"
|
||||
rannum: "Numeral aleatório"
|
||||
_rannum:
|
||||
arg1: "Valor mínimo"
|
||||
arg2: "Valor máximo"
|
||||
randomPick: "Escolher aleatoriamente de uma lista"
|
||||
_randomPick:
|
||||
arg1: "Listas"
|
||||
dailyRandom: "Aleatório (Muda uma vez por dia para cada usuário)"
|
||||
_dailyRandom:
|
||||
arg1: "Probabilidade"
|
||||
dailyRannum: "Numeral aleatório (Muda uma vez por dia para cada usuário)"
|
||||
_dailyRannum:
|
||||
arg1: "Valor mínimo"
|
||||
arg2: "Valor máximo"
|
||||
dailyRandomPick: "Escolher aleatoriamente de uma lista (Muda uma vez por dia
|
||||
para cada usuário)"
|
||||
_dailyRandomPick:
|
||||
arg1: "Listas"
|
||||
seedRandom: "Aleatório (com semente)"
|
||||
_seedRandom:
|
||||
arg1: "Semente"
|
||||
arg2: "Probabilidade"
|
||||
seedRannum: "Número aleatório (com semente)"
|
||||
_seedRannum:
|
||||
arg1: "Semente"
|
||||
arg2: "Valor mínimo"
|
||||
arg3: "Valor máximo"
|
||||
seedRandomPick: "Escolher aleatoriamente de uma lista (com uma semente)"
|
||||
_seedRandomPick:
|
||||
arg1: "Semente"
|
||||
arg2: "Listas"
|
||||
DRPWPM: "Escolher aleatoriamente de uma lista ponderada (Muda uma vez por dia
|
||||
para cada usuário)"
|
||||
_DRPWPM:
|
||||
arg1: "Lista de texto"
|
||||
pick: "Escolhe a partir da lista"
|
||||
_pick:
|
||||
arg1: "Listas"
|
||||
arg2: "Posição"
|
||||
listLen: "Pegar comprimento da lista"
|
||||
_listLen:
|
||||
arg1: "Listas"
|
||||
number: "Numérico"
|
||||
stringToNumber: "Texto para numérico"
|
||||
_stringToNumber:
|
||||
arg1: "Texto"
|
||||
numberToString: "Numérico para texto"
|
||||
_numberToString:
|
||||
arg1: "Numérico"
|
||||
splitStrByLine: "Dividir texto por quebras"
|
||||
_splitStrByLine:
|
||||
arg1: "Texto"
|
||||
ref: "Variável"
|
||||
aiScriptVar: "Variável AiScript"
|
||||
fn: "Função"
|
||||
_fn:
|
||||
slots: "Espaços"
|
||||
slots-info: "Separar cada espaço com uma quebra de texto"
|
||||
arg1: "Resultado"
|
||||
for: "Repetição 'for'"
|
||||
_for:
|
||||
arg1: "Número de repetições"
|
||||
arg2: "Ação"
|
||||
typeError: "Espaço {slot} aceita valores de tipo \"{expect}\", mas o valor dado
|
||||
é do tipo \"{actual}\"!"
|
||||
thereIsEmptySlot: "O espaço {slot} está vazio!"
|
||||
types:
|
||||
string: "Texto"
|
||||
number: "Numérico"
|
||||
array: "Listas"
|
||||
stringArray: "Lista de texto"
|
||||
emptySlot: "Espaço vazio"
|
||||
enviromentVariables: "Variáveis de ambiente"
|
||||
pageVariables: "Variáveis de página"
|
||||
_relayStatus:
|
||||
requesting: "Pendente"
|
||||
accepted: "Aprovado"
|
||||
rejected: "Recusado"
|
||||
_notification:
|
||||
fileUploaded: "Carregamento de arquivo efetuado com sucesso"
|
||||
youGotMention: "{name} te mencionou"
|
||||
youGotReply: "{name} te respondeu"
|
||||
youGotQuote: "{name} te citou"
|
||||
youGotPoll: "{name} votou em sua enquete"
|
||||
youGotMessagingMessageFromUser: "{name} te mandou uma mensagem de bate-papo"
|
||||
youGotMessagingMessageFromGroup: "Uma mensagem foi mandada para o grupo {name}"
|
||||
youWereFollowed: "Você tem um novo seguidor"
|
||||
youReceivedFollowRequest: "Você recebeu um pedido de seguimento"
|
||||
yourFollowRequestAccepted: "Seu pedido de seguimento foi aceito"
|
||||
youWereInvitedToGroup: "{userName} te convidou para um grupo"
|
||||
pollEnded: "Os resultados da enquete agora estão disponíveis"
|
||||
emptyPushNotificationMessage: "As notificações de alerta foram atualizadas"
|
||||
_types:
|
||||
all: "Todos"
|
||||
follow: "Seguindo"
|
||||
mention: "Menção"
|
||||
reply: "Respostas"
|
||||
renote: "Repostar"
|
||||
quote: "Citar"
|
||||
reaction: "Reações"
|
||||
pollVote: "Votações em enquetes"
|
||||
pollEnded: "Enquetes terminando"
|
||||
receiveFollowRequest: "Recebeu pedidos de seguimento"
|
||||
followRequestAccepted: "Aceitou pedidos de seguimento"
|
||||
groupInvited: "Convites de grupo"
|
||||
app: "Notificações de aplicativos conectados"
|
||||
_actions:
|
||||
followBack: "te seguiu de volta"
|
||||
reply: "Responder"
|
||||
renote: "Repostar"
|
||||
_deck:
|
||||
alwaysShowMainColumn: "Sempre mostrar a coluna principal"
|
||||
columnAlign: "Alinhar colunas"
|
||||
addColumn: "Adicionar coluna"
|
||||
swapLeft: "Trocar de posição com a coluna à esquerda"
|
||||
swapRight: "Trocar de posição com a coluna à direita"
|
||||
swapUp: "Trocar de posição com a coluna acima"
|
||||
swapDown: "Trocar de posição com a coluna abaixo"
|
||||
popRight: "Acoplar coluna à direita"
|
||||
profile: "Perfil"
|
||||
_columns:
|
||||
main: "Principal"
|
||||
widgets: "Widgets"
|
||||
notifications: "Notificações"
|
||||
tl: "Timeline"
|
||||
antenna: "Antenas"
|
||||
list: "Listas"
|
||||
mentions: "Menções"
|
||||
direct: "Notas diretas"
|
||||
editNote: Editar post
|
||||
edited: Editado a {date} às {time}
|
776
locales/ro-RO.yml
Normal file
776
locales/ro-RO.yml
Normal file
|
@ -0,0 +1,776 @@
|
|||
_lang_: "Română"
|
||||
headlineFirefish: "O rețea conectată prin note"
|
||||
introFirefish: "Bine ai venit! Firefish este un serviciu de microblogging open source
|
||||
și decentralizat.\nCreează \"note\" cu care să îți poți împărți gândurile cu oricine
|
||||
din jurul tău. 📡\nCu \"reacții\" îți poți expirma rapid părerea despre notele oricui.
|
||||
👍\nHai să explorăm o lume nouă! 🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Caută"
|
||||
notifications: "Notificări"
|
||||
username: "Nume de utilizator"
|
||||
password: "Parolă"
|
||||
forgotPassword: "Am uitat parola"
|
||||
fetchingAsApObject: "Se aduce din Fediverse"
|
||||
ok: "OK"
|
||||
gotIt: "Am înțeles!"
|
||||
cancel: "Anulează"
|
||||
enterUsername: "Introdu numele de utilizator"
|
||||
renotedBy: "Re-notat de {user}"
|
||||
noNotes: "Nicio notă"
|
||||
noNotifications: "Nicio notificare"
|
||||
instance: "Instanță"
|
||||
settings: "Setări"
|
||||
basicSettings: "Setări generale"
|
||||
otherSettings: "Alte Setări"
|
||||
openInWindow: "Deschide într-o fereastră"
|
||||
profile: "Profil"
|
||||
timeline: "Cronologie"
|
||||
noAccountDescription: "Acest utilizator încă nu a scris un bio."
|
||||
login: "Autentifică-te"
|
||||
loggingIn: "Se autentifică"
|
||||
logout: "Deconectează-te"
|
||||
signup: "Înregistrează-te"
|
||||
uploading: "Se încarcă"
|
||||
save: "Salvează"
|
||||
users: "Utilizatori"
|
||||
addUser: "Adăugă utilizator"
|
||||
favorite: "Adaugă la favorite"
|
||||
favorites: "Favorite"
|
||||
unfavorite: "Elimină din favorite"
|
||||
favorited: "Adăugat la favorite."
|
||||
alreadyFavorited: "Deja adăugat la favorite."
|
||||
cantFavorite: "Nu se poate adăuga la favorite."
|
||||
pin: "Fixează pe profil"
|
||||
unpin: "Anulati fixare"
|
||||
copyContent: "Copiază conținutul"
|
||||
copyLink: "Copiază link-ul"
|
||||
delete: "Şterge"
|
||||
deleteAndEdit: "Șterge și editează"
|
||||
deleteAndEditConfirm: "Ești sigur că vrei să ștergi această notă și să o editezi?
|
||||
Vei pierde reacțiile, re-notele și răspunsurile acesteia."
|
||||
addToList: "Adaugă în listă"
|
||||
sendMessage: "Trimite un mesaj"
|
||||
copyUsername: "Copiază numele de utilizator"
|
||||
searchUser: "Caută un utilizator"
|
||||
reply: "Răspunde"
|
||||
loadMore: "Incarcă mai mult"
|
||||
showMore: "Arată mai mult"
|
||||
showLess: "Închide"
|
||||
youGotNewFollower: "te-a urmărit"
|
||||
receiveFollowRequest: "Cerere de urmărire primită"
|
||||
followRequestAccepted: "Cerere de urmărire acceptată"
|
||||
mention: "Mențiune"
|
||||
mentions: "Mențiuni"
|
||||
directNotes: "Note directe"
|
||||
importAndExport: "Importă / Exportă"
|
||||
import: "Importă"
|
||||
export: "Exportă"
|
||||
files: "Fișiere"
|
||||
download: "Descarcă"
|
||||
driveFileDeleteConfirm: "Ești sigur ca vrei să ștergi fișierul \"{name}\"? Notele
|
||||
atașate fișierului vor fi șterse și ele."
|
||||
unfollowConfirm: "Ești sigur ca vrei să nu mai urmărești pe {name}?"
|
||||
exportRequested: "Ai cerut un export. S-ar putea să ia un pic. Va fi adăugat in Drive-ul
|
||||
tău odată completat."
|
||||
importRequested: "Ai cerut un import. S-ar putea să ia un pic."
|
||||
lists: "Liste"
|
||||
noLists: "Nu ai nici o listă"
|
||||
note: "Notă"
|
||||
notes: "Note"
|
||||
following: "Urmărești"
|
||||
followers: "Urmăritori"
|
||||
followsYou: "Te urmărește"
|
||||
createList: "Creează listă"
|
||||
manageLists: "Gestionează listele"
|
||||
error: "Eroare"
|
||||
somethingHappened: "A survenit o eroare"
|
||||
retry: "Reîncearcă"
|
||||
pageLoadError: "A apărut o eroare la încărcarea paginii."
|
||||
pageLoadErrorDescription: "De obicei asta este cauzat de o eroare de rețea sau cache-ul
|
||||
browser-ului. Încearcă să cureți cache-ul și apoi să încerci din nou puțin mai târziu."
|
||||
serverIsDead: "Serverul nu răspunde. Te rugăm să aștepți o perioadă și să încerci
|
||||
din nou."
|
||||
youShouldUpgradeClient: "Pentru a vedea această pagină, te rugăm să îți actualizezi
|
||||
clientul."
|
||||
enterListName: "Introdu un nume pentru listă"
|
||||
privacy: "Confidenţialitate"
|
||||
makeFollowManuallyApprove: "Fă cererile de urmărire să necesite aprobare"
|
||||
defaultNoteVisibility: "Vizibilitate implicită"
|
||||
follow: "Urmărești"
|
||||
followRequest: "Trimite cerere de urmărire"
|
||||
followRequests: "Cereri de urmărire"
|
||||
unfollow: "Nu mai urmări"
|
||||
followRequestPending: "Cerere de urmărire în așteptare"
|
||||
enterEmoji: "Introdu un emoji"
|
||||
renote: "Re-notează"
|
||||
unrenote: "Ia înapoi re-nota"
|
||||
renoted: "Re-notat."
|
||||
cantRenote: "Această postare nu poate fi re-notată."
|
||||
cantReRenote: "O re-notă nu poate fi re-notată."
|
||||
quote: "Citează"
|
||||
pinnedNote: "Notă fixată"
|
||||
pinned: "Fixat pe profil"
|
||||
you: "Tu"
|
||||
clickToShow: "Click pentru a afișa"
|
||||
sensitive: "NSFW"
|
||||
add: "Adaugă"
|
||||
reaction: "Reacție"
|
||||
reactionSetting: "Reacții care să apară in selectorul de reacții"
|
||||
reactionSettingDescription2: "Trage pentru a rearanja, apasă pe \"+\" pentru a adăuga."
|
||||
rememberNoteVisibility: "Amintește setarea de vizibilitate a notelor"
|
||||
attachCancel: "Înlătură atașament"
|
||||
markAsSensitive: "Marchează ca NSFW"
|
||||
unmarkAsSensitive: "Demarchează ca NSFW"
|
||||
enterFileName: "Introduceţi numele fişierului"
|
||||
mute: "Amuțește"
|
||||
unmute: "Înlătură amuțirea"
|
||||
block: "Blochează"
|
||||
unblock: "Deblochează"
|
||||
suspend: "Suspendă"
|
||||
unsuspend: "Anulează suspendare"
|
||||
blockConfirm: "Ești sigur că vrei să blochezi acest cont?"
|
||||
unblockConfirm: "Ești sigur ca vrei să deblochezi acest cont?"
|
||||
suspendConfirm: "Ești sigur ca vrei să suspendezi acest cont?"
|
||||
unsuspendConfirm: "Ești sigur ca vrei să nu mai suspendezi acest cont?"
|
||||
selectList: "Selectează o listă"
|
||||
selectAntenna: "Selectează o antenă"
|
||||
selectWidget: "Selectați un widget"
|
||||
editWidgets: "Editează widget-urile"
|
||||
editWidgetsExit: "Terminat"
|
||||
customEmojis: "Emoji personalizat"
|
||||
emoji: "Emoji"
|
||||
emojis: "Emoji-uri"
|
||||
emojiName: "Numele emoji-ului"
|
||||
emojiUrl: "URL-ul emoji-ului"
|
||||
addEmoji: "Adaugă un emoji"
|
||||
settingGuide: "Setări recomandate"
|
||||
cacheRemoteFiles: "Ține fișierele externe in cache"
|
||||
cacheRemoteFilesDescription: "Când această setare este dezactivată, fișierele externe
|
||||
sunt încărcate direct din instanța externă. Dezactivarea va scădea utilizarea spațiului
|
||||
de stocare, dar va crește traficul, deoarece thumbnail-urile nu vor fi generate."
|
||||
flagAsBot: "Marchează acest cont ca bot"
|
||||
flagAsBotDescription: "Activează această opțiune dacă acest cont este controlat de
|
||||
un program. Daca e activată, aceasta va juca rolul unui indicator pentru dezvoltatori
|
||||
pentru a preveni interacțiunea în lanțuri infinite cu ceilalți boți și ajustează
|
||||
sistemele interne al Firefish pentru a trata acest cont drept un bot."
|
||||
flagAsCat: "Marchează acest cont ca pisică"
|
||||
flagAsCatDescription: "Activează această opțiune dacă acest cont este o pisică."
|
||||
flagShowTimelineReplies: "Arată răspunsurile în cronologie"
|
||||
flagShowTimelineRepliesDescription: "Dacă e activată vor fi arătate în cronologie
|
||||
răspunsurile utilizatorilor către alte notele altor utilizatori."
|
||||
autoAcceptFollowed: "Aprobă automat cererile de urmărire de la utilizatorii pe care
|
||||
îi urmărești"
|
||||
addAccount: "Adaugă un cont"
|
||||
loginFailed: "Autentificare eșuată"
|
||||
showOnRemote: "Vezi mai multe pe instanța externă"
|
||||
general: "General"
|
||||
wallpaper: "Imagine de fundal"
|
||||
setWallpaper: "Setați imaginea de fundal"
|
||||
removeWallpaper: "Șterge imagine de fundal"
|
||||
searchWith: "Caută: {q}"
|
||||
youHaveNoLists: "Nu ai nici o listă"
|
||||
followConfirm: "Ești sigur ca vrei să urmărești pe {name}?"
|
||||
proxyAccount: "Cont proxy"
|
||||
proxyAccountDescription: "Un cont proxy este un cont care se comportă ca un urmăritor
|
||||
extern pentru utilizatorii puși sub anumite condiții. De exemplu, când un cineva
|
||||
adaugă un utilizator extern intr-o listă, activitatea utilizatorului extern nu va
|
||||
fi adusă în instanță daca nici un utilizator local nu urmărește acel utilizator,
|
||||
așa că în schimb contul proxy îl va urmări."
|
||||
host: "Gazdă"
|
||||
selectUser: "Selectează un utilizator"
|
||||
recipient: "Destinatar"
|
||||
annotation: "Adnotări"
|
||||
federation: "Federație"
|
||||
instances: "Instanțe"
|
||||
registeredAt: "Înregistrat în"
|
||||
latestRequestSentAt: "Ultima cerere trimisă"
|
||||
latestRequestReceivedAt: "Ultima cerere primită"
|
||||
latestStatus: "Ultimul status"
|
||||
storageUsage: "Utilizare stocare"
|
||||
charts: "Diagrame"
|
||||
perHour: "Pe oră"
|
||||
perDay: "Pe zi"
|
||||
stopActivityDelivery: "Nu mai trimite activități"
|
||||
blockThisInstance: "Blochează această instanță"
|
||||
operations: "Operațiuni"
|
||||
software: "Software"
|
||||
version: "Versiune"
|
||||
metadata: "Metadata"
|
||||
monitor: "Monitor"
|
||||
jobQueue: "coada de job-uri"
|
||||
cpuAndMemory: "CPU și memorie"
|
||||
network: "Rețea"
|
||||
disk: "Disk"
|
||||
instanceInfo: "Informații despre instanță"
|
||||
statistics: "Statistici"
|
||||
clearQueue: "Șterge coada"
|
||||
clearQueueConfirmTitle: "Ești sigur că vrei să cureți coada?"
|
||||
clearQueueConfirmText: "Orice notă rămasă în coadă nu va fi federată. De obicei această
|
||||
operație nu este necesară."
|
||||
clearCachedFiles: "Golește cache-ul"
|
||||
clearCachedFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele externe din
|
||||
cache?"
|
||||
blockedInstances: "Instanțe blocate"
|
||||
blockedInstancesDescription: "Scrie hostname-urile instanțelor pe care dorești să
|
||||
le blochezi. Instanțele listate nu vor mai putea să comunice cu această instanță."
|
||||
muteAndBlock: "Amuțiri și Blocări"
|
||||
mutedUsers: "Utilizatori amuțiți"
|
||||
blockedUsers: "Utilizatori blocați"
|
||||
noUsers: "Niciun utilizator"
|
||||
editProfile: "Editează profilul"
|
||||
noteDeleteConfirm: "Ești sigur că vrei să ștergi această notă?"
|
||||
pinLimitExceeded: "Nu poți mai fixa mai multe note"
|
||||
intro: "Firefish s-a instalat! Te rog crează un utilizator admin."
|
||||
done: "Gata"
|
||||
processing: "Se procesează"
|
||||
preview: "Previzualizare"
|
||||
default: "Prestabilit"
|
||||
noCustomEmojis: "Nu e niciun emoji"
|
||||
noJobs: "Nu e niciun job"
|
||||
federating: "Federație"
|
||||
blocked: "Blocat"
|
||||
suspended: "Suspendat"
|
||||
all: "Tot"
|
||||
subscribing: "Abonare"
|
||||
publishing: "Publicare"
|
||||
notResponding: "Nu răspunde"
|
||||
instanceFollowing: "Urmărind în instanță"
|
||||
instanceFollowers: "Urmăritori ai instanței"
|
||||
instanceUsers: "Utilizatori ai acestei instanțe"
|
||||
changePassword: "Schimbă parolă"
|
||||
security: "Securitate"
|
||||
retypedNotMatch: "Intrările nu corespund"
|
||||
currentPassword: "Parola curentă"
|
||||
newPassword: "Parola nouă"
|
||||
newPasswordRetype: "Rescrie parola nouă"
|
||||
attachFile: "Atașează fișiere"
|
||||
more: "Mai mult!"
|
||||
featured: "Evidențiat"
|
||||
usernameOrUserId: "Nume sau ID de utilizator"
|
||||
noSuchUser: "Utilizatorul nu a fost găsit"
|
||||
lookup: "Privire"
|
||||
announcements: "Anunțuri"
|
||||
imageUrl: "URL-ul imaginii"
|
||||
remove: "Şterge"
|
||||
removed: "Șterș cu succes"
|
||||
removeAreYouSure: "Ești sigur că vrei să înlături {x}?"
|
||||
deleteAreYouSure: "Ești sigur că vrei să ștergi {x}?"
|
||||
resetAreYouSure: "Sigur vrei să resetezi?"
|
||||
saved: "Salvat"
|
||||
messaging: "Chat"
|
||||
upload: "Încarcă"
|
||||
keepOriginalUploading: "Păstrează imaginea originală"
|
||||
keepOriginalUploadingDescription: "Salvează imaginea originala încărcată fără modificări.
|
||||
Dacă e oprită, o versiune pentru afișarea pe web va fi generată la încărcare."
|
||||
fromDrive: "Din Drive"
|
||||
fromUrl: "Din URL"
|
||||
uploadFromUrl: "Încarcă dintr-un URL"
|
||||
uploadFromUrlDescription: "URL-ul fișierului pe care dorești să îl încarci"
|
||||
uploadFromUrlRequested: "Încărcare solicitată"
|
||||
uploadFromUrlMayTakeTime: "S-ar putea să ia puțin până se finalizează încărcarea."
|
||||
explore: "Explorează"
|
||||
messageRead: "Citit"
|
||||
noMoreHistory: "Nu există mai mult istoric"
|
||||
startMessaging: "Începe un chat nou"
|
||||
nUsersRead: "citit de {n}"
|
||||
agreeTo: "Sunt de acord cu {0}"
|
||||
tos: "Termenii de utilizare"
|
||||
start: "Să începem"
|
||||
home: "Acasă"
|
||||
remoteUserCaution: "Deoarece acest utilizator este dintr-o instanță externă, informația
|
||||
afișată poate fi incompletă."
|
||||
activity: "Activitate"
|
||||
images: "Imagini"
|
||||
birthday: "Zi de naștere"
|
||||
yearsOld: "{age} ani"
|
||||
registeredDate: "Data înregistrării"
|
||||
location: "Locație"
|
||||
theme: "Teme"
|
||||
themeForLightMode: "Temă folosită pentru Modul Luminat"
|
||||
themeForDarkMode: "Temă folosită pentru Modul Întunecat"
|
||||
light: "Luminos"
|
||||
dark: "Întunecat"
|
||||
lightThemes: "Teme luminoase"
|
||||
darkThemes: "Teme întunecate"
|
||||
syncDeviceDarkMode: "Sincronizează Modul Întunecat cu setările dispozitivului"
|
||||
drive: "Drive"
|
||||
fileName: "Nume fișier"
|
||||
selectFile: "Alege un fisier"
|
||||
selectFiles: "Alege fișiere"
|
||||
selectFolder: "Selectează un folder"
|
||||
selectFolders: "Selectează folderele"
|
||||
renameFile: "Redenumește fișier"
|
||||
folderName: "Nume folder"
|
||||
createFolder: "Crează folder"
|
||||
renameFolder: "Redenumește acest folder"
|
||||
deleteFolder: "Șterge acest folder"
|
||||
addFile: "Adăugați un fișier"
|
||||
emptyDrive: "Drive-ul tău e gol"
|
||||
emptyFolder: "Folder-ul acesta este gol"
|
||||
unableToDelete: "Nu se poate șterge"
|
||||
inputNewFileName: "Introdu un nou nume de fișier"
|
||||
inputNewDescription: "Introdu o descriere nouă"
|
||||
inputNewFolderName: "Introdu un nume de folder nou"
|
||||
circularReferenceFolder: "Destinația folderului este un subfolder al folderului pe
|
||||
care dorești să îl muți."
|
||||
hasChildFilesOrFolders: "Acest folder nu este gol, așa că nu poate fi șters."
|
||||
copyUrl: "Copiază URL"
|
||||
rename: "Redenumește"
|
||||
avatar: "Avatar"
|
||||
banner: "Banner"
|
||||
nsfw: "NSFW"
|
||||
whenServerDisconnected: "Când pierzi conexiunea cu serverul"
|
||||
disconnectedFromServer: "Conecțiunea cu serverul a fost pierdută"
|
||||
reload: "Reîncarcă"
|
||||
doNothing: "Ignoră"
|
||||
reloadConfirm: "Ai dori să reîmprospătezi cronologia?"
|
||||
watch: "Vezi"
|
||||
unwatch: "Oprește-te din văzut"
|
||||
accept: "Acceptă"
|
||||
reject: "Respinge"
|
||||
normal: "Normal"
|
||||
instanceName: "Numele instanței"
|
||||
instanceDescription: "Descrierea instanței"
|
||||
maintainerName: "Administrator"
|
||||
maintainerEmail: "Email-ul administratorului"
|
||||
tosUrl: "URL-ul Termenilor de utilizare"
|
||||
thisYear: "An"
|
||||
thisMonth: "Lună"
|
||||
today: "Azi"
|
||||
dayX: "{day}"
|
||||
monthX: "{month}"
|
||||
yearX: "{year}"
|
||||
pages: "Pagini"
|
||||
enableLocalTimeline: "Activează cronologia locală"
|
||||
enableGlobalTimeline: "Activeaza cronologia globală"
|
||||
disablingTimelinesInfo: "Administratorii și Moderatorii vor avea mereu access la toate
|
||||
cronologiile, chiar dacă nu sunt activate."
|
||||
registration: "Inregistrare"
|
||||
enableRegistration: "Activează înregistrările pentru utilizatori noi"
|
||||
invite: "Invită"
|
||||
driveCapacityPerLocalAccount: "Capacitatea Drive-ului per utilizator local"
|
||||
driveCapacityPerRemoteAccount: "Capacitatea Drive-ului per utilizator extern"
|
||||
inMb: "În megabytes"
|
||||
iconUrl: "URL-ul iconiței"
|
||||
bannerUrl: "URL-ul imaginii de banner"
|
||||
backgroundImageUrl: "URL-ul imaginii de fundal"
|
||||
basicInfo: "Informații de bază"
|
||||
pinnedUsers: "Utilizatori fixați"
|
||||
pinnedUsersDescription: "Scrie utilizatorii, separați prin pauză de rând, care vor
|
||||
fi fixați pe pagina \"Explorează\"."
|
||||
pinnedPages: "Pagini fixate"
|
||||
pinnedPagesDescription: "Introdu linkurile Paginilor pe care le vrei fixate in vâruful
|
||||
paginii acestei instanțe, separate de pauze de rând."
|
||||
pinnedClipId: "ID-ul clip-ului pe care să îl fixezi"
|
||||
pinnedNotes: "Notă fixată"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Activează hCaptcha"
|
||||
hcaptchaSiteKey: "Site key"
|
||||
hcaptchaSecretKey: "Secret key"
|
||||
recaptcha: "reCAPTCHA"
|
||||
enableRecaptcha: "Activează reCAPTCHA"
|
||||
recaptchaSiteKey: "Site key"
|
||||
recaptchaSecretKey: "Secret key"
|
||||
avoidMultiCaptchaConfirm: "Folosirea mai multor sisteme Captcha poate cauza interferență
|
||||
între acestea. Ai dori să dezactivezi alte sisteme Captcha acum active? Dacă preferi
|
||||
să rămână activate, apasă Anulare."
|
||||
antennas: "Antene"
|
||||
manageAntennas: "Gestionează Antenele"
|
||||
name: "Nume"
|
||||
antennaSource: "Sursa antenei"
|
||||
antennaKeywords: "Cuvinte cheie ascultate"
|
||||
antennaExcludeKeywords: "Cuvinte cheie excluse"
|
||||
antennaKeywordsDescription: "Separă cu spații pentru o condiție ȘI sau cu o întrerupere
|
||||
de rând pentru o condiție SAU."
|
||||
notifyAntenna: "Notifică-mă pentru note noi"
|
||||
withFileAntenna: "Doar note cu fișiere"
|
||||
enableServiceworker: "Activează ServiceWorker"
|
||||
antennaUsersDescription: "Scrie un nume de utilizator per linie"
|
||||
caseSensitive: "Sensibil la majuscule și minuscule"
|
||||
withReplies: "Include răspunsuri"
|
||||
connectedTo: "Următoarele conturi sunt conectate"
|
||||
notesAndReplies: "Note și răspunsuri"
|
||||
withFiles: "Incluzând fișiere"
|
||||
silence: "Amuțește"
|
||||
silenceConfirm: "Ești sigur că vrei să amuțești acest utilizator?"
|
||||
unsilence: "Anulează amuțirea"
|
||||
unsilenceConfirm: "Ești sigur că vrei să anulezi amuțirea acestui utilizator?"
|
||||
popularUsers: "Utilizatori populari"
|
||||
recentlyUpdatedUsers: "Utilizatori activi recent"
|
||||
recentlyRegisteredUsers: "Utilizatori ce s-au alăturat recent"
|
||||
recentlyDiscoveredUsers: "Utilizatori descoperiți recent"
|
||||
exploreUsersCount: "Aici sunt {count} utilizatori"
|
||||
exploreFediverse: "Explorează Fediverse-ul"
|
||||
popularTags: "Taguri populare"
|
||||
userList: "Liste"
|
||||
about: "Despre"
|
||||
aboutFirefish: "Despre Firefish"
|
||||
administrator: "Administrator"
|
||||
token: "Token"
|
||||
twoStepAuthentication: "Autentificare în doi pași"
|
||||
moderator: "Moderator"
|
||||
nUsersMentioned: "Menționat de {n} utilizatori"
|
||||
securityKey: "Cheie de securitate"
|
||||
securityKeyName: "Numele cheii"
|
||||
registerSecurityKey: "Înregistrează o cheie de securitate"
|
||||
lastUsed: "Ultima utilizată"
|
||||
unregister: "Dezînregistrează"
|
||||
passwordLessLogin: "Autentificare fără parolă"
|
||||
resetPassword: "Resetează parola"
|
||||
newPasswordIs: "Noua parolă este \"{password}\""
|
||||
reduceUiAnimation: "Redu animațiile interfeței"
|
||||
share: "Distribuie"
|
||||
notFound: "Nu a fost găsit"
|
||||
notFoundDescription: "N-a fost găsită nicio pagină cu acest URL."
|
||||
uploadFolder: "Folder implicit pentru încărcări"
|
||||
cacheClear: "Golește cache-ul"
|
||||
markAsReadAllNotifications: "Marchează toate notificările drept citit"
|
||||
markAsReadAllUnreadNotes: "Marchează toate notele drept citit"
|
||||
markAsReadAllTalkMessages: "Marchează toate mesajele drept citit"
|
||||
help: "Ajutor"
|
||||
inputMessageHere: "Introdu un mesaj aici"
|
||||
close: "Închide"
|
||||
group: "Grup"
|
||||
groups: "Grupuri"
|
||||
createGroup: "Crează un grup"
|
||||
ownedGroups: "Grupuri deținute"
|
||||
joinedGroups: "Grupuri alăturate"
|
||||
invites: "Invită"
|
||||
groupName: "Numele grupului"
|
||||
members: "Membri"
|
||||
transfer: "Transferă"
|
||||
messagingWithUser: "Chat privat"
|
||||
messagingWithGroup: "Chat de grup"
|
||||
title: "Titlu"
|
||||
text: "Text"
|
||||
enable: "Activează"
|
||||
next: "Următorul"
|
||||
retype: "Introdu din nou"
|
||||
noteOf: "Notă de {user}"
|
||||
inviteToGroup: "Invită în grup"
|
||||
quoteAttached: "Citat"
|
||||
quoteQuestion: "Vrei să adaugi ca citat?"
|
||||
noMessagesYet: "Niciun mesaj încă"
|
||||
newMessageExists: "Ai mesaje noi"
|
||||
onlyOneFileCanBeAttached: "Poți atașa un singur fișier la un mesaj"
|
||||
signinRequired: "Te rog autentifică-te"
|
||||
invitations: "Invită"
|
||||
invitationCode: "Cod de invitație"
|
||||
checking: "Se verifică..."
|
||||
available: "Disponibil"
|
||||
unavailable: "Indisponibil"
|
||||
usernameInvalidFormat: "Poți folosi litere mari și mici, numere și underscore-uri."
|
||||
tooShort: "Prea scurt"
|
||||
tooLong: "Prea lung"
|
||||
weakPassword: "Parolă slabă"
|
||||
normalPassword: "Parolă medie"
|
||||
veryStrongPassword: "Parolă puternică"
|
||||
passwordMatched: "Se potrivește!"
|
||||
passwordNotMatched: "Nu se potrivește"
|
||||
signinWith: "Autentifică-te cu {x}"
|
||||
signinFailed: "Nu se poate autentifica. Numele de utilizator sau parola introduse
|
||||
sunt incorecte."
|
||||
tapSecurityKey: "Apasă pe cheia ta de securitate."
|
||||
or: "Sau"
|
||||
language: "Limbă"
|
||||
uiLanguage: "Limba interfeței"
|
||||
groupInvited: "Ai fost invitat într-un grup"
|
||||
aboutX: "Despre {x}"
|
||||
useOsNativeEmojis: "Folosește emojiuri native OS-ului"
|
||||
disableDrawer: "Nu folosi meniuri în stil sertar"
|
||||
youHaveNoGroups: "Nu ai niciun grup"
|
||||
joinOrCreateGroup: "Primește o invitație într-un grup sau creează unul nou."
|
||||
noHistory: "Nu există istoric"
|
||||
signinHistory: "Istoric autentificări"
|
||||
disableAnimatedMfm: "Dezactivează MFM cu animații"
|
||||
doing: "Se procesează..."
|
||||
category: "Categorie"
|
||||
tags: "Etichete"
|
||||
docSource: "Sursa acestui document"
|
||||
createAccount: "Creează un cont"
|
||||
existingAccount: "Cont existent"
|
||||
regenerate: "Regenerează"
|
||||
fontSize: "Mărimea fontului"
|
||||
noFollowRequests: "Nu ai nicio cerere de urmărire în așteptare"
|
||||
openImageInNewTab: "Deschide imaginile în taburi noi"
|
||||
dashboard: "Panou de control"
|
||||
local: "Local"
|
||||
remote: "Extern"
|
||||
total: "Total"
|
||||
weekOverWeekChanges: "Schimbări până săptămâna trecută"
|
||||
dayOverDayChanges: "Schimbări până ieri"
|
||||
appearance: "Aspect"
|
||||
clientSettings: "Setări client"
|
||||
accountSettings: "Setări cont"
|
||||
promotion: "Promovat"
|
||||
promote: "Promovează"
|
||||
numberOfDays: "Numărul zilelor"
|
||||
hideThisNote: "Ascunde această notă"
|
||||
showFeaturedNotesInTimeline: "Arată notele recomandate în cronologii"
|
||||
objectStorage: "Object Storage"
|
||||
useObjectStorage: "Folosește Object Storage"
|
||||
objectStorageBaseUrl: "URL de bază"
|
||||
objectStorageBaseUrlDesc: "URL-ul este folosit pentru referință. Specifică URL-ul
|
||||
CDN-ului sau Proxy-ului tău dacă folosești unul. Pentru S3 folosește 'https://<bucket>.s3.amazonaws.com'
|
||||
și pentru GCS sau servicii echivalente folosește 'https://storage.googleapis.com/<bucket>',
|
||||
etc."
|
||||
objectStorageBucket: "Bucket"
|
||||
objectStorageBucketDesc: "Te rog specifică numele bucket-ului furnizorului tău."
|
||||
objectStoragePrefix: "Prefix"
|
||||
objectStoragePrefixDesc: "Fișierele vor fi stocate sub directoare cu acest prefix."
|
||||
objectStorageEndpoint: "Endpoint"
|
||||
objectStorageEndpointDesc: "Lasă acest câmp gol dacă folosești AWS S3, dacă nu specifică
|
||||
endpoint-ul ca '<host>' sau '<host>:<port>', depinzând de ce serviciu folosești."
|
||||
objectStorageRegion: "Regiune"
|
||||
objectStorageRegionDesc: "Specifică o regiune precum 'xx-east-1'. Dacă serviciul tău
|
||||
nu face distincția între regiuni lasă acest câmp gol sau introdu 'us-east-1'."
|
||||
objectStorageUseSSL: "Folosește SSl"
|
||||
objectStorageUseSSLDesc: "Oprește această opțiune dacă nu vei folosi HTTPS pentru
|
||||
conexiunile API-ului"
|
||||
objectStorageUseProxy: "Conectează-te prin Proxy"
|
||||
objectStorageUseProxyDesc: "Oprește această opțiune dacă vei nu folosi un Proxy pentru
|
||||
conexiunile API-ului"
|
||||
objectStorageSetPublicRead: "Setează \"public-read\" pentru încărcare"
|
||||
serverLogs: "Loguri server"
|
||||
deleteAll: "Șterge tot"
|
||||
showFixedPostForm: "Arată caseta de postare în vârful cronologie"
|
||||
newNoteRecived: "Sunt note noi"
|
||||
sounds: "Sunete"
|
||||
listen: "Ascultă"
|
||||
none: "Nimic"
|
||||
showInPage: "Arată în pagină"
|
||||
popout: "Scoate în afară"
|
||||
volume: "Volum"
|
||||
masterVolume: "Volumul principal"
|
||||
details: "Detalii"
|
||||
chooseEmoji: "Alege un emoji"
|
||||
unableToProcess: "Această operație nu poate fi completată"
|
||||
recentUsed: "Folosit recent"
|
||||
install: "Instalează"
|
||||
uninstall: "Dezinstalează"
|
||||
installedApps: "Aplicații autorizate"
|
||||
nothing: "Nu e nimic de văzut aici"
|
||||
installedDate: "Autorizat la data de"
|
||||
lastUsedDate: "Folosit ultima oara la"
|
||||
state: "Stare"
|
||||
sort: "Sortează"
|
||||
ascendingOrder: "Crescător"
|
||||
descendingOrder: "Descrescător"
|
||||
scratchpad: "Scratchpad"
|
||||
scratchpadDescription: "Scratchpad-ul oferă un mediu de experimentare în AiScript.
|
||||
Poți scrie, executa și verifica rezultatele acestuia interacționând cu Firefish
|
||||
în el."
|
||||
output: "Ieșire"
|
||||
script: "Script"
|
||||
disablePagesScript: "Dezactivează AiScript în Pagini"
|
||||
updateRemoteUser: "Actualizează informațiile utilizatorului extern"
|
||||
deleteAllFiles: "Șterge toate fișierele"
|
||||
deleteAllFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele?"
|
||||
removeAllFollowing: "Dezurmărește toți utilizatorii urmăriți"
|
||||
removeAllFollowingDescription: "Asta va dez-urmări toate conturile din {host}. Te
|
||||
rog execută asta numai dacă instanța, de ex., nu mai există."
|
||||
userSuspended: "Acest utilizator a fost suspendat."
|
||||
userSilenced: "Acest utilizator a fost setat silențios."
|
||||
yourAccountSuspendedTitle: "Acest cont a fost suspendat"
|
||||
yourAccountSuspendedDescription: "Acest cont a fost suspendat din cauza încălcării
|
||||
termenilor de serviciu al serverului sau ceva similar. Contactează administratorul
|
||||
dacă ai dori să afli un motiv mai detaliat. Te rog nu crea un cont nou."
|
||||
menu: "Meniu"
|
||||
divider: "Separator"
|
||||
addItem: "Adaugă element"
|
||||
relays: "Relee"
|
||||
addRelay: "Adaugă Releu"
|
||||
inboxUrl: "URL-ul inbox-ului"
|
||||
addedRelays: "Relee adăugate"
|
||||
serviceworkerInfo: "Trebuie să fie activat pentru notificări push."
|
||||
deletedNote: "Notă ștearsă"
|
||||
invisibleNote: "Note ascunse"
|
||||
enableInfiniteScroll: "Încarcă mai mult automat"
|
||||
visibility: "Vizibilitate"
|
||||
poll: "Sondaj"
|
||||
useCw: "Ascunde conținutul"
|
||||
enablePlayer: "Deschide player-ul video"
|
||||
disablePlayer: "Închide player-ul video"
|
||||
expandTweet: "Expandează tweet"
|
||||
themeEditor: "Editor de teme"
|
||||
description: "Descriere"
|
||||
describeFile: "Adaugă titrări"
|
||||
enterFileDescription: "Introdu titrările"
|
||||
author: "Autor"
|
||||
leaveConfirm: "Ai schimbări nesalvate. Vrei să renunți la ele?"
|
||||
manage: "Gestionare"
|
||||
plugins: "Pluginuri"
|
||||
deck: "Deck"
|
||||
undeck: "Părăsește Deck"
|
||||
useBlurEffectForModal: "Folosește efect de blur pentru modale"
|
||||
width: "Lăţime"
|
||||
height: "Înălţime"
|
||||
large: "Mare"
|
||||
medium: "Mediu"
|
||||
small: "Mic"
|
||||
generateAccessToken: "Generează token de acces"
|
||||
permission: "Permisiuni"
|
||||
enableAll: "Actevează tot"
|
||||
disableAll: "Dezactivează tot"
|
||||
tokenRequested: "Acordă acces la cont"
|
||||
pluginTokenRequestedDescription: "Acest plugin va putea să folosească permisiunile
|
||||
setate aici."
|
||||
notificationType: "Tipul notificării"
|
||||
edit: "Editează"
|
||||
emailServer: "Server email"
|
||||
enableEmail: "Activează distribuția de emailuri"
|
||||
emailConfigInfo: "Folosit pentru a confirma emailul tău în timpul logări dacă îți
|
||||
uiți parola"
|
||||
email: "Email"
|
||||
emailAddress: "Adresă de email"
|
||||
smtpConfig: "Configurare Server SMTP"
|
||||
smtpHost: "Gazdă"
|
||||
smtpPort: "Port"
|
||||
smtpUser: "Nume de utilizator"
|
||||
smtpPass: "Parolă"
|
||||
emptyToDisableSmtpAuth: "Lasă username-ul și parola necompletate pentru a dezactiva
|
||||
verificarea SMTP"
|
||||
smtpSecure: "Folosește SSL/TLS implicit pentru conecțiunile SMTP"
|
||||
smtpSecureInfo: "Oprește opțiunea asta dacă STARTTLS este folosit"
|
||||
testEmail: "Testează livrarea emailurilor"
|
||||
wordMute: "Cuvinte pe mut"
|
||||
regexpError: "Eroare de Expresie Regulată"
|
||||
regexpErrorDescription: "A apărut o eroare în expresia regulată pe linia {line} al
|
||||
cuvintelor {tab} setate pe mut:"
|
||||
instanceMute: "Instanțe pe mut"
|
||||
userSaysSomething: "{name} a spus ceva"
|
||||
makeActive: "Activează"
|
||||
display: "Arată"
|
||||
copy: "Copiază"
|
||||
metrics: "Metrici"
|
||||
overview: "Privire de ansamblu"
|
||||
logs: "Log-uri"
|
||||
delayed: "Întârziate"
|
||||
database: "Baza de date"
|
||||
channel: "Canale"
|
||||
create: "Crează"
|
||||
notificationSetting: "Setări notificări"
|
||||
notificationSettingDesc: "Selectează tipurile de notificări care să fie arătate"
|
||||
useGlobalSetting: "Folosește setările globale"
|
||||
useGlobalSettingDesc: "Dacă opțiunea e pornită, notificările contului tău vor fi folosite.
|
||||
Dacă e oprită, configurația va fi individuală."
|
||||
other: "Altele"
|
||||
regenerateLoginToken: "Regenerează token de login"
|
||||
regenerateLoginTokenDescription: "Regenerează token-ul folosit intern în timpul logări.
|
||||
În mod normal asta nu este necesar. Odată regenerat, toate dispozitivele vor fi
|
||||
delogate."
|
||||
setMultipleBySeparatingWithSpace: "Separă mai multe intrări cu spații."
|
||||
fileIdOrUrl: "Introdu ID sau URL"
|
||||
behavior: "Comportament"
|
||||
sample: "exemplu"
|
||||
abuseReports: "Rapoarte"
|
||||
reportAbuse: "Raportează"
|
||||
reportAbuseOf: "Raportează {name}"
|
||||
fillAbuseReportDescription: "Te rog scrie detaliile legate de acest raport. Dacă este
|
||||
despre o notă specifică, te rog introdu URL-ul ei."
|
||||
abuseReported: "Raportul tău a fost trimis. Mulțumim."
|
||||
reporter: "Raportorul"
|
||||
reporteeOrigin: "Originea raportatului"
|
||||
reporterOrigin: "Originea raportorului"
|
||||
forwardReport: "Redirecționează raportul către instanța externă"
|
||||
forwardReportIsAnonymous: "În locul contului tău, va fi afișat un cont anonim, de
|
||||
sistem, ca raportor către instanța externă."
|
||||
send: "Trimite"
|
||||
abuseMarkAsResolved: "Marchează raportul ca rezolvat"
|
||||
openInNewTab: "Deschide în tab nou"
|
||||
openInSideView: "Deschide în vedere laterală"
|
||||
defaultNavigationBehaviour: "Comportament de navigare implicit"
|
||||
editTheseSettingsMayBreakAccount: "Editarea acestor setări îți pot defecta contul."
|
||||
waitingFor: "Așteptând pentru {x}"
|
||||
random: "Aleator"
|
||||
system: "Sistem"
|
||||
switchUi: "Schimbă UI"
|
||||
desktop: "Desktop"
|
||||
clearCache: "Golește cache-ul"
|
||||
info: "Despre"
|
||||
user: "Utilizatori"
|
||||
administration: "Gestionare"
|
||||
middle: "Mediu"
|
||||
sent: "Trimite"
|
||||
file: "Fișiere"
|
||||
_email:
|
||||
_follow:
|
||||
title: "te-a urmărit"
|
||||
_mfm:
|
||||
mention: "Mențiune"
|
||||
quote: "Citează"
|
||||
emoji: "Emoji personalizat"
|
||||
search: "Caută"
|
||||
_theme:
|
||||
description: "Descriere"
|
||||
keys:
|
||||
mention: "Mențiune"
|
||||
renote: "Re-notează"
|
||||
divider: "Separator"
|
||||
_sfx:
|
||||
note: "Note"
|
||||
notification: "Notificări"
|
||||
chat: "Chat"
|
||||
_widgets:
|
||||
notifications: "Notificări"
|
||||
timeline: "Cronologie"
|
||||
activity: "Activitate"
|
||||
federation: "Federație"
|
||||
jobQueue: "coada de job-uri"
|
||||
_cw:
|
||||
show: "Incarcă mai mult"
|
||||
_visibility:
|
||||
home: "Acasă"
|
||||
followers: "Urmăritori"
|
||||
_profile:
|
||||
name: "Nume"
|
||||
username: "Nume de utilizator"
|
||||
_exportOrImport:
|
||||
followingList: "Urmărești"
|
||||
muteList: "Amuțește"
|
||||
blockingList: "Blochează"
|
||||
userLists: "Liste"
|
||||
_charts:
|
||||
federation: "Federație"
|
||||
_timelines:
|
||||
home: "Acasă"
|
||||
_pages:
|
||||
blocks:
|
||||
image: "Imagini"
|
||||
script:
|
||||
categories:
|
||||
list: "Liste"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Liste"
|
||||
_randomPick:
|
||||
arg1: "Liste"
|
||||
_dailyRandomPick:
|
||||
arg1: "Liste"
|
||||
_seedRandomPick:
|
||||
arg2: "Liste"
|
||||
_pick:
|
||||
arg1: "Liste"
|
||||
_listLen:
|
||||
arg1: "Liste"
|
||||
types:
|
||||
array: "Liste"
|
||||
_notification:
|
||||
youWereFollowed: "te-a urmărit"
|
||||
youWereInvitedToGroup: "Ai fost invitat într-un grup"
|
||||
_types:
|
||||
follow: "Urmărești"
|
||||
mention: "Mențiune"
|
||||
renote: "Re-notează"
|
||||
quote: "Citează"
|
||||
reaction: "Reacție"
|
||||
_actions:
|
||||
reply: "Răspunde"
|
||||
renote: "Re-notează"
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: "Notificări"
|
||||
tl: "Cronologie"
|
||||
antenna: "Antene"
|
||||
list: "Liste"
|
||||
mentions: "Mențiuni"
|
2150
locales/ru-RU.yml
Normal file
2150
locales/ru-RU.yml
Normal file
File diff suppressed because it is too large
Load diff
1828
locales/sk-SK.yml
Normal file
1828
locales/sk-SK.yml
Normal file
File diff suppressed because it is too large
Load diff
781
locales/sv-SE.yml
Normal file
781
locales/sv-SE.yml
Normal file
|
@ -0,0 +1,781 @@
|
|||
_lang_: "Svenska"
|
||||
headlineFirefish: "En öppen källkod och decentraliserad social media plattform som
|
||||
är gratis för all framtid! 🚀"
|
||||
introFirefish: "Välkommen! Firefish är en öppen och decentraliserad mikrobloggningstjänst.\n
|
||||
Skapa en \"not\" och dela dina tankar med alla runtomkring dig. 📡\nMed \"reaktioner\"\
|
||||
\ kan du snabbt uttrycka dina känslor kring andras noter.👍\nLåt oss utforska en
|
||||
nya värld!🚀"
|
||||
monthAndDay: "{day}/{month}"
|
||||
search: "Sök"
|
||||
notifications: "Notifikationer"
|
||||
username: "Användarnamn"
|
||||
password: "Lösenord"
|
||||
forgotPassword: "Glömt lösenord"
|
||||
fetchingAsApObject: "Hämtar från Fediversum"
|
||||
ok: "OK"
|
||||
gotIt: "Uppfattat!"
|
||||
cancel: "Avbryt"
|
||||
enterUsername: "Ange användarnamn"
|
||||
renotedBy: "Omnoterad av {user}"
|
||||
noNotes: "Inga noteringar"
|
||||
noNotifications: "Inga aviseringar"
|
||||
instance: "Server Instans"
|
||||
settings: "Inställningar"
|
||||
basicSettings: "Basinställningar"
|
||||
otherSettings: "Andra inställningar"
|
||||
openInWindow: "Öppna i ett fönster"
|
||||
profile: "Profil"
|
||||
timeline: "Tidslinje"
|
||||
noAccountDescription: "Användaren har inte skrivit en biografi än."
|
||||
login: "Logga in"
|
||||
loggingIn: "Loggar in"
|
||||
logout: "Logga ut"
|
||||
signup: "Registrera"
|
||||
uploading: "Uppladdning sker..."
|
||||
save: "Spara"
|
||||
users: "Användare"
|
||||
addUser: "Lägg till användare"
|
||||
favorite: "Lägg till i favoriter"
|
||||
favorites: "Favoriter"
|
||||
unfavorite: "Avfavorisera"
|
||||
favorited: "Tillagd i favoriter."
|
||||
alreadyFavorited: "Redan tillagd i favoriter."
|
||||
cantFavorite: "Gick inte att lägga till i favoriter."
|
||||
pin: "Fäst till profil"
|
||||
unpin: "Lossa från profil"
|
||||
copyContent: "Kopiera innehåll"
|
||||
copyLink: "Kopiera länk"
|
||||
delete: "Radera"
|
||||
deleteAndEdit: "Radera och ändra"
|
||||
deleteAndEditConfirm: "Är du säker att du vill radera denna not och ändra den? Du
|
||||
kommer förlora alla reaktioner, omnoteringar och svar till den."
|
||||
addToList: "Lägg till i lista"
|
||||
sendMessage: "Skicka ett meddelande"
|
||||
copyUsername: "Kopiera användarnamn"
|
||||
searchUser: "Sök användare"
|
||||
reply: "Svara"
|
||||
loadMore: "Ladda mer"
|
||||
showMore: "Visa mer"
|
||||
youGotNewFollower: "följde dig"
|
||||
receiveFollowRequest: "Följarförfrågan mottagen"
|
||||
followRequestAccepted: "Följarförfrågan accepterad"
|
||||
mention: "Nämn"
|
||||
mentions: "Omnämningar"
|
||||
directNotes: "Direktnoter"
|
||||
importAndExport: "Importera / Exportera"
|
||||
import: "Importera"
|
||||
export: "Exportera"
|
||||
files: "Filer"
|
||||
download: "Nedladdning"
|
||||
driveFileDeleteConfirm: "Är du säker att du vill radera filen \"{name}\"? Notera att
|
||||
denna kommer att bli raderad från alla poster som har den bifogad."
|
||||
unfollowConfirm: "Är du säker att du vill avfölja {name}?"
|
||||
exportRequested: "Du har begärt en export. Detta kan ta lite tid. Den kommer läggas
|
||||
till i din Drive när den blir klar."
|
||||
importRequested: "Du har begärt en import. Detta kan ta lite tid."
|
||||
lists: "Listor"
|
||||
noLists: "Du har inga listor"
|
||||
note: "Not"
|
||||
notes: "Noter"
|
||||
following: "Följer"
|
||||
followers: "Följare"
|
||||
followsYou: "Följer dig"
|
||||
createList: "Skapa lista"
|
||||
manageLists: "Hantera lista"
|
||||
error: "Fel"
|
||||
somethingHappened: "Ett fel har uppstått"
|
||||
retry: "Försök igen"
|
||||
pageLoadError: "Det gick inte att ladda sidan."
|
||||
pageLoadErrorDescription: "Detta händer oftast p.g.a. nätverksfel eller din webbläsarcache.
|
||||
Försök tömma din cache och testa sedan igen efter en liten stund."
|
||||
serverIsDead: "Servern svarar inte. Vänta ett litet tag och försök igen."
|
||||
youShouldUpgradeClient: "För att kunna se denna sida, vänligen ladda om sidan för
|
||||
att uppdatera din klient."
|
||||
enterListName: "Skriv ett namn till listan"
|
||||
privacy: "Integritet"
|
||||
makeFollowManuallyApprove: "Följarförfrågningar kräver manuellt godkännande"
|
||||
defaultNoteVisibility: "Standardsynlighet"
|
||||
follow: "Följ"
|
||||
followRequest: "Skicka följarförfrågan"
|
||||
followRequests: "Följarförfrågningar"
|
||||
unfollow: "Avfölj"
|
||||
followRequestPending: "Följarförfrågning avvaktar för svar"
|
||||
enterEmoji: "Skriv en emoji"
|
||||
renote: "Omnotera"
|
||||
unrenote: "Ta tillbaka omnotering"
|
||||
renoted: "Omnoterad."
|
||||
cantRenote: "Inlägget kunde inte bli omnoterat."
|
||||
cantReRenote: "En omnotering kan inte bli omnoterad."
|
||||
quote: "Citat"
|
||||
pinnedNote: "Fästad not"
|
||||
pinned: "Fäst till profil"
|
||||
you: "Du"
|
||||
clickToShow: "Klicka för att visa"
|
||||
sensitive: "Känsligt innehåll"
|
||||
add: "Lägg till"
|
||||
reaction: "Reaktioner"
|
||||
reactionSetting: "Reaktioner som ska visas i reaktionsväljaren"
|
||||
reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"\
|
||||
+\" för att lägga till."
|
||||
rememberNoteVisibility: "Komihåg notvisningsinställningar"
|
||||
attachCancel: "Ta bort bilaga"
|
||||
markAsSensitive: "Markera som känsligt innehåll"
|
||||
unmarkAsSensitive: "Avmarkera som känsligt innehåll"
|
||||
enterFileName: "Ange filnamn"
|
||||
mute: "Tysta"
|
||||
unmute: "Avtysta"
|
||||
block: "Blockera"
|
||||
unblock: "Avblockera"
|
||||
suspend: "Suspendera"
|
||||
unsuspend: "Ta bort suspenderingen"
|
||||
blockConfirm: "Är du säker att du vill blockera kontot?"
|
||||
unblockConfirm: "Är du säkert att du vill avblockera kontot?"
|
||||
suspendConfirm: "Är du säker att du vill suspendera detta konto?"
|
||||
unsuspendConfirm: "Är du säker att du vill avsuspendera detta konto?"
|
||||
selectList: "Välj lista"
|
||||
selectAntenna: "Välj en antenn"
|
||||
selectWidget: "Välj en widget"
|
||||
editWidgets: "Redigera widgets"
|
||||
editWidgetsExit: "Avsluta redigering"
|
||||
customEmojis: "Anpassa emoji"
|
||||
emoji: "Emoji"
|
||||
emojis: "Emoji"
|
||||
emojiName: "Emoji namn"
|
||||
emojiUrl: "Emoji länk"
|
||||
addEmoji: "Lägg till emoji"
|
||||
settingGuide: "Rekommenderade inställningar"
|
||||
cacheRemoteFiles: "Spara externa filer till cachen"
|
||||
cacheRemoteFilesDescription: "När denna inställning är avstängd kommer externa filer
|
||||
laddas direkt från den externa servern. Genom att stänga av detta kommer lagringsutrymme
|
||||
minska i användning men kommer öka datatrafiken eftersom miniatyrer inte kommer
|
||||
genereras."
|
||||
flagAsBot: "Markera konto som bot"
|
||||
flagAsBotDescription: "Aktivera det här alternativet om kontot är kontrollerat av
|
||||
ett program. Om aktiverat kommer den fungera som en flagga för andra utvecklare
|
||||
för att hindra ändlösa kedjor med andra bottar. Det kommer också få Firefish interna
|
||||
system att hantera kontot som en bot."
|
||||
flagAsCat: "Markera konto som katt"
|
||||
flagAsCatDescription: "Aktivera denna inställning för att markera kontot som en katt."
|
||||
flagShowTimelineReplies: "Visa svar i tidslinje"
|
||||
flagShowTimelineRepliesDescription: "Visar användarsvar till andra användares noter
|
||||
i tidslinjen om påslagen."
|
||||
autoAcceptFollowed: "Godkänn följarförfrågningar från användare du följer automatiskt"
|
||||
addAccount: "Lägg till konto"
|
||||
loginFailed: "Inloggningen misslyckades"
|
||||
showOnRemote: "Se på extern instans"
|
||||
general: "Allmänt"
|
||||
wallpaper: "Bakgrundsbild"
|
||||
setWallpaper: "Välj bakgrund"
|
||||
removeWallpaper: "Ta bort bakgrund"
|
||||
searchWith: "Sök: {q}"
|
||||
youHaveNoLists: "Du har inga listor"
|
||||
followConfirm: "Är du säker att du vill följa {name}?"
|
||||
proxyAccount: "Proxykonto"
|
||||
proxyAccountDescription: "Ett proxykonto är ett konto som agerar som en extern följare
|
||||
för användare under vissa villkor. Till exempel, när en användare lägger till en
|
||||
extern användare till en lista så kommer den externa användarens aktivitet inte
|
||||
levereras till instansen om ingen lokal användare följer det kontot, så proxykontot
|
||||
används istället."
|
||||
host: "Värd"
|
||||
selectUser: "Välj användare"
|
||||
recipient: "Mottagare"
|
||||
annotation: "Kommentarer"
|
||||
federation: "Federation"
|
||||
instances: "Servrar"
|
||||
registeredAt: "Registrerad på"
|
||||
latestRequestSentAt: "Senaste förfrågan skickad"
|
||||
latestRequestReceivedAt: "Senaste begäran mottagen"
|
||||
latestStatus: "Senaste status"
|
||||
storageUsage: "Använt lagringsutrymme"
|
||||
charts: "Diagram"
|
||||
perHour: "Per timme"
|
||||
perDay: "Per dag"
|
||||
stopActivityDelivery: "Sluta skicka aktiviteter"
|
||||
blockThisInstance: "Blockera denna server"
|
||||
operations: "Operationer"
|
||||
software: "Mjukvara"
|
||||
version: "Version"
|
||||
metadata: "Metadata"
|
||||
monitor: "Övervakning"
|
||||
jobQueue: "Jobbkö"
|
||||
cpuAndMemory: "CPU och minne"
|
||||
network: "Nätverk"
|
||||
disk: "Disk"
|
||||
instanceInfo: "Serverninformation"
|
||||
statistics: "Statistik"
|
||||
clearQueue: "Rensa kö"
|
||||
clearQueueConfirmTitle: "Är du säker att du vill rensa kön?"
|
||||
clearQueueConfirmText: "Om någon not är olevererad i kön kommer den inte federeras.
|
||||
Vanligtvis behövs inte denna handling."
|
||||
clearCachedFiles: "Rensa cache"
|
||||
clearCachedFilesConfirm: "Är du säker att du vill radera alla cachade externa filer?"
|
||||
blockedInstances: "Blockerade servrar"
|
||||
blockedInstancesDescription: "Lista adressnamn av servrar som du vill blockera. Listade
|
||||
servrarna kommer inte längre kommunicera med denna servern."
|
||||
muteAndBlock: "Tystningar och blockeringar"
|
||||
mutedUsers: "Tystade användare"
|
||||
blockedUsers: "Blockerade användare"
|
||||
noUsers: "Det finns inga användare"
|
||||
editProfile: "Redigera profil"
|
||||
noteDeleteConfirm: "Är du säker på att du vill ta bort denna not?"
|
||||
pinLimitExceeded: "Du kan inte fästa fler noter"
|
||||
intro: "Firefish har installerats! Vänligen skapa en adminanvändare."
|
||||
done: "Klar"
|
||||
processing: "Bearbetar"
|
||||
preview: "Förhandsvisning"
|
||||
default: "Standard"
|
||||
defaultValueIs: "Standard: {value}"
|
||||
noCustomEmojis: "Det finns ingen emoji"
|
||||
noJobs: "Det finns inga jobb"
|
||||
federating: "Federerar"
|
||||
blocked: "Blockerad"
|
||||
suspended: "Suspenderad"
|
||||
all: "Allt"
|
||||
subscribing: "Prenumererar"
|
||||
publishing: "Publiceras"
|
||||
notResponding: "Svarar inte"
|
||||
instanceFollowing: "Följer på server"
|
||||
instanceFollowers: "Följare av server"
|
||||
instanceUsers: "Användare av denna server"
|
||||
changePassword: "Ändra lösenord"
|
||||
security: "Säkerhet"
|
||||
retypedNotMatch: "Inmatningen matchar inte."
|
||||
currentPassword: "Nuvarande lösenord"
|
||||
newPassword: "Nytt lösenord"
|
||||
newPasswordRetype: "Bekräfta lösenord"
|
||||
attachFile: "Bifoga filer"
|
||||
more: "Mer!"
|
||||
featured: "Utvalda"
|
||||
usernameOrUserId: "Användarnamn eller användar-id"
|
||||
noSuchUser: "Kan inte hitta användaren"
|
||||
lookup: "Sökning"
|
||||
announcements: "Nyheter"
|
||||
imageUrl: "Bild-URL"
|
||||
remove: "Radera"
|
||||
removed: "Borttaget"
|
||||
removeAreYouSure: "Är du säker att du vill radera \"{x}\"?"
|
||||
deleteAreYouSure: "Är du säker att du vill radera \"{x}\"?"
|
||||
resetAreYouSure: "Vill du återställa?"
|
||||
saved: "Sparad"
|
||||
messaging: "Chatt"
|
||||
upload: "Ladda upp"
|
||||
keepOriginalUploading: "Behåll originalbild"
|
||||
nsfw: "Känsligt innehåll"
|
||||
pinnedNotes: "Fästad not"
|
||||
userList: "Listor"
|
||||
smtpHost: "Värd"
|
||||
smtpUser: "Användarnamn"
|
||||
smtpPass: "Lösenord"
|
||||
clearCache: "Rensa cache"
|
||||
user: "Användare"
|
||||
file: "Filer"
|
||||
_email:
|
||||
_follow:
|
||||
title: "följde dig"
|
||||
_mfm:
|
||||
mention: "Nämn"
|
||||
quote: "Citat"
|
||||
emoji: "Anpassa emoji"
|
||||
search: "Sök"
|
||||
_theme:
|
||||
keys:
|
||||
mention: "Nämn"
|
||||
renote: "Omnotera"
|
||||
_sfx:
|
||||
note: "Noter"
|
||||
notification: "Notifikationer"
|
||||
chat: "Chatt"
|
||||
_widgets:
|
||||
notifications: "Notifikationer"
|
||||
timeline: "Tidslinje"
|
||||
federation: "Federation"
|
||||
jobQueue: "Jobbkö"
|
||||
_cw:
|
||||
show: "Ladda mer"
|
||||
_visibility:
|
||||
followers: "Följare"
|
||||
_profile:
|
||||
username: "Användarnamn"
|
||||
_exportOrImport:
|
||||
followingList: "Följer"
|
||||
muteList: "Tysta"
|
||||
blockingList: "Blockera"
|
||||
userLists: "Listor"
|
||||
_charts:
|
||||
federation: "Federation"
|
||||
_pages:
|
||||
script:
|
||||
categories:
|
||||
list: "Listor"
|
||||
blocks:
|
||||
_join:
|
||||
arg1: "Listor"
|
||||
_randomPick:
|
||||
arg1: "Listor"
|
||||
_dailyRandomPick:
|
||||
arg1: "Listor"
|
||||
_seedRandomPick:
|
||||
arg2: "Listor"
|
||||
_pick:
|
||||
arg1: "Listor"
|
||||
_listLen:
|
||||
arg1: "Listor"
|
||||
types:
|
||||
array: "Listor"
|
||||
_notification:
|
||||
youWereFollowed: "följde dig"
|
||||
_types:
|
||||
follow: "Följer"
|
||||
mention: "Nämn"
|
||||
renote: "Omnotera"
|
||||
quote: "Citat"
|
||||
reaction: "Reaktioner"
|
||||
_actions:
|
||||
reply: "Svara"
|
||||
renote: "Omnotera"
|
||||
_deck:
|
||||
_columns:
|
||||
notifications: "Notifikationer"
|
||||
tl: "Tidslinje"
|
||||
list: "Listor"
|
||||
mentions: "Omnämningar"
|
||||
removeReaction: Radera från dina reaktioner
|
||||
renoteMute: Tysta boostningar
|
||||
renoteUnmute: Ljuda boostningar
|
||||
flagSpeakAsCat: Prata som en katt
|
||||
noInstances: Det finns inga servrar
|
||||
keepOriginalUploadingDescription: Sparar originalen av uppladdade bilder som de är.
|
||||
Om avstängt, kommer en ny version genererad vid uppladdning.
|
||||
fromUrl: från URL
|
||||
explore: Utforska
|
||||
messageRead: Läs
|
||||
noMoreHistory: Det finns ingen framtida historik
|
||||
startMessaging: Starta en ny chatt
|
||||
agreeTo: Jag accepterar till {0}
|
||||
drive: Enhet
|
||||
fileName: Filnamn
|
||||
inputNewDescription: Ange en ny benämning
|
||||
inputNewFolderName: Ange ett nytt mappnamn
|
||||
hasChildFilesOrFolders: Eftersom denna mappen inte är tom, kan den inte bli raderad.
|
||||
copyUrl: Kopiera URL
|
||||
watch: Bevaka
|
||||
thisMonth: Månad
|
||||
today: Idag
|
||||
dayX: '{day}'
|
||||
monthX: '{month}'
|
||||
yearX: '{year}'
|
||||
enableLocalTimeline: Anslut till lokal tidslinje
|
||||
invite: Bjud in
|
||||
driveCapacityPerLocalAccount: Enhetens kapacitet per lokal användare
|
||||
inMb: I megabyte
|
||||
pinnedPagesDescription: Ange sökväg till sidor som du vill fästa på topp av sidorna
|
||||
på denna server, separerade av sidbrytningar.
|
||||
hcaptcha: hCaptcha
|
||||
antennasDesc: "Antenner visar nya poster som matchar de kriterier som du anger\nDe
|
||||
kan nås från sidlinje sidan."
|
||||
unsilenceConfirm: Är du säker på att du vill ångra tystningen av denna användare?
|
||||
securityKey: Säkerhetsnyckel
|
||||
markAsReadAllNotifications: Markera alla notifikationer som lästa
|
||||
quoteQuestion: Lägg till som en citering?
|
||||
noMessagesYet: Inga meddelande ännu
|
||||
newMessageExists: Det finns inga nya meddelanden
|
||||
weakPassword: Svagt lösenord
|
||||
normalPassword: Dugligt lösenord
|
||||
veryStrongPassword: Starkt lösenord
|
||||
passwordMatched: Matchar
|
||||
passwordNotMatched: Matchar inte
|
||||
signinWith: Logga in med {x}
|
||||
disableAnimatedMfm: Inaktivera MFM med animering
|
||||
noFollowRequests: Du har inte några väntande följbekräftelser
|
||||
clientSettings: Klientinställningar
|
||||
promote: Befordra
|
||||
numberOfDays: Antalet dagar
|
||||
objectStorageUseSSL: Använd SSL
|
||||
objectStorageUseSSLDesc: Stäng av detta om du inte kommer använda HTTPS för API anslutningar
|
||||
recentUsed: Senast använd
|
||||
nothing: Det finns inget att visa här
|
||||
lastUsedDate: Senaste använd vid
|
||||
state: Stat
|
||||
disablePagesScript: Inaktivera AiScript på sidor
|
||||
expandOnNoteClick: Öppna post vid klick
|
||||
updateRemoteUser: Uppdatera fjärranvändarinformation
|
||||
deleteAllFiles: Radera alla filer
|
||||
userSuspended: Denna användare har blivit avstängd.
|
||||
inboxUrl: Inbox URL
|
||||
serviceworkerInfo: Måste vara aktiverat för push-notifikationer.
|
||||
deletedNote: Radera poster
|
||||
expandTweet: Expandera tweet
|
||||
themeEditor: Thema redigerare
|
||||
describeFile: Lägg till bildtext
|
||||
enterFileDescription: Beskriv bildtext
|
||||
manage: Hantering
|
||||
useBlurEffectForModal: Använd oskärpa effekter för modeller
|
||||
width: Bredd
|
||||
small: Liten
|
||||
disableAll: Inaktivera alla
|
||||
tokenRequested: Tillåt tillgång till konto
|
||||
channelFederationWarn: Kanalerna federeras inte till andra servrar ännu
|
||||
manageGroups: Hantera grupper
|
||||
tos: Användarvillkor
|
||||
start: Starta
|
||||
home: Hem
|
||||
activity: Aktivitet
|
||||
themeForDarkMode: Teman som används i Mörkt läge
|
||||
maintainerEmail: Underhållare e-post
|
||||
enableHcaptcha: Aktivera hCaptcha
|
||||
hcaptchaSiteKey: Sidnyckel
|
||||
recaptchaSecretKey: Hemlig nyckel
|
||||
withFiles: Inkludera filer
|
||||
popularTags: Populära taggar
|
||||
notFound: Kan inte hittas
|
||||
uploadFolder: Standardmappar för uppladdning
|
||||
retype: Ange igen
|
||||
next: Nästa
|
||||
checking: Kontrollerar...
|
||||
or: Eller
|
||||
groupInvited: Du har blivit inbjuden till en grupp
|
||||
docSource: Källa till detta dokument
|
||||
createAccount: Skapa konto
|
||||
total: Total
|
||||
objectStorage: Objektlagring
|
||||
objectStorageRegion: Region
|
||||
objectStorageUseProxy: Anslut över Proxy
|
||||
objectStorageUseProxyDesc: Stäng av detta om du inte kommer använde en Proxy för API
|
||||
anslutningar
|
||||
sounds: Ljud
|
||||
details: Detaljer
|
||||
installedApps: Auktoriserade applikationer
|
||||
installedDate: Auktoriserad vid
|
||||
script: Skript
|
||||
removeAllFollowingDescription: Körning av detta kommer sluta följa alla konton från
|
||||
{host}. Vänligen kör detta om servern t.ex. inte längre existerar.
|
||||
userSilenced: Denna användare har blivit tystnad.
|
||||
visibility: Synlighet
|
||||
delayed: Fördröjning
|
||||
useGlobalSetting: Använd globala inställningar
|
||||
selectInstance: Välj en server
|
||||
instanceName: Servernamn
|
||||
searchPlaceholder: Sök Firefish
|
||||
noThankYou: Nej tack
|
||||
jumpToPrevious: Hoppa till föregående
|
||||
listsDesc: Listor låter dig skapa en tidlinje med specificerade användare. Dessa kan
|
||||
sedan bli nådda från tidlinje sidan.
|
||||
flagSpeakAsCatDescription: Dina poster kommer ge en nyans som om du är i katt-läge
|
||||
silencedInstances: Tystade instanser
|
||||
hiddenTags: Dolda Hashtaggar
|
||||
silenced: Tystad
|
||||
nUsersRead: Läs med {n}
|
||||
themeForLightMode: Teman som används i Ljust Läge
|
||||
light: Ljus
|
||||
recaptcha: reCAPTCHA
|
||||
enableRecaptcha: Aktivera reCAPTCHA
|
||||
help: Hjälp
|
||||
groupName: Gruppnamn
|
||||
name: Namn
|
||||
resetPassword: Återställ lösenord
|
||||
newPasswordIs: Ditt nya lösenord är "{password}"
|
||||
cacheClear: Rensa cache
|
||||
markAsReadAllTalkMessages: Markera alla meddelanden som lästa
|
||||
uiLanguage: Användargränssnitt
|
||||
disableDrawer: Använd inte byrålådor-stil menyer
|
||||
tapSecurityKey: Klicka in din säkerhetsnyckel
|
||||
language: Språk
|
||||
objectStorageRegionDesc: Ange en region som 'xx-east-1'. Om du anger din tjänst som
|
||||
inte skiljer mellan regioner, lämna detta blankt eller ange som 'us-east-1'.
|
||||
objectStorageSetPublicRead: Ställ in "public-read" vid uppladdningar
|
||||
scratchpadDescription: Scratchpaden tillgängliggör en miljö för AiScript experiment.
|
||||
Du kan skriva, köra och checka ut resultaten från den när du interagerar med Firefish.
|
||||
yourAccountSuspendedDescription: Detta kontot har blivit avstängt eftersom det bröt
|
||||
mot serverns användaravtal eller liknande. Vänligen kontakta administratörer om
|
||||
du vill veta mer detaljerade anledningar. Vänligen skapa inte ett nytt konto.
|
||||
divider: Fördelare
|
||||
addItem: Lägg till artikel
|
||||
poll: Opinionsundersökning
|
||||
useCw: Dölj innehåll
|
||||
enablePlayer: Öppna videospelare
|
||||
disablePlayer: Stäng videospelare
|
||||
description: Beskrivning
|
||||
author: Författare
|
||||
accessibility: Tillgänglighet
|
||||
useObjectStorage: Använd objektlagring
|
||||
objectStorageBaseUrl: Grundläggande URL
|
||||
deleteAllFilesConfirm: Är du säker på att du vill radera alla filer?
|
||||
menu: Meny
|
||||
regexpError: Regular expression fel
|
||||
wordMute: Ord tystning
|
||||
regexpErrorDescription: 'Ett fel skedde vid regular expression på linje {line} av
|
||||
dina {tab} ord tystningar:'
|
||||
instanceMute: Server tystningar
|
||||
userSaysSomething: '{name} sa något'
|
||||
userSaysSomethingReason: '{name} sade {reason}'
|
||||
makeActive: Aktivera
|
||||
notificationSettingDesc: Välj typerna av notifieringsinställningarna att visa.
|
||||
fromDrive: Från Enhet
|
||||
uploadFromUrlMayTakeTime: Det kan ta en tid innan uppladdningen är slutförd.
|
||||
uploadFromUrlRequested: Uppladdning som förfrågat
|
||||
unwatch: Sluta bevaka
|
||||
enableRecommendedTimeline: Aktivera rekommenderad tidslinje
|
||||
showLess: Stäng
|
||||
regenerate: Återskapa
|
||||
promotion: Befordrad
|
||||
doNothing: Ignorera
|
||||
thisYear: År
|
||||
manageAntennas: Hantera Antenner
|
||||
deleted: Raderad
|
||||
editNote: Redigera anteckning
|
||||
edited: Redigerad vid {date} {time}
|
||||
syncDeviceDarkMode: Synkronisera mörkt läge med dina enhetsinställningar
|
||||
dayOverDayChanges: Ändringar från igår
|
||||
selectChannel: Välj en kanal
|
||||
lightThemes: Ljusa teman
|
||||
dark: Mörk
|
||||
inputNewFileName: Ange ett nytt filnamn
|
||||
whenServerDisconnected: När den tappar uppkopplingen till servern
|
||||
disconnectedFromServer: Anslutning till server har tappats
|
||||
iconUrl: Ikon URL
|
||||
bannerUrl: Banner bild URL
|
||||
hcaptchaSecretKey: Hemlig nyckel
|
||||
onlyOneFileCanBeAttached: Du kan endast ange en bilaga till ett meddelande
|
||||
signinFailed: Kan inte logga in. Ange korrekt användarnamn och lösenord.
|
||||
notesAndReplies: Poster och svar
|
||||
token: Token
|
||||
twoStepAuthentication: Två-faktor-autentisering
|
||||
antennaInstancesDescription: Lista en servervärd per linje
|
||||
moderator: Moderator
|
||||
moderation: Moderering
|
||||
chooseEmoji: Välj en emoji
|
||||
unableToProcess: Operationen kunde inte slutföras
|
||||
output: Output
|
||||
expandOnNoteClickDesc: Om inaktiverad, kan du öppna posten vid högerklicksmenyn eller
|
||||
genom att klicka på tidsstämpeln.
|
||||
aboutFirefish: Om Firefish
|
||||
older: Äldre
|
||||
hiddenTagsDescription: 'Lista hashtaggar (utan # symbolen) för de hashtaggar du vill
|
||||
dölja från trendande och utforska. Dolda hashtaggar kan fortfarande hittas via andra
|
||||
funktioner.'
|
||||
darkThemes: Mörka teman
|
||||
images: Bilder
|
||||
selectFiles: Välj filer
|
||||
renameFile: Byt namn på fil
|
||||
folderName: Filnamn
|
||||
createFolder: Skapa en mapp
|
||||
renameFolder: Byt namn på denna mapp
|
||||
emptyDrive: Din enhet är tom
|
||||
emptyFolder: Denna mapp är tom
|
||||
unableToDelete: Kan inte radera
|
||||
rename: Byt namn
|
||||
deleteFolder: Radera denna mapp
|
||||
addFile: Lägg till en fil
|
||||
banner: Banner
|
||||
reload: Uppdatera
|
||||
reloadConfirm: Vill du uppdatera din tidslinje?
|
||||
accept: Acceptera
|
||||
tosUrl: Användarvillkor URL
|
||||
pages: Sidor
|
||||
disablingTimelinesInfo: Administratörer och moderatorer har alltid tillgång till alla
|
||||
tidslinjer, även om de inte är aktiverade.
|
||||
registration: Registrera
|
||||
enableRegistration: Aktivera ny användarregistrering
|
||||
driveCapacityPerRemoteAccount: Enhetskapacitet per extern användare
|
||||
enableGlobalTimeline: Aktivera global tidslinje
|
||||
antennaSource: Antennkällor
|
||||
notifyAntenna: Informera vid nya poster
|
||||
withFileAntenna: Ange poster med filer
|
||||
exploreFediverse: Upptäck ett fidiverse
|
||||
markAsReadAllUnreadNotes: Markera alla poster som lästa
|
||||
inputMessageHere: Ange meddelande här
|
||||
members: Medlemmar
|
||||
available: Tillgänglig
|
||||
usernameInvalidFormat: Du kan ange versaler eller gemener, nummer och underskrifter.
|
||||
tooLong: För lång
|
||||
joinOrCreateGroup: Bli inbjuden till en grupp eller skapa en egen.
|
||||
doing: Bearbetar...
|
||||
youHaveNoGroups: Du har inga grupper
|
||||
aboutX: Om {x}
|
||||
existingAccount: Existerande konto
|
||||
install: Installera
|
||||
uninstall: Avinstallera
|
||||
sort: Sortera
|
||||
ascendingOrder: Stigande
|
||||
leaveConfirm: Ändringar har inte sparats. Vill du kasta dem?
|
||||
plugins: Plugin
|
||||
preferencesBackups: Backup av inställningar
|
||||
enableEmail: Aktivera epost distribuering
|
||||
smtpSecure: Använd strikt SSL/TLS vid SMTP anslutningar
|
||||
smtpSecureInfo: Stäng av detta vid användning av STARTTLS
|
||||
testEmail: Test av epost leverans
|
||||
userSaysSomethingReasonReply: '{name} svarade på en post innehållande {reason}'
|
||||
userSaysSomethingReasonRenote: '{name} boosted en post innehållande {reason}'
|
||||
userSaysSomethingReasonQuote: '{name} citerade en post innehållande {reason}'
|
||||
logs: Loggar
|
||||
database: Databas
|
||||
channel: Kanaler
|
||||
create: Skapa
|
||||
notificationSetting: Notisinställningar
|
||||
objectStorageS3ForcePathStyle: Använd filmapp-baserade slutpunkter för URL:er
|
||||
newNoteRecived: Det finns nya poster
|
||||
deck: Däck
|
||||
undeck: Lämna däck
|
||||
large: Stor
|
||||
newer: Nyare
|
||||
silenceThisInstance: Tysta denna instans
|
||||
silencedInstancesDescription: Lista värdnamn på server som du vill tysta. Konton på
|
||||
listade instanser behandlas som om de är "Tystade", de kan endast göra följbekräftelser
|
||||
och kan inte nämna lokala konton som inte följs. Detta påverkar inte blockerade
|
||||
instanser.
|
||||
uploadFromUrl: Uppladdad från URL
|
||||
birthday: Födelsedag
|
||||
theme: Teman
|
||||
avatar: Avatar
|
||||
uploadFromUrlDescription: URL av filen som du vill ladda upp
|
||||
remoteUserCaution: Informationen från en avlägsen användare kan inte slutföras.
|
||||
yearsOld: '{age} år gammal'
|
||||
location: Plats
|
||||
selectFile: Välj en fil
|
||||
registeredDate: Registrerade på
|
||||
selectFolder: Välj en mapp
|
||||
circularReferenceFolder: Destinationsmappen är en undermapp till mappen som du försöker
|
||||
flytta.
|
||||
instanceDescription: Serverbeskrivning
|
||||
selectFolders: Välj mappar
|
||||
reject: Neka
|
||||
normal: Normal
|
||||
withReplies: Inkludera svar
|
||||
registerSecurityKey: Registrera en säkerhetsnyckel
|
||||
enableServiceworker: Aktivera push-notifikationer för din webbläsare
|
||||
maintainerName: Underhållare
|
||||
pinnedPages: Fästa sidor
|
||||
basicInfo: Grundläggande info
|
||||
pinnedUsers: Pinnade användare
|
||||
backgroundImageUrl: Bakgrundsbild URL
|
||||
pinnedUsersDescription: Lista användarnamn separerade med radbrytning att bli fäst
|
||||
i "Utforska" fliken.
|
||||
recaptchaSiteKey: Sid nyckel
|
||||
pinnedClipId: ID av klippet du vill fästa
|
||||
avoidMultiCaptchaConfirm: Användning av flera Captcha system kan orsaka problem. Vill
|
||||
du inaktivera andra Captcha system som är aktiverade i nuläget? Om du vill att de
|
||||
ska fortsätta vara inaktiverade, tryck ångra.
|
||||
antennas: Antenner
|
||||
antennaKeywords: Nyckelord att följa
|
||||
antennaExcludeKeywords: Nyckelord att exkludera
|
||||
antennaKeywordsDescription: Separera med mellanrum för ett OCH villkor eller med sidbrytning
|
||||
för ett ELLER villkor.
|
||||
caseSensitive: Skiftlägeskänsliga
|
||||
recentlyDiscoveredUsers: Senaste upptäckta användare
|
||||
antennaUsersDescription: Lista ett användarnamn per linje
|
||||
silenceConfirm: Är du säker att du vill tysta denna användare?
|
||||
connectedTo: Följande konton är anslutna
|
||||
unsilence: Ångra tystning
|
||||
recentlyRegisteredUsers: Senaste användare
|
||||
exploreUsersCount: Det finns {count} användare
|
||||
silence: Tysta
|
||||
popularUsers: Populära användare
|
||||
recentlyUpdatedUsers: Senaste aktiva användare
|
||||
administrator: Administratör
|
||||
passwordLessLogin: Lösenordslös-inloggning
|
||||
about: Om
|
||||
nUsersMentioned: Benämnd av {n} användare
|
||||
securityKeyName: Nyckelnamn
|
||||
share: Dela
|
||||
reduceUiAnimation: Minska UI animeringar
|
||||
notFoundDescription: Ingen sida som korresponderar med denna URL kunde hittas.
|
||||
close: Stäng
|
||||
group: Grupp
|
||||
transfer: Överför
|
||||
category: Kategori
|
||||
createGroup: Skapa en grupp
|
||||
ownedGroups: Ägda grupper
|
||||
invites: Inbjudningar
|
||||
groups: Grupper
|
||||
title: Titel
|
||||
joinedGroups: Deltagande grupper
|
||||
tooShort: För kort
|
||||
signinHistory: Inloggningshistorik
|
||||
enable: Aktivera
|
||||
text: Text
|
||||
inviteToGroup: Bjud in till grupp
|
||||
quoteAttached: Citera
|
||||
messagingWithUser: Privatchatt
|
||||
messagingWithGroup: Gruppchatt
|
||||
invitationCode: Inbjudningskod
|
||||
noteOf: Postad av {user}
|
||||
unavailable: Inte tillgänglig
|
||||
invitations: Inbjudningar
|
||||
useOsNativeEmojis: Använd operativsystemets lokala emojis
|
||||
noHistory: Historik saknas
|
||||
tags: Taggar
|
||||
openImageInNewTab: Öppna bilder i ny flik
|
||||
fontSize: Teckenstorlek
|
||||
dashboard: Användargränssnitt
|
||||
weekOverWeekChanges: Ändringar till föregående vecka
|
||||
appearance: Utseende
|
||||
accountSettings: Kontoinställningar
|
||||
objectStorageBaseUrlDesc: "Denna URL används som referens. Ange URL för din CDN eller
|
||||
Proxy om du använder någon.\nFör S3 använd 'https://<bucket>.s3.amazonaws.com' och
|
||||
för GCS eller likvärdig tjänst använd 'https://storage.googleapis.com/<bucket>',
|
||||
m.m."
|
||||
objectStorageEndpointDesc: Lämna denna tom om du använder AWS S3, annars ange slutpunkten
|
||||
som '<host>' eller '<host>:<port>', beroende på tjänsten som du använder.
|
||||
objectStorageS3ForcePathStyleDesc: Aktivera detta vid konstruering av slutpunkter
|
||||
i URL som är i format för 's3.amazonaws.com/<bucket>/' vid '<bucket>.s3.amazonaws.com'.
|
||||
popout: Poppa-ut
|
||||
showFixedPostForm: Visa postens form vid toppen av tidslinjen
|
||||
listen: Lystna
|
||||
none: Inga
|
||||
showInPage: Visa på sida
|
||||
masterVolume: Huvudvolym
|
||||
volume: Volym
|
||||
descendingOrder: Nedåtgående
|
||||
scratchpad: Scratchpad
|
||||
yourAccountSuspendedTitle: Detta kontot har blivit avstängt
|
||||
email: Epost
|
||||
relays: Reläer
|
||||
invisibleNote: Osynliga poster
|
||||
addRelay: Lägg till relä
|
||||
enableInfiniteScroll: Ladda fler automatiskt
|
||||
edit: Redigera
|
||||
useFullReactionPicker: Använd full-storlek för reaktionsväljaren
|
||||
notificationType: Notifieringstyp
|
||||
pluginTokenRequestedDescription: Detta plugin kommer använda tillgänglighet inställd
|
||||
här.
|
||||
generateAccessToken: Generera tillgångstoken
|
||||
permission: Tillstånd
|
||||
smtpConfig: SMPT server inställningar
|
||||
emailServer: Epost server
|
||||
emailConfigInfo: Används för att bekräfta din epost vid registrering om du glömmer
|
||||
till lösenord
|
||||
emptyToDisableSmtpAuth: Lämna användarnamn och lösenord tomt vid inaktivering av SMTP
|
||||
verifiering
|
||||
emailAddress: Epost adress
|
||||
smtpPort: Port
|
||||
metrics: Metrik
|
||||
display: Visa
|
||||
copy: Kopiera
|
||||
overview: Översikt
|
||||
lastUsed: Senast använd
|
||||
unregister: Avregistrera
|
||||
addInstance: Lägg till server
|
||||
objectStorageBucketDesc: Vänligen ange hink-namn som du använder som din leverantör.
|
||||
accountMoved: 'Användaren har flyttat till ett nytt konto:'
|
||||
hideThisNote: Dölj denna post
|
||||
showFeaturedNotesInTimeline: Visa presenterade poster i tidslinjen
|
||||
objectStorageBucket: Hink
|
||||
objectStoragePrefix: Prefix
|
||||
local: Lokal
|
||||
remote: Avlägsen
|
||||
objectStoragePrefixDesc: Filer som lagras under mappar kommer använda detta prefix.
|
||||
objectStorageEndpoint: Slutpunkt
|
||||
addedRelays: Tillagda reläer
|
||||
height: Höjd
|
||||
enableAll: Tillåt alla
|
||||
cw: Innehållsvarning
|
||||
enableEmojiReactions: Aktivera emoji reaktioner
|
||||
showEmojisInReactionNotifications: Visa emojis i reaktion notifikationer
|
||||
signinRequired: Vänligen registrera eller logga in innan du fortsätter
|
||||
serverLogs: Serverloggar
|
||||
deleteAll: Radera alla
|
||||
removeAllFollowing: Sluta följa alla följda användare
|
||||
medium: Mellan
|
||||
xl: XL
|
||||
desktop: Skrivbord
|
||||
createNew: Skapa nya
|
1411
locales/th-TH.yml
Normal file
1411
locales/th-TH.yml
Normal file
File diff suppressed because it is too large
Load diff
2130
locales/tr-TR.yml
Normal file
2130
locales/tr-TR.yml
Normal file
File diff suppressed because it is too large
Load diff
5
locales/ug-CN.yml
Normal file
5
locales/ug-CN.yml
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
_lang_: "ياپونچە"
|
||||
search: "ئىزدەش"
|
||||
_mfm:
|
||||
search: "ئىزدەش"
|
Some files were not shown because too many files have changed in this diff Show more
Reference in a new issue