Merge branch 'develop' into container/alpine-based-image

This commit is contained in:
naskya 2024-03-23 21:55:17 +09:00
commit f6ee3b0550
No known key found for this signature in database
GPG key ID: 712D413B3A9FED5C
675 changed files with 8137 additions and 8478 deletions

View file

@ -1,38 +1,28 @@
url: http://localhost:3000 url: http://localhost:3030
port: 3000 port: 3030
db: db:
host: 127.0.0.1 host: firefish_db
port: 5432 port: 5432
db: firefish db: firefish_db
user: firefish user: firefish
pass: firefish pass: password
redis: redis:
host: localhost host: firefish_redis
port: 6379 port: 6379
family: 4
#sonic:
# host: localhost
# port: 1491
# auth: SecretPassword
# collection: notes
# bucket: default
#elasticsearch:
# host: localhost
# port: 9200
# ssl: false
# user:
# pass:
id: 'aid' id: 'aid'
reservedUsernames: #allowedPrivateNetworks: [
- root # '10.69.1.0/24'
- admin #]
- administrator
- me logLevel: [
- system 'error',
'success',
'warning',
'debug',
'info'
]

View file

@ -41,11 +41,11 @@ db:
port: 5432 port: 5432
#ssl: false #ssl: false
# Database name # Database name
db: firefish db: firefish_db
# Auth # Auth
user: example-firefish-user user: firefish
pass: example-firefish-pass pass: password
# Whether disable Caching queries # Whether disable Caching queries
#disableCache: true #disableCache: true
@ -85,28 +85,6 @@ redis:
#prefix: example-prefix #prefix: example-prefix
#db: 1 #db: 1
# Please configure either MeiliSearch *or* Sonic.
# If both MeiliSearch and Sonic configurations are present, MeiliSearch will take precedence.
# ┌───────────────────────────┐
#───┘ MeiliSearch configuration └─────────────────────────────────────
#meilisearch:
# host: meilisearch
# port: 7700
# ssl: false
# apiKey:
# ┌─────────────────────┐
#───┘ Sonic configuration └─────────────────────────────────────
#sonic:
# host: localhost
# port: 1491
# auth: SecretPassword
# collection: notes
# bucket: default
# ┌───────────────┐ # ┌───────────────┐
#───┘ ID generation └─────────────────────────────────────────── #───┘ ID generation └───────────────────────────────────────────
@ -203,9 +181,6 @@ logLevel: [
# Proxy remote files (default: false) # Proxy remote files (default: false)
#proxyRemoteFiles: true #proxyRemoteFiles: true
# Use authorized fetch for outgoing requests
signToActivityPubGet: true
#allowedPrivateNetworks: [ #allowedPrivateNetworks: [
# '127.0.0.1/32' # '127.0.0.1/32'
#] #]

View file

@ -45,8 +45,6 @@ docker-compose.yml
docker-compose.example.yml docker-compose.example.yml
firefish.apache.conf firefish.apache.conf
firefish.nginx.conf firefish.nginx.conf
flake.lock
flake.nix
title.svg title.svg
/.gitlab /.gitlab
/chart /chart

4
.envrc
View file

@ -1,4 +0,0 @@
if ! has nix_direnv_version || ! nix_direnv_version 2.3.0; then
source_url "https://raw.githubusercontent.com/nix-community/nix-direnv/2.3.0/direnvrc" "sha256-Dmd+j63L84wuzgyjITIfSxSD57Tx7v51DMxVZOsiUD8="
fi
use flake . --impure

12
.gitignore vendored
View file

@ -29,7 +29,8 @@ coverage
!/.config/docker_ci.env !/.config/docker_ci.env
!/.config/helm_values_example.yml !/.config/helm_values_example.yml
!/.config/LICENSE !/.config/LICENSE
docker-compose.yml /docker-compose.yml
/custom
# ESLint # ESLint
.eslintcache .eslintcache
@ -59,6 +60,11 @@ packages/backend/assets/LICENSE
packages/megalodon/lib packages/megalodon/lib
packages/megalodon/.idea packages/megalodon/.idea
dev/container/firefish
dev/container/db
dev/container/redis
dev/config.env
# blender backups # blender backups
*.blend1 *.blend1
*.blend2 *.blend2
@ -70,10 +76,6 @@ packages/megalodon/.idea
.yarn .yarn
yarn* yarn*
# Nix Development shell items
.devenv
.direnv
# Cargo cache for Docker # Cargo cache for Docker
/.cargo-cache /.cargo-cache
/.cargo-target /.cargo-target

View file

@ -2,7 +2,6 @@
"recommendations": [ "recommendations": [
"editorconfig.editorconfig", "editorconfig.editorconfig",
"vue.volar", "vue.volar",
"vue.vscode-typescript-vue-plugin",
"arcanis.vscode-zipfs", "arcanis.vscode-zipfs",
"orta.vscode-twoslash-queries", "orta.vscode-twoslash-queries",
"antfu.iconify", "antfu.iconify",

View file

@ -22,7 +22,17 @@ Before creating an issue, please check the following:
> **Warning** > **Warning**
> Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged. > Do not close issues that are about to be resolved. It should remain open until a commit that actually resolves it is merged.
## Before implementation ## 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. 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. 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.
@ -30,14 +40,14 @@ MRs that do not have a clear set of do's and don'ts tend to be bloated and diffi
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. 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 ### Well-known branches
- The **`main`** branch is tracking the latest release and used for production purposes. - The **`main`** branch is tracking the latest release and used for production purposes.
- The **`develop`** branch is where we work for the next release. - 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** - 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. - The **`l10n_develop`** branch is reserved for localization management.
- **`feature/*`** branches are reserved for the development of a specific feature - **`feature/*`** branches are reserved for the development of a specific feature
## Creating a merge request (MR) ### Creating a merge request (MR)
Thank you for your MR! Before creating a MR, please check the following: 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. - 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. - `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.
@ -68,235 +78,3 @@ Be willing to comment on the good points and not just the things you want fixed
- Does the test ensure the expected behavior? - Does the test ensure the expected behavior?
- Are there any omissions or gaps? - Are there any omissions or gaps?
- Does it check for anomalies? - Does it check for anomalies?
## Preparing the development environment
1. Install the following software
- nodejs
- rustup
- cargo
- sea-orm-cli
- podman
- podman-compose
2. Copy the config file
```sh
cp .config/dev.example.yml .config/default.yml
```
3. Start postgres/redis containers
```sh
pnpm run dev:up
```
4. Build Firefish
```sh
pnpm install
pnpm run build:debug
pnpm run migrate
```
5. Start Firefish on your localhost
```sh
pnpm run start
```
You can use the following commands to initialize the database:
```sh
pnpm run dev:init
pnpm run migrate
```
Make sure to clear your browser local storage after initializing the dev instance.
## Deploy (SOON)
The `/deploy` command by issue comment can be used to deploy the contents of a MR to the preview environment.
```
/deploy sha=<commit hash>
```
An actual domain will be assigned so you can test the federation.
# THE FOLLOWING IS OUTDATED:
## Merge
## Release
### Release Instructions
1. Commit version changes in the `develop` branch ([package.json](https://github.com/misskey-dev/misskey/blob/develop/package.json))
2. Create a release PR.
- Into `master` from `develop` branch.
- The title must be in the format `Release: x.y.z`.
- `x.y.z` is the new version you are trying to release.
3. Deploy and perform a simple QA check. Also verify that the tests passed.
4. Merge it.
5. Create a [release of GitHub](https://github.com/misskey-dev/misskey/releases)
- The target branch must be `master`
- The tag name must be the version
## Development
During development, it is useful to use the `pnpm run dev` command.
This command monitors the server-side and client-side source files and automatically builds them if they are modified.
In addition, it will also automatically start the Firefish server process.
## Testing
- Test codes are located in [`/test`](/test).
### Run test
Create a config file.
```
cp test/test.yml .config/
```
Prepare DB/Redis for testing.
```
docker-compose -f test/docker-compose.yml up
```
Alternatively, prepare an empty (data can be erased) DB and edit `.config/test.yml`.
Run all test.
```
yarn test
```
#### Run specify test
```
TS_NODE_FILES=true TS_NODE_TRANSPILE_ONLY=true TS_NODE_PROJECT="./test/tsconfig.json" pnpx mocha test/foo.ts --require ts-node/register
```
## Vue
Firefish uses Vue(v3) as its front-end framework.
- Use TypeScript.
- **When creating a new component, please use the Composition API (with [setup syntax](https://v3.vuejs.org/api/sfc-script-setup.html) and [ref syntax](https://github.com/vuejs/rfcs/discussions/369)) instead of the Options API.**
- Some of the existing components are implemented in the Options API, but it is an old implementation. Refactors that migrate those components to the Composition API are also welcome.
## nirax
niraxは、Misskeyで使用しているオリジナルのフロントエンドルーティングシステムです。
**vue-routerから影響を多大に受けているので、まずはvue-routerについて学ぶことをお勧めします。**
### ルート定義
ルート定義は、以下の形式のオブジェクトの配列です。
``` ts
{
name?: string;
path: string;
component: Component;
query?: Record<string, string>;
loginRequired?: boolean;
hash?: string;
globalCacheKey?: string;
children?: RouteDef[];
}
```
> **Warning**
> 現状、ルートは定義された順に評価されます。
> たとえば、`/foo/:id`ルート定義の次に`/foo/bar`ルート定義がされていた場合、後者がマッチすることはありません。
### 複数のルーター
vue-routerとの最大の違いは、niraxは複数のルーターが存在することを許可している点です。
これにより、アプリ内ウィンドウでブラウザとは個別にルーティングすることなどが可能になります。
## Notes
### How to resolve conflictions occurred at yarn.lock?
Just execute `yarn` to fix it.
### INSERTするときにはsaveではなくinsertを使用する
#6441
### placeholder
SQLをクエリビルダで組み立てる際、使用するプレースホルダは重複してはならない
例えば
``` ts
query.andWhere(new Brackets(qb => {
for (const type of ps.fileType) {
qb.orWhere(`:type = ANY(note.attachedFileTypes)`, { type: type });
}
}));
```
と書くと、ループ中で`type`というプレースホルダが複数回使われてしまいおかしくなる
だから次のようにする必要がある
```ts
query.andWhere(new Brackets(qb => {
for (const type of ps.fileType) {
const i = ps.fileType.indexOf(type);
qb.orWhere(`:type${i} = ANY(note.attachedFileTypes)`, { [`type${i}`]: type });
}
}));
```
### Not `null` in TypeORM
```ts
const foo = await Foos.findOne({
bar: Not(null)
});
```
のようなクエリ(`bar`が`null`ではない)は期待通りに動作しない。
次のようにします:
```ts
const foo = await Foos.findOne({
bar: Not(IsNull())
});
```
### `null` in SQL
SQLを発行する際、パラメータが`null`になる可能性のある場合はSQL文を出し分けなければならない
例えば
``` ts
query.where('file.folderId = :folderId', { folderId: ps.folderId });
```
という処理で、`ps.folderId`が`null`だと結果的に`file.folderId = null`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
だから次のようにする必要がある
``` ts
if (ps.folderId) {
query.where('file.folderId = :folderId', { folderId: ps.folderId });
} else {
query.where('file.folderId IS NULL');
}
```
### `[]` in SQL
SQLを発行する際、`IN`のパラメータが`[]`(空の配列)になる可能性のある場合はSQL文を出し分けなければならない
例えば
``` ts
const users = await Users.find({
id: In(userIds)
});
```
という処理で、`userIds`が`[]`だと結果的に`user.id IN ()`のようなクエリが発行されてしまい、これは正しいSQLではないので期待した結果が得られない
だから次のようにする必要がある
``` ts
const users = userIds.length > 0 ? await Users.find({
id: In(userIds)
}) : [];
```
### 配列のインデックス in SQL
SQLでは配列のインデックスは**1始まり**。
`[a, b, c]``a`にアクセスしたいなら`[0]`ではなく`[1]`と書く
### null IN
nullが含まれる可能性のあるカラムにINするときは、そのままだとおかしくなるのでORなどでnullのハンドリングをしよう。
### `undefined`にご用心
MongoDBの時とは違い、findOneでレコードを取得する時に対象レコードが存在しない場合 **`undefined`** が返ってくるので注意。
MongoDBは`null`で返してきてたので、その感覚で`if (x === null)`とか書くとバグる。代わりに`if (x == null)`と書いてください
### Migration作成方法
packages/backendで:
```sh
pnpm dlx typeorm migration:generate -d ormconfig.js -o <migration name>
```
- 生成後、ファイルをmigration下に移してください
- 作成されたスクリプトは不必要な変更を含むため除去してください
### コネクションには`markRaw`せよ
**Vueのコンポーネントのdataオプションとして**misskey.jsのコネクションを設定するとき、必ず`markRaw`でラップしてください。インスタンスが不必要にリアクティブ化されることで、misskey.js内の処理で不具合が発生するとともに、パフォーマンス上の問題にも繋がる。なお、Composition APIを使う場合はこの限りではない(リアクティブ化はマニュアルなため)。
### JSONのimportに気を付けよう
TypeScriptでjsonをimportすると、tscでコンパイルするときにそのjsonファイルも一緒にdistディレクトリに吐き出されてしまう。この挙動により、意図せずファイルの書き換えが発生することがあるので、jsonをimportするときは書き換えられても良いものかどうか確認すること。書き換えされて欲しくない場合は、importで読み込むのではなく、`fs.readFileSync`などの関数を使って読み込むようにすればよい。
### コンポーネントのスタイル定義でmarginを持たせない
コンポーネント自身がmarginを設定するのは問題の元となることはよく知られている
marginはそのコンポーネントを使う側が設定する
## その他
### HTMLのクラス名で follow という単語は使わない
広告ブロッカーで誤ってブロックされる

View file

@ -48,7 +48,7 @@ FROM docker.io/node:20-alpine
WORKDIR /firefish WORKDIR /firefish
# Install runtime dependencies # Install runtime dependencies
RUN apk update && apk add --no-cache zip unzip tini ffmpeg RUN apk update && apk add --no-cache zip unzip tini ffmpeg curl
COPY . ./ COPY . ./

44
Makefile Normal file
View file

@ -0,0 +1,44 @@
ifneq (dev,$(wildcard config.env))
include ./dev/config.env
export
endif
.PHONY: pre-commit
pre-commit: format entities update-index-js
.PHONY: format
format:
pnpm run format
.PHONY: entities
entities:
pnpm run migrate
$(MAKE) -C ./packages/backend-rs regenerate-entities
.PHONY: update-index-js
update-index-js:
$(MAKE) -C ./packages/backend-rs index.js
.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.init db.up db.down
db.init:
$(MAKE) -C ./dev/db-container init
db.up:
$(MAKE) -C ./dev/db-container up
db.down:
$(MAKE) -C ./dev/db-container down
.PHONY: psql redis-cli
psql:
$(MAKE) -C ./dev/db-container psql
redis-cli:
$(MAKE) -C ./dev/db-container redis-cli

217
README.md
View file

@ -15,217 +15,22 @@ Firefish is based off of Misskey, a powerful microblogging server on ActivityPub
<div style="clear: both;"></div> <div style="clear: both;"></div>
# Documents
- [Installation guide](./docs/install.md)
- [Contributing guide](./CONTRIBUTING.md)
- [Changelog](./docs/changelog.md)
# Links # Links
### Want to get involved? Great! - Donations: <https://opencollective.com/Firefish>
- If you have the means to, [donations](https://opencollective.com/Firefish) are a great way to keep us going.
- If you know how to program in TypeScript, Vue, or Rust, read the [contributing](./CONTRIBUTING.md) document.
- 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!
### Links
- Donations:
- OpenCollective: <https://opencollective.com/Firefish>
- Matrix space: <https://matrix.to/#/#firefish-community:nitro.chat> - 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> - Official account: <a href="https://info.firefish.dev/@firefish" rel="me">`@firefish@info.firefish.dev`</a>
- Weblate: <https://hosted.weblate.org/engage/firefish/> - Weblate: <https://hosted.weblate.org/engage/firefish/>
# Getting started # Want to get involved? Great!
This guide will work for both **starting from scratch** and **migrating from Misskey**. - 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!
<!-- ## Easy installers
If you have access to a server that supports one of the sources below, I recommend you use it! Note that these methods *won't* allow you to migrate from Misskey without manual intervention.
[![Install on Ubuntu](https://pool.jortage.com/voringme/misskey/3b62a443-1b44-45cf-8f9e-f1c588f803ed.png)](https://firefish.dev/firefish/ubuntu-bash-install)  [![Install on the Arch User Repository](https://pool.jortage.com/voringme/misskey/ba2a5c07-f078-43f1-8483-2e01acca9c40.png)](https://aur.archlinux.org/packages/firefish)  [![Install Firefish with YunoHost](https://install-app.yunohost.org/install-with-yunohost.svg)](https://install-app.yunohost.org/?app=firefish) -->
## Containerization
- [How to run Firefish with Docker](https://firefish.dev/firefish/firefish/-/blob/develop/docs/docker.md)
- [How to run Firefish with Kubernetes/Helm](https://firefish.dev/firefish/firefish/-/blob/develop/docs/kubernetes.md)
## Dependencies
- At least [NodeJS](https://nodejs.org/en/) v18.16.0 (v20/v21 recommended)
- At least [PostgreSQL](https://www.postgresql.org/) v12 (v16 recommended)
- At least [Redis](https://redis.io/) v7
- Web Proxy (one of the following)
- Nginx (recommended)
- Caddy (recommended)
- Apache
### Optional dependencies
- [FFmpeg](https://ffmpeg.org/) for video transcoding
- Full text search (one of the following)
- [Sonic](https://crates.io/crates/sonic-server)
- [MeiliSearch](https://www.meilisearch.com/)
- [ElasticSearch](https://www.elastic.co/elasticsearch/)
- Caching server (one of the following)
- [DragonflyDB](https://www.dragonflydb.io/) (recommended)
- [KeyDB](https://keydb.dev/)
- Another [Redis](https://redis.io/) server
### Build dependencies
- At least [Rust](https://www.rust-lang.org/) v1.74
- C/C++ compiler & build tools
- `build-essential` on Debian/Ubuntu Linux
- `base-devel` on Arch Linux
- [Python 3](https://www.python.org/)
## Get folder ready
```sh
git clone https://firefish.dev/firefish/firefish.git
cd firefish/
```
> **Note**
> By default, you're on the develop branch. Run `git checkout main` to switch to the Main branch.
## Install dependencies
```sh
# nvm install 19 && nvm use 19
sudo corepack enable
corepack prepare pnpm@latest --activate
pnpm install --frozen-lockfile
```
### pm2
To install pm2 run:
```
npm i -g pm2
pm2 install pm2-logrotate
```
> **Note**
> [`pm2-logrotate`](https://github.com/keymetrics/pm2-logrotate/blob/master/README.md) ensures that log files don't infinitely gather size, as Firefish produces a lot of logs.
## Create database
In PostgreSQL (`psql`), run the following command:
```sql
CREATE DATABASE firefish WITH encoding = 'UTF8';
```
or run the following from the command line:
```sh
psql postgres -c "create database firefish with encoding = 'UTF8';"
```
In Firefish's directory, fill out the `db` section of `.config/default.yml` with the correct information, where the `db` key is `firefish`.
## Caching server
If you experience a lot of traffic, it's a good idea to set up another Redis-compatible caching server. If you don't set one one up, it'll fall back to the mandatory Redis server. DragonflyDB is the recommended option due to its unrivaled performance and ease of use.
## Set up search
### Sonic
Sonic is better suited for self hosters with smaller deployments. It uses almost no resources, barely any any disk space, and is relatively fast.
Follow sonic's [installation guide](https://github.com/valeriansaliou/sonic#installation)
> **Note**
> If you use IPv4: in Sonic's directory, edit the `config.cfg` file to change `inet` to `"0.0.0.0:1491"`.
In Firefish's directory, fill out the `sonic` section of `.config/default.yml` with the correct information.
### Meilisearch
Meilisearch is better suited for larger deployments. It's faster but uses far more resources and disk space.
Follow Meilisearch's [quick start guide](https://www.meilisearch.com/docs/learn/getting_started/quick_start)
In Firefish's directory, fill out the `meilisearch` section of `.config/default.yml` with the correct information.
### ElasticSearch
Please don't use ElasticSearch unless you already have an ElasticSearch setup and want to continue using it for Firefish. ElasticSearch is slow, heavy, and offers very few benefits over Sonic/Meilisearch.
## 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 gulp`.
- To block ChatGPT, CommonCrawl, or other crawlers from indexing your instance, uncomment the respective rules in `./custom/robots.txt`.
## Configuring a new server
- Run `cp .config/example.yml .config/default.yml`
- Edit `.config/default.yml`, making sure to fill out required fields.
- Also copy and edit `.config/docker_example.env` to `.config/docker.env` if you're using Docker.
## Migrating from Misskey/FoundKey to Firefish
For migrating from Misskey v13, Misskey v12, and FoundKey, read [this document](https://firefish.dev/firefish/firefish/-/blob/develop/docs/migrate.md).
## Web proxy
### Nginx (recommended)
- Run `sudo cp ./firefish.nginx.conf /etc/nginx/sites-available/ && cd /etc/nginx/sites-available/`
- Edit `firefish.nginx.conf` to reflect your server properly
- Run `sudo ln -s ./firefish.nginx.conf ../sites-enabled/firefish.nginx.conf`
- Run `sudo nginx -t` to validate that the config is valid, then restart the NGINX service.
### Caddy (recommended)
- Add the following block to your `Caddyfile`, replacing `example.tld` with your own domain:
```caddy
example.tld {
reverse_proxy http://127.0.0.1:3000
}
```
- Reload your caddy configuration
### Apache
> **Warning**
> Apache has some known problems with Firefish. Only use it if you have to.
- Run `sudo cp ./firefish.apache.conf /etc/apache2/sites-available/ && cd /etc/apache2/sites-available/`
- Edit `firefish.apache.conf` to reflect your server properly
- Run `sudo a2ensite firefish.apache` to enable the site
- Run `sudo service apache2 restart` to reload apache2 configuration
## Build and launch!
### NodeJS + pm2
#### `git pull` and run these steps to update Firefish in the future!
```sh
# git pull
pnpm install
NODE_ENV=production pnpm run build && pnpm run migrate
pm2 start "NODE_ENV=production pnpm run start" --name Firefish
```
## 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.
- I'd recommend you use a S3 Bucket/CDN for Object Storage, especially if you use Docker.
- When using object storage, setting a proper `Access-Control-Allow-Origin` response header is highly recommended.
- I'd ***strongly*** 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

View file

@ -1,16 +1,5 @@
# Reporting Security Issues # Reporting Security Issues
## Minor 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>.
If you discover a minor security issue in Firefish, please report it by sending an
email to [kainoa@t1c.dev](mailto:kainoa@t1c.dev).
## High Security Issues
If you discover a security issue, which is so high risk, that too much is affected by it, please dont send it over unencrypted communication. You can share your PGP keys with us using kainoa@t1c.dev and after we established a secure communication, send it over E-Mail, or message us using matrix' encrypted private messages at @t1c:matrix.fedibird.com or @cleo:tchncs.de
This will allow us to assess the risk, and make a fix available before we add a
bug report to the Codeberg repository.
Thanks for helping make Firefish safe for everyone. Thanks for helping make Firefish safe for everyone.

View file

@ -1,23 +0,0 @@
# Patterns to ignore when building packages.
# This supports shell glob matching, relative path matching, and
# negation (prefixed with !). Only one pattern per line.
.DS_Store
# Common VCS dirs
.git/
.gitignore
.bzr/
.bzrignore
.hg/
.hgignore
.svn/
# Common backup files
*.swp
*.bak
*.tmp
*.orig
*~
# Various IDEs
.project
.idea/
*.tmproj
.vscode/

View file

@ -1,38 +0,0 @@
apiVersion: v2
name: firefish
description: A fun, new, open way to experience social media https://joinfirefish.org
# A chart can be either an 'application' or a 'library' chart.
#
# Application charts are a collection of templates that can be packaged into versioned archives
# to be deployed.
#
# Library charts provide useful utilities or functions for the chart developer. They're included as
# a dependency of application charts to inject those utilities and functions into the rendering
# pipeline. Library charts do not define any templates and therefore cannot be deployed.
type: application
# This is the chart version. This version number should be incremented each time you make changes
# to the chart and its templates, including the app version.
# Versions are expected to follow Semantic Versioning (https://semver.org/)
version: 0.1.2
# This is the version number of the application being deployed. This version number should be
# incremented each time you make changes to the application. Versions are not expected to
# follow Semantic Versioning. They should reflect the version the application is using.
# It is recommended to use it with quotes.
appVersion: 'v1.0.4-beta31'
dependencies:
- name: elasticsearch
version: 19.0.1
repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami
condition: elasticsearch.enabled
- name: postgresql
version: 11.1.3
repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami
condition: postgresql.enabled
- name: redis
version: 16.13.2
repository: https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami
condition: redis.enabled

View file

@ -1,89 +0,0 @@
# firefish
![Version: 0.1.2](https://img.shields.io/badge/Version-0.1.2-informational?style=flat-square) ![Type: application](https://img.shields.io/badge/Type-application-informational?style=flat-square) ![AppVersion: rc](https://img.shields.io/badge/AppVersion-rc-informational?style=flat-square)
A fun, new, open way to experience social media https://joinfirefish.org
## Requirements
| Repository | Name | Version |
|------------|------|---------|
| https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami | elasticsearch | 19.0.1 |
| https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami | postgresql | 11.1.3 |
| https://raw.githubusercontent.com/bitnami/charts/archive-full-index/bitnami | redis | 16.13.2 |
## Values
| Key | Type | Default | Description |
|-----|------|---------|-------------|
| affinity | object | `{}` | |
| autoscaling.enabled | bool | `false` | |
| autoscaling.maxReplicas | int | `100` | |
| autoscaling.minReplicas | int | `1` | |
| autoscaling.targetCPUUtilizationPercentage | int | `80` | |
| firefish.allowedPrivateNetworks | list | `[]` | If you want to allow firefish to connect to private ips, enter the cidrs here. |
| firefish.deepl.authKey | string | `""` | |
| firefish.deepl.isPro | bool | `false` | |
| firefish.deepl.managed | bool | `false` | |
| firefish.domain | string | `"firefish.local"` | |
| firefish.isManagedHosting | bool | `true` | |
| firefish.libreTranslate.apiKey | string | `""` | |
| firefish.libreTranslate.apiUrl | string | `""` | |
| firefish.libreTranslate.managed | bool | `false` | |
| firefish.objectStorage.access_key | string | `""` | |
| firefish.objectStorage.access_secret | string | `""` | |
| firefish.objectStorage.baseUrl | string | `""` | |
| firefish.objectStorage.bucket | string | `""` | |
| firefish.objectStorage.endpoint | string | `""` | |
| firefish.objectStorage.managed | bool | `true` | |
| firefish.objectStorage.prefix | string | `"files"` | |
| firefish.objectStorage.region | string | `""` | |
| firefish.reservedUsernames[0] | string | `"root"` | |
| firefish.reservedUsernames[1] | string | `"admin"` | |
| firefish.reservedUsernames[2] | string | `"administrator"` | |
| firefish.reservedUsernames[3] | string | `"me"` | |
| firefish.reservedUsernames[4] | string | `"system"` | |
| firefish.smtp.from_address | string | `"notifications@example.com"` | |
| firefish.smtp.login | string | `""` | |
| firefish.smtp.managed | bool | `true` | |
| firefish.smtp.password | string | `""` | |
| firefish.smtp.port | int | `587` | |
| firefish.smtp.server | string | `"smtp.mailgun.org"` | |
| firefish.smtp.useImplicitSslTls | bool | `false` | |
| elasticsearch | object | `{"auth":{},"enabled":false,"hostname":"","port":9200,"ssl":false}` | https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch#parameters |
| fullnameOverride | string | `""` | |
| image.pullPolicy | string | `"IfNotPresent"` | |
| image.repository | string | `"registry.firefish.dev/firefish/firefish"` | |
| image.tag | string | `""` | |
| imagePullSecrets | list | `[]` | |
| ingress.annotations | object | `{}` | |
| ingress.className | string | `""` | |
| ingress.enabled | bool | `false` | |
| ingress.hosts[0].host | string | `"chart-example.local"` | |
| ingress.hosts[0].paths[0].path | string | `"/"` | |
| ingress.hosts[0].paths[0].pathType | string | `"ImplementationSpecific"` | |
| ingress.tls | list | `[]` | |
| nameOverride | string | `""` | |
| nodeSelector | object | `{}` | |
| podAnnotations | object | `{}` | |
| podSecurityContext | object | `{}` | |
| postgresql.auth.database | string | `"firefish_production"` | |
| postgresql.auth.password | string | `""` | |
| postgresql.auth.username | string | `"firefish"` | |
| postgresql.enabled | bool | `true` | disable if you want to use an existing db; in which case the values below must match those of that external postgres instance |
| redis.auth.password | string | `""` | you must set a password; the password generated by the redis chart will be rotated on each upgrade: |
| redis.enabled | bool | `true` | |
| redis.hostname | string | `""` | |
| redis.port | int | `6379` | |
| replicaCount | int | `1` | |
| resources | object | `{}` | |
| securityContext | object | `{}` | |
| service.port | int | `80` | |
| service.type | string | `"ClusterIP"` | |
| serviceAccount.annotations | object | `{}` | |
| serviceAccount.create | bool | `true` | |
| serviceAccount.name | string | `""` | |
| tolerations | list | `[]` | |
----------------------------------------------
Autogenerated from chart metadata using [helm-docs v1.11.0](https://github.com/norwoodj/helm-docs/releases/v1.11.0)

View file

@ -1,22 +0,0 @@
1. Get the application URL by running these commands:
{{- if .Values.ingress.enabled }}
{{- range $host := .Values.ingress.hosts }}
{{- range .paths }}
http{{ if $.Values.ingress.tls }}s{{ end }}://{{ $host.host }}{{ .path }}
{{- end }}
{{- end }}
{{- else if contains "NodePort" .Values.service.type }}
export NODE_PORT=$(kubectl get --namespace {{ .Release.Namespace }} -o jsonpath="{.spec.ports[0].nodePort}" services {{ include "firefish.fullname" . }})
export NODE_IP=$(kubectl get nodes --namespace {{ .Release.Namespace }} -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
{{- else if contains "LoadBalancer" .Values.service.type }}
NOTE: It may take a few minutes for the LoadBalancer IP to be available.
You can watch the status of by running 'kubectl get --namespace {{ .Release.Namespace }} svc -w {{ include "firefish.fullname" . }}'
export SERVICE_IP=$(kubectl get svc --namespace {{ .Release.Namespace }} {{ include "firefish.fullname" . }} --template "{{"{{ range (index .status.loadBalancer.ingress 0) }}{{.}}{{ end }}"}}")
echo http://$SERVICE_IP:{{ .Values.service.port }}
{{- else if contains "ClusterIP" .Values.service.type }}
export POD_NAME=$(kubectl get pods --namespace {{ .Release.Namespace }} -l "app.kubernetes.io/name={{ include "firefish.name" . }},app.kubernetes.io/instance={{ .Release.Name }}" -o jsonpath="{.items[0].metadata.name}")
export CONTAINER_PORT=$(kubectl get pod --namespace {{ .Release.Namespace }} $POD_NAME -o jsonpath="{.spec.containers[0].ports[0].containerPort}")
echo "Visit http://127.0.0.1:8080 to use your application"
kubectl --namespace {{ .Release.Namespace }} port-forward $POD_NAME 8080:$CONTAINER_PORT
{{- end }}

View file

@ -1,327 +0,0 @@
{{/*
Expand the name of the chart.
*/}}
{{- define "firefish.name" -}}
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Create a default fully qualified app name.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
If release name contains chart name it will be used as a full name.
*/}}
{{- define "firefish.fullname" -}}
{{- if .Values.fullnameOverride }}
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- $name := default .Chart.Name .Values.nameOverride }}
{{- if contains $name .Release.Name }}
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
{{- else }}
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
{{- end }}
{{- end }}
{{- end }}
{{/*
Create chart name and version as used by the chart label.
*/}}
{{- define "firefish.chart" -}}
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
{{- end }}
{{/*
Common labels
*/}}
{{- define "firefish.labels" -}}
helm.sh/chart: {{ include "firefish.chart" . }}
{{ include "firefish.selectorLabels" . }}
{{- if .Chart.AppVersion }}
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
{{- end }}
app.kubernetes.io/managed-by: {{ .Release.Service }}
{{- end }}
{{/*
Selector labels
*/}}
{{- define "firefish.selectorLabels" -}}
app.kubernetes.io/name: {{ include "firefish.name" . }}
app.kubernetes.io/instance: {{ .Release.Name }}
{{- end }}
{{/*
Create the name of the service account to use
*/}}
{{- define "firefish.serviceAccountName" -}}
{{- if .Values.serviceAccount.create }}
{{- default (include "firefish.fullname" .) .Values.serviceAccount.name }}
{{- else }}
{{- default "default" .Values.serviceAccount.name }}
{{- end }}
{{- end }}
{{/*
Create a default fully qualified name for dependent services.
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
*/}}
{{- define "firefish.elasticsearch.fullname" -}}
{{- printf "%s-%s" .Release.Name "elasticsearch" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- define "firefish.redis.fullname" -}}
{{- printf "%s-%s" .Release.Name "redis" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{- define "firefish.postgresql.fullname" -}}
{{- printf "%s-%s" .Release.Name "postgresql" | trunc 63 | trimSuffix "-" -}}
{{- end -}}
{{/*
config/default.yml content
*/}}
{{- define "firefish.configDir.default.yml" -}}
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# Firefish configuration
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
# ┌─────┐
#───┘ URL └─────────────────────────────────────────────────────
# Final accessible URL seen by a user.
url: "https://{{ .Values.firefish.domain }}/"
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# URL SETTINGS AFTER THAT!
# ┌───────────────────────┐
#───┘ Port and TLS settings └───────────────────────────────────
#
# Firefish requires a reverse proxy to support HTTPS connections.
#
# +----- https://example.tld/ ------------+
# +------+ |+-------------+ +----------------+|
# | User | ---> || Proxy (443) | ---> | Firefish (3000) ||
# +------+ |+-------------+ +----------------+|
# +---------------------------------------+
#
# You need to set up a reverse proxy. (e.g. nginx)
# An encrypted connection with HTTPS is highly recommended
# because tokens may be transferred in GET requests.
# The port that your Firefish server should listen on.
port: 3000
# ┌──────────────────────────┐
#───┘ PostgreSQL configuration └────────────────────────────────
db:
{{- if .Values.postgresql.enabled }}
host: {{ template "firefish.postgresql.fullname" . }}
port: 5432
{{- else }}
host: {{ .Values.postgresql.postgresqlHostname }}
port: {{ .Values.postgresql.postgresqlPort | default 5432 }}
{{- end }}
# Database name
db: {{ .Values.postgresql.auth.database }}
# Auth
user: {{ .Values.postgresql.auth.username }}
pass: "{{ .Values.postgresql.auth.password }}"
# Whether disable Caching queries
#disableCache: true
# Extra Connection options
#extra:
# ssl:
# host: localhost
# rejectUnauthorized: false
# ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────
redis:
{{- if .Values.redis.enabled }}
host: {{ template "firefish.redis.fullname" . }}-master
{{- else }}
host: {{ required "When the redis chart is disabled .Values.redis.hostname is required" .Values.redis.hostname }}
{{- end }}
port: {{ .Values.redis.port | default 6379 }}
#family: 0 # 0=Both, 4=IPv4, 6=IPv6
pass: {{ .Values.redis.auth.password | quote }}
#prefix: example-prefix
#db: 1
#user: default
#tls:
# host: localhost
# rejectUnauthorized: false
# ┌─────────────────────┐
#───┘ Sonic configuration └─────────────────────────────────────
#sonic:
# host: localhost
# port: 1491
# auth: SecretPassword
# collection: notes
# bucket: default
# ┌─────────────────────────────┐
#───┘ Elasticsearch configuration └─────────────────────────────
{{- if .Values.elasticsearch.enabled }}
elasticsearch:
host: {{ template "mastodon.elasticsearch.fullname" . }}-master-hl
port: 9200
ssl: false
{{- else if .Values.elasticsearch.hostname }}
elasticsearch:
host: {{ .Values.elasticsearch.hostname | quote }}
port: {{ .Values.elasticsearch.port }}
ssl: {{ .Values.elasticsearch.ssl }}
{{- if .Values.elasticsearch.auth }}
user: {{ .Values.elasticsearch.auth.username | quote }}
pass: {{ .Values.elasticsearch.auth.password | quote }}
{{- end }}
{{- end }}
# ┌───────────────┐
#───┘ ID generation └───────────────────────────────────────────
# You can select the ID generation method.
# You don't usually need to change this setting, but you can
# change it according to your preferences.
# Available methods:
# aid ... Short, Millisecond accuracy
# meid ... Similar to ObjectID, Millisecond accuracy
# ulid ... Millisecond accuracy
# objectid ... This is left for backward compatibility
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
# ID SETTINGS AFTER THAT!
id: 'aid'
# ┌─────────────────────┐
#───┘ Other configuration └─────────────────────────────────────
# Max note length, should be < 8000.
#maxNoteLength: 3000
# Maximum lenght of an image caption or file comment (default 1500, max 8192)
#maxCaptionLength: 1500
# Reserved usernames that only the administrator can register with
reservedUsernames: {{ .Values.firefish.reservedUsernames | toJson }}
# Whether disable HSTS
#disableHsts: true
# Number of worker processes
#clusterLimit: 1
# Job concurrency per worker
# deliverJobConcurrency: 128
# inboxJobConcurrency: 16
# Job rate limiter
# deliverJobPerSec: 128
# inboxJobPerSec: 16
# Job attempts
# deliverJobMaxAttempts: 12
# inboxJobMaxAttempts: 8
# IP address family used for outgoing request (ipv4, ipv6 or dual)
#outgoingAddressFamily: ipv4
# Syslog option
#syslog:
# host: localhost
# port: 514
# Proxy for HTTP/HTTPS
#proxy: http://127.0.0.1:3128
#proxyBypassHosts: [
# 'example.com',
# '192.0.2.8'
#]
# Proxy for SMTP/SMTPS
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
# Media Proxy
#mediaProxy: https://example.com/proxy
# Proxy remote files (default: false)
#proxyRemoteFiles: true
allowedPrivateNetworks: {{ .Values.firefish.allowedPrivateNetworks | toJson }}
# TWA
#twa:
# nameSpace: android_app
# packageName: tld.domain.twa
# sha256CertFingerprints: ['AB:CD:EF']
# Upload or download file size limits (bytes)
#maxFileSize: 262144000
# 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: {{ .Values.firefish.isManagedHosting }}
deepl:
managed: {{ .Values.firefish.deepl.managed }}
authKey: {{ .Values.firefish.deepl.authKey | quote}}
isPro: {{ .Values.firefish.deepl.isPro }}
libreTranslate:
managed: {{ .Values.firefish.libreTranslate.managed }}
apiUrl: {{ .Values.firefish.libreTranslate.apiUrl | quote }}
apiKey: {{ .Values.firefish.libreTranslate.apiKey | quote }}
email:
managed: {{ .Values.firefish.smtp.managed }}
address: {{ .Values.firefish.smtp.from_address | quote }}
host: {{ .Values.firefish.smtp.server | quote }}
port: {{ .Values.firefish.smtp.port }}
user: {{ .Values.firefish.smtp.login | quote }}
pass: {{ .Values.firefish.smtp.password | quote }}
useImplicitSslTls: {{ .Values.firefish.smtp.useImplicitSslTls }}
objectStorage:
managed: {{ .Values.firefish.objectStorage.managed }}
baseUrl: {{ .Values.firefish.objectStorage.baseUrl | quote }}
bucket: {{ .Values.firefish.objectStorage.bucket | quote }}
prefix: {{ .Values.firefish.objectStorage.prefix | quote }}
endpoint: {{ .Values.firefish.objectStorage.endpoint | quote }}
region: {{ .Values.firefish.objectStorage.region | quote }}
accessKey: {{ .Values.firefish.objectStorage.access_key | quote }}
secretKey: {{ .Values.firefish.objectStorage.access_secret | quote }}
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.
{{- end }}

View file

@ -1,82 +0,0 @@
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "firefish.fullname" . }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "firefish.selectorLabels" . | nindent 6 }}
template:
metadata:
annotations:
checksum/secret-config: {{ include ( print $.Template.BasePath "/secret-config.yaml" ) . | sha256sum | quote }}
{{- with .Values.podAnnotations }}
{{- toYaml . | nindent 8 }}
{{- end }}
labels:
{{- include "firefish.selectorLabels" . | nindent 8 }}
spec:
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "firefish.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
volumes:
- name: config-volume
secret:
secretName: {{ template "firefish.fullname" . }}-config
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
command:
- pnpm
- run
- start
env:
- name: "NODE_ENV"
value: "production"
volumeMounts:
- name: config-volume
mountPath: /firefish/.config
ports:
- name: http
containerPort: 3000
protocol: TCP
startupProbe:
httpGet:
path: /
port: http
failureThreshold: 30
periodSeconds: 10
livenessProbe:
httpGet:
path: /
port: http
readinessProbe:
httpGet:
path: /
port: http
resources:
{{- toYaml .Values.resources | nindent 12 }}
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}

View file

@ -1,28 +0,0 @@
{{- if .Values.autoscaling.enabled }}
apiVersion: autoscaling/v2beta1
kind: HorizontalPodAutoscaler
metadata:
name: {{ include "firefish.fullname" . }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: {{ include "firefish.fullname" . }}
minReplicas: {{ .Values.autoscaling.minReplicas }}
maxReplicas: {{ .Values.autoscaling.maxReplicas }}
metrics:
{{- if .Values.autoscaling.targetCPUUtilizationPercentage }}
- type: Resource
resource:
name: cpu
targetAverageUtilization: {{ .Values.autoscaling.targetCPUUtilizationPercentage }}
{{- end }}
{{- if .Values.autoscaling.targetMemoryUtilizationPercentage }}
- type: Resource
resource:
name: memory
targetAverageUtilization: {{ .Values.autoscaling.targetMemoryUtilizationPercentage }}
{{- end }}
{{- end }}

View file

@ -1,61 +0,0 @@
{{- if .Values.ingress.enabled -}}
{{- $fullName := include "firefish.fullname" . -}}
{{- $svcPort := .Values.service.port -}}
{{- if and .Values.ingress.className (not (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion)) }}
{{- if not (hasKey .Values.ingress.annotations "kubernetes.io/ingress.class") }}
{{- $_ := set .Values.ingress.annotations "kubernetes.io/ingress.class" .Values.ingress.className}}
{{- end }}
{{- end }}
{{- if semverCompare ">=1.19-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1
{{- else if semverCompare ">=1.14-0" .Capabilities.KubeVersion.GitVersion -}}
apiVersion: networking.k8s.io/v1beta1
{{- else -}}
apiVersion: extensions/v1beta1
{{- end }}
kind: Ingress
metadata:
name: {{ $fullName }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- with .Values.ingress.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
spec:
{{- if and .Values.ingress.className (semverCompare ">=1.18-0" .Capabilities.KubeVersion.GitVersion) }}
ingressClassName: {{ .Values.ingress.className }}
{{- end }}
{{- if .Values.ingress.tls }}
tls:
{{- range .Values.ingress.tls }}
- hosts:
{{- range .hosts }}
- {{ . | quote }}
{{- end }}
secretName: {{ .secretName }}
{{- end }}
{{- end }}
rules:
{{- range .Values.ingress.hosts }}
- host: {{ .host | quote }}
http:
paths:
{{- range .paths }}
- path: {{ .path }}
{{- if and .pathType (semverCompare ">=1.18-0" $.Capabilities.KubeVersion.GitVersion) }}
pathType: {{ .pathType }}
{{- end }}
backend:
{{- if semverCompare ">=1.19-0" $.Capabilities.KubeVersion.GitVersion }}
service:
name: {{ $fullName }}
port:
number: {{ $svcPort }}
{{- else }}
serviceName: {{ $fullName }}
servicePort: {{ $svcPort }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}

View file

@ -1,59 +0,0 @@
apiVersion: batch/v1
kind: Job
metadata:
name: {{ include "firefish.fullname" . }}-db-migrate
labels:
{{- include "firefish.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": post-install,pre-upgrade
"helm.sh/hook-delete-policy": before-hook-creation,hook-succeeded
"helm.sh/hook-weight": "-2"
spec:
template:
metadata:
name: {{ include "firefish.fullname" . }}-db-migrate
{{- with .Values.podAnnotations }}
annotations:
{{- toYaml . | nindent 8 }}
{{- end }}
spec:
restartPolicy: Never
{{- with .Values.imagePullSecrets }}
imagePullSecrets:
{{- toYaml . | nindent 8 }}
{{- end }}
serviceAccountName: {{ include "firefish.serviceAccountName" . }}
securityContext:
{{- toYaml .Values.podSecurityContext | nindent 8 }}
volumes:
- name: config-volume
secret:
secretName: {{ template "firefish.fullname" . }}-config
containers:
- name: {{ .Chart.Name }}
securityContext:
{{- toYaml .Values.securityContext | nindent 12 }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
imagePullPolicy: {{ .Values.image.pullPolicy }}
command:
- pnpm
- run
- migrate
env:
- name: "NODE_ENV"
value: "production"
volumeMounts:
- name: config-volume
mountPath: /firefish/.config
{{- with .Values.nodeSelector }}
nodeSelector:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{- toYaml . | nindent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{- toYaml . | nindent 8 }}
{{- end }}

View file

@ -1,9 +0,0 @@
apiVersion: v1
kind: Secret
metadata:
name: {{ template "firefish.fullname" . }}-config
labels:
{{- include "firefish.labels" . | nindent 4 }}
type: Opaque
data:
default.yml: {{ include "firefish.configDir.default.yml" . | b64enc }}

View file

@ -1,15 +0,0 @@
apiVersion: v1
kind: Service
metadata:
name: {{ include "firefish.fullname" . }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
spec:
type: {{ .Values.service.type }}
ports:
- port: {{ .Values.service.port }}
targetPort: http
protocol: TCP
name: http
selector:
{{- include "firefish.selectorLabels" . | nindent 4 }}

View file

@ -1,12 +0,0 @@
{{- if .Values.serviceAccount.create -}}
apiVersion: v1
kind: ServiceAccount
metadata:
name: {{ include "firefish.serviceAccountName" . }}
labels:
{{- include "firefish.labels" . | nindent 4 }}
{{- with .Values.serviceAccount.annotations }}
annotations:
{{- toYaml . | nindent 4 }}
{{- end }}
{{- end }}

View file

@ -1,15 +0,0 @@
apiVersion: v1
kind: Pod
metadata:
name: "{{ include "firefish.fullname" . }}-test-connection"
labels:
{{- include "firefish.labels" . | nindent 4 }}
annotations:
"helm.sh/hook": test
spec:
containers:
- name: wget
image: busybox
command: ['wget']
args: ['{{ include "firefish.fullname" . }}:{{ .Values.service.port }}']
restartPolicy: Never

View file

@ -1,168 +0,0 @@
# Default values for firefish.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: registry.firefish.dev/firefish/firefish
pullPolicy: IfNotPresent
# Overrides the image tag whose default is the chart appVersion.
tag: ""
firefish:
isManagedHosting: true
domain: firefish.local
deepl:
managed: false
authKey: ""
isPro: false
libreTranslate:
managed: false
apiUrl: ""
apiKey: ""
smtp:
managed: true
from_address: notifications@example.com
port: 587
server: smtp.mailgun.org
useImplicitSslTls: false
login: ""
password: ""
objectStorage:
managed: true
access_key: ""
access_secret: ""
baseUrl: "" # e.g. "https://my-bucket.nyc3.cdn.digitaloceanspaces.com"
bucket: "" # e.g. "my-bucket"
prefix: files
endpoint: "" # e.g. "nyc3.digitaloceanspaces.com:443"
region: "" # e.g. "nyc3"
# -- If you want to allow firefish to connect to private ips, enter the cidrs here.
allowedPrivateNetworks: []
# - "10.0.0.0/8"
reservedUsernames:
- root
- admin
- administrator
- me
- system
# https://github.com/bitnami/charts/tree/master/bitnami/postgresql#parameters
postgresql:
# -- disable if you want to use an existing db; in which case the values below
# must match those of that external postgres instance
enabled: true
# postgresqlHostname: preexisting-postgresql
# postgresqlPort: 5432
auth:
database: firefish_production
username: firefish
# you must set a password; the password generated by the postgresql chart will
# be rotated on each upgrade:
# https://github.com/bitnami/charts/tree/master/bitnami/postgresql#upgrade
password: ""
# https://github.com/bitnami/charts/tree/master/bitnami/redis#parameters
redis:
# disable if you want to use an existing redis instance; in which case the
# values below must match those of that external redis instance
enabled: true
hostname: ""
port: 6379
auth:
# -- you must set a password; the password generated by the redis chart will be
# rotated on each upgrade:
password: ""
# -- https://github.com/bitnami/charts/tree/master/bitnami/elasticsearch#parameters
elasticsearch:
# disable if you want to use an existing redis instance; in which case the
# values below must match those of that external elasticsearch instance
enabled: false
hostname: ""
port: 9200
ssl: false
auth: {}
# username: ""
# password: ""
# @ignored
image:
tag: 7
imagePullSecrets: []
nameOverride: ""
fullnameOverride: ""
serviceAccount:
# Specifies whether a service account should be created
create: true
# Annotations to add to the service account
annotations: {}
# The name of the service account to use.
# If not set and create is true, a name is generated using the fullname template
name: ""
podAnnotations: {}
podSecurityContext: {}
# fsGroup: 2000
securityContext: {}
# capabilities:
# drop:
# - ALL
# readOnlyRootFilesystem: true
# runAsNonRoot: true
# runAsUser: 1000
service:
type: ClusterIP
port: 80
ingress:
enabled: false
className: ""
annotations: {}
# kubernetes.io/ingress.class: nginx
# kubernetes.io/tls-acme: "true"
hosts:
- host: chart-example.local
paths:
- path: /
pathType: ImplementationSpecific
tls: []
# - secretName: chart-example-tls
# hosts:
# - chart-example.local
resources: {}
# We usually recommend not to specify default resources and to leave this as a conscious
# choice for the user. This also increases chances charts run on environments with little
# resources, such as Minikube. If you do want to specify resources, uncomment the following
# lines, adjust them as necessary, and remove the curly braces after 'resources:'.
# limits:
# cpu: 100m
# memory: 128Mi
# requests:
# cpu: 100m
# memory: 128Mi
autoscaling:
enabled: false
minReplicas: 1
maxReplicas: 100
targetCPUUtilizationPercentage: 80
# targetMemoryUtilizationPercentage: 80
nodeSelector: {}
tolerations: []
affinity: {}

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

@ -0,0 +1,4 @@
COMPOSE='docker 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.17.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

12
dev/db-container/Makefile Normal file
View file

@ -0,0 +1,12 @@
.PHONY: init up down
init: down up
up:
$(COMPOSE) up --detach
down:
$(COMPOSE) down
.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,15 @@
version: "3"
services:
redis:
image: docker.io/redis:7-alpine
ports:
- "26379:6379"
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"

View file

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

View file

@ -1,15 +0,0 @@
version: "3"
services:
redis:
image: docker.io/redis:7-alpine
ports:
- "26379:6379"
db:
image: docker.io/postgres:16-alpine
environment:
- "POSTGRES_PASSWORD=password"
- "POSTGRES_USER=firefish"
- "POSTGRES_DB=firefish_db"
ports:
- "25432:5432"

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.

95
dev/docs/db-container.md Normal file
View file

@ -0,0 +1,95 @@
# Set up database containers and run Firefish locally
## Prerequisites
- Dependencies
- git
- Node.js
- pnpm
- Rust toolchain
- 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 Docker, 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
logLevel: [
'error',
'success',
'warning',
'info'
]
```
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
```
## 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,177 @@
# 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.17.0 or later. While you can choose any versions between v18.17.0 and the latest version (v21.6.2 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
```
### 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-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
logLevel: [
'error',
'success',
'warning',
'info'
]
```
## 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

@ -6,11 +6,10 @@ services:
container_name: firefish_web container_name: firefish_web
restart: unless-stopped restart: unless-stopped
depends_on: depends_on:
- db db:
- redis condition: service_healthy
### Uncomment one of the following to use a search engine redis:
# - meilisearch condition: service_healthy
# - sonic
ports: ports:
- "3000:3000" - "3000:3000"
networks: networks:
@ -22,6 +21,15 @@ services:
- ./custom:/firefish/custom:ro - ./custom:/firefish/custom:ro
- ./files:/firefish/files - ./files:/firefish/files
- ./.config:/firefish/.config:ro - ./.config:/firefish/.config:ro
healthcheck:
test: curl -f http://localhost:3000 || exit 1
interval: 5s
timeout: 5s
retries: 5
deploy:
resources:
limits:
memory: 4096M
redis: redis:
restart: unless-stopped restart: unless-stopped
@ -31,10 +39,20 @@ services:
- calcnet - calcnet
volumes: volumes:
- ./redis:/data - ./redis:/data
healthcheck:
test: redis-cli ping
interval: 5s
timeout: 5s
retries: 5
# deploy:
# resources:
# limits:
# memory: 200M
db: db:
restart: unless-stopped restart: unless-stopped
image: docker.io/postgres:16-alpine image: docker.io/groonga/pgroonga:3.1.8-alpine-16-slim
container_name: firefish_db container_name: firefish_db
networks: networks:
- calcnet - calcnet
@ -42,33 +60,15 @@ services:
- .config/docker.env - .config/docker.env
volumes: volumes:
- ./db:/var/lib/postgresql/data - ./db:/var/lib/postgresql/data
healthcheck:
### Only one of the below should be used. test: pg_isready --user="$${POSTGRES_USER}" --dbname="$${POSTGRES_DB}"
### Meilisearch is better overall, but resource-intensive. Sonic is a very light full text search engine. interval: 5s
timeout: 5s
# meilisearch: retries: 5
# container_name: meilisearch # deploy:
# image: getmeili/meilisearch:v1.1.1 # resources:
# environment: # limits:
# - MEILI_ENV=${MEILI_ENV:-development} # memory: 200M
# ports:
# - "7700:7700"
# networks:
# - calcnet
# volumes:
# - ./meili_data:/meili_data
# restart: unless-stopped
# sonic:
# restart: unless-stopped
# image: docker.io/valeriansaliou/sonic:v1.4.0
# logging:
# driver: none
# networks:
# - calcnet
# volumes:
# - ./sonic:/var/lib/sonic/store
# - ./sonic/config.cfg:/etc/sonic.cfg
networks: networks:
calcnet: calcnet:

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

View file

@ -2,6 +2,17 @@
Breaking changes are indicated by the :warning: icon. Breaking changes are indicated by the :warning: icon.
## 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 ## v20240301
- With the addition of new features, the following endpoints are added: - With the addition of new features, the following endpoints are added:

View file

@ -2,7 +2,22 @@
Critical security updates are indicated by the :warning: icon. Critical security updates are indicated by the :warning: icon.
## v20240301 - Server administrators should check [notice-for-admins.md](./notice-for-admins.md) as well.
- Third-party client/bot developers may want to check [api-change.md](./api-change.md) as well.
## [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 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 - Add ability to hide replies from certain users in timelines
@ -19,35 +34,36 @@ Critical security updates are indicated by the :warning: icon.
- Set reaction history to public - Set reaction history to public
- Change default server settings (existing servers are not affected) - Change default server settings (existing servers are not affected)
- Disable new user registration - Disable new user registration
- Fix bugs
## v20240229 ## [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 - Add ability to pull-down-to-refresh timelines in PWA
- Make passkey/security key independent of TOTP (!10670) - Make passkey/security key independent of TOTP (!10670)
- Fix bugs - Fix bugs
## v20240228 ## [v20240228](https://firefish.dev/firefish/firefish/-/compare/v20240225...v20240228?from_project_id=7&straight=false)
- Update "About Firefish" page (!10673) - Update "About Firefish" page (!10673)
- Fix bugs (!10675 !10676 !10678 !10679) - Fix bugs (!10675 !10676 !10678 !10679)
- Remove charts generation to improve performance (#10611) - Remove charts generation to improve performance (#10611)
## v20240225 ## [v20240225](https://firefish.dev/firefish/firefish/-/compare/v20240222...v20240225?from_project_id=7&straight=false)
- Fix bugs - Fix bugs
- Add syntax highlighting in MFM code blocks in various programming languages - Add syntax highlighting in MFM code blocks in various programming languages
## v20240222 ## [v20240222](https://firefish.dev/firefish/firefish/-/compare/v20240221-1...v20240222?from_project_id=7&straight=false)
- Enhance Mastodon post import feature (!10652) - Enhance Mastodon post import feature (!10652)
- Minor style change in the web client - Minor style change in the web client
- Refactoring - Refactoring
## v20240221-1 ## [v20240221-1](https://firefish.dev/firefish/firefish/-/compare/v20240221...v20240221-1?from_project_id=7&straight=false)
- Fix a bug - Fix a bug
## v20240221 ## [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 - 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 - Fix a bug that made impossible to update user profiles under some conditions
@ -55,11 +71,11 @@ Critical security updates are indicated by the :warning: icon.
- It's just a paraphrase of DMs without recipients - It's just a paraphrase of DMs without recipients
- You can also convert your existing public posts to private posts - You can also convert your existing public posts to private posts
## :warning: v20240217-1 ## :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) - Fix a [security issue](https://github.com/misskey-dev/misskey/security/advisories/GHSA-qqrm-9grj-6v32)
## v20240217 ## [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 - Add ability to specify the search engine used in the search bar MFM
- Remove auto NSFW media detection - Remove auto NSFW media detection
@ -68,49 +84,49 @@ Critical security updates are indicated by the :warning: icon.
- Change the second tab on the notifications page from "unread" to "reactions" - Change the second tab on the notifications page from "unread" to "reactions"
- Add ability to show a huge post button on the posting form - 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 - This is a joke feature inspired by https://mstdn.poyo.me/@prime/110668364208741253
- Bug fix - Fix bugs
- Add `/api/emojis` endpoint (compatible with Misskey v13) for better experiences with Misskey clients - 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. - 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 ## [v20240216](https://firefish.dev/firefish/firefish/-/compare/v20240215...v20240216?from_project_id=7&straight=false)
- Style changes in the web client (a770ef4314e21f17fdce1f19feb3758953b04486 ab39ff5954a392cc6688a02f1723e1702df5e35c 4eefd534d8150e2cd5cf31dddd327edceb5b84dc) - 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" - Clicking the "like" button now sends the actual emoji reaction (star, good, heart, etc.) instead of an empty "like"
## v20240215 ## [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 - 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 - Add a toggleable setting to replace the chat button with account menu on mobile
- Reduce the size of the container image (!10667) - Reduce the size of the container image (!10667)
## v20240214 ## [v20240214](https://firefish.dev/firefish/firefish/-/compare/v20240213...v20240214?from_project_id=7&straight=false)
- Fix container images - Fix container images
## v20240213 ## [v20240213](https://firefish.dev/firefish/firefish/-/compare/v20240212...v20240213?from_project_id=7&straight=false)
- Bug fix - Fix bugs
- Refactoring - Refactoring
## v20240212 ## [v20240212](https://firefish.dev/firefish/firefish/-/compare/v20240210...v20240212?from_project_id=7&straight=false)
- Refactoring - Refactoring
- Add a toggleable setting to hide follow buttons in a misclickable position - Add a toggleable setting to hide follow buttons in a misclickable position
- Add a toggleable setting to show preview in posting form by default - Add a toggleable setting to show preview in posting form by default
## v20240210 ## [v20240210](https://firefish.dev/firefish/firefish/-/compare/v20240208...v20240210?from_project_id=7&straight=false)
- Security update (cf5b42a160ae8a4d94bf3dcea04ce12935ca4f76) - Security update (cf5b42a160ae8a4d94bf3dcea04ce12935ca4f76)
- Refactoring - Refactoring
## v20240208 ## [v20240208](https://firefish.dev/firefish/firefish/-/compare/v20240206...v20240208?from_project_id=7&straight=false)
- Bug fix (!10654 !10665) - Fix bugs (!10654 !10665)
- Enlarge profile picture by clicking it (!10659) - Enlarge profile picture by clicking it (!10659)
- Support Pleroma chat (!10660) - Support Pleroma chat (!10660)
- [Add documentation about downgrading](./docs/downgrade.md) - [Add documentation about downgrading](./docs/downgrade.md)
## v20240206 ## [v20240206](https://firefish.dev/firefish/firefish/-/compare/v1.0.5-rc...v20240206?from_project_id=7&straight=false)
- Many bug fixes - Fix many bugs
- Per-post language selector (!10616) - Per-post language selector (!10616)

View file

@ -1,108 +0,0 @@
# Firefish Developer Docs
## Nix Dev Environment
The Firefish repo comes with a Nix-based shell environment to help make development as easy as possible!
Please note, however, that this environment will not work on Windows outside of a WSL2 environment.
### Prerequisites
- Installed the [Nix Package Manager](https://nixos.org/download.html) (use the comman on their website)
- Installed [direnv](https://direnv.net/docs/installation.html) and added its hook to your shell. (package manager)
Once the repo is cloned to your computer, follow these next few steps inside the Firefish folder:
- Run `direnv allow`. This will build the environment and install all needed tools.
- Run `install-deps`, then `prepare-config`, to install the node dependencies and prepare the needed config files.
- In a second terminal, run `devenv up`. This will spawn a **Redis** server, a **Postgres** server, and the **Firefish** server in dev mode.
- Once you see the Firefish banner printed in your second terminal, run `migrate` in the first.
- Once migrations finish, open http://localhost:3000 in your web browser.
- You should now see the admin user creation screen!
Note: When you want to restart a dev server, all you need to do is run `devenv up`, no other steps are necessary.
# Possible Troubles with the dev enviroment
(this doesn't have to be done under normal conditions, this is for future reference)
### direnv
If you have any trouble with `direnv allow`
Check that the contents of `.envrc` have the same version of nix-direnv that is specified here:
> nix-direnv under -> installation -> using direnv source url
> https://github.com/nix-community/nix-direnv#direnv-source_url
there should be no errors during `direnv allow`
### outdated nix packages
if `install-deps` or any subsequent command doesn't run due to versioning problems
`flake.nix` and `flake.lock` may be outdated
delete `flake.lock`, or better, run `nix flake update --extra-experimental-features flakes --extra-experimental-features nix-command`
after that, run `direnv rebuild`
if there are any errors, you might have to change `flake.nix`
(because the available options can change between versions - consider getting support in [the matrix channel](https://matrix.to/#/#firefish-community:nitro.chat))
### after changing a node version
in my case, i had to change the node version from 19, to 18
! before proceeding, make sure to delete all build artifacts!
remove `node_modules` and `built` folders, and maybe `.devenv` and `.direnv` as well
manually, or run `npm cache clean --force` and `pnpm cleanall`
### Windows Subsystem for Linux
if `devenv up` terminates because of wrong folder permissions,
create the file `/etc/wsl.conf` in your distro and add
```shell
[automount]
options = "metadata"
```
this allows `chmod` calls to actually have an effect.
the build scripts DO actually set the permissions, it just needs to work in wsl.
### devenv up
devenv up may take a looong time. (some say this is fake news, maybe it was bad luck in my case)
do not get spooked by this error:
```
> firefish@14.0.0-dev32 start /mnt/.../firefish
> pnpm --filter backend run start
> backend@ start /mnt/.../firefish/packages/backend
> pnpm node ./built/index.js
node:internal/modules/cjs/loader:1078
throw err;
^
Error: Cannot find module '/mnt/.../firefish/packages/backend/built/index.js'
at Module._resolveFilename (node:internal/modules/cjs/loader:1075:15)
at Module._load (node:internal/modules/cjs/loader:920:27)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47 {
code: 'MODULE_NOT_FOUND',
requireStack: []
}
Node.js v18.16.0
undefined
/mnt/.../firefish/packages/backend:
ERR_PNPM_RECURSIVE_RUN_FIRST_FAIL backend@ start: `pnpm node ./built/index.js`
Exit status 1
ELIFECYCLE Command failed with exit code 1.
```
the script is designed to constantly try to start the server, while the build is still running.
this just means that the build isn't finished yet.
at some point you should see a banner that says "Firefish" in big letters -
then you're good to go and can run `migrate` (in another terminal)!
if you don't see the banner,
and it's for some reason stuck on `Finished 'build' after 917 ms` for a view minutes,
just leave devenv running and open another terminal in the folder
run `migrate` and then `pnpm --filter backend run start` by yourself
the server should start

View file

@ -1,6 +1,12 @@
BEGIN; BEGIN;
DELETE FROM "migrations" WHERE name IN ( DELETE FROM "migrations" WHERE name IN (
'FixMutingIndices1710690239308',
'NoteFile1710304584214',
'RenameMetaColumns1705944717480',
'SeparateHardMuteWordsAndPatterns1706413792769',
'IndexAltTextAndCw1708872574733',
'Pgroonga1698420787202',
'ChangeDefaultConfigs1709251460718', 'ChangeDefaultConfigs1709251460718',
'AddReplyMuting1704851359889', 'AddReplyMuting1704851359889',
'FixNoteUrlIndex1709129810501', 'FixNoteUrlIndex1709129810501',
@ -12,6 +18,39 @@ DELETE FROM "migrations" WHERE name IN (
'RemoveNativeUtilsMigration1705877093218' 'RemoveNativeUtilsMigration1705877093218'
); );
-- 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 -- change-default-configs
ALTER TABLE "user_profile" ALTER COLUMN "noCrawle" SET DEFAULT false; ALTER TABLE "user_profile" ALTER COLUMN "noCrawle" SET DEFAULT false;
ALTER TABLE "user_profile" ALTER COLUMN "publicReactions" SET DEFAULT false; ALTER TABLE "user_profile" ALTER COLUMN "publicReactions" SET DEFAULT false;

View file

@ -1,41 +0,0 @@
diff --git a/packages/backend/migration/1661376843000-remove-mentioned-remote-users-column.js b/packages/backend/migration/1661376843000-remove-mentioned-remote-users-column.js
index 42d79b5b5..1fd5e0f10 100644
--- a/packages/backend/migration/1661376843000-remove-mentioned-remote-users-column.js
+++ b/packages/backend/migration/1661376843000-remove-mentioned-remote-users-column.js
@@ -7,6 +7,22 @@ export class removeMentionedRemoteUsersColumn1661376843000 {
async down(queryRunner) {
await queryRunner.query(`ALTER TABLE "note" ADD "mentionedRemoteUsers" TEXT NOT NULL DEFAULT '[]'::text`);
- await queryRunner.query(`UPDATE "note" SET "mentionedRemoteUsers" = (SELECT COALESCE(json_agg(row_to_json("data"))::text, '[]') FROM (SELECT "url", "uri", "username", "host" FROM "user" JOIN "user_profile" ON "user"."id" = "user_profile". "userId" WHERE "user"."host" IS NOT NULL AND "user"."id" = ANY("note"."mentions")) AS "data")`);
+ await queryRunner.query(`
+ CREATE TEMP TABLE IF NOT EXISTS "temp_mentions" AS
+ SELECT "id", "url", "uri", "username", "host"
+ FROM "user"
+ JOIN "user_profile" ON "user"."id" = "user_profile"."userId" WHERE "user"."host" IS NOT NULL
+ `);
+
+ await queryRunner.query(`
+ CREATE UNIQUE INDEX "temp_mentions_id" ON "temp_mentions"("id")
+ `);
+
+ await queryRunner.query(`
+ UPDATE "note" SET "mentionedRemoteUsers" = (
+ SELECT COALESCE(json_agg(row_to_json("data")::jsonb - 'id')::text, '[]') FROM "temp_mentions" AS "data"
+ WHERE "data"."id" = ANY("note"."mentions")
+ )
+ `);
}
}
diff --git a/packages/backend/migration/1663399074403-resize-comments-drive-file.js b/packages/backend/migration/1663399074403-resize-comments-drive-file.js
index a037f1655..0873aec9b 100644
--- a/packages/backend/migration/1663399074403-resize-comments-drive-file.js
+++ b/packages/backend/migration/1663399074403-resize-comments-drive-file.js
@@ -9,6 +9,6 @@ export class resizeCommentsDriveFile1663399074403 {
}
async down(queryRunner) {
- await queryRunner.query(`ALTER TABLE "drive_file" ALTER COLUMN "comment" TYPE character varying(512)`);
- }
+ console.log('This migration cannot be reverted, skipping...');
+ }
}

View file

@ -1,19 +1,13 @@
# Running a Firefish server with Docker # Running a Firefish server with containers
## Pre-built docker container ## Prerequisites
[registry.firefish.dev/firefish/firefish](https://firefish.dev/firefish/firefish/container_registry)
## `docker-compose` - 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).
There are example config files that you can use to build the container from source ## Configuration
- docker-compose.example.yml (**compose file**) Copy the example config files:
- .config/docker_example.env (**db config settings**)
- .config/default.yml (**firefish server settings**)
## Configuring
Copy the files:
```sh ```sh
cp docker-compose.example.yml docker-compose.yml cp docker-compose.example.yml docker-compose.yml
@ -23,20 +17,31 @@ cp .config/docker_example.env .config/docker.env
then edit them according to your environment. 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: 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. - `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`, `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*) - `host`will need to be configured in the *Redis configuration* section - it is the name of the redis container (eg: *firefish_redis_1*)
- `auth` will need to be configured in the *Sonic* section - cannot be the default `SecretPassword`
Everything else can be left as-is. Everything else can be left as-is.
## Running docker-compose ## Pull the container image
The [prebuilt container for firefish](https://firefish.dev/firefish/firefish/container_registry) is fairly large, and may take a few minutes to download and extract using docker. The image tag is [`registry.firefish.dev/firefish/firefish:latest`](https://firefish.dev/firefish/firefish/container_registry/1).
Copy `docker-compose.yml` and the `config/` to a directory, then run the **docker-compose** command: ```sh
`docker-compose up -d`. docker pull registry.firefish.dev/firefish/firefish:latest
# or podman pull registry.firefish.dev/firefish/firefish:latest
```
## 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. 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). 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](./install.md#5-preparation-for-publishing-a-server).

317
docs/install.md Normal file
View file

@ -0,0 +1,317 @@
# Install Firefish
This document shows an example procedure for installing Firefish on Debian 12. Note that there is much room for customizing the server setup; this document merely demonstrates a simple installation.
If you want to use the pre-built container image, please refer to [`install-container.md`](./install-container.md).
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 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 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"
# 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
```
## Upgrading
Please refer to the [upgrade instruction](./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
```
## 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 gulp`.
- 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

View file

@ -1,45 +0,0 @@
# Running a Firefish server with Kubernetes and Helm
This is a [Helm](https://helm.sh/) chart directory in the root of the project
that you can use to deploy firefish to a Kubernetes cluster
## Deployment
1. Copy the example helm values and make your changes:
```shell
cp .config/helm_values_example.yml .config/helm_values.yml
```
2. Update helm dependencies:
```shell
cd chart
helm dependency list $dir 2> /dev/null | tail +2 | head -n -1 | awk '{ print "helm repo add " $1 " " $3 }' | while read cmd; do $cmd; done;
cd ../
```
3. Create the firefish helm release (also used to update existing deployment):
```shell
helm upgrade \
--install \
--namespace firefish \
--create-namespace \
firefish chart/ \
-f .config/helm_values.yml
```
4. Watch your firefish server spin up:
```shell
kubectl -n firefish get po -w
```
5. Initial the admin user and managed config:
```shell
export firefish_USERNAME="my_desired_admin_handle" && \
export firefish_PASSWORD="myDesiredInitialPassword" && \
export firefish_HOST="firefish.example.com" && \
export firefish_TOKEN=$(curl -X POST https://$firefish_HOST/api/admin/accounts/create -H "Content-Type: application/json" -d "{ \"username\":\"$firefish_USERNAME\", \"password\":\"$firefish_PASSWORD\" }" | jq -r '.token') && \
echo "Save this token: ${firefish_TOKEN}" && \
curl -X POST -H "Authorization: Bearer $firefish_TOKEN" https://$firefish_HOST/api/admin/accounts/hosted
```
6. Enjoy!

View file

@ -1,106 +0,0 @@
# Migrating from Misskey/FoundKey to Firefish
All the guides below assume you're starting in the root of the repo directory.
### Before proceeding
- **Ensure you have stopped all master and worker processes of Misskey.**
- **Ensure you have backups of the database before performing any commands.**
## Misskey v13 and above
Tested with Misskey v13.11.3.
If your Misskey v13 is older, we recommend updating your Misskey to v13.11.3.
```sh
wget -O mkv13.patch https://firefish.dev/firefish/firefish/-/raw/develop/docs/mkv13.patch
wget -O mkv13_restore.patch https://firefish.dev/firefish/firefish/-/raw/develop/docs/mkv13_restore.patch
git apply mkv13.patch mkv13_restore.patch
cd packages/backend
LINE_NUM="$(pnpm typeorm migration:show -d ormconfig.js | grep -n activeEmailValidation1657346559800 | cut -d ':' -f 1)"
NUM_MIGRATIONS="$(pnpm typeorm migration:show -d ormconfig.js | tail -n+"$LINE_NUM" | grep '\[X\]' | wc -l)"
for i in $(seq 1 $NUM_MIGRATIONS); do pnpm typeorm migration:revert -d ormconfig.js; done
cd ../../
git remote set-url origin https://firefish.dev/firefish/firefish.git
git fetch origin
git stash push
rm -rf fluent-emojis misskey-assets
git switch main # or beta or develop
git pull --ff
wget -O renote_muting.patch https://firefish.dev/firefish/firefish/-/raw/develop/docs/renote_muting.patch
git apply renote_muting.patch
pnpm install
NODE_ENV=production pnpm run build
pnpm run migrate
git stash push
```
Depending on the version you're migrating from, you may have to open Postgres with `psql -d your_database` and run the following commands:
```sql
ALTER TABLE "meta" ADD COLUMN "disableLocalTimeline" boolean DEFAULT false;
ALTER TABLE "meta" ADD COLUMN "disableGlobalTimeline" boolean DEFAULT false;
ALTER TABLE "meta" ADD COLUMN "localDriveCapacityMb" integer DEFAULT 512;
ALTER TABLE "meta" ADD COLUMN "remoteDriveCapacityMb" integer DEFAULT 128;
ALTER TABLE "user" ADD COLUMN "isSilenced" boolean DEFAULT false;
ALTER TABLE "user" ADD COLUMN "isAdmin" boolean DEFAULT false;
ALTER TABLE "user" ADD COLUMN "isModerator" boolean DEFAULT false;
ALTER TABLE "user" ADD COLUMN "remoteDriveCapacityMb" integer DEFAULT 128;
ALTER TABLE "user" ADD COLUMN "driveCapacityOverrideMb" integer DEFAULT 128;
ALTER TABLE "instance" ADD COLUMN "caughtAt" date;
ALTER TABLE "instance" ADD COLUMN "latestRequestSentAt" date;
ALTER TABLE "instance" ADD COLUMN "latestStatus" character varying(512);
ALTER TABLE "instance" ADD COLUMN "lastCommunicatedAt" date;
```
then quit with `\q`, and restart Firefish.
Note: Ignore errors of `column "xxx" of relation "xxx" already exists`.
If no other errors happened, your Firefish is ready to launch!
## Misskey v12.119 and before
```sh
git remote set-url origin https://firefish.dev/firefish/firefish.git
git fetch
git checkout main # or beta or develop
git pull --ff
NODE_ENV=production pnpm run migrate
# build using prefered method
```
## FoundKey
```sh
wget -O fk.patch https://firefish.dev/firefish/firefish/-/raw/develop/docs/fk.patch
git apply fk.patch
cd packages/backend
LINE_NUM="$(npx typeorm migration:show -d ormconfig.js | grep -n uniformThemecolor1652859567549 | cut -d ':' -f 1)"
NUM_MIGRATIONS="$(npx typeorm migration:show -d ormconfig.js | tail -n+"$LINE_NUM" | grep '\[X\]' | wc -l)"
for i in $(seq 1 $NUM_MIGRATIONS); do
npx typeorm migration:revert -d ormconfig.js
done
git remote set-url origin https://firefish.dev/firefish/firefish.git
git fetch
git checkout main # or beta or develop
git pull --ff
NODE_ENV=production pnpm run migrate
# build using prefered method
```
## Reverse
You ***cannot*** migrate back to Misskey from Firefish due to re-hashing passwords on signin with argon2. You can migrate to [Sharkey](https://github.com/transfem-org/Sharkey), a soft fork of Misskey that uses argon2 though. You can also migrate from Firefish to FoundKey, although this is not recommended due to FoundKey being end-of-life, and may have some problems with alt-text.

View file

@ -1,45 +0,0 @@
diff --git a/packages/backend/migration/1672704017999-remove-lastCommunicatedAt.js b/packages/backend/migration/1672704017999-remove-lastCommunicatedAt.js
index 38a676985..c4ae690e0 100644
--- a/packages/backend/migration/1672704017999-remove-lastCommunicatedAt.js
+++ b/packages/backend/migration/1672704017999-remove-lastCommunicatedAt.js
@@ -6,6 +6,8 @@ export class removeLastCommunicatedAt1672704017999 {
}
async down(queryRunner) {
- await queryRunner.query(`ALTER TABLE "instance" ADD "lastCommunicatedAt" TIMESTAMP WITH TIME ZONE NOT NULL`);
+ await queryRunner.query(`ALTER TABLE "instance" ADD "lastCommunicatedAt" TIMESTAMP WITH TIME ZONE`);
+ await queryRunner.query(`UPDATE "instance" SET "lastCommunicatedAt" = COALESCE("infoUpdatedAt", "caughtAt")`);
+ await queryRunner.query(`ALTER TABLE "instance" ALTER COLUMN "lastCommunicatedAt" SET NOT NULL`);
}
}
diff --git a/packages/backend/migration/1673336077243-PollChoiceLength.js b/packages/backend/migration/1673336077243-PollChoiceLength.js
index 810c626e0..5809528cb 100644
--- a/packages/backend/migration/1673336077243-PollChoiceLength.js
+++ b/packages/backend/migration/1673336077243-PollChoiceLength.js
@@ -6,6 +6,6 @@ export class PollChoiceLength1673336077243 {
}
async down(queryRunner) {
- await queryRunner.query(`ALTER TABLE "poll" ALTER COLUMN "choices" TYPE character varying(128) array`);
+ //await queryRunner.query(`ALTER TABLE "poll" ALTER COLUMN "choices" TYPE character varying(128) array`);
}
}
diff --git a/packages/backend/migration/1674118260469-achievement.js b/packages/backend/migration/1674118260469-achievement.js
index 131ab96f8..57a922f83 100644
--- a/packages/backend/migration/1674118260469-achievement.js
+++ b/packages/backend/migration/1674118260469-achievement.js
@@ -18,12 +18,13 @@ export class achievement1674118260469 {
async down(queryRunner) {
await queryRunner.query(`CREATE TYPE "public"."user_profile_mutingnotificationtypes_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app', 'pollEnded')`);
+ await queryRunner.query(`CREATE TYPE "public"."notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" DROP DEFAULT`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" TYPE "public"."user_profile_mutingnotificationtypes_enum_old"[] USING "mutingNotificationTypes"::"text"::"public"."user_profile_mutingnotificationtypes_enum_old"[]`);
await queryRunner.query(`ALTER TABLE "user_profile" ALTER COLUMN "mutingNotificationTypes" SET DEFAULT '{}'`);
await queryRunner.query(`DROP TYPE "public"."user_profile_mutingnotificationtypes_enum"`);
await queryRunner.query(`ALTER TYPE "public"."user_profile_mutingnotificationtypes_enum_old" RENAME TO "user_profile_mutingnotificationtypes_enum"`);
- await queryRunner.query(`CREATE TYPE "public"."notification_type_enum_old" AS ENUM('follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited', 'app')`);
+ await queryRunner.query(`DELETE FROM "public"."notification" WHERE "type" = 'achievementEarned'`);
await queryRunner.query(`ALTER TABLE "notification" ALTER COLUMN "type" TYPE "public"."notification_type_enum_old" USING "type"::"text"::"public"."notification_type_enum_old"`);
await queryRunner.query(`DROP TYPE "public"."notification_type_enum"`);
await queryRunner.query(`ALTER TYPE "public"."notification_type_enum_old" RENAME TO "notification_type_enum"`);

View file

@ -1,127 +0,0 @@
diff --git a/packages/backend/migration/1680491187535-cleanup.js b/packages/backend/migration/1680491187535-cleanup.js
index 1e609ca06..0e6accf3e 100644
--- a/packages/backend/migration/1680491187535-cleanup.js
+++ b/packages/backend/migration/1680491187535-cleanup.js
@@ -1,10 +1,40 @@
export class cleanup1680491187535 {
- name = 'cleanup1680491187535'
+ name = "cleanup1680491187535";
- async up(queryRunner) {
- await queryRunner.query(`DROP TABLE "antenna_note" `);
- }
+ async up(queryRunner) {
+ await queryRunner.query(`DROP TABLE "antenna_note" `);
+ }
- async down(queryRunner) {
- }
+ async down(queryRunner) {
+ await queryRunner.query(
+ `CREATE TABLE antenna_note ( id character varying(32) NOT NULL, "noteId" character varying(32) NOT NULL, "antennaId" character varying(32) NOT NULL, read boolean DEFAULT false NOT NULL)`,
+ );
+ await queryRunner.query(
+ `COMMENT ON COLUMN antenna_note."noteId" IS 'The note ID.'`,
+ );
+ await queryRunner.query(
+ `COMMENT ON COLUMN antenna_note."antennaId" IS 'The antenna ID.'`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE ONLY antenna_note ADD CONSTRAINT "PK_fb28d94d0989a3872df19fd6ef8" PRIMARY KEY (id)`,
+ );
+ await queryRunner.query(
+ `CREATE INDEX "IDX_0d775946662d2575dfd2068a5f" ON antenna_note USING btree ("antennaId")`,
+ );
+ await queryRunner.query(
+ `CREATE UNIQUE INDEX "IDX_335a0bf3f904406f9ef3dd51c2" ON antenna_note USING btree ("noteId", "antennaId")`,
+ );
+ await queryRunner.query(
+ `CREATE INDEX "IDX_9937ea48d7ae97ffb4f3f063a4" ON antenna_note USING btree (read)`,
+ );
+ await queryRunner.query(
+ `CREATE INDEX "IDX_bd0397be22147e17210940e125" ON antenna_note USING btree ("noteId")`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE ONLY antenna_note ADD CONSTRAINT "FK_0d775946662d2575dfd2068a5f5" FOREIGN KEY ("antennaId") REFERENCES antenna(id) ON DELETE CASCADE`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE ONLY antenna_note ADD CONSTRAINT "FK_bd0397be22147e17210940e125b" FOREIGN KEY ("noteId") REFERENCES note(id) ON DELETE CASCADE`,
+ );
+ }
}
diff --git a/packages/backend/migration/1680582195041-cleanup.js b/packages/backend/migration/1680582195041-cleanup.js
index c587e456a..a91d6ff3c 100644
--- a/packages/backend/migration/1680582195041-cleanup.js
+++ b/packages/backend/migration/1680582195041-cleanup.js
@@ -1,11 +1,64 @@
export class cleanup1680582195041 {
- name = 'cleanup1680582195041'
+ name = "cleanup1680582195041";
- async up(queryRunner) {
- await queryRunner.query(`DROP TABLE "notification" `);
- }
+ async up(queryRunner) {
+ await queryRunner.query(`DROP TABLE "notification"`);
+ }
- async down(queryRunner) {
-
- }
+ async down(queryRunner) {
+ await queryRunner.query(
+ `CREATE TABLE notification ( id character varying(32) NOT NULL, "createdAt" timestamp with time zone NOT NULL, "notifieeId" character varying(32) NOT NULL, "notifierId" character varying(32), "isRead" boolean DEFAULT false NOT NULL, "noteId" character varying(32), reaction character varying(128), choice integer, "followRequestId" character varying(32), type notification_type_enum NOT NULL, "customBody" character varying(2048), "customHeader" character varying(256), "customIcon" character varying(1024), "appAccessTokenId" character varying(32), achievement character varying(128))`,
+ );
+ await queryRunner.query(
+ `COMMENT ON COLUMN notification."createdAt" IS 'The created date of the Notification.'`,
+ );
+ await queryRunner.query(
+ `COMMENT ON COLUMN notification."notifieeId" IS 'The ID of recipient user of the Notification.'`,
+ );
+ await queryRunner.query(
+ `COMMENT ON COLUMN notification."notifierId" IS 'The ID of sender user of the Notification.'`,
+ );
+ await queryRunner.query(
+ `COMMENT ON COLUMN notification."isRead" IS 'Whether the Notification is read.'`,
+ );
+ await queryRunner.query(
+ `COMMENT ON COLUMN notification.type IS 'The type of the Notification.'`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "PK_705b6c7cdf9b2c2ff7ac7872cb7" PRIMARY KEY (id)`,
+ );
+ await queryRunner.query(
+ `CREATE INDEX "IDX_080ab397c379af09b9d2169e5b" ON notification USING btree ("isRead")`,
+ );
+ await queryRunner.query(
+ `CREATE INDEX "IDX_33f33cc8ef29d805a97ff4628b" ON notification USING btree (type)`,
+ );
+ await queryRunner.query(
+ `CREATE INDEX "IDX_3b4e96eec8d36a8bbb9d02aa71" ON notification USING btree ("notifierId")`,
+ );
+ await queryRunner.query(
+ `CREATE INDEX "IDX_3c601b70a1066d2c8b517094cb" ON notification USING btree ("notifieeId")`,
+ );
+ await queryRunner.query(
+ `CREATE INDEX "IDX_b11a5e627c41d4dc3170f1d370" ON notification USING btree ("createdAt")`,
+ );
+ await queryRunner.query(
+ `CREATE INDEX "IDX_e22bf6bda77b6adc1fd9e75c8c" ON notification USING btree ("appAccessTokenId")`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_3b4e96eec8d36a8bbb9d02aa710" FOREIGN KEY ("notifierId") REFERENCES "user"(id) ON DELETE CASCADE`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_3c601b70a1066d2c8b517094cb9" FOREIGN KEY ("notifieeId") REFERENCES "user"(id) ON DELETE CASCADE`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_769cb6b73a1efe22ddf733ac453" FOREIGN KEY ("noteId") REFERENCES note(id) ON DELETE CASCADE`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_bd7fab507621e635b32cd31892c" FOREIGN KEY ("followRequestId") REFERENCES follow_request(id) ON DELETE CASCADE`,
+ );
+ await queryRunner.query(
+ `ALTER TABLE ONLY notification ADD CONSTRAINT "FK_e22bf6bda77b6adc1fd9e75c8c9" FOREIGN KEY ("appAccessTokenId") REFERENCES access_token(id) ON DELETE CASCADE`,
+ );
+ }
}

View file

@ -1,12 +1,146 @@
# v20240301 # Notice for server administrators
## For all users 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](./upgrade.md).
## 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.
#### 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, and there are no instructions for Arch Linux and Fedora, we explicitly list the instructions for Ubuntu, Arch Linux and Fedora here. Please keep in mind that this is not official information and the procedures may change.
##### Ubuntu
1. Add apt repository
```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
echo "deb http://apt.postgresql.org/pub/repos/apt/ $(lsb_release --codename --short)-pgdg main" | sudo tee /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
```
2. Install PGroonga
```sh
# Please replace "16" with your PostgreSQL major version
sudo apt install postgresql-16-pgdg-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 && docker-compose exec db sh -c 'psql --user="${POSTGRES_USER}" --dbname="${POSTGRES_DB}" --command="CREATE EXTENSION pgroonga;"'
# or podman-compose up db --detach && 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)) 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 ## v20240225
## For Docker/Podman users ### 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`: - 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 ```yaml
@ -21,9 +155,9 @@ A new setting item has been added to control the log levels, so please consider
- ./.config:/firefish/.config:ro - ./.config:/firefish/.config:ro
``` ```
# v20240222 ## v20240222
## For Docker/Podman users ### 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. - 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. - 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.
@ -49,9 +183,9 @@ A new setting item has been added to control the log levels, so please consider
- 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`). - 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> - 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 ## v20240214
## For systemd/pm2 users ### For systemd/pm2 users
- Required Rust version has been bumped from v1.70 to v1.74. - Required Rust version has been bumped from v1.70 to v1.74.
```sh ```sh
@ -59,9 +193,9 @@ A new setting item has been added to control the log levels, so please consider
rustup update # update version rustup update # update version
``` ```
# v20240213 ## v20240213
## For systemd/pm2 users ### For systemd/pm2 users
- `packages/backend/native-utils` can be removed. - `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. - 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.
@ -70,16 +204,16 @@ A new setting item has been added to control the log levels, so please consider
rm --recursive --force packages/backend/native-utils rm --recursive --force packages/backend/native-utils
``` ```
# v20240206 ## v20240206
## For all users ### For all users
- The git repository has been moved, so please update the `git remote` url. - The git repository has been moved, so please update the `git remote` url.
```sh ```sh
git remote set-url origin https://firefish.dev/firefish/firefish.git git remote set-url origin https://firefish.dev/firefish/firefish.git
``` ```
## For systemd/pm2 users ### For systemd/pm2 users
- Required Rust version has been bumped from v1.68 to v1.70. - 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: - `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:
@ -88,6 +222,6 @@ A new setting item has been added to control the log levels, so please consider
pnpm install pnpm install
``` ```
## For Docker/Podman users ### For Docker/Podman users
- The image tag has been changed to `registry.firefish.dev/firefish/firefish:latest`, so please update `docker-compose.yml`. - The image tag has been changed to `registry.firefish.dev/firefish/firefish:latest`, so please update `docker-compose.yml`.

View file

@ -1,23 +0,0 @@
diff --git a/packages/backend/migration/1665091090561-add-renote-muting.js b/packages/backend/migration/1665091090561-add-renote-muting.js
index 2c76aaff5..f8541c818 100644
--- a/packages/backend/migration/1665091090561-add-renote-muting.js
+++ b/packages/backend/migration/1665091090561-add-renote-muting.js
@@ -4,18 +4,6 @@ export class addRenoteMuting1665091090561 {
}
async up(queryRunner) {
- await queryRunner.query(
- `CREATE TABLE "renote_muting" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "muteeId" character varying(32) NOT NULL, "muterId" character varying(32) NOT NULL, CONSTRAINT "PK_renoteMuting_id" PRIMARY KEY ("id"))`,
- );
- await queryRunner.query(
- `CREATE INDEX "IDX_renote_muting_createdAt" ON "muting" ("createdAt") `,
- );
- await queryRunner.query(
- `CREATE INDEX "IDX_renote_muting_muteeId" ON "muting" ("muteeId") `,
- );
- await queryRunner.query(
- `CREATE INDEX "IDX_renote_muting_muterId" ON "muting" ("muterId") `,
- );
}
async down(queryRunner) {}

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`](./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`](./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
```

View file

@ -1,13 +0,0 @@
# Replace example.tld with your domain
<VirtualHost *:80>
ServerName example.tld
# For WebSocket
ProxyPass "/streaming" "ws://127.0.0.1:3000/streaming/"
# Proxy to Node
ProxyPass "/" "http://127.0.0.1:3000/"
ProxyPassReverse "/" "http://127.0.0.1:3000/"
ProxyPreserveHost On
# For files proxy
AllowEncodedSlashes On
</VirtualHost>

View file

@ -1,294 +0,0 @@
{
"nodes": {
"devenv": {
"inputs": {
"flake-compat": "flake-compat",
"nix": "nix",
"nixpkgs": "nixpkgs",
"pre-commit-hooks": "pre-commit-hooks"
},
"locked": {
"lastModified": 1685521914,
"narHash": "sha256-0fdFP5IASLwJ0PSXrErW8PZon9TVYmi8VRF8OtjGkV4=",
"owner": "cachix",
"repo": "devenv",
"rev": "e206d8f2e3e8d6aa943656052f15bdfea8146b8d",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "devenv",
"type": "github"
}
},
"fenix": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"rust-analyzer-src": "rust-analyzer-src"
},
"locked": {
"lastModified": 1685514167,
"narHash": "sha256-urRxF0ZGSNeZjM4kALNg3wTh7fBscbqQmS6S/HU7Wms=",
"owner": "nix-community",
"repo": "fenix",
"rev": "3abfea51663583186f687c49a157eab1639349ca",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "fenix",
"type": "github"
}
},
"flake-compat": {
"flake": false,
"locked": {
"lastModified": 1673956053,
"narHash": "sha256-4gtG9iQuiKITOjNQQeQIpoIB6b16fm+504Ch3sNKLd8=",
"owner": "edolstra",
"repo": "flake-compat",
"rev": "35bb57c0c8d8b62bbfd284272c928ceb64ddbde9",
"type": "github"
},
"original": {
"owner": "edolstra",
"repo": "flake-compat",
"type": "github"
}
},
"flake-parts": {
"inputs": {
"nixpkgs-lib": "nixpkgs-lib"
},
"locked": {
"lastModified": 1685457039,
"narHash": "sha256-bEFtQm+YyLxQjKQAaBHJyPN1z2wbhBnr2g1NJWSYjwM=",
"owner": "hercules-ci",
"repo": "flake-parts",
"rev": "80717d11615b6f42d1ad2e18ead51193fc15de69",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "flake-parts",
"type": "github"
}
},
"flake-utils": {
"locked": {
"lastModified": 1667395993,
"narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
},
"gitignore": {
"inputs": {
"nixpkgs": [
"devenv",
"pre-commit-hooks",
"nixpkgs"
]
},
"locked": {
"lastModified": 1660459072,
"narHash": "sha256-8DFJjXG8zqoONA1vXtgeKXy68KdJL5UaXR8NtVMUbx8=",
"owner": "hercules-ci",
"repo": "gitignore.nix",
"rev": "a20de23b925fd8264fd7fad6454652e142fd7f73",
"type": "github"
},
"original": {
"owner": "hercules-ci",
"repo": "gitignore.nix",
"type": "github"
}
},
"lowdown-src": {
"flake": false,
"locked": {
"lastModified": 1633514407,
"narHash": "sha256-Dw32tiMjdK9t3ETl5fzGrutQTzh2rufgZV4A/BbxuD4=",
"owner": "kristapsdz",
"repo": "lowdown",
"rev": "d2c2b44ff6c27b936ec27358a2653caaef8f73b8",
"type": "github"
},
"original": {
"owner": "kristapsdz",
"repo": "lowdown",
"type": "github"
}
},
"nix": {
"inputs": {
"lowdown-src": "lowdown-src",
"nixpkgs": [
"devenv",
"nixpkgs"
],
"nixpkgs-regression": "nixpkgs-regression"
},
"locked": {
"lastModified": 1676545802,
"narHash": "sha256-EK4rZ+Hd5hsvXnzSzk2ikhStJnD63odF7SzsQ8CuSPU=",
"owner": "domenkozar",
"repo": "nix",
"rev": "7c91803598ffbcfe4a55c44ac6d49b2cf07a527f",
"type": "github"
},
"original": {
"owner": "domenkozar",
"ref": "relaxed-flakes",
"repo": "nix",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1678875422,
"narHash": "sha256-T3o6NcQPwXjxJMn2shz86Chch4ljXgZn746c2caGxd8=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "126f49a01de5b7e35a43fd43f891ecf6d3a51459",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-lib": {
"locked": {
"dir": "lib",
"lastModified": 1682879489,
"narHash": "sha256-sASwo8gBt7JDnOOstnps90K1wxmVfyhsTPPNTGBPjjg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "da45bf6ec7bbcc5d1e14d3795c025199f28e0de0",
"type": "github"
},
"original": {
"dir": "lib",
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs-regression": {
"locked": {
"lastModified": 1643052045,
"narHash": "sha256-uGJ0VXIhWKGXxkeNnq4TvV3CIOkUJ3PAoLZ3HMzNVMw=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
"type": "github"
},
"original": {
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "215d4d0fd80ca5163643b03a33fde804a29cc1e2",
"type": "github"
}
},
"nixpkgs-stable": {
"locked": {
"lastModified": 1678872516,
"narHash": "sha256-/E1YwtMtFAu2KUQKV/1+KFuReYPANM2Rzehk84VxVoc=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "9b8e5abb18324c7fe9f07cb100c3cd4a29cda8b8",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-22.11",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_2": {
"locked": {
"lastModified": 1685399834,
"narHash": "sha256-Lt7//5snriXSdJo5hlVcDkpERL1piiih0UXIz1RUcC4=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "58c85835512b0db938600b6fe13cc3e3dc4b364e",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"pre-commit-hooks": {
"inputs": {
"flake-compat": [
"devenv",
"flake-compat"
],
"flake-utils": "flake-utils",
"gitignore": "gitignore",
"nixpkgs": [
"devenv",
"nixpkgs"
],
"nixpkgs-stable": "nixpkgs-stable"
},
"locked": {
"lastModified": 1682596858,
"narHash": "sha256-Hf9XVpqaGqe/4oDGr30W8HlsWvJXtMsEPHDqHZA6dDg=",
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"rev": "fb58866e20af98779017134319b5663b8215d912",
"type": "github"
},
"original": {
"owner": "cachix",
"repo": "pre-commit-hooks.nix",
"type": "github"
}
},
"root": {
"inputs": {
"devenv": "devenv",
"fenix": "fenix",
"flake-parts": "flake-parts",
"nixpkgs": "nixpkgs_2"
}
},
"rust-analyzer-src": {
"flake": false,
"locked": {
"lastModified": 1685465261,
"narHash": "sha256-aJ2nUinUrNcFi+pb47bS5IIAeSiUEEPLJY8W4Q8Pcjk=",
"owner": "rust-lang",
"repo": "rust-analyzer",
"rev": "d2b3caa5b5694125fad04a9699e919444439f6a2",
"type": "github"
},
"original": {
"owner": "rust-lang",
"ref": "nightly",
"repo": "rust-analyzer",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

View file

@ -1,86 +0,0 @@
{
description = "Firefish development flake";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
# Flake Parts framework(https://flake.parts)
flake-parts.url = "github:hercules-ci/flake-parts";
# Devenv for better devShells(https://devenv.sh)
devenv.url = "github:cachix/devenv";
# Fenix for rust development
fenix.url = "github:nix-community/fenix";
fenix.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = inputs@{ flake-parts, ... }:
flake-parts.lib.mkFlake { inherit inputs; } {
imports = [
inputs.devenv.flakeModule
];
# Define the systems that this works on. Only tested with x66_64-linux, add more if you test and it works.
systems = [
"x86_64-linux"
];
# Expose these attributes for every system defined above.
perSystem = { config, pkgs, ... }: {
# Devenv shells
devenv = {
shells = {
# The default shell, used by nix-direnv
default = {
name = "firefish-dev-shell";
# Add additional packages to our environment
packages = [
pkgs.nodePackages.pnpm
pkgs.python3
];
# No need to warn on a new version, we'll update as needed.
devenv.warnOnNewVersion = false;
# Enable typescript support
languages.typescript.enable = true;
# Enable javascript for NPM and PNPM
languages.javascript.enable = true;
languages.javascript.package = pkgs.nodejs_18;
# Enable stable Rust for the backend
languages.rust.enable = true;
languages.rust.version = "stable";
processes = {
dev-server.exec = "pnpm run dev";
};
scripts = {
build.exec = "pnpm run build";
clean.exec = "pnpm run clean";
clear-state.exec = "rm -rf .devenv/state/redis .devenv/state/postgres";
format.exec = "pnpm run format";
install-deps.exec = "pnpm install";
migrate.exec = "pnpm run migrate";
prepare-config.exec = "cp .config/devenv.yml .config/default.yml";
};
services = {
postgres = {
enable = true;
package = pkgs.postgresql_12;
initialDatabases = [{
name = "firefish";
}];
initialScript = ''
CREATE USER firefish WITH PASSWORD 'firefish';
ALTER USER firefish WITH SUPERUSER;
GRANT ALL ON DATABASE firefish TO firefish;
'';
listen_addresses = "127.0.0.1";
port = 5432;
};
redis = {
enable = true;
bind = "127.0.0.1";
port = 6379;
};
};
};
};
};
};
};
}

869
locales/bg-BG.yml Normal file
View file

@ -0,0 +1,869 @@
_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: Резултати от търсенето
searchByGoogle: Търсене
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: Промяна на профилната снимка
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: Добавяне на константа
_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: Настройки на страницата
_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: Слаба парола
strongPassword: Силна парола
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: Всички публикации
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: Въведете ново описание

View file

@ -15,10 +15,10 @@ ok: "ঠিক"
gotIt: "বুঝেছি" gotIt: "বুঝেছি"
cancel: "বাতিল" cancel: "বাতিল"
enterUsername: "ইউজারনেম লিখুন" enterUsername: "ইউজারনেম লিখুন"
renotedBy: "{user} রিনোট করেছেন" renotedBy: "{user} দ্বারা বুস্ট করা হয়েছে"
noNotes: "কোন নোট নেই" noNotes: "No posts"
noNotifications: "কোনো বিজ্ঞপ্তি নেই" noNotifications: "কোনো বিজ্ঞপ্তি নেই"
instance: "ইন্সট্যান্স" instance: "সার্ভার"
settings: "সেটিংস" settings: "সেটিংস"
basicSettings: "সাধারণ সেটিংস" basicSettings: "সাধারণ সেটিংস"
otherSettings: "অন্যান্য সেটিংস" otherSettings: "অন্যান্য সেটিংস"
@ -46,8 +46,8 @@ copyContent: "বিষয়বস্তু কপি করুন"
copyLink: "লিঙ্ক কপি করুন" copyLink: "লিঙ্ক কপি করুন"
delete: "মুছুন" delete: "মুছুন"
deleteAndEdit: "মুছুন এবং সম্পাদনা করুন" deleteAndEdit: "মুছুন এবং সম্পাদনা করুন"
deleteAndEditConfirm: "আপনি কি এই নোটটি মুছে এটি সম্পাদনা করার বিষয়ে নিশ্চিত? আপনি deleteAndEditConfirm: "আপনি কি এই পোস্টটি মুছে ফেলার এবং এটি সম্পাদনা করার বিষয়ে
এটির সমস্ত রিঅ্যাকশন, রিনোট এবং জবাব হারাবেন।" নিশ্চিত? আপনি এটির সমস্ত প্রতিক্রিয়া, বুস্ট এবং উত্তর হারাবেন।"
addToList: "লিস্ট এ যোগ করুন" addToList: "লিস্ট এ যোগ করুন"
sendMessage: "একটি বার্তা পাঠান" sendMessage: "একটি বার্তা পাঠান"
copyUsername: "ব্যবহারকারীর নাম কপি করুন" copyUsername: "ব্যবহারকারীর নাম কপি করুন"
@ -61,18 +61,18 @@ receiveFollowRequest: "অনুসরণ করার জন্য অনুর
followRequestAccepted: "অনুসরণ করার অনুরোধ গৃহীত হয়েছে" followRequestAccepted: "অনুসরণ করার অনুরোধ গৃহীত হয়েছে"
mention: "উল্লেখ" mention: "উল্লেখ"
mentions: "উল্লেখসমূহ" mentions: "উল্লেখসমূহ"
directNotes: "ডাইরেক্ট নোটগুলি" directNotes: "প্রত্যক্ষ বার্তা"
importAndExport: "আমদানি এবং রপ্তানি" importAndExport: "ডেটা ইমপোর্ট/এক্সপোর্ট"
import: "আমদানি করুণ" import: "ইমপোর্ট করুণ"
export: "রপ্তানি" export: "এক্সপোর্ট করুন"
files: "ফাইলগুলি" files: "ফাইলগুলি"
download: "ডাউনলোড" download: "ডাউনলোড"
driveFileDeleteConfirm: "আপনি কি নিশ্চিত যে আপনি \"{name}\" ডিলিট করতে চান? যে সকল driveFileDeleteConfirm: "আপনি কি নিশ্চিত যে আপনি \"{name}\" ডিলিট করতে চান? যে সকল
নোটের সাথে এই ফাইলটি সংযুক্ত সেগুলোও ডিলিট করা হবে।" পোস্ট এর সাথে এই ফাইলটি সংযুক্ত সেগুলোও ডিলিট করা হবে।"
unfollowConfirm: "{name} কে আনফলোও করার ব্যাপারে নিশ্চিত?" unfollowConfirm: "{name} কে আনফলোও করার ব্যাপারে নিশ্চিত?"
exportRequested: "আপনার তথ্যসমূহ রপ্তানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে। exportRequested: "আপনার তথ্যসমূহ এক্সপোর্ট জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে
রপ্তানি সম্পন্ন হলে তা আপনার ড্রাইভে সংরক্ষিত হবে।" পারে। এক্সপোর্ট সম্পন্ন হলে তা আপনার ড্রাইভে সংরক্ষিত হবে।"
importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে। " importRequested: "আপনার তথ্যসমূহ আমদানির জন্য অনুরোধ করেছেন। এতে কিছু সময় লাগতে পারে।"
lists: "লিস্ট" lists: "লিস্ট"
noLists: "কোন লিস্ট নেই" noLists: "কোন লিস্ট নেই"
note: "নোট" note: "নোট"
@ -87,7 +87,7 @@ somethingHappened: "একটি ত্রুটি হয়েছে"
retry: "আবার চেষ্টা করুন" retry: "আবার চেষ্টা করুন"
pageLoadError: "পেজ লোড করা যায়নি" pageLoadError: "পেজ লোড করা যায়নি"
pageLoadErrorDescription: "এটি সাধারনত নেটওয়ার্কের সমস্যার বা ব্রাউজার ক্যাশের কারণে pageLoadErrorDescription: "এটি সাধারনত নেটওয়ার্কের সমস্যার বা ব্রাউজার ক্যাশের কারণে
ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন। " ঘটে থাকে। ব্রাউজার এর ক্যাশ পরিষ্কার করুন এবং একটু পর আবার চেষ্টা করুন।"
serverIsDead: "এই সার্ভার বর্তমানে সাড়া দিচ্ছে না। একটু পরে আবার চেষ্টা করুন।" serverIsDead: "এই সার্ভার বর্তমানে সাড়া দিচ্ছে না। একটু পরে আবার চেষ্টা করুন।"
youShouldUpgradeClient: "এই পেজ দেখার জন্য আপনার ব্রাউজার রিফ্রেশ করে ক্লায়েন্ট আপডেট youShouldUpgradeClient: "এই পেজ দেখার জন্য আপনার ব্রাউজার রিফ্রেশ করে ক্লায়েন্ট আপডেট
করুন। " করুন। "
@ -102,13 +102,13 @@ unfollow: "অনুসরণ বাতিল"
followRequestPending: "অনুসরণ করার অনুরোধ বিচারাধীন" followRequestPending: "অনুসরণ করার অনুরোধ বিচারাধীন"
enterEmoji: "ইমোজি প্রবেশ করান" enterEmoji: "ইমোজি প্রবেশ করান"
renote: "রিনোট" renote: "রিনোট"
unrenote: "রিনোট সরান " unrenote: "বুস্ট ফিরিয়ে নিন"
renoted: "রিনোট করা হয়েছে" renoted: "বুস্ট করা হয়েছে।"
cantRenote: "এই নোটটি রিনোট করা যাবে না।" cantRenote: "এই পোস্টটি বুস্ট করা যাবে না।"
cantReRenote: "রিনোটকে রিনোট করা যাবে না।" cantReRenote: "বুস্টকে বুস্ট করা যাবে না।"
quote: "উদ্ধৃতি" quote: "উক্তি"
pinnedNote: "পিন করা নোট" pinnedNote: "পিন করা পোস্ট"
pinned: "পিন করা" pinned: "প্রোফাইলে পিন করুন"
you: "আপনি" you: "আপনি"
clickToShow: "দেখার জন্য ক্লিক করুন" clickToShow: "দেখার জন্য ক্লিক করুন"
sensitive: "সংবেদনশীল বিষয়বস্তু" sensitive: "সংবেদনশীল বিষয়বস্তু"
@ -1761,3 +1761,14 @@ _deck:
list: "লিস্ট" list: "লিস্ট"
mentions: "উল্লেখসমূহ" mentions: "উল্লেখসমূহ"
direct: "ডাইরেক্ট নোটগুলি" direct: "ডাইরেক্ট নোটগুলি"
removeReaction: আপনার প্রতিক্রিয়া সরান
addInstance: একটি সার্ভার যোগ করুন
deleted: মুছে ফেলা হয়েছে
editNote: পোস্ট এডিট করুন
edited: '{date} {time} এ সম্পাদিত'
searchPlaceholder: ফায়ারফিশে খুঁজুন
noThankYou: না, ধন্যবাদ
cw: সতর্কবার্তা
replies: উত্তর
quotes: উক্তি গুলো
reactions: প্রতিক্রিয়াগুলি

View file

@ -1,477 +0,0 @@
_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: Резултати от търсенето
searchByGoogle: Търсене
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: Инфопоток
instanceSecurity: Сигурност на сървъра
uploadFolder: Папка по подразбиране за качвания
instanceInfo: Информация за сървъра
statistics: Статистика
fileName: Име на файл
selectFile: Избери файл
editProfile: Редактирай профил
instances: Сървъри
selectUser: Избери потребител
createNew: Създай ново
blockThisInstance: Блокирай този сървър
_profile:
metadata: Допълнителна информация
username: Потребителско име
name: Име
description: Биография
metadataContent: Съдържание
addAccount: Добави акаунт
followRequestPending: Заявка за последване в изчакване
signinHistory: История на вписванията
or: Или
noUsers: Няма потребители
notes: Публикации
newNoteRecived: Има нови публикации
note: Публикация
instanceFollowing: Последвани на сървъра
_filters:
followersOnly: Само последователи
notesAfter: Публикации след
fromDomain: От домейн
fromUser: От потребител
withFile: С файл
notesBefore: Публикации преди
followingOnly: Само последвани
_notification:
_types:
follow: Нови последователи
mention: Споменавания
reaction: Реакции
_channel:
notesCount: '{n} Публикации'
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
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: Подсили
color: Цвят
explore: Разгледай темите
_pages:
script:
blocks:
_dailyRannum:
arg1: Минимална стойност
arg2: Максимална стойност
_join:
arg1: Списъци
add: Добави
_rannum:
arg1: Минимална стойност
arg2: Максимална стойност
_seedRannum:
arg3: Максимална стойност
arg2: Минимална стойност
categories:
value: Стойности
list: Списъци
blocks:
_textInput:
default: Стойност по подразбиране
_switch:
default: Стойност по подразбиране
_textareaInput:
default: Стойност по подразбиране
_numberInput:
default: Стойност по подразбиране
_radioButton:
default: Стойност по подразбиране
_deck:
_columns:
notifications: Известия
mentions: Споменавания
tl: Инфопоток
direct: Директни съобщения
_mfm:
mention: Споменаване
search: Търсене
_messaging:
groups: Групи
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: Известия
_permissions:
"read:favorites": Виж списъка си с отметки
"write:favorites": Редактирай списъка си с отметки
_visibility:
followers: Последователи
explore: Разглеждане
theme: Теми
wallpaper: Тапет
setWallpaper: Задай тапет
removeWallpaper: Премахни тапет
themeForLightMode: Тема за използване в светъл режим
themeForDarkMode: Тема за използване в тъмен режим
light: Светло
dark: Тъмно
darkThemes: Тъмни теми
invitations: Покани
invitationCode: Код на поканата
checking: Проверка...
available: Свободно
unavailable: Не е свободно
tooShort: Твърде кратко
tooLong: Твърде дълго
weakPassword: Слаба парола
strongPassword: Силна парола
passwordMatched: Съвпада
passwordNotMatched: Не съвпада
signinWith: Вписване с {x}
aboutX: Относно {x}
openInNewTab: Отвори в нов раздел
_tutorial:
step2_1: Първо, моля, попълнете своя профил.
step2_2: Предоставянето на известна информация за това кой сте вие ще улесни другите
да разберат дали искат да видят вашите публикации или да ви следват.
title: Как се използва Firefish
step1_1: Добре дошли!
step5_1: Инфопотоци, инфопотоци навсякъде!
step3_1: Сега е време да последвате няколко хора!
step1_2: Нека да ви настроим. Ще бъдете готови за нула време!
openImageInNewTab: Отваряй изображенията в нов раздел
showOnRemote: Отвори оригиналната страница
lightThemes: Светли теми
syncDeviceDarkMode: Синхронизиране на тъмния режим с настройките на устройството
text: Текст
normalPassword: Средна парола
usernameInvalidFormat: Можете да използвате главни и малки букви, цифри и долни черти.
signinFailed: Неуспешно вписване. Въведените потребителско име или парола са неправилни.
signinRequired: Моля, регистрирайте се или се впишете, преди да продължите
start: Започни
confirm: Потвърди
failedToUpload: Неуспешно качване
_preferencesBackups:
cannotSave: Неуспешно запазване
cannotLoad: Неуспешно зареждане
editWidgetsExit: Готово
done: Готово
emailRequiredForSignup: Изискване за адрес на е-поща за регистриране
preview: Преглед
privacy: Поверителност

View file

@ -323,8 +323,8 @@ _2fa:
securityKeyInfo: A més de l'autenticació d'empremta digital o PIN, també podeu configurar securityKeyInfo: A més de l'autenticació d'empremta digital o PIN, també podeu configurar
l'autenticació mitjançant claus de seguretat de maquinari compatibles amb FIDO2 l'autenticació mitjançant claus de seguretat de maquinari compatibles amb FIDO2
per protegir encara més el vostre compte. per protegir encara més el vostre compte.
step4: A partir d'ara, qualsevol intent d'inici de sessió futur demanarà aquest step4: A partir d'ara, qualsevol intent d'inici de sessió futur demanarà aquesta
token d'inici de sessió. clau d'inici de sessió.
registerSecurityKey: Registrar una clau de seguretat o d'accés registerSecurityKey: Registrar una clau de seguretat o d'accés
step1: En primer lloc, instal·la una aplicació d'autenticació (com ara {a} o {b}) step1: En primer lloc, instal·la una aplicació d'autenticació (com ara {a} o {b})
al dispositiu. al dispositiu.
@ -1002,8 +1002,8 @@ enableEmojiReactions: Activa reaccions amb emojis
blockThisInstance: Bloqueja aquest servidor blockThisInstance: Bloqueja aquest servidor
registration: Registra't registration: Registra't
showEmojisInReactionNotifications: Mostrar els emojis a les notificacions de les reaccions showEmojisInReactionNotifications: Mostrar els emojis a les notificacions de les reaccions
renoteMute: Silencia els impulsos renoteMute: Silencia els impulsos a les línies de temps
renoteUnmute: Treu el silenci als impulsos renoteUnmute: Treu el silenci als impulsos a les línies de temps
cacheRemoteFiles: Desa fitxers remots a la memòria cau cacheRemoteFiles: Desa fitxers remots a la memòria cau
federation: Federació federation: Federació
registeredAt: Registrat a registeredAt: Registrat a
@ -1831,11 +1831,6 @@ pushNotificationAlreadySubscribed: Les notificacions push ja estan activades
pushNotificationNotSupported: El vostre navegador o servidor no admet notificacions pushNotificationNotSupported: El vostre navegador o servidor no admet notificacions
push push
license: Llicència license: Llicència
indexPosts: Índex de publicacions
indexFrom: Índex a partir de l'ID de Publicacions
indexFromDescription: Deixeu en blanc per indexar cada publicació
indexNotice: Ara indexant. Això probablement trigarà una estona, si us plau, no reinicieu
el servidor durant almenys una hora.
_instanceTicker: _instanceTicker:
none: No mostrar mai none: No mostrar mai
remote: Mostra per a usuaris remots remote: Mostra per a usuaris remots
@ -2036,6 +2031,7 @@ _wordMute:
de temps. de temps.
muteLangs: Llenguatges silenciats muteLangs: Llenguatges silenciats
muteLangsDescription: Separar amb espais o línies no es per una condició OR. muteLangsDescription: Separar amb espais o línies no es per una condició OR.
mutePatterns: Patrons per silenciar
_auth: _auth:
shareAccessAsk: Estàs segur que vols autoritzar aquesta aplicació per accedir al shareAccessAsk: Estàs segur que vols autoritzar aquesta aplicació per accedir al
teu compte? teu compte?
@ -2071,10 +2067,8 @@ _relayStatus:
deleted: Eliminat deleted: Eliminat
editNote: Edita la publicació editNote: Edita la publicació
edited: 'Editat el {date} {time}' edited: 'Editat el {date} {time}'
findOtherInstance: Cercar un altre servidor signupsDisabled: Actualment, les inscripcions en aquest servidor estan desactivades.
signupsDisabled: Actualment, les inscripcions en aquest servidor estan desactivades, Si teniu un codi d'invitació per a aquest servidor, introduïu-lo a continuació.
però sempre podeu registrar-vos en un altre servidor. Si teniu un codi d'invitació
per a aquest servidor, introduïu-lo a continuació.
userSaysSomethingReasonQuote: '{name} ha citat una publicació que conté {reason}' userSaysSomethingReasonQuote: '{name} ha citat una publicació que conté {reason}'
userSaysSomethingReasonReply: '{name} ha respost a una publicació que conté {reason}' userSaysSomethingReasonReply: '{name} ha respost a una publicació que conté {reason}'
userSaysSomethingReasonRenote: '{name} ha impulsat una publicació que conté {reason}' userSaysSomethingReasonRenote: '{name} ha impulsat una publicació que conté {reason}'
@ -2238,3 +2232,56 @@ privateDescription: Visible només per a tu
useCdn: Aconsegueix els recursos des de el CDN useCdn: Aconsegueix els recursos des de el CDN
useCdnDescription: Carrega alguns dels recursos estàtics com ara Twemoji des de el useCdnDescription: Carrega alguns dels recursos estàtics com ara Twemoji des de el
CDN de JSDeliver en comptes de carregar-los des d'aquest servidor Firefish. CDN de JSDeliver en comptes de carregar-los des d'aquest servidor Firefish.
releaseToReload: Deixa anar per actualitzar
reloading: Actualitzant
enableTimelineStreaming: Actualitza les línies de temps automàticament
enablePullToRefresh: Activa "Baixa per actualitzar"
pullDownToReload: Baixa per actualitzar
pullToRefreshThreshold: Distancia de baixada per actualitzar
searchWords: Paraules / ID o adreça a URL a buscar
noSentFollowRequests: No tens cap sol·licitud de seguiment enviada
sentFollowRequests: Enviar sol·licituds de seguiment
replyMute: Silencia les respostes a les línies de temps
replyUnmute: Treu el silencia de les respostes a les línies de temps
searchWordsDescription: "Per cercar publicacions, escriu el terme a buscar. Separa
les paraules amb espais per fer condicions AND o escriules dins de cometes per fer
una cerca OR.\nPer exemple, 'dia nit' trobarà publicacions que continguin tan 'dia'
com 'nit', i 'dia OR nit' trobara publicacions que continguin tant 'dia' com 'nit'
(o ambdues).\nPots combinar condicions AND/OR per exemple '(dia OR nit) endormiscar'.\n
Si vols cercar per una seqüencia de paraules (per exemple una frase) has d'escriure-les
entre cometes dobles, per no fer una cerca amb condicionant AND: \"Avui he aprés\"\
\n \nSi vols anar a una pàgina d'usuari o publicació en concret, escriu la adreça
URL o la ID en aquest camp i fes clic al botó 'Trobar'. Fent clic a 'Cercar' trobarà
publicacions que, literalment , continguin la ID/adreça URL."
searchPostsWithFiles: Només publicacions amb fitxers
searchCwAndAlt: Inclou avisos de contingut i arxius amb descripcions
searchUsers: Publicat per (opcional)
searchRange: Publicat dintre de (opcional)
publishTimelines: Publica línies de temps per visitants
toPost: Publicar
publishTimelinesDescription: Si està activat, les línies de temps Global i Local es
mostraran a {url} fins i tot sense estar registrat.
noAltTextWarning: Alguns fitxers adjunts no tenen una descripció. T'has s oblidat
d'escriure-les?
showNoAltTextWarning: Mostra un avís si públiques un fitxer sense descripció
toReply: Respon
toQuote: Cita
toEdit: Edita
searchUsersDescription: "Per buscar publicacions concretes d'un usuari/servidor, escriu
la ID (@usuari@exemple.com, o @usuari per un usuari local) o nom del domini (exemple.com).\n
\nSi escrius 'me' (sense cometes), totes les teves publicacions (incloent-hi publicacions
sense llistar, només per a seguidors i secretes) es buscaran.\n\nSi escrius 'local'
(sense cometes), el resultat serà filtrat per mostrar només publicacions d'aquest
servidor."
messagingUnencryptedInfo: Els xats a Firefish no són encriptats d'extrem a extrem.
No comparteixis dades sensibles fent servir Firefish.
searchRangeDescription: "Si vols filtrar per un període de temps, has de fer servir
aquest format: 20220615-20231031\n\nSi no escrius l'any (per exemple 0105-0106 o
20231105-0110), serà interpretat com l'any en curs.\n\nInclús pots ometre la data
de començament o de finalització. Per exemple, -0102 filtrarà els resultats per
mostrar només publicacions fetes abans del 2 de gener d'aquest any, i 20231026-
filtrarà els resultats per mostrar publicacions fetes després del 26 d'octubre del
2023."
moderationNote: Nota de moderació
ipFirstAcknowledged: Data en què es va veure la adreça IP per primera vegada
driveCapacityOverride: Capacitat del disc esgotada

View file

@ -157,8 +157,8 @@ pageLoadErrorDescription: Dette er normalt på grund af netværksproblemer eller
browser's cache. Prøv at ryd cachen og så gentage efter et styk tid. 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. serverIsDead: Serveren svarer ikke. Vær sød at vente et styk tid og prøv igen.
editWidgetsExit: Færdig editWidgetsExit: Færdig
headlineFirefish: En åben-kildekode, decentraliseret social-media platform som er frit headlineFirefish: En åben-kildekode, decentraliseret social-media platform som er
forevigt! 🚀 frit forevigt! 🚀
introFirefish: Velkommen! Firefish er en åbent-kildekode, decentraliseret social-media introFirefish: Velkommen! Firefish er en åbent-kildekode, decentraliseret social-media
platform som er frit forevigt!🚀 platform som er frit forevigt!🚀
enableEmojiReactions: Aktivere emoji reaktioner enableEmojiReactions: Aktivere emoji reaktioner

View file

@ -1500,9 +1500,6 @@ _widgets:
chooseList: Wählen Sie eine Liste aus chooseList: Wählen Sie eine Liste aus
userList: Benutzerliste userList: Benutzerliste
serverInfo: Server-Infos serverInfo: Server-Infos
meiliStatus: Server-Status
meiliSize: Indexgröße
meiliIndexCount: Indexierte Beiträge
_cw: _cw:
hide: "Verbergen" hide: "Verbergen"
show: "Inhalt anzeigen" show: "Inhalt anzeigen"
@ -2027,7 +2024,6 @@ moveAccountDescription: 'Dieser Vorgang kann nicht rückgängig gemacht werden!
sie vor dem Umzug dieses Nutzerkontos sicher, dass Sie einen Namen für Ihr neues sie vor dem Umzug dieses Nutzerkontos sicher, dass Sie einen Namen für Ihr neues
Nutzerkonto eingerichtet haben. Bitte geben sie die Bezeichnung des neuen Nutzerkontos Nutzerkonto eingerichtet haben. Bitte geben sie die Bezeichnung des neuen Nutzerkontos
wie folgt ein: @name@server.xyz' wie folgt ein: @name@server.xyz'
findOtherInstance: Einen anderen Server finden
sendPushNotificationReadMessage: Löschung der Push-Benachrichtigungen sobald die entsprechenden sendPushNotificationReadMessage: Löschung der Push-Benachrichtigungen sobald die entsprechenden
Benachrichtigungen oder Nachrichten gelesen wurden Benachrichtigungen oder Nachrichten gelesen wurden
signupsDisabled: Derzeit sind keine Anmeldungen auf diesem Server möglich! Anmeldungen signupsDisabled: Derzeit sind keine Anmeldungen auf diesem Server möglich! Anmeldungen
@ -2083,7 +2079,6 @@ preventAiLearning: KI gestütztes bot-scraping unterdrücken
preventAiLearningDescription: Fordern Sie KI-Sprachmodelle von Drittanbietern auf, preventAiLearningDescription: Fordern Sie KI-Sprachmodelle von Drittanbietern auf,
die von Ihnen hochgeladenen Inhalte, wie z. B. Beiträge und Bilder, nicht zu untersuchen. die von Ihnen hochgeladenen Inhalte, wie z. B. Beiträge und Bilder, nicht zu untersuchen.
license: Lizenz license: Lizenz
indexPosts: Gelistete Beiträge
migrationConfirm: "Sind Sie absolut sicher, dass Sie Ihr Nutzerkonto zu diesem {account} migrationConfirm: "Sind Sie absolut sicher, dass Sie Ihr Nutzerkonto zu diesem {account}
umziehen möchten? Sobald Sie dies bestätigt haben, kann dies nicht mehr rückgängig umziehen möchten? Sobald Sie dies bestätigt haben, kann dies nicht mehr rückgängig
gemacht werden und Ihr Nutzerkonto kann nicht mehr von ihnen genutzt werden.\nStellen gemacht werden und Ihr Nutzerkonto kann nicht mehr von ihnen genutzt werden.\nStellen
@ -2111,9 +2106,6 @@ _experiments:
kann es zu Verlangsamungen beim Laden während des Imports kommen. kann es zu Verlangsamungen beim Laden während des Imports kommen.
noGraze: Bitte deaktivieren Sie die Browsererweiterung "Graze for Mastodon", da sie noGraze: Bitte deaktivieren Sie die Browsererweiterung "Graze for Mastodon", da sie
die Funktion von Firefish stört. die Funktion von Firefish stört.
indexFrom: Indexieren ab Beitragskennung aufwärts
indexNotice: Wird jetzt indexiert. Dies wird wahrscheinlich eine Weile dauern, bitte
starten Sie Ihren Server für mindestens eine Stunde nicht neu.
customKaTeXMacroDescription: "Richten Sie Makros ein, um mathematische Ausdrücke einfach customKaTeXMacroDescription: "Richten Sie Makros ein, um mathematische Ausdrücke einfach
zu schreiben! Die Notation entspricht den LaTeX-Befehlsdefinitionen und wird als zu schreiben! Die Notation entspricht den LaTeX-Befehlsdefinitionen und wird als
\\newcommand{\\name}{content} oder \\newcommand{\\name}[number of arguments]{content} \\newcommand{\\name}{content} oder \\newcommand{\\name}[number of arguments]{content}
@ -2132,7 +2124,6 @@ expandOnNoteClick: Beitrag bei Klick öffnen
image: Bild image: Bild
video: Video video: Video
audio: Audio audio: Audio
indexFromDescription: Leer lassen, um jeden Beitrag zu indexieren
_filters: _filters:
fromUser: Von Benutzer fromUser: Von Benutzer
notesAfter: Beiträge nach notesAfter: Beiträge nach
@ -2227,3 +2218,4 @@ renotes: Boosts
quotes: Zitate quotes: Zitate
moreUrlsDescription: "Die Seiten, welche angepinnt werde sollen, im Hilfe-Menü in moreUrlsDescription: "Die Seiten, welche angepinnt werde sollen, im Hilfe-Menü in
der unteren linken Ecke in folgender Notation angeben:\n\"Anzeigename\": https://example.com/" der unteren linken Ecke in folgender Notation angeben:\n\"Anzeigename\": https://example.com/"
toQuote: Zitat

View file

@ -59,6 +59,7 @@ copyUsername: "Copy username"
searchUser: "Search for a user" searchUser: "Search for a user"
reply: "Reply" reply: "Reply"
replies: "Replies" replies: "Replies"
toReply: "Reply"
jumpToPrevious: "Jump to previous" jumpToPrevious: "Jump to previous"
loadMore: "Load more" loadMore: "Load more"
showMore: "Show more" showMore: "Show more"
@ -89,6 +90,7 @@ listsDesc: "Lists let you create timelines with specified users. They can be acc
noLists: "You don't have any lists" noLists: "You don't have any lists"
note: "Post" note: "Post"
notes: "Posts" notes: "Posts"
toPost: "Post"
following: "Following" following: "Following"
followers: "Followers" followers: "Followers"
followsYou: "Follows you" followsYou: "Follows you"
@ -121,6 +123,7 @@ cantRenote: "This post can't be boosted."
cantReRenote: "A boost can't be boosted." cantReRenote: "A boost can't be boosted."
quote: "Quote" quote: "Quote"
quotes: "Quotes" quotes: "Quotes"
toQuote: "Quote"
pinnedNote: "Pinned post" pinnedNote: "Pinned post"
pinned: "Pin to profile" pinned: "Pin to profile"
you: "You" you: "You"
@ -174,8 +177,8 @@ cacheRemoteFilesDescription: "When this setting is disabled, remote files are lo
flagAsBot: "Mark this account as automated" flagAsBot: "Mark this account as automated"
flagAsBotDescription: "Enable this option if this account is controlled by a program. flagAsBotDescription: "Enable this option if this account is controlled by a program.
If enabled, it will act as a flag for other developers to prevent endless interaction If enabled, it will act as a flag for other developers to prevent endless interaction
chains with other automated accounts and adjust Firefish's internal systems to treat this chains with other automated accounts and adjust Firefish's internal systems to treat
account as an automated account." this account as an automated account."
flagAsCat: "Are you a cat? 😺" flagAsCat: "Are you a cat? 😺"
flagAsCatDescription: "You'll get cat ears and speak like a cat!" flagAsCatDescription: "You'll get cat ears and speak like a cat!"
flagSpeakAsCat: "Speak as a cat" flagSpeakAsCat: "Speak as a cat"
@ -459,7 +462,7 @@ securityKeyName: "Key name"
registerSecurityKey: "Register a security key" registerSecurityKey: "Register a security key"
lastUsed: "Last used" lastUsed: "Last used"
unregister: "Unregister" unregister: "Unregister"
passwordLessLogin: "Password-less login" passwordLessLogin: "Password-less sign in"
resetPassword: "Reset password" resetPassword: "Reset password"
newPasswordIs: "The new password is \"{password}\"" newPasswordIs: "The new password is \"{password}\""
reduceUiAnimation: "Reduce UI animations" reduceUiAnimation: "Reduce UI animations"
@ -524,7 +527,7 @@ disableDrawer: "Don't use drawer-style menus"
youHaveNoGroups: "You have no groups" youHaveNoGroups: "You have no groups"
joinOrCreateGroup: "Get invited to a group or create your own." joinOrCreateGroup: "Get invited to a group or create your own."
noHistory: "No history available" noHistory: "No history available"
signinHistory: "Login history" signinHistory: "Sign in history"
disableAnimatedMfm: "Disable MFM with animation" disableAnimatedMfm: "Disable MFM with animation"
doing: "Processing..." doing: "Processing..."
category: "Category" category: "Category"
@ -671,6 +674,7 @@ pluginTokenRequestedDescription: "This plugin will be able to use the permission
set here." set here."
notificationType: "Notification type" notificationType: "Notification type"
edit: "Edit" edit: "Edit"
toEdit: "Edit"
emailServer: "Email server" emailServer: "Email server"
enableEmail: "Enable email distribution" enableEmail: "Enable email distribution"
emailConfigInfo: "Used to confirm your email during sign-up or if you forget your emailConfigInfo: "Used to confirm your email during sign-up or if you forget your
@ -713,9 +717,9 @@ useGlobalSetting: "Use global settings"
useGlobalSettingDesc: "If turned on, your account's notification settings will be useGlobalSettingDesc: "If turned on, your account's notification settings will be
used. If turned off, individual configurations can be made." used. If turned off, individual configurations can be made."
other: "Other" other: "Other"
regenerateLoginToken: "Regenerate login token" regenerateLoginToken: "Regenerate sign in token"
regenerateLoginTokenDescription: "Regenerates the token used internally during login. regenerateLoginTokenDescription: "Regenerates the token used internally during sign
Normally this action is not necessary. If regenerated, all devices will be logged in. Normally this action is not necessary. If regenerated, all devices will be logged
out." out."
setMultipleBySeparatingWithSpace: "Separate multiple entries with spaces." setMultipleBySeparatingWithSpace: "Separate multiple entries with spaces."
fileIdOrUrl: "File ID or URL" fileIdOrUrl: "File ID or URL"
@ -997,7 +1001,7 @@ check: "Check"
driveCapOverrideLabel: "Change the drive capacity for this user" driveCapOverrideLabel: "Change the drive capacity for this user"
driveCapOverrideCaption: "Reset the capacity to default by inputting a value of 0 driveCapOverrideCaption: "Reset the capacity to default by inputting a value of 0
or lower." or lower."
requireAdminForView: "You must log in with an administrator account to view this." requireAdminForView: "You must sign in with an administrator account to view this."
isSystemAccount: "This account is created and automatically operated by the system. isSystemAccount: "This account is created and automatically operated by the system.
Please do not moderate, edit, delete, or otherwise tamper with this account, or Please do not moderate, edit, delete, or otherwise tamper with this account, or
it may break your server." it may break your server."
@ -1007,7 +1011,7 @@ document: "Documentation"
numberOfPageCache: "Number of cached pages" numberOfPageCache: "Number of cached pages"
numberOfPageCacheDescription: "Increasing this number will improve convenience for numberOfPageCacheDescription: "Increasing this number will improve convenience for
users but cause more server load as well as more memory to be used." users but cause more server load as well as more memory to be used."
logoutConfirm: "Really log out?" logoutConfirm: "Really sign out?"
lastActiveDate: "Last used at" lastActiveDate: "Last used at"
statusbar: "Status bar" statusbar: "Status bar"
pleaseSelect: "Select an option" pleaseSelect: "Select an option"
@ -1092,11 +1096,6 @@ migrationConfirm: "Are you absolutely sure you want to migrate your account to {
as the account you're moving from." as the account you're moving from."
defaultReaction: "Default emoji reaction for outgoing and incoming posts" defaultReaction: "Default emoji reaction for outgoing and incoming posts"
license: "License" license: "License"
indexPosts: "Index Posts"
indexFrom: "Index from Post ID onwards"
indexFromDescription: "Leave blank to index every post"
indexNotice: "Now indexing. This will probably take a while, please don't restart
your server for at least an hour."
customKaTeXMacro: "Custom KaTeX macros" customKaTeXMacro: "Custom KaTeX macros"
customKaTeXMacroDescription: "Set up macros to write mathematical expressions easily! customKaTeXMacroDescription: "Set up macros to write mathematical expressions easily!
The notation conforms to the LaTeX command definitions and is written as \\newcommand{\\ The notation conforms to the LaTeX command definitions and is written as \\newcommand{\\
@ -1109,12 +1108,13 @@ customKaTeXMacroDescription: "Set up macros to write mathematical expressions ea
advanced syntax, such as conditional branching, cannot be used here." advanced syntax, such as conditional branching, cannot be used here."
enableCustomKaTeXMacro: "Enable custom KaTeX macros" enableCustomKaTeXMacro: "Enable custom KaTeX macros"
noteId: "Post ID" noteId: "Post ID"
signupsDisabled: "Signups on this server are currently disabled, but you can always signupsDisabled: "Signups on this server are currently disabled. If you have an invitation
sign up at another server! If you have an invitation code for this server, please code for this server, please enter it below."
enter it below."
findOtherInstance: "Find another server"
apps: "Apps" apps: "Apps"
sendModMail: "Send Moderation Notice" sendModMail: "Send Moderation Notice"
moderationNote: "Moderation Note"
ipFirstAcknowledged: "The date of the first acquisition of the IP address"
driveCapacityOverride: "Drive Capacity Override"
preventAiLearning: "Prevent AI bot scraping" preventAiLearning: "Prevent AI bot scraping"
preventAiLearningDescription: "Request third-party AI language models not to study preventAiLearningDescription: "Request third-party AI language models not to study
content you upload, such as posts and images." content you upload, such as posts and images."
@ -1162,7 +1162,8 @@ vibrate: "Play vibrations"
openServerInfo: "Show server information by clicking the server ticker on a post" openServerInfo: "Show server information by clicking the server ticker on a post"
iconSet: "Icon set" iconSet: "Icon set"
useCdn: "Get assets from CDN" useCdn: "Get assets from CDN"
useCdnDescription: "Load some static assets like Twemoji from the JSDelivr CDN instead of this Firefish server." useCdnDescription: "Load some static assets like Twemoji from the JSDelivr CDN instead
of this Firefish server."
suggested: "Suggested" suggested: "Suggested"
noLanguage: "No language" noLanguage: "No language"
showPreviewByDefault: "Show preview in posting form by default" showPreviewByDefault: "Show preview in posting form by default"
@ -1175,17 +1176,53 @@ searchEngine: "Search engine used in search bar MFM"
postSearch: "Post search on this server" postSearch: "Post search on this server"
showBigPostButton: "Show a huge post button on the posting form" showBigPostButton: "Show a huge post button on the posting form"
emojiModPerm: "Custom emoji management permission" emojiModPerm: "Custom emoji management permission"
emojiModPermDescription: "Add: Allow this user to add new custom emojis and to set tag/category/license to newly added custom emojis.\nAdd and Edit: \"Add\" Permission + Allow this user to edit the name/category/tag/license of the existing custom emojis.\nAllow All: \"Add and Edit\" Permission + Allow this user to delete existing custom emojis." emojiModPermDescription: "Add: Allow this user to add new custom emojis and to set
tag/category/license to newly added custom emojis.\nAdd and Edit: \"Add\" Permission
+ Allow this user to edit the name/category/tag/license of the existing custom emojis.\n
Allow All: \"Add and Edit\" Permission + Allow this user to delete existing custom
emojis."
private: "Private" private: "Private"
privateDescription: "Make visible for you only" privateDescription: "Make visible for you only"
makePrivate: "Make private" makePrivate: "Make private"
makePrivateConfirm: "This operation will send a deletion request to remote servers and change the visibility to private. Proceed?" makePrivateConfirm: "This operation will send a deletion request to remote servers
and change the visibility to private. Proceed?"
enablePullToRefresh: "Enable \"Pull down to refresh\"" enablePullToRefresh: "Enable \"Pull down to refresh\""
pullToRefreshThreshold: "Pull distance for reloading" pullToRefreshThreshold: "Pull distance for reloading"
pullDownToReload: "Pull down to reload" pullDownToReload: "Pull down to reload"
releaseToReload: "Release to reload" releaseToReload: "Release to reload"
reloading: "Reloading" reloading: "Reloading"
enableTimelineStreaming: "Update timelines automatically" enableTimelineStreaming: "Update timelines automatically"
searchWords: "Words to search / ID or URL to lookup"
searchWordsDescription: "Enter the search term here to search for posts. Separate words
with a space for an AND search, or 'OR' (without quotes) between words for an OR
search.\nFor example, 'morning night' will find posts that contain both 'morning'
and 'night', and 'morning OR night' will find posts that contain either 'morning'
or 'night' (or both).\nYou can also combine AND/OR conditions like '(morning OR
night) sleepy'.\nIf you want to search for a sequence of words (e.g., a sentence), you
must put it in double quotes, not to make it an AND search: \"Today I learned\"\n\n
If you want to go to a specific user page or post page, enter
the ID or URL in this field and click the 'Lookup' button. Clicking 'Search' will
search for posts that literally contain the ID/URL."
searchUsers: "Posted by (optional)"
searchUsersDescription: "To search for posts by a specific user/server, enter the
ID (@user@example.com, or @user for a local user) or domain name (example.com).\n
\nIf you enter 'me' (without quotes), all of your posts (including unlisted, followers-only,
direct, and secret posts) will be searched.\n\nIf you enter 'local' (without quotes),
the results will be filtered to include only posts from this server."
searchRange: "Posted within (optional)"
searchRangeDescription: "If you want to filter the time period, enter it in this format:
20220615-20231031\n\nIf you leave out the year (like 0105-0106 or 20231105-0110),
it's interpreted as the current year.\n\nYou can also omit either the start or end
date. For example, -0102 will filter the search results to show only posts made
before 2 January this year, and 20231026- will filter the results to show only posts
made after 26 October 2023."
searchPostsWithFiles: "Only posts with files"
searchCwAndAlt: "Include content warnings and file descriptions"
publishTimelines: "Publish timelines for visitors"
publishTimelinesDescription: "If enabled, the Local and Global timelines will be shown
on {url} even when signed out."
noAltTextWarning: "Some attached file(s) have no description. Did you forget to write?"
showNoAltTextWarning: "Show a warning if you attempt to post files without a description"
_emojiModPerm: _emojiModPerm:
unauthorized: "None" unauthorized: "None"
@ -1426,6 +1463,7 @@ _menuDisplay:
hide: "Hide" hide: "Hide"
_wordMute: _wordMute:
muteWords: "Muted words" muteWords: "Muted words"
mutePatterns: "Muted patterns"
muteLangs: "Muted Languages" muteLangs: "Muted Languages"
muteWordsDescription: "Separate with spaces for an AND condition or with line breaks muteWordsDescription: "Separate with spaces for an AND condition or with line breaks
for an OR condition." for an OR condition."
@ -1594,7 +1632,7 @@ _2fa:
step2Url: "You can also enter this URL if you're using a desktop program:" step2Url: "You can also enter this URL if you're using a desktop program:"
step3Title: "Enter an authentication code" step3Title: "Enter an authentication code"
step3: "Enter the token provided by your app to finish setup." step3: "Enter the token provided by your app to finish setup."
step4: "From now on, any future login attempts will ask for such a login token." step4: "From now on, any future sign in attempts will ask for such a token."
securityKeyNotSupported: "Your browser does not support security keys." securityKeyNotSupported: "Your browser does not support security keys."
securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup securityKeyInfo: "Besides fingerprint or PIN authentication, you can also setup
authentication via hardware security keys that support FIDO2 to further secure authentication via hardware security keys that support FIDO2 to further secure
@ -1690,9 +1728,6 @@ _widgets:
serverInfo: "Server Info" serverInfo: "Server Info"
_userList: _userList:
chooseList: "Select a list" chooseList: "Select a list"
meiliStatus: "Server Status"
meiliSize: "Index size"
meiliIndexCount: "Indexed posts"
_cw: _cw:
hide: "Hide" hide: "Hide"
@ -2188,4 +2223,7 @@ _iconSets:
fill: "Filled" fill: "Filled"
duotone: "Duotone" duotone: "Duotone"
moreUrls: "Pinned pages" moreUrls: "Pinned pages"
moreUrlsDescription: "Enter the pages you want to pin to the help menu in the lower left corner using this notation:\n\"Display name\": https://example.com/" moreUrlsDescription: "Enter the pages you want to pin to the help menu in the lower
left corner using this notation:\n\"Display name\": https://example.com/"
messagingUnencryptedInfo: "Chats on Firefish are not end-to-end encrypted. Don't share
any sensitive infomation over Firefish."

View file

@ -1474,9 +1474,6 @@ _widgets:
_userList: _userList:
chooseList: Seleccione una lista chooseList: Seleccione una lista
serverInfo: Información del servidor serverInfo: Información del servidor
meiliStatus: Estado del servidor
meiliSize: Tamaño del índice
meiliIndexCount: Publicaciones indizadas
_cw: _cw:
hide: "Ocultar" hide: "Ocultar"
show: "Ver más" show: "Ver más"
@ -1988,7 +1985,6 @@ deleted: Eliminado
edited: 'Editado a las {date} {time}' edited: 'Editado a las {date} {time}'
editNote: Editar publicación editNote: Editar publicación
silenceThisInstance: Silenciar este servidor silenceThisInstance: Silenciar este servidor
findOtherInstance: Buscar otro servidor
userSaysSomethingReasonRenote: '{name} impulsó una publicación que contiene {reason]' userSaysSomethingReasonRenote: '{name} impulsó una publicación que contiene {reason]'
enableRecommendedTimeline: Habilitar línea de tiempo "Recomendado" enableRecommendedTimeline: Habilitar línea de tiempo "Recomendado"
searchPlaceholder: Buscar en Firefish searchPlaceholder: Buscar en Firefish
@ -2123,13 +2119,10 @@ moveFromDescription: 'Esto pondrá un alias en tu cuenta antigua para así poder
ingresa la etiqueta de la cuenta con el formato siguiente: @persona@servidor.tld' ingresa la etiqueta de la cuenta con el formato siguiente: @persona@servidor.tld'
defaultReaction: Emoji por defecto para reaccionar a las publicaciones entrantes y defaultReaction: Emoji por defecto para reaccionar a las publicaciones entrantes y
salientes salientes
indexFromDescription: Deja en blanco para indizar todas las publicaciones
deletePasskeys: Borrar claves de paso deletePasskeys: Borrar claves de paso
deletePasskeysConfirm: Esto borrará irreversiblemente todas las claves de paso y de deletePasskeysConfirm: Esto borrará irreversiblemente todas las claves de paso y de
seguridad en esta cuenta, ¿Proceder? seguridad en esta cuenta, ¿Proceder?
inputNotMatch: Las entradas no coinciden inputNotMatch: Las entradas no coinciden
indexFrom: Indizar desde la ID de la publicación en adelante
indexPosts: Indizar publicaciones
isModerator: Moderador isModerator: Moderador
isAdmin: Administrador isAdmin: Administrador
isPatron: Mecenas de Firefish isPatron: Mecenas de Firefish
@ -2139,8 +2132,6 @@ migrationConfirm: "¿Estás absolutamente seguro de que quieres migrar a tu cuen
{account}? Una vez hecho esto, no podrás revertir el cambio, ni tampoco usar tu {account}? Una vez hecho esto, no podrás revertir el cambio, ni tampoco usar tu
cuenta normalmente.\nTambién, asegúrate de que has configurado ésta cuenta como cuenta normalmente.\nTambién, asegúrate de que has configurado ésta cuenta como
la cuenta desde la cual estás migrando." la cuenta desde la cual estás migrando."
indexNotice: Indizando ahora. Esto puede llevar bastante tiempo, por favor, no reinicies
el servidor por lo menos hasta dentro de una hora.
customKaTeXMacro: Macros KaTeX personalizadas customKaTeXMacro: Macros KaTeX personalizadas
customKaTeXMacroDescription: '¡Configura macros para escribir expresiones matemáticas customKaTeXMacroDescription: '¡Configura macros para escribir expresiones matemáticas
fácilmente! La notación es conforme la las definiciones de comandos LaTeX y puede fácilmente! La notación es conforme la las definiciones de comandos LaTeX y puede

View file

@ -76,7 +76,7 @@ importRequested: "Vous avez initié une importation. Cela pourrait prendre un pe
temps." temps."
lists: "Listes" lists: "Listes"
noLists: "Vous n'avez aucune liste" noLists: "Vous n'avez aucune liste"
note: "Publication" note: "Publier"
notes: "Publications" notes: "Publications"
following: "Abonnements" following: "Abonnements"
followers: "Abonné·e·s" followers: "Abonné·e·s"
@ -666,7 +666,7 @@ useGlobalSettingDesc: "S'il est activé, les paramètres de notification de votr
other: "Autre" other: "Autre"
regenerateLoginToken: "Régénérer le jeton de connexion" regenerateLoginToken: "Régénérer le jeton de connexion"
regenerateLoginTokenDescription: "Générer un nouveau jeton d'authentification. Cette regenerateLoginTokenDescription: "Générer un nouveau jeton d'authentification. Cette
opération ne devrait pas être nécessaire ; lors de la génération d'un nouveau jeton, opération ne devrait pas être nécessaire; lors de la génération d'un nouveau jeton,
tous les appareils seront déconnectés." tous les appareils seront déconnectés."
setMultipleBySeparatingWithSpace: "Vous pouvez en définir plusieurs, en les séparant setMultipleBySeparatingWithSpace: "Vous pouvez en définir plusieurs, en les séparant
par des espaces." par des espaces."
@ -1152,6 +1152,7 @@ _wordMute:
muteLangs: Langues filtrées muteLangs: Langues filtrées
muteLangsDescription: Séparer avec des espaces ou des retours à la ligne pour une muteLangsDescription: Séparer avec des espaces ou des retours à la ligne pour une
condition OU (OR). condition OU (OR).
mutePatterns: Patrons masqués
_instanceMute: _instanceMute:
instanceMuteDescription2: "Séparer avec des sauts de lignes" instanceMuteDescription2: "Séparer avec des sauts de lignes"
title: "Masque les publications provenant des serveurs listés." title: "Masque les publications provenant des serveurs listés."
@ -1400,10 +1401,7 @@ _widgets:
_userList: _userList:
chooseList: Sélectionner une liste chooseList: Sélectionner une liste
unixClock: Horloge UNIX unixClock: Horloge UNIX
meiliIndexCount: Publications indexées
serverInfo: Info serveur serverInfo: Info serveur
meiliStatus: État du serveur
meiliSize: Taille de l'index
instanceCloud: Nuage de serveurs instanceCloud: Nuage de serveurs
rssTicker: Bandeau RSS rssTicker: Bandeau RSS
_cw: _cw:
@ -2002,7 +2000,7 @@ forwardReportIsAnonymous: À la place de votre compte, un compte système anonym
affiché comme rapporteur au serveur distant. affiché comme rapporteur au serveur distant.
noThankYou: Non merci noThankYou: Non merci
addInstance: Ajouter un serveur addInstance: Ajouter un serveur
renoteMute: Masquer les boosts renoteMute: Masquer les boosts dans vos fils d'actualité
flagSpeakAsCat: Parler comme un chat flagSpeakAsCat: Parler comme un chat
flagSpeakAsCatDescription: Vos messages seront « nyanifiés » en mode chat flagSpeakAsCatDescription: Vos messages seront « nyanifiés » en mode chat
hiddenTags: Hashtags cachés hiddenTags: Hashtags cachés
@ -2034,13 +2032,13 @@ updateAvailable: Une mise à jour peut être disponible!
accountMoved: "L'utilisateur·rice a migré vers un nouveau compte:" accountMoved: "L'utilisateur·rice a migré vers un nouveau compte:"
enableEmojiReactions: Activer les réactions par émojis enableEmojiReactions: Activer les réactions par émojis
showEmojisInReactionNotifications: Montrer les émojis dans les notifications de réactions showEmojisInReactionNotifications: Montrer les émojis dans les notifications de réactions
renoteUnmute: Ne plus masquer les boosts renoteUnmute: Ne plus masquer les boosts dans vos fils d'actualité
selectInstance: Choisir un serveur selectInstance: Choisir un serveur
noInstances: Il n'y a aucun serveur noInstances: Il n'y a aucun serveur
showLocalPosts: 'Montrer les notes locales dans :' showLocalPosts: 'Montrer les notes locales dans :'
homeTimeline: Timeline d'Accueil homeTimeline: Timeline d'Accueil
socialTimeline: Timeline Sociale socialTimeline: Timeline Sociale
requireAdminForView: Vous avez besoin d'un compte d'administration pour voir cela. requireAdminForView: Vous avez besoin d'un compte d'administration pour voir ceci.
isSystemAccount: Ce compte est créé et géré automatiquement par le système. Veuillez isSystemAccount: Ce compte est créé et géré automatiquement par le système. Veuillez
ne pas modérer, éditer, supprimer ou altérer d'une autre manière ce compte, ou cela ne pas modérer, éditer, supprimer ou altérer d'une autre manière ce compte, ou cela
risque de perturber votre serveur. risque de perturber votre serveur.
@ -2061,9 +2059,6 @@ moveToLabel: 'Compte vers lequel vous migrez:'
moveFrom: Migrer vers ce compte depuis un ancien compte moveFrom: Migrer vers ce compte depuis un ancien compte
defaultReaction: Émoji de réaction par défaut pour les publications entrantes et sortantes defaultReaction: Émoji de réaction par défaut pour les publications entrantes et sortantes
license: Licence license: Licence
indexPosts: Indexer les publications
indexNotice: Indexation en cours. Cela prendra certainement du temps, veuillez ne
pas redémarrer votre serveur pour au moins une heure.
customKaTeXMacro: Macros KaTeX personnalisées customKaTeXMacro: Macros KaTeX personnalisées
enableCustomKaTeXMacro: Activer les macros KaTeX personnalisées enableCustomKaTeXMacro: Activer les macros KaTeX personnalisées
noteId: ID des publications noteId: ID des publications
@ -2095,11 +2090,9 @@ _experiments:
de leurs anciens comptes Firefish, Misskey, Mastodon, Akkoma et Pleroma. Cela de leurs anciens comptes Firefish, Misskey, Mastodon, Akkoma et Pleroma. Cela
peut entraîner des ralentissements lors du chargement si votre file d'attente peut entraîner des ralentissements lors du chargement si votre file d'attente
est congestionnée. est congestionnée.
findOtherInstance: Trouver un autre serveur
userSaysSomethingReasonQuote: '{name} a cité une publication contenant {reason}' userSaysSomethingReasonQuote: '{name} a cité une publication contenant {reason}'
signupsDisabled: Les inscriptions sur ce serveur sont actuellement désactivés, mais signupsDisabled: Les inscriptions sur ce serveur sont actuellement désactivés. Si
vous pouvez toujours vous inscrire sur un autre serveur ! Si vous avez un code d'invitation vous avez un code d'invitation pour ce serveur, saisissez-le ci-dessous.
pour ce serveur, entrez-le ci-dessous s'il vous plait.
apps: Applications apps: Applications
userSaysSomethingReasonReply: '{noms} a répondu à une publication contenant {raison}' userSaysSomethingReasonReply: '{noms} a répondu à une publication contenant {raison}'
defaultValueIs: 'défaut: {valeur}' defaultValueIs: 'défaut: {valeur}'
@ -2110,7 +2103,6 @@ expandOnNoteClick: Ouvrir la publications en cliquant
preventAiLearning: Empêcher le récupération de données par des IA preventAiLearning: Empêcher le récupération de données par des IA
listsDesc: Les listes vous laissent créer des fils personnalisés avec des utilisateur·rice·s listsDesc: Les listes vous laissent créer des fils personnalisés avec des utilisateur·rice·s
spécifié·e·s. Elles sont accessibles depuis la page des fils. spécifié·e·s. Elles sont accessibles depuis la page des fils.
indexFromDescription: Laisser vide pour indexer toutes les publications
_feeds: _feeds:
jsonFeed: flux JSON jsonFeed: flux JSON
atom: Atom atom: Atom
@ -2120,7 +2112,6 @@ alt: ALT
swipeOnMobile: Permettre le balayage entre les pages swipeOnMobile: Permettre le balayage entre les pages
expandOnNoteClickDesc: Si désactivé, vous pourrez toujours ouvrir les publications expandOnNoteClickDesc: Si désactivé, vous pourrez toujours ouvrir les publications
dans le menu du clic droit et en cliquant sur l'horodatage. dans le menu du clic droit et en cliquant sur l'horodatage.
indexFrom: Indexer à partir de l'ID des publications
older: ancien older: ancien
newer: récent newer: récent
accessibility: Accessibilité accessibility: Accessibilité
@ -2268,3 +2259,56 @@ makePrivateConfirm: Cette opération enverra une demande de suppression aux serv
useCdn: Obtenir des actifs à partir d'un réseau de diffusion de contenu useCdn: Obtenir des actifs à partir d'un réseau de diffusion de contenu
useCdnDescription: Obtenir des actifs, tels que Twemoji, à partir du réseau de diffusion useCdnDescription: Obtenir des actifs, tels que Twemoji, à partir du réseau de diffusion
de contenu « JSDelivr » au lieu de ce serveur. de contenu « JSDelivr » au lieu de ce serveur.
sentFollowRequests: Demandes d'abonnement envoyées
enablePullToRefresh: Activer « Dérouler pour actualiser »
reloading: Rechargement en cours
pullToRefreshThreshold: Distance de traction pour le rechargement
pullDownToReload: Tirer pour actualiser
releaseToReload: Relâcher pour actualiser
searchWords: Mot(s), ID ou URL à rechercher
searchUsers: Publier par (faculatif)
replyMute: Masquer les réponses dans vos fils d'actualité
replyUnmute: Ne plus masquer les réponses dans vos fils d'actualité
noSentFollowRequests: Vous n'avez envoyé aucune demande d'abonnement
enableTimelineStreaming: Actualiser les fils d'actualité automatiquement
searchRange: Publier entre (faculatif)
searchCwAndAlt: Inclure les avertissements de contenu et les descriptions de fichiers
searchPostsWithFiles: Publications uniquement avec fichiers
publishTimelines: Publier les fils d'actualité pour les visiteurs
publishTimelinesDescription: Si cette option est activée, les fils Local et Global
sera affichée sur {url} même en cas de déconnexion.
searchWordsDescription: "Pour rechercher des publications, saisissez le terme de recherche.
Des mots séparés avec un espace pour une recherche ET, ou « OR » (sans citations)
entre des mots pour une recherche OU.\nPar exemple, « matin nuit » trouvera des
publications contenant à la fois « matin » et « nuit », et « matin ou nuit » trouveront
des messages qui contiennent soit « matin » ou « nuit » (ou les deux).\nVous pouvez
également combiner des conditions ET/OU comme « (matin OR nuit) ensommeillé ».\n
\nSi vous souhaitez accéder à une page d'utilisateur ou à une page d'affichage spécifique,
saisissez l'ID ou l'URL dans ce champ et cliquez sur le bouton « Rechercher ». Cliquez
sur « Rechercher » recherchera des messages qui contiennent littéralement l'ID/URL."
searchUsersDescription: "Pour rechercher des messages par un utilisateur/serveur spécifique,
saisissez l'ID (@utilisateur@exemple.com, ou @utilisateur pour un utilisateur local)
ou le nom de domaine (exemple.com).\n\nSi vous saisissez « me » (sans guillemets),
tous vos messages (y compris les messages non-listés, abonnés-seulement, directs
et secrets) seront recherchés.\n\nSi vous saisissez « local » (sans guillemets),
les résultats seront filtrés pour inclure seulement des messages de ce serveur."
searchRangeDescription: "Si vous voulez filtrer par période de temps, saisissez-la
dans ce format: 20220615-20231031\n\nSi vous omettez l'année (comme le 0105-0106
ou le 20231105-0110), elle est interprétée comme l'année en cours.\n\nVous pouvez
également omettre le début ou la fin de la date. Par exemple, -0102 filtrera les
résultats de recherche pour afficher seulement les messages effectués avant le 2
janvier de cette année, et 20231026- filtrera les résultats pour afficher seulement
les messages effectués après le 26 octobre 2023."
toReply: Répondre
toPost: Publier
toQuote: Citer
toEdit: Modifier
messagingUnencryptedInfo: Les conversations sur Firefish ne sont pas cryptées. Ne
partagez aucune information sensible sur Firefish.
moderationNote: Note de modération
driveCapacityOverride: Limite de stockage personalisée
ipFirstAcknowledged: La date de la première acquisition de l'adresse IP
noAltTextWarning: Certains fichiers joints n'ont aucune description. Avez-vous oublié
de l'écrire?
showNoAltTextWarning: Afficher un avertissement si vous essayez de publier des fichiers
sans description

1
locales/hu.yml Normal file
View file

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

View file

@ -415,7 +415,7 @@ securityKeyName: "Nama kunci"
registerSecurityKey: "Daftarkan kunci keamanan" registerSecurityKey: "Daftarkan kunci keamanan"
lastUsed: "Terakhir digunakan" lastUsed: "Terakhir digunakan"
unregister: "Batalkan pendaftaran" unregister: "Batalkan pendaftaran"
passwordLessLogin: "Setel login tanpa kata sandi" passwordLessLogin: "Masuk tanpa kata sandi"
resetPassword: "Atur ulang kata sandi" resetPassword: "Atur ulang kata sandi"
newPasswordIs: "Kata sandi baru adalah \"{password}\"" newPasswordIs: "Kata sandi baru adalah \"{password}\""
reduceUiAnimation: "Kurangi animasi antarmuka" reduceUiAnimation: "Kurangi animasi antarmuka"
@ -655,10 +655,10 @@ useGlobalSetting: "Gunakan setelan global"
useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun kamu akan digunakan. useGlobalSettingDesc: "Jika dinyalakan, setelan pemberitahuan akun kamu akan digunakan.
Jika dimatikan, konfigurasi secara individu dapat dibuat." Jika dimatikan, konfigurasi secara individu dapat dibuat."
other: "Lainnya" other: "Lainnya"
regenerateLoginToken: "Perbarui token login" regenerateLoginToken: "Perbarui token masuk"
regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat regenerateLoginTokenDescription: "Perbarui token yang digunakan secara internal saat
login. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat akan masuk ke akun. Normalnya aksi ini tidak diperlukan. Jika diperbarui, semua perangkat
dilogout." akan dikeluarkan dari akun."
setMultipleBySeparatingWithSpace: "Kamu dapat menyetel banyak dengan memisahkannya setMultipleBySeparatingWithSpace: "Kamu dapat menyetel banyak dengan memisahkannya
menggunakan spasi." menggunakan spasi."
fileIdOrUrl: "File-ID atau URL" fileIdOrUrl: "File-ID atau URL"
@ -1138,6 +1138,7 @@ _wordMute:
dari timeline. dari timeline.
muteLangs: Bahasa yang dibisukan muteLangs: Bahasa yang dibisukan
muteLangsDescription: Pisahkan dengan spasi atau jeda baris untuk kondisi ATAU. muteLangsDescription: Pisahkan dengan spasi atau jeda baris untuk kondisi ATAU.
mutePatterns: Pola yang dibisukan
_instanceMute: _instanceMute:
instanceMuteDescription: "Pengaturan ini akan membisukan postingan/pembagian apa instanceMuteDescription: "Pengaturan ini akan membisukan postingan/pembagian apa
saja dari server yang terdaftar, termasuk pengguna yang membalas pengguna lain saja dari server yang terdaftar, termasuk pengguna yang membalas pengguna lain
@ -1295,8 +1296,8 @@ _2fa:
step2Url: "Di aplikasi desktop, masukkan URL berikut:" step2Url: "Di aplikasi desktop, masukkan URL berikut:"
step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan step3: "Masukkan token yang telah disediakan oleh aplikasimu untuk menyelesaikan
pemasangan." pemasangan."
step4: "Mulai sekarang, upaya login apapun akan meminta token login dari aplikasi step4: "Mulai sekarang, upaya pemasukan akun apa pun akan meminta token masuk dari
otentikasi kamu." aplikasi autentikasi kamu."
securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses securityKeyInfo: "Kamu dapat memasang otentikasi WebAuthN untuk mengamankan proses
login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung login lebih lanjut dengan tidak hanya perangkat keras kunci keamanan yang mendukung
FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu." FIDO2, namun juga sidik jari atau otentikasi PIN pada perangkatmu."
@ -1390,14 +1391,11 @@ _widgets:
aiscript: "Konsol AiScript" aiscript: "Konsol AiScript"
aichan: "Ai" aichan: "Ai"
rssTicker: Telegraf RSS rssTicker: Telegraf RSS
meiliIndexCount: Postingan yang terindeks
userList: Daftar Pengguna userList: Daftar Pengguna
instanceCloud: Server Awan instanceCloud: Server Awan
unixClock: Jam UNIX unixClock: Jam UNIX
meiliSize: Ukuran indeks
_userList: _userList:
chooseList: Pilih daftar chooseList: Pilih daftar
meiliStatus: Status Server
serverInfo: Info Server serverInfo: Info Server
_cw: _cw:
hide: "Sembunyikan" hide: "Sembunyikan"
@ -1884,8 +1882,8 @@ listsDesc: Daftar mengizinkanmu membuat linimasa berisi pengguna spesifik. Itu d
diakses dari halaman linimasa. diakses dari halaman linimasa.
enableEmojiReactions: Aktifkan reaksi emoji enableEmojiReactions: Aktifkan reaksi emoji
showEmojisInReactionNotifications: Tampilkan emoji dalam notifikasi reaksi showEmojisInReactionNotifications: Tampilkan emoji dalam notifikasi reaksi
renoteMute: Bisukan postingan ulang renoteMute: Bisukan postingan ulang dalam lini masa
renoteUnmute: Bunyikan postingan ulang renoteUnmute: Bunyikan postingan ulang dalam lini masa
antennasDesc: "Antena menampilkan postingan baru yang cocok dengan kriteriamu!\n Itu antennasDesc: "Antena menampilkan postingan baru yang cocok dengan kriteriamu!\n Itu
dapat diakses dari halaman linimasa." dapat diakses dari halaman linimasa."
antennaInstancesDescription: Daftarkan satu host server per baris antennaInstancesDescription: Daftarkan satu host server per baris
@ -1984,17 +1982,14 @@ speed: Kecepatan
slow: Pelan slow: Pelan
remoteOnly: Jarak jauh saja remoteOnly: Jarak jauh saja
moveFrom: Dari akun lama pindahkan ke akun ini moveFrom: Dari akun lama pindahkan ke akun ini
indexNotice: Sedang mengindeks. Ini memerlukan beberapa waktu, mohon jangan mulai
ulang server setidaknya satu jam.
sendPushNotificationReadMessage: Hapus pemberitahuan dorong saat pemberitahuan atau sendPushNotificationReadMessage: Hapus pemberitahuan dorong saat pemberitahuan atau
pesan relevan sudah dibaca pesan relevan sudah dibaca
moveAccountDescription: Proses ini permanen. Pastikan kamu sudah mengatur alias dari moveAccountDescription: Proses ini permanen. Pastikan kamu sudah mengatur alias dari
akun ini ke akun barumu sebelum pindah. Silakan masukkan tag akun dengan format akun ini ke akun barumu sebelum pindah. Silakan masukkan tag akun dengan format
seperti @orang@server.com seperti @orang@server.com
sendModMail: Kirim Pemberitahuan Moderasi sendModMail: Kirim Pemberitahuan Moderasi
signupsDisabled: Pendaftaran ke server ini nonaktif, tapi kamu dapat selalu mendaftar signupsDisabled: Pendaftaran ke server ini nonaktifkam. Jika kamu memiliki kode undangan
ke server lain! Jika kamu memiliki kode undangan server ini, harap masukkan di bawah server ini, harap masukkan di bawah ini.
ini.
enableCustomKaTeXMacro: Aktifkan makro KaTeX khusus enableCustomKaTeXMacro: Aktifkan makro KaTeX khusus
isBot: Akun ini akun otomatis isBot: Akun ini akun otomatis
customMOTD: MOTD khusus (pesan layar percik) customMOTD: MOTD khusus (pesan layar percik)
@ -2010,9 +2005,7 @@ showAds: Tampilkan spanduk komunitas
enterSendsMessage: Tekan Enter pada Pesan untuk mengirim pesan (matikan dengan Ctrl enterSendsMessage: Tekan Enter pada Pesan untuk mengirim pesan (matikan dengan Ctrl
+ Enter) + Enter)
showAdminUpdates: Indikasi versi Firefish baru tersedia (hanya admin) showAdminUpdates: Indikasi versi Firefish baru tersedia (hanya admin)
indexFrom: Indeks dari Post ID berikutnya
noteId: ID Postingan noteId: ID Postingan
findOtherInstance: Cari server lain
caption: Deskripsi itomatis caption: Deskripsi itomatis
splash: Layar Percik splash: Layar Percik
migration: Migrasi migration: Migrasi
@ -2022,7 +2015,6 @@ moveFromDescription: Ini akan mengatur alias akun lamamu jadi kamu dapat pindah
akun tersebut ke akun sekarang. Lakukan ini SEBELUM memindahkan akun lama. Silakan akun tersebut ke akun sekarang. Lakukan ini SEBELUM memindahkan akun lama. Silakan
masukkan tag akun dengan format seperti @orang@server.com masukkan tag akun dengan format seperti @orang@server.com
defaultReaction: Reaksi emoji bawaan untuk postingan keluar dan masuk defaultReaction: Reaksi emoji bawaan untuk postingan keluar dan masuk
indexPosts: Indeks Postingan
preventAiLearning: Cegah scraping bot AI preventAiLearning: Cegah scraping bot AI
customKaTeXMacro: Makro KaTeX khusus customKaTeXMacro: Makro KaTeX khusus
sendPushNotificationReadMessageCaption: Pemberitahuan yang berisi teks "{emptyPushNotificationMessage}" sendPushNotificationReadMessageCaption: Pemberitahuan yang berisi teks "{emptyPushNotificationMessage}"
@ -2052,7 +2044,6 @@ migrationConfirm: "Kamu sangat yakin ingin memindahkan akunmu ke {account}? Seka
lagi secara normal. \nDan juga, harap pastikan kamu sudah mengatur akun sekarang lagi secara normal. \nDan juga, harap pastikan kamu sudah mengatur akun sekarang
sebagai akun yang dipindahkan." sebagai akun yang dipindahkan."
license: Lisensi license: Lisensi
indexFromDescription: Kosongkan untuk mengindeks setiap postingan
noGraze: Harap nonaktifkan ekstensi peramban "Graze for Mastodon", karena akan menganggu noGraze: Harap nonaktifkan ekstensi peramban "Graze for Mastodon", karena akan menganggu
Firefish. Firefish.
silencedWarning: Halaman ini tampil karena pengguna ini datang dari server yang dibisukan silencedWarning: Halaman ini tampil karena pengguna ini datang dari server yang dibisukan
@ -2193,7 +2184,7 @@ emojiModPerm: Perizinan pengelolaan emoji kustom
emojiModPermDescription: "Tambah: Perbolehkan pengguna ini untuk menambahkan emoji emojiModPermDescription: "Tambah: Perbolehkan pengguna ini untuk menambahkan emoji
kustom baru dan menetapkan tag/kategori/lisensi untuk semua emoji kustom yang telah kustom baru dan menetapkan tag/kategori/lisensi untuk semua emoji kustom yang telah
ditambahkan.\nTambah dan Sunting: Perizinan \"Tambah\" + Perbolehkan pengguna ini ditambahkan.\nTambah dan Sunting: Perizinan \"Tambah\" + Perbolehkan pengguna ini
untuk menyunting nama/kategori/tag/lisensi emoji kustom yang sudah ada.\nPerbolehkan untuk menyunting nama/kategori/tag/lisensi emoji kustom yang sudah ada.\n Perbolehkan
Semua: Perizinan \"Tambah dan Sunting\" + Perbolehkan pengguna ini untuk menghapus Semua: Perizinan \"Tambah dan Sunting\" + Perbolehkan pengguna ini untuk menghapus
semua emoji kustom yang sudah ada." semua emoji kustom yang sudah ada."
private: Privat private: Privat
@ -2221,3 +2212,56 @@ showPreviewByDefault: Tampilkan pratinjau dalam formulir kiriman secara bawaan
useCdn: Dapatkan aset dari CDN useCdn: Dapatkan aset dari CDN
useCdnDescription: Muat aset statis seperti Twemoji dari CDN JSDelivr daripada server useCdnDescription: Muat aset statis seperti Twemoji dari CDN JSDelivr daripada server
Firefish ini. Firefish ini.
sentFollowRequests: Permintaan mengikuti terkirim
replyUnmute: Suarakan balasan dalam lini masa
noSentFollowRequests: Kamu belum punya permintaan mengikuti
enablePullToRefresh: Aktifkan "Tarik ke bawah untuk memuat ulang"
pullDownToReload: Tarik ke bawah untuk memuat ulang
enableTimelineStreaming: Perbarui lini masa secara otomatis
searchWords: Kata-kata untuk dicari / ID atau URL untuk dicari
searchUsers: Dikirim oleh (opsional)
searchCwAndAlt: Termasuk peringatan konten dan deskripsi berkas
searchPostsWithFiles: Hanya kiriman dengan berkas
publishTimelines: Terbitkan lini masa untuk pengunjung
publishTimelinesDescription: Jika diaktifkan, lini masa Lokal dan Global akan ditampilkan
di {url} bahkan ketika keluar dari akun.
searchWordsDescription: "Untuk mencari kiriman, masukkan istilah pencarian. Pisahkan
kata dengan spasi untuk pencarian AND (dan), atau 'OR' ('atau', tanpa tanda kutip)
di antara kata-kata untuk pencarian OR.\nMisalnya, 'pagi malam' akan menemukan postingan
yang mengandung 'pagi' dan 'malam', dan 'pagi OR malam' akan menemukan postingan
yang mengandung 'pagi' atau 'malam' (atau keduanya).\nAnda juga dapat menggabungkan
kondisi AND/OR seperti '(pagi OR malam) mengantuk'.\n\nJika kamu ingin membuka halaman
pengguna atau halaman postingan tertentu, masukkan ID atau URL pada kolom ini dan
klik tombol 'Cari'. Mengklik 'Cari' akan mencari postingan yang secara harfiah mengandung
ID/URL."
pullToRefreshThreshold: Jarak penarikan untuk memuat ulang
releaseToReload: Lepaskan untuk memuat ulang
reloading: Memuat ulang
replyMute: Bisukan balasan dalam lini masa
searchRange: Dikirim dalam (opsional)
searchUsersDescription: "Untuk mencari kiriman oleh pengguna/server tertentu, masukkan
ID (@pengguna@contoh.id, atau @pengguna untuk pengguna lokal) atau nama domain (contoh.id)\n
\nJika kamu memasukkan 'me' ('aku', tanpa tanda kutip), semua kirimanmu (termasuk
kiriman yang tidak terdaftar, khusus pengikut, langsung, dan rahasia) akan dicari.\n
\nJika Anda memasukkan 'local' (tanpa tanda kutip), hasilnya akan disaring untuk
menyertakan hanya kiriman dari server ini."
searchRangeDescription: "Jika kamu ingin memfilter periode waktu, masukkan dalam format
ini: 20220615-20231031\n\nJika kamu menghilangkan tahun (seperti 0105-0106 atau
20231105-0110), maka akan ditafsirkan sebagai tahun saat ini.\n\nKamu juga bisa
menghilangkan tanggal awal atau akhir. Sebagai contoh, -0102 akan memfilter hasil
pencarian untuk menampilkan hanya kiriman yang dibuat sebelum tanggal 2 Januari
tahun ini, dan 20231026- akan memfilter hasil pencarian untuk menampilkan hanya
kiriman yang dibuat setelah tanggal 26 Oktober 2023."
toPost: Kirim
toQuote: Kutip
noAltTextWarning: Beberapa berkas yang dilampirkan tidak memiliki deskripsi. Lupa
menulis deskripsinya?
toEdit: Sunting
showNoAltTextWarning: Tampilkan peringatan jika kamu mencoba mengirim berkas tanpa
deskripsi
toReply: Balas
messagingUnencryptedInfo: Percakapan di Firefish tidak terenkripsi secara ujung ke
ujung. Jangan bagikan informasi sensitif apa pun melalui Firefish.
moderationNote: Catatan Moderasi
driveCapacityOverride: Penimpaan Kapasitas Drive
ipFirstAcknowledged: Tanggal akuisisi pertama dari alamat IP

View file

@ -1324,9 +1324,6 @@ _widgets:
instanceCloud: Cloud del server instanceCloud: Cloud del server
unixClock: Orologio UNIX unixClock: Orologio UNIX
serverInfo: Informazioni sul server serverInfo: Informazioni sul server
meiliIndexCount: Post indicizzati
meiliStatus: Stato del server
meiliSize: Dimensione indice
userList: Elenco utenti userList: Elenco utenti
_cw: _cw:
hide: "Nascondi" hide: "Nascondi"
@ -1838,13 +1835,10 @@ customSplashIconsDescription: Elenco degli URL di icone personalizzate da mostra
le immagini siano su un URL statico, preferibilmente di dimensioni 192x192. le immagini siano su un URL statico, preferibilmente di dimensioni 192x192.
swipeOnDesktop: Permetti lo swipe su desktop simile alla versione mobile swipeOnDesktop: Permetti lo swipe su desktop simile alla versione mobile
logoImageUrl: URL del logo logoImageUrl: URL del logo
indexFrom: Indicizza dal post ID
customKaTeXMacro: Macro KaTeX personalizzate customKaTeXMacro: Macro KaTeX personalizzate
indexPosts: Crea indice dei post
signupsDisabled: Le iscrizioni su questo server al momento non sono possibili, ma signupsDisabled: Le iscrizioni su questo server al momento non sono possibili, ma
puoi sempre iscriverti su un altro server! Se invece hai un codice di invito per puoi sempre iscriverti su un altro server! Se invece hai un codice di invito per
questo server, inseriscilo qua sotto. questo server, inseriscilo qua sotto.
findOtherInstance: Scegli un altro server
apps: App apps: App
expandOnNoteClick: Apri i post con un click expandOnNoteClick: Apri i post con un click
userSaysSomethingReasonReply: '{name} ha risposto a un post che contiene {reason}' userSaysSomethingReasonReply: '{name} ha risposto a un post che contiene {reason}'
@ -1919,9 +1913,6 @@ lastActiveDate: Ultimo utilizzo
enterSendsMessage: Premi "Invio" nei messaggi per inviare (altrimenti è "Ctrl + Invio") enterSendsMessage: Premi "Invio" nei messaggi per inviare (altrimenti è "Ctrl + Invio")
customMOTD: Messaggi di caricamento personalizzati (splash screen) customMOTD: Messaggi di caricamento personalizzati (splash screen)
replayTutorial: Ripeti il tutorial replayTutorial: Ripeti il tutorial
indexFromDescription: Lascia vuoto per indicizzare tutti i post
indexNotice: Creazione indice in corso. Sarà necessario del tempo, fai attenzione
a non riavviare il server per almeno un'ora.
enableCustomKaTeXMacro: Abilita le macro KaTeX personalizzate enableCustomKaTeXMacro: Abilita le macro KaTeX personalizzate
preventAiLearningDescription: Richiedi ai bot di intelligenza artificiale di terze preventAiLearningDescription: Richiedi ai bot di intelligenza artificiale di terze
parti di non studiare e acquisire il contenuto che carichi, come post e immagini. parti di non studiare e acquisire il contenuto che carichi, come post e immagini.
@ -2029,8 +2020,8 @@ requireAdminForView: Devi avere un account amministratore per vedere questo cont
jumpToPrevious: Vai al precedente jumpToPrevious: Vai al precedente
flagShowTimelineReplies: Mostra le risposte nella timeline flagShowTimelineReplies: Mostra le risposte nella timeline
cw: Content warning cw: Content warning
renoteMute: Silenzia i boost renoteMute: Silenzia i boost nelle timeline
renoteUnmute: Non silenziare i boost renoteUnmute: Non silenziare i boost nelle timeline
enableEmojiReactions: Abilita le reazioni con emoji enableEmojiReactions: Abilita le reazioni con emoji
preferencesBackups: Backup delle preferenze preferencesBackups: Backup delle preferenze
adminCustomCssWarn: Questa impostazione dovrebbe essere usata solo se ne comprendi adminCustomCssWarn: Questa impostazione dovrebbe essere usata solo se ne comprendi
@ -2181,8 +2172,9 @@ showPreviewByDefault: Mostra sempre l'anteprima del messaggio
replaceWidgetsButtonWithReloadButton: Sostituisci il bottone dei widget con quello replaceWidgetsButtonWithReloadButton: Sostituisci il bottone dei widget con quello
di reload di reload
squareCatAvatars: Mostra avatar quadrati per gli account di gatti squareCatAvatars: Mostra avatar quadrati per gli account di gatti
searchEngine: Motore della barra di ricerca MFM searchEngine: Motore di ricerca della barra MFM
hideFollowButtons: Nascondi i bottoni di follow se in posizioni cliccabili per errore hideFollowButtons: Nascondi i bottoni di follow se sono in una posizione cliccabile
per errore
preventMisclick: Protezione dai click accidentali preventMisclick: Protezione dai click accidentali
forMobile: Mobile forMobile: Mobile
replaceChatButtonWithAccountButton: Sostituisci il bottone chat con quello di cambio replaceChatButtonWithAccountButton: Sostituisci il bottone chat con quello di cambio
@ -2205,3 +2197,17 @@ emojiModPermDescription: "Aggiungi: Permette all'utente di aggiungere emoji pers
in più permette di rimuovere le emoji personalizzate." in più permette di rimuovere le emoji personalizzate."
makePrivateConfirm: Questa operazione invierà ai server remoti un richiesta di rimozione makePrivateConfirm: Questa operazione invierà ai server remoti un richiesta di rimozione
e cambierà la visibilità a "Privato". Confermi? e cambierà la visibilità a "Privato". Confermi?
sentFollowRequests: Richieste di follow inviate
searchWords: Parole da cercare / ID o URL da mostrare
enablePullToRefresh: Abilita il "Trascina in basso per aggiornare"
pullToRefreshThreshold: Distanza di trascinamento per ricaricare
pullDownToReload: Trascina in basso per ricaricare
releaseToReload: Rilascia per ricaricare
reloading: Ricaricamento
enableTimelineStreaming: Aggiorna le timeline in automatico
noSentFollowRequests: Non hai inviato richieste di follow
replyMute: Silenzia le risposte nelle timeline
replyUnmute: Non silenziare le risposte nelle timeline
useCdn: Carica gli asset da CDN
useCdnDescription: Carica alcuni asset statici come Twemoji dal CDN JSDelivr invece
che da questo server Firefish.

View file

@ -53,6 +53,7 @@ copyUsername: "ユーザー名をコピー"
searchUser: "ユーザーを検索" searchUser: "ユーザーを検索"
reply: "返信" reply: "返信"
replies: "返信" replies: "返信"
toReply: "返信"
loadMore: "もっと読み込む" loadMore: "もっと読み込む"
showMore: "もっと見る" showMore: "もっと見る"
showLess: "閉じる" showLess: "閉じる"
@ -75,6 +76,7 @@ lists: "リスト"
noLists: "リストはありません" noLists: "リストはありません"
note: "投稿" note: "投稿"
notes: "投稿" notes: "投稿"
toPost: "投稿する"
following: "フォロー" following: "フォロー"
followers: "フォロワー" followers: "フォロワー"
followsYou: "フォローされています" followsYou: "フォローされています"
@ -105,6 +107,7 @@ cantRenote: "この投稿はブーストできません。"
cantReRenote: "ブーストをブーストすることはできません。" cantReRenote: "ブーストをブーストすることはできません。"
quote: "引用" quote: "引用"
quotes: "引用" quotes: "引用"
toQuote: "引用する"
pinnedNote: "ピン留めされた投稿" pinnedNote: "ピン留めされた投稿"
pinned: "ピン留め" pinned: "ピン留め"
you: "あなた" you: "あなた"
@ -413,7 +416,7 @@ securityKeyName: "キーの名前"
registerSecurityKey: "セキュリティキーを登録する" registerSecurityKey: "セキュリティキーを登録する"
lastUsed: "最後の使用" lastUsed: "最後の使用"
unregister: "登録を解除" unregister: "登録を解除"
passwordLessLogin: "パスワード無しでログイン" passwordLessLogin: "パスワード無しでサインイン"
resetPassword: "パスワードをリセット" resetPassword: "パスワードをリセット"
newPasswordIs: "新しいパスワードは「{password}」です" newPasswordIs: "新しいパスワードは「{password}」です"
reduceUiAnimation: "UIのアニメーションを減らす" reduceUiAnimation: "UIのアニメーションを減らす"
@ -478,7 +481,7 @@ disableDrawer: "メニューをドロワーで表示しない"
youHaveNoGroups: "グループがありません" youHaveNoGroups: "グループがありません"
joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。" joinOrCreateGroup: "既存のグループに招待してもらうか、新しくグループを作成してください。"
noHistory: "履歴はありません" noHistory: "履歴はありません"
signinHistory: "ログイン履歴" signinHistory: "サインイン履歴"
disableAnimatedMfm: "動きのあるMFMを無効にする" disableAnimatedMfm: "動きのあるMFMを無効にする"
doing: "やっています" doing: "やっています"
category: "カテゴリ" category: "カテゴリ"
@ -606,6 +609,7 @@ tokenRequested: "アカウントへのアクセス許可"
pluginTokenRequestedDescription: "このプラグインはここで設定した権限を行使できるようになります。" pluginTokenRequestedDescription: "このプラグインはここで設定した権限を行使できるようになります。"
notificationType: "通知の種類" notificationType: "通知の種類"
edit: "編集" edit: "編集"
toEdit: "編集する"
emailServer: "メールサーバー" emailServer: "メールサーバー"
enableEmail: "メール配信機能を有効化する" enableEmail: "メール配信機能を有効化する"
emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使います" emailConfigInfo: "メールアドレスの確認やパスワードリセットの際に使います"
@ -644,8 +648,8 @@ notificationSettingDesc: "表示する通知の種別を選択してください
useGlobalSetting: "グローバル設定を使う" useGlobalSetting: "グローバル設定を使う"
useGlobalSettingDesc: "オンにすると、アカウントの通知設定が使用されます。オフにすると、個別に設定できるようになります。" useGlobalSettingDesc: "オンにすると、アカウントの通知設定が使用されます。オフにすると、個別に設定できるようになります。"
other: "その他" other: "その他"
regenerateLoginToken: "ログイントークンを再生成" regenerateLoginToken: "サインイントークンを再生成"
regenerateLoginTokenDescription: "ログインに使用される内部トークンを再生成します。通常この操作を行う必要はありません。再生成すると、全てのデバイスでログアウトされます。" regenerateLoginTokenDescription: "サインインに使用される内部トークンを再生成します。通常この操作を行う必要はありません。再生成すると、全てのデバイスからサインアウトされます。"
setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。" setMultipleBySeparatingWithSpace: "スペースで区切って複数設定できます。"
fileIdOrUrl: "ファイルIDまたはURL" fileIdOrUrl: "ファイルIDまたはURL"
behavior: "動作" behavior: "動作"
@ -904,14 +908,14 @@ thereIsUnresolvedAbuseReportWarning: "未対応の通報があります。"
check: "チェック" check: "チェック"
driveCapOverrideLabel: "このユーザーのドライブ容量上限を変更" driveCapOverrideLabel: "このユーザーのドライブ容量上限を変更"
driveCapOverrideCaption: "0以下を指定すると解除されます。" driveCapOverrideCaption: "0以下を指定すると解除されます。"
requireAdminForView: "閲覧するには管理者アカウントでログインしている必要があります。" requireAdminForView: "閲覧するには管理者アカウントでサインインしている必要があります。"
isSystemAccount: "システムにより自動で作成・管理されているアカウントです。モデレーション・編集・削除を行うとサーバーの動作が不正になる可能性があるため、操作しないでください。" isSystemAccount: "システムにより自動で作成・管理されているアカウントです。モデレーション・編集・削除を行うとサーバーの動作が不正になる可能性があるため、操作しないでください。"
typeToConfirm: "この操作を行うには {x} と入力してください" typeToConfirm: "この操作を行うには {x} と入力してください"
deleteAccount: "アカウント削除" deleteAccount: "アカウント削除"
document: "ドキュメント" document: "ドキュメント"
numberOfPageCache: "ページキャッシュ数" numberOfPageCache: "ページキャッシュ数"
numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。" numberOfPageCacheDescription: "多くすると利便性が向上しますが、負荷とメモリ使用量が増えます。"
logoutConfirm: "ログアウトしますか?" logoutConfirm: "サインアウトしますか?"
lastActiveDate: "最終利用日時" lastActiveDate: "最終利用日時"
statusbar: "ステータスバー" statusbar: "ステータスバー"
pleaseSelect: "選択してください" pleaseSelect: "選択してください"
@ -974,10 +978,6 @@ migrationConfirm: "本当にこのアカウントを {account} に引っ越し
この操作を行う前に引っ越し先のアカウントでエイリアスを作成する必要があります。エイリアスが作成されているか、必ず確認してください。" この操作を行う前に引っ越し先のアカウントでエイリアスを作成する必要があります。エイリアスが作成されているか、必ず確認してください。"
defaultReaction: "リモートとローカルの投稿に対するデフォルトの絵文字リアクション" defaultReaction: "リモートとローカルの投稿に対するデフォルトの絵文字リアクション"
license: "ライセンス" license: "ライセンス"
indexPosts: "投稿をインデックス"
indexFrom: "この投稿ID以降をインデックスする"
indexFromDescription: "空白で全ての投稿を指定します"
indexNotice: "インデックスを開始しました。完了まで時間がかかる場合があるため、少なくとも1時間はサーバーを再起動しないでください。"
customKaTeXMacro: "カスタムKaTeXマクロ" customKaTeXMacro: "カスタムKaTeXマクロ"
customKaTeXMacroDescription: "数式入力を楽にするためのマクロを設定しましょう記法はLaTeXにおけるコマンドの定義と同様に \\newcommand{\\ customKaTeXMacroDescription: "数式入力を楽にするためのマクロを設定しましょう記法はLaTeXにおけるコマンドの定義と同様に \\newcommand{\\
name}{content} または \\newcommand{\\add}[2]{#1 + #2} のように記述します。後者の例では \\add{3}{foo} name}{content} または \\newcommand{\\add}[2]{#1 + #2} のように記述します。後者の例では \\add{3}{foo}
@ -1005,6 +1005,26 @@ pullDownToReload: "下に引っ張って再読み込み"
releaseToReload: "離して再読み込み" releaseToReload: "離して再読み込み"
reloading: "読み込み中" reloading: "読み込み中"
enableTimelineStreaming: "タイムラインを自動で更新する" enableTimelineStreaming: "タイムラインを自動で更新する"
searchWords: "検索語句・照会するIDやURL"
searchWordsDescription: "投稿を検索するには、ここに検索語句を入力してください。空白区切りでAND検索になり、ORを挟むとOR検索になります。\n
例えば「朝 夜」と入力すると「朝」と「夜」が両方含まれた投稿を検索し、「朝 OR 夜」と入力すると「朝」または「夜」(または両方)が含まれた投稿を検索します。\n
「(朝 OR 夜) 眠い」のように、AND検索とOR検索を同時に行うこともできます。\n空白を含む文字列をAND検索ではなくそのまま検索したい場合、\"明日 買うもの\"\
\ のように二重引用符 (\") で囲む必要があります。\n\n特定のユーザーや投稿のページに飛びたい場合には、この欄にID (@user@example.com)
や投稿のURLを入力し「照会」を押してください。「検索」を押すとそのIDやURLが文字通り含まれる投稿を検索します。"
searchUsers: "投稿元(オプション)"
searchUsersDescription: "投稿検索で投稿者を絞りたい場合、@user@example.comローカルユーザーなら @userの形式で投稿者のIDを入力してください。ユーザーIDではなくドメイン名
(example.com) を指定すると、そのサーバーの投稿を検索します。\n\nme とだけ入力すると、自分の投稿を検索します。この検索結果には未収載・フォロワー限定・ダイレクト・秘密を含む全ての投稿が含まれます。\n
\nlocal とだけ入力すると、ローカルサーバーの投稿を検索します。"
searchRange: "投稿期間(オプション)"
searchRangeDescription: "投稿検索で投稿期間を絞りたい場合、20220615-20231031 のような形式で投稿期間を入力してください。今年の日付を指定する場合には年の指定を省略できます0105-0106
や 20231105-0110 のように)。\n\n開始日と終了日のどちらか一方は省略可能です。例えば -0102 とすると今年1月2日までの投稿のみを、20231026-
とすると2023年10月26日以降の投稿のみを検索します。"
searchPostsWithFiles: "添付ファイルのある投稿のみ"
searchCwAndAlt: "閲覧注意の注釈と添付ファイルの代替テキストも検索する"
publishTimelines: "非ログインユーザーにもタイムラインを公開する"
publishTimelinesDescription: "有効にすると、{url} でローカルタイムラインとグローバルタイムラインが公開されます。"
noAltTextWarning: "説明が書かれていない添付ファイルがあります。書き忘れてはいませんか?"
showNoAltTextWarning: "説明が書かれていない添付ファイルを投稿しようとした場合に警告する"
_sensitiveMediaDetection: _sensitiveMediaDetection:
description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。" description: "機械学習を使って自動でセンシティブなメディアを検出し、モデレーションに役立てられます。サーバーの負荷が少し増えます。"
@ -1216,7 +1236,8 @@ _menuDisplay:
hide: "隠す" hide: "隠す"
_wordMute: _wordMute:
muteWords: "ミュートするワード" muteWords: "ミュートするワード"
muteLangs: "ミュートされた言語" mutePatterns: "ミュートするパターン"
muteLangs: "ミュートする言語"
muteWordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります。" muteWordsDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります。"
muteWordsDescription2: "キーワードをスラッシュで囲むと正規表現になります。" muteWordsDescription2: "キーワードをスラッシュで囲むと正規表現になります。"
muteLangsDescription: "OR 条件の場合はスペースまたは改行で区切ります。" muteLangsDescription: "OR 条件の場合はスペースまたは改行で区切ります。"
@ -1453,10 +1474,7 @@ _widgets:
userList: "ユーザーリスト" userList: "ユーザーリスト"
_userList: _userList:
chooseList: "リストを選択" chooseList: "リストを選択"
meiliStatus: サーバーステータス
serverInfo: サーバー情報 serverInfo: サーバー情報
meiliSize: インデックスサイズ
meiliIndexCount: インデックス済みの投稿
_cw: _cw:
hide: "隠す" hide: "隠す"
show: "もっと見る" show: "もっと見る"
@ -1930,9 +1948,7 @@ sendModMail: モデレーション通知を送る
deleted: 削除済み deleted: 削除済み
editNote: 投稿を編集 editNote: 投稿を編集
edited: '編集済み: {date} {time}' edited: '編集済み: {date} {time}'
signupsDisabled: signupsDisabled: 現在、このサーバーでは新規登録が一般開放されていません。招待コードをお持ちの場合には、以下の欄に入力してください。
現在、このサーバーでは新規登録が一般開放されていません。招待コードをお持ちの場合には、以下の欄に入力してください。招待コードをお持ちでない場合にも、新規登録を開放している他のサーバーには入れますよ!
findOtherInstance: 他のサーバーを探す
newer: 新しい投稿 newer: 新しい投稿
older: 古い投稿 older: 古い投稿
accessibility: アクセシビリティ accessibility: アクセシビリティ
@ -2022,7 +2038,9 @@ searchEngine: "検索のMFMで使用する検索エンジン"
postSearch: "このサーバーの投稿検索" postSearch: "このサーバーの投稿検索"
showBigPostButton: "投稿ボタンを巨大にする" showBigPostButton: "投稿ボタンを巨大にする"
emojiModPerm: "カスタム絵文字の管理権" emojiModPerm: "カスタム絵文字の管理権"
emojiModPermDescription: "追加: カスタム絵文字の新規追加と新規追加されたカスタム絵文字(正確には、タグとカテゴリとライセンスが設定されていないカスタム絵文字)へのタグとカテゴリとライセンスの設定を許可します。\n追加と変更:「追加」の権限に加え、既存の絵文字の名前・カテゴリ・タグ・ライセンスの変更を許可します。\n全て許可:「追加と変更」の権限に加え、既存のカスタム絵文字の削除を許可します。\nこの設定にかかわらず、サーバーの管理者およびモデレーターには「全て許可」の権限が与えられます。" emojiModPermDescription: "追加: カスタム絵文字の新規追加と新規追加されたカスタム絵文字(正確には、タグとカテゴリとライセンスが設定されていないカスタム絵文字)へのタグとカテゴリとライセンスの設定を許可します。\n\
追加と変更:「追加」の権限に加え、既存の絵文字の名前・カテゴリ・タグ・ライセンスの変更を許可します。\n全て許可:「追加と変更」の権限に加え、既存のカスタム絵文字の削除を許可します。\n\
この設定にかかわらず、サーバーの管理者およびモデレーターには「全て許可」の権限が与えられます。"
_emojiModPerm: _emojiModPerm:
unauthorized: "無し" unauthorized: "無し"
add: "追加" add: "追加"
@ -2032,3 +2050,9 @@ private: "秘密"
privateDescription: "あなた以外には非公開" privateDescription: "あなた以外には非公開"
makePrivate: "秘密にする" makePrivate: "秘密にする"
makePrivateConfirm: "リモートサーバーに削除リクエストを送信し、投稿の公開範囲を「秘密」にして他の人から見られないようにします。実行しますか?" makePrivateConfirm: "リモートサーバーに削除リクエストを送信し、投稿の公開範囲を「秘密」にして他の人から見られないようにします。実行しますか?"
sentFollowRequests: 未承認のフォローリクエスト
noSentFollowRequests: 未承認のフォローリクエストはありません
messagingUnencryptedInfo: FirefishのチャットはE2E暗号化されていません。漏洩してはいけない情報はFirefishで送らないでください。
moderationNote: モデレーション用のメモ
ipFirstAcknowledged: IPアドレスが最初に取得された日
driveCapacityOverride: ドライブ容量の変更

View file

@ -1331,10 +1331,7 @@ _widgets:
serverInfo: 서버 정보 serverInfo: 서버 정보
_userList: _userList:
chooseList: 리스트 선택 chooseList: 리스트 선택
meiliStatus: 서버 정보
userList: 유저 목록 userList: 유저 목록
meiliSize: 인덱스 크기
meiliIndexCount: 인덱싱 완료된 게시물
rssTicker: RSS Ticker rssTicker: RSS Ticker
_cw: _cw:
hide: "숨기기" hide: "숨기기"
@ -1827,7 +1824,6 @@ pushNotificationNotSupported: 브라우저 및 서버가 푸시 알림을 지원
enableRecommendedTimeline: 추천 타임라인을 활성화 enableRecommendedTimeline: 추천 타임라인을 활성화
pushNotificationAlreadySubscribed: 푸시 알림이 활성화되었습니다 pushNotificationAlreadySubscribed: 푸시 알림이 활성화되었습니다
caption: 자동으로 설명 붙이기 caption: 자동으로 설명 붙이기
findOtherInstance: 다른 서버 둘러보기
enableIdenticonGeneration: 유저 별 Identicon의 생성을 활성화 enableIdenticonGeneration: 유저 별 Identicon의 생성을 활성화
secureModeInfo: 인증 정보가 없는 리모트 서버로부터의 요청에 응답하지 않습니다. secureModeInfo: 인증 정보가 없는 리모트 서버로부터의 요청에 응답하지 않습니다.
allowedInstances: 허가된 서버 allowedInstances: 허가된 서버
@ -1840,7 +1836,6 @@ customSplashIconsDescription: 유저가 페이지를 로딩/새로고침할 때
이미지는 되도록 정적 URL으로 구성하고, 192x192 해상도로 조정하여 주십시오. 이미지는 되도록 정적 URL으로 구성하고, 192x192 해상도로 조정하여 주십시오.
moveFromDescription: '이전 계정에 대한 별칭을 작성하여, 이 계정으로 옮길 수 있도록 합니다. 반드시 계정을 이전하기 전에 수행해야 moveFromDescription: '이전 계정에 대한 별칭을 작성하여, 이 계정으로 옮길 수 있도록 합니다. 반드시 계정을 이전하기 전에 수행해야
합니다. 이전 계정을 다음과 같은 형식으로 입력하여 주십시오: @person@server.com' 합니다. 이전 계정을 다음과 같은 형식으로 입력하여 주십시오: @person@server.com'
indexFromDescription: 빈 칸으로 두면 모든 게시물을 인덱싱합니다
customKaTeXMacroDescription: 'KaTeX 매크로를 지정하여 수식을 더욱 편리하게 입력하세요! LaTeX의 커맨드 정의와 동일하게 customKaTeXMacroDescription: 'KaTeX 매크로를 지정하여 수식을 더욱 편리하게 입력하세요! LaTeX의 커맨드 정의와 동일하게
\newcommand{\ 이름}{내용} 또는 \newcommand{\이름}[인수 갯수]{내용} 와 같이 입력하십시오. 예를 들어 \newcommand{\add}[2]{#1 \newcommand{\ 이름}{내용} 또는 \newcommand{\이름}[인수 갯수]{내용} 와 같이 입력하십시오. 예를 들어 \newcommand{\add}[2]{#1
+ #2} 와 같이 정의한 경우 \add{3}{foo} 를 입력하면 3 + foo 으로 치환됩니다.매크로의 이름을 감싸는 중괄호를 소괄호() 또는 + #2} 와 같이 정의한 경우 \add{3}{foo} 를 입력하면 3 + foo 으로 치환됩니다.매크로의 이름을 감싸는 중괄호를 소괄호() 또는
@ -1895,7 +1890,6 @@ accessibility: 접근성
userSaysSomethingReasonReply: '{name} 님이 {reason} 을 포함하는 게시물에 답글했습니다' userSaysSomethingReasonReply: '{name} 님이 {reason} 을 포함하는 게시물에 답글했습니다'
userSaysSomethingReasonRenote: '{name} 님이 {reason} 을 포함하는 게시물을 부스트했습니다' userSaysSomethingReasonRenote: '{name} 님이 {reason} 을 포함하는 게시물을 부스트했습니다'
breakFollowConfirm: 팔로워를 해제하시겠습니까? breakFollowConfirm: 팔로워를 해제하시겠습니까?
indexFrom: 이 게시물 ID부터 인덱싱하기
noThankYou: 괜찮습니다 noThankYou: 괜찮습니다
hiddenTags: 숨길 해시태그 hiddenTags: 숨길 해시태그
image: 이미지 image: 이미지
@ -1927,8 +1921,6 @@ removeMember: 멤버를 삭제
license: 라이선스 license: 라이선스
migrationConfirm: "정말로 이 계정을 {account}로 이사하시겠습니까? 한 번 이사하면, 현재 이 계정은 두 번 다시 사용할 수 migrationConfirm: "정말로 이 계정을 {account}로 이사하시겠습니까? 한 번 이사하면, 현재 이 계정은 두 번 다시 사용할 수
없게 됩니다.\n또한, 이사 갈 계정에 현재 사용 중인 계정의 별칭을 올바르게 작성하였는지 다시 한 번 확인하십시오." 없게 됩니다.\n또한, 이사 갈 계정에 현재 사용 중인 계정의 별칭을 올바르게 작성하였는지 다시 한 번 확인하십시오."
indexPosts: 게시물을 인덱싱
indexNotice: 인덱싱을 시작했습니다. 이 작업은 시간이 많이 소요되므로, 최소 1시간 이내에 서버를 재시작하지 마십시오.
noteId: 게시물 ID noteId: 게시물 ID
signupsDisabled: 현재 이 서버에서는 신규 등록을 받고 있지 않습니다. 초대 코드를 가지고 계신 경우 아래 칸에 입력해 주십시오. 초대 signupsDisabled: 현재 이 서버에서는 신규 등록을 받고 있지 않습니다. 초대 코드를 가지고 계신 경우 아래 칸에 입력해 주십시오. 초대
코드를 가지고 있지 않더라도, 신규 등록이 열려 있는 다른 서버에 등록하실 수 있습니다! 코드를 가지고 있지 않더라도, 신규 등록이 열려 있는 다른 서버에 등록하실 수 있습니다!
@ -2011,3 +2003,8 @@ detectPostLanguage: 외국어로 인식된 게시물에 번역 버튼을 표시
indexableDescription: Firefish 검색에서 나의 공개 게시물에 대한 검색을 허용합니다 indexableDescription: Firefish 검색에서 나의 공개 게시물에 대한 검색을 허용합니다
indexable: 인덱스 허용 indexable: 인덱스 허용
languageForTranslation: 게시물 번역에 사용할 언어 languageForTranslation: 게시물 번역에 사용할 언어
replies: 답글
renotes: 부스트
quotes: 인용
sentFollowRequests: 팔로우 요청 보냄
reactions: 리액션

View file

@ -939,7 +939,6 @@ allowedInstancesDescription: Tjenernavn for tjenere som skal hvitelistes. En per
(Vil bare bli brukt i privat modus). (Vil bare bli brukt i privat modus).
previewNoteText: Forhåndsvisning previewNoteText: Forhåndsvisning
recentNDays: Siste {n} dager recentNDays: Siste {n} dager
indexPosts: Indekser poster
objectStorageUseProxy: Koble til gjennom en mellomtjener objectStorageUseProxy: Koble til gjennom en mellomtjener
objectStorageUseProxyDesc: Skru av dette dersom du ikke vil bruke mellomtjenere for objectStorageUseProxyDesc: Skru av dette dersom du ikke vil bruke mellomtjenere for
API-oppkoblinger API-oppkoblinger
@ -1185,10 +1184,6 @@ moveFromDescription: Dette vil sette opp et alias for din gamle kontoen slik at
kan flytte fra den gamle kontoen til denne. Gjør dette FØR du flytter fra den gamle kan flytte fra den gamle kontoen til denne. Gjør dette FØR du flytter fra den gamle
kontoen. Skriv inn den gamle kontoen på formen @person@server.com kontoen. Skriv inn den gamle kontoen på formen @person@server.com
defaultReaction: Standard emoji-reaksjon for utgående og innkommende poster defaultReaction: Standard emoji-reaksjon for utgående og innkommende poster
indexFrom: Indekser poster fra post-id og fremover
indexNotice: Indekserer. Dette vil sannsynligvis ta litt tid, ikke restart tjeneren
før det har gått minst en time.
indexFromDescription: La stå tom for å indeksere alle poster
customKaTeXMacroDescription: 'Sett opp makroer for å skrive matematiske uttrykk enkelt. customKaTeXMacroDescription: 'Sett opp makroer for å skrive matematiske uttrykk enkelt.
Notasjonen følger LaTeX-kommandoer og er skrevet som \newcommand{\ navn}{uttrykk} Notasjonen følger LaTeX-kommandoer og er skrevet som \newcommand{\ navn}{uttrykk}
eller \newcommand{\navn}{antall argumenter}{uttrykk}. For eksempel vil \newcommand{\add}{2}{#1 eller \newcommand{\navn}{antall argumenter}{uttrykk}. For eksempel vil \newcommand{\add}{2}{#1
@ -1201,7 +1196,6 @@ customKaTeXMacroDescription: 'Sett opp makroer for å skrive matematiske uttrykk
signupsDisabled: Registreringer av nye konti på denne tjeneren er slått av, men du signupsDisabled: Registreringer av nye konti på denne tjeneren er slått av, men du
kan alltids registrere deg på en annen tjener! Hvis du har en invitasjonskode for kan alltids registrere deg på en annen tjener! Hvis du har en invitasjonskode for
denne tjeneren, skriv den inn under. denne tjeneren, skriv den inn under.
findOtherInstance: Finn en annen tjener
preventAiLearningDescription: Ber tredjeparts AI-språkmodeller om å ikke bruke innhold preventAiLearningDescription: Ber tredjeparts AI-språkmodeller om å ikke bruke innhold
du laster opp, sliks om poster og bilder. du laster opp, sliks om poster og bilder.
enableCustomKaTeXMacro: Slå på egne KaTeX-makroer enableCustomKaTeXMacro: Slå på egne KaTeX-makroer
@ -1628,14 +1622,12 @@ _antennaSources:
instances: Poster fra alle brukerne på denne tjeneren instances: Poster fra alle brukerne på denne tjeneren
_widgets: _widgets:
timeline: Tidslinje timeline: Tidslinje
meiliSize: Indeks-størrelse
instanceCloud: Tjenersky instanceCloud: Tjenersky
onlineUsers: Påloggede brukere onlineUsers: Påloggede brukere
clock: Klokke clock: Klokke
userList: Brukerliste userList: Brukerliste
rss: RSS-leser rss: RSS-leser
serverMetric: Tjenermetrikker serverMetric: Tjenermetrikker
meiliIndexCount: Indekserte poster
button: Knapp button: Knapp
unixClock: Unix-klokke unixClock: Unix-klokke
calendar: Kalender calendar: Kalender
@ -1647,7 +1639,6 @@ _widgets:
photos: Bilder photos: Bilder
rssTicker: RSS-rulletekst rssTicker: RSS-rulletekst
aiscript: AiScript-konsoll aiscript: AiScript-konsoll
meiliStatus: Tjenerstatus
memo: Notatlapp memo: Notatlapp
notifications: Varsler notifications: Varsler
postForm: Ny post postForm: Ny post

View file

@ -1892,11 +1892,6 @@ sendPushNotificationReadMessageCaption: Powiadomienie zawierające tekst "{empty
baterii Twojego urządzenia. baterii Twojego urządzenia.
defaultReaction: Domyślna reakcja emoji dla wychodzących i przychodzących wpisów defaultReaction: Domyślna reakcja emoji dla wychodzących i przychodzących wpisów
license: Licencja license: Licencja
indexPosts: Indeksuj wpisy
indexFrom: Indeksuj wpisy od ID
indexFromDescription: Zostaw puste dla indeksowania wszystkich wpisów
indexNotice: Indeksuję. Zapewne zajmie to chwilę, nie restartuj serwera przez co najmniej
godzinę.
customKaTeXMacro: Niestandardowe makra KaTeX customKaTeXMacro: Niestandardowe makra KaTeX
enableCustomKaTeXMacro: Włącz niestandardowe makra KaTeX enableCustomKaTeXMacro: Włącz niestandardowe makra KaTeX
noteId: ID wpisu noteId: ID wpisu
@ -1997,7 +1992,6 @@ deleted: Usunięte
editNote: Edytuj wpis editNote: Edytuj wpis
edited: 'Edytowano o {date} {time}' edited: 'Edytowano o {date} {time}'
silenced: Wyciszony silenced: Wyciszony
findOtherInstance: Znajdź inny serwer
userSaysSomethingReasonReply: '{name} odpowiedział na wpis zawierający {reason}' userSaysSomethingReasonReply: '{name} odpowiedział na wpis zawierający {reason}'
userSaysSomethingReasonRenote: '{name} podbił post zawierający {reason}' userSaysSomethingReasonRenote: '{name} podbił post zawierający {reason}'
signupsDisabled: Rejestracja na tym serwerze jest obecnie zamknięta, ale zawsze możesz signupsDisabled: Rejestracja na tym serwerze jest obecnie zamknięta, ale zawsze możesz

View file

@ -1,7 +1,9 @@
---
_lang_: "Română" _lang_: "Română"
headlineFirefish: "O rețea conectată prin note" 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ă! 🚀" 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}" monthAndDay: "{day}/{month}"
search: "Caută" search: "Caută"
notifications: "Notificări" notifications: "Notificări"
@ -44,7 +46,8 @@ copyContent: "Copiază conținutul"
copyLink: "Copiază link-ul" copyLink: "Copiază link-ul"
delete: "Şterge" delete: "Şterge"
deleteAndEdit: "Șterge și editează" deleteAndEdit: "Șterge și editează"
deleteAndEditConfirm: "Ești sigur că vrei să ștergi această notă și să o editezi? Vei pierde reacțiile, re-notele și răspunsurile acesteia." deleteAndEditConfirm: "Ești sigur că vrei să ștergi această notă și să o editezi?
Vei pierde reacțiile, re-notele și răspunsurile acesteia."
addToList: "Adaugă în listă" addToList: "Adaugă în listă"
sendMessage: "Trimite un mesaj" sendMessage: "Trimite un mesaj"
copyUsername: "Copiază numele de utilizator" copyUsername: "Copiază numele de utilizator"
@ -64,9 +67,11 @@ import: "Importă"
export: "Exportă" export: "Exportă"
files: "Fișiere" files: "Fișiere"
download: "Descarcă" download: "Descarcă"
driveFileDeleteConfirm: "Ești sigur ca vrei să ștergi fișierul \"{name}\"? Notele atașate fișierului vor fi șterse și ele." driveFileDeleteConfirm: "Ești sigur ca vrei să ștergi fișierul \"{name}\"? Notele
atașate fișierului vor fi șterse și ele."
unfollowConfirm: "Ești sigur ca vrei să nu mai urmărești pe {name}?" unfollowConfirm: "Ești sigur ca vrei să nu mai urmărești pe {name}?"
exportRequested: "Ai cerut un export. S-ar putea să ia un pic. Va fi adăugat in Drive-ul tău odată completat." exportRequested: "Ai cerut un export. S-ar putea să ia un pic. Va fi adăugat in Drive-ul
tău odată completat."
importRequested: "Ai cerut un import. S-ar putea să ia un pic." importRequested: "Ai cerut un import. S-ar putea să ia un pic."
lists: "Liste" lists: "Liste"
noLists: "Nu ai nici o listă" noLists: "Nu ai nici o listă"
@ -81,9 +86,12 @@ error: "Eroare"
somethingHappened: "A survenit o eroare" somethingHappened: "A survenit o eroare"
retry: "Reîncearcă" retry: "Reîncearcă"
pageLoadError: "A apărut o eroare la încărcarea paginii." 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." pageLoadErrorDescription: "De obicei asta este cauzat de o eroare de rețea sau cache-ul
serverIsDead: "Serverul nu răspunde. Te rugăm să aștepți o perioadă și să încerci din nou." browser-ului. Încearcă să cureți cache-ul și apoi să încerci din nou puțin mai târziu."
youShouldUpgradeClient: "Pentru a vedea această pagină, te rugăm să îți actualizezi clientul." 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ă" enterListName: "Introdu un nume pentru listă"
privacy: "Confidenţialitate" privacy: "Confidenţialitate"
makeFollowManuallyApprove: "Fă cererile de urmărire să necesite aprobare" makeFollowManuallyApprove: "Fă cererile de urmărire să necesite aprobare"
@ -137,14 +145,21 @@ emojiUrl: "URL-ul emoji-ului"
addEmoji: "Adaugă un emoji" addEmoji: "Adaugă un emoji"
settingGuide: "Setări recomandate" settingGuide: "Setări recomandate"
cacheRemoteFiles: "Ține fișierele externe in cache" cacheRemoteFiles: "Ține fișierele externe in cache"
cacheRemoteFilesDescription: "Când această setare este dezactivată, fișierele externe sunt încărcate direct din instanța externă. Dezactivarea va scădea utilizarea spațiului de stocare, dar va crește traficul, deoarece thumbnail-urile nu vor fi generate." cacheRemoteFilesDescription: "Când această setare este dezactivată, fișierele externe
sunt încărcate direct din instanța externă. Dezactivarea va scădea utilizarea spațiului
de stocare, dar va crește traficul, deoarece thumbnail-urile nu vor fi generate."
flagAsBot: "Marchează acest cont ca bot" 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." 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ă" flagAsCat: "Marchează acest cont ca pisică"
flagAsCatDescription: "Activează această opțiune dacă acest cont este o pisică." flagAsCatDescription: "Activează această opțiune dacă acest cont este o pisică."
flagShowTimelineReplies: "Arată răspunsurile în cronologie" 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." flagShowTimelineRepliesDescription: "Dacă e activată vor fi arătate în cronologie
autoAcceptFollowed: "Aprobă automat cererile de urmărire de la utilizatorii pe care îi urmărești" 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" addAccount: "Adaugă un cont"
loginFailed: "Autentificare eșuată" loginFailed: "Autentificare eșuată"
showOnRemote: "Vezi mai multe pe instanța externă" showOnRemote: "Vezi mai multe pe instanța externă"
@ -156,7 +171,11 @@ searchWith: "Caută: {q}"
youHaveNoLists: "Nu ai nici o listă" youHaveNoLists: "Nu ai nici o listă"
followConfirm: "Ești sigur ca vrei să urmărești pe {name}?" followConfirm: "Ești sigur ca vrei să urmărești pe {name}?"
proxyAccount: "Cont proxy" proxyAccount: "Cont proxy"
proxyAccountDescription: "Un cont proxy este un cont care se comportă ca un urmăritor extern pentru utilizatorii puși sub anumite condiții. De exemplu, când un cineva adaugă un utilizator extern intr-o listă, activitatea utilizatorului extern nu va fi adusă în instanță daca nici un utilizator local nu urmărește acel utilizator, așa că în schimb contul proxy îl va urmări." proxyAccountDescription: "Un cont proxy este un cont care se comportă ca un urmăritor
extern pentru utilizatorii puși sub anumite condiții. De exemplu, când un cineva
adaugă un utilizator extern intr-o listă, activitatea utilizatorului extern nu va
fi adusă în instanță daca nici un utilizator local nu urmărește acel utilizator,
așa că în schimb contul proxy îl va urmări."
host: "Gazdă" host: "Gazdă"
selectUser: "Selectează un utilizator" selectUser: "Selectează un utilizator"
recipient: "Destinatar" recipient: "Destinatar"
@ -186,11 +205,14 @@ instanceInfo: "Informații despre instanță"
statistics: "Statistici" statistics: "Statistici"
clearQueue: "Șterge coada" clearQueue: "Șterge coada"
clearQueueConfirmTitle: "Ești sigur că vrei să cureți coada?" clearQueueConfirmTitle: "Ești sigur că vrei să cureți coada?"
clearQueueConfirmText: "Orice notă rămasă în coadă nu va fi federată. De obicei această operație nu este necesară." clearQueueConfirmText: "Orice notă rămasă în coadă nu va fi federată. De obicei această
operație nu este necesară."
clearCachedFiles: "Golește cache-ul" clearCachedFiles: "Golește cache-ul"
clearCachedFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele externe din cache?" clearCachedFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele externe din
cache?"
blockedInstances: "Instanțe blocate" blockedInstances: "Instanțe blocate"
blockedInstancesDescription: "Scrie hostname-urile instanțelor pe care dorești să le blochezi. Instanțele listate nu vor mai putea să comunice cu această instanță." blockedInstancesDescription: "Scrie hostname-urile instanțelor pe care dorești să
le blochezi. Instanțele listate nu vor mai putea să comunice cu această instanță."
muteAndBlock: "Amuțiri și Blocări" muteAndBlock: "Amuțiri și Blocări"
mutedUsers: "Utilizatori amuțiți" mutedUsers: "Utilizatori amuțiți"
blockedUsers: "Utilizatori blocați" blockedUsers: "Utilizatori blocați"
@ -238,7 +260,8 @@ saved: "Salvat"
messaging: "Chat" messaging: "Chat"
upload: "Încarcă" upload: "Încarcă"
keepOriginalUploading: "Păstrează imaginea originală" keepOriginalUploading: "Păstrează imaginea originală"
keepOriginalUploadingDescription: "Salvează imaginea originala încărcată fără modificări. Dacă e oprită, o versiune pentru afișarea pe web va fi generată la încărcare." keepOriginalUploadingDescription: "Salvează imaginea originala încărcată fără modificări.
Dacă e oprită, o versiune pentru afișarea pe web va fi generată la încărcare."
fromDrive: "Din Drive" fromDrive: "Din Drive"
fromUrl: "Din URL" fromUrl: "Din URL"
uploadFromUrl: "Încarcă dintr-un URL" uploadFromUrl: "Încarcă dintr-un URL"
@ -254,7 +277,8 @@ agreeTo: "Sunt de acord cu {0}"
tos: "Termenii de utilizare" tos: "Termenii de utilizare"
start: "Să începem" start: "Să începem"
home: "Acasă" home: "Acasă"
remoteUserCaution: "Deoarece acest utilizator este dintr-o instanță externă, informația afișată poate fi incompletă." remoteUserCaution: "Deoarece acest utilizator este dintr-o instanță externă, informația
afișată poate fi incompletă."
activity: "Activitate" activity: "Activitate"
images: "Imagini" images: "Imagini"
birthday: "Zi de naștere" birthday: "Zi de naștere"
@ -287,7 +311,8 @@ unableToDelete: "Nu se poate șterge"
inputNewFileName: "Introdu un nou nume de fișier" inputNewFileName: "Introdu un nou nume de fișier"
inputNewDescription: "Introdu o descriere nouă" inputNewDescription: "Introdu o descriere nouă"
inputNewFolderName: "Introdu un nume de folder nou" inputNewFolderName: "Introdu un nume de folder nou"
circularReferenceFolder: "Destinația folderului este un subfolder al folderului pe care dorești să îl muți." circularReferenceFolder: "Destinația folderului este un subfolder al folderului pe
care dorești să îl muți."
hasChildFilesOrFolders: "Acest folder nu este gol, așa că nu poate fi șters." hasChildFilesOrFolders: "Acest folder nu este gol, așa că nu poate fi șters."
copyUrl: "Copiază URL" copyUrl: "Copiază URL"
rename: "Redenumește" rename: "Redenumește"
@ -318,7 +343,8 @@ yearX: "{year}"
pages: "Pagini" pages: "Pagini"
enableLocalTimeline: "Activează cronologia locală" enableLocalTimeline: "Activează cronologia locală"
enableGlobalTimeline: "Activeaza cronologia globală" enableGlobalTimeline: "Activeaza cronologia globală"
disablingTimelinesInfo: "Administratorii și Moderatorii vor avea mereu access la toate cronologiile, chiar dacă nu sunt activate." disablingTimelinesInfo: "Administratorii și Moderatorii vor avea mereu access la toate
cronologiile, chiar dacă nu sunt activate."
registration: "Inregistrare" registration: "Inregistrare"
enableRegistration: "Activează înregistrările pentru utilizatori noi" enableRegistration: "Activează înregistrările pentru utilizatori noi"
invite: "Invită" invite: "Invită"
@ -330,9 +356,11 @@ bannerUrl: "URL-ul imaginii de banner"
backgroundImageUrl: "URL-ul imaginii de fundal" backgroundImageUrl: "URL-ul imaginii de fundal"
basicInfo: "Informații de bază" basicInfo: "Informații de bază"
pinnedUsers: "Utilizatori fixați" pinnedUsers: "Utilizatori fixați"
pinnedUsersDescription: "Scrie utilizatorii, separați prin pauză de rând, care vor fi fixați pe pagina \"Explorează\"." pinnedUsersDescription: "Scrie utilizatorii, separați prin pauză de rând, care vor
fi fixați pe pagina \"Explorează\"."
pinnedPages: "Pagini fixate" 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." 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" pinnedClipId: "ID-ul clip-ului pe care să îl fixezi"
pinnedNotes: "Notă fixată" pinnedNotes: "Notă fixată"
hcaptcha: "hCaptcha" hcaptcha: "hCaptcha"
@ -343,14 +371,17 @@ recaptcha: "reCAPTCHA"
enableRecaptcha: "Activează reCAPTCHA" enableRecaptcha: "Activează reCAPTCHA"
recaptchaSiteKey: "Site key" recaptchaSiteKey: "Site key"
recaptchaSecretKey: "Secret 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." 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" antennas: "Antene"
manageAntennas: "Gestionează Antenele" manageAntennas: "Gestionează Antenele"
name: "Nume" name: "Nume"
antennaSource: "Sursa antenei" antennaSource: "Sursa antenei"
antennaKeywords: "Cuvinte cheie ascultate" antennaKeywords: "Cuvinte cheie ascultate"
antennaExcludeKeywords: "Cuvinte cheie excluse" antennaExcludeKeywords: "Cuvinte cheie excluse"
antennaKeywordsDescription: "Separă cu spații pentru o condiție ȘI sau cu o întrerupere de rând pentru o condiție SAU." antennaKeywordsDescription: "Separă cu spații pentru o condiție ȘI sau cu o întrerupere
de rând pentru o condiție SAU."
notifyAntenna: "Notifică-mă pentru note noi" notifyAntenna: "Notifică-mă pentru note noi"
withFileAntenna: "Doar note cu fișiere" withFileAntenna: "Doar note cu fișiere"
enableServiceworker: "Activează ServiceWorker" enableServiceworker: "Activează ServiceWorker"
@ -437,7 +468,8 @@ strongPassword: "Parolă puternică"
passwordMatched: "Se potrivește!" passwordMatched: "Se potrivește!"
passwordNotMatched: "Nu se potrivește" passwordNotMatched: "Nu se potrivește"
signinWith: "Autentifică-te cu {x}" signinWith: "Autentifică-te cu {x}"
signinFailed: "Nu se poate autentifica. Numele de utilizator sau parola introduse sunt incorecte." signinFailed: "Nu se poate autentifica. Numele de utilizator sau parola introduse
sunt incorecte."
tapSecurityKey: "Apasă pe cheia ta de securitate." tapSecurityKey: "Apasă pe cheia ta de securitate."
or: "Sau" or: "Sau"
language: "Limbă" language: "Limbă"
@ -478,19 +510,26 @@ showFeaturedNotesInTimeline: "Arată notele recomandate în cronologii"
objectStorage: "Object Storage" objectStorage: "Object Storage"
useObjectStorage: "Folosește Object Storage" useObjectStorage: "Folosește Object Storage"
objectStorageBaseUrl: "URL de bază" objectStorageBaseUrl: "URL de bază"
objectStorageBaseUrlDesc: "URL-ul este folosit pentru referință. Specifică URL-ul CDN-ului sau Proxy-ului tău dacă folosești unul. Pentru S3 folosește 'https://<bucket>.s3.amazonaws.com' și pentru GCS sau servicii echivalente folosește 'https://storage.googleapis.com/<bucket>', etc." objectStorageBaseUrlDesc: "URL-ul este folosit pentru referință. Specifică URL-ul
CDN-ului sau Proxy-ului tău dacă folosești unul. Pentru S3 folosește 'https://<bucket>.s3.amazonaws.com'
și pentru GCS sau servicii echivalente folosește 'https://storage.googleapis.com/<bucket>',
etc."
objectStorageBucket: "Bucket" objectStorageBucket: "Bucket"
objectStorageBucketDesc: "Te rog specifică numele bucket-ului furnizorului tău." objectStorageBucketDesc: "Te rog specifică numele bucket-ului furnizorului tău."
objectStoragePrefix: "Prefix" objectStoragePrefix: "Prefix"
objectStoragePrefixDesc: "Fișierele vor fi stocate sub directoare cu acest prefix." objectStoragePrefixDesc: "Fișierele vor fi stocate sub directoare cu acest prefix."
objectStorageEndpoint: "Endpoint" objectStorageEndpoint: "Endpoint"
objectStorageEndpointDesc: "Lasă acest câmp gol dacă folosești AWS S3, dacă nu specifică endpoint-ul ca '<host>' sau '<host>:<port>', depinzând de ce serviciu folosești." objectStorageEndpointDesc: "Lasă acest câmp gol dacă folosești AWS S3, dacă nu specifică
endpoint-ul ca '<host>' sau '<host>:<port>', depinzând de ce serviciu folosești."
objectStorageRegion: "Regiune" objectStorageRegion: "Regiune"
objectStorageRegionDesc: "Specifică o regiune precum 'xx-east-1'. Dacă serviciul tău nu face distincția între regiuni lasă acest câmp gol sau introdu 'us-east-1'." objectStorageRegionDesc: "Specifică o regiune precum 'xx-east-1'. Dacă serviciul tău
nu face distincția între regiuni lasă acest câmp gol sau introdu 'us-east-1'."
objectStorageUseSSL: "Folosește SSl" objectStorageUseSSL: "Folosește SSl"
objectStorageUseSSLDesc: "Oprește această opțiune dacă nu vei folosi HTTPS pentru conexiunile API-ului" objectStorageUseSSLDesc: "Oprește această opțiune dacă nu vei folosi HTTPS pentru
conexiunile API-ului"
objectStorageUseProxy: "Conectează-te prin Proxy" objectStorageUseProxy: "Conectează-te prin Proxy"
objectStorageUseProxyDesc: "Oprește această opțiune dacă vei nu folosi un Proxy pentru conexiunile API-ului" objectStorageUseProxyDesc: "Oprește această opțiune dacă vei nu folosi un Proxy pentru
conexiunile API-ului"
objectStorageSetPublicRead: "Setează \"public-read\" pentru încărcare" objectStorageSetPublicRead: "Setează \"public-read\" pentru încărcare"
serverLogs: "Loguri server" serverLogs: "Loguri server"
deleteAll: "Șterge tot" deleteAll: "Șterge tot"
@ -518,7 +557,9 @@ sort: "Sortează"
ascendingOrder: "Crescător" ascendingOrder: "Crescător"
descendingOrder: "Descrescător" descendingOrder: "Descrescător"
scratchpad: "Scratchpad" 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." 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" output: "Ieșire"
script: "Script" script: "Script"
disablePagesScript: "Dezactivează AiScript în Pagini" disablePagesScript: "Dezactivează AiScript în Pagini"
@ -526,11 +567,14 @@ updateRemoteUser: "Actualizează informațiile utilizatorului extern"
deleteAllFiles: "Șterge toate fișierele" deleteAllFiles: "Șterge toate fișierele"
deleteAllFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele?" deleteAllFilesConfirm: "Ești sigur că vrei să ștergi toate fișierele?"
removeAllFollowing: "Dezurmărește toți utilizatorii urmăriți" removeAllFollowing: "Dezurmărește toți utilizatorii urmăriți"
removeAllFollowingDescription: "Asta va dez-urmări toate conturile din {host}. Te rog execută asta numai dacă instanța, de ex., nu mai există." removeAllFollowingDescription: "Asta va dez-urmări toate conturile din {host}. Te
rog execută asta numai dacă instanța, de ex., nu mai există."
userSuspended: "Acest utilizator a fost suspendat." userSuspended: "Acest utilizator a fost suspendat."
userSilenced: "Acest utilizator a fost setat silențios." userSilenced: "Acest utilizator a fost setat silențios."
yourAccountSuspendedTitle: "Acest cont a fost suspendat" yourAccountSuspendedTitle: "Acest cont a fost suspendat"
yourAccountSuspendedDescription: "Acest cont a fost suspendat din cauza încălcării termenilor de serviciu al serverului sau ceva similar. Contactează administratorul dacă ai dori să afli un motiv mai detaliat. Te rog nu crea un cont nou." yourAccountSuspendedDescription: "Acest cont a fost suspendat din cauza încălcării
termenilor de serviciu al serverului sau ceva similar. Contactează administratorul
dacă ai dori să afli un motiv mai detaliat. Te rog nu crea un cont nou."
menu: "Meniu" menu: "Meniu"
divider: "Separator" divider: "Separator"
addItem: "Adaugă element" addItem: "Adaugă element"
@ -569,12 +613,14 @@ permission: "Permisiuni"
enableAll: "Actevează tot" enableAll: "Actevează tot"
disableAll: "Dezactivează tot" disableAll: "Dezactivează tot"
tokenRequested: "Acordă acces la cont" tokenRequested: "Acordă acces la cont"
pluginTokenRequestedDescription: "Acest plugin va putea să folosească permisiunile setate aici." pluginTokenRequestedDescription: "Acest plugin va putea să folosească permisiunile
setate aici."
notificationType: "Tipul notificării" notificationType: "Tipul notificării"
edit: "Editează" edit: "Editează"
emailServer: "Server email" emailServer: "Server email"
enableEmail: "Activează distribuția de emailuri" enableEmail: "Activează distribuția de emailuri"
emailConfigInfo: "Folosit pentru a confirma emailul tău în timpul logări dacă îți uiți parola" emailConfigInfo: "Folosit pentru a confirma emailul tău în timpul logări dacă îți
uiți parola"
email: "Email" email: "Email"
emailAddress: "Adresă de email" emailAddress: "Adresă de email"
smtpConfig: "Configurare Server SMTP" smtpConfig: "Configurare Server SMTP"
@ -582,13 +628,15 @@ smtpHost: "Gazdă"
smtpPort: "Port" smtpPort: "Port"
smtpUser: "Nume de utilizator" smtpUser: "Nume de utilizator"
smtpPass: "Parolă" smtpPass: "Parolă"
emptyToDisableSmtpAuth: "Lasă username-ul și parola necompletate pentru a dezactiva verificarea SMTP" emptyToDisableSmtpAuth: "Lasă username-ul și parola necompletate pentru a dezactiva
verificarea SMTP"
smtpSecure: "Folosește SSL/TLS implicit pentru conecțiunile SMTP" smtpSecure: "Folosește SSL/TLS implicit pentru conecțiunile SMTP"
smtpSecureInfo: "Oprește opțiunea asta dacă STARTTLS este folosit" smtpSecureInfo: "Oprește opțiunea asta dacă STARTTLS este folosit"
testEmail: "Testează livrarea emailurilor" testEmail: "Testează livrarea emailurilor"
wordMute: "Cuvinte pe mut" wordMute: "Cuvinte pe mut"
regexpError: "Eroare de Expresie Regulată" regexpError: "Eroare de Expresie Regulată"
regexpErrorDescription: "A apărut o eroare în expresia regulată pe linia {line} al cuvintelor {tab} setate pe mut:" regexpErrorDescription: "A apărut o eroare în expresia regulată pe linia {line} al
cuvintelor {tab} setate pe mut:"
instanceMute: "Instanțe pe mut" instanceMute: "Instanțe pe mut"
userSaysSomething: "{name} a spus ceva" userSaysSomething: "{name} a spus ceva"
makeActive: "Activează" makeActive: "Activează"
@ -604,10 +652,13 @@ create: "Crează"
notificationSetting: "Setări notificări" notificationSetting: "Setări notificări"
notificationSettingDesc: "Selectează tipurile de notificări care să fie arătate" notificationSettingDesc: "Selectează tipurile de notificări care să fie arătate"
useGlobalSetting: "Folosește setările globale" useGlobalSetting: "Folosește setările globale"
useGlobalSettingDesc: "Dacă opțiunea e pornită, notificările contului tău vor fi folosite. Dacă e oprită, configurația va fi individuală." useGlobalSettingDesc: "Dacă opțiunea e pornită, notificările contului tău vor fi folosite.
Dacă e oprită, configurația va fi individuală."
other: "Altele" other: "Altele"
regenerateLoginToken: "Regenerează token de login" regenerateLoginToken: "Regenerează token de login"
regenerateLoginTokenDescription: "Regenerează token-ul folosit intern în timpul logări. În mod normal asta nu este necesar. Odată regenerat, toate dispozitivele vor fi delogate." regenerateLoginTokenDescription: "Regenerează token-ul folosit intern în timpul logări.
În mod normal asta nu este necesar. Odată regenerat, toate dispozitivele vor fi
delogate."
setMultipleBySeparatingWithSpace: "Separă mai multe intrări cu spații." setMultipleBySeparatingWithSpace: "Separă mai multe intrări cu spații."
fileIdOrUrl: "Introdu ID sau URL" fileIdOrUrl: "Introdu ID sau URL"
behavior: "Comportament" behavior: "Comportament"
@ -615,13 +666,15 @@ sample: "exemplu"
abuseReports: "Rapoarte" abuseReports: "Rapoarte"
reportAbuse: "Raportează" reportAbuse: "Raportează"
reportAbuseOf: "Raportează {name}" reportAbuseOf: "Raportează {name}"
fillAbuseReportDescription: "Te rog scrie detaliile legate de acest raport. Dacă este despre o notă specifică, te rog introdu URL-ul ei." 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." abuseReported: "Raportul tău a fost trimis. Mulțumim."
reporter: "Raportorul" reporter: "Raportorul"
reporteeOrigin: "Originea raportatului" reporteeOrigin: "Originea raportatului"
reporterOrigin: "Originea raportorului" reporterOrigin: "Originea raportorului"
forwardReport: "Redirecționează raportul către instanța externă" forwardReport: "Redirecționează raportul către instanța externă"
forwardReportIsAnonymous: "În locul contului tău, va fi afișat un cont anonim, de sistem, ca raportor către instanța externă." forwardReportIsAnonymous: "În locul contului tău, va fi afișat un cont anonim, de
sistem, ca raportor către instanța externă."
send: "Trimite" send: "Trimite"
abuseMarkAsResolved: "Marchează raportul ca rezolvat" abuseMarkAsResolved: "Marchează raportul ca rezolvat"
openInNewTab: "Deschide în tab nou" openInNewTab: "Deschide în tab nou"

View file

@ -1375,9 +1375,6 @@ _widgets:
userList: Список пользователей userList: Список пользователей
_userList: _userList:
chooseList: Выберите список chooseList: Выберите список
meiliStatus: Состояние сервера
meiliSize: Размер индекса
meiliIndexCount: Индексированные посты
serverInfo: Информация о сервере serverInfo: Информация о сервере
_cw: _cw:
hide: "Спрятать" hide: "Спрятать"
@ -1951,11 +1948,6 @@ showUpdates: Показывать всплывающее окно при обн
recommendedInstances: Рекомендованные серверы recommendedInstances: Рекомендованные серверы
defaultReaction: Эмодзи реакция по умолчанию для выходящих и исходящих постов defaultReaction: Эмодзи реакция по умолчанию для выходящих и исходящих постов
license: Лицензия license: Лицензия
indexPosts: Индексировать посты
indexFrom: Индексировать начиная с идентификатора поста и далее
indexFromDescription: оставьте пустым для индексации каждого поста
indexNotice: Теперь индексирование. Вероятно, это займет некоторое время, пожалуйста,
не перезагружайте свой сервер по крайней мере в течение часа.
customKaTeXMacro: Кастомные KaTex макросы customKaTeXMacro: Кастомные KaTex макросы
enableCustomKaTeXMacro: Включить кастомные KaTeX макросы enableCustomKaTeXMacro: Включить кастомные KaTeX макросы
noteId: Идентификатор поста noteId: Идентификатор поста
@ -2094,7 +2086,6 @@ enableServerMachineStats: Включить статистику серверно
enableIdenticonGeneration: Включить генерацию Identicon enableIdenticonGeneration: Включить генерацию Identicon
reactionPickerSkinTone: Предпочитаемый цвет кожи эмодзи reactionPickerSkinTone: Предпочитаемый цвет кожи эмодзи
sendModMail: Отправить сообщение о модерации sendModMail: Отправить сообщение о модерации
findOtherInstance: Найти другой сервер
signupsDisabled: Регистрация на этом сервере сейчас отключена, но вы всегда можете signupsDisabled: Регистрация на этом сервере сейчас отключена, но вы всегда можете
зарегистрироваться на другом сервере! Если у вас есть код приглашения на этот сервер, зарегистрироваться на другом сервере! Если у вас есть код приглашения на этот сервер,
пожалуйста, введите его ниже. пожалуйста, введите его ниже.

View file

@ -1288,7 +1288,6 @@ customMOTD: ข้อความหน้าจอเริ่มต้นท
swipeOnMobile: อนุญาตให้ปัดระหว่างหน้า swipeOnMobile: อนุญาตให้ปัดระหว่างหน้า
breakFollowConfirm: คุณแน่ใจหรือไม่ที่จะลบผู้ติดตาม? breakFollowConfirm: คุณแน่ใจหรือไม่ที่จะลบผู้ติดตาม?
defaultReaction: ค่าเริ่มต้นของปฏิกิริยาอีโมจิสำหรับโพสต์ขาออกและขาเข้า defaultReaction: ค่าเริ่มต้นของปฏิกิริยาอีโมจิสำหรับโพสต์ขาออกและขาเข้า
findOtherInstance: ค้นหาเซิร์ฟเวอร์อื่น
silenceThisInstance: ปิดเงียบสำหรับเซิร์ฟเวอร์นี้ silenceThisInstance: ปิดเงียบสำหรับเซิร์ฟเวอร์นี้
antennaInstancesDescription: เขียนชื่อเซิร์ฟเวอร์ได้ 1 ชื่อต่อ 1 บรรทัด antennaInstancesDescription: เขียนชื่อเซิร์ฟเวอร์ได้ 1 ชื่อต่อ 1 บรรทัด
splash: หน้าจอเริ่มต้น splash: หน้าจอเริ่มต้น
@ -1316,8 +1315,6 @@ customMOTDDescription: ข้อความหน้าจอเริ่มต
คั่นด้วยการขึ้นบรรทัดใหม่เพื่อแสดงแบบสุ่มทุกครั้งที่ผู้ใช้โหลดเว็บหรือโหลดหน้าเว็บซ้ำ คั่นด้วยการขึ้นบรรทัดใหม่เพื่อแสดงแบบสุ่มทุกครั้งที่ผู้ใช้โหลดเว็บหรือโหลดหน้าเว็บซ้ำ
caption: คำอธิบายโดยอัตโนมัติ caption: คำอธิบายโดยอัตโนมัติ
moveToLabel: 'บัญชีที่คุณจะย้ายไปยัง:' moveToLabel: 'บัญชีที่คุณจะย้ายไปยัง:'
indexFromDescription: เว้นว่างไว้เพื่อสร้างดัชนีทุกโพสต์
indexNotice: ตอนนี้กำลังจัดทำดัชนี การดำเนินการนี้อาจใช้เวลาสักครู่ โปรดอย่ารีสตาร์ทเซิร์ฟเวอร์เป็นเวลาอย่างน้อยหนึ่งชั่วโมง
noteId: โพสต์ ID noteId: โพสต์ ID
apps: แอป apps: แอป
enableRecommendedTimeline: เปิดใช้งาน ไทม์ไลน์ที่แนะนำ enableRecommendedTimeline: เปิดใช้งาน ไทม์ไลน์ที่แนะนำ
@ -1371,9 +1368,7 @@ moveFromDescription: การดำเนินการนี้จะตั
migrationConfirm: "คุณแน่ใจหรือไม่ว่าคุณต้องการย้ายบัญชีของคุณไปยัง {account} เมื่อคุณทำเช่นนี้ migrationConfirm: "คุณแน่ใจหรือไม่ว่าคุณต้องการย้ายบัญชีของคุณไปยัง {account} เมื่อคุณทำเช่นนี้
คุณจะไม่สามารถกู้คืนมาได้ และคุณจะไม่สามารถใช้บัญชีของคุณได้ตามปกติอีก\nนอกจากนี้ คุณจะไม่สามารถกู้คืนมาได้ และคุณจะไม่สามารถใช้บัญชีของคุณได้ตามปกติอีก\nนอกจากนี้
โปรดตรวจสอบให้แน่ใจว่าคุณได้ตั้งบัญชีปัจจุบันนี้เป็นบัญชีที่คุณจะย้ายออก" โปรดตรวจสอบให้แน่ใจว่าคุณได้ตั้งบัญชีปัจจุบันนี้เป็นบัญชีที่คุณจะย้ายออก"
indexFrom: จัดทำดัชนีตั้งแต่ Post ID เป็นต้นไป
license: ใบอนุญาต license: ใบอนุญาต
indexPosts: ดัชนีโพสต์
signupsDisabled: การลงชื่อสมัครใช้บนเซิร์ฟเวอร์นี้ถูกปิดใช้งานอยู่ในขณะนี้ แต่คุณสามารถสมัครที่เซิร์ฟเวอร์อื่นได้ตลอดเวลา signupsDisabled: การลงชื่อสมัครใช้บนเซิร์ฟเวอร์นี้ถูกปิดใช้งานอยู่ในขณะนี้ แต่คุณสามารถสมัครที่เซิร์ฟเวอร์อื่นได้ตลอดเวลา
หากคุณมีรหัสเชิญสำหรับเซิร์ฟเวอร์นี้ โปรดป้อนรหัสด้านล่าง หากคุณมีรหัสเชิญสำหรับเซิร์ฟเวอร์นี้ โปรดป้อนรหัสด้านล่าง
customKaTeXMacroDescription: 'ตั้งค่ามาโครเพื่อเขียนนิพจน์ทางคณิตศาสตร์ได้อย่างง่ายดาย customKaTeXMacroDescription: 'ตั้งค่ามาโครเพื่อเขียนนิพจน์ทางคณิตศาสตร์ได้อย่างง่ายดาย

View file

@ -158,7 +158,6 @@ _widgets:
activity: Aktivite activity: Aktivite
digitalClock: Dijital Saat digitalClock: Dijital Saat
unixClock: UNIX Saati unixClock: UNIX Saati
meiliIndexCount: Indexlenmiş gönderiler
calendar: Takvim calendar: Takvim
trends: Popüler trends: Popüler
memo: Yapışkan Notlar memo: Yapışkan Notlar
@ -166,13 +165,11 @@ _widgets:
federation: Federasyon federation: Federasyon
instanceCloud: Sunucu Bulutu instanceCloud: Sunucu Bulutu
postForm: Gönderi Formu postForm: Gönderi Formu
meiliSize: Index boyutu
slideshow: Slayt Gösterisi slideshow: Slayt Gösterisi
button: Düğme button: Düğme
clock: Saat clock: Saat
rss: RSS Okuyucu rss: RSS Okuyucu
serverInfo: Sunucu Bilgisi serverInfo: Sunucu Bilgisi
meiliStatus: Sunucu Durumu
jobQueue: İş Sırası jobQueue: İş Sırası
serverMetric: Sunucu Bilgileri serverMetric: Sunucu Bilgileri
_profile: _profile:
@ -473,7 +470,6 @@ activeEmailValidationDescription: Tek kullanımlık adreslerin kontrol edilmesi
sağlar. İşaretlenmediğinde, yalnızca e-postanın biçimi doğrulanır. sağlar. İşaretlenmediğinde, yalnızca e-postanın biçimi doğrulanır.
move: Taşı move: Taşı
defaultReaction: Giden ve gelen gönderiler için varsayılan emoji tepkisi defaultReaction: Giden ve gelen gönderiler için varsayılan emoji tepkisi
indexPosts: Dizin Gönderileri
youGotNewFollower: takip etti youGotNewFollower: takip etti
receiveFollowRequest: Takip isteği alındı receiveFollowRequest: Takip isteği alındı
followRequestAccepted: Takip isteği onaylandı followRequestAccepted: Takip isteği onaylandı
@ -1084,7 +1080,6 @@ check: Kontrol Et
driveCapOverrideLabel: Bu kullanıcı için drive kapasitesini değiştirin driveCapOverrideLabel: Bu kullanıcı için drive kapasitesini değiştirin
numberOfPageCache: Önbelleğe alınan sayfa sayısı numberOfPageCache: Önbelleğe alınan sayfa sayısı
license: Lisans license: Lisans
indexFrom: Post ID'den itibaren dizin
xl: XL xl: XL
notificationSetting: Bildirim ayarları notificationSetting: Bildirim ayarları
fillAbuseReportDescription: Lütfen bu raporla ilgili ayrıntıları doldurun. Belirli fillAbuseReportDescription: Lütfen bu raporla ilgili ayrıntıları doldurun. Belirli
@ -1159,9 +1154,6 @@ migrationConfirm: "Hesabınızı {account} hesabına taşımak istediğinizden k
emin misiniz? Bunu yaptığınızda, geri alamazsınız ve hesabınızı bir daha normal emin misiniz? Bunu yaptığınızda, geri alamazsınız ve hesabınızı bir daha normal
şekilde kullanamazsınız.\nAyrıca, lütfen bu cari hesabı, taşındığınız hesap olarak şekilde kullanamazsınız.\nAyrıca, lütfen bu cari hesabı, taşındığınız hesap olarak
ayarladığınızdan emin olun." ayarladığınızdan emin olun."
indexFromDescription: Her gönderiyi dizine eklemek için boş bırakın
indexNotice: Şimdi indeksleniyor. Bu muhtemelen biraz zaman alacaktır, lütfen sunucunuzu
en az bir saat yeniden başlatmayın.
customKaTeXMacro: Özel KaTeX makroları customKaTeXMacro: Özel KaTeX makroları
directNotes: Özel Mesajlar directNotes: Özel Mesajlar
import: İçeri Aktar import: İçeri Aktar
@ -1292,7 +1284,6 @@ _emailUnavailable:
used: Bu mail zaten kullanılıyor used: Bu mail zaten kullanılıyor
format: Bu mail adresi yanlış format: Bu mail adresi yanlış
apps: Uygulamalar apps: Uygulamalar
findOtherInstance: Başka bir sunucu bul
showWithSparkles: Parıltılarla göster showWithSparkles: Parıltılarla göster
showPopup: Kullanıcıları pop-up ile bilgilendirin showPopup: Kullanıcıları pop-up ile bilgilendirin
silencedWarning: Bu sayfa, bu kullanıcılar yöneticinizin susturduğu sunuculardan olduğu silencedWarning: Bu sayfa, bu kullanıcılar yöneticinizin susturduğu sunuculardan olduğu

View file

@ -1199,14 +1199,11 @@ _widgets:
aiscript: "Консоль AiScript" aiscript: "Консоль AiScript"
_userList: _userList:
chooseList: Оберіть список chooseList: Оберіть список
meiliStatus: Стан сервера
meiliSize: Розмір індексу
rssTicker: RSS-тікер rssTicker: RSS-тікер
instanceCloud: Хмара серверів instanceCloud: Хмара серверів
unixClock: Годинник UNIX unixClock: Годинник UNIX
userList: Список користувачів userList: Список користувачів
serverInfo: Інформація про сервер serverInfo: Інформація про сервер
meiliIndexCount: Індексовані записи
_cw: _cw:
hide: "Сховати" hide: "Сховати"
show: "Показати більше" show: "Показати більше"
@ -1977,15 +1974,9 @@ caption: Автоматичний опис
showAdminUpdates: Вказати, що доступна нова версія Firefish (тільки для адміністратора) showAdminUpdates: Вказати, що доступна нова версія Firefish (тільки для адміністратора)
defaultReaction: Емодзі реакція за замовчуванням для вихідних і вхідних записів defaultReaction: Емодзі реакція за замовчуванням для вихідних і вхідних записів
license: Ліцензія license: Ліцензія
indexPosts: Індексувати пости
indexFrom: Індексувати записи з ID
indexFromDescription: Залиште порожнім, щоб індексувати кожен запис
indexNotice: Зараз відбувається індексація. Це, ймовірно, займе деякий час, будь ласка,
не перезавантажуйте сервер принаймні годину.
signupsDisabled: Реєстрація на цьому сервері наразі відключена, але ви завжди можете signupsDisabled: Реєстрація на цьому сервері наразі відключена, але ви завжди можете
зареєструватися на іншому сервері! Якщо у вас є код запрошення на цей сервер, будь зареєструватися на іншому сервері! Якщо у вас є код запрошення на цей сервер, будь
ласка, введіть його нижче. ласка, введіть його нижче.
findOtherInstance: Знайти інший сервер
customKaTeXMacro: Користувацькі макроси KaTeX customKaTeXMacro: Користувацькі макроси KaTeX
enableCustomKaTeXMacro: Увімкнути користувацькі макроси KaTeX enableCustomKaTeXMacro: Увімкнути користувацькі макроси KaTeX
apps: Додатки apps: Додатки

View file

@ -1437,9 +1437,6 @@ _widgets:
userList: Danh sách người dùng userList: Danh sách người dùng
_userList: _userList:
chooseList: Chọn một danh sách chooseList: Chọn một danh sách
meiliSize: Kích cỡ chỉ mục
meiliIndexCount: Tút đã lập chỉ mục
meiliStatus: Trạng thái máy chủ
serverInfo: Thông tin máy chủ serverInfo: Thông tin máy chủ
_cw: _cw:
hide: "Ẩn" hide: "Ẩn"
@ -1911,7 +1908,6 @@ renoteMute: Ẩn lượt chia sẻ
renoteUnmute: Bỏ ẩn lượt chia sẻ renoteUnmute: Bỏ ẩn lượt chia sẻ
searchPlaceholder: Lướt Firefish searchPlaceholder: Lướt Firefish
edited: Đã sửa {date} {time} edited: Đã sửa {date} {time}
findOtherInstance: Tìm máy chủ khác
noThankYou: Từ chối noThankYou: Từ chối
_filters: _filters:
withFile: Có file withFile: Có file
@ -2048,8 +2044,6 @@ hiddenTagsDescription: 'Liệt kê các hashtag (không có #) mà bạn muốn
noInstances: Không có máy chủ nào noInstances: Không có máy chủ nào
manageGroups: Quản lý nhóm manageGroups: Quản lý nhóm
accessibility: Khả năng tiếp cận accessibility: Khả năng tiếp cận
indexNotice: Đang lập chỉ mục. Quá trình này có thể mất một lúc, vui lòng không khởi
động lại máy chủ của bạn sau ít nhất một giờ.
breakFollowConfirm: Bạn có chắc muốn xóa người theo dõi? breakFollowConfirm: Bạn có chắc muốn xóa người theo dõi?
caption: Caption tự động caption: Caption tự động
objectStorageS3ForcePathStyle: Sử dụng URL điểm cuối dựa trên đường dẫn objectStorageS3ForcePathStyle: Sử dụng URL điểm cuối dựa trên đường dẫn
@ -2069,7 +2063,6 @@ updateAvailable: Có bản cập nhật mới!
swipeOnDesktop: Cho phép vuốt kiểu điện thoại trên máy tính swipeOnDesktop: Cho phép vuốt kiểu điện thoại trên máy tính
moveFromLabel: 'Tài khoản cũ của bạn:' moveFromLabel: 'Tài khoản cũ của bạn:'
defaultReaction: Biểu cảm mặc định cho những tút đã đăng và sắp đăng defaultReaction: Biểu cảm mặc định cho những tút đã đăng và sắp đăng
indexFromDescription: Để trống để lập chỉ mục toàn bộ
donationLink: Liên kết tới trang tài trợ donationLink: Liên kết tới trang tài trợ
deletePasskeys: Xóa passkey deletePasskeys: Xóa passkey
delete2faConfirm: Thao tác này sẽ xóa 2FA trên tài khoản này một cách không thể phục delete2faConfirm: Thao tác này sẽ xóa 2FA trên tài khoản này một cách không thể phục
@ -2086,8 +2079,6 @@ audio: Âm thanh
selectInstance: Chọn máy chủ selectInstance: Chọn máy chủ
userSaysSomethingReason: '{name} cho biết {reason}' userSaysSomethingReason: '{name} cho biết {reason}'
pushNotification: Thông báo đẩy pushNotification: Thông báo đẩy
indexPosts: Chỉ mục tút
indexFrom: Chỉ mục từ Post ID
customKaTeXMacro: Tùy chỉnh macro KaTeX customKaTeXMacro: Tùy chỉnh macro KaTeX
license: Giấy phép license: Giấy phép
cw: Nội dung ẩn cw: Nội dung ẩn

View file

@ -31,12 +31,12 @@ uploading: "正在上传..."
save: "保存" save: "保存"
users: "用户" users: "用户"
addUser: "添加用户" addUser: "添加用户"
favorite: "添加到书签" favorite: "添加到收藏"
favorites: "书签" favorites: "收藏"
unfavorite: "取消收藏" unfavorite: "取消收藏"
favorited: "已添加到书签。" favorited: "已添加到收藏。"
alreadyFavorited: "书签中已存在。" alreadyFavorited: "收藏中已存在。"
cantFavorite: "无法添加到书签。" cantFavorite: "无法添加到收藏。"
pin: "置顶" pin: "置顶"
unpin: "取消置顶" unpin: "取消置顶"
copyContent: "复制内容" copyContent: "复制内容"
@ -50,6 +50,7 @@ copyUsername: "复制用户名"
searchUser: "搜索用户" searchUser: "搜索用户"
reply: "回复" reply: "回复"
replies: "回复" replies: "回复"
toReply: "回复"
loadMore: "加载更多" loadMore: "加载更多"
showMore: "查看更多" showMore: "查看更多"
showLess: "关闭" showLess: "关闭"
@ -70,8 +71,9 @@ exportRequested: "导出请求已提交,这可能需要花一些时间,导
importRequested: "导入请求已提交,这可能需要花一点时间。" importRequested: "导入请求已提交,这可能需要花一点时间。"
lists: "列表" lists: "列表"
noLists: "列表为空" noLists: "列表为空"
note: "帖" note: ""
notes: "帖子" notes: "帖子"
toPost: "发帖"
following: "关注中" following: "关注中"
followers: "关注者" followers: "关注者"
followsYou: "关注了您" followsYou: "关注了您"
@ -103,6 +105,7 @@ cantRenote: "此帖子无法被转发。"
cantReRenote: "转发无法被再次转发。" cantReRenote: "转发无法被再次转发。"
quote: "引用" quote: "引用"
quotes: "引用" quotes: "引用"
toQuote: "引用"
pinnedNote: "已置顶的帖子" pinnedNote: "已置顶的帖子"
pinned: "置顶" pinned: "置顶"
you: "您" you: "您"
@ -146,9 +149,9 @@ addEmoji: "添加表情符号"
settingGuide: "推荐配置" settingGuide: "推荐配置"
cacheRemoteFiles: "缓存远程文件" cacheRemoteFiles: "缓存远程文件"
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程服务器载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。" cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程服务器载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
flagAsBot: "这是一个机器人账号" flagAsBot: "标记此账号为自动化账号"
flagAsBotDescription: "如果此账号由程序控制,请启用此项。启用后,此标志可以帮助其它开发人员防止机器人之间产生无限互动的行为,并让 Firefish flagAsBotDescription: "如果此账号由程序控制,请启用此项。启用后,此标志可以帮助其它开发人员防止自动化账号之间产生无限互动的行为,并让 Firefish
的内部系统将此账号识别为机器人。" 的内部系统将此账号识别为自动化账号。"
flagAsCat: "将这个账号设定为一只猫😺" flagAsCat: "将这个账号设定为一只猫😺"
flagAsCatDescription: "您会长出猫耳朵并像猫一样说话!" flagAsCatDescription: "您会长出猫耳朵并像猫一样说话!"
flagShowTimelineReplies: "在时间线上显示帖子的回复" flagShowTimelineReplies: "在时间线上显示帖子的回复"
@ -264,7 +267,7 @@ agreeTo: "我同意 {0}"
tos: "服务条款" tos: "服务条款"
start: "开始" start: "开始"
home: "首页" home: "首页"
remoteUserCaution: "由于此用户来自其它服务器,显示的信息可能不完整。" remoteUserCaution: "由于此用户来自其它服务器,显示的信息不完整。"
activity: "活动" activity: "活动"
images: "图片" images: "图片"
birthday: "生日" birthday: "生日"
@ -589,6 +592,7 @@ tokenRequested: "允许访问账号"
pluginTokenRequestedDescription: "此插件将能够拥有这里设置的权限。" pluginTokenRequestedDescription: "此插件将能够拥有这里设置的权限。"
notificationType: "通知类型" notificationType: "通知类型"
edit: "编辑" edit: "编辑"
toEdit: "编辑"
emailServer: "邮件服务器" emailServer: "邮件服务器"
enableEmail: "启用发送邮件功能" enableEmail: "启用发送邮件功能"
emailConfigInfo: "用于确认电子邮件和密码重置" emailConfigInfo: "用于确认电子邮件和密码重置"
@ -685,7 +689,7 @@ disableShowingAnimatedImages: "不播放动画"
verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成验证。" verificationEmailSent: "已发送确认电子邮件。请访问电子邮件中的链接以完成验证。"
notSet: "未设置" notSet: "未设置"
emailVerified: "电子邮件地址已验证" emailVerified: "电子邮件地址已验证"
noteFavoritesCount: "加入书签的帖子数" noteFavoritesCount: "加入收藏的帖子数"
pageLikesCount: "页面点赞次数" pageLikesCount: "页面点赞次数"
pageLikedCount: "页面被点赞次数" pageLikedCount: "页面被点赞次数"
contact: "联系人" contact: "联系人"
@ -869,7 +873,7 @@ recommended: "推荐"
check: "检查" check: "检查"
driveCapOverrideLabel: "修改此用户的网盘容量" driveCapOverrideLabel: "修改此用户的网盘容量"
driveCapOverrideCaption: "输入 0 或以下的值将容量重置为默认值。" driveCapOverrideCaption: "输入 0 或以下的值将容量重置为默认值。"
requireAdminForView: "需要使用管理员账号登录才能查看。" requireAdminForView: "需要使用管理员账号登录才能查看。"
isSystemAccount: "该账号由系统自动创建。请不要修改、编辑、删除或以其它方式篡改这个账号,否则可能会破坏您的服务器。" isSystemAccount: "该账号由系统自动创建。请不要修改、编辑、删除或以其它方式篡改这个账号,否则可能会破坏您的服务器。"
typeToConfirm: "输入 {x} 以确认操作" typeToConfirm: "输入 {x} 以确认操作"
deleteAccount: "删除账号" deleteAccount: "删除账号"
@ -904,9 +908,9 @@ account: "账号"
move: "迁移" move: "迁移"
customKaTeXMacro: "自定义 KaTeX 宏" customKaTeXMacro: "自定义 KaTeX 宏"
customKaTeXMacroDescription: "使用宏来轻松的输入数学表达式吧!宏的用法与 LaTeX 中的命令定义相同。您可以使用 \\newcommand{\\ customKaTeXMacroDescription: "使用宏来轻松的输入数学表达式吧!宏的用法与 LaTeX 中的命令定义相同。您可以使用 \\newcommand{\\
name}{content} 或 \\newcommand{\\name}[number of arguments]{content} 来输入数学表达式。举个例子,\\ name}{content} 或 \\newcommand{\\name}[number of arguments]{content} 来输入数学表达式。举个例子,
newcommand{\\add}[2]{#1 + #2} 会将 \\add{3}{foo} 展开为 3 + foo。此外,宏名称外的花括号 {} 可以被替换为圆括号 \\newcommand{\\add}[2]{#1 + #2} 会将 \\add{3}{foo} 展开为 3 + foo 。此外,宏名称外的花括号 {} 可以被替换为圆括号
() 和方括号 [],这会影响用于参数的括号。每行只能够定义一个宏,无法在中间换行,且无效的行将被忽略。只支持简单字符串替换功能,不支持高级语法,如条件分支等。" () 和方括号 [] ,这会影响用于参数的括号。每行只能够定义一个宏,您无法在中间换行。无效的行将被忽略。只支持简单字符串替换功能,不支持高级语法,如条件分支等。"
enableCustomKaTeXMacro: "启用自定义 KaTeX 宏" enableCustomKaTeXMacro: "启用自定义 KaTeX 宏"
_sensitiveMediaDetection: _sensitiveMediaDetection:
description: "可以使用机器学习技术自动检测敏感媒体,以便进行审核。服务器负载将略微增加。" description: "可以使用机器学习技术自动检测敏感媒体,以便进行审核。服务器负载将略微增加。"
@ -1127,6 +1131,7 @@ _wordMute:
lang: "语言" lang: "语言"
hard: "硬过滤" hard: "硬过滤"
mutedNotes: "已过滤的帖子" mutedNotes: "已过滤的帖子"
mutePatterns: 静音表达式
_instanceMute: _instanceMute:
instanceMuteDescription: "静音列出服务器中的所有帖子和转帖,包括服务器的用户回复。" instanceMuteDescription: "静音列出服务器中的所有帖子和转帖,包括服务器的用户回复。"
instanceMuteDescription2: "设置时用换行符来分隔" instanceMuteDescription2: "设置时用换行符来分隔"
@ -1258,7 +1263,7 @@ _2fa:
step2: "然后,扫描屏幕上显示的二维码。" step2: "然后,扫描屏幕上显示的二维码。"
step2Url: "如果您使用的是桌面程序您也可以输入这个URL" step2Url: "如果您使用的是桌面程序您也可以输入这个URL"
step3: "输入您的应用提供的令牌以完成设置。" step3: "输入您的应用提供的令牌以完成设置。"
step4: "从现在开始,任何登录操作都将要求您提供这样一个登录令牌。" step4: "从现在开始,任何登录操作都将要求您提供这样一个令牌。"
securityKeyInfo: "除了指纹或 PIN 身份验证外,您还可以通过支持 FIDO2 的硬件安全密钥设置身份验证,以进一步保护您的账号。" securityKeyInfo: "除了指纹或 PIN 身份验证外,您还可以通过支持 FIDO2 的硬件安全密钥设置身份验证,以进一步保护您的账号。"
token: 2FA 令牌 token: 2FA 令牌
step3Title: 输入验证码 step3Title: 输入验证码
@ -1276,8 +1281,8 @@ _permissions:
"write:blocks": "编辑屏蔽名单" "write:blocks": "编辑屏蔽名单"
"read:drive": "查看网盘" "read:drive": "查看网盘"
"write:drive": "管理网盘文件" "write:drive": "管理网盘文件"
"read:favorites": "查看收藏" "read:favorites": "查看收藏"
"write:favorites": "编辑收藏" "write:favorites": "编辑收藏"
"read:following": "查看关注信息" "read:following": "查看关注信息"
"write:following": "关注/取消关注其它账号" "write:following": "关注/取消关注其它账号"
"read:messaging": "查看聊天消息" "read:messaging": "查看聊天消息"
@ -1350,9 +1355,6 @@ _widgets:
aiscript: "AiScript 控制台" aiscript: "AiScript 控制台"
aichan: "小蓝" aichan: "小蓝"
userList: 用户列表 userList: 用户列表
meiliStatus: 服务器状态
meiliIndexCount: 已索引的帖子
meiliSize: 索引大小
serverInfo: 服务器信息 serverInfo: 服务器信息
_userList: _userList:
chooseList: 选择列表 chooseList: 选择列表
@ -1403,7 +1405,7 @@ _postForm:
b: "发生了什么?" b: "发生了什么?"
c: "您有什么想法?" c: "您有什么想法?"
d: "您想要发布些什么吗?" d: "您想要发布些什么吗?"
e: "请写下来吧" e: "请写下来吧..."
f: "等待您的发布..." f: "等待您的发布..."
_profile: _profile:
name: "昵称" name: "昵称"
@ -1914,13 +1916,11 @@ _skinTones:
mediumDark: 中等偏深 mediumDark: 中等偏深
isModerator: 监察员 isModerator: 监察员
isAdmin: 管理员 isAdmin: 管理员
findOtherInstance: 寻找其它服务器
moveFromDescription: 这将为您的旧账号设置一个别名,以便您可以从该旧账号迁移到当前账号。在从旧账号迁移之前执行此操作。请输入格式如 @person@server.com moveFromDescription: 这将为您的旧账号设置一个别名,以便您可以从该旧账号迁移到当前账号。在从旧账号迁移之前执行此操作。请输入格式如 @person@server.com
的账号标签 的账号标签
indexPosts: 索引帖子 signupsDisabled: 该服务器目前关闭注册。如果您有该服务器的邀请码,请在下面输入。
signupsDisabled: 该服务器目前关闭注册,但您随时可以在另一台服务器上注册!如果您有该服务器的邀请码,请在下面输入。
silencedWarning: 显示这个页面是因为这些用户来自您的管理员设置的禁言服务器,所以他们有可能是垃圾信息。 silencedWarning: 显示这个页面是因为这些用户来自您的管理员设置的禁言服务器,所以他们有可能是垃圾信息。
isBot: 这个账号是一个机器人 isBot: 这个账号是一个自动化账号
moveAccountDescription: 这个过程是不可逆的。在迁移之前,请确保您已在新账号上为当前账号设置了别名。请输入格式如 @person@server.com moveAccountDescription: 这个过程是不可逆的。在迁移之前,请确保您已在新账号上为当前账号设置了别名。请输入格式如 @person@server.com
账号标签 账号标签
moveFromLabel: 您要迁移出的旧账号: moveFromLabel: 您要迁移出的旧账号:
@ -1931,13 +1931,13 @@ moveTo: 将当前账号迁移至新账号
moveToLabel: 您要迁移到的目标账号: moveToLabel: 您要迁移到的目标账号:
moveAccount: 迁移账号! moveAccount: 迁移账号!
migrationConfirm: "您确实确定要将账号迁移到 {account} 吗?此操作无法撤消,并且您将无法再次正常使用旧账号。\n另外请确保您已将此当前账号设置为要移出的账号。" migrationConfirm: "您确实确定要将账号迁移到 {account} 吗?此操作无法撤消,并且您将无法再次正常使用旧账号。\n另外请确保您已将此当前账号设置为要移出的账号。"
indexFromDescription: 留空以索引每个帖子
noteId: 帖子 ID noteId: 帖子 ID
moveFrom: 从旧账号迁移至此账号 moveFrom: 从旧账号迁移至此账号
defaultReaction: 发出和收到帖子的默认表情符号反应 defaultReaction: 发出和收到帖子的默认表情符号反应
indexNotice: 现在开始索引。这可能需要一段时间,请至少一个小时内不要重新启动服务器。 sendModMail: 发送管理通知
indexFrom: 从帖子 ID 开始的索引 moderationNote: "管理笔记"
sendModMail: 发送审核通知 ipFirstAcknowledged: "首次获取此 IP 地址的日期"
driveCapacityOverride: "网盘容量变更"
isLocked: 该账号设置了关注请求 isLocked: 该账号设置了关注请求
_filters: _filters:
notesBefore: 帖子早于 notesBefore: 帖子早于
@ -1993,3 +1993,66 @@ openServerInfo: 点击帖子上的服务器滚动条时显示服务器信息
clickToShowPatterns: 点击显示模块模式 clickToShowPatterns: 点击显示模块模式
private: "秘密" private: "秘密"
privateDescription: "仅你可见" privateDescription: "仅你可见"
_iconSets:
regular: 标准
duotone: 双色
fill: 填满
bold: 加粗
light: 减细
emojiModPerm: 自定义表情符号管理权限
squareCatAvatars: 猫模式账号显示圆形头像
makePrivate: 设为私有
makePrivateConfirm: 此操作将向远程服务器发送删除请求并将可见性更改为私有。是否继续?
_emojiModPerm:
add: 添加
mod: 添加和编辑
unauthorized: 未授权
full: 全部允许
moreUrls: 置顶页面
enablePullToRefresh: 启用 “下拉刷新”
pullToRefreshThreshold: 触发下拉刷新所需的距离
pullDownToReload: 下拉刷新
releaseToReload: 释放刷新
reloading: 刷新中
attachedToNotes: 带有此附件的帖子
showAttachedNotes: 显示有此附件的帖子
iconSet: 图标样式
moreUrlsDescription: "请您使用以下形式输入要固定到左下角帮助菜单的页面,每行一个:\n\"显示名称\": https://example.com/"
useCdn: 从 CDN 获取资源
useCdnDescription: 从 JSDelivr CDN而不是 Firefish 服务器)加载一些静态资源,例如 Twemoji。
showBigPostButton: 在发帖表单上显示一个巨大的发帖按钮
suggested: 建议
noLanguage: 无语言
showPreviewByDefault: 默认以发布形式显示预览
preventMisclick: 预防误触
hideFollowButtons: 隐藏会误触的关注按钮
forMobile: 移动设备
replaceChatButtonWithAccountButton: 将聊天按钮替换为帐户切换按钮
replaceWidgetsButtonWithReloadButton: 将小部件按钮替换为重新加载按钮
searchEngine: 搜索栏 MFM 中使用的搜索引擎
postSearch: 在此服务器上搜索帖子
enableTimelineStreaming: 自动更新时间线
emojiModPermDescription: "添加:允许该用户添加新的自定义表情符号,并为新添加的自定义表情符号设置标签/类别/授权。\n添加和编辑在 “添加”
权限的基础上,允许该用户编辑现有自定义表情符号的名称/类别/标签/授权。\n全部允许在 “添加和编辑” 权限的基础上,允许该用户删除现有的自定义表情符号。"
replyMute: 静音回复
replyUnmute: 取消静音回复
searchWords: 要搜索的关键词 / 要查询的用户 ID 或 URL
searchRange: 发表于(可选)
searchUsers: 发布者(可选)
searchUsersDescription: "要搜索特定用户/服务器的帖子,请输入 ID@user@example.com或 @user 对于本地用户或域名example.com。\n
\n如果您输入 'me' (不带引号),您的所有帖子(包括不公开的帖子、仅限关注者的帖子、直接帖子和秘密帖子)都会被搜索。\n\n如果您输入 'local' (不带引号),结果将被过滤以仅包含来自该服务器的帖子。"
searchPostsWithFiles: 只带有文件的帖子
searchCwAndAlt: 包括内容警告和文件描述
publishTimelines: 为访客发布时间线
publishTimelinesDescription: 如果启用,在用户登出时本地和全局时间线也会显示在 {url} 上。
searchWordsDescription: "在此处输入搜索词以搜索帖子。交集搜索关键词之间使用空格进行区分,并集搜索关键词之间使用 OR 进行区分。\n例如
'早上 晚上' 将查找包含 '早上' 和 '晚上' 的帖子,而 '早上 OR 晚上' 将查找包含 '早上' 或 '晚上' (以及同时包含两者)的帖子。\n您还可以组合交集/并集条件,例如
'(早上 OR 晚上) 困了' 。\n如果您想搜索单词序列例如一个英语句子您必须将其放在双引号中例如 \"Today I learned\" 以区分于交集搜索。\n
\n如果您想转到特定的用户页面或帖子页面请在此字段中输入用户 ID 或 URL然后单击 “查询” 按钮。 单击 “搜索” 将搜索字面包含用户 ID/URL
的帖子。"
searchRangeDescription: "如果您要过滤时间段请按以下格式输入20220615-20231031\n\n如果您省略年份例如 0105-0106
或 20231105-0110它将被解释为当前年份。\n\n您还可以省略开始日期或结束日期。 例如 -0102 将过滤搜索结果以仅显示今年 1 月 2 日之前发布的帖子,而
20231026- 将过滤结果以仅显示 2023 年 10 月 26 日之后发布的帖子。"
messagingUnencryptedInfo: "Firefish 上的聊天没有经过端到端加密,请不要在聊天中分享您的敏感信息。"
noAltTextWarning: 有些附件没有描述。您是否忘记写描述了?
showNoAltTextWarning: 当您尝试发布没有描述的帖子附件时显示警告

View file

@ -50,6 +50,7 @@ copyUsername: "複製使用者名稱"
searchUser: "搜尋使用者" searchUser: "搜尋使用者"
reply: "回覆" reply: "回覆"
replies: "回覆" replies: "回覆"
toReply: "回覆"
loadMore: "載入更多" loadMore: "載入更多"
showMore: "載入更多" showMore: "載入更多"
showLess: "關閉" showLess: "關閉"
@ -72,6 +73,7 @@ lists: "清單"
noLists: "你沒有任何清單" noLists: "你沒有任何清單"
note: "貼文" note: "貼文"
notes: "貼文" notes: "貼文"
toPost: "發貼文"
following: "追隨中" following: "追隨中"
followers: "追隨者" followers: "追隨者"
followsYou: "追隨你的人" followsYou: "追隨你的人"
@ -103,6 +105,7 @@ cantRenote: "無法轉發此貼文。"
cantReRenote: "無法轉發之前已經轉發過的內容。" cantReRenote: "無法轉發之前已經轉發過的內容。"
quote: "引用" quote: "引用"
quotes: "引用" quotes: "引用"
toQuote: "引用"
pinnedNote: "已置頂的貼文" pinnedNote: "已置頂的貼文"
pinned: "置頂" pinned: "置頂"
you: "您" you: "您"
@ -585,6 +588,7 @@ tokenRequested: "允許存取帳戶"
pluginTokenRequestedDescription: "此外掛將擁有在此設定的權限。" pluginTokenRequestedDescription: "此外掛將擁有在此設定的權限。"
notificationType: "通知形式" notificationType: "通知形式"
edit: "編輯" edit: "編輯"
toEdit: "編輯"
emailServer: "電郵伺服器" emailServer: "電郵伺服器"
enableEmail: "啟用發送電郵功能" enableEmail: "啟用發送電郵功能"
emailConfigInfo: "用於確認電郵地址及密碼重置" emailConfigInfo: "用於確認電郵地址及密碼重置"
@ -789,7 +793,7 @@ previewNoteText: "預覽文本"
customCss: "自定義 CSS" customCss: "自定義 CSS"
customCssWarn: "這個設定必須由具備相關知識的人員操作,不當的設定可能导致客戶端無法正常使用。" customCssWarn: "這個設定必須由具備相關知識的人員操作,不當的設定可能导致客戶端無法正常使用。"
global: "公開" global: "公開"
squareAvatars: "大頭貼以方形顯示" squareAvatars: "以方形顯示非貓使用者的大頭貼"
sent: "發送" sent: "發送"
received: "收取" received: "收取"
searchResult: "搜尋結果" searchResult: "搜尋結果"
@ -831,7 +835,7 @@ voteConfirm: "確定投給「{choice}」?"
hide: "隱藏" hide: "隱藏"
leaveGroup: "離開群組" leaveGroup: "離開群組"
leaveGroupConfirm: "確定離開「{name}」?" leaveGroupConfirm: "確定離開「{name}」?"
useDrawerReactionPickerForMobile: "在移動設備上使用抽屜顯示" useDrawerReactionPickerForMobile: "在手機版使用抽屜顯示"
welcomeBackWithName: "歡迎回來,{name}" welcomeBackWithName: "歡迎回來,{name}"
clickToFinishEmailVerification: "點擊 [{ok}] 完成電子郵件地址認證。" clickToFinishEmailVerification: "點擊 [{ok}] 完成電子郵件地址認證。"
overridedDeviceKind: "裝置類型" overridedDeviceKind: "裝置類型"
@ -1123,6 +1127,7 @@ _wordMute:
langDescription: 將指定語言的貼文從時間軸中隱藏。 langDescription: 將指定語言的貼文從時間軸中隱藏。
muteLangs: 被靜音的語言 muteLangs: 被靜音的語言
muteLangsDescription: OR條件以空格或換行進行分隔。 muteLangsDescription: OR條件以空格或換行進行分隔。
mutePatterns: 靜音表達式
_instanceMute: _instanceMute:
instanceMuteDescription: "將設定的伺服器的所有貼文及轉發靜音。對被靜音伺服器的使用者的回覆也將被靜音。" instanceMuteDescription: "將設定的伺服器的所有貼文及轉發靜音。對被靜音伺服器的使用者的回覆也將被靜音。"
instanceMuteDescription2: "設定時以換行進行分隔" instanceMuteDescription2: "設定時以換行進行分隔"
@ -1337,7 +1342,7 @@ _widgets:
unixClock: "UNIX時間" unixClock: "UNIX時間"
federation: "聯邦宇宙" federation: "聯邦宇宙"
instanceCloud: "伺服器雲" instanceCloud: "伺服器雲"
postForm: "發佈窗口" postForm: "發文介面"
slideshow: "幻燈片" slideshow: "幻燈片"
button: "按鈕" button: "按鈕"
onlineUsers: "線上的使用者" onlineUsers: "線上的使用者"
@ -1349,9 +1354,6 @@ _widgets:
userList: 使用者列表 userList: 使用者列表
_userList: _userList:
chooseList: 選擇一個清單 chooseList: 選擇一個清單
meiliIndexCount: 編入索引的帖子
meiliStatus: 伺服器狀態
meiliSize: 索引大小
_cw: _cw:
hide: "隱藏" hide: "隱藏"
show: "瀏覽更多" show: "瀏覽更多"
@ -1872,15 +1874,12 @@ _experiments:
enablePostImports: 啟用匯入貼文的功能 enablePostImports: 啟用匯入貼文的功能
postImportsCaption: postImportsCaption:
允許使用者從舊有的Firefish・Misskey・Mastodon・Akkoma・Pleroma帳號匯入貼文。在伺服器佇列堵塞時匯入貼文可能會導致載入速度變慢。 允許使用者從舊有的Firefish・Misskey・Mastodon・Akkoma・Pleroma帳號匯入貼文。在伺服器佇列堵塞時匯入貼文可能會導致載入速度變慢。
findOtherInstance: 找找另一個伺服器
noGraze: 瀏覽器擴充元件 "Graze for Mastodon" 會與Firefish發生衝突請停用該擴充元件。 noGraze: 瀏覽器擴充元件 "Graze for Mastodon" 會與Firefish發生衝突請停用該擴充元件。
userSaysSomethingReasonRenote: '{name} 轉發了包含 {reason} 的貼文' userSaysSomethingReasonRenote: '{name} 轉發了包含 {reason} 的貼文'
pushNotificationNotSupported: 你的瀏覽器或伺服器不支援推送通知 pushNotificationNotSupported: 你的瀏覽器或伺服器不支援推送通知
accessibility: 輔助功能 accessibility: 輔助功能
userSaysSomethingReasonReply: '{name} 回覆了包含 {reason} 的貼文' userSaysSomethingReasonReply: '{name} 回覆了包含 {reason} 的貼文'
hiddenTags: 隱藏主題標籤 hiddenTags: 隱藏主題標籤
indexPosts: 索引貼文
indexNotice: 現在開始索引。 這可能需要一段時間,請不要在一個小時內重啟你的伺服器。
deleted: 已刪除 deleted: 已刪除
editNote: 編輯貼文 editNote: 編輯貼文
edited: '於 {date} {time} 編輯' edited: '於 {date} {time} 編輯'
@ -1925,16 +1924,14 @@ sendModMail: 發送審核通知
enableIdenticonGeneration: 啟用Identicon生成 enableIdenticonGeneration: 啟用Identicon生成
enableServerMachineStats: 啟用伺服器硬體統計資訊 enableServerMachineStats: 啟用伺服器硬體統計資訊
reactionPickerSkinTone: 首選表情符號膚色 reactionPickerSkinTone: 首選表情符號膚色
indexFromDescription: 留空以索引每個貼文
preventAiLearning: 防止 AI 機器人抓取 preventAiLearning: 防止 AI 機器人抓取
preventAiLearningDescription: 請求第三方 AI 語言模型不要研究您上傳的內容,例如貼文和圖像。 preventAiLearningDescription: 請求第三方 AI 語言模型不要研究您上傳的內容,例如貼文和圖像。
indexFrom: 建立此貼文ID以後的索引
isLocked: 該帳戶已獲得以下批准 isLocked: 該帳戶已獲得以下批准
isModerator: 板主 isModerator: 板主
isAdmin: 管理員 isAdmin: 管理員
isPatron: Firefish 項目贊助者 isPatron: Firefish 項目贊助者
silencedWarning: 顯示此頁面是因為這些使用者來自您伺服器管理員已靜音的伺服器,因此他們可能是垃圾訊息。 silencedWarning: 顯示此頁面是因為這些使用者來自您伺服器管理員已靜音的伺服器,因此他們可能是垃圾訊息。
signupsDisabled: 此伺服器目前停止註冊,但您隨時可以在另一台伺服器上註冊!如果您有此伺服器的邀請碼,請在下面輸入。 signupsDisabled: 此伺服器目前停止註冊如果您有此伺服器的邀請碼,請在下面輸入。
showPopup: 通過彈出式視窗通知使用者 showPopup: 通過彈出式視窗通知使用者
showWithSparkles: 讓標題閃閃發光 showWithSparkles: 讓標題閃閃發光
youHaveUnreadAnnouncements: 您有未讀的公告 youHaveUnreadAnnouncements: 您有未讀的公告
@ -2010,3 +2007,50 @@ private: "祕密"
privateDescription: "僅你可見" privateDescription: "僅你可見"
makePrivate: "設為祕密" makePrivate: "設為祕密"
makePrivateConfirm: "此操作將向遠端伺服器發送刪除請求,並將貼文的公開範圍設為「祕密」。是否繼續?" makePrivateConfirm: "此操作將向遠端伺服器發送刪除請求,並將貼文的公開範圍設為「祕密」。是否繼續?"
squareCatAvatars: 以方形顯示貓咪使用者的大頭貼
showBigPostButton: 放大發文介面中的貼文按鈕
emojiModPerm: 自訂表情符號的管理權限
emojiModPermDescription: "新增: 允許新增自訂表情符號,並允許設定尚未設定標籤/類別/授權條款的現有自訂表情符號。\n新增及編輯: 除了「新增」的權限之外,也允許編輯現有自訂表情符號的標籤/類別/授權條款\n
全部允許: 除了「新增及編輯」的權限之外,也允許刪除現有的自訂表情符號。"
_emojiModPerm:
full: 全部允許
unauthorized: 不允許
add: 新增
mod: 新增及編輯
replyMute: 靜音回覆貼文
useCdn: 從 CDN 獲取資源
useCdnDescription: 從 JSDelivr CDN而非此 Firefish 伺服器)載入 Twemoji 等的靜態資源。
replyUnmute: 解除靜音回覆貼文
suggested: 建議
noLanguage: 無語言
forMobile: 手機版
replaceChatButtonWithAccountButton: 將頁面下方的「傳送訊息按鈕」替換成「切換帳戶按鈕」
replaceWidgetsButtonWithReloadButton: 將頁面下方的「小工具按鈕」替換成「重新整理按鈕」
postSearch: 在此伺服器搜尋貼文
searchWords: 搜尋關鍵字 / 查詢的ID或URL
searchEngine: MFM搜尋欄使用的搜尋引擎
enablePullToRefresh: 啟用「下拉重新整理」
pullToRefreshThreshold: 觸發下拉重新整理所需的距離
pullDownToReload: 下拉重新整理
releaseToReload: 放開以重新整理
reloading: 重新整理中
enableTimelineStreaming: 自動更新時間軸
searchUsers: 發文者(選填)
searchRange: 日期範圍(選填)
searchPostsWithFiles: 僅帶有附件的貼文
searchCwAndAlt: 包含內容警告及替代文字
publishTimelines: 允許未登入的使用者查看時間軸
publishTimelinesDescription: 啟用後,未登入的使用者可於 {url} 查看本地時間軸及公開時間軸。
searchWordsDescription: "請在此欄位輸入欲搜尋的關鍵字。以空格分隔關鍵字以進行AND搜尋在關鍵字之間插入「OR」以進行OR搜尋。\n舉例來說輸入「早上
晚上」會搜尋包含「早上」和「晚上」的貼文,「早上 OR 晚上」會搜尋包含「早上」或「晚上」(或兩者皆包含)的貼文。\n您也可以同時進行AND搜尋及OR搜尋例如「(早上
OR 晚上) 想睡覺」。\n如欲搜尋包含空白的字串請使用雙引號 (\") 以與AND搜尋進行區別例如「\"Today I learned\"」。\n\n如欲前往特定使用者或貼文的頁面請在此欄位輸入使用者ID@user@example.com或貼文的URL並點擊「查詢」按鈕。點擊「搜尋」按鈕則會搜尋字面上包含輸入的ID或URL的貼文。"
searchUsersDescription: "如欲搜尋特定使用者的貼文,請以「@user@example.com本地使用者則為 @user」的格式輸入發文者的ID或輸入網域名稱example.com以搜尋特定伺服器的貼文。\n\
\n輸入「me」以搜尋自己的所有貼文包含不在主頁顯示、追隨者、指定使用者、祕密貼文。\n\n輸入「local」以搜尋本地伺服器的貼文。"
searchRangeDescription: "如欲搜尋特定期間的貼文請以「20220615-20231031」的格式輸入日期範圍。\n\n今年的日期可省略年份例如0105-0106、20231105-0110。\n\
\n開始日期和結果日期可擇一省略。舉例來說「-0102」表示僅搜尋今年1月2日為止的貼文「20231026-」表示僅搜尋2023年10月26日以後的貼文。"
noAltTextWarning: 有些附件沒有說明,您是否忘記寫了?
moderationNote: 管理員備註
ipFirstAcknowledged: 首次取得此 IP 位址的日期
driveCapacityOverride: 雲端硬碟容量變更
showNoAltTextWarning: 在嘗試發佈包含沒有替代文字的貼文時顯示警告
messagingUnencryptedInfo: Firefish 上的聊天沒有經過點對點加密,請不要發送敏感資訊。

View file

@ -1,11 +1,11 @@
{ {
"name": "firefish", "name": "firefish",
"version": "20240301", "version": "20240319",
"repository": { "repository": {
"type": "git", "type": "git",
"url": "https://firefish.dev/firefish/firefish.git" "url": "https://firefish.dev/firefish/firefish.git"
}, },
"packageManager": "pnpm@8.15.4", "packageManager": "pnpm@8.15.5",
"private": true, "private": true,
"scripts": { "scripts": {
"rebuild": "pnpm run clean && pnpm run build", "rebuild": "pnpm run clean && pnpm run build",
@ -14,14 +14,11 @@
"start:container": "pnpm run gulp && pnpm run migrate && pnpm run start", "start:container": "pnpm run gulp && pnpm run migrate && pnpm run start",
"start:test": "pnpm --filter backend run start:test", "start:test": "pnpm --filter backend run start:test",
"init": "pnpm run migrate", "init": "pnpm run migrate",
"migrate": "pnpm --filter backend run migrate", "migrate": "pnpm --filter backend run migration:run",
"revertmigration": "pnpm --filter backend run revertmigration", "revertmigration": "pnpm --filter backend run migration:revert",
"gulp": "gulp build", "gulp": "gulp build",
"watch": "pnpm run dev", "watch": "pnpm run dev",
"dev": "pnpm node ./scripts/dev.mjs", "dev": "pnpm node ./scripts/dev.mjs",
"dev:up": "pnpm node ./scripts/dev-up.mjs",
"dev:down": "pnpm node ./scripts/dev-down.mjs",
"dev:init": "pnpm run dev:down && pnpm run dev:up",
"dev:staging": "NODE_OPTIONS=--max_old_space_size=3072 NODE_ENV=development pnpm run build && pnpm run start", "dev:staging": "NODE_OPTIONS=--max_old_space_size=3072 NODE_ENV=development pnpm run build && pnpm run start",
"lint": "pnpm -r --parallel run lint", "lint": "pnpm -r --parallel run lint",
"debug": "pnpm run build:debug && pnpm run start", "debug": "pnpm run build:debug && pnpm run start",
@ -32,28 +29,24 @@
"clean": "pnpm node ./scripts/clean-built.mjs", "clean": "pnpm node ./scripts/clean-built.mjs",
"clean-npm": "pnpm node ./scripts/clean-npm.mjs", "clean-npm": "pnpm node ./scripts/clean-npm.mjs",
"clean-cargo": "pnpm node ./scripts/clean-cargo.mjs", "clean-cargo": "pnpm node ./scripts/clean-cargo.mjs",
"clean-all": "pnpm run clean && pnpm run clean-cargo && pnpm run clean-npm", "clean-all": "pnpm run clean && pnpm run clean-cargo && pnpm run clean-npm"
"entities": "pnpm node ./scripts/regenerate-sea-orm-entities.mjs"
}, },
"dependencies": { "dependencies": {
"js-yaml": "4.1.0", "js-yaml": "4.1.0",
"gulp": "4.0.2", "gulp": "4.0.2",
"gulp-cssnano": "2.1.3", "gulp-cssnano": "2.1.3",
"gulp-rename": "2.0.0",
"gulp-replace": "1.1.4", "gulp-replace": "1.1.4",
"gulp-terser": "2.1.0" "gulp-terser": "2.1.0"
}, },
"devDependencies": { "devDependencies": {
"@biomejs/biome": "1.5.3", "@biomejs/biome": "1.6.2",
"@biomejs/cli-darwin-arm64": "^1.5.3", "@biomejs/cli-darwin-arm64": "^1.6.2",
"@biomejs/cli-darwin-x64": "^1.5.3", "@biomejs/cli-darwin-x64": "^1.6.2",
"@biomejs/cli-linux-arm64": "^1.5.3", "@biomejs/cli-linux-arm64": "^1.6.2",
"@biomejs/cli-linux-x64": "^1.5.3", "@biomejs/cli-linux-x64": "^1.6.2",
"@types/gulp": "4.0.17", "@types/node": "20.11.30",
"@types/gulp-rename": "2.0.6",
"@types/node": "20.11.21",
"execa": "8.0.1", "execa": "8.0.1",
"pnpm": "8.15.4", "pnpm": "8.15.5",
"typescript": "5.3.3" "typescript": "5.4.3"
} }
} }

File diff suppressed because it is too large Load diff

View file

@ -12,33 +12,31 @@ napi = ["dep:napi", "dep:napi-derive"]
crate-type = ["cdylib", "lib"] crate-type = ["cdylib", "lib"]
[dependencies] [dependencies]
async-trait = "0.1.75" async-trait = "0.1.78"
cfg-if = "1.0.0" cfg-if = "1.0.0"
chrono = "0.4.31" chrono = "0.4.35"
cuid2 = "0.1.2" cuid2 = "0.1.2"
derive_more = "0.99.17"
jsonschema = "0.17.1" jsonschema = "0.17.1"
once_cell = "1.19.0" once_cell = "1.19.0"
parse-display = "0.8.2" parse-display = "0.8.2"
rand = "0.8.5" rand = "0.8.5"
schemars = { version = "0.8.16", features = ["chrono"] } schemars = { version = "0.8.16", features = ["chrono"] }
sea-orm = { version = "0.12.10", features = ["sqlx-postgres", "runtime-tokio-rustls"] } sea-orm = { version = "0.12.15", features = ["sqlx-postgres", "runtime-tokio-rustls"] }
serde = { version = "1.0.193", features = ["derive"] } serde = { version = "1.0.197", features = ["derive"] }
serde_json = "1.0.108" serde_json = "1.0.114"
thiserror = "1.0.52" thiserror = "1.0.58"
tokio = { version = "1.35.1", features = ["full"] } tokio = { version = "1.36.0", features = ["full"] }
utoipa = "4.1.0"
# Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix # Default enable napi4 feature, see https://nodejs.org/api/n-api.html#node-api-version-matrix
napi = { version = "2.14.1", default-features = false, features = ["napi6", "tokio_rt"], optional = true } napi = { version = "2.16.0", default-features = false, features = ["napi9", "tokio_rt"], optional = true }
napi-derive = { version = "2.14.5", optional = true } napi-derive = { version = "2.16.0", optional = true }
basen = "0.1.0" basen = "0.1.0"
[dev-dependencies] [dev-dependencies]
pretty_assertions = "1.4.0" pretty_assertions = "1.4.0"
[build-dependencies] [build-dependencies]
napi-build = "2.1.0" napi-build = "2.1.2"
[profile.release] [profile.release]
lto = true lto = true

View file

@ -0,0 +1,11 @@
.PHONY: regenerate-entities
regenerate-entities:
sea-orm-cli generate entity \
--output-dir='src/model/entity' \
--database-url='postgres://$(POSTGRES_USER):$(POSTGRES_PASSWORD)@localhost:25432/$(POSTGRES_DB)'
index.js:
NODE_OPTIONS='--max_old_space_size=3072' pnpm run build:debug
[ -f built/index.js ]
rm --force index.js
cp built/index.js index.js

View file

@ -0,0 +1,305 @@
/* tslint:disable */
/* eslint-disable */
/* prettier-ignore */
/* auto-generated by NAPI-RS */
const { existsSync, readFileSync } = require('fs')
const { join } = require('path')
const { platform, arch } = process
let nativeBinding = null
let localFileExisted = false
let loadError = null
function isMusl() {
// For Node 10
if (!process.report || typeof process.report.getReport !== 'function') {
try {
const lddPath = require('child_process').execSync('which ldd').toString().trim()
return readFileSync(lddPath, 'utf8').includes('musl')
} catch (e) {
return true
}
} else {
const { glibcVersionRuntime } = process.report.getReport().header
return !glibcVersionRuntime
}
}
switch (platform) {
case 'android':
switch (arch) {
case 'arm64':
localFileExisted = existsSync(join(__dirname, 'backend-rs.android-arm64.node'))
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.android-arm64.node')
} else {
nativeBinding = require('backend-rs-android-arm64')
}
} catch (e) {
loadError = e
}
break
case 'arm':
localFileExisted = existsSync(join(__dirname, 'backend-rs.android-arm-eabi.node'))
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.android-arm-eabi.node')
} else {
nativeBinding = require('backend-rs-android-arm-eabi')
}
} catch (e) {
loadError = e
}
break
default:
throw new Error(`Unsupported architecture on Android ${arch}`)
}
break
case 'win32':
switch (arch) {
case 'x64':
localFileExisted = existsSync(
join(__dirname, 'backend-rs.win32-x64-msvc.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.win32-x64-msvc.node')
} else {
nativeBinding = require('backend-rs-win32-x64-msvc')
}
} catch (e) {
loadError = e
}
break
case 'ia32':
localFileExisted = existsSync(
join(__dirname, 'backend-rs.win32-ia32-msvc.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.win32-ia32-msvc.node')
} else {
nativeBinding = require('backend-rs-win32-ia32-msvc')
}
} catch (e) {
loadError = e
}
break
case 'arm64':
localFileExisted = existsSync(
join(__dirname, 'backend-rs.win32-arm64-msvc.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.win32-arm64-msvc.node')
} else {
nativeBinding = require('backend-rs-win32-arm64-msvc')
}
} catch (e) {
loadError = e
}
break
default:
throw new Error(`Unsupported architecture on Windows: ${arch}`)
}
break
case 'darwin':
localFileExisted = existsSync(join(__dirname, 'backend-rs.darwin-universal.node'))
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.darwin-universal.node')
} else {
nativeBinding = require('backend-rs-darwin-universal')
}
break
} catch {}
switch (arch) {
case 'x64':
localFileExisted = existsSync(join(__dirname, 'backend-rs.darwin-x64.node'))
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.darwin-x64.node')
} else {
nativeBinding = require('backend-rs-darwin-x64')
}
} catch (e) {
loadError = e
}
break
case 'arm64':
localFileExisted = existsSync(
join(__dirname, 'backend-rs.darwin-arm64.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.darwin-arm64.node')
} else {
nativeBinding = require('backend-rs-darwin-arm64')
}
} catch (e) {
loadError = e
}
break
default:
throw new Error(`Unsupported architecture on macOS: ${arch}`)
}
break
case 'freebsd':
if (arch !== 'x64') {
throw new Error(`Unsupported architecture on FreeBSD: ${arch}`)
}
localFileExisted = existsSync(join(__dirname, 'backend-rs.freebsd-x64.node'))
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.freebsd-x64.node')
} else {
nativeBinding = require('backend-rs-freebsd-x64')
}
} catch (e) {
loadError = e
}
break
case 'linux':
switch (arch) {
case 'x64':
if (isMusl()) {
localFileExisted = existsSync(
join(__dirname, 'backend-rs.linux-x64-musl.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.linux-x64-musl.node')
} else {
nativeBinding = require('backend-rs-linux-x64-musl')
}
} catch (e) {
loadError = e
}
} else {
localFileExisted = existsSync(
join(__dirname, 'backend-rs.linux-x64-gnu.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.linux-x64-gnu.node')
} else {
nativeBinding = require('backend-rs-linux-x64-gnu')
}
} catch (e) {
loadError = e
}
}
break
case 'arm64':
if (isMusl()) {
localFileExisted = existsSync(
join(__dirname, 'backend-rs.linux-arm64-musl.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.linux-arm64-musl.node')
} else {
nativeBinding = require('backend-rs-linux-arm64-musl')
}
} catch (e) {
loadError = e
}
} else {
localFileExisted = existsSync(
join(__dirname, 'backend-rs.linux-arm64-gnu.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.linux-arm64-gnu.node')
} else {
nativeBinding = require('backend-rs-linux-arm64-gnu')
}
} catch (e) {
loadError = e
}
}
break
case 'arm':
localFileExisted = existsSync(
join(__dirname, 'backend-rs.linux-arm-gnueabihf.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.linux-arm-gnueabihf.node')
} else {
nativeBinding = require('backend-rs-linux-arm-gnueabihf')
}
} catch (e) {
loadError = e
}
break
case 'riscv64':
if (isMusl()) {
localFileExisted = existsSync(
join(__dirname, 'backend-rs.linux-riscv64-musl.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.linux-riscv64-musl.node')
} else {
nativeBinding = require('backend-rs-linux-riscv64-musl')
}
} catch (e) {
loadError = e
}
} else {
localFileExisted = existsSync(
join(__dirname, 'backend-rs.linux-riscv64-gnu.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.linux-riscv64-gnu.node')
} else {
nativeBinding = require('backend-rs-linux-riscv64-gnu')
}
} catch (e) {
loadError = e
}
}
break
case 's390x':
localFileExisted = existsSync(
join(__dirname, 'backend-rs.linux-s390x-gnu.node')
)
try {
if (localFileExisted) {
nativeBinding = require('./backend-rs.linux-s390x-gnu.node')
} else {
nativeBinding = require('backend-rs-linux-s390x-gnu')
}
} catch (e) {
loadError = e
}
break
default:
throw new Error(`Unsupported architecture on Linux: ${arch}`)
}
break
default:
throw new Error(`Unsupported OS: ${platform}, architecture: ${arch}`)
}
if (!nativeBinding) {
if (loadError) {
throw loadError
}
throw new Error(`Failed to load native binding`)
}
const { nativeRandomStr, IdConvertType, convertId, nativeGetTimestamp, nativeCreateId, nativeInitIdGenerator } = nativeBinding
module.exports.nativeRandomStr = nativeRandomStr
module.exports.IdConvertType = IdConvertType
module.exports.convertId = convertId
module.exports.nativeGetTimestamp = nativeGetTimestamp
module.exports.nativeCreateId = nativeCreateId
module.exports.nativeInitIdGenerator = nativeInitIdGenerator

View file

@ -21,10 +21,9 @@
] ]
} }
}, },
"license": "MIT",
"devDependencies": { "devDependencies": {
"@napi-rs/cli": "2.18.0", "@napi-rs/cli": "2.18.0",
"ava": "6.1.1" "ava": "6.1.2"
}, },
"ava": { "ava": {
"timeout": "3m" "timeout": "3m"

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use super::sea_orm_active_enums::AntennaSrcEnum; use super::sea_orm_active_enums::AntennaSrcEnum;
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

View file

@ -1,4 +1,4 @@
//! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.12 //! `SeaORM` Entity. Generated by sea-orm-codegen 0.12.15
use sea_orm::entity::prelude::*; use sea_orm::entity::prelude::*;

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