🎉 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:
naskya 2024-07-28 23:40:22 +00:00 committed by HidemaruOwO
commit d096da02e6
2161 changed files with 286465 additions and 0 deletions

13
.config/LICENSE Normal file
View 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
View 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
View 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
View file

@ -0,0 +1,4 @@
# db settings
POSTGRES_PASSWORD=test
POSTGRES_USER=postgres
POSTGRES_DB=postgres

View 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
View 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.

View 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
View 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
View 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
View 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
View 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
View 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

View 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!
-->

View 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!
-->

View 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!
-->

View 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!
-->

View 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> -->

View 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
View 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
View 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
View file

@ -0,0 +1,3 @@
[weblate]
url = https://hosted.weblate.org/api/
translation = firefish/locales

136
CODE_OF_CONDUCT.md Normal file
View 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
View 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:
[![Translation status](https://hosted.weblate.org/widgets/firefish/-/287x66-grey.png)](https://hosted.weblate.org/engage/firefish/)
[![Translation bars](https://hosted.weblate.org/widgets/firefish/-/multi-auto.svg)](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
View 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

File diff suppressed because it is too large Load diff

64
Cargo.toml Normal file
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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
View file

@ -0,0 +1,2 @@
target-msrv/
target-miri/

3
ci/cargo/config.toml Normal file
View 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
View 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.

Binary file not shown.

After

Width:  |  Height:  |  Size: 41 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

View 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
View 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
View file

4
dev/config.example.env Normal file
View file

@ -0,0 +1,4 @@
COMPOSE='podman-compose'
POSTGRES_PASSWORD=password
POSTGRES_USER=firefish
POSTGRES_DB=firefish_db

View 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:

View 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
View 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

View 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

View file

@ -0,0 +1 @@
CREATE EXTENSION pgroonga;

34
dev/docs/container.md Normal file
View 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
View 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
```

View 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
```

View 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

View 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 actors 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
View 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 Iceshrimps.
- :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
View 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
View 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 dont 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
View 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
View 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
View 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
View 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
View 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
View 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
View 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

File diff suppressed because it is too large Load diff

958
locales/bg-BG.yml Normal file
View 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

File diff suppressed because it is too large Load diff

2329
locales/ca-ES.yml Normal file

File diff suppressed because it is too large Load diff

1008
locales/cs-CZ.yml Normal file

File diff suppressed because it is too large Load diff

236
locales/da-DK.yml Normal file
View 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

File diff suppressed because it is too large Load diff

815
locales/el-GR.yml Normal file
View 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

File diff suppressed because it is too large Load diff

11
locales/eo.yml Normal file
View 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

File diff suppressed because it is too large Load diff

966
locales/fi.yml Normal file
View 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

File diff suppressed because it is too large Load diff

378
locales/gl.yml Normal file
View 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
View file

@ -0,0 +1,3 @@
_lang_: "हिन्दी"
headlineFirefish: एक ओपन सोर्स , डिसेंट्रलाइज़्ड सोशल मीडिया प्लेटफ़ॉर्म जो हमेशा के
लिए मुफ़्त है! 🚀

1
locales/hu.yml Normal file
View file

@ -0,0 +1 @@
_lang_: "Magyar nyelv"

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
View file

@ -0,0 +1,3 @@
declare const locales: { [lang: string]: any };
export = locales;

90
locales/index.mjs Normal file
View 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

File diff suppressed because it is too large Load diff

2092
locales/ja-JP.yml Normal file

File diff suppressed because it is too large Load diff

1467
locales/ja-KS.yml Normal file

File diff suppressed because it is too large Load diff

124
locales/kab.yml Normal file
View 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
View 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

File diff suppressed because it is too large Load diff

709
locales/nl-NL.yml Normal file
View 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

File diff suppressed because it is too large Load diff

2031
locales/pl-PL.yml Normal file

File diff suppressed because it is too large Load diff

254
locales/pt-BR.yml Normal file
View 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
View 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
View 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

File diff suppressed because it is too large Load diff

1828
locales/sk-SK.yml Normal file

File diff suppressed because it is too large Load diff

781
locales/sv-SE.yml Normal file
View 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

File diff suppressed because it is too large Load diff

2130
locales/tr-TR.yml Normal file

File diff suppressed because it is too large Load diff

5
locales/ug-CN.yml Normal file
View 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