diff --git a/.config/docker_example.yml b/.config/docker_example.yml
index f8124bc9df..af0a90dc95 100644
--- a/.config/docker_example.yml
+++ b/.config/docker_example.yml
@@ -51,6 +51,23 @@ db:
#extra:
# ssl: true
+dbReplications: false
+
+# You can configure any number of replicas here
+#dbSlaves:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+
# ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────
@@ -62,6 +79,22 @@ redis:
#prefix: example-prefix
#db: 1
+#redisForPubsub:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
+#redisForJobQueue:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
# ┌─────────────────────────────┐
#───┘ Elasticsearch configuration └─────────────────────────────
diff --git a/.config/example.yml b/.config/example.yml
index 92b8726623..57e2b56b78 100644
--- a/.config/example.yml
+++ b/.config/example.yml
@@ -51,6 +51,23 @@ db:
#extra:
# ssl: true
+dbReplications: false
+
+# You can configure any number of replicas here
+#dbSlaves:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+
# ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────
@@ -62,6 +79,22 @@ redis:
#prefix: example-prefix
#db: 1
+#redisForPubsub:
+# host: localhost
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
+#redisForJobQueue:
+# host: localhost
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
# ┌─────────────────────────────┐
#───┘ Elasticsearch configuration └─────────────────────────────
diff --git a/.devcontainer/devcontainer.yml b/.devcontainer/devcontainer.yml
index 8a363a15dc..2af306e3da 100644
--- a/.devcontainer/devcontainer.yml
+++ b/.devcontainer/devcontainer.yml
@@ -51,6 +51,23 @@ db:
#extra:
# ssl: true
+dbReplications: false
+
+# You can configure any number of replicas here
+#dbSlaves:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+
# ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────
@@ -62,6 +79,22 @@ redis:
#prefix: example-prefix
#db: 1
+#redisForPubsub:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
+#redisForJobQueue:
+# host: redis
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
# ┌─────────────────────────────┐
#───┘ Elasticsearch configuration └─────────────────────────────
diff --git a/.github/workflows/api-misskey-js.yml b/.github/workflows/api-misskey-js.yml
new file mode 100644
index 0000000000..6411d63bd5
--- /dev/null
+++ b/.github/workflows/api-misskey-js.yml
@@ -0,0 +1,36 @@
+name: API report (misskey.js)
+
+on: [push, pull_request]
+
+jobs:
+ report:
+
+ runs-on: ubuntu-latest
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3.3.0
+
+ - run: corepack enable
+
+ - name: Setup Node.js
+ uses: actions/setup-node@v3.6.0
+ with:
+ node-version: 18.x
+ cache: 'pnpm'
+
+ - name: Install dependencies
+ run: pnpm i --frozen-lockfile
+
+ - name: Build
+ run: pnpm --filter misskey-js build
+
+ - name: Check files
+ run: ls packages/misskey-js/built
+
+ - name: API report
+ run: pnpm --filter misskey-js api-prod
+
+ - name: Show report
+ if: always()
+ run: cat packages/misskey-js/temp/misskey-js.api.md
diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml
index d65076ebb2..1c6615e17f 100644
--- a/.github/workflows/lint.yml
+++ b/.github/workflows/lint.yml
@@ -36,6 +36,7 @@ jobs:
- backend
- frontend
- sw
+ - misskey-js
steps:
- uses: actions/checkout@v3.3.0
with:
@@ -61,6 +62,7 @@ jobs:
matrix:
workspace:
- backend
+ - misskey-js
steps:
- uses: actions/checkout@v3.3.0
with:
diff --git a/.github/workflows/storybook.yml b/.github/workflows/storybook.yml
new file mode 100644
index 0000000000..6792674d9f
--- /dev/null
+++ b/.github/workflows/storybook.yml
@@ -0,0 +1,74 @@
+name: Storybook
+
+on:
+ push:
+ branches-ignore:
+ - l10n_develop
+
+jobs:
+ build:
+ runs-on: ubuntu-latest
+
+ env:
+ NODE_OPTIONS: "--max_old_space_size=7168"
+
+ steps:
+ - uses: actions/checkout@v3.3.0
+ with:
+ fetch-depth: 0
+ submodules: true
+ - name: Install pnpm
+ uses: pnpm/action-setup@v2
+ with:
+ version: 7
+ run_install: false
+ - name: Use Node.js 18.x
+ uses: actions/setup-node@v3.6.0
+ with:
+ node-version: 18.x
+ cache: 'pnpm'
+ - run: corepack enable
+ - run: pnpm i --frozen-lockfile
+ - name: Check pnpm-lock.yaml
+ run: git diff --exit-code pnpm-lock.yaml
+ - name: Build misskey-js
+ run: pnpm --filter misskey-js build
+ - name: Build storybook
+ run: pnpm --filter frontend build-storybook
+ - name: Publish to Chromatic
+ if: github.ref == 'refs/heads/master'
+ run: pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static
+ env:
+ CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
+ - name: Publish to Chromatic
+ if: github.ref != 'refs/heads/master'
+ id: chromatic
+ run: |
+ DIFF="${{ github.event.before }} HEAD"
+ if [ "$DIFF" = "0000000000000000000000000000000000000000 HEAD" ]; then
+ DIFF="HEAD"
+ fi
+ CHROMATIC_PARAMETER="$(node packages/frontend/.storybook/changes.js $(git diff-tree --no-commit-id --name-only -r $(echo "$DIFF") | xargs))"
+ if [ "$CHROMATIC_PARAMETER" = " --skip" ]; then
+ echo "skip=true" >> $GITHUB_OUTPUT
+ fi
+ pnpm --filter frontend chromatic --exit-once-uploaded -d storybook-static $(echo "$CHROMATIC_PARAMETER")
+ env:
+ CHROMATIC_PROJECT_TOKEN: ${{ secrets.CHROMATIC_PROJECT_TOKEN }}
+ - name: Notify that Chromatic will skip testing
+ uses: actions/github-script@v6.4.0
+ if: github.ref != 'refs/heads/master' && github.ref != 'refs/heads/develop' && steps.chromatic.outputs.skip == 'true'
+ with:
+ github-token: ${{ secrets.GITHUB_TOKEN }}
+ script: |
+ github.rest.repos.createCommitComment({
+ owner: context.repo.owner,
+ repo: context.repo.repo,
+ commit_sha: context.sha,
+ body: 'Chromatic will skip testing but you may still have to [review the changes on Chromatic](https://www.chromatic.com/pullrequests?appId=6428f7d7b962f0b79f97d6e4).'
+ })
+ - name: Upload Artifacts
+ uses: actions/upload-artifact@v3
+ with:
+ name: storybook
+ path: packages/frontend/storybook-static
diff --git a/.github/workflows/test-backend.yml b/.github/workflows/test-backend.yml
index 44b6b4ba7e..f1e414dbbc 100644
--- a/.github/workflows/test-backend.yml
+++ b/.github/workflows/test-backend.yml
@@ -24,7 +24,7 @@ jobs:
POSTGRES_DB: test-misskey
POSTGRES_HOST_AUTH_METHOD: trust
redis:
- image: redis:6
+ image: redis:7
ports:
- 56312:6379
diff --git a/.github/workflows/test-frontend.yml b/.github/workflows/test-frontend.yml
index 18c1a31aee..a5505d30d8 100644
--- a/.github/workflows/test-frontend.yml
+++ b/.github/workflows/test-frontend.yml
@@ -63,7 +63,7 @@ jobs:
POSTGRES_DB: test-misskey
POSTGRES_HOST_AUTH_METHOD: trust
redis:
- image: redis:6
+ image: redis:7
ports:
- 56312:6379
diff --git a/.github/workflows/test-misskey-js.yml b/.github/workflows/test-misskey-js.yml
new file mode 100644
index 0000000000..b15e704c7f
--- /dev/null
+++ b/.github/workflows/test-misskey-js.yml
@@ -0,0 +1,52 @@
+# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
+# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
+
+name: Test (misskey.js)
+
+on:
+ push:
+ branches: [ develop ]
+ pull_request:
+ branches: [ develop ]
+
+jobs:
+ test:
+
+ runs-on: ubuntu-latest
+
+ strategy:
+ matrix:
+ node-version: [18.x]
+ # See supported Node.js release schedule at https://nodejs.org/en/about/releases/
+
+ steps:
+ - name: Checkout
+ uses: actions/checkout@v3.3.0
+
+ - run: corepack enable
+
+ - name: Setup Node.js ${{ matrix.node-version }}
+ uses: actions/setup-node@v3.6.0
+ with:
+ node-version: ${{ matrix.node-version }}
+ cache: 'pnpm'
+
+ - name: Install dependencies
+ run: pnpm i --frozen-lockfile
+
+ - name: Check pnpm-lock.yaml
+ run: git diff --exit-code pnpm-lock.yaml
+
+ - name: Build
+ run: pnpm --filter misskey-js build
+
+ - name: Test
+ run: pnpm --filter misskey-js test
+ env:
+ CI: true
+
+ - name: Upload Coverage
+ uses: codecov/codecov-action@v3
+ with:
+ token: ${{ secrets.CODECOV_TOKEN }}
+ files: ./packages/misskey-js/coverage/coverage-final.json
diff --git a/.gitignore b/.gitignore
index c413cd4da9..fbe2245502 100644
--- a/.gitignore
+++ b/.gitignore
@@ -55,6 +55,8 @@ api-docs.json
.DS_Store
/files
ormconfig.json
+temp
+/packages/frontend/src/**/*.stories.ts
# blender backups
*.blend1
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 1c792b537b..adc9891746 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -12,7 +12,48 @@
-->
-## 13.10.3 (unreleased)
+## 13.11.0
+
+### NOTE
+- このバージョンからRedis 7.xが必要です。
+- アップデートを行うと全ての通知およびアンテナのノートはリセットされます。
+
+### General
+- チャンネルをお気に入りに登録できるように
+- チャンネルにノートをピン留めできるように
+
+### Client
+- 投稿フォームのデザインを改善
+- 検索ページでURLを入力した際に照会したときと同等の挙動をするように
+- ノートのリアクションを大きく表示するオプションを追加
+- ギャラリー一覧にメディア表示と同じように NSFW 設定を反映するように(ホバーで表示)
+- オブジェクトストレージの設定画面を分かりやすく
+- 広告・お知らせが新規登録時に増殖しないように
+- 「にゃああああああああああああああ!!!!!!!!!!!!」 (`isCat`) 有効時にアバターに表示される猫耳について挙動を変更
+ - 「UIにぼかし効果を使用」 (`useBlurEffect`) で次の挙動が有効になります
+ - 猫耳のアバター内部部分をぼかしでマスク表示してより猫耳っぽく見えるように
+ - 「UIのアニメーションを減らす」 (`reduceAnimation`) で猫耳を撫でられなくなります
+- Add Minimizing ("folding") of windows
+
+### Server
+- PostgreSQLのレプリケーション対応
+ - 設定ファイルの `dbReplications` および `dbSlaves` にて設定できます
+- イベント用Redisを別サーバーに分離できるように
+- ジョブキュー用Redisを別サーバーに分離できるように
+- サーバーの全体的なパフォーマンスを向上
+- ノート作成時のパフォーマンスを向上
+- アンテナのタイムライン取得時のパフォーマンスを向上
+- チャンネルのタイムライン取得時のパフォーマンスを向上
+- 通知に関する全体的なパフォーマンスを向上
+- webhookがcontent-type text/plain;charset=UTF-8 で飛んでくる問題を修正
+
+## 13.10.3
+
+### Changes
+- オブジェクトストレージのリージョン指定が必須になりました
+ - リージョンの指定の無いサービスは us-east-1 を設定してください
+ - 値が空の場合は設定ファイルまたは環境変数の使用を試みます
+ - e.g. ~/aws/config, AWS_REGION
### General
- コンディショナルロールの条件に「投稿数が~以下」「投稿数が~以上」を追加
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 887d17961f..fece05d7a9 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -203,6 +203,116 @@ niraxは、Misskeyで使用しているオリジナルのフロントエンド
vue-routerとの最大の違いは、niraxは複数のルーターが存在することを許可している点です。
これにより、アプリ内ウィンドウでブラウザとは個別にルーティングすることなどが可能になります。
+## Storybook
+
+Misskey uses [Storybook](https://storybook.js.org/) for UI development.
+
+### Setup & Run
+
+#### Universal
+
+##### Setup
+
+```bash
+pnpm --filter misskey-js build
+pnpm --filter frontend tsc -p .storybook && (node packages/frontend/.storybook/preload-locale.js & node packages/frontend/.storybook/preload-theme.js)
+```
+
+##### Run
+
+```bash
+node packages/frontend/.storybook/generate.js && pnpm --filter frontend storybook dev
+```
+
+#### macOS & Linux
+
+##### Setup
+
+```bash
+pnpm --filter misskey-js build
+```
+
+##### Run
+
+```bash
+pnpm --filter frontend storybook-dev
+```
+
+### Usage
+
+When you create a new component (in this example, `MyComponent.vue`), the story file (`MyComponent.stories.ts`) will be automatically generated by the `.storybook/generate.js` script.
+You can override the default story by creating a impl story file (`MyComponent.stories.impl.ts`).
+
+```ts
+/* eslint-disable @typescript-eslint/explicit-function-return-type */
+/* eslint-disable import/no-duplicates */
+import { StoryObj } from '@storybook/vue3';
+import MyComponent from './MyComponent.vue';
+export const Default = {
+ render(args) {
+ return {
+ components: {
+ MyComponent,
+ },
+ setup() {
+ return {
+ args,
+ };
+ },
+ computed: {
+ props() {
+ return {
+ ...this.args,
+ };
+ },
+ },
+ template: '',
+ };
+ },
+ args: {
+ foo: 'bar',
+ },
+ parameters: {
+ layout: 'centered',
+ },
+} satisfies StoryObj;
+```
+
+If you want to opt-out from the automatic generation, create a `MyComponent.stories.impl.ts` file and add the following line to the file.
+
+```ts
+import MyComponent from './MyComponent.vue';
+void MyComponent;
+```
+
+You can override the component meta by creating a meta story file (`MyComponent.stories.meta.ts`).
+
+```ts
+export const argTypes = {
+ scale: {
+ control: {
+ type: 'range',
+ min: 1,
+ max: 4,
+ },
+};
+```
+
+Also, you can use msw to mock API requests in the storybook. Creating a `MyComponent.stories.msw.ts` file to define the mock handlers.
+
+```ts
+import { rest } from 'msw';
+export const handlers = [
+ rest.post('/api/notes/timeline', (req, res, ctx) => {
+ return res(
+ ctx.json([]),
+ );
+ }),
+];
+```
+
+Don't forget to re-run the `.storybook/generate.js` script after adding, editing, or removing the above files.
+
## Notes
### How to resolve conflictions occurred at pnpm-lock.yaml?
diff --git a/Dockerfile b/Dockerfile
index fd0b5e1c9f..8db7400c9f 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -23,6 +23,7 @@ COPY --link ["scripts", "./scripts"]
COPY --link ["packages/backend/package.json", "./packages/backend/"]
COPY --link ["packages/frontend/package.json", "./packages/frontend/"]
COPY --link ["packages/sw/package.json", "./packages/sw/"]
+COPY --link ["packages/misskey-js/package.json", "./packages/misskey-js/"]
RUN --mount=type=cache,target=/root/.local/share/pnpm/store,sharing=locked \
pnpm i --frozen-lockfile --aggregate-output
diff --git a/README.md b/README.md
index c12882ca32..2aae4bb865 100644
--- a/README.md
+++ b/README.md
@@ -54,6 +54,25 @@ With Misskey's built in drive, you get cloud storage right in your social media,
Misskey Documentation can be found at [Misskey Hub](https://misskey-hub.net/), some of the links and graphics above also lead to specific portions of it.
## Sponsors
+
+
+## Thanks
+
+
+
+Thanks to [Chromatic](https://www.chromatic.com/) for providing the visual testing platform that helps us review UI changes and catch visual regressions.
+
+
+
+Thanks to [Codecov](https://about.codecov.io/for/open-source/) for providing the code coverage platform that helps us improve our test coverage.
+
+
+
+Thanks to [Crowdin](https://crowdin.com/) for providing the localization platform that helps us translate Misskey into many languages.
+
+
+
+Thanks to [Docker](https://hub.docker.com/) for providing the container platform that helps us run Misskey in production.
diff --git a/chart/files/default.yml b/chart/files/default.yml
index 4061ca3eb6..1888669245 100644
--- a/chart/files/default.yml
+++ b/chart/files/default.yml
@@ -72,16 +72,50 @@ db:
#extra:
# ssl: true
+dbReplications: false
+
+# You can configure any number of replicas here
+#dbSlaves:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+# -
+# host:
+# port:
+# db:
+# user:
+# pass:
+
# ┌─────────────────────┐
#───┘ Redis configuration └─────────────────────────────────────
redis:
host: localhost
port: 6379
+ #family: 0 # 0=Both, 4=IPv4, 6=IPv6
#pass: example-pass
#prefix: example-prefix
#db: 1
+#redisForPubsub:
+# host: localhost
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
+#redisForJobQueue:
+# host: localhost
+# port: 6379
+# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
+# #pass: example-pass
+# #prefix: example-prefix
+# #db: 1
+
# ┌─────────────────────────────┐
#───┘ Elasticsearch configuration └─────────────────────────────
diff --git a/locales/ar-SA.yml b/locales/ar-SA.yml
index c2910b90cd..4b9062051b 100644
--- a/locales/ar-SA.yml
+++ b/locales/ar-SA.yml
@@ -1277,4 +1277,3 @@ _deck:
_webhookSettings:
name: "الإسم"
active: "مفعّل"
-
diff --git a/locales/bn-BD.yml b/locales/bn-BD.yml
index 40af5a3326..734943960c 100644
--- a/locales/bn-BD.yml
+++ b/locales/bn-BD.yml
@@ -1356,4 +1356,3 @@ _deck:
_webhookSettings:
name: "নাম"
active: "চালু"
-
diff --git a/locales/ca-ES.yml b/locales/ca-ES.yml
index bc9e662493..2b1168f780 100644
--- a/locales/ca-ES.yml
+++ b/locales/ca-ES.yml
@@ -460,4 +460,3 @@ _deck:
list: "Llistes"
mentions: "Mencions"
direct: "Publicacions directes"
-
diff --git a/locales/cs-CZ.yml b/locales/cs-CZ.yml
index 4b59192474..19815c6f37 100644
--- a/locales/cs-CZ.yml
+++ b/locales/cs-CZ.yml
@@ -779,4 +779,3 @@ _deck:
_webhookSettings:
name: "Jméno"
active: "Zapnuto"
-
diff --git a/locales/da-DK.yml b/locales/da-DK.yml
index d1fbec9f67..08c15ed092 100644
--- a/locales/da-DK.yml
+++ b/locales/da-DK.yml
@@ -1,3 +1,2 @@
---
_lang_: "Dansk"
-
diff --git a/locales/de-DE.yml b/locales/de-DE.yml
index f6c28fbded..aa56493930 100644
--- a/locales/de-DE.yml
+++ b/locales/de-DE.yml
@@ -67,7 +67,7 @@ import: "Import"
export: "Export"
files: "Dateien"
download: "Herunterladen"
-driveFileDeleteConfirm: "Möchtest du die Datei „{name}“ wirklich löschen? Notizen mit dieser Datei werden ebenso verschwinden."
+driveFileDeleteConfirm: "Möchtest du die Datei „{name}“ wirklich löschen? Sie wird in allen Inhalten, die sie verwenden, auch verschwinden."
unfollowConfirm: "Möchtest du {name} wirklich nicht mehr folgen?"
exportRequested: "Du hast einen Export angefragt. Dies kann etwas Zeit in Anspruch nehmen. Sobald der Export abgeschlossen ist, wird er deiner Drive hinzugefügt."
importRequested: "Du hast einen Import angefragt. Dies kann etwas Zeit in Anspruch nehmen."
@@ -460,7 +460,7 @@ aboutX: "Über {x}"
emojiStyle: "Emoji-Stil"
native: "Nativ"
disableDrawer: "Keine ausfahrbaren Menüs verwenden"
-showNoteActionsOnlyHover: "Aktionen für Notizen nur bei Mouseover anzeigen"
+showNoteActionsOnlyHover: "Notizmenü nur bei Mouseover anzeigen"
noHistory: "Kein Verlauf gefunden"
signinHistory: "Anmeldungsverlauf"
enableAdvancedMfm: "Erweitertes MFM aktivieren"
@@ -500,12 +500,13 @@ objectStoragePrefixDesc: "Dateien werden in Ordnern unter diesem Prefix gespeich
objectStorageEndpoint: "Endpoint"
objectStorageEndpointDesc: "Im Falle von S3 leerlassen, für andere Anbieter den relevanten Endpoint im Format „“ oder „:“ angeben."
objectStorageRegion: "Region"
-objectStorageRegionDesc: "Gib eine Region wie z.B. „xx-east-1“ an. Falls dein Anbieter nicht zwischen Regionen unterscheidet, lass dieses Feld leer oder gib „us-east-1“ an."
+objectStorageRegionDesc: "Gib eine Region wie z.B. „xx-east-1“ an. Falls dein Anbieter nicht zwischen Regionen unterscheidet, gib „us-east-1“ an. Lasse es leer bei Verwendung von AWS Konfigurationsdateien oder Umgebungsvariablen."
objectStorageUseSSL: "SSL verwenden"
objectStorageUseSSLDesc: "Deaktiviere dies, falls du für API-Verbindungen kein HTTPS verwenden wirst"
objectStorageUseProxy: "Über Proxy verbinden"
objectStorageUseProxyDesc: "Deaktiviere dies, falls du für Verbindungen zur API keinen Proxy verwenden wirst"
objectStorageSetPublicRead: "Bei Upload auf \"public-read\" stellen"
+s3ForcePathStyleDesc: "Ist s3ForcePathStyle aktiviert, so muss der Bucketname nicht im Hostnamen der URL, sondern im Pfad der URL angeben werden. Diese Option muss eventuell aktiviert werden, wenn Dienste wie z.B. eine selbstbetriebene Minio-Instanz verwendet werden."
serverLogs: "Serverprotokolle"
deleteAll: "Alle löschen"
showFixedPostForm: "Bereich zum Schreiben neuer Notizen am Anfang der Chronik anzeigen"
@@ -919,6 +920,7 @@ pushNotificationNotSupported: "Entweder dein Browser oder deine Instanz unterst
sendPushNotificationReadMessage: "Push-Benachrichtigungen löschen, sobald die relevanten Benachrichtigungen oder Nachrichten gelesen wurden"
sendPushNotificationReadMessageCaption: "Eine Push-Benachrichtigungen mit dem Inhalt \"{emptyPushNotificationMessage}\" wird kurz eingeblendet. Dies kann gegebenenfalls den Batterieverbrauch deines Gerätes erhöhen."
windowMaximize: "Maximieren"
+windowMinimize: "Minimieren"
windowRestore: "Wiederherstellen"
caption: "Beschreibung"
loggedInAsBot: "Momentan als Bot angemeldet"
@@ -960,7 +962,9 @@ copyErrorInfo: "Fehlerdetails kopieren"
joinThisServer: "Bei dieser Instanz registrieren"
exploreOtherServers: "Eine andere Instanz finden"
letsLookAtTimeline: "Die Chronik durchstöbern"
-disableFederationWarn: "Dies deaktiviert Föderation, aber alle Notizen bleiben, sofern nicht umgestellt, öffentlich. In den meisten Fällen wird diese Option nicht benötigt."
+disableFederationConfirm: "Föderation wirklich deaktivieren?"
+disableFederationConfirmWarn: "Auch mit deaktivierter Föderation bleiben Notizen, sofern nicht umgestellt, öffentlich. In den meisten Fällen wird dies nicht benötigt."
+disableFederationOk: "Deaktivieren"
invitationRequiredToRegister: "Diese Instanz ist einladungsbasiert. Du musst einen validen Einladungscode eingeben, um dich zu registrieren."
emailNotSupported: "Diese Instanz unterstützt das Versenden von Emails nicht"
postToTheChannel: "In Kanal senden"
@@ -980,6 +984,21 @@ drivecleaner: "Drive-Reiniger"
retryAllQueuesNow: "Sofort Warteschlangen erneut ausführen"
retryAllQueuesConfirmTitle: "Wirklich erneut versuchen?"
retryAllQueuesConfirmText: "Dies wird zu einer temporären Erhöhung der Serverlast führen."
+enableChartsForRemoteUser: "Diagramme für Nutzer fremder Instanzen erstellen"
+enableChartsForFederatedInstances: "Diagramme für fremde Instanzen erstellen"
+showClipButtonInNoteFooter: "\"Clip\" zum Notizmenu hinzufügen"
+largeNoteReactions: "Reaktionen vergrößert anzeigen"
+noteIdOrUrl: "Notiz-ID oder URL"
+accountMigration: "Konto-Umzug"
+accountMoved: "Dieser Benutzer ist zu einem neuen Konto umgezogen:"
+_accountMigration:
+ moveTo: "Dieses Konto zu einem neuen umziehen"
+ moveToLabel: "Umzugsziel:"
+ moveAccountDescription: "Ein Umzug kann nicht rückgängig gemacht werden. Stelle zuerst sicher, dass du auf dem Umzugsziel einen Alias erstellt hast. Gib dann das Umzugsziel in folgendem Format ein: @person@instance.com"
+ moveFrom: "Von einem anderen Konto zu diesem umziehen"
+ moveFromLabel: "Umzugsursprung:"
+ moveFromDescription: "Stelle sicher, dass du auf dem Umzugsursprungskonto einen Alias zu diesem Konto erstellt hast, falls du die Follower des Ursprungskontos übertragen möchtest. Dies muss vor dem Umzug geschehen! Gib dann das Ursprungskonto in folgendem Format an: @person@instance.com"
+ migrationConfirm: "Dieses Konto wirklich zu {account} umziehen? Sobald der Umzug beginnt, kann er nicht rückgängig gemacht werden, und dieses Konto nicht wieder im ursprünglichen Zustand verwendet werden.\n\nÜberprüfe zusätzlich, dass du auf dem Umzugsziel einen Alias eingerichtet hast."
_achievements:
earnedAt: "Freigeschaltet am"
_types:
@@ -1252,7 +1271,7 @@ _role:
gtlAvailable: "Kann auf die globale Chronik zugreifen"
ltlAvailable: "Kann auf die lokale Chronik zugreifen"
canPublicNote: "Kann öffentliche Notizen erstellen"
- canInvite: "Kann Einladungscodes für diese Instanz erstellen"
+ canInvite: "Erstellung von Einladungscodes für diese Instanz"
canManageCustomEmojis: "Benutzerdefinierte Emojis verwalten"
driveCapacity: "Drive-Kapazität"
pinMax: "Maximale Anzahl an angehefteten Notizen"
@@ -1405,7 +1424,7 @@ _instanceMute:
instanceMuteDescription: "Schaltet alle Notizen/Renotes stumm, die von den gelisteten Instanzen stammen, inklusive Antworten von Benutzern an einen Benutzer einer stummgeschalteten Instanz."
instanceMuteDescription2: "Instanzen getrennt durch Zeilenumbrüchen angeben"
title: "Blendet Notizen von stummgeschalteten Instanzen aus."
- heading: "Liste der stummzuschaltenden Instanzen"
+ heading: "Stummzuschaltende Instanzen"
_theme:
explore: "Farbschemata erforschen"
install: "Farbschemata installieren"
@@ -1877,6 +1896,16 @@ _drivecleaner:
orderBySizeDesc: "Absteigende Dateigrößen"
orderByCreatedAtAsc: "Aufsteigendes Erstelldatum"
_webhookSettings:
+ createWebhook: "Webhook erstellen"
name: "Name"
+ secret: "Secret"
+ events: "Webhook-Ereignisse"
active: "Aktiviert"
-
+ _events:
+ follow: "Wenn du jemandem folgst"
+ followed: "Wenn dir jemand folgt"
+ note: "Wenn du eine Notiz schickst"
+ reply: "Wenn du eine Antwort erhältst"
+ renote: "Wenn du ein Renote erhältst"
+ reaction: "Wenn du eine Reaktion erhältst"
+ mention: "Wenn du erwähnt wirst"
diff --git a/locales/el-GR.yml b/locales/el-GR.yml
index 634e36c29e..32964e9982 100644
--- a/locales/el-GR.yml
+++ b/locales/el-GR.yml
@@ -394,4 +394,3 @@ _deck:
mentions: "Επισημάνσεις"
_webhookSettings:
name: "Όνομα"
-
diff --git a/locales/en-US.yml b/locales/en-US.yml
index 6489919e8a..4b8ec86224 100644
--- a/locales/en-US.yml
+++ b/locales/en-US.yml
@@ -506,6 +506,7 @@ objectStorageUseSSLDesc: "Turn this off if you are not going to use HTTPS for AP
objectStorageUseProxy: "Connect over Proxy"
objectStorageUseProxyDesc: "Turn this off if you are not going to use a Proxy for API connections"
objectStorageSetPublicRead: "Set \"public-read\" on upload"
+s3ForcePathStyleDesc: "If s3ForcePathStyle is enabled, the bucket name has to included in the path of the URL as opposed to the hostname of the URL. You may need to enable this setting when using services such as a self-hosted Minio instance."
serverLogs: "Server logs"
deleteAll: "Delete all"
showFixedPostForm: "Display the posting form at the top of the timeline"
@@ -919,6 +920,7 @@ pushNotificationNotSupported: "Your browser or instance does not support push no
sendPushNotificationReadMessage: "Delete push notifications once the relevant notifications or messages have been read"
sendPushNotificationReadMessageCaption: "A notification containing the text \"{emptyPushNotificationMessage}\" will be displayed for a short time. This may increase the battery usage of your device, if applicable."
windowMaximize: "Maximize"
+windowMinimize: "Minimize"
windowRestore: "Restore"
caption: "Caption"
loggedInAsBot: "Currently logged in as bot"
@@ -960,7 +962,9 @@ copyErrorInfo: "Copy error details"
joinThisServer: "Sign up at this instance"
exploreOtherServers: "Look for another instance"
letsLookAtTimeline: "Have a look at the timeline"
-disableFederationWarn: "This will disable federation, but posts will continue to be public unless set otherwise. You usually do not need to use this setting."
+disableFederationConfirm: "Really disable federation?"
+disableFederationConfirmWarn: "Even if defederated, posts will continue to be public unless set otherwise. You usually do not need to do this."
+disableFederationOk: "Disable"
invitationRequiredToRegister: "This instance is invite-only. You must enter a valid invite code sign up."
emailNotSupported: "This instance does not support sending emails"
postToTheChannel: "Post to channel"
@@ -983,6 +987,19 @@ retryAllQueuesConfirmText: "This will temporarily increase the server load."
enableChartsForRemoteUser: "Generate remote user data charts"
enableChartsForFederatedInstances: "Generate remote instance data charts"
showClipButtonInNoteFooter: "Add \"Clip\" to note action menu"
+largeNoteReactions: "Enlargen displayed reactions"
+noteIdOrUrl: "Note ID or URL"
+accountMigration: "Account Migration"
+accountMoved: "This user has moved to a new account:"
+_accountMigration:
+ moveTo: "Migrate this account to a different one"
+ moveToLabel: "Account to move to:"
+ moveAccountDescription: "This action is irreversible. First, create an alias for this account on the account you wish to move to. Then, enter the account to move to in the following format: @person@instance.com"
+ moveFrom: "Migrate another account to this one"
+ moveFromLabel: "Account to move from:"
+ moveFromDescription: "Create an alias for the account to move from on this account if you wish to transfer its followers. This has to be done before the transfer! Then, enter the account to move to in the following format: @person@instance.com"
+ migrationConfirm: "Really migrate this account to {account}? Once started, this process cannot be stopped or taken back, and you will not be able to use this account in its original state anymore.\n\nAlso, confirm you've created an alias at the account to migrate to."
+
_achievements:
earnedAt: "Unlocked at"
_types:
@@ -1893,4 +1910,3 @@ _webhookSettings:
renote: "When renoted"
reaction: "When receiving a reaction"
mention: "When being mentioned"
-
diff --git a/locales/es-ES.yml b/locales/es-ES.yml
index 70327c5eac..29cf9b3ec9 100644
--- a/locales/es-ES.yml
+++ b/locales/es-ES.yml
@@ -506,6 +506,7 @@ objectStorageUseSSLDesc: "Desactive esto si no va a usar HTTPS para la conexión
objectStorageUseProxy: "Conectarse a través de Proxy"
objectStorageUseProxyDesc: "Desactive esto si no va a usar Proxy para la conexión de Almacenamiento de objetos"
objectStorageSetPublicRead: "Seleccionar \"public-read\" al subir "
+s3ForcePathStyleDesc: "Si s3ForcePathStyle esta habilitado el nombre del bucket debe ser especificado como parte de la URL en lugar del nombre de host en la URL. Puede ser necesario activar esta opción cuando se utilice, por ejemplo, Minio en un servidor propio."
serverLogs: "Registros del servidor"
deleteAll: "Eliminar todos"
showFixedPostForm: "Mostrar el formulario de las entradas encima de la línea de tiempo"
@@ -919,6 +920,7 @@ pushNotificationNotSupported: "El navegador o la instancia no admiten notificaci
sendPushNotificationReadMessage: "Eliminar las notificaciones push después de leer las notificaciones y los mensajes"
sendPushNotificationReadMessageCaption: "La notificación \"{emptyPushNotificationMessage}\" aparecerá momentáneamente. Esto puede aumentar el consumo de batería del dispositivo."
windowMaximize: "Maximizar"
+windowMinimize: "Minimizar"
windowRestore: "Regresar"
caption: "Pie de foto"
loggedInAsBot: "Inicio sesión como cuenta bot."
@@ -960,7 +962,9 @@ copyErrorInfo: "Copiar detalles del error"
joinThisServer: "Registrarse en esta instancia"
exploreOtherServers: "Buscar otra instancia"
letsLookAtTimeline: "Mirar la línea de tiempo local"
-disableFederationWarn: "Esto desactivará la federación, pero las publicaciones segurán siendo públicas al menos que se configure diferente. Usualmente no necesitas usar esta configuración."
+disableFederationConfirm: "¿Estas seguro que quieres desactivar la federación?"
+disableFederationConfirmWarn: "Aunque no exista federación los posts no serán marcados como privados. En la mayoría de los casos, no es necesario hacer los posts no federar."
+disableFederationOk: "Desactivar."
invitationRequiredToRegister: "Esta instancia está configurada sólo por invitación, tienes que ingresar un código de invitación válido."
emailNotSupported: "Esta instancia no soporta el envío de correo electrónico"
postToTheChannel: "Publicar en el canal"
@@ -980,6 +984,21 @@ drivecleaner: "Limpiador del Drive"
retryAllQueuesNow: "Reintentar inmediatamente todas las colas"
retryAllQueuesConfirmTitle: "Desea ¿reintentar inmediatamente todas las colas?"
retryAllQueuesConfirmText: "La carga del servidor está incrementándose temporalmente "
+enableChartsForRemoteUser: "Generar gráficas de usuarios remotos."
+enableChartsForFederatedInstances: "Generar gráficos de servidores remotos"
+showClipButtonInNoteFooter: "Añadir \"Clip\" al menú de notas"
+largeNoteReactions: "Agrandar las reacciones de las notas"
+noteIdOrUrl: "ID o URL de la nota"
+accountMigration: "Migración de cuenta"
+accountMoved: "Este usuario se ha mudado a una nueva cuenta:"
+_accountMigration:
+ moveTo: "Mover esta cuenta a una nueva"
+ moveToLabel: "Cuenta destino:"
+ moveAccountDescription: "Esta operación no puede deshacerse. En primer lugar, asegúrese de haber creado un alias para esta cuenta en la cuenta a la que se va a trasladar. Después de crear el alias, introduzca la cuenta a la que se está trasladando de la siguiente manera: @person@instance.com"
+ moveFrom: "Trasladar de otra cuenta a ésta"
+ moveFromLabel: "Cuenta desde la que se realiza el traslado:"
+ moveFromDescription: "Si quieres transferir seguidores de otra cuenta a esta cuenta y trasladarlos, tendrás que crear un alias aquí. Asegúrate de crearlo antes de realizar el traslado. Introduce la cuenta desde la que estás moviendo los seguidores así: @person@instance.com"
+ migrationConfirm: "¿Estás seguro de que quieres mover esta cuenta a {account}? Una vez trasladada, no podrás deshacer el traslado y no podrás volver a utilizar la cuenta original.\n\nAdemás, compruebe que ha configurado un alias en el destino del traslado."
_achievements:
earnedAt: "Desbloqueado el"
_types:
@@ -1276,6 +1295,8 @@ _role:
followersMoreThanOrEq: "Tiene X o más seguidores"
followingLessThanOrEq: "Sigue X o menos cuentas"
followingMoreThanOrEq: "Sigue X o más cuentas"
+ notesLessThanOrEq: "El número de notas es inferior o igual a"
+ notesMoreThanOrEq: "El número de notas es superior o igual a"
and: "Condicional AND"
or: "Condicional OR"
not: "Condicional NOT"
@@ -1875,6 +1896,16 @@ _drivecleaner:
orderBySizeDesc: "Más grandes"
orderByCreatedAtAsc: "Más antiguos"
_webhookSettings:
+ createWebhook: "Crear Webhook"
name: "Nombre"
+ secret: "Secreto"
+ events: "Eventos de webhook"
active: "Activado"
-
+ _events:
+ follow: "Cuando se sigue a alguien"
+ followed: "Cuando se es seguido"
+ note: "Cuando se publica una nota"
+ reply: "Cuando se recibe una respuesta"
+ renote: "Cuando reciba un \"re-note\""
+ reaction: "Cuando se recibe una reacción"
+ mention: "Cuando hay una mención"
diff --git a/locales/fr-FR.yml b/locales/fr-FR.yml
index 11573e0ce0..e0767fdc09 100644
--- a/locales/fr-FR.yml
+++ b/locales/fr-FR.yml
@@ -1470,4 +1470,3 @@ _deck:
_webhookSettings:
name: "Nom"
active: "Activé"
-
diff --git a/locales/hr-HR.yml b/locales/hr-HR.yml
index cd21505a47..ed97d539c0 100644
--- a/locales/hr-HR.yml
+++ b/locales/hr-HR.yml
@@ -1,2 +1 @@
---
-
diff --git a/locales/ht-HT.yml b/locales/ht-HT.yml
index cd21505a47..ed97d539c0 100644
--- a/locales/ht-HT.yml
+++ b/locales/ht-HT.yml
@@ -1,2 +1 @@
---
-
diff --git a/locales/id-ID.yml b/locales/id-ID.yml
index e5a057477a..1272da9b3e 100644
--- a/locales/id-ID.yml
+++ b/locales/id-ID.yml
@@ -1806,4 +1806,3 @@ _deck:
_webhookSettings:
name: "Nama"
active: "Aktif"
-
diff --git a/locales/it-IT.yml b/locales/it-IT.yml
index ddd1e5e90a..01209b6fd4 100644
--- a/locales/it-IT.yml
+++ b/locales/it-IT.yml
@@ -170,7 +170,7 @@ proxyAccountDescription: "Un profilo proxy funziona come follower per i profili
host: "Server remoto"
selectUser: "Seleziona profilo"
recipient: "Destinatario"
-annotation: "Descrizione"
+annotation: "Annotazione"
federation: "Federazione"
instances: "Istanza"
registeredAt: "Registrato presso"
@@ -212,7 +212,7 @@ intro: "L'installazione di Misskey è terminata! Si prega di creare il profilo a
done: "Fine"
processing: "In elaborazione"
preview: "Anteprima"
-default: "Medio"
+default: "Predefinito"
defaultValueIs: "Predefinito: {value}"
noCustomEmojis: "Nessun emoji"
noJobs: "Nessun lavoro"
@@ -237,14 +237,14 @@ more: "Di più!"
featured: "Tendenze"
usernameOrUserId: "Nome utente o ID utente"
noSuchUser: "Nessun utente trovato"
-lookup: "Cerca"
+lookup: "Ricerca remota"
announcements: "Annunci"
imageUrl: "URL dell'immagine"
remove: "Elimina"
removed: "Eliminato con successo"
removeAreYouSure: "Vuoi davvero eliminare \"{x}\"?"
deleteAreYouSure: "Eliminare \"{x}\"?"
-resetAreYouSure: "Reimposta"
+resetAreYouSure: "Ripristinare?"
saved: "Salvato"
messaging: "Messaggi"
upload: "Carica"
@@ -409,7 +409,7 @@ lastUsedAt: "Uso più recente: {t}"
unregister: "Annulla l'iscrizione"
passwordLessLogin: "Accedi senza password"
passwordLessLoginDescription: "Accedi senza password, usando la chiave di sicurezza"
-resetPassword: "Reimposta password"
+resetPassword: "Ripristina la password"
newPasswordIs: "La tua nuova password è「{password}」"
reduceUiAnimation: "Ridurre le animazioni dell'interfaccia"
share: "Condividi"
@@ -596,7 +596,7 @@ notificationType: "Tipo di notifiche"
edit: "Modifica"
emailServer: "Server email"
enableEmail: "Abilita consegna email"
-emailConfigInfo: "Utilizzato per verificare il tuo indirizzo di posta elettronica e per reimpostare la tua password"
+emailConfigInfo: "Utilizzato per verificare il tuo indirizzo di posta elettronica e per ripristinare la password"
email: "Email"
emailAddress: "Indirizzo di posta elettronica"
smtpConfig: "Impostazioni del server SMTP"
@@ -960,16 +960,15 @@ copyErrorInfo: "Copia le informazioni sull'errore"
joinThisServer: "Registrati su questa istanza"
exploreOtherServers: "Trova altre istanze"
letsLookAtTimeline: "Sbircia la timeline"
-disableFederationWarn: "Disabilita la federazione. Questo cambiamento non rende le pubblicazioni private. Di solito non è necessario abilitare questa opzione."
-invitationRequiredToRegister: "L'accesso a questo nodo è solo ad invito. Devi inserire un codice d'invito valido. Puoi richiedere un codice all'amministratore."
+invitationRequiredToRegister: "L'accesso a questa istanza è solo ad invito. Può registrarsi solo chi ha un codice fornito dall'amministrazione."
emailNotSupported: "L'istanza non supporta l'invio di email"
-postToTheChannel: "Pubblica sul canale"
+postToTheChannel: "Pubblica nel canale"
cannotBeChangedLater: "Non sarà più modificabile"
reactionAcceptance: "Accettazione reazioni"
likeOnly: "Solo i Like"
likeOnlyForRemote: "Solo Like remoti"
rolesAssignedToMe: "I miei ruoli"
-resetPasswordConfirm: "Vuoi reimpostare la password?"
+resetPasswordConfirm: "Vuoi davvero ripristinare la password?"
sensitiveWords: "Parole sensibili"
sensitiveWordsDescription: "Imposta automaticamente \"Home\" alla visibilità delle Note che contengono una qualsiasi parola tra queste configurate. Puoi separarle per riga."
notesSearchNotAvailable: "Non è possibile cercare tra le Note."
@@ -980,6 +979,11 @@ drivecleaner: "Drive cleaner"
retryAllQueuesNow: "Ritenta di consumare tutte le code"
retryAllQueuesConfirmTitle: "Vuoi ritentare adesso?"
retryAllQueuesConfirmText: "Potrebbe sovraccaricare il server temporaneamente."
+enableChartsForRemoteUser: "Abilita i grafici per i profili remoti"
+enableChartsForFederatedInstances: "Abilita i grafici per le istanze federate"
+showClipButtonInNoteFooter: "Aggiungi il bottone Clip tra le azioni delle Note"
+largeNoteReactions: "Ingrandisci le reazioni"
+noteIdOrUrl: "ID della Nota o URL"
_achievements:
earnedAt: "Data di conseguimento"
_types:
@@ -1276,6 +1280,8 @@ _role:
followersMoreThanOrEq: "Ha più di N follower"
followingLessThanOrEq: "Segue N profili o meno"
followingMoreThanOrEq: "Segue N profili o più"
+ notesLessThanOrEq: "Conteggio Note inferiore o uguale a"
+ notesMoreThanOrEq: "Conteggio Note maggiore o uguale a"
and: "E"
or: "O"
not: "NON"
@@ -1314,8 +1320,8 @@ _ad:
hide: "Nascondi"
_forgotPassword:
enterEmail: "Inserisci l'indirizzo di posta elettronica che hai registrato nel tuo profilo. Il collegamento necessario per ripristinare la password verrà inviato a questo indirizzo."
- ifNoEmail: "Se nessun indirizzo e-mail è stato registrato, si prega di contattare l'amministratore·trice dell'istanza."
- contactAdmin: "Poiché questa istanza non permette l'utilizzo di una mail, si prega di contattare l'amministratore·trice dell'istanza per poter ripristinare la password."
+ ifNoEmail: "Se il tuo indirizzo email non risulta registrato, contatta l'amministrazione dell'istanza."
+ contactAdmin: "Poiché questa istanza non permette di impostare l'indirizzo mail, contatta l'amministrazione per ripristinare la password.\n"
_gallery:
my: "Le mie pubblicazioni"
liked: "Pubblicazioni che mi piacciono"
@@ -1870,11 +1876,21 @@ _dialog:
charactersBelow: "Sei al di sotto del minimo di {min} caratteri! ({corrente})"
_disabledTimeline:
title: "Timeline disabilitata"
- description: "Il tuo ruolo non ha i permessi per accedere a questa timeline"
+ description: "Il ruolo in cui sei non ti permette di leggere questa timeline"
_drivecleaner:
orderBySizeDesc: "Dal più grande al più piccolo"
orderByCreatedAtAsc: "Dal più vecchio al più recente"
_webhookSettings:
+ createWebhook: "Creazione Webhook"
name: "Nome"
+ secret: "Segreto"
+ events: "Quando eseguire il Webhook"
active: "Attivo"
-
+ _events:
+ follow: "Quando segui un profilo"
+ followed: "Quando ti segue un profilo"
+ note: "Quando pubblichi una Nota"
+ reply: "Quando rispondono ad una Nota"
+ renote: "Quando la Nota è Rinotata"
+ reaction: "Quando ricevo una reazione"
+ mention: "Quando mi menzionano"
diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml
index cf4ede30b6..32bf47c209 100644
--- a/locales/ja-JP.yml
+++ b/locales/ja-JP.yml
@@ -500,12 +500,13 @@ objectStoragePrefixDesc: "このprefixのディレクトリ下に格納されま
objectStorageEndpoint: "Endpoint"
objectStorageEndpointDesc: "S3の場合は空、それ以外の場合は各サービスのendpointを指定してください。''または':'のように指定します。"
objectStorageRegion: "Region"
-objectStorageRegionDesc: "'xx-east-1'のようなregionを指定してください。使用サービスにregionの概念がない場合は、空または'us-east-1'にしてください。"
+objectStorageRegionDesc: "'xx-east-1'のようなregionを指定してください。使用サービスにregionの概念がない場合は'us-east-1'にしてください。AWS設定ファイルまたは環境変数を参照する場合は空にしてください。"
objectStorageUseSSL: "SSLを使用する"
objectStorageUseSSLDesc: "API接続にhttpsを使用しない場合はオフにしてください"
objectStorageUseProxy: "Proxyを利用する"
objectStorageUseProxyDesc: "API接続にproxyを利用しない場合はオフにしてください"
objectStorageSetPublicRead: "アップロード時に'public-read'を設定する"
+s3ForcePathStyleDesc: "s3ForcePathStyleを有効にすると、バケット名をURLのホスト名ではなくパスの一部として指定することを強制します。セルフホストされたMinioなどの使用時に有効にする必要がある場合があります。"
serverLogs: "サーバーログ"
deleteAll: "全て削除"
showFixedPostForm: "タイムライン上部に投稿フォームを表示する"
@@ -919,6 +920,7 @@ pushNotificationNotSupported: "ブラウザかサーバーがプッシュ通知
sendPushNotificationReadMessage: "通知やメッセージが既読になったらプッシュ通知を削除する"
sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」という通知が一瞬表示されるようになります。端末の電池消費量が増加する可能性があります。"
windowMaximize: "最大化"
+windowMinimize: "最小化"
windowRestore: "元に戻す"
caption: "キャプション"
loggedInAsBot: "Botアカウントでログイン中"
@@ -960,7 +962,9 @@ copyErrorInfo: "エラー情報をコピー"
joinThisServer: "このサーバーに登録する"
exploreOtherServers: "他のサーバーを探す"
letsLookAtTimeline: "タイムラインを見てみる"
-disableFederationWarn: "連合が無効になっています。無効にしても投稿が非公開にはなりません。ほとんどの場合、このオプションを有効にする必要はありません。"
+disableFederationConfirm: "連合なしにしますか?"
+disableFederationConfirmWarn: "連合なしにしても投稿は非公開になりません。ほとんどの場合、連合なしにする必要はありません。"
+disableFederationOk: "連合なしにする"
invitationRequiredToRegister: "現在このサーバーは招待制です。招待コードをお持ちの方のみ登録できます。"
emailNotSupported: "このサーバーではメール配信はサポートされていません"
postToTheChannel: "チャンネルに投稿"
@@ -983,6 +987,19 @@ retryAllQueuesConfirmText: "一時的にサーバーの負荷が増大するこ
enableChartsForRemoteUser: "リモートユーザーのチャートを生成"
enableChartsForFederatedInstances: "リモートサーバーのチャートを生成"
showClipButtonInNoteFooter: "ノートのアクションにクリップを追加"
+largeNoteReactions: "ノートのリアクションを大きく表示"
+noteIdOrUrl: "ノートIDまたはURL"
+accountMigration: "アカウントの引っ越し"
+accountMoved: "このユーザーは新しいアカウントに引っ越しました:"
+
+_accountMigration:
+ moveTo: "このアカウントを新しいアカウントに引っ越す"
+ moveToLabel: "引っ越し先のアカウント:"
+ moveAccountDescription: "この操作は取り消せません。まずは引っ越し先のアカウントでこのアカウントに対しエイリアスを作成したことを確認してください。エイリアス作成後、引っ越し先のアカウントをこのように入力してください:@person@instance.com"
+ moveFrom: "別のアカウントからこのアカウントに引っ越す"
+ moveFromLabel: "引っ越し元のアカウント:"
+ moveFromDescription: "別のアカウントからこのアカウントにフォロワーを引き継いで引っ越したい場合、ここでエイリアスを作成しておく必要があります。必ず引っ越しを実行する前に作成してください!引っ越し元のアカウントをこのように入力してください:@person@instance.com"
+ migrationConfirm: "本当にこのアカウントを {account} に引っ越しますか?一度引っ越しを行うと取り消せず、二度とこのアカウントを元の状態で使用できなくなります。\nまた、引っ越し先のアカウントでエイリアスを作成したことを確認してください。"
_achievements:
earnedAt: "獲得日時"
@@ -1949,4 +1966,3 @@ _webhookSettings:
renote: "Renoteされたとき"
reaction: "リアクションがあったとき"
mention: "メンションされたとき"
-
diff --git a/locales/ja-KS.yml b/locales/ja-KS.yml
index 5b1b312b78..398dbcd5c0 100644
--- a/locales/ja-KS.yml
+++ b/locales/ja-KS.yml
@@ -16,8 +16,8 @@ cancel: "やめとく"
noThankYou: "やめとく"
enterUsername: "ユーザー名を入れてや"
renotedBy: "{user}がRenoteしたで"
-noNotes: "ノートなんてあらへんで"
-noNotifications: "通知なんてあらへんで"
+noNotes: "ノートはあらへん"
+noNotifications: "通知はあらへん"
instance: "サーバー"
settings: "設定"
basicSettings: "基本設定"
@@ -25,13 +25,13 @@ otherSettings: "ほかの設定"
openInWindow: "ウィンドウで開くで"
profile: "プロフィール"
timeline: "タイムライン"
-noAccountDescription: "自己紹介食ってもた"
+noAccountDescription: "自己紹介はあらへん"
login: "ログイン"
loggingIn: "ログインしよるで"
logout: "ログアウト"
signup: "新規登録"
uploading: "アップロードしとるで"
-save: "保存"
+save: "とっとく"
users: "ユーザー"
addUser: "ユーザーを追加や"
favorite: "お気に入り"
@@ -81,9 +81,9 @@ followsYou: "フォローされとるで"
createList: "リスト作る"
manageLists: "リストの管理"
error: "エラー"
-somethingHappened: "なんかアカンことが起こったで"
+somethingHappened: "なんかあかんわ"
retry: "もっぺんやる?"
-pageLoadError: "ページの読み込みに失敗してもうたわ…"
+pageLoadError: "ページが読み込めんかったわ。"
pageLoadErrorDescription: "これは普通ならネットワークかブラウザキャッシュが悪さしてるんよ。キャッシュをほかすか、もうちょっとだけ待ってくれへん?"
serverIsDead: "サーバーからの応答がないで。もうちょい待ってから試してみてな。"
youShouldUpgradeClient: "このページを表示するには、リロードして新しいバージョンのクライアントを使ってなー。"
@@ -108,8 +108,8 @@ inChannelQuote: "チャンネル内引用"
pinnedNote: "ピン留めされとるノート"
pinned: "ピン留めしとく"
you: "あんた"
-clickToShow: "押したら見えるで"
-sensitive: "ちょっとアカンやつやで"
+clickToShow: "押したら出ら"
+sensitive: "気いつけて見いや"
add: "増やす"
reaction: "リアクション"
reactions: "リアクション"
@@ -122,8 +122,8 @@ unmarkAsSensitive: "そこまでアカンことないやろ"
enterFileName: "ファイル名を入れてや"
mute: "ミュート"
unmute: "ミュートやめたる"
-renoteMute: "リノートは見いひん"
-renoteUnmute: "リノートもやっぱ見るわ"
+renoteMute: "Renoteは見いひん"
+renoteUnmute: "Renoteもやっぱ見るわ"
block: "ブロック"
unblock: "ブロックやめたる"
suspend: "凍結"
@@ -141,14 +141,14 @@ editWidgetsExit: "編集終ったで"
customEmojis: "カスタム絵文字"
emoji: "絵文字"
emojis: "絵文字"
-emojiName: "絵文字名"
+emojiName: "絵文字はんの名前"
emojiUrl: "絵文字画像URL"
addEmoji: "絵文字を追加"
settingGuide: "ええ感じの設定"
cacheRemoteFiles: "リモートのファイルをキャッシュする"
-cacheRemoteFilesDescription: "この設定を切っとくと、リモートファイルをキャッシュせず直リンクするようになるで。サーバーの容量は節約できるけど、サムネイルが作られんくなるから通信量が増えるで。"
+cacheRemoteFilesDescription: "この設定を切っとったら、リモートファイルをキャッシュせんと直リンクするようになるで。サーバーの容量は節約できるけど、サムネイルを作らんなるから通信量が増えるで。"
flagAsBot: "Botにするで"
-flagAsBotDescription: "もしこのアカウントをプログラム使うて運用するんやったら、このフラグをオンにしてや。オンにすれば、反応がバーッて連鎖するのを避けるために開発者が使うたり、Misskeyのシステム上での扱いがBotに合ったもんになるからな。"
+flagAsBotDescription: "もしこのアカウントをプログラム使うて運用するんやったら、このフラグをオンにしてや。オンにすれば、反応がバーッて連鎖せんように開発者が使うたり、Misskeyのシステム上での扱いがBotに合ったもんになるからな。"
flagAsCat: "Catやで"
flagAsCatDescription: "ワレ、猫ちゃんならこのフラグをつけてみ?"
flagShowTimelineReplies: "タイムラインにノートへの返信を表示するで"
@@ -194,10 +194,10 @@ network: "ネットワーク"
disk: "ディスク"
instanceInfo: "サーバー情報"
statistics: "統計"
-clearQueue: "キューにさいなら"
-clearQueueConfirmTitle: "キューをクリアしまっか?"
-clearQueueConfirmText: "未配達の投稿は配送されなくなるで。ふつうこの操作を行う必要は無いんやけどな。"
-clearCachedFiles: "キャッシュにさいなら"
+clearQueue: "キューをほかす"
+clearQueueConfirmTitle: "キューをほかしとこか?"
+clearQueueConfirmText: "未配達の投稿は配送されんなるで。ふつうこの操作を行う必要は無いんやけどな。"
+clearCachedFiles: "キャッシュをほかす"
clearCachedFilesConfirm: "キャッシュされとるリモートファイルをみんなほかしてええか?"
blockedInstances: "ブロックしたサーバー"
blockedInstancesDescription: "ブロックしたいサーバーのホストを改行で区切って設定してな。ブロックされてもうたサーバーとはもう金輪際やり取りできひんくなるで。ついでにそのサブドメインもブロックするで。"
@@ -206,7 +206,7 @@ mutedUsers: "ミュートしたユーザー"
blockedUsers: "ブロックしたユーザー"
noUsers: "ユーザーはおらん"
editProfile: "プロフィールをいじる"
-noteDeleteConfirm: "このノートを削除しまっか?"
+noteDeleteConfirm: "このノートをほかしてええか?"
pinLimitExceeded: "これ以上ピン留めできひん"
intro: "Misskeyのインストールが完了したで!管理者アカウントを作ってや。"
done: "でけた"
@@ -226,9 +226,9 @@ notResponding: "応答してへんで"
instanceFollowing: "サーバーのフォロー"
instanceFollowers: "サーバーのフォロワー\n"
instanceUsers: "サーバーのユーザー"
-changePassword: "パスワード変える"
+changePassword: "パスワードをいじる"
security: "セキュリティ"
-retypedNotMatch: "入れたやつ同じになってないで。"
+retypedNotMatch: "入れたやつ合うてへんわ。"
currentPassword: "今のパスワード"
newPassword: "次のパスワード"
newPasswordRetype: "今度のパスワード(もっぺん入れて)"
@@ -258,7 +258,7 @@ uploadFromUrlRequested: "アップロードしたい言うといたで"
uploadFromUrlMayTakeTime: "アップロード終わるんにちょい時間かかるかもしれへんわ。"
explore: "みつける"
messageRead: "もう読んだ"
-noMoreHistory: "これより過去の履歴はあらへんで"
+noMoreHistory: "これより昔のんはあらへんで"
startMessaging: "チャットやるで"
nUsersRead: "{n}人が読んでもうた"
agreeTo: "{0}に同意したで"
@@ -294,14 +294,14 @@ createFolder: "フォルダー作る"
renameFolder: "フォルダー名を変える"
deleteFolder: "フォルダーをほかす"
addFile: "ファイルを追加"
-emptyDrive: "ドライブにはなんも残っとらん"
+emptyDrive: "ドライブは空っぽや"
emptyFolder: "このフォルダーは空や"
-unableToDelete: "消そうおもってんけどな、あかんかったわ"
+unableToDelete: "消せんかったわ"
inputNewFileName: "今度のファイル名は何にするん?"
inputNewDescription: "新しいキャプションを入れてや"
inputNewFolderName: "今度のフォルダ名は何にするん?"
circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーや。"
-hasChildFilesOrFolders: "このフォルダ、まだなんか入っとるから消されへん"
+hasChildFilesOrFolders: "このフォルダは空っぽちゃうから消されへん"
copyUrl: "URLをコピー"
rename: "名前を変えるで"
avatar: "アイコン"
@@ -506,6 +506,7 @@ objectStorageUseSSLDesc: "API接続にhttpsを使わん場合はオフにする
objectStorageUseProxy: "Proxyを使う"
objectStorageUseProxyDesc: "API接続にproxy使わんのやったら切ってくれへん?"
objectStorageSetPublicRead: "アップロードした時に'public-read'を設定してや"
+s3ForcePathStyleDesc: "s3ForcePathStyleを使たらバケット名をURLのホスト名やなくてパスの一部として必ず指定させるようになるで。セルフホストされたMinioとかを使うてるんやったら有効にせなあかん場合があるで。"
serverLogs: "サーバーログ"
deleteAll: "全部ほかす"
showFixedPostForm: "タイムラインの上の方で投稿できるようにやってくれへん?"
@@ -643,7 +644,7 @@ reporter: "通報者"
reporteeOrigin: "通報先"
reporterOrigin: "通報元"
forwardReport: "リモートサーバーに通報を転送するで"
-forwardReportIsAnonymous: "リモートインスタンスからはあんたの情報は見れへんくって、匿名のシステムアカウントとして表示されるで。"
+forwardReportIsAnonymous: "リモートサーバーからはあんたの情報は見えんなって、匿名のシステムアカウントとして表示されるで。"
send: "送信"
abuseMarkAsResolved: "対応したで"
openInNewTab: "新しいタブで開く"
@@ -739,7 +740,7 @@ capacity: "容量"
inUse: "使用中"
editCode: "コードを編集"
apply: "適用"
-receiveAnnouncementFromInstance: "インスタンスからのお知らせを受け取る"
+receiveAnnouncementFromInstance: "サーバーからのお知らせを受け取る"
emailNotification: "メール通知"
publish: "公開"
inChannelSearch: "チャンネル内検索"
@@ -767,7 +768,7 @@ active: "アクティブ"
offline: "オフライン"
notRecommended: "あんま推奨しやんで"
botProtection: "Botプロテクション"
-instanceBlocking: "インスタンスブロック"
+instanceBlocking: "サーバーブロック"
selectAccount: "アカウントを選んでなー"
switchAccount: "アカウントを変えるで"
enabled: "有効"
@@ -851,8 +852,8 @@ themeColor: "テーマカラー"
size: "大きさ"
numberOfColumn: "列の数"
searchByGoogle: "探す"
-instanceDefaultLightTheme: "インスタンスの最初の明るいテーマ"
-instanceDefaultDarkTheme: "インスタンスの最初の暗いテーマ"
+instanceDefaultLightTheme: "サーバーおすすめの明るいテーマ"
+instanceDefaultDarkTheme: "サーバーおすすめのの暗いテーマ"
instanceDefaultThemeDescription: "オブジェクト形式のテーマコードを記入するで。"
mutePeriod: "ミュートする期間"
period: "期限"
@@ -866,7 +867,7 @@ reflectMayTakeTime: "反映されるまで時間がかかることがあるで"
failedToFetchAccountInformation: "アカウントの取得に失敗したみたいや…"
rateLimitExceeded: "レート制限が超えたみたいやで"
cropImage: "画像のクロップ"
-cropImageAsk: "画像をクロップしたってええか?"
+cropImageAsk: "画像をクロップしてもええか?"
cropYes: "切り抜いたる"
cropNo: "切り抜かへん"
file: "ファイル"
@@ -901,11 +902,11 @@ sensitiveMediaDetection: "センシティブなメディアの検出"
localOnly: "ローカルのみ"
remoteOnly: "リモートのみ"
failedToUpload: "アップロードに失敗してもうたわ…"
-cannotUploadBecauseInappropriate: "不適切な内容を含むかもしれへんって判定されたでアップロードできまへん。"
-cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いでアップロードできまへん。"
+cannotUploadBecauseInappropriate: "不適切な内容を含むかもしれへんって判定されたからアップロードできへんわ。"
+cannotUploadBecauseNoFreeSpace: "ドライブの空き容量が無いからアップロードできへんわ。"
beta: "ベータ"
enableAutoSensitive: "自動NSFW判定"
-enableAutoSensitiveDescription: "使える時は、機械学習を使って自動でメディアにNSFWフラグを設定するで。この機能をオフにしても、インスタンスによっては自動で設定されることがあるで。"
+enableAutoSensitiveDescription: "使える時は、機械学習を使って自動でメディアにNSFWフラグを設定するで。この機能をオフにしても、サーバーによっては自動で設定されることがあるで。"
activeEmailValidationDescription: "ユーザーのメールアドレスのバリデーションを、捨てアドかどうかや実際に通信可能かどうかとかを判定して積極的に行うで。オフにすると単に文字列として正しいかどうかだけチェックするで。"
navbar: "ナビゲーションバー"
shuffle: "シャッフルするで"
@@ -915,10 +916,11 @@ pushNotification: "プッシュ通知"
subscribePushNotification: "プッシュ通知をオンにするで"
unsubscribePushNotification: "プッシュ通知を止めるで"
pushNotificationAlreadySubscribed: "プッシュ通知はオンになってるで"
-pushNotificationNotSupported: "ブラウザかインスタンスがプッシュ通知に対応してないみたいやで。"
+pushNotificationNotSupported: "ブラウザかサーバーがプッシュ通知に対応してないみたいやで。"
sendPushNotificationReadMessage: "通知やメッセージが既読になったらプッシュ通知を消すで"
sendPushNotificationReadMessageCaption: "「{emptyPushNotificationMessage}」っていう表示が一瞬表示されるようになるで。端末の電池使用量が増える可能性があるで。"
windowMaximize: "最大化"
+windowMinimize: "最小化"
windowRestore: "元に戻す"
caption: "キャプション"
loggedInAsBot: "Botアカウントでログイン中やで"
@@ -931,7 +933,7 @@ numberOfLikes: "いいね数"
show: "表示"
neverShow: "今後表示しない"
remindMeLater: "また後で"
-didYouLikeMisskey: "Misskeyを気に入っとっただけましたん?"
+didYouLikeMisskey: "Misskey気に入ってくれた?"
pleaseDonate: "Misskeyは{host}が使用している無料のソフトウェアやで。これからも開発を続けれるように、寄付したってな~。"
roles: "ロール"
role: "ロール"
@@ -941,7 +943,7 @@ assign: "アサイン"
unassign: "アサインを解除"
color: "色"
manageCustomEmojis: "カスタム絵文字の管理"
-youCannotCreateAnymore: "これ以上作れなさそうや"
+youCannotCreateAnymore: "これ以上作れなさそうやわ"
cannotPerformTemporary: "一時的に利用できへんで"
cannotPerformTemporaryDescription: "操作回数が制限を超えたから一時的に利用できへんくなったで。ちょっと時間置いてからもう一回やってやー。"
preset: "プリセット"
@@ -960,7 +962,9 @@ copyErrorInfo: "エラー情報をコピー"
joinThisServer: "このサーバーに登録するわ"
exploreOtherServers: "他のサーバー見てみる"
letsLookAtTimeline: "タイムライン見てみーや"
-disableFederationWarn: "連合が無効になっとるで。無効にしても投稿は非公開ってわけちゃうねん。大体の場合はこのオプションを有効にする必要は別にないで。"
+disableFederationConfirm: "連合なしにしとくか?"
+disableFederationConfirmWarn: "連合なしにしても投稿は非公開にはならへんで。大体の場合は連合なしにする必要はないで。"
+disableFederationOk: "連合なしにしとく"
invitationRequiredToRegister: "今このサーバー招待制になってもうてんねん。招待コードを持っとるんやったら登録できるで。"
emailNotSupported: "このサーバーはメール配信がサポートされてへんみたいやわ"
postToTheChannel: "チャンネルに投稿"
@@ -983,6 +987,9 @@ retryAllQueuesConfirmText: "一時的にサーバー重なるかもしれへん
enableChartsForRemoteUser: "リモートユーザーのチャートを作る"
enableChartsForFederatedInstances: "リモートサーバーのチャートを作る"
showClipButtonInNoteFooter: "ノートのアクションにクリップを追加"
+largeNoteReactions: "ノートのリアクションを大きする"
+noteIdOrUrl: "ノートIDかURL"
+accountMoved: "このユーザーはさらのアカウントに引っ越したで:"
_achievements:
earnedAt: "貰った日ぃ"
_types:
@@ -1043,7 +1050,7 @@ _achievements:
_login7:
title: "ビギナーⅡ"
description: "通算7日ログインした"
- flavor: "慣れてきたんちゃう?"
+ flavor: "慣れてきたんとちゃう?"
_login15:
title: "ビギナーⅢ"
description: "通算15日ログインした"
@@ -1147,7 +1154,7 @@ _achievements:
_iLoveMisskey:
title: "Misskey好きやねん"
description: "\"I ❤ #Misskey\"を投稿した"
- flavor: "Misskeyを使ってくれてありがとうな~ by 開発チーム"
+ flavor: "Misskeyを使ってくれておおきにな~ by 開発チーム"
_foundTreasure:
title: "なんでも鑑定団"
description: "隠されたお宝を発見した"
@@ -1173,7 +1180,7 @@ _achievements:
description: "ホームタイムラインの流速が20npmを超す"
_viewInstanceChart:
title: "アナリスト"
- description: "インスタンスのチャートを表示した"
+ description: "サーバーのチャートを表示した"
_outputHelloWorldOnScratchpad:
title: "Hello, world!"
description: "スクラッチパッドで hello worldを出力した"
@@ -1210,7 +1217,7 @@ _achievements:
_loggedInOnNewYearsDay:
title: "あけましておめでとうございます!"
description: "元旦にログインした"
- flavor: "今年も弊インスタンスをよろしくお願いします"
+ flavor: "今年も弊サーバーをよろしゅう頼みますわ"
_cookieClicked:
title: "クッキー叩くやつ"
description: "クッキー叩いてもうた"
@@ -1225,8 +1232,8 @@ _role:
name: "ロール名"
description: "ロールの説明"
permission: "ロールの権限"
- descriptionOfPermission: "モデレーターは基本的なモデレーションに関わる操作を行えるで。\n管理者はインスタンスの全ての設定を変更できるで。"
- assignTarget: "アサインターゲット"
+ descriptionOfPermission: "モデレーターは基本的なモデレーションに関わる操作を行えるで。\n管理者はサーバーの全ての設定を変更できるで。"
+ assignTarget: "アサイン"
descriptionOfAssignTarget: "マニュアルは誰がこのロールに含まれてるかを手動で管理するで。\nコンディショナルは条件を設定して、それに合うユーザーが自動で含まれるようになるで。"
manual: "マニュアル"
conditional: "コンディショナル"
@@ -1255,7 +1262,7 @@ _role:
gtlAvailable: "グローバルタイムラインの閲覧"
ltlAvailable: "ローカルタイムラインの閲覧"
canPublicNote: "パブリック投稿の許可"
- canInvite: "インスタンス招待コードの発行"
+ canInvite: "サーバー招待コードの発行"
canManageCustomEmojis: "カスタム絵文字の管理"
driveCapacity: "ドライブ容量"
pinMax: "ノートのピン留めの最大数"
@@ -1267,7 +1274,7 @@ _role:
userListMax: "ユーザーリストの作成可能数"
userEachUserListsMax: "ユーザーリスト内のユーザーの最大数"
rateLimitFactor: "レートリミット"
- descriptionOfRateLimitFactor: "ちっちゃいほど制限が緩くなって、大きいほど制限されるで。"
+ descriptionOfRateLimitFactor: "ちっちゃいほど制限が緩なって、大きいほど制限されるで。"
canHideAds: "広告を表示させへん"
canSearchNotes: "ノート検索を使わすかどうか"
_condition:
@@ -1320,7 +1327,7 @@ _ad:
_forgotPassword:
enterEmail: "アカウントに登録したメールアドレスをここに入力してや。そのアドレス宛に、パスワードリセット用のリンクが送られるから待っててな~。"
ifNoEmail: "メールアドレスを登録してへんのやったら、管理者まで教えてな~。"
- contactAdmin: "このインスタンスはメールに対応してへんから、パスワードリセットをしたいときは管理者まで教えてな~。"
+ contactAdmin: "このサーバーはメールに対応してへんから、パスワードリセットをしたいときは管理者まで教えてな~。"
_gallery:
my: "あんたの投稿"
liked: "いいねした投稿"
@@ -1405,10 +1412,10 @@ _wordMute:
hard: "ハード"
mutedNotes: "ミュートされたノート"
_instanceMute:
- instanceMuteDescription: "ミュートしたインスタンスのユーザーへの返信を含めて、設定したインスタンスの全てのノートとRenoteをミュートにするで。"
+ instanceMuteDescription: "ミュートしたサーバーのユーザーへの返信を含めて、設定したインスタンスの全てのノートとRenoteをミュートにするで。"
instanceMuteDescription2: "改行で区切って設定するんやで"
- title: "設定したインスタンスのノートを隠すで。"
- heading: "ミュートするインスタンス"
+ title: "設定したサーバーのノートを隠すで。"
+ heading: "ミュートするサーバー"
_theme:
explore: "テーマを探す"
install: "テーマのインストール"
@@ -1630,7 +1637,7 @@ _widgets:
digitalClock: "デジタル時計"
unixClock: "UNIX時計"
federation: "連合"
- instanceCloud: "インスタンスクラウド"
+ instanceCloud: "サーバークラウド"
postForm: "投稿フォーム"
slideshow: "スライドショー"
button: "ボタン"
@@ -1681,7 +1688,7 @@ _visibility:
specified: "ダイレクト"
specifiedDescription: "選んだユーザーのみに公開するで"
disableFederation: "連合なし"
- disableFederationDescription: "他インスタンスへは送らんとくわ"
+ disableFederationDescription: "他サーバーへは送らんとくわ"
_postForm:
replyPlaceholder: "このノートに返信..."
quotePlaceholder: "このノートを引用..."
@@ -1893,4 +1900,3 @@ _webhookSettings:
renote: "Renoteされるとき~!"
reaction: "リアクションがあるとき~!"
mention: "メンションがあるとき~!"
-
diff --git a/locales/jbo-EN.yml b/locales/jbo-EN.yml
index cd21505a47..ed97d539c0 100644
--- a/locales/jbo-EN.yml
+++ b/locales/jbo-EN.yml
@@ -1,2 +1 @@
---
-
diff --git a/locales/kab-KAB.yml b/locales/kab-KAB.yml
index 8b43041e4c..18fd8f5a58 100644
--- a/locales/kab-KAB.yml
+++ b/locales/kab-KAB.yml
@@ -103,4 +103,3 @@ _deck:
_columns:
notifications: "Ilɣuyen"
list: "Tibdarin"
-
diff --git a/locales/kn-IN.yml b/locales/kn-IN.yml
index 63a75302a1..ef66f3fbd2 100644
--- a/locales/kn-IN.yml
+++ b/locales/kn-IN.yml
@@ -83,4 +83,3 @@ _deck:
notifications: "ಅಧಿಸೂಚನೆಗಳು"
tl: "ಸಮಯಸಾಲು"
mentions: "ಹೆಸರಿಸಿದ"
-
diff --git a/locales/ko-KR.yml b/locales/ko-KR.yml
index 31b4200c2e..3ff00482d6 100644
--- a/locales/ko-KR.yml
+++ b/locales/ko-KR.yml
@@ -958,7 +958,6 @@ copyErrorInfo: "오류 정보 복사"
joinThisServer: "이 서버에 가입"
exploreOtherServers: "다른 서버 둘러보기"
letsLookAtTimeline: "타임라인 구경하기"
-disableFederationWarn: "연합이 비활성화됩니다. 비활성화해도 게시물이 비공개가 되지는 않습니다. 대부분의 경우 이 옵션을 활성화할 필요가 없습니다."
invitationRequiredToRegister: "현재 이 서버는 비공개입니다. 회원가입을 하시려면 초대 코드가 필요합니다."
emailNotSupported: "이 서버에서는 메일 전송을 지원하지 않습니다"
postToTheChannel: "채널에 게시하기"
@@ -1851,4 +1850,3 @@ _dialog:
_webhookSettings:
name: "이름"
active: "활성화"
-
diff --git a/locales/lo-LA.yml b/locales/lo-LA.yml
index 5736fa67a7..9c1a48c67c 100644
--- a/locales/lo-LA.yml
+++ b/locales/lo-LA.yml
@@ -368,4 +368,3 @@ _deck:
list: "ລາຍການ"
channel: "ຊ່ອງ"
mentions: "ກ່າວເຖິງ"
-
diff --git a/locales/nl-NL.yml b/locales/nl-NL.yml
index efbb83c70f..31c28a66e3 100644
--- a/locales/nl-NL.yml
+++ b/locales/nl-NL.yml
@@ -485,4 +485,3 @@ _deck:
mentions: "Vermeldingen"
_webhookSettings:
name: "Naam"
-
diff --git a/locales/no-NO.yml b/locales/no-NO.yml
index 36a0a2e0e3..83e189b9cf 100644
--- a/locales/no-NO.yml
+++ b/locales/no-NO.yml
@@ -1,3 +1,2 @@
---
_lang_: "Norsk Bokmål"
-
diff --git a/locales/pl-PL.yml b/locales/pl-PL.yml
index cc0bbb1fac..517e8431f9 100644
--- a/locales/pl-PL.yml
+++ b/locales/pl-PL.yml
@@ -129,6 +129,7 @@ unblockConfirm: "Czy na pewno chcesz odblokować to konto?"
suspendConfirm: "Czy na pewno chcesz zawiesić to konto?"
unsuspendConfirm: "Czy na pewno chcesz cofnąć zawieszenie tego konta?"
selectList: "Wybierz listę"
+selectChannel: "Wybierz kanał"
selectAntenna: "Wybierz Antennę"
selectWidget: "Wybierz widżet"
editWidgets: "Edytuj widżety"
@@ -149,6 +150,7 @@ flagAsCatDescription: "Przełącz tę opcję, aby konto było oznaczone jako kot
flagShowTimelineReplies: "Pokazuj odpowiedzi na osi czasu"
autoAcceptFollowed: "Automatycznie przyjmuj prośby o możliwość obserwacji od użytkowników, których obserwujesz"
addAccount: "Dodaj konto"
+reloadAccountsList: "Odśwież listę kont"
loginFailed: "Nie udało się zalogować"
showOnRemote: "Zobacz na zdalnej instancji"
general: "Ogólne"
@@ -159,6 +161,7 @@ searchWith: "Szukaj: {q}"
youHaveNoLists: "Nie masz żadnej listy"
followConfirm: "Czy na pewno chcesz zaobserwować {name}?"
proxyAccount: "Konto proxy"
+proxyAccountDescription: "Opis konta pełnomocniczego"
host: "Host"
selectUser: "Wybierz użytkownika"
recipient: "Odbiorca"
@@ -253,6 +256,7 @@ noMoreHistory: "Nie ma dalszej historii"
startMessaging: "Rozpocznij czat"
nUsersRead: "przeczytano przez {n}"
agreeTo: "Wyrażam zgodę na {0}"
+agreeBelow: "Zaakceptuj poniżej"
tos: "Regulamin"
start: "Rozpocznij"
home: "Strona główna"
@@ -385,13 +389,19 @@ about: "Informacje"
aboutMisskey: "O Misskey"
administrator: "Admin"
token: "Token"
+2fa: "Klucz 2FA "
+totp: "Klucz aplikacji uwierzytelniającej (totp)"
+totpDescription: "Opis klucza czasowego"
moderator: "Moderator"
moderation: "Moderacja"
nUsersMentioned: "{n} wspomnianych użytkowników"
+securityKeyAndPasskey: "Klucz bezpieczeństwa i klucze Passkey"
securityKey: "Klucz bezpieczeństwa"
lastUsed: "Ostatnio używane"
+lastUsedAt: "Ostatnio używane w"
unregister: "Cofnij rejestrację"
passwordLessLogin: "Skonfiguruj logowanie bez użycia hasła"
+passwordLessLoginDescription: "Opis logowania bez użycia hasła"
resetPassword: "Zresetuj hasło"
newPasswordIs: "Nowe hasło to „{password}”"
reduceUiAnimation: "Ogranicz animacje w UI"
@@ -518,11 +528,16 @@ disablePagesScript: "Wyłącz AiScript na Stronach"
updateRemoteUser: "Aktualizuj zdalne dane o użytkowniku"
deleteAllFiles: "Usuń wszystkie pliki"
deleteAllFilesConfirm: "Czy na pewno chcesz usunąć wszystkie pliki?"
+removeAllFollowing: "Przestań obserwować"
removeAllFollowingDescription: "Przestań obserwować wszystkie konta z {host}. Wykonaj to, jeżeli instancja już nie istnieje."
userSuspended: "To konto zostało zawieszone."
userSilenced: "Ten użytkownik został wyciszony."
yourAccountSuspendedTitle: "To konto jest zawieszone"
yourAccountSuspendedDescription: "To konto zostało zawieszone z powodu złamania regulaminu serwera lub innych podobnych. Skontaktuj się z administratorem, jeśli chciałbyś poznać bardziej szczegółowy powód. Proszę nie zakładać nowego konta."
+tokenRevoked: "Token odrzucony"
+tokenRevokedDescription: "Opis odrzuconego tokena"
+accountDeleted: "Konto usunięte"
+accountDeletedDescription: "Opis konta usuniętego"
menu: "Menu"
divider: "Rozdzielacz"
addItem: "Dodaj element"
@@ -548,7 +563,9 @@ author: "Autor"
leaveConfirm: "Są niezapisane zmiany. Czy chcesz je odrzucić?"
manage: "Zarządzanie"
plugins: "Wtyczki"
+preferencesBackups: "Kopia zapasowa ustawień"
deck: "Tablica"
+undeck: "oddkouj"
useBlurEffectForModal: "Używaj efektu rozmycia w modalach"
useFullReactionPicker: "Używaj pełnowymiarowego wybornika reakcji"
width: "Szerokość"
@@ -815,6 +832,8 @@ tenMinutes: "10 minut"
oneHour: "1 godzina"
oneDay: "1 dzień"
oneWeek: "1 tydzień"
+oneMonth: "jeden miesiąc"
+failedToFetchAccountInformation: "Nie udało się uzyskać informacji o koncie"
file: "Pliki"
recommended: "Zalecane"
check: "Zweryfikuj"
@@ -1360,4 +1379,3 @@ _deck:
_webhookSettings:
name: "Nazwa"
active: "Właczono"
-
diff --git a/locales/pt-PT.yml b/locales/pt-PT.yml
index 870ad50150..8a7232fa2c 100644
--- a/locales/pt-PT.yml
+++ b/locales/pt-PT.yml
@@ -557,4 +557,3 @@ _deck:
direct: "Notas diretas"
_webhookSettings:
name: "Nome"
-
diff --git a/locales/ro-RO.yml b/locales/ro-RO.yml
index 89f8afac9a..bbf0160de9 100644
--- a/locales/ro-RO.yml
+++ b/locales/ro-RO.yml
@@ -703,4 +703,3 @@ _deck:
mentions: "Mențiuni"
_webhookSettings:
name: "Nume"
-
diff --git a/locales/ru-RU.yml b/locales/ru-RU.yml
index 6a1756f8a2..8a09d30306 100644
--- a/locales/ru-RU.yml
+++ b/locales/ru-RU.yml
@@ -950,7 +950,6 @@ copyErrorInfo: "Скопировать код ошибки"
joinThisServer: "Присоединяйтесь к этому серверу"
exploreOtherServers: "Искать другие сервера"
letsLookAtTimeline: "Давайте посмотрим на ленту"
-disableFederationWarn: "Объединение отключено. Если вы отключите это, сообщение не будет приватным. В большинстве случаев вам не нужно включать эту опцию."
_achievements:
earnedAt: "Разблокировано в"
_types:
@@ -1839,4 +1838,3 @@ _dialog:
_webhookSettings:
name: "Название"
active: "Вкл."
-
diff --git a/locales/si-LK.yml b/locales/si-LK.yml
index cd21505a47..ed97d539c0 100644
--- a/locales/si-LK.yml
+++ b/locales/si-LK.yml
@@ -1,2 +1 @@
---
-
diff --git a/locales/sk-SK.yml b/locales/sk-SK.yml
index ff6075b703..7c74060158 100644
--- a/locales/sk-SK.yml
+++ b/locales/sk-SK.yml
@@ -1477,4 +1477,3 @@ _deck:
_webhookSettings:
name: "Názov"
active: "Zapnuté"
-
diff --git a/locales/sv-SE.yml b/locales/sv-SE.yml
index 6ea5f77c21..c5653d32ec 100644
--- a/locales/sv-SE.yml
+++ b/locales/sv-SE.yml
@@ -343,9 +343,15 @@ recentlyRegisteredUsers: "Nyligen registrerade användare"
userList: "Listor"
aboutMisskey: "Om Misskey"
administrator: "Administratör"
+passwordLessLogin: "Lösenordsfri inloggning"
+passwordLessLoginDescription: "Tillåter lösenordsfri inloggning med endast en säkerhetsnyckel eller en passkey."
newPasswordIs: "Det nya lösenordet är \"{password}\""
share: "Dela"
enable: "Aktivera"
+weakPassword: "Svagt Lösenord"
+normalPassword: "Medel Lösenord"
+strongPassword: "Starkt Lösenord"
+signinFailed: "Kan inte logga in. Det angivna användarnamnet eller lösenordet är felaktigt."
serviceworkerInfo: "Måste vara aktiverad för pushnotiser."
enableInfiniteScroll: "Ladda mer automatiskt"
enablePlayer: "Öppna videospelare"
@@ -354,11 +360,13 @@ enableEmail: "Aktivera epost-utskick"
smtpHost: "Värd"
smtpUser: "Användarnamn"
smtpPass: "Lösenord"
+emptyToDisableSmtpAuth: "Lämna användarnamn och lösenord tomt för att avaktivera SMTP verifiering"
clearCache: "Rensa cache"
enabled: "Aktiverad"
user: "Användare"
global: "Global"
squareAvatars: "Visa fyrkantiga profilbilder"
+incorrectPassword: "Fel lösenord."
searchByGoogle: "Sök"
file: "Filer"
enableAutoSensitive: "Automatisk NSFW markering"
@@ -368,6 +376,15 @@ subscribePushNotification: "Aktivera pushnotiser"
unsubscribePushNotification: "Avaktivera pushnotiser"
pushNotificationAlreadySubscribed: "Pushnotiser är redan aktiverade"
pushNotificationNotSupported: "Din webbläsare eller instans har inte stöd för pushnotiser"
+windowMaximize: "Maximera"
+windowMinimize: "Minimera"
+windowRestore: "Återställ"
+resetPasswordConfirm: "Återställ verkligen ditt lösenord?"
+_achievements:
+ _types:
+ _open3windows:
+ title: "Flera Fönster"
+ description: "Ha minst 3 fönster öppna samtidigt"
_email:
_follow:
title: "följde dig"
@@ -384,6 +401,7 @@ _sfx:
chat: "Chatt"
antenna: "Antenner"
_2fa:
+ passwordToTOTP: "Skriv in ditt lösenord"
renewTOTPCancel: "Nej tack"
_antennaSources:
all: "Alla noter"
@@ -444,4 +462,3 @@ _deck:
mentions: "Omnämningar"
_webhookSettings:
active: "Aktiverad"
-
diff --git a/locales/th-TH.yml b/locales/th-TH.yml
index a8b4784398..8d4a41bf34 100644
--- a/locales/th-TH.yml
+++ b/locales/th-TH.yml
@@ -955,7 +955,6 @@ copyErrorInfo: "คัดลอกรายละเอียดข้อผิ
joinThisServer: "ลงชื่อสมัครใช้ในอินสแตนซ์นี้"
exploreOtherServers: "มองหาอินสแตนซ์อื่น"
letsLookAtTimeline: "ลองดูที่ไทม์ไลน์"
-disableFederationWarn: "การดำเนินการนี้ถ้าหากจะปิดใช้งานการรวมศูนย์ แต่โพสต์ดังกล่าวนั้นจะยังคงเป็นสาธารณะต่อไป ยกเว้นแต่ว่าจะตั้งค่าเป็นอย่างอื่น โดยปกติคุณไม่จำเป็นต้องใช้การตั้งค่านี้นะ"
invitationRequiredToRegister: "อินสแตนซ์นี้เป็นแบบรับเชิญเท่านั้น คุณต้องป้อนรหัสเชิญที่ถูกต้องถึงจะลงทะเบียนได้นะค่ะ"
emailNotSupported: "อินสแตนซ์นี้ไม่รองรับการส่งอีเมลนะค่ะ"
postToTheChannel: "โพสต์ลงช่อง"
@@ -1869,4 +1868,3 @@ _drivecleaner:
_webhookSettings:
name: "ชื่อ"
active: "เปิดใช้งาน"
-
diff --git a/locales/tr-TR.yml b/locales/tr-TR.yml
index 0f53dbafcb..7bd8188a48 100644
--- a/locales/tr-TR.yml
+++ b/locales/tr-TR.yml
@@ -60,4 +60,3 @@ _deck:
_columns:
notifications: "Bildirim"
tl: "Zaman çizelgesi"
-
diff --git a/locales/ug-CN.yml b/locales/ug-CN.yml
index 5b825d7bf3..65ef841259 100644
--- a/locales/ug-CN.yml
+++ b/locales/ug-CN.yml
@@ -2,4 +2,3 @@
_lang_: "ياپونچە"
search: "ئىزدەش"
searchByGoogle: "ئىزدەش"
-
diff --git a/locales/uk-UA.yml b/locales/uk-UA.yml
index 7b2ee6d891..895d2e1f12 100644
--- a/locales/uk-UA.yml
+++ b/locales/uk-UA.yml
@@ -1641,4 +1641,3 @@ _deck:
_webhookSettings:
name: "Ім'я"
active: "Увімкнено"
-
diff --git a/locales/vi-VN.yml b/locales/vi-VN.yml
index f814454732..ebd046b6d4 100644
--- a/locales/vi-VN.yml
+++ b/locales/vi-VN.yml
@@ -1707,4 +1707,3 @@ _dialog:
_webhookSettings:
name: "Tên"
active: "Đã bật"
-
diff --git a/locales/zh-CN.yml b/locales/zh-CN.yml
index c687c47a17..563609d500 100644
--- a/locales/zh-CN.yml
+++ b/locales/zh-CN.yml
@@ -16,7 +16,7 @@ cancel: "取消"
noThankYou: "不用,谢谢"
enterUsername: "输入用户名"
renotedBy: "由 {user} 转贴"
-noNotes: "没有帖子"
+noNotes: "没有帖文"
noNotifications: "无通知"
instance: "服务器"
settings: "设置"
@@ -25,7 +25,7 @@ otherSettings: "其他设置"
openInWindow: "在新窗口中打开"
profile: "个人资料"
timeline: "时间线"
-noAccountDescription: "这个人很懒,没有写自我介绍"
+noAccountDescription: "此用户尚无自我介绍"
login: "登录"
loggingIn: "正在登录..."
logout: "登出"
@@ -60,7 +60,7 @@ youGotNewFollower: "你有新的关注者"
receiveFollowRequest: "您收到了关注请求"
followRequestAccepted: "您的关注请求被通过了"
mention: "提及"
-mentions: "提及"
+mentions: "提到我的"
directNotes: "私信"
importAndExport: "导入和导出"
import: "导入"
@@ -85,7 +85,7 @@ somethingHappened: "出现了一些问题!"
retry: "重试"
pageLoadError: "页面加载失败。"
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
-serverIsDead: "服务器没有响应。 请稍等片刻,然后重试。"
+serverIsDead: "没有服务器响应。 请稍后再试。"
youShouldUpgradeClient: "请重新加载并使用新版本的客户端查看此页面。"
enterListName: "输入列表名称"
privacy: "隐私"
@@ -95,7 +95,7 @@ follow: "关注"
followRequest: "关注申请"
followRequests: "关注申请"
unfollow: "取消关注"
-followRequestPending: "发送关注请求"
+followRequestPending: "关注请求批准中"
enterEmoji: "输入表情符号"
renote: "转发"
unrenote: "取消转发"
@@ -119,7 +119,7 @@ rememberNoteVisibility: "保存上次设置的可见性"
attachCancel: "删除附件"
markAsSensitive: "标记为敏感内容"
unmarkAsSensitive: "取消标记为敏感内容"
-enterFileName: "请输入文件名"
+enterFileName: "输入文件名"
mute: "屏蔽"
unmute: "解除屏蔽"
renoteMute: "屏蔽转帖"
@@ -142,10 +142,10 @@ customEmojis: "自定义表情符号"
emoji: "表情符号"
emojis: "表情符号"
emojiName: "表情符号名称"
-emojiUrl: "表情符号地址"
+emojiUrl: "emoji 地址"
addEmoji: "添加表情符号"
settingGuide: "推荐配置"
-cacheRemoteFiles: "远程文件缓存"
+cacheRemoteFiles: "缓存远程文件"
cacheRemoteFilesDescription: "当禁用此设定时远程文件将直接从远程服务器载入。禁用后会减小储存空间需求,但是会增加流量,因为缩略图不会被生成。"
flagAsBot: "这是一个机器人账号"
flagAsBotDescription: "如果此帐户由程序控制,请启用此项。启用后,此标志可以帮助其他开发人员防止机器人之间产生无限互动的行为,并让Misskey的内部系统将此帐户识别为机器人。"
@@ -153,7 +153,7 @@ flagAsCat: "将这个账户设定为一只猫"
flagAsCatDescription: "如果您想表明此帐户是一只猫,请打开此标志。\n开启后,会在您的头像上出现猫耳朵,并将你的帖子中的「na」替换为「nya」,日文同理。"
flagShowTimelineReplies: "在时间线上显示帖子的回复"
flagShowTimelineRepliesDescription: "启用时,时间线除了显示用户的帖子外,还会显示其他用户对帖子的回复。"
-autoAcceptFollowed: "自动允许关注者的关注"
+autoAcceptFollowed: "自动允许来自我关注的用户对我的关注请求"
addAccount: "添加账户"
reloadAccountsList: "更新账户列表"
loginFailed: "登录失败"
@@ -203,7 +203,7 @@ blockedInstances: "被阻拦的服务器"
blockedInstancesDescription: "设定要阻拦的服务器,以换行来进行分割。被阻拦的服务器将无法与本服务器进行交换通讯。"
muteAndBlock: "屏蔽/拉黑"
mutedUsers: "已屏蔽用户"
-blockedUsers: "被拉黑的用户"
+blockedUsers: "已拉黑的用户"
noUsers: "无用户"
editProfile: "编辑资料"
noteDeleteConfirm: "要删除该帖子吗?"
@@ -336,7 +336,7 @@ enableLocalTimeline: "启用本地时间线功能"
enableGlobalTimeline: "启用全局时间线"
disablingTimelinesInfo: "即使时间线功能被禁用,出于方便,管理员和数据图表也可以继续使用。"
registration: "注册"
-enableRegistration: "允许新用户注册"
+enableRegistration: "允许任何人注册"
invite: "邀请"
driveCapacityPerLocalAccount: "每个用户的网盘空间"
driveCapacityPerRemoteAccount: "每个远程用户的网盘容量"
@@ -354,7 +354,7 @@ pinnedNotes: "已置顶的帖子"
hcaptcha: "hCaptcha"
enableHcaptcha: "启用 hCaptcha"
hcaptchaSiteKey: "网站密钥"
-hcaptchaSecretKey: "hCaptcha 密钥(SecretKey)"
+hcaptchaSecretKey: "密钥"
recaptcha: "reCAPTCHA"
enableRecaptcha: "启用 reCAPTCHA\n(请注意, 此功能在中国大陆不可用. 如果启用, 可能导致无法正常使用登录或注册等功能)"
recaptchaSiteKey: "网站密钥"
@@ -506,6 +506,7 @@ objectStorageUseSSLDesc: "如果不使用https进行API连接,请关闭。"
objectStorageUseProxy: "使用代理"
objectStorageUseProxyDesc: "如果您不使用代理进行API连接,请将其关闭。"
objectStorageSetPublicRead: "上传时设置为public-read"
+s3ForcePathStyleDesc: "启用 s3ForcePathStyle 会强制将存储桶名称指定为 URL 中路径的一部分,而不是主机名。使用自托管 Minio 等时可能需要启用。"
serverLogs: "服务器日志"
deleteAll: "全部删除"
showFixedPostForm: "在时间线顶部显示发帖框"
@@ -919,6 +920,7 @@ pushNotificationNotSupported: "浏览器或服务器不支持推送通知消息"
sendPushNotificationReadMessage: "删除已读推送通知消息"
sendPushNotificationReadMessageCaption: "“{emptyPushNotificationMessage}”的通知消息将会显示。您终端设备的电池消耗可能会增加。"
windowMaximize: "最大化"
+windowMinimize: "最小化"
windowRestore: "还原"
caption: "标题"
loggedInAsBot: "以Bot账户登录"
@@ -960,7 +962,9 @@ copyErrorInfo: "复制错误信息"
joinThisServer: "在本服务器上注册"
exploreOtherServers: "探索其他服务器"
letsLookAtTimeline: "时间线"
-disableFederationWarn: "联合被禁用。 禁用它并不能使帖子变成私人的。 在大多数情况下,这个选项不需要被启用。"
+disableFederationConfirm: "确定要禁用联合?"
+disableFederationConfirmWarn: "禁用联合不会将帖子设为私有。在大多数情况下,不需要禁用联合。"
+disableFederationOk: "联合禁用"
invitationRequiredToRegister: "此服务器目前只允许拥有邀请码的人注册。"
emailNotSupported: "此服务器不支持发送邮件"
postToTheChannel: "发布到频道"
@@ -980,6 +984,11 @@ drivecleaner: "网盘整理"
retryAllQueuesNow: "立刻重试所有队列"
retryAllQueuesConfirmTitle: "要再尝试一次吗?"
retryAllQueuesConfirmText: "可能会使服务器负荷在一定时间内增加"
+enableChartsForRemoteUser: "生成远程用户的图表"
+enableChartsForFederatedInstances: "生成远程服务器的图表"
+showClipButtonInNoteFooter: "在贴文下方显示便签按钮"
+largeNoteReactions: "使用大图标来显示回应"
+noteIdOrUrl: "帖子ID或URL"
_achievements:
earnedAt: "达成时间"
_types:
@@ -1252,7 +1261,7 @@ _role:
gtlAvailable: "查看全局时间线"
ltlAvailable: "查看本地时间线"
canPublicNote: "允许公开发帖"
- canInvite: "发放实例邀请码"
+ canInvite: "发放服务器邀请码"
canManageCustomEmojis: "管理自定义表情符号"
driveCapacity: "网盘容量"
pinMax: "帖子置顶数量限制"
@@ -1276,6 +1285,8 @@ _role:
followersMoreThanOrEq: "关注者不少于"
followingLessThanOrEq: "关注中不多于"
followingMoreThanOrEq: "关注中不少于"
+ notesLessThanOrEq: "帖子数在~以下"
+ notesMoreThanOrEq: "帖子数在~以上"
and: "符合以下全部条件"
or: "符合以下任一条件"
not: "不符合以下任何条件"
@@ -1624,7 +1635,7 @@ _widgets:
photos: "照片"
digitalClock: "数字时钟"
unixClock: "UNIX时钟"
- federation: "联邦宇宙"
+ federation: "联合"
instanceCloud: "服务器云"
postForm: "投稿窗口"
slideshow: "幻灯片展示"
@@ -1875,6 +1886,16 @@ _drivecleaner:
orderBySizeDesc: "按大小降序排列"
orderByCreatedAtAsc: "按添加日期降序排列"
_webhookSettings:
+ createWebhook: "创建 Webhook"
name: "名称"
+ secret: "密钥"
+ events: "何时运行Webhook"
active: "已启用"
-
+ _events:
+ follow: "关注时"
+ followed: "被关注时"
+ note: "发布贴文时"
+ reply: "收到回复时"
+ renote: "被转发时"
+ reaction: "被回应时"
+ mention: "被提及时"
diff --git a/locales/zh-TW.yml b/locales/zh-TW.yml
index e031a88f4b..69f3d2f52c 100644
--- a/locales/zh-TW.yml
+++ b/locales/zh-TW.yml
@@ -15,7 +15,7 @@ gotIt: "知道了"
cancel: "取消"
noThankYou: "現在不要"
enterUsername: "輸入使用者名稱"
-renotedBy: "{user} 轉傳了"
+renotedBy: "{user} 轉發了"
noNotes: "無貼文。"
noNotifications: "沒有通知"
instance: "實例"
@@ -99,9 +99,9 @@ followRequestPending: "追隨許可批准中"
enterEmoji: "輸入表情符號"
renote: "轉發"
unrenote: "取消轉發"
-renoted: "轉傳成功"
+renoted: "轉發成功"
cantRenote: "無法轉發此貼文。"
-cantReRenote: "無法轉傳之前已經轉傳過的內容。"
+cantReRenote: "無法轉發之前已經轉發過的內容。"
quote: "引用"
inChannelRenote: "在頻道內轉發"
inChannelQuote: "在頻道內引用"
@@ -960,7 +960,6 @@ copyErrorInfo: "複製錯誤資訊"
joinThisServer: "在此伺服器上註冊"
exploreOtherServers: "探索其他伺服器"
letsLookAtTimeline: "看看時間軸"
-disableFederationWarn: "聯邦被停用了。即使停用也不會讓您的貼文不公開,在大多數情況下,不需要啟用這個選項。"
invitationRequiredToRegister: "目前這個伺服器為邀請制,必須擁有邀請碼才能註冊。"
emailNotSupported: "這個伺服器不支援寄送郵件"
postToTheChannel: "發布到頻道"
@@ -980,6 +979,11 @@ drivecleaner: "雲端硬碟清掃器"
retryAllQueuesNow: "立刻重試所有佇列"
retryAllQueuesConfirmTitle: "要現在重試嗎?"
retryAllQueuesConfirmText: "伺服器的負荷可能會暫時增加。"
+enableChartsForRemoteUser: "生成遠端用戶的圖表"
+enableChartsForFederatedInstances: "生成遠端伺服器的圖表"
+showClipButtonInNoteFooter: "將摘錄添加至貼文"
+largeNoteReactions: "將貼文的反應放大顯示"
+noteIdOrUrl: "貼文ID或URL"
_achievements:
earnedAt: "獲得日期"
_types:
@@ -1096,7 +1100,7 @@ _achievements:
title: "有備而來"
description: "設定了個人檔案"
_markedAsCat:
- title: "我是貓"
+ title: "吾輩乃貓是也"
description: "已將帳戶設定為貓"
flavor: "還沒有名字。"
_following1:
@@ -1276,6 +1280,8 @@ _role:
followersMoreThanOrEq: "追隨者人數在~以上"
followingLessThanOrEq: "追隨人數在~以下"
followingMoreThanOrEq: "追隨人數在~以上"
+ notesLessThanOrEq: "發布數在~以下"
+ notesMoreThanOrEq: "發布數在~以上"
and: "~和~"
or: "~或~"
not: "~否"
@@ -1875,6 +1881,16 @@ _drivecleaner:
orderBySizeDesc: "檔案由大到小"
orderByCreatedAtAsc: "依照加入的日期順序"
_webhookSettings:
+ createWebhook: "建立 Webhook"
name: "名稱"
+ secret: "秘密"
+ events: "什麼時候運行Webhook"
active: "已啟用"
-
+ _events:
+ follow: "當你追隨時"
+ followed: "當被追隨時"
+ note: "當發布貼文時"
+ reply: "當收到回覆時"
+ renote: "當被轉發時"
+ reaction: "當獲得反應時"
+ mention: "當被提到時"
diff --git a/package.json b/package.json
index e4cf9c85d2..c590388f3d 100644
--- a/package.json
+++ b/package.json
@@ -1,12 +1,12 @@
{
"name": "misskey",
- "version": "13.10.3",
+ "version": "13.11.0",
"codename": "nasubi",
"repository": {
"type": "git",
"url": "https://github.com/misskey-dev/misskey.git"
},
- "packageManager": "pnpm@7.29.3",
+ "packageManager": "pnpm@8.1.1",
"workspaces": [
"packages/frontend",
"packages/backend",
@@ -16,6 +16,7 @@
"scripts": {
"build-pre": "node ./scripts/build-pre.js",
"build": "pnpm build-pre && pnpm -r build && pnpm gulp",
+ "build-storybook": "pnpm --filter frontend build-storybook",
"start": "pnpm check:connect && cd packages/backend && node ./built/boot/index.js",
"start:test": "cd packages/backend && cross-env NODE_ENV=test node ./built/boot/index.js",
"init": "pnpm migrate",
@@ -50,16 +51,16 @@
"gulp-replace": "1.1.4",
"gulp-terser": "2.1.0",
"js-yaml": "4.1.0",
- "typescript": "4.9.5"
+ "typescript": "5.0.3"
},
"devDependencies": {
"@types/gulp": "4.0.10",
"@types/gulp-rename": "2.0.1",
- "@typescript-eslint/eslint-plugin": "5.54.1",
- "@typescript-eslint/parser": "5.54.1",
+ "@typescript-eslint/eslint-plugin": "5.57.1",
+ "@typescript-eslint/parser": "5.57.1",
"cross-env": "7.0.3",
- "cypress": "12.7.0",
- "eslint": "8.35.0",
+ "cypress": "12.9.0",
+ "eslint": "8.37.0",
"start-server-and-test": "2.0.0"
},
"optionalDependencies": {
diff --git a/packages/backend/check_connect.js b/packages/backend/check_connect.js
index ed429c0254..ef0a350fbf 100644
--- a/packages/backend/check_connect.js
+++ b/packages/backend/check_connect.js
@@ -1,8 +1,15 @@
+import Redis from 'ioredis';
import { loadConfig } from './built/config.js';
-import { createRedisConnection } from './built/redis.js';
const config = loadConfig();
-const redis = createRedisConnection(config);
+const redis = new Redis({
+ port: config.redis.port,
+ host: config.redis.host,
+ family: config.redis.family == null ? 0 : config.redis.family,
+ password: config.redis.pass,
+ keyPrefix: `${config.redis.prefix}:`,
+ db: config.redis.db ?? 0,
+});
redis.on('connect', () => redis.disconnect());
redis.on('error', (e) => {
diff --git a/packages/backend/migration/1680228513388-channelFavorite.js b/packages/backend/migration/1680228513388-channelFavorite.js
new file mode 100644
index 0000000000..afc676959a
--- /dev/null
+++ b/packages/backend/migration/1680228513388-channelFavorite.js
@@ -0,0 +1,21 @@
+export class channelFavorite1680228513388 {
+ name = 'channelFavorite1680228513388'
+
+ async up(queryRunner) {
+ await queryRunner.query(`CREATE TABLE "channel_favorite" ("id" character varying(32) NOT NULL, "createdAt" TIMESTAMP WITH TIME ZONE NOT NULL, "channelId" character varying(32) NOT NULL, "userId" character varying(32) NOT NULL, CONSTRAINT "PK_59bddfd54d48689a298d41af00c" PRIMARY KEY ("id")); COMMENT ON COLUMN "channel_favorite"."createdAt" IS 'The created date of the ChannelFavorite.'`);
+ await queryRunner.query(`CREATE INDEX "IDX_735a5544f9249d412255f47f95" ON "channel_favorite" ("createdAt") `);
+ await queryRunner.query(`CREATE INDEX "IDX_d3ca0db011b75ac2a940a2337d" ON "channel_favorite" ("channelId") `);
+ await queryRunner.query(`CREATE INDEX "IDX_8302bd27226605ece14842fb25" ON "channel_favorite" ("userId") `);
+ await queryRunner.query(`ALTER TABLE "channel_favorite" ADD CONSTRAINT "FK_d3ca0db011b75ac2a940a2337d2" FOREIGN KEY ("channelId") REFERENCES "channel"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
+ await queryRunner.query(`ALTER TABLE "channel_favorite" ADD CONSTRAINT "FK_8302bd27226605ece14842fb25a" FOREIGN KEY ("userId") REFERENCES "user"("id") ON DELETE CASCADE ON UPDATE NO ACTION`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "channel_favorite" DROP CONSTRAINT "FK_8302bd27226605ece14842fb25a"`);
+ await queryRunner.query(`ALTER TABLE "channel_favorite" DROP CONSTRAINT "FK_d3ca0db011b75ac2a940a2337d2"`);
+ await queryRunner.query(`DROP INDEX "public"."IDX_8302bd27226605ece14842fb25"`);
+ await queryRunner.query(`DROP INDEX "public"."IDX_d3ca0db011b75ac2a940a2337d"`);
+ await queryRunner.query(`DROP INDEX "public"."IDX_735a5544f9249d412255f47f95"`);
+ await queryRunner.query(`DROP TABLE "channel_favorite"`);
+ }
+}
diff --git a/packages/backend/migration/1680238118084-channelNotePining.js b/packages/backend/migration/1680238118084-channelNotePining.js
new file mode 100644
index 0000000000..126eae87ea
--- /dev/null
+++ b/packages/backend/migration/1680238118084-channelNotePining.js
@@ -0,0 +1,11 @@
+export class channelNotePining1680238118084 {
+ name = 'channelNotePining1680238118084'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "channel" ADD "pinnedNoteIds" character varying(128) array NOT NULL DEFAULT '{}'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "channel" DROP COLUMN "pinnedNoteIds"`);
+ }
+}
diff --git a/packages/backend/migration/1680491187535-cleanup.js b/packages/backend/migration/1680491187535-cleanup.js
new file mode 100644
index 0000000000..1e609ca060
--- /dev/null
+++ b/packages/backend/migration/1680491187535-cleanup.js
@@ -0,0 +1,10 @@
+export class cleanup1680491187535 {
+ name = 'cleanup1680491187535'
+
+ async up(queryRunner) {
+ await queryRunner.query(`DROP TABLE "antenna_note" `);
+ }
+
+ async down(queryRunner) {
+ }
+}
diff --git a/packages/backend/migration/1680582195041-cleanup.js b/packages/backend/migration/1680582195041-cleanup.js
new file mode 100644
index 0000000000..c587e456a5
--- /dev/null
+++ b/packages/backend/migration/1680582195041-cleanup.js
@@ -0,0 +1,11 @@
+export class cleanup1680582195041 {
+ name = 'cleanup1680582195041'
+
+ async up(queryRunner) {
+ await queryRunner.query(`DROP TABLE "notification" `);
+ }
+
+ async down(queryRunner) {
+
+ }
+}
diff --git a/packages/backend/migration/1680775031481-avatar-url-and-banner-url.js b/packages/backend/migration/1680775031481-avatar-url-and-banner-url.js
new file mode 100644
index 0000000000..7c5fe7ac5e
--- /dev/null
+++ b/packages/backend/migration/1680775031481-avatar-url-and-banner-url.js
@@ -0,0 +1,17 @@
+export class AvatarUrlAndBannerUrl1680775031481 {
+ name = 'AvatarUrlAndBannerUrl1680775031481'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" ADD "avatarUrl" character varying(512)`);
+ await queryRunner.query(`ALTER TABLE "user" ADD "bannerUrl" character varying(512)`);
+ await queryRunner.query(`ALTER TABLE "user" ADD "avatarBlurhash" character varying(128)`);
+ await queryRunner.query(`ALTER TABLE "user" ADD "bannerBlurhash" character varying(128)`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "bannerBlurhash"`);
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "avatarBlurhash"`);
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "bannerUrl"`);
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "avatarUrl"`);
+ }
+}
diff --git a/packages/backend/migration/1680931179228-account-move.js b/packages/backend/migration/1680931179228-account-move.js
new file mode 100644
index 0000000000..821318d1bc
--- /dev/null
+++ b/packages/backend/migration/1680931179228-account-move.js
@@ -0,0 +1,17 @@
+export class AccountMove1680931179228 {
+ name = 'AccountMove1680931179228'
+
+ async up(queryRunner) {
+ await queryRunner.query(`ALTER TABLE "user" ADD "movedToUri" character varying(512)`);
+ await queryRunner.query(`COMMENT ON COLUMN "user"."movedToUri" IS 'The URI of the new account of the User'`);
+ await queryRunner.query(`ALTER TABLE "user" ADD "alsoKnownAs" text`);
+ await queryRunner.query(`COMMENT ON COLUMN "user"."alsoKnownAs" IS 'URIs the user is known as too'`);
+ }
+
+ async down(queryRunner) {
+ await queryRunner.query(`COMMENT ON COLUMN "user"."alsoKnownAs" IS 'URIs the user is known as too'`);
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "alsoKnownAs"`);
+ await queryRunner.query(`COMMENT ON COLUMN "user"."movedToUri" IS 'The URI of the new account of the User'`);
+ await queryRunner.query(`ALTER TABLE "user" DROP COLUMN "movedToUri"`);
+ }
+}
diff --git a/packages/backend/package.json b/packages/backend/package.json
index 3f640c4a63..875774bbd5 100644
--- a/packages/backend/package.json
+++ b/packages/backend/package.json
@@ -22,42 +22,42 @@
"test-and-coverage": "pnpm jest-and-coverage"
},
"optionalDependencies": {
- "@swc/core-android-arm64": "^1.3.11",
- "@swc/core-darwin-arm64": "^1.3.38",
- "@swc/core-darwin-x64": "^1.3.38",
- "@swc/core-linux-arm-gnueabihf": "^1.3.38",
- "@swc/core-linux-arm64-gnu": "^1.3.38",
- "@swc/core-linux-arm64-musl": "^1.3.38",
- "@swc/core-linux-x64-gnu": "^1.3.38",
- "@swc/core-linux-x64-musl": "^1.3.38",
- "@swc/core-win32-arm64-msvc": "^1.3.38",
- "@swc/core-win32-ia32-msvc": "^1.3.38",
- "@swc/core-win32-x64-msvc": "^1.3.38",
+ "@swc/core-android-arm64": "1.3.11",
+ "@swc/core-darwin-arm64": "1.3.46",
+ "@swc/core-darwin-x64": "1.3.46",
+ "@swc/core-linux-arm-gnueabihf": "1.3.46",
+ "@swc/core-linux-arm64-gnu": "1.3.46",
+ "@swc/core-linux-arm64-musl": "1.3.46",
+ "@swc/core-linux-x64-gnu": "1.3.46",
+ "@swc/core-linux-x64-musl": "1.3.46",
+ "@swc/core-win32-arm64-msvc": "1.3.46",
+ "@swc/core-win32-ia32-msvc": "1.3.46",
+ "@swc/core-win32-x64-msvc": "1.3.46",
"@tensorflow/tfjs": "4.2.0",
"@tensorflow/tfjs-node": "4.2.0"
},
"dependencies": {
- "@aws-sdk/client-s3": "^3.294.0",
- "@aws-sdk/lib-storage": "^3.294.0",
- "@aws-sdk/node-http-handler": "^3.292.0",
+ "@aws-sdk/client-s3": "3.306.0",
+ "@aws-sdk/lib-storage": "3.306.0",
+ "@aws-sdk/node-http-handler": "3.306.0",
"@bull-board/api": "5.0.0",
"@bull-board/fastify": "5.0.0",
"@bull-board/ui": "5.0.0",
- "@discordapp/twemoji": "14.0.2",
+ "@discordapp/twemoji": "14.1.2",
"@fastify/accepts": "4.1.0",
"@fastify/cookie": "8.3.0",
- "@fastify/cors": "8.2.0",
- "@fastify/http-proxy": "8.4.0",
- "@fastify/multipart": "7.4.2",
- "@fastify/static": "6.9.0",
+ "@fastify/cors": "8.2.1",
+ "@fastify/http-proxy": "9.0.0",
+ "@fastify/multipart": "7.5.0",
+ "@fastify/static": "6.10.0",
"@fastify/view": "7.4.1",
- "@nestjs/common": "9.3.9",
- "@nestjs/core": "9.3.9",
- "@nestjs/testing": "9.3.9",
+ "@nestjs/common": "9.4.0",
+ "@nestjs/core": "9.4.0",
+ "@nestjs/testing": "9.4.0",
"@peertube/http-signature": "1.7.0",
"@sinonjs/fake-timers": "10.0.2",
"@swc/cli": "0.1.62",
- "@swc/core": "1.3.38",
+ "@swc/core": "1.3.46",
"accepts": "1.3.8",
"ajv": "8.12.0",
"archiver": "5.3.1",
@@ -76,7 +76,7 @@
"date-fns": "2.29.3",
"deep-email-validator": "0.1.21",
"escape-regexp": "0.0.1",
- "fastify": "4.14.1",
+ "fastify": "4.15.0",
"feed": "4.2.2",
"file-type": "18.2.1",
"fluent-ffmpeg": "2.1.2",
@@ -88,21 +88,21 @@
"ip-cidr": "3.1.0",
"is-svg": "4.3.2",
"js-yaml": "4.1.0",
- "jsdom": "21.1.0",
+ "jsdom": "21.1.1",
"json5": "2.2.3",
"jsonld": "8.1.1",
- "jsrsasign": "10.6.1",
+ "jsrsasign": "10.7.0",
"mfm-js": "0.23.3",
"mime-types": "2.1.35",
- "misskey-js": "0.0.15",
+ "misskey-js": "workspace:*",
"ms": "3.0.0-canary.1",
"nested-property": "4.0.0",
- "node-fetch": "3.3.0",
+ "node-fetch": "3.3.1",
"nodemailer": "6.9.1",
"nsfwjs": "2.4.2",
"oauth": "0.10.0",
"os-utils": "0.0.14",
- "otpauth": "^9.0.2",
+ "otpauth": "9.1.1",
"parse5": "7.1.2",
"pg": "8.10.0",
"private-ip": "3.0.0",
@@ -125,7 +125,7 @@
"sanitize-html": "2.10.0",
"seedrandom": "3.0.5",
"semver": "7.3.8",
- "sharp": "0.31.3",
+ "sharp": "0.32.0",
"sharp-read-bmp": "github:misskey-dev/sharp-read-bmp",
"strict-event-emitter-types": "2.0.0",
"stringz": "2.1.0",
@@ -133,25 +133,25 @@
"systeminformation": "5.17.12",
"tinycolor2": "1.6.0",
"tmp": "0.2.1",
- "tsc-alias": "1.8.3",
- "tsconfig-paths": "4.1.2",
+ "tsc-alias": "1.8.5",
+ "tsconfig-paths": "4.2.0",
"twemoji-parser": "14.0.0",
- "typeorm": "0.3.11",
- "typescript": "4.9.5",
+ "typeorm": "0.3.13",
+ "typescript": "5.0.3",
"ulid": "2.3.0",
"unzipper": "0.10.11",
"uuid": "9.0.0",
"vary": "1.1.2",
"web-push": "3.5.0",
"websocket": "1.0.34",
- "ws": "8.12.1",
+ "ws": "8.13.0",
"xev": "3.0.2"
},
"devDependencies": {
"@jest/globals": "29.5.0",
"@swc/jest": "0.2.24",
"@types/accepts": "1.3.5",
- "@types/archiver": "5.3.1",
+ "@types/archiver": "5.3.2",
"@types/bcryptjs": "2.4.2",
"@types/bull": "4.10.0",
"@types/cbor": "6.0.0",
@@ -160,13 +160,13 @@
"@types/escape-regexp": "0.0.1",
"@types/fluent-ffmpeg": "2.1.21",
"@types/ioredis": "4.28.10",
- "@types/jest": "29.4.0",
+ "@types/jest": "29.5.0",
"@types/js-yaml": "4.0.5",
- "@types/jsdom": "21.1.0",
+ "@types/jsdom": "21.1.1",
"@types/jsonld": "1.5.8",
- "@types/jsrsasign": "10.5.5",
+ "@types/jsrsasign": "10.5.8",
"@types/mime-types": "2.1.1",
- "@types/node": "18.15.0",
+ "@types/node": "18.15.11",
"@types/node-fetch": "3.0.3",
"@types/nodemailer": "6.4.7",
"@types/oauth": "0.9.1",
@@ -178,7 +178,7 @@
"@types/ratelimiter": "3.4.4",
"@types/redis": "4.0.11",
"@types/rename": "1.0.4",
- "@types/sanitize-html": "2.8.1",
+ "@types/sanitize-html": "2.9.0",
"@types/semver": "7.3.13",
"@types/sharp": "0.31.1",
"@types/sinonjs__fake-timers": "8.1.2",
@@ -190,11 +190,11 @@
"@types/web-push": "3.3.2",
"@types/websocket": "1.0.5",
"@types/ws": "8.5.4",
- "@typescript-eslint/eslint-plugin": "5.54.1",
- "@typescript-eslint/parser": "5.54.1",
+ "@typescript-eslint/eslint-plugin": "5.57.1",
+ "@typescript-eslint/parser": "5.57.1",
"aws-sdk-client-mock": "^2.1.1",
"cross-env": "7.0.3",
- "eslint": "8.35.0",
+ "eslint": "8.37.0",
"eslint-plugin-import": "2.27.5",
"execa": "6.1.0",
"jest": "29.5.0",
diff --git a/packages/backend/src/GlobalModule.ts b/packages/backend/src/GlobalModule.ts
index 801f1db741..cb713b25ad 100644
--- a/packages/backend/src/GlobalModule.ts
+++ b/packages/backend/src/GlobalModule.ts
@@ -2,18 +2,15 @@ import { setTimeout } from 'node:timers/promises';
import { Global, Inject, Module } from '@nestjs/common';
import Redis from 'ioredis';
import { DataSource } from 'typeorm';
-import { createRedisConnection } from '@/redis.js';
import { DI } from './di-symbols.js';
import { loadConfig } from './config.js';
import { createPostgresDataSource } from './postgres.js';
import { RepositoryModule } from './models/RepositoryModule.js';
import type { Provider, OnApplicationShutdown } from '@nestjs/common';
-const config = loadConfig();
-
const $config: Provider = {
provide: DI.config,
- useValue: config,
+ useValue: loadConfig(),
};
const $db: Provider = {
@@ -28,18 +25,31 @@ const $db: Provider = {
const $redis: Provider = {
provide: DI.redis,
useFactory: (config) => {
- const redisClient = createRedisConnection(config);
- return redisClient;
+ return new Redis({
+ port: config.redis.port,
+ host: config.redis.host,
+ family: config.redis.family == null ? 0 : config.redis.family,
+ password: config.redis.pass,
+ keyPrefix: `${config.redis.prefix}:`,
+ db: config.redis.db ?? 0,
+ });
},
inject: [DI.config],
};
-const $redisSubscriber: Provider = {
- provide: DI.redisSubscriber,
+const $redisForPubsub: Provider = {
+ provide: DI.redisForPubsub,
useFactory: (config) => {
- const redisSubscriber = createRedisConnection(config);
- redisSubscriber.subscribe(config.host);
- return redisSubscriber;
+ const redis = new Redis({
+ port: config.redisForPubsub.port,
+ host: config.redisForPubsub.host,
+ family: config.redisForPubsub.family == null ? 0 : config.redisForPubsub.family,
+ password: config.redisForPubsub.pass,
+ keyPrefix: `${config.redisForPubsub.prefix}:`,
+ db: config.redisForPubsub.db ?? 0,
+ });
+ redis.subscribe(config.host);
+ return redis;
},
inject: [DI.config],
};
@@ -47,14 +57,14 @@ const $redisSubscriber: Provider = {
@Global()
@Module({
imports: [RepositoryModule],
- providers: [$config, $db, $redis, $redisSubscriber],
- exports: [$config, $db, $redis, $redisSubscriber, RepositoryModule],
+ providers: [$config, $db, $redis, $redisForPubsub],
+ exports: [$config, $db, $redis, $redisForPubsub, RepositoryModule],
})
export class GlobalModule implements OnApplicationShutdown {
constructor(
@Inject(DI.db) private db: DataSource,
@Inject(DI.redis) private redisClient: Redis.Redis,
- @Inject(DI.redisSubscriber) private redisSubscriber: Redis.Redis,
+ @Inject(DI.redisForPubsub) private redisForPubsub: Redis.Redis,
) {}
async onApplicationShutdown(signal: string): Promise {
@@ -69,7 +79,7 @@ export class GlobalModule implements OnApplicationShutdown {
await Promise.all([
this.db.destroy(),
this.redisClient.disconnect(),
- this.redisSubscriber.disconnect(),
+ this.redisForPubsub.disconnect(),
]);
}
}
diff --git a/packages/backend/src/config.ts b/packages/backend/src/config.ts
index 73f45e92e1..e4f7601fa9 100644
--- a/packages/backend/src/config.ts
+++ b/packages/backend/src/config.ts
@@ -25,6 +25,14 @@ export type Source = {
disableCache?: boolean;
extra?: { [x: string]: string };
};
+ dbReplications?: boolean;
+ dbSlaves?: {
+ host: string;
+ port: number;
+ db: string;
+ user: string;
+ pass: string;
+ }[];
redis: {
host: string;
port: number;
@@ -33,6 +41,22 @@ export type Source = {
db?: number;
prefix?: string;
};
+ redisForPubsub?: {
+ host: string;
+ port: number;
+ family?: number;
+ pass: string;
+ db?: number;
+ prefix?: string;
+ };
+ redisForJobQueue?: {
+ host: string;
+ port: number;
+ family?: number;
+ pass: string;
+ db?: number;
+ prefix?: string;
+ };
elasticsearch: {
host: string;
port: number;
@@ -91,6 +115,8 @@ export type Mixin = {
mediaProxy: string;
externalMediaProxyEnabled: boolean;
videoThumbnailGenerator: string | null;
+ redisForPubsub: NonNullable