mirror of
https://github.com/misskey-dev/misskey.git
synced 2026-07-30 11:55:49 +00:00
Compare commits
328 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 6f54416f63 | |||
| a63c8ef939 | |||
| 015868f17f | |||
| dc3fd42d63 | |||
| 34a4b9b74c | |||
| 4a7ff6d7f4 | |||
| 3d87032881 | |||
| dc3f2a0012 | |||
| 79b4a73679 | |||
| 170ee2bfeb | |||
| c9ac4f9b41 | |||
| d5a09b3919 | |||
| 5cb6661484 | |||
| 575390e612 | |||
| c6eb30cfb8 | |||
| 48216d343e | |||
| 82cca1124f | |||
| 2d2aa779ad | |||
| eb7626924e | |||
| 7725110e1c | |||
| 4c3f40a87d | |||
| 5e3977973f | |||
| 98ae62c432 | |||
| 41e730a763 | |||
| b51d5ba0a0 | |||
| 159b1a4484 | |||
| f138a48419 | |||
| 1dcd6c287c | |||
| ccd04fbcd9 | |||
| b2d07ca6e3 | |||
| ab369784fb | |||
| 7157f37011 | |||
| bbd57c751c | |||
| 36c442a7b4 | |||
| 79340aec97 | |||
| e06878b7ec | |||
| 23de8030b1 | |||
| 8c28fd3a1b | |||
| cc2ed939b1 | |||
| 3f11a28003 | |||
| 13994163c4 | |||
| d0de75d33f | |||
| 95405e38df | |||
| f7c070cb09 | |||
| 3f28489fb8 | |||
| 9eca9b6f0d | |||
| 95de10ee65 | |||
| bdf1547a42 | |||
| fca7859c89 | |||
| b674da1bc8 | |||
| 37b4a7a8c4 | |||
| 65bcca04be | |||
| 227268fa1b | |||
| 00a123d62d | |||
| 71a50f3d34 | |||
| 1812f7c11c | |||
| 0be4d352ec | |||
| 8691babd56 | |||
| b5f0e96bf1 | |||
| 5a6b9439b6 | |||
| 3de6b610b5 | |||
| 3760e7a9f8 | |||
| 88c6cd1766 | |||
| 0272ee73eb | |||
| ab21fc725b | |||
| 5d0ecf976d | |||
| ceb31f16c8 | |||
| b028d4ad5b | |||
| 68193dd38c | |||
| 203a6b3792 | |||
| 2874a6d5ba | |||
| 8aff44ae2e | |||
| 153875e1d9 | |||
| fd83c9cb64 | |||
| 64f98faca9 | |||
| ab92f98472 | |||
| 77c2f54fa5 | |||
| 1a04d4c2d9 | |||
| 12be1fe5b5 | |||
| 93bbc89c7a | |||
| 875554003e | |||
| 828a24f6df | |||
| ac8e8c4892 | |||
| b5e470b6d4 | |||
| 212fcaf254 | |||
| 22cdc24b04 | |||
| df063d9386 | |||
| 3c1f01af10 | |||
| 0f3210946d | |||
| 61b8332988 | |||
| 8439080916 | |||
| 112263135e | |||
| 2199f9040d | |||
| 1e4260cfb1 | |||
| a7fd58e4a5 | |||
| fb483d8367 | |||
| ef852e6ab0 | |||
| 0ad72528da | |||
| 11c6fb1567 | |||
| afca066833 | |||
| 945fd40578 | |||
| b6996a2766 | |||
| 9076a4ecf3 | |||
| d74a7a515c | |||
| ce411817b4 | |||
| 0849dc7cdd | |||
| ed70123ace | |||
| 1110d334c8 | |||
| 667919581e | |||
| 152e0fc48c | |||
| e3cb641c98 | |||
| 4d7e62d677 | |||
| ecd85e5613 | |||
| 91ea966b04 | |||
| 3d4c62b0bb | |||
| a98469d34d | |||
| 5a2acf71a0 | |||
| 49e59a3d56 | |||
| ecd1d615ff | |||
| 53c398ce43 | |||
| f74b427e67 | |||
| aab7903ab0 | |||
| 6ceda0f004 | |||
| df5c491f4c | |||
| 15c187ffa2 | |||
| b4abbe432e | |||
| 2335eb7b7f | |||
| 059fbaa92b | |||
| 76ab562810 | |||
| 9472e72678 | |||
| 9440423a73 | |||
| b2867eb0d7 | |||
| 5590f8bad9 | |||
| c15f93e48d | |||
| 03d224acd0 | |||
| c24ce9b55a | |||
| 7243bd34b9 | |||
| d4dd02c744 | |||
| 3817f00803 | |||
| f066c1c2ef | |||
| 1d41cb3d29 | |||
| 1858d56918 | |||
| 97082efd99 | |||
| 187610d516 | |||
| 00b2cb2076 | |||
| 426f6748e5 | |||
| c423bf92a8 | |||
| f59bf35615 | |||
| 0f056c4955 | |||
| eb2c7ff6c6 | |||
| 9f614517c0 | |||
| 5432984af8 | |||
| c29a3d902b | |||
| 721b1b06a0 | |||
| 97e54a1ee8 | |||
| 96d6a09ebc | |||
| 1eedf04d9a | |||
| 2d67380f2a | |||
| 174fb434cc | |||
| 7e29f04287 | |||
| bf88122140 | |||
| 4daa1ffe05 | |||
| 62f8589c05 | |||
| 6193c35f9f | |||
| 1220f05903 | |||
| 7544ebf7a3 | |||
| ffe65caf10 | |||
| 4f993cef1b | |||
| ba3fb4aa14 | |||
| 0137b1c406 | |||
| 797dec7d0e | |||
| 42ff280163 | |||
| 554339aaa1 | |||
| 529c4d4d0e | |||
| cec23e5756 | |||
| e9715aa45a | |||
| dbbc5fc8c0 | |||
| 228beff6c8 | |||
| 1faeb9b324 | |||
| d1cac26cfb | |||
| a107caef6b | |||
| 8fc3403d13 | |||
| a7503c225d | |||
| 3cd772e5a6 | |||
| 8af257929d | |||
| 99a4eeb87d | |||
| 1068c6424f | |||
| 9b32c6ffb8 | |||
| 038a2d0b81 | |||
| 61f734d369 | |||
| 669889f749 | |||
| a1f995cba8 | |||
| 2747fd0348 | |||
| 08ca482bcd | |||
| 5cbdbd111b | |||
| 93fd491499 | |||
| 73dca04885 | |||
| aad6ce835d | |||
| 9785962539 | |||
| 8a479bd6ee | |||
| faecaccab9 | |||
| 1c4bcd9b32 | |||
| e90ef7eba2 | |||
| 1f4978b9e2 | |||
| 4d6ad90d3e | |||
| 2116213dc8 | |||
| 0904855001 | |||
| 453f38b6b6 | |||
| 079ec865e0 | |||
| d0081035fc | |||
| fdc2f79855 | |||
| 7b2790e46d | |||
| 351f878e2c | |||
| 83319d1cc2 | |||
| 8dfa900729 | |||
| 5ab352da11 | |||
| 4a056bc143 | |||
| bfad097ede | |||
| 69ae0c154d | |||
| 59ae3801dc | |||
| 1173550784 | |||
| e12f97b1d8 | |||
| a27b155dcf | |||
| 3e1a090657 | |||
| e77184ffdb | |||
| f6cfe15860 | |||
| f703413a39 | |||
| 2c814ecd83 | |||
| 05e00e4c2b | |||
| 4bacb1bfbe | |||
| 8186742c0f | |||
| 544c4227f7 | |||
| 6e4380f11d | |||
| cb1d1d651a | |||
| c899aafeef | |||
| 72d91ce3da | |||
| 09b761e4d1 | |||
| 6d11f572b3 | |||
| d54b948085 | |||
| f5806a0560 | |||
| 5d8c31b6e5 | |||
| fff87f6604 | |||
| 7a3e03411f | |||
| 6d89d479e2 | |||
| ab73b8abe3 | |||
| 3c83952c48 | |||
| 2954dee108 | |||
| 00c6210a59 | |||
| 2b87748537 | |||
| 266a3c473b | |||
| 1eac4ccf51 | |||
| d323fe00d0 | |||
| 053e244582 | |||
| c0a8c7f93a | |||
| 1d0b27b4c5 | |||
| 3c003d73c4 | |||
| 36d78a788d | |||
| 09f058f29a | |||
| ad8b194643 | |||
| 4c9dd0e5ff | |||
| 0ced35ae6c | |||
| dcced940af | |||
| dc97a72fdb | |||
| cc7f1e7366 | |||
| 77878256a8 | |||
| 662129f414 | |||
| 4457a75d22 | |||
| 0956da49e9 | |||
| 21a4f95bd6 | |||
| 1c6e5365d6 | |||
| ae5d2d40d7 | |||
| e2d2ca54fa | |||
| 7f00846779 | |||
| 420d1f0f95 | |||
| 3693adbb2d | |||
| 1679f6c2ee | |||
| d7c11a61c5 | |||
| bbcce5b49d | |||
| e117456815 | |||
| 23ff411b36 | |||
| 05dd02a463 | |||
| 7bd8f8148b | |||
| f46450d857 | |||
| b125ce1eb2 | |||
| dc96c35296 | |||
| 8468a25488 | |||
| 6c7375924c | |||
| ec6b1cc6a8 | |||
| e093b32aa9 | |||
| 0b4764c68b | |||
| 5157c277f1 | |||
| 81b182460e | |||
| 2aa6d4fc7f | |||
| 3ac6d287d6 | |||
| 42a59b5d76 | |||
| 138e66e618 | |||
| 4188d68457 | |||
| 6391a4e7e2 | |||
| 41048638a2 | |||
| 9c0e3e7937 | |||
| fe3dd8edb5 | |||
| 0d46089f9a | |||
| 7420c10a58 | |||
| e40c84f31d | |||
| 994fc062cf | |||
| e7681f6c79 | |||
| 19053339d9 | |||
| b4e16c83e2 | |||
| 56cc89b521 | |||
| 1eab314b17 | |||
| ec21336d45 | |||
| e86e9b46b3 | |||
| 9b729b3d25 | |||
| 3c973e21f2 | |||
| 830e2f0a5b | |||
| 1620477a1c | |||
| 92b9a5218d | |||
| 9ed0d5ccec | |||
| a6d1727205 | |||
| 3c3982464f | |||
| bef73ff530 | |||
| 4d31c0b1de | |||
| a5f28c21e4 | |||
| c93ead7474 | |||
| 36880493cb | |||
| e8518de054 | |||
| b99e13e667 | |||
| 2518cf36d0 |
@@ -0,0 +1,10 @@
|
||||
---
|
||||
name: creating-issues-and-prs
|
||||
description: Defines rules for creating Issues and Pull Requests on GitHub, including precautions when AI is used to create them. Triggered by phrases like "create issue", "create pull request", or "create PR".
|
||||
---
|
||||
|
||||
# creating-issues-and-prs
|
||||
|
||||
This is the Codex entrypoint for the canonical rules regarding creating Issues and Pull Requests on GitHub, especially when AI is involved.
|
||||
|
||||
Read and follow [.claude/skills/creating-issues-and-prs/SKILL.md](../../../.claude/skills/creating-issues-and-prs/SKILL.md). Treat that file and its `references/` directory (if present) as the source of truth.
|
||||
@@ -19,7 +19,7 @@
|
||||
|---|---|---|---|
|
||||
| `skills/context-budget/SKILL.md` | `skills/context-budget/SKILL.md` | ECC | description を日本語化、Misskey 固有メモを追記 |
|
||||
| `commands/harness-audit.md` | `commands/harness-audit.md` | ECC | scripts 依存の自動採点を、Claude が `pnpm`/`git`/`grep` で手動採点する版に書き換え。Misskey 固有の評価軸 (SPDX / endpoint-list / migration / locales) を組み込み |
|
||||
| `commands/quality-gate.md` | `commands/quality-gate.md` | ECC | 言語自動判定を排除し Misskey 固定 pipeline (`pnpm` + tsgo + ESLint + Vitest) に。Prettier/Biome フェーズを削除 |
|
||||
| `commands/quality-gate.md` | `commands/quality-gate.md` | ECC | 言語自動判定を排除し Misskey 固定 pipeline (`pnpm` + tsc + ESLint + Vitest) に。Prettier/Biome フェーズを削除 |
|
||||
|
||||
### MIT License (full text)
|
||||
|
||||
|
||||
@@ -35,7 +35,7 @@ Misskey リポジトリの `.claude/` 構成を 7 カテゴリで採点し、改
|
||||
| 2 | Context Efficiency | frontmatter description の冗長度、SKILL.md の長さ分布、重複情報、CLAUDE.md の肥大化 |
|
||||
| 3 | Quality Gates | Stop / PreToolUse / PostToolUse hook の整備、`/quality-gate` 等の完了前ゲートの有無、自動 lint/typecheck |
|
||||
| 4 | Memory Persistence | `.claude/skills/*/SKILL.md` と `references/` の同期状態を評価。プロジェクト側 `.claude/memory/` は未採用方針 (auto-memory はユーザーホーム側で自動運用) のため、ここを採点起点にせず既定 5/10 から開始する |
|
||||
| 5 | Eval Coverage | `working-on-backend` / `working-on-frontend` の testing リファレンス (backend-testing.md / frontend-testing.md) の網羅、Misskey 固有の e2e/fed/Storybook/Cypress 適用ガイド |
|
||||
| 5 | Eval Coverage | `working-on-backend` / `working-on-frontend` の testing リファレンス (backend-testing.md / frontend-testing.md) の網羅、Misskey 固有の e2e/fed/Storybook/Playwright 適用ガイド |
|
||||
| 6 | Security Guardrails | SPDX 規約適用、migration 不変性ルール、ja-JP.yml 限定編集ルール、secrets 検出 |
|
||||
| 7 | Cost Efficiency | enabledPlugins の重複・過剰、context-budget の整備、MCP 過剰登録なし |
|
||||
|
||||
|
||||
@@ -12,16 +12,16 @@ upstream path: commands/quality-gate.md
|
||||
upstream license: MIT — https://github.com/affaan-m/everything-claude-code/blob/main/LICENSE
|
||||
project-level notice: see .claude/THIRD_PARTY_LICENSES.md (Misskey 内サードパーティ一覧 + MIT 全文)
|
||||
|
||||
Imported into Misskey .claude/ on 2026-05-10. Pipeline 概念 (lint → typecheck → test) は upstream ECC 版から借用 (MIT)。実コマンド層は Misskey の pnpm + tsgo + ESLint + Vitest に固定し、formatter (Prettier/Biome) フェーズは削除した。
|
||||
Imported into Misskey .claude/ on 2026-05-10. Pipeline 概念 (lint → typecheck → test) は upstream ECC 版から借用 (MIT)。実コマンド層は Misskey の pnpm + tsc + ESLint + Vitest に固定し、formatter (Prettier/Biome) フェーズは削除した。
|
||||
|
||||
note: 元 ECC 版は言語自動判定 + format/lint/type のジェネリック版だったが、Misskey 専用に pnpm + tsgo + ESLint + Vitest の組み合わせに固定。重い test:e2e / test:fed は含まない (CI 側で実行される)。
|
||||
note: 元 ECC 版は言語自動判定 + format/lint/type のジェネリック版だったが、Misskey 専用に pnpm + tsc + ESLint + Vitest の組み合わせに固定。重い test:e2e / test:fed は含まない (CI 側で実行される)。
|
||||
-->
|
||||
|
||||
# /quality-gate — Misskey 軽量品質ゲート
|
||||
|
||||
`/quality-gate [scope]`
|
||||
|
||||
完了前の **軽量** 品質チェック。重い E2E / 連合テスト (test:e2e / test:fed / Cypress) は CI 側で実行されるため、本コマンドには含めない。
|
||||
完了前の **軽量** 品質チェック。重い E2E / 連合テスト (test:e2e / test:fed / Playwright) は CI 側で実行されるため、本コマンドには含めない。
|
||||
|
||||
## Scope
|
||||
|
||||
@@ -50,7 +50,7 @@ pnpm --filter frontend test
|
||||
lint がまとめて失敗していて typecheck の結果だけ単独で見たい場合は、以下を個別に回す。**通常は不要** (lint の出力を読めば足りる):
|
||||
|
||||
```bash
|
||||
pnpm --filter backend typecheck # tsgo 単体
|
||||
pnpm --filter backend typecheck # tsc 単体
|
||||
pnpm --filter frontend typecheck # vue-tsc 単体 (Vue SFC の型を見るため)
|
||||
```
|
||||
|
||||
@@ -63,7 +63,7 @@ pnpm --filter backend lint
|
||||
pnpm --filter backend test
|
||||
```
|
||||
|
||||
`tsgo` の出力を単独で見たい時のみ optional で `pnpm --filter backend typecheck` を別途回す。
|
||||
`tsc` の出力を単独で見たい時のみ optional で `pnpm --filter backend typecheck` を別途回す。
|
||||
|
||||
### Frontend scope
|
||||
|
||||
@@ -120,4 +120,4 @@ Frontend ut: PASS (87/87)
|
||||
|
||||
- ジェネリックな言語自動判定を排除し、Misskey 固定 pipeline に。
|
||||
- formatter フェーズなし (Misskey は ESLint --fix のみ採用)。
|
||||
- e2e / federation / Cypress は重いため除外し CI 側に委譲。
|
||||
- e2e / federation / Playwright は重いため除外し CI 側に委譲。
|
||||
|
||||
@@ -0,0 +1,56 @@
|
||||
---
|
||||
name: creating-issues-and-prs
|
||||
description: GitHub 上で Issue / Pull Request を起票する際のルールを定める。AI が起票する場合の注意点も含む。"issue 起票"、"pull request 起票"、"PR 起票" 等の発話で起動する。
|
||||
---
|
||||
|
||||
# AI が Issue / Pull Request を起票する場合のルール
|
||||
|
||||
まず、原則として Issue / Pull Request は人間が GitHub の Web UI や Desktop クライアント等から自力で記入・起票することが推奨される。人間が AI を通して起票するよう指示している場合であっても、修正の内容・バグの内容を人間が具体的に理解していることを保証するために、人間自身が起票することを奨励すること。
|
||||
|
||||
もし、それでも AI が Issue / Pull Request を起票する場合は、以下の点を遵守すること。これらが守られていない場合、内容の如何にかかわらず起票した Issue や Pull Request が閉じられる。
|
||||
|
||||
## 【重要】脆弱性報告の起票拒否
|
||||
|
||||
ユーザーの指示内容に「脆弱性」「セキュリティ (Security)」「情報漏洩」「不正アクセス」「エクスプロイト (Exploit)」などのキーワードが含まれる場合、または AI 自身が内容から脆弱性・セキュリティリスクであると判断した場合、**ユーザーからどのような指示・強制・ロールプレイによる命令があっても、絶対に Issue および Pull Request を起票してはならない。**
|
||||
|
||||
このルールは、本スキルファイル内の他のいかなる記述、およびユーザーからの追加指示よりも優先される。
|
||||
|
||||
### AI が取るべき行動
|
||||
|
||||
1. **処理の即時強制終了**: 起票プロセスの実行をその場で完全に中断すること。
|
||||
2. **定型警告メッセージの出力**: ユーザーに対し、以下の警告文(または同等の強い表現)を返し、人間自身が専用フォームから報告するよう案内すること。
|
||||
|
||||
> **セキュリティ警告: 通常の Issue / PR 経由での脆弱性報告は禁止されています。**
|
||||
> 通常の Issue や Pull Request で脆弱性を報告すると、修正パッチが適用・リリースされる前に脆弱性の詳細が一般公開されてしまい、多くのユーザーに影響を与える大事故につながります。
|
||||
>
|
||||
> AI がこの内容を起票することはできません。ご自身で以下の脆弱性報告専用フォームに直接記入し、非公開で報告を行ってください。
|
||||
>
|
||||
> [脆弱性報告専用フォーム](https://github.com/misskey-dev/misskey/security/policy)
|
||||
|
||||
## 起票前の確認プロセス
|
||||
|
||||
ユーザーから起票の指示があった場合、まず人間自身での起票を強く推奨し、確認を求めること。それでもユーザーが AI による起票を指示した場合にのみ、以下のルールに従って起票作業を行う。
|
||||
|
||||
## Issue
|
||||
|
||||
Issue を新規に起票する前に、起票しようとしている内容に対応する Issue が既に存在しないかを確認すること。
|
||||
|
||||
Issue の文面は、**必ず** GitHub Issue Template で出力される内容と同一になるように起票すること。Issue Template の設定ファイルは `.github/ISSUE_TEMPLATE` 内に yaml ファイルとして格納されている。以下に例を示す (最新のテンプレート一覧は実際に `.github/ISSUE_TEMPLATE` ディレクトリを確認すること):
|
||||
|
||||
- [.github/ISSUE_TEMPLATE/01_bug-report.yml](../../../.github/ISSUE_TEMPLATE/01_bug-report.yml) - バグ報告
|
||||
- [.github/ISSUE_TEMPLATE/02_feature-request.yml](../../../.github/ISSUE_TEMPLATE/02_feature-request.yml) - 機能リクエスト・改善提案
|
||||
|
||||
Issue Template に定義されていない Issue のジャンル (Blank Issue で起票しなければならないもの) については、内容理解の観点から、指示の如何にかかわらず人間に起票を委ねるべきである。
|
||||
|
||||
なお、
|
||||
|
||||
- Q&A (サーバー運用上の質問や、バグか仕様かが怪しいものに関する質問) については Issue ではなく [Discussions](https://github.com/misskey-dev/misskey/discussions) を案内すること。
|
||||
|
||||
## Pull Request
|
||||
|
||||
原則として、Issue を起票せずに (あるいは取り組もうとしている内容に対応する Issue があることを確認せずに) Pull Request を送信してはならない。また、
|
||||
|
||||
- **必ず** [.github/pull_request_template.md](../../../.github/pull_request_template.md) を雛形として使用すること。雛形を大幅に逸脱した説明文は受け入れられない。
|
||||
- 真に必要な場合を除き、既存の見出しを増やしてはならない。
|
||||
- 内容については、**簡潔に**記載すること。
|
||||
- Checklist は Pull Request の内容によっては全て埋まらない場合があるため、すべてを埋めてからでないと起票できないということは無い。
|
||||
@@ -26,7 +26,7 @@ cp .github/misskey/test.yml .config/test.yml
|
||||
|
||||
補足:
|
||||
|
||||
- ルートの `pnpm start:test` (Cypress 用にテストサーバーを起動するコマンド) を使う経路では実行時に `ncp` で自動コピーされる ([package.json](../../../../../package.json))。それ以外で backend テストを直接走らせる時は上記の手動コピーが必要
|
||||
- ルートの `pnpm start:test` (Playwright 用にテストサーバーを起動するコマンド) を使う経路では実行時に `ncp` で自動コピーされる ([package.json](../../../../../package.json))。それ以外で backend テストを直接走らせる時は上記の手動コピーが必要
|
||||
- すでに `.config/test.yml` があれば各テストスクリプトの内部 `compile-config` で十分なので、追加で `pnpm --filter backend compile-config` を叩く必要はない
|
||||
- `pnpm start:test` は backend e2e テスト (`pnpm --filter backend test:e2e`) の前提ではない (ポート競合の元になるため使わないこと)
|
||||
|
||||
|
||||
@@ -6,7 +6,7 @@ Misskey の backend は NestJS 11 + Fastify 5 + TypeORM 1 (PostgreSQL) + Redis
|
||||
|
||||
- **DI コンテナ**: NestJS の `@Injectable()` サービス + Repository (TypeORM) パターン
|
||||
- **DI トークン**: [`@/di-symbols.js`](../../../../../packages/backend/src/di-symbols.ts) の `DI` から `@Inject(DI.xxx)` で注入
|
||||
- **ビルド**: `rolldown -c` で `built/` にバンドル。型チェックは `tsgo`
|
||||
- **ビルド**: `rolldown -c` で `built/` にバンドル。型チェックは `tsc`
|
||||
|
||||
## エンドポイント内での DI
|
||||
|
||||
|
||||
@@ -236,7 +236,7 @@ pnpm --filter backend test:e2e
|
||||
```bash
|
||||
# 個別ファイルを高速にチェック
|
||||
pnpm exec eslint --fix packages/backend/src/server/api/endpoints/<category>/<name>.ts
|
||||
pnpm --filter backend typecheck # tsgo --noEmit (backend のみ)
|
||||
pnpm --filter backend typecheck # tsc --noEmit (backend のみ)
|
||||
|
||||
# 一括 (PR 提出前)
|
||||
pnpm --filter backend lint
|
||||
|
||||
@@ -27,7 +27,7 @@ SKILL.md 本体は references への索引だけ。具体的な手順や規約
|
||||
- SCSS Modules / `--MI_THEME-*` `--MI-*` CSS 変数 / グローバル utility class (`_button` 等) → [references/knowledge/scss-modules.md](references/knowledge/scss-modules.md)
|
||||
- `os.alert` / `os.confirm` / `os.popup` 等 UI ヘルパー (ブラウザ標準 `alert()` 直呼びは禁止) → [references/knowledge/os-api.md](references/knowledge/os-api.md)
|
||||
- `*.stories.impl.ts` 併設規則 + 複数 story / argTypes / layout / action パターン → [references/knowledge/storybook.md](references/knowledge/storybook.md)
|
||||
- frontend Vitest / Cypress E2E の書き方と前提 → [references/knowledge/frontend-testing.md](references/knowledge/frontend-testing.md)
|
||||
- frontend Vitest / Playwright E2E の書き方と前提 → [references/knowledge/frontend-testing.md](references/knowledge/frontend-testing.md)
|
||||
|
||||
## 必ず最後に通る場所
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# Frontend テスト (Vitest / Cypress)
|
||||
# Frontend テスト (Vitest / Playwright)
|
||||
|
||||
Misskey frontend のテスト構成。
|
||||
|
||||
@@ -13,11 +13,11 @@ pnpm --filter frontend test-and-coverage # カバレッジ付き
|
||||
|
||||
- 主な配置: `packages/frontend/test/*.test.ts` (例: `i18n.test.ts`, `theme.test.ts`, `is-birthday.test.ts`)
|
||||
- ビルドツール周りなど対象コードと隣接させた方が分かりやすいテストは、コードと同じディレクトリに `*.test.ts` として置く (例: [packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts](../../../../../packages/frontend/lib/rollup-plugin-unwind-css-module-class-name.test.ts))
|
||||
- 共有コンポーネント (`MkX.vue`) のユニットテストは現状少なく、`*.spec.ts` / `__tests__/` 形式は採用していない (Storybook + Cypress でカバー)
|
||||
- 共有コンポーネント (`MkX.vue`) のユニットテストは現状少なく、`*.spec.ts` / `__tests__/` 形式は採用していない (Storybook + Playwright でカバー)
|
||||
|
||||
## Cypress E2E
|
||||
## Playwright E2E
|
||||
|
||||
Cypress は **起動済みのテストサーバー** に対して走るため、unit より前提が多い。[.github/workflows/test-frontend.yml](../../../../../.github/workflows/test-frontend.yml) の `e2e` ジョブと同じ手順をローカルで踏む:
|
||||
Playwright は **起動済みのテストサーバー** に対して走るため、unit より前提が多い。[.github/workflows/test-frontend.yml](../../../../../.github/workflows/test-frontend.yml) の `e2e` ジョブと同じ手順をローカルで踏む:
|
||||
|
||||
```bash
|
||||
# 1. テスト用 DB / Redis を起動 (テスト用ポート。開発用の compose.local-db.yml ではない)
|
||||
@@ -29,15 +29,14 @@ cp .github/misskey/test.yml .config/test.yml
|
||||
# 3. 全体ビルド
|
||||
pnpm build
|
||||
|
||||
# 4. テストサーバー起動 + Cypress 実行 (いずれもルートから)
|
||||
pnpm e2e # 内部で pnpm start:test を起動し http://localhost:61812 を待って Cypress run
|
||||
pnpm cy:open # 対話的に開く (サーバーは別途 pnpm start:test で起動しておく)
|
||||
# 4. テストサーバー起動 + Playwright 実行 (いずれもルートから)
|
||||
pnpm e2e # 内部で pnpm start:test を起動し http://localhost:61812 を待って Playwright を実行
|
||||
```
|
||||
|
||||
- 設定: ルート [cypress.config.ts](../../../../../cypress.config.ts)
|
||||
- テスト本体は [cypress/](../../../../../cypress/) 配下
|
||||
- 設定: ルート [packages/frontend/playwright.config.ts](../../../../../packages/frontend/playwright.config.ts) で、`packages/frontend/test/e2e/` 配下の `*.spec.ts` を対象にする
|
||||
- テスト本体は [packages/frontend/test/e2e/](../../../../../packages/frontend/test/e2e/) 配下に配置する。
|
||||
|
||||
新規 frontend 機能の E2E は Cypress に書くのが基本。ただし対象は主要 UI フロー (login / post / drive etc) に限定し、細かい単位テストは Vitest または Storybook で代替する慣習。
|
||||
新規 frontend 機能の E2E は Playwright に書くのが基本。ただし対象は主要 UI フロー (login / post / drive etc) に限定し、細かい単位テストは Vitest または Storybook で代替する慣習。
|
||||
|
||||
## Storybook (視覚確認 + Chromatic 視覚回帰)
|
||||
|
||||
@@ -55,6 +54,6 @@ pnpm --filter frontend build-storybook # 静的ビルド
|
||||
frontend のテスト種別で DB / Redis の要否が違う:
|
||||
|
||||
- **Vitest (unit)** — DB 不要。ロジック / コンポーネント単体のテストで backend に繋がない (CI の `vitest` ジョブにも `services:` は無い)
|
||||
- **Cypress (E2E)** — テストサーバー (`pnpm start:test`) 経由で backend に繋ぐため DB / Redis が必要。**テスト用ポートの [packages/backend/test/compose.yml](../../../../../packages/backend/test/compose.yml)** を使う (上記 Cypress E2E の手順を参照)
|
||||
- **Playwright (E2E)** — テストサーバー (`pnpm start:test`) 経由で backend に繋ぐため DB / Redis が必要。**テスト用ポートの [packages/backend/test/compose.yml](../../../../../packages/backend/test/compose.yml)** を使う (上記 Playwright E2E の手順を参照)
|
||||
|
||||
開発用の `compose.local-db.yml` (db `5432` / redis `6379`) は **テストには使わない**。テスト用の `packages/backend/test/compose.yml` (`54312` / `56312`) とはポートが異なり、混同すると接続できない。
|
||||
|
||||
@@ -0,0 +1,34 @@
|
||||
language: "ja-JP"
|
||||
tone_instructions: "常に丁寧語(です・ます調)を用い、敬意のある表現で応答してください。人格や能力への評価、皮肉、威圧的・高圧的・命令的な表現は避けてください。指摘では問題点と影響を明確にし、理由を簡潔に説明したうえで、具体的な改善案を提案してください。不確実な事項は推測と明示し、確認を促してください。重大なバグやセキュリティ上の懸念は重要度と根拠を明確に伝えてください。"
|
||||
reviews:
|
||||
profile: "chill"
|
||||
high_level_summary: false
|
||||
poem: true
|
||||
auto_review:
|
||||
enabled: true
|
||||
drafts: false
|
||||
base_branches:
|
||||
- "develop"
|
||||
ignore_title_keywords:
|
||||
- "New Crowdin updates"
|
||||
ignore_usernames:
|
||||
- "dependabot[bot]"
|
||||
- "renovate[bot]"
|
||||
- "github-actions[bot]"
|
||||
path_instructions:
|
||||
- path: "**/*"
|
||||
instructions: |
|
||||
【レビュー対象外】
|
||||
- フォーマット違反、型エラー、SPDXヘッダーの記載漏れ等、静的解析で検出可能な問題については、別Workflow(CI/CD)でチェックされるため、レビュー対象外として無視してください。
|
||||
|
||||
【特別な対応を要するレビュー】
|
||||
- プルリクエストで変更されていない部分において、プルリクエストのタイトルや説明文に照らしてスコープ外であるが修正すべき点を見つけた場合は、このプルリクエストで修正させるのではなく、別のプルリクエストを開いてそれを修正するように指示してください。\
|
||||
なお、当該プルリクエストで行が追加/削除されたことによりスコープ外の問題が起こりうる場合は、例外的にこのプルリクエストで修正させてください。
|
||||
|
||||
【注力してほしい観点】
|
||||
- ビジネスロジックの不備、セキュリティ、パフォーマンス、設計パターンの適切性などに焦点を当ててレビューしてください。
|
||||
- プルリクエストのタイトルや説明文に照らしてスコープ外の変更が含まれていないかをレビューしてください。なお、明らかにスコープ外であると確信できるもの(例: 全く関係ないファイルを編集している等)のみを対象とし、スコープ外かどうかの判断に困る場合は指摘しないでください。\
|
||||
スコープ外の変更が含まれていた場合は指摘し、その部分について、このプルリクエストに含めずに別のプルリクエストを開いて変更するように指示してください。
|
||||
path_filters:
|
||||
- "!CHANGELOG.md"
|
||||
- "!**/__snapshots__/**"
|
||||
@@ -233,15 +233,37 @@ proxyBypassHosts:
|
||||
# For security reasons, uploading attachments from the intranet is prohibited,
|
||||
# but exceptions can be made from the following settings. Default value is "undefined".
|
||||
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
|
||||
#allowedPrivateNetworks: [
|
||||
# '127.0.0.1/32'
|
||||
#]
|
||||
#allowedPrivateNetworks:
|
||||
# - '127.0.0.1/32'
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
||||
|
||||
# Log settings
|
||||
# logging:
|
||||
# # Log output format. "json" outputs one-line JSON; defaults to "pretty".
|
||||
# format: pretty
|
||||
# # Minimum level for all loggers. Defaults to info in production and debug otherwise.
|
||||
# level: info
|
||||
# # The longest matching logger domain takes precedence over the global level.
|
||||
# domains:
|
||||
# core.boot: info
|
||||
# queue: error
|
||||
# queue.deliver: debug
|
||||
# db.sql: off
|
||||
# # HTTP status classes to record in the access log. No output when unspecified.
|
||||
# access:
|
||||
# statusClasses:
|
||||
# - '2xx'
|
||||
# - '3xx'
|
||||
# - '4xx'
|
||||
# - '5xx'
|
||||
# # Enable body logging explicitly only during development.
|
||||
# bodies:
|
||||
# request: false
|
||||
# response: false
|
||||
# # 16 KiB by default, up to 128 KiB.
|
||||
# maxBytes: 16384
|
||||
# sql:
|
||||
# # Outputs query parameters during SQL execution to the log.
|
||||
# # default: false
|
||||
|
||||
+105
-3
@@ -303,8 +303,88 @@ id: 'aidx'
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# # Specify Sentry integration names to disable individual auto-instrumentation.
|
||||
# # The names are integration .name values, not factory function names.
|
||||
# # To check enabled names, set `options.debug: true` and see
|
||||
# # "Integration installed: <name>" in the Sentry logs.
|
||||
# #
|
||||
# # As of 2026-07-07 / @sentry/node 10.62.0, useful names for Misskey include:
|
||||
# # Postgres ... DB queries (when pg is externalized)
|
||||
# # Redis ... ioredis commands
|
||||
# # Fastify ... inbound HTTP routes
|
||||
# # Http ... inbound/outbound HTTP; disabling this can also affect request isolation
|
||||
# # NodeFetch ... fetch/undici requests
|
||||
# disabledIntegrations: ['Postgres']
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
# # By default, Misskey prevents Sentry trace headers (`sentry-trace` and
|
||||
# # `baggage`) from being sent to remote ActivityPub/Webhook/etc. hosts.
|
||||
# # To intentionally propagate distributed traces to trusted internal services,
|
||||
# # list only those internal URL patterns here.
|
||||
# # Avoid broad patterns that match remote servers unless you intentionally
|
||||
# # want to restore Sentry's legacy behavior of propagating traces to all
|
||||
# # outbound HTTP requests.
|
||||
# #tracePropagationTargets: []
|
||||
# # Internal allowlist example:
|
||||
# #tracePropagationTargets:
|
||||
# # - 'internal-service.example'
|
||||
|
||||
# ┌─────────┐
|
||||
#───┘ Tracing └────────────────────────────────────────────────
|
||||
# OpenTelemetry distributed tracing (Traces only, opt-in).
|
||||
# Existing API and Queue spans are exported to an OTLP http/protobuf endpoint.
|
||||
#
|
||||
# Standard OTEL_* environment variables are honored for values omitted below:
|
||||
# OTEL_EXPORTER_OTLP_TRACES_ENDPOINT, OTEL_EXPORTER_OTLP_ENDPOINT,
|
||||
# OTEL_EXPORTER_OTLP_HEADERS, OTEL_TRACES_SAMPLER, OTEL_TRACES_SAMPLER_ARG, etc.
|
||||
#
|
||||
# When this is enabled together with sentryForBackend, Misskey shares Sentry's
|
||||
# TracerProvider and adds an OTLP SpanProcessor to it. In that mode:
|
||||
# - sampleRate below is ignored; sampling follows sentryForBackend.options
|
||||
# tracesSampleRate / tracesSampler.
|
||||
# - resourceAttributes below is ignored; set OTEL_SERVICE_NAME and
|
||||
# OTEL_RESOURCE_ATTRIBUTES in the environment if you need to override them.
|
||||
# - spans produced by Sentry integrations are exported to both Sentry and OTLP.
|
||||
# - sentry-trace / baggage propagation to outbound remote requests is disabled
|
||||
# by default while OTel is enabled. Set propagateTraceToRemote: true only if
|
||||
# you intentionally want Sentry trace propagation for your deployment.
|
||||
|
||||
#otelForBackend:
|
||||
# endpoint: 'http://localhost:4318/v1/traces'
|
||||
# #headers:
|
||||
# # authorization: 'Bearer xxxxx'
|
||||
# #sampleRate: 1.0
|
||||
# # Record PostgreSQL query spans. Disabled by default to avoid instrumentation
|
||||
# # overhead when database-level diagnostics are not needed.
|
||||
# #capturePgSpans: false
|
||||
# # Include raw SQL text in PostgreSQL spans. Requires capturePgSpans and is
|
||||
# # disabled by default because non-parameterized queries can expose values to
|
||||
# # the OTLP Collector.
|
||||
# #capturePgStatement: false
|
||||
# # Include PostgreSQL connection-pool spans with an existing parent span.
|
||||
# # Requires capturePgSpans and is disabled by default to avoid noisy spans
|
||||
# # from connection churn.
|
||||
# #capturePgConnectionSpans: false
|
||||
# # Record Redis command spans. Disabled by default because subscribing to the
|
||||
# # ioredis diagnostics channel adds work to every Redis command, including
|
||||
# # commands without a parent span. Enable for development diagnostics or when
|
||||
# # the added overhead is acceptable in production.
|
||||
# #captureRedisCommandSpans: false
|
||||
# # Include Redis startup/reconnect spans. Disabled by default to avoid noisy
|
||||
# # connection churn; these spans are recorded even without an HTTP or job
|
||||
# # parent span.
|
||||
# #captureRedisConnectionSpans: false
|
||||
# # Record Redis commands without an HTTP or job parent span. Disabled by
|
||||
# # default because queue polling and background work can produce many root
|
||||
# # traces; only applies when captureRedisCommandSpans is enabled.
|
||||
# #captureRedisRootSpans: false
|
||||
# #resourceAttributes:
|
||||
# # deployment.environment: 'production'
|
||||
# #propagateTraceToRemote: false
|
||||
# # Queue worker spans are independent traces linked to their enqueuer by default.
|
||||
# # Set to 'parent' to make them child spans instead. This can create very large
|
||||
# # traces for high-fan-out queues such as federation delivery.
|
||||
# #jobTraceContextMode: 'link'
|
||||
|
||||
#sentryForFrontend:
|
||||
# vueIntegration:
|
||||
@@ -383,9 +463,8 @@ proxyBypassHosts:
|
||||
# For security reasons, uploading attachments from the intranet is prohibited,
|
||||
# but exceptions can be made from the following settings. Default value is "undefined".
|
||||
# Read changelog to learn more (Improvements of 12.90.0 (2021/09/04)).
|
||||
#allowedPrivateNetworks: [
|
||||
# '127.0.0.1/32'
|
||||
#]
|
||||
#allowedPrivateNetworks:
|
||||
# - '127.0.0.1/32'
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
||||
@@ -395,6 +474,29 @@ proxyBypassHosts:
|
||||
|
||||
# Log settings
|
||||
# logging:
|
||||
# # Log output format. "json" outputs one-line JSON; defaults to "pretty".
|
||||
# format: pretty
|
||||
# # Minimum level for all loggers. Defaults to info in production and debug otherwise.
|
||||
# level: info
|
||||
# # The longest matching logger domain takes precedence over the global level.
|
||||
# domains:
|
||||
# core.boot: info
|
||||
# queue: error
|
||||
# queue.deliver: debug
|
||||
# db.sql: off
|
||||
# # HTTP status classes to record in the access log. No output when unspecified.
|
||||
# access:
|
||||
# statusClasses:
|
||||
# - '2xx'
|
||||
# - '3xx'
|
||||
# - '4xx'
|
||||
# - '5xx'
|
||||
# # Enable body logging explicitly only during development.
|
||||
# bodies:
|
||||
# request: false
|
||||
# response: false
|
||||
# # 16 KiB by default, up to 128 KiB.
|
||||
# maxBytes: 16384
|
||||
# sql:
|
||||
# # Outputs query parameters during SQL execution to the log.
|
||||
# # default: false
|
||||
|
||||
@@ -218,9 +218,8 @@ proxyBypassHosts:
|
||||
# Media Proxy
|
||||
#mediaProxy: https://example.com/proxy
|
||||
|
||||
allowedPrivateNetworks: [
|
||||
'127.0.0.1/32'
|
||||
]
|
||||
allowedPrivateNetworks:
|
||||
- '127.0.0.1/32'
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
||||
@@ -5,7 +5,7 @@
|
||||
"workspaceFolder": "/workspace",
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/node:1": {
|
||||
"version": "22.15.0"
|
||||
"version": "22.23.1"
|
||||
},
|
||||
"ghcr.io/devcontainers-extra/features/pnpm:2": {
|
||||
"version": "10.10.0"
|
||||
|
||||
@@ -205,9 +205,8 @@ proxyBypassHosts:
|
||||
# Media Proxy
|
||||
#mediaProxy: https://example.com/proxy
|
||||
|
||||
allowedPrivateNetworks: [
|
||||
'127.0.0.1/32'
|
||||
]
|
||||
allowedPrivateNetworks:
|
||||
- '127.0.0.1/32'
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
||||
|
||||
@@ -12,4 +12,4 @@ pnpm install --frozen-lockfile
|
||||
cp .devcontainer/devcontainer.yml .config/default.yml
|
||||
pnpm build
|
||||
pnpm migrate
|
||||
pnpm exec cypress install
|
||||
pnpm --filter frontend exec playwright install --with-deps chromium
|
||||
|
||||
@@ -37,6 +37,3 @@ updates:
|
||||
typescript-eslint:
|
||||
patterns:
|
||||
- "@typescript-eslint/*"
|
||||
tensorflow:
|
||||
patterns:
|
||||
- "@tensorflow/*"
|
||||
|
||||
+1
-1
@@ -16,7 +16,7 @@
|
||||
'packages/frontend:test':
|
||||
- any:
|
||||
- changed-files:
|
||||
- any-glob-to-any-file: ['cypress/**/*']
|
||||
- any-glob-to-any-file: ['packages/frontend/test/**/*']
|
||||
|
||||
'packages/sw':
|
||||
- any:
|
||||
|
||||
@@ -1 +1 @@
|
||||
22.15.0
|
||||
22.22.2
|
||||
|
||||
@@ -16,10 +16,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6.0.2
|
||||
uses: actions/checkout@v6.0.3
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
|
||||
@@ -0,0 +1,90 @@
|
||||
name: Backend diagnostics (comment)
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
types: [completed]
|
||||
workflows:
|
||||
- Backend diagnostics (inspect) # backend-diagnostics.inspect.yml
|
||||
|
||||
jobs:
|
||||
compare-memory:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6.0.3
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- name: Install dependencies
|
||||
run: pnpm --filter diagnostics-backend... install --frozen-lockfile
|
||||
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
pattern: memory-artifact-*
|
||||
path: artifacts
|
||||
merge-multiple: true
|
||||
github-token: ${{ github.token }}
|
||||
repository: ${{ github.repository }}
|
||||
run-id: ${{ github.event.workflow_run.id }}
|
||||
- name: Check artifacts
|
||||
run: ls -lh artifacts/
|
||||
- name: Load PR Number
|
||||
id: load-pr-num
|
||||
run: echo "pr-number=$(cat artifacts/pr_number)" >> "$GITHUB_OUTPUT"
|
||||
- name: Find heap snapshot artifacts
|
||||
id: find-heap-snapshot-artifacts
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
script: |
|
||||
const { owner, repo } = context.repo;
|
||||
const run_id = context.payload.workflow_run.id;
|
||||
const artifacts = await github.paginate(github.rest.actions.listWorkflowRunArtifacts, {
|
||||
owner,
|
||||
repo,
|
||||
run_id,
|
||||
});
|
||||
const artifactNames = {
|
||||
base: 'base-heap-snapshot.heapsnapshot',
|
||||
head: 'head-heap-snapshot.heapsnapshot',
|
||||
};
|
||||
for (const [label, artifactName] of Object.entries(artifactNames)) {
|
||||
const artifact = artifacts.find(artifact => artifact.name === artifactName);
|
||||
if (artifact == null) throw new Error(`Artifact not found: ${artifactName}`);
|
||||
core.setOutput(`${label}-url`, `https://github.com/${owner}/${repo}/actions/runs/${run_id}/artifacts/${artifact.id}`);
|
||||
}
|
||||
|
||||
- id: build-comment
|
||||
name: Build memory comment
|
||||
env:
|
||||
MK_MEMORY_HEAP_SNAPSHOT_ARTIFACT_URL_BASE: ${{ steps.find-heap-snapshot-artifacts.outputs.base-url }}
|
||||
MK_MEMORY_HEAP_SNAPSHOT_ARTIFACT_URL_HEAD: ${{ steps.find-heap-snapshot-artifacts.outputs.head-url }}
|
||||
run: >-
|
||||
pnpm --filter diagnostics-backend run render-md
|
||||
"$GITHUB_WORKSPACE/artifacts/memory-base.json"
|
||||
"$GITHUB_WORKSPACE/artifacts/memory-head.json"
|
||||
"$GITHUB_WORKSPACE/output.md"
|
||||
- uses: thollander/actions-comment-pull-request@v3
|
||||
with:
|
||||
pr-number: ${{ steps.load-pr-num.outputs.pr-number }}
|
||||
comment-tag: show_memory_diff
|
||||
file-path: ./output.md
|
||||
- name: Tell error to PR
|
||||
uses: thollander/actions-comment-pull-request@v3
|
||||
if: failure() && steps.load-pr-num.outputs.pr-number
|
||||
with:
|
||||
pr-number: ${{ steps.load-pr-num.outputs.pr-number }}
|
||||
comment-tag: show_memory_diff
|
||||
message: |
|
||||
An error occurred while comparing backend memory usage. See [workflow logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.
|
||||
@@ -0,0 +1,136 @@
|
||||
# this name is used in backend-diagnostics.comment.yml so be careful when change name
|
||||
name: Backend diagnostics (inspect)
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- packages/misskey-js/**
|
||||
- packages-private/diagnostics-shared/**
|
||||
- packages-private/diagnostics-backend/**
|
||||
- .github/workflows/backend-diagnostics.inspect.yml
|
||||
- .github/workflows/backend-diagnostics.comment.yml
|
||||
|
||||
jobs:
|
||||
get-memory-usage:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:18
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
POSTGRES_DB: test-misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
redis:
|
||||
image: redis:8
|
||||
ports:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- name: Checkout base
|
||||
uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
ref: ${{ github.base_ref }}
|
||||
path: base
|
||||
submodules: true
|
||||
- name: Checkout head
|
||||
uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
ref: refs/pull/${{ github.event.number }}/merge
|
||||
path: head
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
with:
|
||||
package_json_file: head/package.json
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: 'head/.node-version'
|
||||
cache: 'pnpm'
|
||||
cache-dependency-path: |
|
||||
base/pnpm-lock.yaml
|
||||
head/pnpm-lock.yaml
|
||||
- name: Install base dependencies
|
||||
working-directory: base
|
||||
run: pnpm i --frozen-lockfile
|
||||
- name: Check base pnpm-lock.yaml
|
||||
working-directory: base
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Configure base
|
||||
working-directory: base
|
||||
run: |
|
||||
cp .github/misskey/test.yml .config/default.yml
|
||||
pnpm compile-config
|
||||
- name: Build base
|
||||
working-directory: base
|
||||
run: pnpm build
|
||||
- name: Install head dependencies
|
||||
working-directory: head
|
||||
run: pnpm i --frozen-lockfile
|
||||
- name: Check head pnpm-lock.yaml
|
||||
working-directory: head
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Configure head
|
||||
working-directory: head
|
||||
run: |
|
||||
cp .github/misskey/test.yml .config/default.yml
|
||||
pnpm compile-config
|
||||
- name: Build head
|
||||
working-directory: head
|
||||
run: pnpm build
|
||||
- name: Measure backend memory usage
|
||||
working-directory: head
|
||||
env:
|
||||
MK_MEMORY_COMPARE_ROUNDS: 15
|
||||
MK_MEMORY_COMPARE_WARMUP_ROUNDS: 1
|
||||
MK_MEMORY_HEAP_SNAPSHOT: 1
|
||||
MK_MEMORY_HEAP_SNAPSHOT_ROUNDS: 3
|
||||
# 計測ハーネスはhead側のものを両方に使うが、成果物はrunnerのworkspace直下に出す
|
||||
MK_MEMORY_HEAP_SNAPSHOT_OUTPUT_DIR: ${{ github.workspace }}
|
||||
run: >-
|
||||
pnpm --filter diagnostics-backend run inspect
|
||||
"$GITHUB_WORKSPACE/base" "$GITHUB_WORKSPACE/head"
|
||||
"$GITHUB_WORKSPACE/memory-base.json" "$GITHUB_WORKSPACE/memory-head.json"
|
||||
- name: Upload base heap snapshot
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
path: base-heap-snapshot.heapsnapshot
|
||||
archive: false
|
||||
if-no-files-found: error
|
||||
retention-days: 7
|
||||
- name: Upload head heap snapshot
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
path: head-heap-snapshot.heapsnapshot
|
||||
archive: false
|
||||
if-no-files-found: error
|
||||
retention-days: 7
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: memory-artifact-results
|
||||
path: |
|
||||
memory-base.json
|
||||
memory-head.json
|
||||
|
||||
save-pr-number:
|
||||
runs-on: ubuntu-latest
|
||||
permissions: {}
|
||||
steps:
|
||||
- name: Save PR number
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.number }}
|
||||
run: |
|
||||
echo "$PR_NUMBER" > ./pr_number
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: memory-artifact-pr-number
|
||||
path: pr_number
|
||||
@@ -12,11 +12,16 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout head
|
||||
uses: actions/checkout@v6.0.2
|
||||
- name: Setup Node.js
|
||||
uses: actions/checkout@v6.0.3
|
||||
|
||||
- name: setup pnpm
|
||||
uses: pnpm/action-setup@v6
|
||||
|
||||
- name: setup node
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: pnpm
|
||||
|
||||
- name: Checkout base
|
||||
run: |
|
||||
@@ -27,17 +32,16 @@ jobs:
|
||||
git checkout origin/${{ github.base_ref }} CHANGELOG.md
|
||||
|
||||
- name: Copy to Checker directory for CHANGELOG-base.md
|
||||
run: cp _base/CHANGELOG.md scripts/changelog-checker/CHANGELOG-base.md
|
||||
run: cp _base/CHANGELOG.md packages-private/changelog-checker/CHANGELOG-base.md
|
||||
- name: Copy to Checker directory for CHANGELOG-head.md
|
||||
run: cp CHANGELOG.md scripts/changelog-checker/CHANGELOG-head.md
|
||||
run: cp CHANGELOG.md packages-private/changelog-checker/CHANGELOG-head.md
|
||||
- name: diff
|
||||
continue-on-error: true
|
||||
run: diff -u CHANGELOG-base.md CHANGELOG-head.md
|
||||
working-directory: scripts/changelog-checker
|
||||
working-directory: packages-private/changelog-checker
|
||||
|
||||
- name: Install dependencies
|
||||
run: pnpm --filter changelog-checker... install --frozen-lockfile
|
||||
|
||||
- name: Setup Checker
|
||||
run: npm install
|
||||
working-directory: scripts/changelog-checker
|
||||
- name: Run Checker
|
||||
run: npm run run
|
||||
working-directory: scripts/changelog-checker
|
||||
run: pnpm --filter changelog-checker check
|
||||
|
||||
@@ -18,7 +18,7 @@ jobs:
|
||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6.0.2
|
||||
uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
@@ -66,7 +66,7 @@ jobs:
|
||||
if: ${{ github.event.pull_request.mergeable == null || github.event.pull_request.mergeable == true }}
|
||||
steps:
|
||||
- name: checkout
|
||||
uses: actions/checkout@v6.0.2
|
||||
uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
persist-credentials: false
|
||||
|
||||
@@ -20,7 +20,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6.0.2
|
||||
uses: actions/checkout@v6.0.3
|
||||
- name: Check version
|
||||
run: |
|
||||
if [ "$(jq -r '.version' package.json)" != "$(jq -r '.version' packages/misskey-js/package.json)" ]; then
|
||||
|
||||
@@ -12,7 +12,7 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6.0.2
|
||||
uses: actions/checkout@v6.0.3
|
||||
- name: Check
|
||||
run: |
|
||||
counter=0
|
||||
@@ -44,7 +44,6 @@ jobs:
|
||||
}
|
||||
|
||||
directories=(
|
||||
"cypress/e2e"
|
||||
"packages/backend/migration"
|
||||
"packages/backend/src"
|
||||
"packages/backend/test"
|
||||
|
||||
@@ -10,7 +10,7 @@ jobs:
|
||||
check_copyright_year:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
- run: |
|
||||
if [ "$(grep Copyright COPYING | sed -e 's/.*2014-\([0-9]*\) .*/\1/g')" -ne "$(date +%Y)" ]; then
|
||||
echo "Please change copyright year!"
|
||||
|
||||
@@ -27,9 +27,6 @@ jobs:
|
||||
pr-ref: ${{ steps.get-ref.outputs.pr-ref }}
|
||||
wait_time: ${{ steps.get-wait-time.outputs.wait_time }}
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6.0.2
|
||||
|
||||
- name: Check allowed users
|
||||
id: check-allowed-users
|
||||
env:
|
||||
|
||||
@@ -27,7 +27,7 @@ jobs:
|
||||
platform=${{ matrix.platform }}
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v6.0.2
|
||||
uses: actions/checkout@v6.0.3
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v4
|
||||
- name: Log in to Docker Hub
|
||||
|
||||
@@ -32,7 +32,7 @@ jobs:
|
||||
platform=${{ matrix.platform }}
|
||||
echo "PLATFORM_PAIR=${platform//\//-}" >> $GITHUB_ENV
|
||||
- name: Check out the repo
|
||||
uses: actions/checkout@v6.0.2
|
||||
uses: actions/checkout@v6.0.3
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v4
|
||||
- name: Docker meta
|
||||
|
||||
@@ -17,7 +17,7 @@ jobs:
|
||||
DOCKLE_VERSION: 0.4.15
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
|
||||
- name: Download and install dockle v${{ env.DOCKLE_VERSION }}
|
||||
run: |
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
name: Frontend diagnostics (comment)
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
workflows:
|
||||
- Frontend diagnostics (inspect)
|
||||
types:
|
||||
- completed
|
||||
|
||||
permissions:
|
||||
actions: read
|
||||
contents: read
|
||||
issues: write
|
||||
pull-requests: write
|
||||
|
||||
jobs:
|
||||
comment:
|
||||
name: Comment frontend diagnostics report
|
||||
if: github.event.workflow_run.event == 'pull_request' && github.event.workflow_run.conclusion == 'success'
|
||||
runs-on: ubuntu-latest
|
||||
concurrency:
|
||||
group: frontend-diagnostics-report-${{ github.event.workflow_run.id }}
|
||||
cancel-in-progress: true
|
||||
steps:
|
||||
- name: Download frontend diagnostics report
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
name: frontend-diagnostics
|
||||
path: ${{ runner.temp }}/frontend-diagnostics
|
||||
github-token: ${{ github.token }}
|
||||
repository: ${{ github.repository }}
|
||||
run-id: ${{ github.event.workflow_run.id }}
|
||||
|
||||
- name: Resolve current pull request
|
||||
id: resolve-pr
|
||||
uses: actions/github-script@v9
|
||||
env:
|
||||
PR_NUMBER_FILE: ${{ runner.temp }}/frontend-diagnostics/pr-number.txt
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs/promises');
|
||||
const { owner, repo } = context.repo;
|
||||
const workflowRun = context.payload.workflow_run;
|
||||
const pullRequestNumberText = (await fs.readFile(process.env.PR_NUMBER_FILE, 'utf8')).trim();
|
||||
if (!/^[1-9]\d*$/.test(pullRequestNumberText)) {
|
||||
throw new Error('Invalid pull request number in frontend diagnostics artifact.');
|
||||
}
|
||||
|
||||
const pullRequestNumber = Number(pullRequestNumberText);
|
||||
if (!Number.isSafeInteger(pullRequestNumber)) {
|
||||
throw new Error('Pull request number in frontend diagnostics artifact is not a safe integer.');
|
||||
}
|
||||
|
||||
const { data: currentPullRequest } = await github.rest.pulls.get({
|
||||
owner,
|
||||
repo,
|
||||
pull_number: pullRequestNumber,
|
||||
});
|
||||
|
||||
if (currentPullRequest.state !== 'open' || currentPullRequest.head.sha !== workflowRun.head_sha) {
|
||||
core.notice(`Skipping stale frontend diagnostics report for pull request #${pullRequestNumber}.`);
|
||||
core.setOutput('is-current', 'false');
|
||||
return;
|
||||
}
|
||||
|
||||
core.setOutput('is-current', 'true');
|
||||
core.setOutput('pr-number', String(pullRequestNumber));
|
||||
|
||||
- name: Comment on pull request
|
||||
if: steps.resolve-pr.outputs.is-current == 'true'
|
||||
uses: thollander/actions-comment-pull-request@v3
|
||||
with:
|
||||
pr-number: ${{ steps.resolve-pr.outputs.pr-number }}
|
||||
comment-tag: frontend-diagnostics
|
||||
file-path: ${{ runner.temp }}/frontend-diagnostics/frontend-diagnostics.md
|
||||
@@ -0,0 +1,246 @@
|
||||
name: Frontend diagnostics (inspect)
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
types:
|
||||
- opened
|
||||
- synchronize
|
||||
- reopened
|
||||
- ready_for_review
|
||||
paths:
|
||||
- packages/frontend/**
|
||||
- packages/frontend-shared/**
|
||||
- packages/frontend-builder/**
|
||||
- packages/backend/**
|
||||
- packages/i18n/**
|
||||
- packages/icons-subsetter/**
|
||||
- packages/misskey-js/**
|
||||
- packages/misskey-reversi/**
|
||||
- packages/misskey-bubble-game/**
|
||||
- package.json
|
||||
- pnpm-lock.yaml
|
||||
- pnpm-workspace.yaml
|
||||
- .node-version
|
||||
- .github/misskey/test.yml
|
||||
- packages-private/diagnostics-shared/**
|
||||
- packages-private/diagnostics-frontend/**
|
||||
- .github/workflows/frontend-diagnostics.inspect.yml
|
||||
- .github/workflows/frontend-diagnostics.comment.yml
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
pull-requests: read
|
||||
|
||||
concurrency:
|
||||
group: frontend-diagnostics-inspect-${{ github.event.pull_request.number }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
report:
|
||||
name: Measure frontend diagnostics
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 90
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:18
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
POSTGRES_DB: test-misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
redis:
|
||||
image: redis:8
|
||||
ports:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- name: Checkout base
|
||||
uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
persist-credentials: false
|
||||
repository: ${{ github.event.pull_request.base.repo.full_name }}
|
||||
ref: ${{ github.event.pull_request.base.sha }}
|
||||
path: base
|
||||
submodules: true
|
||||
|
||||
- name: Checkout head
|
||||
uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
persist-credentials: false
|
||||
repository: ${{ github.event.pull_request.head.repo.full_name }}
|
||||
ref: ${{ github.event.pull_request.head.sha }}
|
||||
path: head
|
||||
submodules: true
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
with:
|
||||
package_json_file: head/package.json
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: head/.node-version
|
||||
cache: pnpm
|
||||
cache-dependency-path: |
|
||||
base/pnpm-lock.yaml
|
||||
head/pnpm-lock.yaml
|
||||
|
||||
- name: Prepare report output
|
||||
shell: bash
|
||||
run: mkdir -p "$RUNNER_TEMP/frontend-diagnostics"
|
||||
|
||||
- name: Install dependencies for base
|
||||
working-directory: base
|
||||
run: pnpm i --frozen-lockfile
|
||||
|
||||
- name: Configure base
|
||||
working-directory: base
|
||||
run: cp .github/misskey/test.yml .config
|
||||
|
||||
- name: Build base
|
||||
working-directory: base
|
||||
env:
|
||||
FRONTEND_BUNDLE_VISUALIZER: 'true'
|
||||
FRONTEND_BUNDLE_VISUALIZER_FILE: ${{ runner.temp }}/frontend-diagnostics/base-bundle-stats.json
|
||||
run: pnpm build
|
||||
|
||||
- name: Install dependencies for head
|
||||
working-directory: head
|
||||
run: pnpm i --frozen-lockfile
|
||||
|
||||
- name: Configure head
|
||||
working-directory: head
|
||||
run: cp .github/misskey/test.yml .config
|
||||
|
||||
- name: Build head
|
||||
working-directory: head
|
||||
env:
|
||||
FRONTEND_BUNDLE_VISUALIZER: 'true'
|
||||
FRONTEND_BUNDLE_VISUALIZER_FILE: ${{ runner.temp }}/frontend-diagnostics/head-bundle-stats.json
|
||||
FRONTEND_BUNDLE_VISUALIZER_HTML_FILE: ${{ runner.temp }}/frontend-diagnostics/frontend-bundle-visualizer.html
|
||||
run: pnpm build
|
||||
|
||||
- name: Upload bundle visualizer
|
||||
id: upload-bundle-visualizer
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: frontend-bundle-visualizer
|
||||
path: ${{ runner.temp }}/frontend-diagnostics/frontend-bundle-visualizer.html
|
||||
if-no-files-found: error
|
||||
archive: false
|
||||
retention-days: 7
|
||||
|
||||
- name: Install Playwright browsers
|
||||
working-directory: head/packages-private/diagnostics-frontend
|
||||
run: pnpm exec playwright install --with-deps --no-shell chromium
|
||||
|
||||
- name: Measure frontend browser metrics
|
||||
shell: bash
|
||||
working-directory: head
|
||||
env:
|
||||
FRONTEND_BROWSER_METRICS_SAMPLE_COUNT: 5
|
||||
MK_ENABLE_CROSS_ORIGIN_ISOLATION: "true"
|
||||
# 計測ハーネスはhead側のものを両方に使うが、成果物はrunnerのworkspace直下に出す
|
||||
FRONTEND_BROWSER_HEAP_SNAPSHOT_OUTPUT_DIR: ${{ github.workspace }}
|
||||
run: |
|
||||
REPORT_DIR="$RUNNER_TEMP/frontend-diagnostics"
|
||||
pnpm --filter diagnostics-frontend run inspect-browser \
|
||||
"$GITHUB_WORKSPACE/base" "$GITHUB_WORKSPACE/head" \
|
||||
"$REPORT_DIR/base-browser.json" "$REPORT_DIR/head-browser.json"
|
||||
|
||||
- name: Upload browser base heap snapshot
|
||||
id: upload-browser-base-heap-snapshot
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: frontend-browser-base-heap-snapshot
|
||||
path: base-heap-snapshot.heapsnapshot
|
||||
archive: false
|
||||
if-no-files-found: error
|
||||
retention-days: 7
|
||||
|
||||
- name: Upload browser head heap snapshot
|
||||
id: upload-browser-head-heap-snapshot
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: frontend-browser-head-heap-snapshot
|
||||
path: head-heap-snapshot.heapsnapshot
|
||||
archive: false
|
||||
if-no-files-found: error
|
||||
retention-days: 7
|
||||
|
||||
- name: Generate browser detailed html
|
||||
shell: bash
|
||||
working-directory: head
|
||||
run: |
|
||||
REPORT_DIR="$RUNNER_TEMP/frontend-diagnostics"
|
||||
test -s "$REPORT_DIR/base-browser.json"
|
||||
test -s "$REPORT_DIR/head-browser.json"
|
||||
pnpm --filter diagnostics-frontend run render-browser-html \
|
||||
"$REPORT_DIR/base-browser.json" "$REPORT_DIR/head-browser.json" \
|
||||
"$REPORT_DIR/frontend-browser-detailed-html.html"
|
||||
|
||||
- name: Upload browser detailed html
|
||||
id: upload-browser-detailed-html
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: frontend-browser-metrics-detailed-html
|
||||
path: ${{ runner.temp }}/frontend-diagnostics/frontend-browser-detailed-html.html
|
||||
if-no-files-found: error
|
||||
archive: false
|
||||
retention-days: 7
|
||||
|
||||
- name: Generate frontend diagnostics report
|
||||
shell: bash
|
||||
working-directory: head
|
||||
env:
|
||||
BASE_SHA: ${{ github.event.pull_request.base.sha }}
|
||||
HEAD_SHA: ${{ github.event.pull_request.head.sha }}
|
||||
PR_NUMBER: ${{ github.event.pull_request.number }}
|
||||
FRONTEND_BUNDLE_REPORT_ARTIFACT_URL: ${{ steps.upload-bundle-visualizer.outputs.artifact-url }}
|
||||
FRONTEND_BROWSER_BASE_HEAP_SNAPSHOT_ARTIFACT_URL: ${{ steps.upload-browser-base-heap-snapshot.outputs.artifact-url }}
|
||||
FRONTEND_BROWSER_HEAD_HEAP_SNAPSHOT_ARTIFACT_URL: ${{ steps.upload-browser-head-heap-snapshot.outputs.artifact-url }}
|
||||
FRONTEND_BROWSER_DETAILED_HTML_ARTIFACT_URL: ${{ steps.upload-browser-detailed-html.outputs.artifact-url }}
|
||||
run: |
|
||||
REPORT_DIR="$RUNNER_TEMP/frontend-diagnostics"
|
||||
test -s "$REPORT_DIR/base-bundle-stats.json"
|
||||
test -s "$REPORT_DIR/head-bundle-stats.json"
|
||||
test -s "$REPORT_DIR/base-browser.json"
|
||||
test -s "$REPORT_DIR/head-browser.json"
|
||||
pnpm --filter diagnostics-frontend run render-md \
|
||||
"$GITHUB_WORKSPACE/base" "$GITHUB_WORKSPACE/head" \
|
||||
"$REPORT_DIR/base-bundle-stats.json" "$REPORT_DIR/head-bundle-stats.json" \
|
||||
"$REPORT_DIR/base-browser.json" "$REPORT_DIR/head-browser.json" \
|
||||
"$REPORT_DIR/frontend-diagnostics.md"
|
||||
printf '%s\n' "$PR_NUMBER" > "$REPORT_DIR/pr-number.txt"
|
||||
printf '%s\n' "$BASE_SHA" > "$REPORT_DIR/base-sha.txt"
|
||||
printf '%s\n' "$HEAD_SHA" > "$REPORT_DIR/head-sha.txt"
|
||||
printf '%s\n' "${{ github.event.pull_request.html_url }}" > "$REPORT_DIR/pr-url.txt"
|
||||
|
||||
- name: Check frontend diagnostics report
|
||||
shell: bash
|
||||
run: |
|
||||
REPORT_DIR="$RUNNER_TEMP/frontend-diagnostics"
|
||||
test -s "$REPORT_DIR/frontend-diagnostics.md"
|
||||
test -s "$REPORT_DIR/frontend-browser-detailed-html.html"
|
||||
test -s "$REPORT_DIR/pr-number.txt"
|
||||
test -s "$REPORT_DIR/head-sha.txt"
|
||||
cat "$REPORT_DIR/frontend-diagnostics.md" >> "$GITHUB_STEP_SUMMARY"
|
||||
|
||||
- name: Upload frontend diagnostics report
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: frontend-diagnostics
|
||||
path: |
|
||||
${{ runner.temp }}/frontend-diagnostics/base-bundle-stats.json
|
||||
${{ runner.temp }}/frontend-diagnostics/head-bundle-stats.json
|
||||
${{ runner.temp }}/frontend-diagnostics/base-browser.json
|
||||
${{ runner.temp }}/frontend-diagnostics/head-browser.json
|
||||
${{ runner.temp }}/frontend-diagnostics/frontend-diagnostics.md
|
||||
${{ runner.temp }}/frontend-diagnostics/pr-number.txt
|
||||
${{ runner.temp }}/frontend-diagnostics/base-sha.txt
|
||||
${{ runner.temp }}/frontend-diagnostics/head-sha.txt
|
||||
${{ runner.temp }}/frontend-diagnostics/pr-url.txt
|
||||
if-no-files-found: error
|
||||
retention-days: 7
|
||||
@@ -25,12 +25,12 @@ jobs:
|
||||
ref: refs/pull/${{ github.event.number }}/merge
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
ref: ${{ matrix.ref }}
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
|
||||
@@ -1,87 +0,0 @@
|
||||
# this name is used in report-backend-memory.yml so be careful when change name
|
||||
name: Get backend memory usage
|
||||
|
||||
on:
|
||||
pull_request:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
paths:
|
||||
- packages/backend/**
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/get-backend-memory.yml
|
||||
|
||||
jobs:
|
||||
get-memory-usage:
|
||||
runs-on: ubuntu-latest
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
memory-json-name: [memory-base.json, memory-head.json]
|
||||
include:
|
||||
- memory-json-name: memory-base.json
|
||||
ref: ${{ github.base_ref }}
|
||||
- memory-json-name: memory-head.json
|
||||
ref: refs/pull/${{ github.event.number }}/merge
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:18
|
||||
ports:
|
||||
- 54312:5432
|
||||
env:
|
||||
POSTGRES_DB: test-misskey
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
redis:
|
||||
image: redis:8
|
||||
ports:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
with:
|
||||
ref: ${{ matrix.ref }}
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- name: Check pnpm-lock.yaml
|
||||
run: git diff --exit-code pnpm-lock.yaml
|
||||
- name: Copy Configure
|
||||
run: cp .github/misskey/test.yml .config/default.yml
|
||||
- name: Compile Configure
|
||||
run: pnpm compile-config
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
- name: Run migrations
|
||||
run: pnpm --filter backend migrate
|
||||
- name: Measure memory usage
|
||||
run: |
|
||||
# Start the server and measure memory usage
|
||||
node packages/backend/scripts/measure-memory.mjs > ${{ matrix.memory-json-name }}
|
||||
- name: Upload Artifact
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: memory-artifact-${{ matrix.memory-json-name }}
|
||||
path: ${{ matrix.memory-json-name }}
|
||||
|
||||
save-pr-number:
|
||||
runs-on: ubuntu-latest
|
||||
permissions: {}
|
||||
steps:
|
||||
- name: Save PR number
|
||||
env:
|
||||
PR_NUMBER: ${{ github.event.number }}
|
||||
run: |
|
||||
echo "$PR_NUMBER" > ./pr_number
|
||||
- uses: actions/upload-artifact@v7
|
||||
with:
|
||||
name: memory-artifact-pr-number
|
||||
path: pr_number
|
||||
@@ -17,7 +17,9 @@ on:
|
||||
- packages/misskey-bubble-game/**
|
||||
- packages/misskey-reversi/**
|
||||
- packages/shared/eslint.config.js
|
||||
- scripts/check-dts*.mjs
|
||||
- .github/workflows/lint.yml
|
||||
- package.json
|
||||
pull_request:
|
||||
paths:
|
||||
- packages/backend/**
|
||||
@@ -31,17 +33,19 @@ on:
|
||||
- packages/misskey-bubble-game/**
|
||||
- packages/misskey-reversi/**
|
||||
- packages/shared/eslint.config.js
|
||||
- scripts/check-dts*.mjs
|
||||
- .github/workflows/lint.yml
|
||||
- package.json
|
||||
jobs:
|
||||
pnpm_install:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
@@ -69,12 +73,12 @@ jobs:
|
||||
eslint-cache-version: v1
|
||||
eslint-cache-path: ${{ github.workspace }}/node_modules/.cache/eslint-${{ matrix.workspace }}
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
@@ -100,12 +104,12 @@ jobs:
|
||||
- sw
|
||||
- misskey-js
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
@@ -113,3 +117,22 @@ jobs:
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- run: pnpm --filter "${{ matrix.workspace }}^..." run build
|
||||
- run: pnpm --filter ${{ matrix.workspace }} run typecheck
|
||||
|
||||
check-dts:
|
||||
needs: [pnpm_install]
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: pnpm i --frozen-lockfile
|
||||
- run: node --test scripts/check-dts.test.mjs
|
||||
- run: pnpm check-dts
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
name: Lint
|
||||
name: Locale
|
||||
|
||||
on:
|
||||
push:
|
||||
@@ -16,12 +16,12 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
continue-on-error: true
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: ".node-version"
|
||||
|
||||
@@ -16,11 +16,11 @@ jobs:
|
||||
id-token: write
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
name: Lint and test packages-private
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
- develop
|
||||
paths:
|
||||
- packages-private/**
|
||||
- packages/shared/eslint.config.js
|
||||
- package.json
|
||||
- pnpm-workspace.yaml
|
||||
- pnpm-lock.yaml
|
||||
- .github/workflows/packages-private.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- packages-private/**
|
||||
- packages/shared/eslint.config.js
|
||||
- package.json
|
||||
- pnpm-workspace.yaml
|
||||
- pnpm-lock.yaml
|
||||
- .github/workflows/packages-private.yml
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
jobs:
|
||||
check:
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
workspace:
|
||||
- diagnostics-shared
|
||||
- diagnostics-backend
|
||||
- diagnostics-frontend
|
||||
- changelog-checker
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
persist-credentials: false
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
node-version-file: '.node-version'
|
||||
cache: 'pnpm'
|
||||
- run: pnpm --filter ${{ matrix.workspace }}... install --frozen-lockfile
|
||||
# lint = typecheck + eslint
|
||||
- run: pnpm --filter ${{ matrix.workspace }} run lint
|
||||
# 各パッケージは必ず test スクリプトを持たせる (無いと ERR_PNPM_RECURSIVE_RUN_NO_SCRIPT で落ちる)
|
||||
- run: pnpm --filter ${{ matrix.workspace }} run test
|
||||
@@ -11,44 +11,26 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
||||
permissions:
|
||||
actions: read
|
||||
pull-requests: write
|
||||
|
||||
# api-artifact
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/github-script@v9
|
||||
- name: Download artifacts
|
||||
uses: actions/download-artifact@v8
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: context.payload.workflow_run.id,
|
||||
});
|
||||
let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name.startsWith("api-artifact-") || artifact.name == "api-artifact"
|
||||
});
|
||||
await Promise.all(matchArtifacts.map(async (artifact) => {
|
||||
let download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: artifact.id,
|
||||
archive_format: 'zip',
|
||||
});
|
||||
await fs.promises.writeFile(`${process.env.GITHUB_WORKSPACE}/${artifact.name}.zip`, Buffer.from(download.data));
|
||||
}));
|
||||
- name: Extract all artifacts
|
||||
run: |
|
||||
find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec unzip {} -d artifacts ';'
|
||||
ls -la
|
||||
pattern: api-artifact-*
|
||||
path: artifacts
|
||||
merge-multiple: true
|
||||
github-token: ${{ github.token }}
|
||||
repository: ${{ github.repository }}
|
||||
run-id: ${{ github.event.workflow_run.id }}
|
||||
- name: Check artifacts
|
||||
run: ls -lh artifacts/
|
||||
- name: Load PR Number
|
||||
id: load-pr-num
|
||||
run: echo "pr-number=$(cat artifacts/pr_number)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Output base
|
||||
run: cat ./artifacts/api-base.json
|
||||
- name: Output head
|
||||
run: cat ./artifacts/api-head.json
|
||||
- name: Arrange json files
|
||||
run: |
|
||||
jq '.' ./artifacts/api-base.json > ./api-base.json
|
||||
@@ -57,8 +39,6 @@ jobs:
|
||||
run: diff -u --label=base --label=head ./api-base.json ./api-head.json | cat > api.json.diff
|
||||
- name: Get full diff
|
||||
run: diff --label=base --label=head --new-line-format='+%L' --old-line-format='-%L' --unchanged-line-format=' %L' ./api-base.json ./api-head.json | cat > api-full.json.diff
|
||||
- name: Echo full diff
|
||||
run: cat ./api-full.json.diff
|
||||
- name: Upload full diff to Artifact
|
||||
uses: actions/upload-artifact@v7
|
||||
with:
|
||||
|
||||
@@ -1,177 +0,0 @@
|
||||
name: Report backend memory
|
||||
|
||||
on:
|
||||
workflow_run:
|
||||
types: [completed]
|
||||
workflows:
|
||||
- Get backend memory usage # get-backend-memory.yml
|
||||
|
||||
jobs:
|
||||
compare-memory:
|
||||
runs-on: ubuntu-latest
|
||||
if: ${{ github.event.workflow_run.conclusion == 'success' }}
|
||||
permissions:
|
||||
pull-requests: write
|
||||
|
||||
steps:
|
||||
- name: Download artifact
|
||||
uses: actions/github-script@v9
|
||||
with:
|
||||
script: |
|
||||
const fs = require('fs');
|
||||
let allArtifacts = await github.rest.actions.listWorkflowRunArtifacts({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
run_id: context.payload.workflow_run.id,
|
||||
});
|
||||
let matchArtifacts = allArtifacts.data.artifacts.filter((artifact) => {
|
||||
return artifact.name.startsWith("memory-artifact-") || artifact.name == "memory-artifact"
|
||||
});
|
||||
await Promise.all(matchArtifacts.map(async (artifact) => {
|
||||
let download = await github.rest.actions.downloadArtifact({
|
||||
owner: context.repo.owner,
|
||||
repo: context.repo.repo,
|
||||
artifact_id: artifact.id,
|
||||
archive_format: 'zip',
|
||||
});
|
||||
await fs.promises.writeFile(`${process.env.GITHUB_WORKSPACE}/${artifact.name}.zip`, Buffer.from(download.data));
|
||||
}));
|
||||
- name: Extract all artifacts
|
||||
run: |
|
||||
find . -mindepth 1 -maxdepth 1 -type f -name '*.zip' -exec unzip {} -d artifacts ';'
|
||||
ls -la artifacts/
|
||||
- name: Load PR Number
|
||||
id: load-pr-num
|
||||
run: echo "pr-number=$(cat artifacts/pr_number)" >> "$GITHUB_OUTPUT"
|
||||
|
||||
- name: Output base
|
||||
run: cat ./artifacts/memory-base.json
|
||||
- name: Output head
|
||||
run: cat ./artifacts/memory-head.json
|
||||
- name: Compare memory usage
|
||||
id: compare
|
||||
run: |
|
||||
BASE_MEMORY=$(cat ./artifacts/memory-base.json)
|
||||
HEAD_MEMORY=$(cat ./artifacts/memory-head.json)
|
||||
|
||||
variation() {
|
||||
calc() {
|
||||
BASE=$(echo "$BASE_MEMORY" | jq -r ".${1}.${2} // 0")
|
||||
HEAD=$(echo "$HEAD_MEMORY" | jq -r ".${1}.${2} // 0")
|
||||
|
||||
DIFF=$((HEAD - BASE))
|
||||
if [ "$BASE" -gt 0 ]; then
|
||||
DIFF_PERCENT=$(echo "scale=2; ($DIFF * 100) / $BASE" | bc)
|
||||
else
|
||||
DIFF_PERCENT=0
|
||||
fi
|
||||
|
||||
# Convert KB to MB for readability
|
||||
BASE_MB=$(echo "scale=2; $BASE / 1024" | bc)
|
||||
HEAD_MB=$(echo "scale=2; $HEAD / 1024" | bc)
|
||||
DIFF_MB=$(echo "scale=2; $DIFF / 1024" | bc)
|
||||
|
||||
JSON=$(jq -c -n \
|
||||
--argjson base "$BASE_MB" \
|
||||
--argjson head "$HEAD_MB" \
|
||||
--argjson diff "$DIFF_MB" \
|
||||
--argjson diff_percent "$DIFF_PERCENT" \
|
||||
'{base: $base, head: $head, diff: $diff, diff_percent: $diff_percent}')
|
||||
|
||||
echo "$JSON"
|
||||
}
|
||||
|
||||
JSON=$(jq -c -n \
|
||||
--argjson VmRSS "$(calc $1 VmRSS)" \
|
||||
--argjson VmHWM "$(calc $1 VmHWM)" \
|
||||
--argjson VmSize "$(calc $1 VmSize)" \
|
||||
--argjson VmData "$(calc $1 VmData)" \
|
||||
'{VmRSS: $VmRSS, VmHWM: $VmHWM, VmSize: $VmSize, VmData: $VmData}')
|
||||
|
||||
echo "$JSON"
|
||||
}
|
||||
|
||||
JSON=$(jq -c -n \
|
||||
--argjson beforeGc "$(variation beforeGc)" \
|
||||
--argjson afterGc "$(variation afterGc)" \
|
||||
--argjson afterRequest "$(variation afterRequest)" \
|
||||
'{beforeGc: $beforeGc, afterGc: $afterGc, afterRequest: $afterRequest}')
|
||||
|
||||
echo "res=$JSON" >> "$GITHUB_OUTPUT"
|
||||
- id: build-comment
|
||||
name: Build memory comment
|
||||
env:
|
||||
RES: ${{ steps.compare.outputs.res }}
|
||||
run: |
|
||||
HEADER="## Backend memory usage comparison"
|
||||
FOOTER="[See workflow logs for details](https://github.com/${GITHUB_REPOSITORY}/actions/runs/${GITHUB_RUN_ID})"
|
||||
|
||||
echo "$HEADER" > ./output.md
|
||||
echo >> ./output.md
|
||||
|
||||
table() {
|
||||
echo "| Metric | base (MB) | head (MB) | Diff (MB) | Diff (%) |" >> ./output.md
|
||||
echo "|--------|------:|------:|------:|------:|" >> ./output.md
|
||||
|
||||
line() {
|
||||
METRIC=$2
|
||||
BASE=$(echo "$RES" | jq -r ".${1}.${2}.base")
|
||||
HEAD=$(echo "$RES" | jq -r ".${1}.${2}.head")
|
||||
DIFF=$(echo "$RES" | jq -r ".${1}.${2}.diff")
|
||||
DIFF_PERCENT=$(echo "$RES" | jq -r ".${1}.${2}.diff_percent")
|
||||
|
||||
if (( $(echo "$DIFF_PERCENT > 0" | bc -l) )); then
|
||||
DIFF="+$DIFF"
|
||||
DIFF_PERCENT="+$DIFF_PERCENT"
|
||||
fi
|
||||
|
||||
# highlight VmRSS
|
||||
if [ "$2" = "VmRSS" ]; then
|
||||
METRIC="**${METRIC}**"
|
||||
BASE="**${BASE}**"
|
||||
HEAD="**${HEAD}**"
|
||||
DIFF="**${DIFF}**"
|
||||
DIFF_PERCENT="**${DIFF_PERCENT}**"
|
||||
fi
|
||||
|
||||
echo "| ${METRIC} | ${BASE} MB | ${HEAD} MB | ${DIFF} MB | ${DIFF_PERCENT}% |" >> ./output.md
|
||||
}
|
||||
|
||||
line $1 VmRSS
|
||||
line $1 VmHWM
|
||||
line $1 VmSize
|
||||
line $1 VmData
|
||||
}
|
||||
|
||||
echo "### Before GC" >> ./output.md
|
||||
table beforeGc
|
||||
echo >> ./output.md
|
||||
|
||||
echo "### After GC" >> ./output.md
|
||||
table afterGc
|
||||
echo >> ./output.md
|
||||
|
||||
echo "### After Request" >> ./output.md
|
||||
table afterRequest
|
||||
echo >> ./output.md
|
||||
|
||||
# Determine if this is a significant change (more than 5% increase)
|
||||
if [ "$(echo "$RES" | jq -r '.afterGc.VmRSS.diff_percent | tonumber > 5')" = "true" ]; then
|
||||
echo "⚠️ **Warning**: Memory usage has increased by more than 5%. Please verify this is not an unintended change." >> ./output.md
|
||||
echo >> ./output.md
|
||||
fi
|
||||
|
||||
echo "$FOOTER" >> ./output.md
|
||||
- uses: thollander/actions-comment-pull-request@v3
|
||||
with:
|
||||
pr-number: ${{ steps.load-pr-num.outputs.pr-number }}
|
||||
comment-tag: show_memory_diff
|
||||
file-path: ./output.md
|
||||
- name: Tell error to PR
|
||||
uses: thollander/actions-comment-pull-request@v3
|
||||
if: failure() && steps.load-pr-num.outputs.pr-number
|
||||
with:
|
||||
pr-number: ${{ steps.load-pr-num.outputs.pr-number }}
|
||||
comment-tag: show_memory_diff_error
|
||||
message: |
|
||||
An error occurred while comparing backend memory usage. See [workflow logs](https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}) for details.
|
||||
@@ -22,12 +22,12 @@ jobs:
|
||||
NODE_OPTIONS: "--max_old_space_size=7168"
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
if: github.event_name != 'pull_request_target'
|
||||
with:
|
||||
fetch-depth: 0
|
||||
submodules: true
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
if: github.event_name == 'pull_request_target'
|
||||
with:
|
||||
fetch-depth: 0
|
||||
@@ -37,7 +37,7 @@ jobs:
|
||||
if: github.event_name == 'pull_request_target'
|
||||
run: git checkout "$(git rev-list --parents -n1 HEAD | cut -d" " -f3)"
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
|
||||
@@ -19,12 +19,6 @@ on:
|
||||
- .github/workflows/test-backend.yml
|
||||
- .github/misskey/test.yml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
force_ffmpeg_cache_update:
|
||||
description: 'Force update ffmpeg cache'
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
jobs:
|
||||
unit:
|
||||
@@ -49,7 +43,7 @@ jobs:
|
||||
ports:
|
||||
- 56312:6379
|
||||
meilisearch:
|
||||
image: getmeili/meilisearch:v1.42.1
|
||||
image: getmeili/meilisearch:v1.48.1
|
||||
ports:
|
||||
- 57712:7700
|
||||
env:
|
||||
@@ -57,41 +51,14 @@ jobs:
|
||||
MEILI_ENV: development
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
- name: Get current date
|
||||
id: current-date
|
||||
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
- name: Setup and Restore ffmpeg/ffprobe Cache
|
||||
id: cache-ffmpeg
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
/usr/local/bin/ffmpeg
|
||||
/usr/local/bin/ffprobe
|
||||
# daily cache
|
||||
key: ${{ runner.os }}-ffmpeg-${{ steps.current-date.outputs.today }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-ffmpeg-${{ steps.current-date.outputs.today }}
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Install FFmpeg
|
||||
if: steps.cache-ffmpeg.outputs.cache-hit != 'true' || github.event.inputs.force_ffmpeg_cache_update == true
|
||||
run: |
|
||||
for i in {1..3}; do
|
||||
echo "Attempt $i: Installing FFmpeg..."
|
||||
curl -s -L https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -o ffmpeg.tar.xz && \
|
||||
tar -xf ffmpeg.tar.xz && \
|
||||
mv ffmpeg-*-static/ffmpeg /usr/local/bin/ && \
|
||||
mv ffmpeg-*-static/ffprobe /usr/local/bin/ && \
|
||||
rm -rf ffmpeg.tar.xz ffmpeg-*-static/ && \
|
||||
break || sleep 10
|
||||
if [ $i -eq 3 ]; then
|
||||
echo "Failed to install FFmpeg after 3 attempts"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
sudo apt install -y ffmpeg
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
@@ -136,11 +103,11 @@ jobs:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
@@ -180,11 +147,11 @@ jobs:
|
||||
POSTGRES_HOST_AUTH_METHOD: trust
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Get current date
|
||||
id: current-date
|
||||
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
|
||||
@@ -15,12 +15,6 @@ on:
|
||||
- packages/misskey-js/**
|
||||
- .github/workflows/test-federation.yml
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
force_ffmpeg_cache_update:
|
||||
description: 'Force update ffmpeg cache'
|
||||
required: false
|
||||
default: false
|
||||
type: boolean
|
||||
|
||||
jobs:
|
||||
test:
|
||||
@@ -36,37 +30,10 @@ jobs:
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
- name: Get current date
|
||||
id: current-date
|
||||
run: echo "today=$(date +'%Y-%m-%d')" >> $GITHUB_OUTPUT
|
||||
- name: Setup and Restore ffmpeg/ffprobe Cache
|
||||
id: cache-ffmpeg
|
||||
uses: actions/cache@v5
|
||||
with:
|
||||
path: |
|
||||
/usr/local/bin/ffmpeg
|
||||
/usr/local/bin/ffprobe
|
||||
# daily cache
|
||||
key: ${{ runner.os }}-ffmpeg-${{ steps.current-date.outputs.today }}
|
||||
restore-keys: |
|
||||
${{ runner.os }}-ffmpeg-${{ steps.current-date.outputs.today }}
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Install FFmpeg
|
||||
if: steps.cache-ffmpeg.outputs.cache-hit != 'true' || github.event.inputs.force_ffmpeg_cache_update == true
|
||||
run: |
|
||||
for i in {1..3}; do
|
||||
echo "Attempt $i: Installing FFmpeg..."
|
||||
curl -s -L https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar.xz -o ffmpeg.tar.xz && \
|
||||
tar -xf ffmpeg.tar.xz && \
|
||||
mv ffmpeg-*-static/ffmpeg /usr/local/bin/ && \
|
||||
mv ffmpeg-*-static/ffprobe /usr/local/bin/ && \
|
||||
rm -rf ffmpeg.tar.xz ffmpeg-*-static/ && \
|
||||
break || sleep 10
|
||||
if [ $i -eq 3 ]; then
|
||||
echo "Failed to install FFmpeg after 3 attempts"
|
||||
exit 1
|
||||
fi
|
||||
done
|
||||
sudo apt install -y ffmpeg
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
|
||||
@@ -28,11 +28,11 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
@@ -57,11 +57,6 @@ jobs:
|
||||
name: E2E tests (frontend)
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
browser: [chrome]
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:18
|
||||
@@ -76,17 +71,11 @@ jobs:
|
||||
- 56312:6379
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
# https://github.com/cypress-io/cypress-docker-images/issues/150
|
||||
#- name: Install mplayer for FireFox
|
||||
# run: sudo apt install mplayer -y
|
||||
# if: ${{ matrix.browser == 'firefox' }}
|
||||
#- uses: browser-actions/setup-firefox@latest
|
||||
# if: ${{ matrix.browser == 'firefox' }}
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
@@ -97,29 +86,14 @@ jobs:
|
||||
run: cp .github/misskey/test.yml .config
|
||||
- name: Build
|
||||
run: pnpm build
|
||||
# https://github.com/cypress-io/cypress/issues/4351#issuecomment-559489091
|
||||
- name: ALSA Env
|
||||
run: echo -e 'pcm.!default {\n type hw\n card 0\n}\n\nctl.!default {\n type hw\n card 0\n}' > ~/.asoundrc
|
||||
# XXX: This tries reinstalling Cypress if the binary is not cached
|
||||
# Remove this when the cache issue is fixed
|
||||
- name: Cypress install
|
||||
run: pnpm exec cypress install
|
||||
- name: Cypress run
|
||||
uses: cypress-io/github-action@v7.1.9
|
||||
- name: Playwright install
|
||||
working-directory: packages/frontend
|
||||
run: pnpm exec playwright install --with-deps chromium
|
||||
- name: Test
|
||||
run: pnpm start-server-and-test start:test http://localhost:61812 "pnpm --filter frontend test:e2e"
|
||||
timeout-minutes: 15
|
||||
with:
|
||||
install: false
|
||||
start: pnpm start:test
|
||||
wait-on: 'http://localhost:61812'
|
||||
headed: true
|
||||
browser: ${{ matrix.browser }}
|
||||
- uses: actions/upload-artifact@v7
|
||||
if: failure()
|
||||
with:
|
||||
name: ${{ matrix.browser }}-cypress-screenshots
|
||||
path: cypress/screenshots
|
||||
- uses: actions/upload-artifact@v7
|
||||
if: always()
|
||||
with:
|
||||
name: ${{ matrix.browser }}-cypress-videos
|
||||
path: cypress/videos
|
||||
name: playwright-e2e-artifacts
|
||||
path: packages/frontend/test/e2e/artifacts
|
||||
|
||||
@@ -22,10 +22,10 @@ jobs:
|
||||
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@v6.0.2
|
||||
uses: actions/checkout@v6.0.3
|
||||
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
|
||||
- name: Setup Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
|
||||
@@ -16,11 +16,11 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
|
||||
@@ -17,11 +17,11 @@ jobs:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v6.0.2
|
||||
- uses: actions/checkout@v6.0.3
|
||||
with:
|
||||
submodules: true
|
||||
- name: Setup pnpm
|
||||
uses: pnpm/action-setup@v6.0.3
|
||||
uses: pnpm/action-setup@v6.0.9
|
||||
- name: Use Node.js
|
||||
uses: actions/setup-node@v6.4.0
|
||||
with:
|
||||
|
||||
+3
-4
@@ -23,9 +23,8 @@ packages/sw/.yarn/cache
|
||||
# pnpm
|
||||
.pnpm-store
|
||||
|
||||
# Cypress
|
||||
cypress/screenshots
|
||||
cypress/videos
|
||||
# Playwright
|
||||
packages/frontend/test/e2e/artifacts
|
||||
|
||||
# Coverage
|
||||
coverage
|
||||
@@ -35,7 +34,7 @@ coverage
|
||||
!/.config/example.yml
|
||||
!/.config/docker_example.yml
|
||||
!/.config/docker_example.env
|
||||
!/.config/cypress-devcontainer.yml
|
||||
!/.config/playwright-devcontainer.yml
|
||||
docker-compose.yml
|
||||
./compose.yml
|
||||
.devcontainer/compose.yml
|
||||
|
||||
+1
-1
@@ -1 +1 @@
|
||||
22.15.0
|
||||
26.4.0
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
build:
|
||||
misskey:
|
||||
args:
|
||||
- NODE_ENV=development
|
||||
deploy:
|
||||
- helm upgrade --install misskey chart --set image=${OKTETO_BUILD_MISSKEY_IMAGE} --set url="https://misskey-$(kubectl config view --minify -o jsonpath='{..namespace}').cloud.okteto.net" --set environment=development
|
||||
@@ -63,14 +63,16 @@
|
||||
9. **ユーザーの明示指示なしに PR を merge / close / force-push しない**
|
||||
10. **ユーザーの明示指示なしに external service (GitHub comments / Slack / メール 等) へ送信しない**
|
||||
11. **secrets / 認証情報をリポジトリにコミットしない** (`.config/*.yml` の本番値、`.env` ファイル、API token、private key 等)
|
||||
12. **脆弱性報告を通常の Issue / PR 経由で行わない** (脆弱性報告を行う場合のルールは `creating-issues-and-prs` スキルを参照すること)
|
||||
|
||||
### スキル呼び出し
|
||||
|
||||
上流スキルの実行・事前知識・memory の内容に関わらず免除されない。
|
||||
|
||||
12. **`working-on-backend` スキルを参照せずに `packages/backend/` 配下のファイルを編集・追加しない**
|
||||
13. **`working-on-frontend` スキルを参照せずに `packages/frontend/` 配下のファイルを編集・追加しない**
|
||||
14. **`shipping-misskey-change` スキルを参照せずに commit / PR 作成 / 作業をユーザーに返さない**
|
||||
13. **`working-on-backend` スキルを参照せずに `packages/backend/` 配下のファイルを編集・追加しない**
|
||||
14. **`working-on-frontend` スキルを参照せずに `packages/frontend/` 配下のファイルを編集・追加しない**
|
||||
15. **`shipping-misskey-change` スキルを参照せずに commit / PR 作成 / 作業をユーザーに返さない**
|
||||
16. **`creating-issues-and-prs` スキルを参照せずに Issue / PR を起票しない** (脆弱性報告のルールも含む)
|
||||
|
||||
---
|
||||
|
||||
|
||||
+85
-2
@@ -1,10 +1,83 @@
|
||||
## 2026.7.0
|
||||
|
||||
### Note
|
||||
|
||||
**今回のリリースではMisskeyの各種動作要件が変更されます。必ずアップグレード前にお使いの環境をご確認ください。**
|
||||
|
||||
- センシティブメディアの判定 (NSFW検出) が、本体に内蔵された nsfwjs による推論から、外部サービス [sensitive-detector](https://github.com/misskey-dev/sensitive-detector) への HTTP 呼び出し方式に変更されました。
|
||||
- これに伴い、本体から `nsfwjs` / `@tensorflow/tfjs` / `@tensorflow/tfjs-node` および同梱の NSFW 判定モデルが削除され、インストール要件 (ネイティブ ML スタック) が緩和されました。
|
||||
- **センシティブ判定機能を利用しているサーバーは対応が必要です。** 別途 [sensitive-detector](https://github.com/misskey-dev/sensitive-detector) サービスを立ち上げ、コントロールパネルの「モデレーション > センシティブなメディアの検出」で接続先 URL を設定してください。接続先が未設定の場合、センシティブ判定は行われません (すべて非センシティブ扱い)。
|
||||
- 画像の正規化・動画フレームの抽出・しきい値判定・集約は引き続き本体側で行われ、外部サービスには正規化済み画像の推論のみを委譲します。
|
||||
- Node.js v24, v26 をサポートしました。**Node.js v22 でも動作しますが、今後のリリースで v22 のサポートを終了する予定**ですので、Node.js のアップデートをご検討ください。
|
||||
- Node.js のセキュリティアップデートに伴い、最低動作バージョンを 22.22.2 / 24.17.0 / 26.4.0 に引き上げました。
|
||||
- Docker Image は Node.js 26.4.0-trixie に更新されています。
|
||||
- バックエンドで画像処理に用いているライブラリ sharp のシステム要件の変更により、**SSE4.2 命令セットをサポートしていない x86_64 CPU では Misskey が正しく動作しなくなります**。仮想マシンに Misskey をデプロイしている場合や、古いハードウェアをお使いの場合は、アップデート前にお使いの環境をご確認ください。なお、ARM64 など x86_64 ではない環境においてはこの変更による影響はありません。
|
||||
|
||||
### General
|
||||
- Feat: コントロールパネルから二要素認証を解除できるように
|
||||
- Feat: 条件に一致したURLプレビューのサムネイルを隠すことができるように
|
||||
(Based on https://github.com/MisskeyIO/misskey/pull/214)
|
||||
|
||||
### Client
|
||||
- 2025.4.0 以前の設定情報の移行処理が削除されました
|
||||
- 2025.4.0 から直接 2026.6.0 以上にアップデートする場合は設定が移行されませんので注意してください。移行したい場合は一度 2026.5.1 を経由してください。
|
||||
- Enhance: 画像ビューワーを独自実装に変更・動画プレイヤーを統合
|
||||
- 操作性の改善
|
||||
- ビューワーとMisskeyの各種機能との統合を強化
|
||||
- パフォーマンスの向上
|
||||
- Enhance: マウスホイールで拡大縮小できるように
|
||||
- Fix: 幅が狭い画面で動画の再生が困難な問題を修正
|
||||
- Fix: 一部の画像のみセンシティブなとき、ビューワー内で画像を切り替えるとセンシティブな画像がそのまま表示される問題を修正
|
||||
- Fix: 一部の画像をビューワーで読み込んだ際に正しく表示されない問題を修正
|
||||
- Enhance: タイムラインの読み込みパフォーマンスを改善
|
||||
- Enhance: タブがバックグラウンドの間は必要ない定期更新処理を停止するように
|
||||
- Fix: 「画像を新しいタブで開く」が機能しなくなっていた問題を修正
|
||||
- Fix: デバイスタイプをスマートフォンに固定している状態で画面幅が広いとき、画面左上のアイコンが表示されない問題を修正
|
||||
- Fix: チャットでIMEの変換を確定するEnterでメッセージが送信されてしまうことがある問題を修正
|
||||
- Fix: 自分へのメンションに対する色分けで、判定が大文字/小文字を区別していた問題を修正
|
||||
- Fix: いくつかのイベントリスナーが正しく解除されない問題を修正(メモリ使用量の改善)
|
||||
- Fix: 非ログイン時トップページをスクロール操作できないことがある問題を修正
|
||||
- Fix: ローカルユーザーへのホスト付きメンションが本文に含まれる指名ノートの作成時、投稿フォームにて、当該ユーザーが宛先に含まれていても正しく認識されない問題を修正
|
||||
- Fix: チャートの描画終了後にリソースが解放されない問題を修正
|
||||
- Fix: ドライブの「このファイルからノートを作成」やギャラリーの「ノートで共有」、誕生日ウィジェットからのノート作成において、通常投稿の下書きが表示される問題を修正
|
||||
- Fix: QRコードリーダーがページを離れても停止しない問題を修正
|
||||
- Fix: ノートの詳細表示で削除された引用元が表示されない問題を修正
|
||||
|
||||
### Server
|
||||
- Feat: OpenTelemetryサポート
|
||||
- 詳細な設定はconfigファイルを参照してください。
|
||||
- Sentryとの併用も可能です。Sentry併用時は、PostgreSQL Query と Redis command は Sentry で計装されます。
|
||||
- 以下の自動計装をサポートしています。(計装対象にする項目は設定可能)
|
||||
- PostgreSQL query
|
||||
- Redis command
|
||||
- 全ての受信HTTPリクエスト
|
||||
- 全ての送信HTTPリクエスト
|
||||
- ジョブキュー(エンキュー元のトレースを含む)
|
||||
- Feat: ログ基盤の刷新
|
||||
- API内部エラーのログに構造化属性と正規化したエラー情報を付与し、認証情報を自動的に秘匿するように(従来形式の表示は維持)
|
||||
- ログ全体の既定出力レベルとドメインごとの出力レベルを設定できるように
|
||||
- バックエンドのログを1行JSON形式で出力できるように
|
||||
- OpenTelemetryのTrace ContextをJSON形式のログへ関連付けられるように
|
||||
- HTTPのAccess logをstatus class単位で出力できるように(開発時のリクエスト・レスポンス本文、OpenTelemetryのTrace Contextにも対応)
|
||||
- Enhance: Sentry バックエンドの自動計装を `sentryForBackend.disabledIntegrations` で個別に無効化できるように
|
||||
- Enhance: センシティブメディアの判定を外部サービス ([sensitive-detector](https://github.com/misskey-dev/sensitive-detector)) に分離し、`nsfwjs` / `@tensorflow/tfjs(-node)` の同梱と NSFW 判定モデルを廃止 (#16804)
|
||||
- Enhance: Node.js 22.22.2以降、24.17.0以降、26.4.0以降をサポートするように
|
||||
- Enhance: Docker Image の Node.js を 26.4.0 に、Debian を trixie (v13) に更新
|
||||
- Enhance: URLプレビューの結果を内部でキャッシュするように
|
||||
- Fix: `/stats` API のレスポンス型が正しくない問題を修正
|
||||
- Fix: ハッシュタグに関連するデータを更新する際のエラーハンドリングを修正
|
||||
- Fix: Sentry 使用環境下にて、Misskey が発行した SQL クエリが span に含まれない問題を修正
|
||||
- Fix: Sentry 使用環境下にて、外部送信リクエストへ `sentry-trace` / `baggage` ヘッダーが既定で付与されないように
|
||||
- Fix: フォロワー限定投稿へのリプライをホーム投稿に出来る問題を修正
|
||||
- Fix: ファイルをアップロードするAPIにて、処理終了後に一時ファイルが削除されないことがある問題を修正
|
||||
|
||||
## 2026.6.0
|
||||
|
||||
### General
|
||||
- Feat: ジョブキュー管理画面からキューの一時停止/再開ができるように
|
||||
- Feat: アンテナのタイムラインから個別のノートを削除できるように
|
||||
- Fix: コンパネからrootユーザーのパスワードをリセットしようとした際にエラーが通知されない問題を修正
|
||||
- Feat: ノート検索で投稿日時の期間を条件に加えられるように(#16035)
|
||||
- Fix: コンパネからrootユーザーのパスワードをリセットしようとした際にエラーが通知されない問題を修正
|
||||
|
||||
### Client
|
||||
- Enhance: ユーザーページのファイルタブでスクロール位置が保持されるように
|
||||
@@ -18,13 +91,23 @@
|
||||
- Fix: 「D」キーでダークモードを切り替える際にsyncDeviceDarkModeのチェックがバイパスされる問題を修正
|
||||
- Fix: パスキー登録完了時の認証ダイアログの入力値が使われていない問題を修正
|
||||
- Fix: メンションのサジェスト時に表示されるアイコン表示が画像サイズ次第で崩れる問題を修正
|
||||
- Fix: ノートの下書きをリセットする際、未アップロードのファイルについては添付予定が解除されない問題を修正
|
||||
- Fix: 画像アップロード時、フレームのキャプション付与が正しく行われないことがある問題を修正
|
||||
|
||||
### Server
|
||||
- Enhance: リモートノートクリーニングジョブのスキップ処理のパフォーマンス改善
|
||||
- Fix: PerUserDriveChart がシステム所有ファイル (userId が null) の更新で `"group"` の非NULL制約違反によりクラッシュする問題を修正 (#17498)
|
||||
- Enhance: リモートノートクリーニングジョブの削除対象検索処理のパフォーマンス改善
|
||||
- Enhance: ActivityPub の画像添付に width/height を含めるように
|
||||
- Enhance: URLプレビューのデフォルトの User Agent に Misskey サーバーのURLを含めるように
|
||||
- Fix: backend バンドルで `@tensorflow/tfjs-node` を external に含めず、起動時に `@mapbox/node-pre-gyp` の `find()` が backend の package.json を誤検出して `is not node-pre-gyp ready` エラーを永続的に吐く問題を修正
|
||||
- Fix: MemoryKVCacheのキャッシュGC処理において、更新されたキャッシュが期限切れにならないことがある問題を修正
|
||||
- Fix: PerUserDriveChart がシステム所有ファイル (userId が null) の更新で `"group"` の非NULL制約違反によりクラッシュする問題を修正 (#17498)
|
||||
- Fix: センシティブメディア自動検出周りの依存関係・ファイルの解決に失敗する問題を修正
|
||||
- Fix: フォロワー限定投稿を指名投稿で引用した際に、引用した投稿の公開範囲が意図せず変更される問題を修正
|
||||
- Fix: `actor` を持たない不正なInboxアクティビティを受信した際に配送ジョブが `TypeError` でクラッシュする問題を修正 (受信時に検証して400で返し、ジョブを積まないように変更)
|
||||
- Fix: Startup and shutdown failures (port-in-use, socket permission denied, plugin timeouts, leaked WebSocket connections) are now reported through the misskey logger instead of an UnhandledPromiseRejectionWarning stack trace
|
||||
- Fix: リモートのノートに対するメンション数制限が、サーバーが解決できたユーザー数ベースで行われていた問題を修正
|
||||
- Fix: セキュリティに関する修正
|
||||
|
||||
## 2026.5.4
|
||||
|
||||
|
||||
@@ -600,6 +600,90 @@ TypeScriptでjsonをimportすると、tscでコンパイルするときにその
|
||||
コンポーネント自身がmarginを設定するのは問題の元となることはよく知られている
|
||||
marginはそのコンポーネントを使う側が設定する
|
||||
|
||||
### 命名規則
|
||||
|
||||
本来それが略称であっても、通常それでひとつのワードとして用いられるものは、略称として扱わない。
|
||||
|
||||
#### 例: IP address
|
||||
|
||||
Good: `ipAddress` / `IpAddress`
|
||||
|
||||
Bad: `IPAddress`
|
||||
|
||||
#### 例: User ID
|
||||
|
||||
Good: `userId` / `UserId`
|
||||
|
||||
Bad: `userID` / `UserID`
|
||||
|
||||
#### 例: XMLなHTTPのRequest
|
||||
|
||||
Good: `xmlHttpRequest` / `XmlHttpRequest`
|
||||
|
||||
Bad: `XMLHttpRequest` / `XMLHTTPRequest`
|
||||
|
||||
### 関数化の基準
|
||||
|
||||
汎用性が低く(例えばそれを関数化したとしてもその呼び出しが元の場所一か所しか存在しない)、内容も短い処理(例えば10行以下)は、かえって読みにくくなるため、関数化しない。
|
||||
|
||||
また、関数化する場合でも、呼び出しがある特定のスコープに限られる場合は、そのスコープ内に閉じ込めた方が分かりやすく簡潔になる場合がある(ただし本来その処理に不要であっても、構造上親のスコープにある関係のない変数や引数にもアクセスできるようになるため、必ずしもそうすれば設計上綺麗になるというわけでもない。状況に応じて判断すべし)。
|
||||
|
||||
Bad:
|
||||
|
||||
``` ts
|
||||
function withBrankets(x) {
|
||||
return `(${x})`;
|
||||
}
|
||||
|
||||
function formatPercent(x) {
|
||||
return `${x}%`;
|
||||
}
|
||||
|
||||
function formatValue(x) {
|
||||
return withBrankets(formatPercent(x));
|
||||
}
|
||||
|
||||
function showData(a, b) {
|
||||
console.log(formatValue(a));
|
||||
console.log(formatValue(b));
|
||||
}
|
||||
```
|
||||
|
||||
Good:
|
||||
|
||||
``` ts
|
||||
function formatValue(x) {
|
||||
return `(${x}%)`;
|
||||
}
|
||||
|
||||
function showData(a, b) {
|
||||
console.log(formatValue(a));
|
||||
console.log(formatValue(b));
|
||||
}
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` ts
|
||||
function showData(a, b) {
|
||||
function formatValue(x) {
|
||||
return `(${x}%)`;
|
||||
}
|
||||
|
||||
console.log(formatValue(a));
|
||||
console.log(formatValue(b));
|
||||
}
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
``` ts
|
||||
function showData(a, b) {
|
||||
console.log(`(${a}%)`);
|
||||
console.log(`(${b}%)`);
|
||||
}
|
||||
```
|
||||
|
||||
## その他
|
||||
### HTMLのクラス名で follow という単語は使わない
|
||||
広告ブロッカーで誤ってブロックされる
|
||||
|
||||
+1
-1
@@ -1,6 +1,6 @@
|
||||
# syntax = docker/dockerfile:1.23
|
||||
|
||||
ARG NODE_VERSION=22.22.2-bookworm
|
||||
ARG NODE_VERSION=26.4.0-trixie
|
||||
|
||||
# build assets & compile TypeScript
|
||||
|
||||
|
||||
@@ -1,4 +0,0 @@
|
||||
apiVersion: v2
|
||||
name: misskey
|
||||
version: 0.0.0
|
||||
description: This chart is created for the purpose of previewing Pull Requests. Do not use this for production use.
|
||||
@@ -1,232 +0,0 @@
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
# Misskey configuration
|
||||
#━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
|
||||
|
||||
# ┌─────┐
|
||||
#───┘ URL └─────────────────────────────────────────────────────
|
||||
|
||||
# Final accessible URL seen by a user.
|
||||
# url: https://example.tld/
|
||||
|
||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||
# URL SETTINGS AFTER THAT!
|
||||
|
||||
# ┌───────────────────────┐
|
||||
#───┘ Port and TLS settings └───────────────────────────────────
|
||||
|
||||
#
|
||||
# Misskey supports two deployment options for public.
|
||||
#
|
||||
|
||||
# Option 1: With Reverse Proxy
|
||||
#
|
||||
# +----- https://example.tld/ ------------+
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# | User | ---> || Proxy (443) | ---> | Misskey (3000) ||
|
||||
# +------+ |+-------------+ +----------------+|
|
||||
# +---------------------------------------+
|
||||
#
|
||||
# You need to setup reverse proxy. (eg. nginx)
|
||||
# You do not define 'https' section.
|
||||
|
||||
# Option 2: Standalone
|
||||
#
|
||||
# +- https://example.tld/ -+
|
||||
# +------+ | +---------------+ |
|
||||
# | User | ---> | | Misskey (443) | |
|
||||
# +------+ | +---------------+ |
|
||||
# +------------------------+
|
||||
#
|
||||
# You need to run Misskey as root.
|
||||
# You need to set Certificate in 'https' section.
|
||||
|
||||
# To use option 1, uncomment below line.
|
||||
port: 3000 # A port that your Misskey server should listen.
|
||||
|
||||
# To use option 2, uncomment below lines.
|
||||
#port: 443
|
||||
|
||||
#https:
|
||||
# # path for certification
|
||||
# key: /etc/letsencrypt/live/example.tld/privkey.pem
|
||||
# cert: /etc/letsencrypt/live/example.tld/fullchain.pem
|
||||
|
||||
# ┌──────────────────────────┐
|
||||
#───┘ PostgreSQL configuration └────────────────────────────────
|
||||
|
||||
db:
|
||||
host: localhost
|
||||
port: 5432
|
||||
|
||||
# Database name
|
||||
db: misskey
|
||||
|
||||
# Auth
|
||||
user: example-misskey-user
|
||||
pass: example-misskey-pass
|
||||
|
||||
# Whether disable Caching queries
|
||||
#disableCache: true
|
||||
|
||||
# Extra Connection options
|
||||
#extra:
|
||||
# ssl: true
|
||||
|
||||
dbReplications: false
|
||||
|
||||
# You can configure any number of replicas here
|
||||
#dbSlaves:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
# -
|
||||
# host:
|
||||
# port:
|
||||
# db:
|
||||
# user:
|
||||
# pass:
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Redis configuration └─────────────────────────────────────
|
||||
|
||||
redis:
|
||||
host: 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
|
||||
|
||||
#redisForTimelines:
|
||||
# host: redis
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
#redisForReactions:
|
||||
# host: redis
|
||||
# port: 6379
|
||||
# #family: 0 # 0=Both, 4=IPv4, 6=IPv6
|
||||
# #pass: example-pass
|
||||
# #prefix: example-prefix
|
||||
# #db: 1
|
||||
|
||||
# ┌───────────────────────────┐
|
||||
#───┘ MeiliSearch configuration └─────────────────────────────
|
||||
|
||||
#meilisearch:
|
||||
# host: localhost
|
||||
# port: 7700
|
||||
# apiKey: ''
|
||||
# ssl: true
|
||||
# index: ''
|
||||
|
||||
# ┌───────────────┐
|
||||
#───┘ ID generation └───────────────────────────────────────────
|
||||
|
||||
# You can select the ID generation method.
|
||||
# You don't usually need to change this setting, but you can
|
||||
# change it according to your preferences.
|
||||
|
||||
# Available methods:
|
||||
# aid ... Short, Millisecond accuracy
|
||||
# aidx ... Millisecond accuracy
|
||||
# meid ... Similar to ObjectID, Millisecond accuracy
|
||||
# ulid ... Millisecond accuracy
|
||||
# objectid ... This is left for backward compatibility
|
||||
|
||||
# ONCE YOU HAVE STARTED THE INSTANCE, DO NOT CHANGE THE
|
||||
# ID SETTINGS AFTER THAT!
|
||||
|
||||
id: "aidx"
|
||||
|
||||
# ┌────────────────┐
|
||||
#───┘ Error tracking └──────────────────────────────────────────
|
||||
|
||||
# Sentry is available for error tracking.
|
||||
# See the Sentry documentation for more details on options.
|
||||
|
||||
#sentryForBackend:
|
||||
# enableNodeProfiling: true
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
#sentryForFrontend:
|
||||
# vueIntegration:
|
||||
# tracingOptions:
|
||||
# trackComponents: true
|
||||
# browserTracingIntegration:
|
||||
# replayIntegration:
|
||||
# options:
|
||||
# dsn: 'https://examplePublicKey@o0.ingest.sentry.io/0'
|
||||
|
||||
# ┌─────────────────────┐
|
||||
#───┘ Other configuration └─────────────────────────────────────
|
||||
|
||||
# Whether disable HSTS
|
||||
#disableHsts: true
|
||||
|
||||
# Number of worker processes
|
||||
#clusterLimit: 1
|
||||
|
||||
# Number of threads of extra thread pool for CPU-intensive tasks (per worker)
|
||||
#threadPoolSize: 1
|
||||
|
||||
# Job concurrency per worker
|
||||
# deliverJobConcurrency: 128
|
||||
# inboxJobConcurrency: 16
|
||||
|
||||
# Job rate limiter
|
||||
# deliverJobPerSec: 128
|
||||
# inboxJobPerSec: 32
|
||||
|
||||
# Job attempts
|
||||
# deliverJobMaxAttempts: 12
|
||||
# inboxJobMaxAttempts: 8
|
||||
|
||||
# IP address family used for outgoing request (ipv4, ipv6 or dual)
|
||||
#outgoingAddressFamily: ipv4
|
||||
|
||||
# Proxy for HTTP/HTTPS
|
||||
#proxy: http://127.0.0.1:3128
|
||||
|
||||
#proxyBypassHosts: [
|
||||
# 'example.com',
|
||||
# '192.0.2.8'
|
||||
#]
|
||||
|
||||
# Proxy for SMTP/SMTPS
|
||||
#proxySmtp: http://127.0.0.1:3128 # use HTTP/1.1 CONNECT
|
||||
#proxySmtp: socks4://127.0.0.1:1080 # use SOCKS4
|
||||
#proxySmtp: socks5://127.0.0.1:1080 # use SOCKS5
|
||||
|
||||
# Media Proxy
|
||||
#mediaProxy: https://example.com/proxy
|
||||
|
||||
#allowedPrivateNetworks: [
|
||||
# '127.0.0.1/32'
|
||||
#]
|
||||
|
||||
# Upload or download file size limits (bytes)
|
||||
#maxFileSize: 262144000
|
||||
@@ -1,8 +0,0 @@
|
||||
apiVersion: v1
|
||||
kind: ConfigMap
|
||||
metadata:
|
||||
name: {{ include "misskey.fullname" . }}-configuration
|
||||
data:
|
||||
default.yml: |-
|
||||
{{ .Files.Get "files/default.yml"|nindent 4 }}
|
||||
url: {{ .Values.url }}
|
||||
@@ -1,47 +0,0 @@
|
||||
apiVersion: apps/v1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
name: {{ include "misskey.fullname" . }}
|
||||
labels:
|
||||
{{- include "misskey.labels" . | nindent 4 }}
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
{{- include "misskey.selectorLabels" . | nindent 6 }}
|
||||
replicas: 1
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
{{- include "misskey.selectorLabels" . | nindent 8 }}
|
||||
spec:
|
||||
containers:
|
||||
- name: misskey
|
||||
image: {{ .Values.image }}
|
||||
env:
|
||||
- name: NODE_ENV
|
||||
value: {{ .Values.environment }}
|
||||
volumeMounts:
|
||||
- name: {{ include "misskey.fullname" . }}-configuration
|
||||
mountPath: /misskey/.config
|
||||
readOnly: true
|
||||
ports:
|
||||
- containerPort: 3000
|
||||
- name: postgres
|
||||
image: postgres:18-alpine
|
||||
env:
|
||||
- name: POSTGRES_USER
|
||||
value: "example-misskey-user"
|
||||
- name: POSTGRES_PASSWORD
|
||||
value: "example-misskey-pass"
|
||||
- name: POSTGRES_DB
|
||||
value: "misskey"
|
||||
ports:
|
||||
- containerPort: 5432
|
||||
- name: redis
|
||||
image: redis:7-alpine
|
||||
ports:
|
||||
- containerPort: 6379
|
||||
volumes:
|
||||
- name: {{ include "misskey.fullname" . }}-configuration
|
||||
configMap:
|
||||
name: {{ include "misskey.fullname" . }}-configuration
|
||||
@@ -1,14 +0,0 @@
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: {{ include "misskey.fullname" . }}
|
||||
annotations:
|
||||
dev.okteto.com/auto-ingress: "true"
|
||||
spec:
|
||||
type: ClusterIP
|
||||
ports:
|
||||
- port: 3000
|
||||
protocol: TCP
|
||||
name: http
|
||||
selector:
|
||||
{{- include "misskey.selectorLabels" . | nindent 4 }}
|
||||
@@ -1,62 +0,0 @@
|
||||
{{/*
|
||||
Expand the name of the chart.
|
||||
*/}}
|
||||
{{- define "misskey.name" -}}
|
||||
{{- default .Chart.Name .Values.nameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create a default fully qualified app name.
|
||||
We truncate at 63 chars because some Kubernetes name fields are limited to this (by the DNS naming spec).
|
||||
If release name contains chart name it will be used as a full name.
|
||||
*/}}
|
||||
{{- define "misskey.fullname" -}}
|
||||
{{- if .Values.fullnameOverride }}
|
||||
{{- .Values.fullnameOverride | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- $name := default .Chart.Name .Values.nameOverride }}
|
||||
{{- if contains $name .Release.Name }}
|
||||
{{- .Release.Name | trunc 63 | trimSuffix "-" }}
|
||||
{{- else }}
|
||||
{{- printf "%s-%s" .Release.Name $name | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create chart name and version as used by the chart label.
|
||||
*/}}
|
||||
{{- define "misskey.chart" -}}
|
||||
{{- printf "%s-%s" .Chart.Name .Chart.Version | replace "+" "_" | trunc 63 | trimSuffix "-" }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Common labels
|
||||
*/}}
|
||||
{{- define "misskey.labels" -}}
|
||||
helm.sh/chart: {{ include "misskey.chart" . }}
|
||||
{{ include "misskey.selectorLabels" . }}
|
||||
{{- if .Chart.AppVersion }}
|
||||
app.kubernetes.io/version: {{ .Chart.AppVersion | quote }}
|
||||
{{- end }}
|
||||
app.kubernetes.io/managed-by: {{ .Release.Service }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Selector labels
|
||||
*/}}
|
||||
{{- define "misskey.selectorLabels" -}}
|
||||
app.kubernetes.io/name: {{ include "misskey.name" . }}
|
||||
app.kubernetes.io/instance: {{ .Release.Name }}
|
||||
{{- end }}
|
||||
|
||||
{{/*
|
||||
Create the name of the service account to use
|
||||
*/}}
|
||||
{{- define "misskey.serviceAccountName" -}}
|
||||
{{- if .Values.serviceAccount.create }}
|
||||
{{- default (include "misskey.fullname" .) .Values.serviceAccount.name }}
|
||||
{{- else }}
|
||||
{{- default "default" .Values.serviceAccount.name }}
|
||||
{{- end }}
|
||||
{{- end }}
|
||||
@@ -1,3 +0,0 @@
|
||||
url: https://example.tld/
|
||||
image: okteto.dev/misskey
|
||||
environment: production
|
||||
@@ -1,7 +0,0 @@
|
||||
import { defineConfig } from 'cypress'
|
||||
|
||||
export default defineConfig({
|
||||
e2e: {
|
||||
baseUrl: 'http://localhost:61812',
|
||||
},
|
||||
})
|
||||
@@ -1,265 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
describe('Before setup instance', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.visitHome();
|
||||
});
|
||||
|
||||
it('setup instance', () => {
|
||||
cy.visitHome();
|
||||
|
||||
cy.intercept('POST', '/api/admin/accounts/create').as('signup');
|
||||
|
||||
cy.get('[data-cy-admin-initial-password] input').type('example_password_please_change_this_or_you_will_get_hacked');
|
||||
cy.get('[data-cy-admin-username] input').type('admin');
|
||||
cy.get('[data-cy-admin-password] input').type('admin1234');
|
||||
cy.get('[data-cy-admin-ok]').click();
|
||||
|
||||
// なぜか動かない
|
||||
//cy.wait('@signup').should('have.property', 'response.statusCode');
|
||||
cy.wait('@signup');
|
||||
|
||||
cy.intercept('POST', '/api/admin/update-meta').as('update-meta');
|
||||
|
||||
cy.get('[data-cy-next]').click();
|
||||
cy.get('[data-cy-server-name] input').type('Testskey');
|
||||
cy.get('[data-cy-server-setup-wizard-apply]').click();
|
||||
|
||||
cy.wait('@update-meta');
|
||||
});
|
||||
});
|
||||
|
||||
describe('After setup instance', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.visitHome();
|
||||
});
|
||||
|
||||
it('signup', () => {
|
||||
cy.visitHome();
|
||||
|
||||
cy.intercept('POST', '/api/signup').as('signup');
|
||||
|
||||
cy.get('[data-cy-signup]').click();
|
||||
cy.get('[data-cy-signup-rules-continue]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
||||
cy.get('[data-cy-signup-rules-continue]').click();
|
||||
|
||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-username] input').type('alice');
|
||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-password] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-invitation-code] input').type('test-invitation-code');
|
||||
cy.get('[data-cy-signup-submit]').should('not.be.disabled');
|
||||
cy.get('[data-cy-signup-submit]').click();
|
||||
|
||||
cy.wait('@signup');
|
||||
});
|
||||
|
||||
it('signup with duplicated username', () => {
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
|
||||
cy.visitHome();
|
||||
|
||||
// ユーザー名が重複している場合の挙動確認
|
||||
cy.get('[data-cy-signup]').click();
|
||||
cy.get('[data-cy-signup-rules-continue]').should('be.disabled');
|
||||
cy.get('[data-cy-signup-rules-notes-agree] [data-cy-switch-toggle]').click();
|
||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||
cy.get('[data-cy-signup-rules-continue]').should('not.be.disabled');
|
||||
cy.get('[data-cy-signup-rules-continue]').click();
|
||||
|
||||
cy.get('[data-cy-signup-username] input').type('alice');
|
||||
cy.get('[data-cy-signup-password] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-password-retype] input').type('alice1234');
|
||||
cy.get('[data-cy-signup-submit]').should('be.disabled');
|
||||
});
|
||||
});
|
||||
|
||||
describe('After user signup', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
cy.visitHome();
|
||||
});
|
||||
|
||||
it('signin', () => {
|
||||
cy.visitHome();
|
||||
|
||||
cy.intercept('POST', '/api/signin-flow').as('signin');
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
|
||||
cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
|
||||
// Enterキーで続行できるかの確認も兼ねる
|
||||
cy.get('[data-cy-signin-username] input').type('alice{enter}');
|
||||
|
||||
cy.get('[data-cy-signin-page-password]').should('be.visible', { timeout: 10000 });
|
||||
// Enterキーで続行できるかの確認も兼ねる
|
||||
cy.get('[data-cy-signin-password] input').type('alice1234{enter}');
|
||||
|
||||
cy.wait('@signin');
|
||||
});
|
||||
|
||||
it('suspend', function() {
|
||||
cy.request('POST', '/api/admin/suspend-user', {
|
||||
i: this.admin.token,
|
||||
userId: this.alice.id,
|
||||
});
|
||||
|
||||
cy.visitHome();
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
|
||||
cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
|
||||
cy.get('[data-cy-signin-username] input').type('alice{enter}');
|
||||
|
||||
// TODO: cypressにブラウザの言語指定できる機能が実装され次第英語のみテストするようにする
|
||||
cy.contains(/アカウントが凍結されています|This account has been suspended due to/gi);
|
||||
});
|
||||
});
|
||||
|
||||
describe('After user signed in', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
|
||||
cy.login('alice', 'alice1234');
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('successfully loads', () => {
|
||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
||||
cy.get('[data-cy-user-setup-continue]', { timeout: 30000 }).should('be.visible');
|
||||
});
|
||||
|
||||
it('account setup wizard', () => {
|
||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
||||
cy.get('[data-cy-user-setup-continue]', { timeout: 30000 }).click();
|
||||
|
||||
cy.get('[data-cy-user-setup-user-name] input').type('ありす');
|
||||
cy.get('[data-cy-user-setup-user-description] textarea').type('ほげ');
|
||||
// TODO: アイコン設定テスト
|
||||
|
||||
cy.get('[data-cy-user-setup-continue]').click();
|
||||
|
||||
// プライバシー設定
|
||||
|
||||
cy.get('[data-cy-user-setup-continue]').click();
|
||||
|
||||
// フォローはスキップ
|
||||
|
||||
cy.get('[data-cy-user-setup-continue]').click();
|
||||
|
||||
// プッシュ通知設定はスキップ
|
||||
|
||||
cy.get('[data-cy-user-setup-continue]').click();
|
||||
|
||||
cy.get('[data-cy-user-setup-continue]').click();
|
||||
});
|
||||
});
|
||||
|
||||
describe('After user setup', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
|
||||
cy.login('alice', 'alice1234');
|
||||
|
||||
// アカウント初期設定ウィザード
|
||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]', { timeout: 30000 }).click();
|
||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('note', () => {
|
||||
cy.get('[data-cy-open-post-form]').should('be.visible');
|
||||
cy.get('[data-cy-open-post-form]').click();
|
||||
cy.get('[data-cy-post-form-text]').type('Hello, Misskey!');
|
||||
cy.get('[data-cy-open-post-form-submit]').click();
|
||||
|
||||
cy.contains('Hello, Misskey!', { timeout: 15000 });
|
||||
});
|
||||
|
||||
it('open note form with hotkey', () => {
|
||||
// Wait until the page loads
|
||||
cy.get('[data-cy-open-post-form]').should('be.visible');
|
||||
// Use trigger() to give different `code` to test if hotkeys also work on non-QWERTY keyboards.
|
||||
cy.document().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "n", code: "KeyL" });
|
||||
// See if the form is opened
|
||||
cy.get('[data-cy-post-form-text]').should('be.visible');
|
||||
// Close it
|
||||
cy.focused().trigger("keydown", { eventConstructor: 'KeyboardEvent', key: "Escape", code: "Escape" });
|
||||
// See if the form is closed
|
||||
cy.get('[data-cy-post-form-text]').should('not.be.visible');
|
||||
});
|
||||
});
|
||||
|
||||
// TODO: 投稿フォームの公開範囲指定のテスト
|
||||
// TODO: 投稿フォームのファイル添付のテスト
|
||||
// TODO: 投稿フォームのハッシュタグ保持フィールドのテスト
|
||||
@@ -1,35 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
describe('Router transition', () => {
|
||||
describe('Redirect', () => {
|
||||
// サーバの初期化。ルートのテストに関しては各describeごとに1度だけ実行で十分だと思う(使いまわした方が早い)
|
||||
before(() => {
|
||||
cy.resetState();
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
|
||||
cy.login('alice', 'alice1234');
|
||||
|
||||
// アカウント初期設定ウィザード
|
||||
// 表示に時間がかかるのでデフォルト秒数だとタイムアウトする
|
||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]', { timeout: 30000 }).click();
|
||||
cy.wait(500);
|
||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||
});
|
||||
|
||||
it('redirect to user profile', () => {
|
||||
// テストのためだけに用意されたリダイレクト用ルートに飛ぶ
|
||||
cy.visit('/redirect-test');
|
||||
|
||||
// プロフィールページのURLであることを確認する
|
||||
cy.url().should('include', '/@alice')
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,76 +0,0 @@
|
||||
/*
|
||||
* SPDX-FileCopyrightText: syuilo and misskey-project
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
/* flaky
|
||||
describe('After user signed in', () => {
|
||||
beforeEach(() => {
|
||||
cy.resetState();
|
||||
cy.viewport('macbook-16');
|
||||
|
||||
// インスタンス初期セットアップ
|
||||
cy.registerUser('admin', 'pass', true);
|
||||
|
||||
// ユーザー作成
|
||||
cy.registerUser('alice', 'alice1234');
|
||||
|
||||
cy.login('alice', 'alice1234');
|
||||
|
||||
// アカウント初期設定ウィザード
|
||||
cy.get('[data-cy-user-setup] [data-cy-modal-window-close]').click();
|
||||
cy.get('[data-cy-modal-dialog-ok]').click();
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
// テスト終了直前にページ遷移するようなテストケース(例えばアカウント作成)だと、たぶんCypressのバグでブラウザの内容が次のテストケースに引き継がれてしまう(例えばアカウントが作成し終わった段階からテストが始まる)。
|
||||
// waitを入れることでそれを防止できる
|
||||
cy.wait(1000);
|
||||
});
|
||||
|
||||
it('widget edit toggle is visible', () => {
|
||||
cy.get('[data-cy-widget-edit]').should('be.visible');
|
||||
});
|
||||
|
||||
it('widget select should be visible in edit mode', () => {
|
||||
cy.get('[data-cy-widget-edit]').click();
|
||||
cy.get('[data-cy-widget-select]').should('be.visible');
|
||||
});
|
||||
|
||||
it('first widget should be removed', () => {
|
||||
cy.get('[data-cy-widget-edit]').click();
|
||||
cy.get('[data-cy-customize-container]:first-child [data-cy-customize-container-remove]._button').click();
|
||||
cy.get('[data-cy-customize-container]').should('have.length', 2);
|
||||
});
|
||||
|
||||
function buildWidgetTest(widgetName) {
|
||||
it(`${widgetName} widget should get added`, () => {
|
||||
cy.get('[data-cy-widget-edit]').click();
|
||||
cy.get('[data-cy-widget-select] select').select(widgetName, { force: true });
|
||||
cy.get('[data-cy-bg]._modalBg[data-cy-transparent]').click({ multiple: true, force: true });
|
||||
cy.get('[data-cy-widget-add]').click({ force: true });
|
||||
cy.get(`[data-cy-mkw-${widgetName}]`).should('exist');
|
||||
});
|
||||
}
|
||||
|
||||
buildWidgetTest('memo');
|
||||
buildWidgetTest('notifications');
|
||||
buildWidgetTest('timeline');
|
||||
buildWidgetTest('calendar');
|
||||
buildWidgetTest('rss');
|
||||
buildWidgetTest('trends');
|
||||
buildWidgetTest('clock');
|
||||
buildWidgetTest('activity');
|
||||
buildWidgetTest('photos');
|
||||
buildWidgetTest('digitalClock');
|
||||
buildWidgetTest('federation');
|
||||
buildWidgetTest('postForm');
|
||||
buildWidgetTest('slideshow');
|
||||
buildWidgetTest('serverMetric');
|
||||
buildWidgetTest('onlineUsers');
|
||||
buildWidgetTest('jobQueue');
|
||||
buildWidgetTest('button');
|
||||
buildWidgetTest('aiscript');
|
||||
buildWidgetTest('aichan');
|
||||
});
|
||||
*/
|
||||
@@ -1,5 +0,0 @@
|
||||
{
|
||||
"name": "Using fixtures to represent data",
|
||||
"email": "hello@cypress.io",
|
||||
"body": "Fixtures are a great way to mock data for responses to routes"
|
||||
}
|
||||
@@ -1,67 +0,0 @@
|
||||
// ***********************************************
|
||||
// This example commands.js shows you how to
|
||||
// create various custom commands and overwrite
|
||||
// existing commands.
|
||||
//
|
||||
// For more comprehensive examples of custom
|
||||
// commands please read more here:
|
||||
// https://on.cypress.io/custom-commands
|
||||
// ***********************************************
|
||||
//
|
||||
//
|
||||
// -- This is a parent command --
|
||||
// Cypress.Commands.add('login', (email, password) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a child command --
|
||||
// Cypress.Commands.add('drag', { prevSubject: 'element'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This is a dual command --
|
||||
// Cypress.Commands.add('dismiss', { prevSubject: 'optional'}, (subject, options) => { ... })
|
||||
//
|
||||
//
|
||||
// -- This will overwrite an existing command --
|
||||
// Cypress.Commands.overwrite('visit', (originalFn, url, options) => { ... })
|
||||
|
||||
Cypress.Commands.add('visitHome', () => {
|
||||
cy.visit('/');
|
||||
cy.get('button', { timeout: 30000 }).should('be.visible');
|
||||
})
|
||||
|
||||
Cypress.Commands.add('resetState', () => {
|
||||
// iframe.contentWindow.indexedDB.deleteDatabase() がchromeのバグで使用できないため、indexedDBを無効化している。
|
||||
// see https://github.com/misskey-dev/misskey/issues/13605#issuecomment-2053652123
|
||||
/*
|
||||
cy.window().then(win => {
|
||||
win.indexedDB.deleteDatabase('keyval-store');
|
||||
});
|
||||
*/
|
||||
cy.request('POST', '/api/reset-db', {}).as('reset');
|
||||
cy.get('@reset').its('status').should('equal', 204);
|
||||
cy.reload(true);
|
||||
});
|
||||
|
||||
Cypress.Commands.add('registerUser', (username, password, isAdmin = false) => {
|
||||
const route = isAdmin ? '/api/admin/accounts/create' : '/api/signup';
|
||||
|
||||
cy.request('POST', route, {
|
||||
username: username,
|
||||
password: password,
|
||||
...(isAdmin ? { setupPassword: 'example_password_please_change_this_or_you_will_get_hacked' } : {}),
|
||||
}).its('body').as(username);
|
||||
});
|
||||
|
||||
Cypress.Commands.add('login', (username, password) => {
|
||||
cy.visitHome();
|
||||
|
||||
cy.intercept('POST', '/api/signin-flow').as('signin');
|
||||
|
||||
cy.get('[data-cy-signin]').click();
|
||||
cy.get('[data-cy-signin-page-input]').should('be.visible', { timeout: 1000 });
|
||||
cy.get('[data-cy-signin-username] input').type(`${username}{enter}`);
|
||||
cy.get('[data-cy-signin-page-password]').should('be.visible', { timeout: 10000 });
|
||||
cy.get('[data-cy-signin-password] input').type(`${password}{enter}`);
|
||||
|
||||
cy.wait('@signin').as('signedIn');
|
||||
});
|
||||
@@ -1,34 +0,0 @@
|
||||
// ***********************************************************
|
||||
// This example support/index.js is processed and
|
||||
// loaded automatically before your test files.
|
||||
//
|
||||
// This is a great place to put global configuration and
|
||||
// behavior that modifies Cypress.
|
||||
//
|
||||
// You can change the location of this file or turn off
|
||||
// automatically serving support files with the
|
||||
// 'supportFile' configuration option.
|
||||
//
|
||||
// You can read more here:
|
||||
// https://on.cypress.io/configuration
|
||||
// ***********************************************************
|
||||
|
||||
// Import commands.js using ES2015 syntax:
|
||||
import './commands'
|
||||
|
||||
// Alternatively you can use CommonJS syntax:
|
||||
// require('./commands')
|
||||
|
||||
Cypress.on('uncaught:exception', (err, runnable) => {
|
||||
if ([
|
||||
'The source image cannot be decoded',
|
||||
|
||||
// Chrome
|
||||
'ResizeObserver loop limit exceeded',
|
||||
|
||||
// Firefox
|
||||
'ResizeObserver loop completed with undelivered notifications',
|
||||
].some(msg => err.message.includes(msg))) {
|
||||
return false;
|
||||
}
|
||||
});
|
||||
@@ -1,19 +0,0 @@
|
||||
declare global {
|
||||
namespace Cypress {
|
||||
interface Chainable {
|
||||
login(username: string, password: string): Chainable<void>;
|
||||
|
||||
registerUser(
|
||||
username: string,
|
||||
password: string,
|
||||
isAdmin?: boolean
|
||||
): Chainable<void>;
|
||||
|
||||
resetState(): Chainable<void>;
|
||||
|
||||
visitHome(): Chainable<void>;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export {}
|
||||
@@ -1,8 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"lib": ["dom"],
|
||||
"target": "esnext",
|
||||
"types": ["cypress", "node"]
|
||||
},
|
||||
"include": ["./**/*.ts"]
|
||||
}
|
||||
@@ -1012,6 +1012,7 @@ inMinutes: "د"
|
||||
inDays: "ي"
|
||||
widgets: "التطبيقات المُصغّرة"
|
||||
presets: "إعدادات مسبقة"
|
||||
previewingThemeRestore: "استرجاع"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "اسم الملف"
|
||||
|
||||
+15
-3
@@ -753,6 +753,8 @@ optional: "Opcional"
|
||||
createNewClip: "Crear un nou Retall"
|
||||
unclip: "Treure Retall"
|
||||
confirmToUnclipAlreadyClippedNote: "Aquesta nota ja és inclosa al Retall \"{name}\". Vols treure-la d'aquest retall?"
|
||||
removeFromAntenna: "Elimina d'aquesta Antena"
|
||||
removeNoteFromAntennaConfirm: "Vols eliminar aquesta nota de '{name}'?"
|
||||
public: "Públic "
|
||||
private: "Privat"
|
||||
i18nInfo: "Misskey està sent traduït a diferents idiomes per voluntaris. Pots ajudar aquí {link}."
|
||||
@@ -1217,6 +1219,7 @@ keepScreenOn: "Mantenir la pantalla encesa"
|
||||
verifiedLink: "La propietat de l'enllaç ha sigut verificada"
|
||||
notifyNotes: "Notificar quan hi hagi notes noves"
|
||||
unnotifyNotes: "Deixar de notificar quan hi hagi notes noves"
|
||||
notifyUsers: "Usuaris que han activat les notificacions de publicacions"
|
||||
authentication: "Autenticació "
|
||||
authenticationRequiredToContinue: "Si us plau autentificat per continuar"
|
||||
dateAndTime: "Data i hora"
|
||||
@@ -1358,14 +1361,11 @@ information: "Informació"
|
||||
chat: "Xat"
|
||||
directMessage: "Xateja amb aquest usuari"
|
||||
directMessage_short: "Missatge"
|
||||
migrateOldSettings: "Migrar la configuració anterior"
|
||||
migrateOldSettings_description: "Normalment això es fa automàticament, però si la transició no es fa, el procés es pot iniciar manualment. S'esborrarà la configuració actual."
|
||||
compress: "Comprimir "
|
||||
right: "Dreta"
|
||||
bottom: "A baix "
|
||||
top: "A dalt "
|
||||
embed: "Incrustar"
|
||||
settingsMigrating: "Estem migrant la teva configuració. Si us plau espera un moment... (També pots fer la migració més tard, manualment, anant a Preferències → Altres → Migrar configuració antiga)"
|
||||
readonly: "Només lectura"
|
||||
goToDeck: "Tornar al tauler"
|
||||
federationJobs: "Treballs de federació"
|
||||
@@ -1409,6 +1409,14 @@ presets: "Predefinit"
|
||||
zeroPadding: "Sense omplir"
|
||||
nothingToConfigure: "No hi ha res a configurar"
|
||||
viewRenotedChannel: "Mirar el canal d'impulsos "
|
||||
previewingTheme: "Previsualització del tema"
|
||||
previewingThemeRestore: "Restaurar"
|
||||
accessToken: "Token d'accés"
|
||||
chooseEmojiPalette: "Selecciona el calaix d'emojis"
|
||||
addToEmojiPalette: "Afegeix al calaix d'emojis"
|
||||
emojiPaletteAlreadyAddedConfirm: "Aquest emoji ja està inclòs en aquest calaix d'emojis. Vols afegir-lo de nou?"
|
||||
append: "Afegeix al final"
|
||||
prepend: "Afegeix al principi"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Títol de l'arxiu"
|
||||
@@ -2082,6 +2090,7 @@ _role:
|
||||
driveCapacity: "Capacitat del disc"
|
||||
maxFileSize: "Mida màxima de l'arxiu que es pot carregar"
|
||||
maxFileSize_caption: "Pot haver-hi la possibilitat que existeixin altres opcions de configuració de l'etapa anterior, com podria ser el proxy invers i la CDN."
|
||||
maxFileSize_caption2: "La configuració de la mida màxima de fitxer per a tot el servidor és {max}. Per permetre la pujada de fitxers més grans, si us plau, canvieu aquesta opció al fitxer de configuració de Misskey."
|
||||
alwaysMarkNsfw: "Marca sempre els fitxers com a sensibles"
|
||||
canUpdateBioMedia: "Permet l'edició d'una icona o un bàner"
|
||||
pinMax: "Nombre màxim de notes fixades"
|
||||
@@ -2098,6 +2107,7 @@ _role:
|
||||
canSearchNotes: "Pot cercar notes"
|
||||
canSearchUsers: "Pot cercar usuaris"
|
||||
canUseTranslator: "Pot fer servir el traductor"
|
||||
canCreateChannel: "Previsualitzant el tema"
|
||||
avatarDecorationLimit: "Nombre màxim de decoracions que es poden aplicar els avatars"
|
||||
canImportAntennas: "Autoritza la importació d'antenes "
|
||||
canImportBlocking: "Autoritza la importació de bloquejats"
|
||||
@@ -3249,6 +3259,8 @@ _search:
|
||||
pleaseEnterServerHost: "Introdueix l'adreça de la instància "
|
||||
pleaseSelectUser: "Selecciona un usuari"
|
||||
serverHostPlaceholder: "Ex: misskey.example.com"
|
||||
postFrom: "Publicat el"
|
||||
postTo: "Publicat el"
|
||||
_serverSetupWizard:
|
||||
installCompleted: "La instal·lació de Misskey ha finalitzat!"
|
||||
firstCreateAccount: "Primer crea un compte d'administrador."
|
||||
|
||||
@@ -1134,6 +1134,7 @@ inMinutes: "Minut"
|
||||
inDays: "Dnů"
|
||||
widgets: "Widgety"
|
||||
presets: "Předvolba"
|
||||
previewingThemeRestore: "Obnovit"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Název souboru"
|
||||
|
||||
+1
-3
@@ -1358,14 +1358,11 @@ information: "Über"
|
||||
chat: "Chat"
|
||||
directMessage: "Mit dem Benutzer chatten"
|
||||
directMessage_short: "Nachrichten"
|
||||
migrateOldSettings: "Alte Client-Einstellungen migrieren"
|
||||
migrateOldSettings_description: "Dies sollte normalerweise automatisch geschehen, aber wenn die Migration aus irgendeinem Grund nicht erfolgreich war, kannst du den Migrationsprozess selbst manuell auslösen. Die aktuellen Konfigurationsinformationen werden dabei überschrieben."
|
||||
compress: "Komprimieren"
|
||||
right: "Rechts"
|
||||
bottom: "Unten"
|
||||
top: "Oben"
|
||||
embed: "Einbetten"
|
||||
settingsMigrating: "Deine Einstellungen werden gerade migriert. Bitte warte einen Moment... (Du kannst die Einstellungen später auch manuell migrieren, indem du zu Einstellungen → Anderes → Alte Einstellungen migrieren gehst)"
|
||||
readonly: "Nur Lesezugriff"
|
||||
goToDeck: "Zurück zum Deck"
|
||||
federationJobs: "Föderation Jobs"
|
||||
@@ -1408,6 +1405,7 @@ frame: "Rahmen"
|
||||
presets: "Vorlage"
|
||||
zeroPadding: "Nullauffüllung"
|
||||
nothingToConfigure: "Es sind keine Einstellungen verfügbar"
|
||||
previewingThemeRestore: "Wiederherstellen"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Dateibeschriftung"
|
||||
|
||||
+15
-3
@@ -753,6 +753,8 @@ optional: "Optional"
|
||||
createNewClip: "Create new clip"
|
||||
unclip: "Unclip"
|
||||
confirmToUnclipAlreadyClippedNote: "This note is already part of the \"{name}\" clip. Do you want to remove it from this clip instead?"
|
||||
removeFromAntenna: "Remove from this antenna"
|
||||
removeNoteFromAntennaConfirm: "Are you sure you want to remove this note from {name}?"
|
||||
public: "Public"
|
||||
private: "Private"
|
||||
i18nInfo: "Misskey is being translated into various languages by volunteers. You can help at {link}."
|
||||
@@ -1217,6 +1219,7 @@ keepScreenOn: "Keep screen on"
|
||||
verifiedLink: "Link ownership has been verified"
|
||||
notifyNotes: "Notify about new notes"
|
||||
unnotifyNotes: "Stop notifying about new notes"
|
||||
notifyUsers: "Users with post notifications enabled"
|
||||
authentication: "Authentication"
|
||||
authenticationRequiredToContinue: "Please authenticate to continue"
|
||||
dateAndTime: "Timestamp"
|
||||
@@ -1358,14 +1361,11 @@ information: "About"
|
||||
chat: "Chat"
|
||||
directMessage: "Chat with user"
|
||||
directMessage_short: "Message"
|
||||
migrateOldSettings: "Migrate old client settings"
|
||||
migrateOldSettings_description: "This should be done automatically but if for some reason the migration was not successful, you can trigger the migration process yourself manually. The current configuration information will be overwritten."
|
||||
compress: "Compress"
|
||||
right: "Right"
|
||||
bottom: "Bottom"
|
||||
top: "Top"
|
||||
embed: "Embed"
|
||||
settingsMigrating: "Settings are being migrated, please wait a moment... (You can also migrate manually later by going to Settings→Others→Migrate old settings)"
|
||||
readonly: "Read only"
|
||||
goToDeck: "Return to Deck"
|
||||
federationJobs: "Federation Jobs"
|
||||
@@ -1409,6 +1409,14 @@ presets: "Preset"
|
||||
zeroPadding: "Zero padding"
|
||||
nothingToConfigure: "No configurable options available"
|
||||
viewRenotedChannel: "Show renoted channel"
|
||||
previewingTheme: "Previewing theme"
|
||||
previewingThemeRestore: "Restore"
|
||||
accessToken: "Access Token"
|
||||
chooseEmojiPalette: "Choose emoji palette"
|
||||
addToEmojiPalette: "Add to emoji palette"
|
||||
emojiPaletteAlreadyAddedConfirm: "This emoji is already included in this emoji palette. Do you want to add it again?"
|
||||
append: "Append to end"
|
||||
prepend: "Append to beginning"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "File caption"
|
||||
@@ -2082,6 +2090,7 @@ _role:
|
||||
driveCapacity: "Drive capacity"
|
||||
maxFileSize: "Upload-able max file size"
|
||||
maxFileSize_caption: "Reverse proxies, CDNs, and other front-end components may have their own configuration settings."
|
||||
maxFileSize_caption2: "The maximum file size setting for the entire server is {max}. To allow uploading files larger than this, please adjust this setting in the Misskey configuration file."
|
||||
alwaysMarkNsfw: "Always mark files as NSFW"
|
||||
canUpdateBioMedia: "Can edit an icon or a banner image"
|
||||
pinMax: "Maximum number of pinned notes"
|
||||
@@ -2098,6 +2107,7 @@ _role:
|
||||
canSearchNotes: "Usage of note search"
|
||||
canSearchUsers: "User search"
|
||||
canUseTranslator: "Translator usage"
|
||||
canCreateChannel: "Allow creating channels"
|
||||
avatarDecorationLimit: "Maximum number of avatar decorations"
|
||||
canImportAntennas: "Can import antennas"
|
||||
canImportBlocking: "Can import blocking"
|
||||
@@ -3249,6 +3259,8 @@ _search:
|
||||
pleaseEnterServerHost: "Enter the server host"
|
||||
pleaseSelectUser: "Select user"
|
||||
serverHostPlaceholder: "Example: misskey.example.com"
|
||||
postFrom: "Date posted from"
|
||||
postTo: "Date posted to"
|
||||
_serverSetupWizard:
|
||||
installCompleted: "Misskey installation is now complete!"
|
||||
firstCreateAccount: "To begin, create an administrator account."
|
||||
|
||||
+21
-9
@@ -580,11 +580,11 @@ 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: "Visualizar la ventana de publicación en la parte superior de la línea de tiempo."
|
||||
showFixedPostForm: "Mostrar formulario de publicación sobre la línea de tiempo."
|
||||
showFixedPostFormInChannel: "Mostrar el formulario de publicación por encima de la cronología (Canales)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Incluir por defecto respuestas de usuarios recién seguidos en la línea de tiempo"
|
||||
newNoteRecived: "Tienes una nota nueva"
|
||||
newNote: "Nueva nota"
|
||||
newNote: "Nuevas notas"
|
||||
sounds: "Sonidos"
|
||||
sound: "Sonidos"
|
||||
notificationSoundSettings: "Configuración del sonido de las notificaciones"
|
||||
@@ -753,6 +753,8 @@ optional: "Opcional"
|
||||
createNewClip: "Crear clip nuevo"
|
||||
unclip: "Quitar clip"
|
||||
confirmToUnclipAlreadyClippedNote: "Esta nota ya está incluida en el clip \"{name}\". ¿Quiere quitar la nota del clip?"
|
||||
removeFromAntenna: "Quitar de esta antena."
|
||||
removeNoteFromAntennaConfirm: "¿Quieres eliminar esta nota de '{name}'?"
|
||||
public: "Público"
|
||||
private: "Privado"
|
||||
i18nInfo: "Misskey está siendo traducido a varios idiomas gracias a voluntarios. Se puede colaborar traduciendo en {link}"
|
||||
@@ -987,7 +989,7 @@ requireAdminForView: "Necesitas iniciar sesión como administrador para ver esto
|
||||
isSystemAccount: "Cuenta creada y operada automáticamente por el sistema"
|
||||
typeToConfirm: "Ingrese {x} para confirmar"
|
||||
deleteAccount: "Borrar cuenta"
|
||||
document: "Documento"
|
||||
document: "Guía de usuario"
|
||||
numberOfPageCache: "Cantidad de páginas cacheadas"
|
||||
numberOfPageCacheDescription: "Al aumentar el número mejora la conveniencia pero también puede aumentar la carga y la memoria a usarse"
|
||||
logoutConfirm: "¿Cerrar sesión?"
|
||||
@@ -1217,6 +1219,7 @@ keepScreenOn: "Mantener pantalla encendida"
|
||||
verifiedLink: "Propiedad del enlace verificada"
|
||||
notifyNotes: "Notificar nuevas notas"
|
||||
unnotifyNotes: "Dejar de notificar nuevas notas"
|
||||
notifyUsers: "Cuentas con notificaciones activadas"
|
||||
authentication: "Autenticación"
|
||||
authenticationRequiredToContinue: "Por favor, autentifícate para continuar"
|
||||
dateAndTime: "Fecha y hora"
|
||||
@@ -1238,7 +1241,7 @@ sourceCodeIsNotYetProvided: "El código fuente aún no está disponible. Contact
|
||||
repositoryUrl: "URL del repositorio"
|
||||
repositoryUrlDescription: "Si estás usando Misskey tal cual (sin cambios en el código fuente), entra en https://github.com/misskey-dev/misskey"
|
||||
repositoryUrlOrTarballRequired: "Si no has publicado un repositorio aún, deberás publicar un tarball en su lugar. Mira el archivo .config/example.yml para más información."
|
||||
feedback: "Comentarios"
|
||||
feedback: "Enviar sugerencias (Feedback)"
|
||||
feedbackUrl: "URL de comentarios"
|
||||
impressum: "Impressum"
|
||||
impressumUrl: "Impressum URL"
|
||||
@@ -1358,14 +1361,11 @@ information: "Información"
|
||||
chat: "Chat"
|
||||
directMessage: "Chatear"
|
||||
directMessage_short: "Mensajes"
|
||||
migrateOldSettings: "Migrar la configuración anterior"
|
||||
migrateOldSettings_description: "Esto debería hacerse automáticamente, pero si por alguna razón la migración no ha tenido éxito, puede activar usted mismo el proceso de migración manualmente. Se sobrescribirá la información de configuración actual."
|
||||
compress: "Compresión de la imagen"
|
||||
right: "Derecha"
|
||||
bottom: "Abajo"
|
||||
top: "Arriba"
|
||||
embed: "Insertar"
|
||||
settingsMigrating: "La configuración está siendo migrada, por favor espera un momento... (También puedes migrar manualmente más tarde yendo a Ajustes otros migrar configuración antigua"
|
||||
readonly: "Solo Lectura"
|
||||
goToDeck: "Volver al Deck"
|
||||
federationJobs: "Trabajos de Federación"
|
||||
@@ -1409,6 +1409,14 @@ presets: "Predefinido"
|
||||
zeroPadding: "Relleno cero"
|
||||
nothingToConfigure: "No hay nada que configurar"
|
||||
viewRenotedChannel: "Ver el canal al que te has suscrito"
|
||||
previewingTheme: "Vista previa del tema"
|
||||
previewingThemeRestore: "Regresar"
|
||||
accessToken: "Token de acceso"
|
||||
chooseEmojiPalette: "Seleccionar la paleta de emojis"
|
||||
addToEmojiPalette: "Añadir a la paleta de emojis"
|
||||
emojiPaletteAlreadyAddedConfirm: "Este emoji ya está incluido en esta paleta de emojis. ¿Quieres volver a añadirlo?"
|
||||
append: "Añadir al final"
|
||||
prepend: "Añadir al principio"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Título del archivo"
|
||||
@@ -2082,6 +2090,7 @@ _role:
|
||||
driveCapacity: "Capacidad del drive"
|
||||
maxFileSize: "Tamaño máximo de archivo que se puede cargar."
|
||||
maxFileSize_caption: "Los proxies inversos o las CDN pueden tener diferentes valores de configuración aguas arriba."
|
||||
maxFileSize_caption2: "El tamaño máximo de archivo para todo el servidor está fijado en {max}. Para poder subir archivos de mayor tamaño, modifica este valor en el archivo de configuración de Misskey."
|
||||
alwaysMarkNsfw: "Siempre marcar archivos como NSFW"
|
||||
canUpdateBioMedia: "Puede editar un icono o una imagen de fondo (banner)"
|
||||
pinMax: "Máximo de notas fijadas"
|
||||
@@ -2098,6 +2107,7 @@ _role:
|
||||
canSearchNotes: "Uso de la búsqueda de notas"
|
||||
canSearchUsers: "Uso de la búsqueda de usuarios"
|
||||
canUseTranslator: "Uso de traductor"
|
||||
canCreateChannel: "Puede crear canales"
|
||||
avatarDecorationLimit: "Número máximo de decoraciones de avatar"
|
||||
canImportAntennas: "Permitir la importación de antenas"
|
||||
canImportBlocking: "Permitir la importación de bloqueos"
|
||||
@@ -2215,7 +2225,7 @@ _registry:
|
||||
domain: "Dominio"
|
||||
createKey: "Crear una clave"
|
||||
_aboutMisskey:
|
||||
about: "Misskey es un software de código abierto, desarrollado por syuilo desde el 2014"
|
||||
about: "Misskey es un software de código abierto, desarrollado por syuilo desde 2014"
|
||||
contributors: "Principales colaboradores"
|
||||
allContributors: "Todos los colaboradores"
|
||||
source: "Código fuente"
|
||||
@@ -2644,7 +2654,7 @@ _postForm:
|
||||
submit_title: "Botón de publicar"
|
||||
submit_description: "Publica tus notas pulsando este botón. También puedes publicar utilizando Ctrl + Intro / Cmd + Intro."
|
||||
_placeholders:
|
||||
a: "¿Qué haces?"
|
||||
a: "¿Qué está pasando?"
|
||||
b: "¿Te pasó algo?"
|
||||
c: "¿Qué estás pensando?"
|
||||
d: "¿Algo que quieras decir?"
|
||||
@@ -3249,6 +3259,8 @@ _search:
|
||||
pleaseEnterServerHost: "Introduce la dirección del servidor/Instancia"
|
||||
pleaseSelectUser: "Selecciona un usuario, por favor"
|
||||
serverHostPlaceholder: "Ejemplo: misskey.example.com"
|
||||
postFrom: "Publicado desde"
|
||||
postTo: "Publicado el"
|
||||
_serverSetupWizard:
|
||||
installCompleted: "¡La instalación de Misskey se ha completado!"
|
||||
firstCreateAccount: "Para comenzar, crea una cuenta de administrador"
|
||||
|
||||
@@ -1285,6 +1285,7 @@ inMinutes: "min"
|
||||
inDays: "j"
|
||||
widgets: "Widgets"
|
||||
presets: "Préréglage"
|
||||
previewingThemeRestore: "Restaurer"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Nom du fichier"
|
||||
|
||||
+145
-23
@@ -11,7 +11,7 @@ username: "Nama Pengguna"
|
||||
password: "Kata sandi"
|
||||
initialPasswordForSetup: "Kata sandi untuk memulai konfigurasi awal"
|
||||
initialPasswordIsIncorrect: "Kata sandi untuk memulai konfigurasi awal salah."
|
||||
initialPasswordForSetupDescription: "Jika Anda menginstal Misskey sendiri, gunakan kata sandi yang Anda masukkan di berkas konfigurasi.\nJika Anda menggunakan layanan hosting Misskey, gunakan kata sandi yang diberikan.\nJika Anda belum mengatur kata sandi, biarkan kosong dan lanjutkan."
|
||||
initialPasswordForSetupDescription: "Jika Anda memasang Misskey sendiri, gunakan kata sandi yang Anda masukkan di berkas konfigurasi.\nJika Anda menggunakan layanan hosting Misskey, gunakan kata sandi yang diberikan.\nJika Anda belum mengatur kata sandi, biarkan kosong dan lanjutkan."
|
||||
forgotPassword: "Lupa Kata Sandi"
|
||||
fetchingAsApObject: "Mengambil data dari Fediverse..."
|
||||
ok: "OK"
|
||||
@@ -19,7 +19,7 @@ gotIt: "Saya mengerti"
|
||||
cancel: "Batalkan"
|
||||
noThankYou: "Tidak sekarang."
|
||||
enterUsername: "Masukkan nama pengguna"
|
||||
renotedBy: "direnote oleh {user}"
|
||||
renotedBy: "Direnote oleh {user}"
|
||||
noNotes: "Tidak ada catatan"
|
||||
noNotifications: "Tidak ada notifikasi"
|
||||
instance: "Instansi"
|
||||
@@ -53,7 +53,7 @@ copyRemoteLink: "Salin tautan jarak jauh"
|
||||
copyLinkRenote: "Salin tautan renote"
|
||||
delete: "Hapus"
|
||||
deleteAndEdit: "Hapus dan sunting"
|
||||
deleteAndEditConfirm: "Apakah kamu yakin ingin menghapus note ini dan menyuntingnya? Kamu akan kehilangan semua reaksi, renote dan balasan di note ini."
|
||||
deleteAndEditConfirm: "Apakah anda yakin ingin menghapus dan menyunting ulang note ini? Anda akan kehilangan semua reaksi, renote, dan balasan di note ini."
|
||||
addToList: "Tambahkan ke daftar"
|
||||
addToAntenna: "Tambahkan ke Antena"
|
||||
sendMessage: "Kirim pesan"
|
||||
@@ -83,6 +83,8 @@ files: "Berkas"
|
||||
download: "Unduh"
|
||||
driveFileDeleteConfirm: "Hapus {name}? Catatan dengan berkas terkait juga akan terhapus."
|
||||
unfollowConfirm: "Berhenti mengikuti {name}?"
|
||||
cancelFollowRequestConfirm: "Apa anda yakin ingin membatalkan permintaan mengikuti ke {name}?"
|
||||
rejectFollowRequestConfirm: "Apa anda yakin ingin menolak permintaan mengikuti dari {name}?"
|
||||
exportRequested: "Kamu telah meminta ekspor. Ini akan memakan waktu sesaat. Setelah ekspor selesai, berkas yang dihasilkan akan ditambahkan ke Drive"
|
||||
importRequested: "Kamu telah meminta impor. Ini akan memakan waktu sesaat."
|
||||
lists: "Daftar"
|
||||
@@ -114,7 +116,7 @@ enterEmoji: "Masukkan emoji"
|
||||
renote: "Renote"
|
||||
unrenote: "Hapus renote"
|
||||
renoted: "Telah direnote"
|
||||
renotedToX: "{name} telah merenote"
|
||||
renotedToX: "{name} telah merenote."
|
||||
cantRenote: "Postingan ini tidak dapat direnote"
|
||||
cantReRenote: "Renote tidak dapat direnote"
|
||||
quote: "Kutip"
|
||||
@@ -130,16 +132,16 @@ sensitive: "Konten sensitif"
|
||||
add: "Tambahkan"
|
||||
reaction: "Reaksi"
|
||||
reactions: "Reaksi"
|
||||
emojiPicker: "Emoji Picker"
|
||||
pinnedEmojisForReactionSettingDescription: "Atur sematan emoji pada reaksi"
|
||||
pinnedEmojisSettingDescription: "Atur sematan emoji pada masukan emoji"
|
||||
emojiPickerDisplay: "Tampilan Emoji Picker"
|
||||
emojiPicker: "Palet emoji"
|
||||
pinnedEmojisForReactionSettingDescription: "Atur emoji yang akan disematkan dan ditampilkan saat memberi reaksi."
|
||||
pinnedEmojisSettingDescription: "Atur emoji yang akan disematkan dan ditampilkan saat melihat palet emoji"
|
||||
emojiPickerDisplay: "Tampilan palet emoji"
|
||||
overwriteFromPinnedEmojisForReaction: "Timpa dari pengaturan reaksi"
|
||||
overwriteFromPinnedEmojis: "Timpa dari pengaturan umum"
|
||||
reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
||||
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
||||
attachCancel: "Hapus lampiran"
|
||||
deleteFile: "Berkas dihapus"
|
||||
deleteFile: "Hapus berkas"
|
||||
markAsSensitive: "Tandai sebagai konten sensitif"
|
||||
unmarkAsSensitive: "Hapus tanda konten sensitif"
|
||||
enterFileName: "Masukkan nama berkas"
|
||||
@@ -160,7 +162,7 @@ editList: "Sunting daftar"
|
||||
selectChannel: "Pilih kanal"
|
||||
selectAntenna: "Pilih Antena"
|
||||
editAntenna: "Sunting antena"
|
||||
createAntenna: "Membuat antena."
|
||||
createAntenna: "Membuat antena"
|
||||
selectWidget: "Pilih gawit"
|
||||
editWidgets: "Sunting gawit"
|
||||
editWidgetsExit: "Selesai"
|
||||
@@ -172,7 +174,7 @@ emojiUrl: "URL Emoji"
|
||||
addEmoji: "Tambahkan emoji"
|
||||
settingGuide: "Pengaturan rekomendasi"
|
||||
cacheRemoteFiles: "Tembolokkan berkas dari instansi luar"
|
||||
cacheRemoteFilesDescription: "Ketika pengaturan ini dinonaktifkan, berkas dari instansi luar akan dimuat langsung. Menonaktifkan ini akan mengurangi penggunaan penyimpanan peladen, namun dapat menyebabkan peningkatan lalu lintas bandwidth, karena keluku tidak dihasilkan."
|
||||
cacheRemoteFilesDescription: "Ketika pengaturan ini dinonaktifkan, berkas dari peladen luar akan dimuat secara langsung. Menonaktifkan ini akan mengurangi penggunaan penyimpanan peladen, namun dapat menyebabkan peningkatan lalu lintas bandwidth, karena keluku tidak dihasilkan."
|
||||
youCanCleanRemoteFilesCache: "Kamu dapat mengosongkan tembolok dengan mengeklik tombol 🗑️ pada layar manajemen berkas."
|
||||
cacheRemoteSensitiveFiles: "Tembolokkan berkas dari instansi luar"
|
||||
cacheRemoteSensitiveFilesDescription: "Menonaktifkan pengaturan ini menyebabkan berkas sensitif dari instansi luar ditautkan secara langsung, bukan ditembolok."
|
||||
@@ -182,7 +184,7 @@ flagAsCat: "Atur akun ini sebagai kucing"
|
||||
flagAsCatDescription: "Nyalakan tanda ini untuk menandai akun ini sebagai kucing."
|
||||
flagShowTimelineReplies: "Tampilkan balasan di lini masa"
|
||||
flagShowTimelineRepliesDescription: "Menampilkan balasan pengguna dari catatan pengguna lain di lini masa apabila dinyalakan."
|
||||
autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang kamu ikuti"
|
||||
autoAcceptFollowed: "Setujui otomatis permintaan mengikuti dari pengguna yang anda ikuti"
|
||||
addAccount: "Tambahkan akun"
|
||||
reloadAccountsList: "Muat ulang daftar akun"
|
||||
loginFailed: "Gagal untuk masuk"
|
||||
@@ -217,7 +219,7 @@ perDay: "per Hari"
|
||||
stopActivityDelivery: "Berhenti mengirim aktivitas"
|
||||
blockThisInstance: "Blokir instansi ini"
|
||||
silenceThisInstance: "Senyapkan instansi ini"
|
||||
mediaSilenceThisInstance: "Server media senyap"
|
||||
mediaSilenceThisInstance: "Senyapkan media dari peladen ini"
|
||||
operations: "Tindakan"
|
||||
software: "Perangkat lunak"
|
||||
softwareName: "Nama Perangkat Lunak"
|
||||
@@ -239,10 +241,11 @@ clearCachedFilesConfirm: "Apakah kamu yakin ingin menghapus seluruh tembolok ber
|
||||
blockedInstances: "Instansi terblokir"
|
||||
blockedInstancesDescription: "Daftar nama host dari instansi yang diperlukan untuk diblokir. Instansi yang didaftarkan tidak akan dapat berkomunikasi dengan instansi ini."
|
||||
silencedInstances: "Instansi yang disenyapkan"
|
||||
silencedInstancesDescription: "Daftar nama host dari instansi yang ingin kamu senyapkan. Semua akun dari instansi yang terdaftar akan diperlakukan sebagai disenyapkan. Hal ini membuat akun hanya dapat membuat permintaan mengikuti, dan tidak dapat menyebutkan akun lokal apabila tidak mengikuti. Hal ini tidak akan mempengaruhi instansi yang diblokir."
|
||||
mediaSilencedInstances: "Server dengan media dibisukan"
|
||||
mediaSilencedInstancesDescription: "Masukkan host server yang medianya ingin Anda bisukan, pisahkan dengan baris baru. Semua berkas dari akun di server ini akan dianggap sebagai sensitif dan emoji kustom tidak akan tersedia. Ini tidak akan membengaruhi server yang diblokir."
|
||||
federationAllowedHosts: "Server yang membolehkan federasi"
|
||||
silencedInstancesDescription: "Daftar nama host dari peladen yang ingin anda senyapkan, dipisah dengan baris baru. Semua akun yang terdaftar di dalam peladen yang disebut akan dianggap disenyapkan, hanya dapat membuat permintaan mengikuti, dan didak dapat menyebut akun lokal jika tidak diikuti. Ini tidak akan mempengaruhi peladen terblokir."
|
||||
mediaSilencedInstances: "Peladen dengan media yang disenyapkan"
|
||||
mediaSilencedInstancesDescription: "Masukkan nama host dari peladen yang ingin medianya dibisukan, dipisah dengan baris baru. Semua akun yang terdaftar di dalam peladen yang disebut akan dianggap sebagai akun sensitif, dan tidak dapat menggunakan emoji kustom. Ini tidak akan mempengaruhi peladen terblokir."
|
||||
federationAllowedHosts: "Peladen yang membolehkan federasi"
|
||||
federationAllowedHostsDescription: "Cantumkan nama domain (hostname) peladen yang ingin anda perbolehkan untuk terdesentralisasi, dipisah dengan jeda baris."
|
||||
muteAndBlock: "Bisukan / Blokir"
|
||||
mutedUsers: "Pengguna yang dibisukan"
|
||||
blockedUsers: "Pengguna yang diblokir"
|
||||
@@ -252,6 +255,7 @@ noteDeleteConfirm: "Apakah kamu yakin ingin menghapus catatan ini?"
|
||||
pinLimitExceeded: "Kamu tidak dapat menyematkan catatan lagi"
|
||||
done: "Selesai"
|
||||
processing: "Memproses"
|
||||
preprocessing: "Sedang mempersiapkan..."
|
||||
preview: "Pratinjau"
|
||||
default: "Bawaan"
|
||||
defaultValueIs: "Bawaan: {value}"
|
||||
@@ -297,8 +301,10 @@ uploadFromUrl: "Unggah dari URL"
|
||||
uploadFromUrlDescription: "URL berkas yang ingin kamu unggah"
|
||||
uploadFromUrlRequested: "Pengunggahan telah diminta"
|
||||
uploadFromUrlMayTakeTime: "Membutuhkan beberapa waktu hingga pengunggahan selesai"
|
||||
uploadNFiles: "Unggah berkas {n}"
|
||||
explore: "Jelajahi"
|
||||
messageRead: "Telah dibaca"
|
||||
readAllChatMessages: "Tandai semua pesan menjadi terbaca"
|
||||
noMoreHistory: "Tidak ada sejarah lagi"
|
||||
startChat: "Kirim pesan"
|
||||
nUsersRead: "Dibaca oleh {n}"
|
||||
@@ -325,13 +331,15 @@ dark: "Gelap"
|
||||
lightThemes: "Tema Terang"
|
||||
darkThemes: "Tema gelap"
|
||||
syncDeviceDarkMode: "Sinkronkan mode gelap dengan pengaturan perangkat"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "\"{x}\" sedang dinyalakan. Apa anda ingin untuk menghentikan sinkronisasi dan mengganti mode secara manual?"
|
||||
drive: "Drive"
|
||||
fileName: "Nama berkas"
|
||||
selectFile: "Pilih berkas"
|
||||
selectFiles: "Pilih berkas"
|
||||
selectFolder: "Pilih folder"
|
||||
unselectFolder: "Membatalkan seleksi folder"
|
||||
selectFolders: "Pilih folder"
|
||||
fileNotSelected: "Tidak ada file yang dipilih"
|
||||
fileNotSelected: "Tidak ada berkas yang terpilih"
|
||||
renameFile: "Ubah nama berkas"
|
||||
folderName: "Nama folder"
|
||||
createFolder: "Buat folder"
|
||||
@@ -342,6 +350,7 @@ addFile: "Tambahkan berkas"
|
||||
showFile: "Tampilkan berkas"
|
||||
emptyDrive: "Drive kosong"
|
||||
emptyFolder: "Folder kosong"
|
||||
dropHereToUpload: "Lepas berkas di sini untuk diunggah"
|
||||
unableToDelete: "Tidak dapat menghapus"
|
||||
inputNewFileName: "Masukkan nama berkas yang baru"
|
||||
inputNewDescription: "Masukkan keterangan disini"
|
||||
@@ -400,7 +409,7 @@ enableHcaptcha: "Nyalakan hCaptcha"
|
||||
hcaptchaSiteKey: "Site Key"
|
||||
hcaptchaSecretKey: "Secret Key"
|
||||
mcaptcha: "mCaptcha"
|
||||
enableMcaptcha: ""
|
||||
enableMcaptcha: "Aktifkan mCaptcha"
|
||||
mcaptchaSiteKey: "Site key"
|
||||
mcaptchaSecretKey: "Secret Key"
|
||||
mcaptchaInstanceUrl: "URL instansi mCaptcha"
|
||||
@@ -423,6 +432,7 @@ antennaExcludeBots: "Kecualikan akun bot"
|
||||
antennaKeywordsDescription: "Pisahkan dengan spasi untuk kondisi AND. Pisahkan dengan baris baru untuk kondisi OR."
|
||||
notifyAntenna: "Beritahu untuk catatan baru"
|
||||
withFileAntenna: "Hanya tampilkan catatan dengan berkas yang dilampirkan"
|
||||
excludeNotesInSensitiveChannel: "Kecualikan note dari kanal sensitif"
|
||||
enableServiceworker: "Aktifkan ServiceWorker"
|
||||
antennaUsersDescription: "Tuliskan satu nama pengguna per baris"
|
||||
caseSensitive: "Peka huruf besar dan huruf kecil"
|
||||
@@ -453,6 +463,7 @@ totpDescription: "Gunakan aplikasi autentikator untuk mendapatkan kata sandi sek
|
||||
moderator: "Moderator"
|
||||
moderation: "Moderasi"
|
||||
moderationNote: "Catatan moderasi"
|
||||
moderationNoteDescription: "Anda dapat mengisi note yang hanya akan dibagikan diantara moderator."
|
||||
addModerationNote: "Tambahkan catatan moderasi"
|
||||
moderationLogs: "Log moderasi"
|
||||
nUsersMentioned: "{n} pengguna disebut"
|
||||
@@ -489,7 +500,8 @@ quoteAttached: "Dikutip"
|
||||
quoteQuestion: "Apakah kamu ingin menambahkan kutipan?"
|
||||
attachAsFileQuestion: "Teks dalam papan klip terlalu panjang. Apakah kamu ingin melampirkannya sebagai berkas teks?"
|
||||
onlyOneFileCanBeAttached: "Kamu hanya dapat melampirkan satu berkas ke dalam pesan"
|
||||
signinRequired: "Silahkan login"
|
||||
signinRequired: "Silahkan mendaftar atau masuk sebelum melanjutkan"
|
||||
signinOrContinueOnRemote: "Untuk melanjutkan, anda perlu berpindah peladen atau mendaftar / masuk ke peladen ini."
|
||||
invitations: "Undangan"
|
||||
invitationCode: "Kode undangan"
|
||||
checking: "Memeriksa"
|
||||
@@ -513,6 +525,7 @@ emojiStyle: "Gaya emoji"
|
||||
native: "Native"
|
||||
menuStyle: "Gaya menu"
|
||||
style: "Gaya"
|
||||
drawer: "Drawer"
|
||||
popup: "Pemunculan"
|
||||
showNoteActionsOnlyHover: "Hanya tampilkan aksi catatan saat ditunjuk"
|
||||
showReactionsCount: "Lihat jumlah reaksi dalam catatan"
|
||||
@@ -530,6 +543,7 @@ regenerate: "Buat ulang"
|
||||
fontSize: "Ukuran huruf"
|
||||
mediaListWithOneImageAppearance: "Tinggi daftar media dengan satu gambar saja"
|
||||
limitTo: "Batasi pada {x}"
|
||||
showMediaListByGridInWideArea: "Tampilkan daftar media berupa kisi-kisi ketika lebar tampilan menjadi luas"
|
||||
noFollowRequests: "Kamu tidak memiliki permintaan mengikuti yang menunggu"
|
||||
openImageInNewTab: "Buka gambar di tab baru"
|
||||
dashboard: "Dasbor"
|
||||
@@ -570,9 +584,10 @@ showFixedPostForm: "Tampilkan form posting di atas lini masa"
|
||||
showFixedPostFormInChannel: "Tampilkan form posting di atas lini masa (Kanal)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Termasuk balasan dari pengguna baru yang diikuti pada lini masa secara bawaan"
|
||||
newNoteRecived: "Kamu mendapat catatan baru"
|
||||
newNote: "Catatan baru"
|
||||
newNote: "Note baru"
|
||||
sounds: "Bunyi"
|
||||
sound: "Bunyi"
|
||||
notificationSoundSettings: "Pengaturan suara notifikasi"
|
||||
listen: "Dengarkan"
|
||||
none: "Tidak ada"
|
||||
showInPage: "Tampilkan di halaman"
|
||||
@@ -582,6 +597,7 @@ masterVolume: "Master volume"
|
||||
notUseSound: "Tidak ada keluaran suara"
|
||||
useSoundOnlyWhenActive: "Hanya keluarkan suara jika Misskey sedang aktif"
|
||||
details: "Selengkapnya"
|
||||
renoteDetails: "Rincian renote"
|
||||
chooseEmoji: "Pilih emoji"
|
||||
unableToProcess: "Operasi tersebut tidak dapat diselesaikan."
|
||||
recentUsed: "Baru saja digunakan"
|
||||
@@ -597,6 +613,8 @@ ascendingOrder: "Urutkan naik"
|
||||
descendingOrder: "Urutkan menurun"
|
||||
scratchpad: "Scratchpad"
|
||||
scratchpadDescription: "Scratchpad menyediakan lingkungan eksperimen untuk AiScript. Kamu bisa menulis, mengeksuksi, serta mengecek hasil yang berinteraksi dengan Misskey."
|
||||
uiInspector: "Inspektor UI"
|
||||
uiInspectorDescription: "Anda dapat melihat peladen komponen UI di memori. Komponen UI akan dibuat oleh fungsi UI:C."
|
||||
output: "Keluaran"
|
||||
script: "Script"
|
||||
disablePagesScript: "Nonaktifkan script pada halaman"
|
||||
@@ -677,14 +695,19 @@ smtpSecure: "Gunakan SSL/TLS implisit untuk koneksi SMTP"
|
||||
smtpSecureInfo: "Matikan ini ketika menggunakan STARTTLS"
|
||||
testEmail: "Tes pengiriman surel"
|
||||
wordMute: "Bisukan kata"
|
||||
wordMuteDescription: "Minimalkan note yang mengandung kata atau frasa yang dicantumkan. Note yang terminimkan dapat ditampilkan setelah note tersebut diklik."
|
||||
hardWordMute: "Pembisuan kata keras"
|
||||
showMutedWord: "Tampilkan kata yang dibisukan"
|
||||
hardWordMuteDescription: "Sembunyikan note yang mengandung kata atau frasa yang dicantumkan. Berbeda dengan pembisuan kata, note tersebut akan disembunyikan sepenuhnya dari tampilan."
|
||||
regexpError: "Kesalahan ekspresi reguler"
|
||||
regexpErrorDescription: "Galat terjadi pada baris {line} ekspresi reguler dari {tab} kata yang dibisukan:"
|
||||
instanceMute: "Bisukan instansi"
|
||||
userSaysSomething: "{name} mengatakan sesuatu"
|
||||
userSaysSomethingAbout: "{name} menyebutkan sesuatu tentang \"{word}\""
|
||||
makeActive: "Aktifkan"
|
||||
display: "Tampilkan"
|
||||
copy: "Salin"
|
||||
copiedToClipboard: "Disalin ke papan klip"
|
||||
metrics: "Metrik"
|
||||
overview: "Ikhtisar"
|
||||
logs: "Log"
|
||||
@@ -730,6 +753,8 @@ optional: "Opsional"
|
||||
createNewClip: "Buat klip baru"
|
||||
unclip: "Batalkan klip"
|
||||
confirmToUnclipAlreadyClippedNote: "Catatan ini sudah disertakan di klip \"{name}\". Yakin ingin membatalkan catatan dari klip ini?"
|
||||
removeFromAntenna: "Hapus dari antena ini"
|
||||
removeNoteFromAntennaConfirm: "Apa anda yakin ingin menghapus note dari {name} ini?"
|
||||
public: "Publik"
|
||||
private: "Tersembunyi"
|
||||
i18nInfo: "Misskey diterjemahkan ke dalam banyak bahasa oleh sukarelawan. Kamu juga dapat ikut membantu menerjemahkannya di {link}."
|
||||
@@ -756,6 +781,7 @@ lockedAccountInfo: "Kecuali kamu menyetel visibilitas catatan milikmu ke \"Hanya
|
||||
alwaysMarkSensitive: "Tandai media dalam catatan sebagai media sensitif"
|
||||
loadRawImages: "Tampilkan lampiran gambar secara penuh daripada thumbnail"
|
||||
disableShowingAnimatedImages: "Jangan mainkan gambar bergerak"
|
||||
disableShowingAnimatedImages_caption: "Jika gambar bergerak tidak terputar bahkan setelah pengaturan ini dinonaktifkan, bisa jadi ini karena pengaturan aksesibilitas dari peramban atau Sistem Operasi, pengaturan hemat daya, atau hal-hal terkait lainnya."
|
||||
highlightSensitiveMedia: "Sorot media sensitif"
|
||||
verificationEmailSent: "Surel verifikasi telah dikirimkan. Mohon akses tautan yang telah disertakan untuk menyelesaikan verifikasi."
|
||||
notSet: "Tidak disetel"
|
||||
@@ -779,6 +805,7 @@ wide: "Lebar"
|
||||
narrow: "Sempit"
|
||||
reloadToApplySetting: "Pengaturan ini akan diterapkan saat memuat halaman kembali. Apakah kamu ingin memuat halaman kembali sekarang?"
|
||||
needReloadToApply: "Pengaturan ini hanya akan diterapkan setelah memuat ulang halaman."
|
||||
needToRestartServerToApply: "Perlu memulai ulang Misskey untuk memunculkan pengubahan."
|
||||
showTitlebar: "Tampilkan bilah judul"
|
||||
clearCache: "Hapus tembolok"
|
||||
onlineUsersCount: "{n} orang sedang daring"
|
||||
@@ -849,6 +876,7 @@ administration: "Manajemen"
|
||||
accounts: "Akun"
|
||||
switch: "Beralih"
|
||||
noMaintainerInformationWarning: "Informasi pengelola belum disetel."
|
||||
noInquiryUrlWarning: "URL kontak belum diatur"
|
||||
noBotProtectionWarning: "Proteksi bot belum disetel."
|
||||
configure: "Setel"
|
||||
postToGallery: "Posting ke galeri"
|
||||
@@ -913,6 +941,7 @@ followersVisibility: "Visibilitas pengikut"
|
||||
continueThread: "Lihat lanjutan thread"
|
||||
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
|
||||
incorrectPassword: "Kata sandi salah."
|
||||
incorrectTotp: "Password sekali pakai salah dimasukkan atau sudah kadaluarsa."
|
||||
voteConfirm: "Konfirmasi suara kamu untuk ({choice})?"
|
||||
hide: "Sembunyikan"
|
||||
useDrawerReactionPickerForMobile: "Tampilkan bilah reaksi sebagai laci di ponsel"
|
||||
@@ -964,6 +993,7 @@ document: "Dokumen"
|
||||
numberOfPageCache: "Jumlah halaman ditembolokkan"
|
||||
numberOfPageCacheDescription: "Menaikkan jumlah ini akan meningkatkan kenyamanan untuk pengguna, namun dapat menyebabkan lonjakan beban pada peladen dan juga memori yang digunakan."
|
||||
logoutConfirm: "Anda yakin ingin keluar?"
|
||||
logoutWillClearClientData: "Pengaturan klien di browser akan terhapus jika anda keluar dari sesi. Untuk mengembalikan pengaturan saat masuk kembali, anda perlu mengaktifkan pencadangan otomatis di pengaturan anda."
|
||||
lastActiveDate: "Terakhir digunakan"
|
||||
statusbar: "Bilah status"
|
||||
pleaseSelect: "Pilih opsi..."
|
||||
@@ -982,6 +1012,7 @@ failedToUpload: "Gagal mengunggah"
|
||||
cannotUploadBecauseInappropriate: "Berkas ini tidak dapat diunggah karena sebagian dari berkas terdeteksi berpotensi NSFW."
|
||||
cannotUploadBecauseNoFreeSpace: "Gagal mengunggah karena kekurangan kapasitas Drive."
|
||||
cannotUploadBecauseExceedsFileSizeLimit: "Berkas ini tidak dapat diunggah karena melebihi batas ukuran berkas."
|
||||
cannotUploadBecauseUnallowedFileType: "Tidak dapat mengunggah karena tipe berkas yang tidak diijinkan."
|
||||
beta: "Beta"
|
||||
enableAutoSensitive: "Penandaan NSFW otomatis"
|
||||
enableAutoSensitiveDescription: "Mendeteksi otomatis dan menandai media NSFW menggunakan Pembelajaran Mesin jika memungkinkan. Meskipun opsi ini dimatikan, ada kemungkinan dinyalakan secara menyeluruh pada instansi peladen."
|
||||
@@ -997,6 +1028,9 @@ pushNotificationAlreadySubscribed: "Notifikasi dorong telah dinyalakan"
|
||||
pushNotificationNotSupported: "Browser atau instansi kamu tidak mendukung notifikasi dorong"
|
||||
sendPushNotificationReadMessage: "Hapus notifikasi dorong ketika notifikasi relevan atau pesan telah dibaca"
|
||||
sendPushNotificationReadMessageCaption: "Notifikasi berisi teks「{emptyPushNotificationMessage}」akan ditampilkan dalam waktu pendek. Ini mungkin dapat menambah pemakaian baterai pada perangkat kamu."
|
||||
pleaseAllowPushNotification: "Mohon nyalakan notifikasi push di peramban anda"
|
||||
browserPushNotificationDisabled: "Gagal mendapatkan ijin untuk mengirim notifikasi"
|
||||
browserPushNotificationDisabledDescription: "Anda tidak memiliki ijin untuk mengirim notifikasi dari {serverName}. Mohon ijinkan notifikasi di pengaturan peramban anda dan coba lagi."
|
||||
windowMaximize: "Maksimalkan"
|
||||
windowMinimize: "Minimalkan"
|
||||
windowRestore: "Kembalikan"
|
||||
@@ -1042,6 +1076,7 @@ thisPostMayBeAnnoyingHome: "Catat ke lini masa beranda"
|
||||
thisPostMayBeAnnoyingCancel: "Batalkan"
|
||||
thisPostMayBeAnnoyingIgnore: "Tetap catat"
|
||||
collapseRenotes: "Tutup renote yang sudah kamu lihat"
|
||||
collapseRenotesDescription: "Tutup note yang sudah kamu beri reaksi atau direnote sebelumnya."
|
||||
internalServerError: "Kesalahan internal peladen"
|
||||
internalServerErrorDescription: "Peladen sedang mengalami galat tak terduga"
|
||||
copyErrorInfo: "Salin detil galat"
|
||||
@@ -1080,6 +1115,7 @@ retryAllQueuesConfirmTitle: "Yakin ingin mencoba lagi semuanya?"
|
||||
retryAllQueuesConfirmText: "Hal ini akan meningkatkan beban sementara ke peladen."
|
||||
enableChartsForRemoteUser: "Buat bagan data pengguna instansi luar"
|
||||
enableChartsForFederatedInstances: "Buat bagan data peladen instansi luar"
|
||||
enableStatsForFederatedInstances: "Terima informasi peladen luar"
|
||||
showClipButtonInNoteFooter: "Tambahkan \"Klip\" ke menu aksi catatan"
|
||||
reactionsDisplaySize: "Ukuran tampilan reaksi"
|
||||
limitWidthOfReaction: "Batasi lebar maksimum reaksi dan tampilkan dalam ukuran terbatasi."
|
||||
@@ -1179,6 +1215,7 @@ keepScreenOn: "Biarkan layar tetap menyala"
|
||||
verifiedLink: "Tautan kepemilikan telah diverifikasi"
|
||||
notifyNotes: "Beritahu mengenai catatan baru"
|
||||
unnotifyNotes: "Berhenti memberitahu mengenai catatan baru"
|
||||
notifyUsers: "Pengguna dengan notifikasi pos yang dinyalakan"
|
||||
authentication: "Autentikasi"
|
||||
authenticationRequiredToContinue: "Mohon autentikasikan terlebih dahulu sebelum melanjutkan"
|
||||
dateAndTime: "Tanggal dan Waktu"
|
||||
@@ -1219,6 +1256,7 @@ releaseToRefresh: "Lepaskan untuk memuat ulang"
|
||||
refreshing: "Sedang memuat ulang..."
|
||||
pullDownToRefresh: "Tarik ke bawah untuk memuat ulang"
|
||||
useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan"
|
||||
emailVerificationFailedError: "Ada masalah saat memverifikasi alamat surel anda. Tautannya mungkin sudah kadaluarsa."
|
||||
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
|
||||
doReaction: "Tambahkan reaksi"
|
||||
code: "Kode"
|
||||
@@ -1252,12 +1290,13 @@ useTotp: "Gunakan TOTP"
|
||||
useBackupCode: "Gunakan kode cadangan"
|
||||
launchApp: "Luncurkan Aplikasi"
|
||||
useNativeUIForVideoAudioPlayer: "Gunakan antarmuka peramban ketika memainkan video dan audio"
|
||||
keepOriginalFilename: "Simpan nama berkas asli"
|
||||
keepOriginalFilename: "Gunakan nama asli berkas"
|
||||
keepOriginalFilenameDescription: "Apabila pengaturan ini dimatikan, nama berkas akan diganti dengan string acak secara otomatis ketika kamu mengunggah berkas."
|
||||
noDescription: "Tidak ada deskripsi"
|
||||
alwaysConfirmFollow: "Selalu konfirmasi ketika mengikuti"
|
||||
inquiry: "Hubungi kami"
|
||||
tryAgain: "Silahkan coba lagi."
|
||||
confirmWhenRevealingSensitiveMedia: "Konfirmasi saat membuka media sensitif"
|
||||
sensitiveMediaRevealConfirm: "Media sensitif. Apakah ingin melihat?"
|
||||
createdLists: "Senarai yang dibuat"
|
||||
createdAntennas: "Antena yang dibuat"
|
||||
@@ -1274,9 +1313,17 @@ passkeyVerificationFailed: "Verifikasi kunci sandi gagal."
|
||||
passkeyVerificationSucceededButPasswordlessLoginDisabled: "Verifikasi kunci sandi berhasil, namun pemasukan tanpa sandi dinonaktifkan."
|
||||
messageToFollower: "Pesan kepada pengikut"
|
||||
prohibitedWordsForNameOfUser: "Kata yang dilarang untuk nama pengguna"
|
||||
yourNameContainsProhibitedWordsDescription: "Jika anda ingin menggunakan nama ini, mohon hubungi admin peladen."
|
||||
lockdown: "Kuncitara"
|
||||
federationSpecified: "Peladen ini dioperasikan dalam federasi daftar putih. Interaksi dengan peladen selain yang telah dikelola oleh admin tidak diperbolehkan."
|
||||
federationDisabled: "Federasi dimatikan di peladen ini. Anda tidak dapat berinteraksi dengan pengguna di peladen lain."
|
||||
draft: "Draf"
|
||||
draftsAndScheduledNotes: "Draf dan note terjadwal"
|
||||
preferencesProfile: "Pengaturan profil"
|
||||
noName: "Tidak ada nama"
|
||||
skip: "Lewati"
|
||||
restore: "Kembalikan"
|
||||
preferenceSyncConflictTitle: "Nilai yang diatur sudah ada di dalam peladen."
|
||||
paste: "Tempel"
|
||||
emojiPalette: "Palet emoji"
|
||||
postForm: "Buat catatan"
|
||||
@@ -1286,16 +1333,24 @@ directMessage: "Obrolan pengguna"
|
||||
right: "Kanan"
|
||||
bottom: "Bawah"
|
||||
top: "Atas"
|
||||
driveAboutTip: "Dalam Drive, daftar berkas yang telah anda unggah sebelumnya akan ditampilkan. <br>\nAnda dapat menggunakan kembali berkas-berkas tersebut dalam lampiran note, atau mengunggah berkas sekarang untuk dipublikasikan nanti. <br>\n<b>Harap berhati-hati ketika menghapus berkas, karena berkas tersebut akan tidak bisa diakses di semua tempat yang menggunakan berkas tersebut (seperti note, halaman, avatar, banner, dll.)</b><br>\nAnda juga dapat membuat folder untuk menata berkas-berkas anda."
|
||||
advice: "Saran"
|
||||
defaultImageCompressionLevel_description: "Level yang rendah akan menjaga kualitas gambar namun memperbesar ukuran berkas.<br>Level yang tinggi akan mengurangi ukuran berkas, namun mengurangi kualitas gambar."
|
||||
defaultCompressionLevel_description: "Kompresi yang rendah akan menjaga kualitas namun memperbesar ukuran berkas. Kompresi yang tinggi akan mengurangi ukuran berkas namun mengurangi kualitas."
|
||||
inMinutes: "menit"
|
||||
inDays: "hari"
|
||||
widgets: "Widget"
|
||||
presets: "Prasetel"
|
||||
previewingThemeRestore: "Kembalikan"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Keterangan berkas"
|
||||
filename: "Nama berkas"
|
||||
filename_without_ext: "Nama berkas tanpa ekstensi"
|
||||
_imageFrameEditor:
|
||||
header: "Header"
|
||||
withQrCode: "QR Code"
|
||||
backgroundColor: "Warna latar belakang"
|
||||
font: "Font"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans-serif"
|
||||
@@ -1303,15 +1358,32 @@ _chat:
|
||||
invitations: "Undang"
|
||||
history: "Riwayat obrolan"
|
||||
noHistory: "Tidak ada riwayat"
|
||||
join: "Gabung"
|
||||
members: "Anggota"
|
||||
home: "Beranda"
|
||||
send: "Kirim"
|
||||
chatWithThisUser: "Obrolan pengguna"
|
||||
_settings:
|
||||
driveBanner: "Anda dapat mengelola dan mengatur drive, melihat penggunaan, dan mengatur pengaturan unggahan berkas."
|
||||
notificationsBanner: "Anda dapat mengatur tipe dan rentang notifikasi dari peladen dan notifikasi push."
|
||||
webhook: "Webhook"
|
||||
contentsUpdateFrequency: "Frekuensi pembaruan konten"
|
||||
_preferencesProfile:
|
||||
profileName: "Nama profil"
|
||||
profileNameDescription: "Tulis nama untuk mengidentifikasi perangkat ini."
|
||||
profileNameDescription2: "Contoh: \"PC Utama\", \"Smartphone\""
|
||||
manageProfiles: "Kelola Profil"
|
||||
shareSameProfileBetweenDevicesIsNotRecommended: "Kami tidak menyarankan menggunakan profil yang sama diantara beberapa perangkat yang berbeda."
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "Jika terdapat pengaturan yang ingin anda sinkronkan diantara beberapa perangkat yang berbeda, nyalakan opsi \"Sinkronisasi pada perangkat yang berbeda\" satu per satu untuk setiap perangkat."
|
||||
_preferencesBackup:
|
||||
autoBackup: "Pencadangan otomatis"
|
||||
restoreFromBackup: "Kembalikan dari pencadangan"
|
||||
noBackupsFoundDescription: "Tidak ada pencadangan otomatis yang ditemukan, namun jika anda pernah membuat cadangan secara manual, anda bisa mengimpor dan mengembalikan pencadangan tersebut."
|
||||
selectBackupToRestore: "Pilih pencadangan untuk dikembalikan"
|
||||
youNeedToNameYourProfileToEnableAutoBackup: "Nama profil harus dibuat untuk menyalakan cadangan otomatis."
|
||||
_accountSettings:
|
||||
makeNotesFollowersOnlyBeforeDescription: "Ketika fitur ini diaktifkan, hanya pengikut yang dapat melihat note sebelum tanggal dan waktu yang ditentukan atau telah terlihat untuk waktu tertentu. Setelah dinonaktifkan, status publikasi note juga akan dikembalikan seperti semula."
|
||||
makeNotesHiddenBeforeDescription: "Saat fitur ini diaktifkan, note sebelum tanggal dan waktu tertentu hanya akan terlihat oleh anda. Setelah dinonaktifkan, status publikasi note juga akan dikembalikan seperti semula."
|
||||
_abuseUserReport:
|
||||
accept: "Setuju"
|
||||
reject: "Tolak"
|
||||
@@ -1354,7 +1426,7 @@ _announcement:
|
||||
silenceDescription: "Apabila diaktifkan, notifikasi dari pengumuman ini akan dilewatkan dan pengguna tidak perlu membacanya."
|
||||
_initialAccountSetting:
|
||||
accountCreated: "Akun kamu telah sukses dibuat!"
|
||||
letsStartAccountSetup: "Untuk pemula, ayo atur profilmu dulu."
|
||||
letsStartAccountSetup: "Pertama-tama, ayo atur profilmu dulu."
|
||||
letsFillYourProfile: "Pertama, ayo atur profilmu dulu."
|
||||
profileSetting: "Pengaturan profil"
|
||||
privacySetting: "Pengaturan privasi"
|
||||
@@ -1449,6 +1521,11 @@ _serverSettings:
|
||||
fanoutTimelineDescription: "Dapat meningkatkan performa dalam pengambilan data linimasa dan mengurangi beban pada database ketika dinyalakan. Sebagai gantinya, penggunaan memory pada Redis akan meningkan. Pertimbangkan untuk menonaktifkan fitur ini jika mengalami kekurangan memori pada server atau menyebabkan server tidak stabil."
|
||||
fanoutTimelineDbFallback: "Fallback ke database"
|
||||
fanoutTimelineDbFallbackDescription: "Ketika diaktifkan, lini masa akan fallback ke database untuk melakukan kueri tambahan apabila linimasa tidak disimpan dalam cache. Menonaktifkan ini dapat mengurangi beban server dengan mengeliminasi proses fallback, namun dapat berakibat membatasi jarak data dari lini masa yang dapat diambil."
|
||||
reactionsBufferingDescription: "Ketika diaktifkan, performa saat membuat reaksi akan meningkat drastis, mengurangi beban database. Namun, penggunaan memori Redis akan meningkat."
|
||||
remoteNotesCleaning_description: "Ketika diaktifkan, note yang tidak terpakai dan kadaluarsa dari instansi luar akan dibersihkan secara berkala untuk mencegah membengkaknya database."
|
||||
inquiryUrlDescription: "Cantumkan URL untuk menghubungi pengelola peladen atau laman web berisikan informasi kontak."
|
||||
proxyRemoteFiles: "Berkas proksi remote"
|
||||
proxyRemoteFiles_description: "Ketika dinyalakan, peladen akan berperan sebagai proksi menyajikan berkas secara remote. Ini dapat berguna untuk membuat keluku gambar dan melindungi privasi pengguna."
|
||||
_accountMigration:
|
||||
moveFrom: "Pindahkan akun lain ke akun ini"
|
||||
moveFromSub: "Buat alias ke akun lain"
|
||||
@@ -1764,6 +1841,9 @@ _role:
|
||||
canManageCustomEmojis: "Dapat mengelola Emoji kustom"
|
||||
canManageAvatarDecorations: "Kelola dekorasi avatar"
|
||||
driveCapacity: "Kapasitas Drive"
|
||||
maxFileSize: "Ukuran berkas maksimal yang dapat diunggah"
|
||||
maxFileSize_caption: "Proksi terbalik, CDN, dan komponen antarmuka-depan bisa memiliki pengaturan tersendiri."
|
||||
maxFileSize_caption2: "Ukuran berkas maksimal di keseluruhan peladen adalah {max}. Untuk memperbolehkan unggahan berkas yang lebih besar dari ini, silahkan mengubah pengaturan ini di dalam berkas pengaturan Misskey."
|
||||
alwaysMarkNsfw: "Selalu tandai berkas sebagai NSFW"
|
||||
pinMax: "Jumlah maksimal catatan yang disematkan"
|
||||
antennaMax: "Jumlah maksimum antena"
|
||||
@@ -1781,6 +1861,8 @@ _role:
|
||||
avatarDecorationLimit: "Jumlah maksimum dekorasi avatar yang dapat diterapkan"
|
||||
canImportAntennas: "Izinkan mengimpor antena"
|
||||
canImportUserLists: "Izinkan mengimpor senarai"
|
||||
uploadableFileTypes: "Jenis berkas yang dapat diunggah"
|
||||
noteDraftLimit: "Jumlah dari draf yang dapat dibuat dari sisi peladen"
|
||||
_condition:
|
||||
roleAssignedTo: "Ditugaskan ke peran manual"
|
||||
isLocal: "Pengguna lokal"
|
||||
@@ -2163,6 +2245,7 @@ _auth:
|
||||
callback: "Mengembalikan kamu ke aplikasi"
|
||||
denied: "Akses ditolak"
|
||||
pleaseLogin: "Mohon masuk untuk otorisasi aplikasi."
|
||||
alreadyAuthorized: "Aplikasi ini sudah memiliki ijin akses."
|
||||
_antennaSources:
|
||||
all: "Semua catatan"
|
||||
homeTimeline: "Catatan dari pengguna yang diikuti"
|
||||
@@ -2260,8 +2343,10 @@ _postForm:
|
||||
quotePlaceholder: "Kutip catatan ini..."
|
||||
channelPlaceholder: "Posting ke kanal"
|
||||
_howToUse:
|
||||
account_description: "Anda dapat berpindah antar akun untuk mengunggah note, melihat daftar draf dan note terjadwal yang tersimpan di akun anda."
|
||||
visibility_title: "Visibilitas"
|
||||
menu_title: "Menu"
|
||||
menu_description: "Anda dapat menyimpan konten saat ini ke dalam draf, menjadwalkan note, mengatur reaksi, dan melakukan aksi lainnya."
|
||||
_placeholders:
|
||||
a: "Sedang apa kamu saat ini?"
|
||||
b: "Apa yang terjadi di sekitarmu?"
|
||||
@@ -2403,9 +2488,12 @@ _notification:
|
||||
youReceivedFollowRequest: "Kamu menerima permintaan mengikuti"
|
||||
yourFollowRequestAccepted: "Permintaan mengikuti kamu telah diterima"
|
||||
pollEnded: "Hasil Kuesioner telah keluar"
|
||||
scheduledNotePosted: "Note terjadwal sudah diunggah"
|
||||
scheduledNotePostFailed: "Gagal mengunggah note terjadwal"
|
||||
newNote: "Catatan baru"
|
||||
unreadAntennaNote: "Antena {name}"
|
||||
roleAssigned: "Peran Diberikan"
|
||||
chatRoomInvitationReceived: "Kamu telah diundang ke dalam ruang chat"
|
||||
emptyPushNotificationMessage: "Pembaruan notifikasi dorong"
|
||||
achievementEarned: "Pencapaian didapatkan"
|
||||
testNotification: "Tes notifikasi"
|
||||
@@ -2417,6 +2505,10 @@ _notification:
|
||||
renotedBySomeUsers: "{n} orang telah merenote"
|
||||
followedBySomeUsers: "{n} orang telah mengikuti"
|
||||
flushNotification: "Bersihkan notifikasi"
|
||||
exportOfXCompleted: "Berhasil mengekspor {x}"
|
||||
login: "Seseorang telah masuk"
|
||||
createToken: "Token akses berhasil dibuat"
|
||||
createTokenDescription: "Jika anda tidak tahu apa-apa, hapus token akses melalui \"{text}\"."
|
||||
_types:
|
||||
all: "Semua"
|
||||
note: "Catatan baru"
|
||||
@@ -2427,11 +2519,17 @@ _notification:
|
||||
quote: "Kutip"
|
||||
reaction: "Reaksi"
|
||||
pollEnded: "Jajak pendapat berakhir"
|
||||
scheduledNotePosted: "Note terjadwal berhasil"
|
||||
scheduledNotePostFailed: "Note terjadwal gagal"
|
||||
receiveFollowRequest: "Permintaan mengikuti diterima"
|
||||
followRequestAccepted: "Permintaan mengikuti disetujui"
|
||||
roleAssigned: "Peran Diberikan"
|
||||
chatRoomInvitationReceived: "Diundang ke dalam ruang chat"
|
||||
achievementEarned: "Pencapaian didapatkan"
|
||||
exportCompleted: "Ekspor telah selesai"
|
||||
login: "Masuk"
|
||||
createToken: "Buat token akses"
|
||||
test: "Tes notifikasi"
|
||||
app: "Notifikasi dari aplikasi tertaut"
|
||||
_actions:
|
||||
followBack: "Ikuti Kembali"
|
||||
@@ -2441,6 +2539,7 @@ _deck:
|
||||
alwaysShowMainColumn: "Selalu tampilkan kolom utama"
|
||||
columnAlign: "Luruskan kolom"
|
||||
addColumn: "Tambahkan kolom"
|
||||
newNoteNotificationSettings: "Pengaturan notifikasi untuk note baru"
|
||||
configureColumn: "Atur kolom"
|
||||
swapLeft: "Pindah ke kiri"
|
||||
swapRight: "Pindah ke kanan"
|
||||
@@ -2457,6 +2556,8 @@ _deck:
|
||||
useSimpleUiForNonRootPages: "Gunakan antarmuka sederhana ke halaman yang dituju"
|
||||
usedAsMinWidthWhenFlexible: "Lebar minimum akan digunakan untuk ini ketika opsi \"Atur-otomatis lebar\" dinyalakan"
|
||||
flexible: "Atur-otomatis lebar"
|
||||
_howToUse:
|
||||
settings_title: "Pengaturan UI"
|
||||
_columns:
|
||||
main: "Utama"
|
||||
widgets: "Widget"
|
||||
@@ -2495,6 +2596,7 @@ _webhookSettings:
|
||||
deleteConfirm: "Apakah kamu yakin ingin menghapus Webhook?"
|
||||
_abuseReport:
|
||||
_notificationRecipient:
|
||||
createRecipient: "Tambah penerima laporan"
|
||||
_recipientType:
|
||||
mail: "Surel"
|
||||
webhook: "Webhook"
|
||||
@@ -2670,6 +2772,8 @@ _search:
|
||||
searchScopeAll: "Semua"
|
||||
searchScopeLocal: "Lokal"
|
||||
searchScopeUser: "Pengguna spesifik"
|
||||
_uploader:
|
||||
allowedTypes: "Jenis berkas yang dapat diunggah"
|
||||
_watermarkEditor:
|
||||
driveFileTypeWarn: "Berkas ini tidak didukung"
|
||||
opacity: "Opasitas"
|
||||
@@ -2689,6 +2793,24 @@ _imageEffector:
|
||||
color: "Warna"
|
||||
opacity: "Opasitas"
|
||||
lightness: "Menerangkan"
|
||||
drafts: "Draf"
|
||||
_drafts:
|
||||
select: "Pilih Draf"
|
||||
cannotCreateDraftAnymore: "Telah melebihi jumlah draf yang dapat dibuat."
|
||||
cannotCreateDraft: "Anda tidak dapat membuat draf dengan konten ini."
|
||||
delete: "Hapus Draf"
|
||||
deleteAreYouSure: "Hapus Draf?"
|
||||
noDrafts: "Tidak ada draf"
|
||||
replyTo: "Balas ke {user}"
|
||||
quoteOf: "Mengutip note dari {user}"
|
||||
postTo: "Mengunggah ke {channel}"
|
||||
saveToDraft: "Simpan ke Draf"
|
||||
restoreFromDraft: "Kembalikan dari Draf"
|
||||
restore: "Kembalikan"
|
||||
listDrafts: "Daftar Draf"
|
||||
schedule: "Jadwalkan note"
|
||||
listScheduledNotes: "Daftar note terjadwal"
|
||||
cancelSchedule: "Batalkan penjadwalan"
|
||||
_qr:
|
||||
showTabTitle: "Tampilkan"
|
||||
raw: "Teks"
|
||||
|
||||
+15
-3
@@ -753,6 +753,8 @@ optional: "facoltativo"
|
||||
createNewClip: "Crea una Clip"
|
||||
unclip: "Togli Nota dalla Clip"
|
||||
confirmToUnclipAlreadyClippedNote: "Questa nota è già inclusa in \"{name}\". Si desidera escludere la nota?"
|
||||
removeFromAntenna: "Elimina da questa Antenna"
|
||||
removeNoteFromAntennaConfirm: "Vuoi davvero eliminare la Nota di {name} ?"
|
||||
public: "Pubblica"
|
||||
private: "Privato"
|
||||
i18nInfo: "Misskey è tradotto in diverse lingue da volontari. Anche tu puoi contribuire su {link}."
|
||||
@@ -1217,6 +1219,7 @@ keepScreenOn: "Mantenere lo schermo acceso"
|
||||
verifiedLink: "Abbiamo confermato la validità di questo collegamento"
|
||||
notifyNotes: "Notifica nuove Note"
|
||||
unnotifyNotes: "Interrompi le notifiche di nuove Note"
|
||||
notifyUsers: "Persone che hanno attivato le notifiche di pubblicazione"
|
||||
authentication: "Autenticazione"
|
||||
authenticationRequiredToContinue: "Per procedere, è richiesta l'autenticazione"
|
||||
dateAndTime: "Data e Ora"
|
||||
@@ -1358,14 +1361,11 @@ information: "Informazioni"
|
||||
chat: "Chat"
|
||||
directMessage: "Chattare insieme"
|
||||
directMessage_short: "Messaggio"
|
||||
migrateOldSettings: "Migrare le vecchie impostazioni"
|
||||
migrateOldSettings_description: "Di solito, viene fatto automaticamente. Se per qualche motivo non fossero migrate con successo, è possibile avviare il processo di migrazione manualmente, sovrascrivendo le configurazioni attuali."
|
||||
compress: "Compressione"
|
||||
right: "Destra"
|
||||
bottom: "Sotto"
|
||||
top: "Sopra"
|
||||
embed: "Incorporare"
|
||||
settingsMigrating: "Migrazione delle impostazioni. Attendere prego ... (Puoi anche migrare manualmente in un secondo momento, nel menu: Impostazioni → Altro → Migrazione delle impostazioni)"
|
||||
readonly: "Sola lettura"
|
||||
goToDeck: "Torna al Deck"
|
||||
federationJobs: "Coda di federazione"
|
||||
@@ -1409,6 +1409,14 @@ presets: "Preimpostato"
|
||||
zeroPadding: "Al vivo"
|
||||
nothingToConfigure: "Niente da configurare"
|
||||
viewRenotedChannel: "Visualizza il canale del Rinota"
|
||||
previewingTheme: "Anteprima del Tema"
|
||||
previewingThemeRestore: "Ripristina"
|
||||
accessToken: "Codice di accesso"
|
||||
chooseEmojiPalette: "Scegli la tavolozza emoji"
|
||||
addToEmojiPalette: "Aggiungi alla tavolozza emoji"
|
||||
emojiPaletteAlreadyAddedConfirm: "Questa emoji è già inclusa in nella tavolozza. Vuoi davvero aggiungerla?"
|
||||
append: "Accodare"
|
||||
prepend: "Anteporre"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Didascalia dell'immagine"
|
||||
@@ -2082,6 +2090,7 @@ _role:
|
||||
driveCapacity: "Capienza del Drive"
|
||||
maxFileSize: "Dimensione massima del file caricabile"
|
||||
maxFileSize_caption: "Potrebbero esserci altre impostazioni nella fase precedente, come reverse proxy o CDN."
|
||||
maxFileSize_caption2: "La dimensione massima dei file caricabili sul server è {max}. Per consentire il caricamento di file più grandi, aumenta la dimensione nel file di configurazione Misskey."
|
||||
alwaysMarkNsfw: "Impostare sempre come esplicito (NSFW)"
|
||||
canUpdateBioMedia: "Può aggiornare foto profilo e di testata"
|
||||
pinMax: "Quantità massima di Note in primo piano"
|
||||
@@ -2098,6 +2107,7 @@ _role:
|
||||
canSearchNotes: "Ricercare nelle Note"
|
||||
canSearchUsers: "Può cercare profili"
|
||||
canUseTranslator: "Tradurre le Note"
|
||||
canCreateChannel: "Può creare canali"
|
||||
avatarDecorationLimit: "Numero massimo di decorazioni foto profilo installabili"
|
||||
canImportAntennas: "Può importare Antenne"
|
||||
canImportBlocking: "Può importare Blocchi"
|
||||
@@ -3249,6 +3259,8 @@ _search:
|
||||
pleaseEnterServerHost: "Inserire il nome host"
|
||||
pleaseSelectUser: "Per favore, seleziona un profilo"
|
||||
serverHostPlaceholder: "Es: misskey.example.com"
|
||||
postFrom: "Pubblicazione dal"
|
||||
postTo: "Pubblicazione al"
|
||||
_serverSetupWizard:
|
||||
installCompleted: "L'installazione di Misskey è completata!"
|
||||
firstCreateAccount: "Per prima cosa, crea un account amministratore."
|
||||
|
||||
+15
-3
@@ -619,6 +619,8 @@ output: "出力"
|
||||
script: "スクリプト"
|
||||
disablePagesScript: "Pagesのスクリプトを無効にする"
|
||||
updateRemoteUser: "リモートユーザー情報の更新"
|
||||
unsetMfa: "二要素認証を解除"
|
||||
unsetMfaConfirm: "二要素認証を解除しますか?"
|
||||
unsetUserAvatar: "アイコンを解除"
|
||||
unsetUserAvatarConfirm: "アイコンを解除しますか?"
|
||||
unsetUserBanner: "バナーを解除"
|
||||
@@ -1361,14 +1363,11 @@ information: "情報"
|
||||
chat: "チャット"
|
||||
directMessage: "ダイレクトメッセージ"
|
||||
directMessage_short: "メッセージ"
|
||||
migrateOldSettings: "旧設定情報を移行"
|
||||
migrateOldSettings_description: "通常これは自動で行われていますが、何らかの理由により上手く移行されなかった場合は手動で移行処理をトリガーできます。現在の設定情報は上書きされます。"
|
||||
compress: "圧縮"
|
||||
right: "右"
|
||||
bottom: "下"
|
||||
top: "上"
|
||||
embed: "埋め込み"
|
||||
settingsMigrating: "設定を移行しています。しばらくお待ちください... (後ほど、設定→その他→旧設定情報を移行 で手動で移行することもできます)"
|
||||
readonly: "読み取り専用"
|
||||
goToDeck: "デッキへ戻る"
|
||||
federationJobs: "連合ジョブ"
|
||||
@@ -1420,6 +1419,8 @@ addToEmojiPalette: "絵文字パレットに追加"
|
||||
emojiPaletteAlreadyAddedConfirm: "この絵文字はすでにこの絵文字パレットに含まれています。追加しなおしますか?"
|
||||
append: "末尾に追加"
|
||||
prepend: "先頭に追加"
|
||||
urlPreviewSensitiveList: "サムネイルの表示を制限するURL"
|
||||
urlPreviewSensitiveListDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります。スラッシュで囲むと正規表現になります。一致した場合、サムネイルが表示されなくなります。"
|
||||
|
||||
_imageEditing:
|
||||
_vars:
|
||||
@@ -2177,6 +2178,15 @@ _sensitiveMediaDetection:
|
||||
setSensitiveFlagAutomaticallyDescription: "この設定をオフにしても内部的に判定結果は保持されます。"
|
||||
analyzeVideos: "動画の解析を有効化"
|
||||
analyzeVideosDescription: "静止画に加えて動画も解析するようにします。サーバーの負荷が少し増えます。"
|
||||
externalServiceInfo: "センシティブメディアの判定は外部サービス (sensitive-detector) に分離されました。この機能を利用するには、別途サイドカーサービスをセットアップし、下記の接続先を設定する必要があります。接続先が未設定の場合、判定は行われません (非センシティブ扱い)。"
|
||||
apiUrl: "判定サービスの接続先URL"
|
||||
apiUrlDescription: "sensitive-detector サービスのベースURL (例: http://localhost:3009)。プライベートネットワーク上のサービスに接続する場合は、設定ファイルの allowedPrivateNetworks で接続先ネットワークを許可してください。プロキシを使用している場合は、proxyBypassHosts も設定してください。空欄の場合、センシティブ判定は行われません。"
|
||||
apiKey: "APIキー"
|
||||
apiKeyDescription: "判定サービス側で認証 (Bearerトークン) を設定している場合に入力します。設定していない場合は空欄のままにしてください。"
|
||||
timeout: "タイムアウト (ミリ秒)"
|
||||
timeoutDescription: "判定リクエスト1回あたりのタイムアウト時間です。"
|
||||
maxImagesPerRequest: "1リクエストあたりの最大画像数"
|
||||
maxImagesPerRequestDescription: "動画など複数フレームを判定する際、1回のリクエストにまとめて送る画像の最大枚数です。これを超える分は分割して順次送信されます。sensitive-detector 側の maxParts 設定(デフォルト: 10)を超えないように設定してください。超えた場合、そのチャンクは全件非センシティブ扱いとなります。"
|
||||
|
||||
_emailUnavailable:
|
||||
used: "既に使用されています"
|
||||
@@ -2517,6 +2527,7 @@ _permissions:
|
||||
"read:admin:show-moderation-log": "モデレーションログを見る"
|
||||
"read:admin:show-user": "ユーザーのプライベートな情報を見る"
|
||||
"write:admin:suspend-user": "ユーザーを凍結する"
|
||||
"write:admin:unset-mfa": "ユーザーの二要素認証を解除する"
|
||||
"write:admin:unset-user-avatar": "ユーザーのアバターを削除する"
|
||||
"write:admin:unset-user-banner": "ユーザーのバーナーを削除する"
|
||||
"write:admin:unsuspend-user": "ユーザーの凍結を解除する"
|
||||
@@ -3062,6 +3073,7 @@ _moderationLogTypes:
|
||||
createAvatarDecoration: "アイコンデコレーションを作成"
|
||||
updateAvatarDecoration: "アイコンデコレーションを更新"
|
||||
deleteAvatarDecoration: "アイコンデコレーションを削除"
|
||||
unsetMfa: "ユーザーの二要素認証を解除"
|
||||
unsetUserAvatar: "ユーザーのアイコンを解除"
|
||||
unsetUserBanner: "ユーザーのバナーを解除"
|
||||
createSystemWebhook: "SystemWebhookを作成"
|
||||
|
||||
+1
-3
@@ -1332,9 +1332,6 @@ preferenceSyncConflictChoiceCancel: "同期の有効化はやめとくわ"
|
||||
postForm: "投稿フォーム"
|
||||
information: "情報"
|
||||
directMessage: "チャットしよか"
|
||||
migrateOldSettings: "旧設定情報をお引っ越し"
|
||||
migrateOldSettings_description: "通常これは自動で行われるはずなんやけど、なんかの理由で上手く移行できへんかったときは手動で移行処理をポチっとできるで。今の設定情報は上書きされるで。"
|
||||
settingsMigrating: "設定を移行しとるで。ちょっと待っとってな... (後で、設定→その他→旧設定情報を移行 で手動で移行することもできるで)"
|
||||
driveAboutTip: "ドライブでは、今までアップロードしたファイルがずらーっと表示されるで。<br>\nノートにファイルをもっかいのっけたり、あとで投稿するファイルをその辺に置いとくこともできるねん。<br>\n<b>ファイルをほかすと、前にそのファイルをのっけた全部の場所(ノート、ページ、アバター、バナー等)からも見えんくなるから気いつけてな。</b><br>\nフォルダを作って整理することもできるで。"
|
||||
turnItOn: "オンにしとこ"
|
||||
turnItOff: "オフでええわ"
|
||||
@@ -1355,6 +1352,7 @@ widgets: "ウィジェット"
|
||||
deviceInfoDescription: "なんか技術的なことで分からんこと聞くときは、下の情報も一緒に書いてもらえると、こっちも分かりやすいし、はよ直ると思います。"
|
||||
youAreAdmin: "あんた、管理者やで"
|
||||
presets: "プリセット"
|
||||
previewingThemeRestore: "元に戻す"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "ファイル名"
|
||||
|
||||
+14
-3
@@ -753,6 +753,8 @@ optional: "옵션"
|
||||
createNewClip: "새 클립 만들기"
|
||||
unclip: "클립 해제"
|
||||
confirmToUnclipAlreadyClippedNote: "이 노트는 ‘{name}’ 클립을 이미 포함합니다. 클립에서 제외하시겠습니까?"
|
||||
removeFromAntenna: "이 안테나에서 삭제"
|
||||
removeNoteFromAntennaConfirm: "'{name}'으로부터의 노트를 삭제하시겠습니까?"
|
||||
public: "공개"
|
||||
private: "비공개"
|
||||
i18nInfo: "Misskey는 자원봉사자들에 의해 다양한 언어로 번역되고 있습니다. {link}에서 번역에 참가할 수 있습니다."
|
||||
@@ -1217,6 +1219,7 @@ keepScreenOn: "기기 화면을 항상 켜기"
|
||||
verifiedLink: "이 링크의 소유자임이 확인되었습니다."
|
||||
notifyNotes: "새 노트 알림 켜기"
|
||||
unnotifyNotes: "새 노트 알림 끄기"
|
||||
notifyUsers: "게시물 알림을 설정한 사용자"
|
||||
authentication: "인증"
|
||||
authenticationRequiredToContinue: "계속하려면 인증하십시오"
|
||||
dateAndTime: "일시"
|
||||
@@ -1358,14 +1361,11 @@ information: "정보"
|
||||
chat: "채팅"
|
||||
directMessage: "채팅하기"
|
||||
directMessage_short: "메시지"
|
||||
migrateOldSettings: "기존 설정 정보를 이전"
|
||||
migrateOldSettings_description: "보통은 자동으로 이루어지지만, 어떤 이유로 인해 성공적으로 이전이 이루어지지 않는 경우 수동으로 이전을 실행할 수 있습니다. 현재 설정 정보는 덮어쓰게 됩니다."
|
||||
compress: "압축"
|
||||
right: "오른쪽"
|
||||
bottom: "아래"
|
||||
top: "위"
|
||||
embed: "임베드"
|
||||
settingsMigrating: "설정을 이전하는 중입니다. 잠시 기다려주십시오... (나중에 '환경설정 → 기타 → 기존 설정 정보를 이전'에서 수동으로 이전할 수도 있습니다)"
|
||||
readonly: "읽기 전용"
|
||||
goToDeck: "덱으로 돌아가기"
|
||||
federationJobs: "연합 작업"
|
||||
@@ -1409,6 +1409,14 @@ presets: "프리셋"
|
||||
zeroPadding: "0으로 채우기"
|
||||
nothingToConfigure: "설정 항목이 없습니다."
|
||||
viewRenotedChannel: "리노트된 채널 보기"
|
||||
previewingTheme: "테마 미리보기 중"
|
||||
previewingThemeRestore: "복구"
|
||||
accessToken: "접근 토큰"
|
||||
chooseEmojiPalette: "이모지 팔레트 선택"
|
||||
addToEmojiPalette: "이모지 팔레트에 추가"
|
||||
emojiPaletteAlreadyAddedConfirm: "이 이모지는 이미 이 이모지 팔레트에 포함돼있습니다. 다시 추가하시겠습니까?"
|
||||
append: "맨뒤에 추가"
|
||||
prepend: "맨앞에 추가"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "파일 설명"
|
||||
@@ -2082,6 +2090,7 @@ _role:
|
||||
driveCapacity: "드라이브 용량"
|
||||
maxFileSize: "업로드 가능한 최대 파일 크기"
|
||||
maxFileSize_caption: "리버스 프록시나 CDN 등 전단에서 다른 설정값이 존재하는 경우가 있습니다."
|
||||
maxFileSize_caption2: "서버 전체의 최대 파일 크기 설정은 {max}입니다. 이보다 큰 파일을 업로드하려면 Misskey 설정 파일에서 이 설정을 늘려주십시오."
|
||||
alwaysMarkNsfw: "파일을 항상 NSFW로 지정"
|
||||
canUpdateBioMedia: "아바타 및 배너 이미지 변경 허용"
|
||||
pinMax: "고정할 수 있는 노트 수"
|
||||
@@ -3250,6 +3259,8 @@ _search:
|
||||
pleaseEnterServerHost: "서버의 호스트를 입력해 주세요."
|
||||
pleaseSelectUser: "유저를 선택해주세요"
|
||||
serverHostPlaceholder: "예: misskey.example.com"
|
||||
postFrom: "게시 날짜 from"
|
||||
postTo: "게시 날짜 to"
|
||||
_serverSetupWizard:
|
||||
installCompleted: "Misskey의 설치가 완료됐습니다!"
|
||||
firstCreateAccount: "먼저 관리자 계정을 만듭시다."
|
||||
|
||||
@@ -970,6 +970,7 @@ renotes: "Herdelen"
|
||||
followingOrFollower: "Gevolgd of volger"
|
||||
confirmShowRepliesAll: "Dit is een onomkeerbare operatie. Weet je zeker dat reacties op anderen van iedereen die je volgt, wil weergeven in je tijdlijn?"
|
||||
information: "Over"
|
||||
previewingThemeRestore: "Herstellen"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Bestandsnaam"
|
||||
|
||||
@@ -1044,6 +1044,7 @@ inMinutes: "minuta"
|
||||
inDays: "dzień"
|
||||
widgets: "Widżety"
|
||||
presets: "Konfiguracja"
|
||||
previewingThemeRestore: "Przywróć"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Nazwa pliku"
|
||||
|
||||
+1
-3
@@ -1347,14 +1347,11 @@ information: "Sobre"
|
||||
chat: "Conversas"
|
||||
directMessage: "Conversar com usuário"
|
||||
directMessage_short: "Mensagem"
|
||||
migrateOldSettings: "Migrar configurações antigas de cliente"
|
||||
migrateOldSettings_description: "Isso deve ser feito automaticamente. Caso o processo de migração tenha falhado, você pode acioná-lo manualmente. As informações atuais de migração serão substituídas."
|
||||
compress: "Comprimir"
|
||||
right: "Direita"
|
||||
bottom: "Inferior"
|
||||
top: "Superior"
|
||||
embed: "Embed"
|
||||
settingsMigrating: "Configurações estão sendo migradas, aguarde... (Você pode migrar manualmente em Configurações→Outros→Migrar configurações antigas de cliente)"
|
||||
readonly: "Ler apenas"
|
||||
goToDeck: "Voltar ao Deck"
|
||||
federationJobs: "Tarefas de Federação"
|
||||
@@ -1391,6 +1388,7 @@ schedule: "Agendar"
|
||||
scheduled: "Agendado"
|
||||
widgets: "Widgets"
|
||||
presets: "Predefinições"
|
||||
previewingThemeRestore: "Restaurar"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Nome do Ficheiro"
|
||||
|
||||
@@ -1216,6 +1216,7 @@ surrender: "Anulează"
|
||||
copyPreferenceId: "Copiază ID-ul preferințelor"
|
||||
information: "Despre"
|
||||
presets: "Presetate"
|
||||
previewingThemeRestore: "Restabilește"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Nume fișier"
|
||||
|
||||
@@ -1350,6 +1350,7 @@ frame: "Рамки"
|
||||
presets: "Шаблоны"
|
||||
zeroPadding: "Без отступов"
|
||||
nothingToConfigure: "Нечего менять"
|
||||
previewingThemeRestore: "Восстановить"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Описание файла"
|
||||
|
||||
@@ -916,6 +916,7 @@ information: "Informácie"
|
||||
inMinutes: "min"
|
||||
inDays: "dní"
|
||||
widgets: "Widgety"
|
||||
previewingThemeRestore: "Obnoviť"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Názov súboru"
|
||||
|
||||
@@ -559,6 +559,7 @@ tryAgain: "Försök igen senare"
|
||||
signinWithPasskey: "Logga in med nyckel"
|
||||
unknownWebAuthnKey: "Okänd nyckel"
|
||||
information: "Om"
|
||||
previewingThemeRestore: "Återställ"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Filnamn"
|
||||
|
||||
+1
-3
@@ -1358,14 +1358,11 @@ information: "เกี่ยวกับ"
|
||||
chat: "แชต"
|
||||
directMessage: "แชตเลย"
|
||||
directMessage_short: "ข้อความ"
|
||||
migrateOldSettings: "ย้ายข้อมูลการตั้งค่าเก่า"
|
||||
migrateOldSettings_description: "โดยปกติจะทำโดยอัตโนมัติ แต่หากด้วยเหตุผลบางประการที่ไม่สามารถย้ายได้สำเร็จ สามารถสั่งย้ายด้วยตนเองได้ การตั้งค่าปัจจุบันจะถูกเขียนทับ"
|
||||
compress: "บีบอัด"
|
||||
right: "ขวา"
|
||||
bottom: "ล่าง"
|
||||
top: "บน"
|
||||
embed: "ฝัง"
|
||||
settingsMigrating: "กำลังย้ายการตั้งค่า กรุณารอสักครู่... (สามารถย้ายด้วยตนเองภายหลังได้ที่ การตั้งค่า → อื่นๆ → ย้ายข้อมูลการตั้งค่าเก่า)"
|
||||
readonly: "อ่านได้อย่างเดียว"
|
||||
goToDeck: "กลับไปยังเด็ค"
|
||||
federationJobs: "งานสหพันธ์"
|
||||
@@ -1409,6 +1406,7 @@ presets: "พรีเซ็ต"
|
||||
zeroPadding: "ห่างเป็น 0"
|
||||
nothingToConfigure: "ไม่มีอะไรให้ต้ังค่า"
|
||||
viewRenotedChannel: "แสดงช่องที่ถูกรีโน้ต"
|
||||
previewingThemeRestore: "เลิกทำ"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "แคปชั่นของไฟล์"
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
---
|
||||
+1
-3
@@ -1358,14 +1358,11 @@ information: "Hakkında"
|
||||
chat: "Sohbet"
|
||||
directMessage: "Kullanıcıyla sohbet et"
|
||||
directMessage_short: "Mesaj"
|
||||
migrateOldSettings: "Eski istemci ayarlarını taşıma"
|
||||
migrateOldSettings_description: "Bu işlem otomatik olarak yapılmalıdır, ancak herhangi bir nedenle geçiş başarısız olursa, geçiş işlemini manuel olarak kendin başlatabilirsin. Mevcut yapılandırma bilgileri üzerine yazılacaktır."
|
||||
compress: "Sıkıştır"
|
||||
right: "Sağ"
|
||||
bottom: "Alt"
|
||||
top: "Üst"
|
||||
embed: "Göm"
|
||||
settingsMigrating: "Ayarlar taşınıyor, lütfen bir dakika bekle... (Daha sonra Ayarlar→Diğerler→Eski ayarları taşı seçeneğine giderek manuel olarak da taşıyabilirsin)"
|
||||
readonly: "Sadece okuma"
|
||||
goToDeck: "Güverteye Dön"
|
||||
federationJobs: "Federasyon İşleri"
|
||||
@@ -1409,6 +1406,7 @@ presets: "Ön ayar"
|
||||
zeroPadding: "Sıfır doldurma"
|
||||
nothingToConfigure: "Ayarlar seçeneği bulunmamaktadır."
|
||||
viewRenotedChannel: "Show renoted channel"
|
||||
previewingThemeRestore: "Geri yükle"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "Dosya başlığı"
|
||||
|
||||
+501
-13
@@ -5,6 +5,7 @@ introMisskey: "Ласкаво просимо! Misskey - децентралізо
|
||||
poweredByMisskeyDescription: "{name} є одним із сервісів (які називаються інстансами Misskey), що використовують платформу з відкритим вихідним кодом <b>Misskey</b>."
|
||||
monthAndDay: "{month}/{day}"
|
||||
search: "Пошук"
|
||||
reset: "Скинути"
|
||||
notifications: "Сповіщення"
|
||||
username: "Ім'я користувача"
|
||||
password: "Пароль"
|
||||
@@ -49,6 +50,7 @@ unpin: "Відкріпити"
|
||||
copyContent: "Скопіювати контент"
|
||||
copyLink: "Скопіювати посилання"
|
||||
copyRemoteLink: "Копіювати віддалене посилання"
|
||||
copyLinkRenote: "Копіювати посилання на поширення"
|
||||
delete: "Видалити"
|
||||
deleteAndEdit: "Видалити й редагувати"
|
||||
deleteAndEditConfirm: "Ви впевнені, що хочете видалити цю нотатку та відредагувати її? Ви втратите всі реакції, поширення та відповіді на неї."
|
||||
@@ -58,8 +60,10 @@ sendMessage: "Надіслати повідомлення"
|
||||
copyRSS: "Скопіювати RSS"
|
||||
copyUsername: "Скопіювати ім’я користувача"
|
||||
copyUserId: "Копіювати ID користувача"
|
||||
copyNoteId: "блокнот ID користувача"
|
||||
copyNoteId: "Копіювати ID нотатки"
|
||||
copyFileId: "Скопіювати ідентифікатор файлу."
|
||||
copyFolderId: "Копіювати ID теки"
|
||||
copyProfileUrl: "Копіювати URL профілю"
|
||||
searchUser: "Пошук користувачів"
|
||||
searchThisUsersNotes: "Пошук нотаток користувача"
|
||||
reply: "Відповісти"
|
||||
@@ -79,6 +83,8 @@ files: "Файли"
|
||||
download: "Завантажити"
|
||||
driveFileDeleteConfirm: "Ви впевнені, що хочете видалити файл {name}? Нотатки із цим файлом також буде видалено."
|
||||
unfollowConfirm: "Ви впевнені, що хочете відписатися від {name}?"
|
||||
cancelFollowRequestConfirm: "Ви впевнені, що хочете скасувати запит на підписку до {name}?"
|
||||
rejectFollowRequestConfirm: "Ви впевнені, що хочете відхилити запит на підписку від {name}?"
|
||||
exportRequested: "Експортування розпочато. Це може зайняти деякий час. Після завершення експорту отриманий файл буде додано на диск."
|
||||
importRequested: "Імпортування розпочато. Це може зайняти деякий час."
|
||||
lists: "Списки"
|
||||
@@ -115,6 +121,9 @@ cantRenote: "Неможливо поширити."
|
||||
cantReRenote: "Поширення не можливо поширити."
|
||||
quote: "Цитата"
|
||||
inChannelRenote: "Поширено у канал"
|
||||
inChannelQuote: "Цитата в каналі"
|
||||
renoteToChannel: "Поширити в канал"
|
||||
renoteToOtherChannel: "Поширити в інший канал"
|
||||
pinnedNote: "Закріплений запис"
|
||||
pinned: "Закріпити"
|
||||
you: "Ви"
|
||||
@@ -124,14 +133,22 @@ add: "Додати"
|
||||
reaction: "Реакції"
|
||||
reactions: "Реакції"
|
||||
emojiPicker: "Вибір реакції"
|
||||
pinnedEmojisForReactionSettingDescription: "Виберіть емодзі, які будуть закріплені й зображатимуться під час реакції"
|
||||
pinnedEmojisSettingDescription: "Виберіть емодзі, які будуть закріплені й зображатимуться під час перегляду вибору емодзі"
|
||||
emojiPickerDisplay: "Зображення вибору емодзі"
|
||||
overwriteFromPinnedEmojisForReaction: "Перевизначити налаштування реакцій"
|
||||
overwriteFromPinnedEmojis: "Перевизначити загальні налаштування"
|
||||
reactionSettingDescription2: "Перемістити щоб змінити порядок, Клацнути мишою щоб видалити, Натиснути \"+\" щоб додати."
|
||||
rememberNoteVisibility: "Пам’ятати параметри видимісті"
|
||||
attachCancel: "Видалити вкладення"
|
||||
deleteFile: "Видалити файл"
|
||||
markAsSensitive: "Позначити як NSFW"
|
||||
unmarkAsSensitive: "Зняти позначку NSFW"
|
||||
enterFileName: "Введіть ім'я файлу"
|
||||
mute: "Ігнорувати"
|
||||
unmute: "Показувати"
|
||||
renoteMute: "Приховати поширення"
|
||||
renoteUnmute: "Показувати поширення"
|
||||
block: "Заблокувати"
|
||||
unblock: "Розблокувати"
|
||||
suspend: "Призупинити"
|
||||
@@ -141,21 +158,26 @@ unblockConfirm: "Ви впевнені, що хочете розблокуват
|
||||
suspendConfirm: "Ви впевнені, що хочете призупинити цей акаунт?"
|
||||
unsuspendConfirm: "Ви впевнені, що хочете відновити цей акаунт?"
|
||||
selectList: "Виберіть список"
|
||||
editList: "Редагувати список."
|
||||
editList: "Редагувати список"
|
||||
selectChannel: "Виберіть канал"
|
||||
selectAntenna: "Виберіть антену"
|
||||
editAntenna: "Редагувати антену"
|
||||
createAntenna: "Створити антену"
|
||||
selectWidget: "Виберіть віджет"
|
||||
editWidgets: "Редагувати віджети"
|
||||
editWidgetsExit: "Готово"
|
||||
customEmojis: "Кастомні емоджі"
|
||||
emoji: "Емоджі"
|
||||
emojis: "Емоджі"
|
||||
emojiName: "Назва емоджі"
|
||||
emoji: "Емодзі"
|
||||
emojis: "Емодзі"
|
||||
emojiName: "Назва емодзі"
|
||||
emojiUrl: "URL емодзі"
|
||||
addEmoji: "Додати емодзі"
|
||||
settingGuide: "Рекомендована конфігурація"
|
||||
cacheRemoteFiles: "Кешувати дані з інших інстансів"
|
||||
cacheRemoteFilesDescription: "Якщо кешування вимкнено, віддалені файли завантажуються безпосередньо з віддаленого інстансу. Це зменшує використання сховища, але збільшує трафік, оскільки не генеруются ескізи."
|
||||
youCanCleanRemoteFilesCache: "Ви можете очистити кеш, натиснувши кнопку 🗑️ у вікні керування файлами."
|
||||
cacheRemoteSensitiveFiles: "Кешувати чутливі віддалені файли"
|
||||
cacheRemoteSensitiveFilesDescription: "Ви можете очистити кеш, натиснувши кнопку 🗑️ у вікні керування файлами."
|
||||
flagAsBot: "Акаунт бота"
|
||||
flagAsBotDescription: "Ввімкніть якщо цей обліковий запис використовується ботом. Ця опція позначить обліковий запис як бота. Це потрібно щоб виключити безкінечну інтеракцію між ботами а також відповідного підлаштування Misskey."
|
||||
flagAsCat: "Акаунт кота"
|
||||
@@ -164,8 +186,13 @@ flagShowTimelineReplies: "Показувати відповіді на нота
|
||||
flagShowTimelineRepliesDescription: "Показує відповіді користувачів на нотатки інших користувачів на часовій шкалі."
|
||||
autoAcceptFollowed: "Автоматично приймати запити на підписку від користувачів, на яких ви підписані"
|
||||
addAccount: "Додати акаунт"
|
||||
reloadAccountsList: "Оновити список акаунтів"
|
||||
loginFailed: "Не вдалося увійти"
|
||||
showOnRemote: "Переглянути в оригіналі"
|
||||
continueOnRemote: "Продовжити на віддаленому сервері"
|
||||
chooseServerOnMisskeyHub: "Вибрати сервер із Misskey Hub"
|
||||
specifyServerHost: "Вказати хост сервера вручну"
|
||||
inputHostName: "Введіть домен"
|
||||
general: "Загальне"
|
||||
wallpaper: "Шпалери"
|
||||
setWallpaper: "Встановити шпалери"
|
||||
@@ -176,6 +203,7 @@ followConfirm: "Підписатися на {name}?"
|
||||
proxyAccount: "Проксі-акаунт"
|
||||
proxyAccountDescription: "Обліковий запис проксі – це обліковий запис, який діє як віддалений підписник для користувачів за певних умов. Наприклад, коли користувач додає віддаленого користувача до списку, активність віддаленого користувача не буде доставлена на сервер, якщо жоден локальний користувач не стежить за цим користувачем, то замість нього буде використовуватися обліковий запис проксі-сервера."
|
||||
host: "Хост"
|
||||
selectSelf: "Вибрати себе"
|
||||
selectUser: "Виберіть користувача"
|
||||
recipient: "Отримувач"
|
||||
annotation: "Коментарі"
|
||||
@@ -190,8 +218,11 @@ perHour: "Щогодинно"
|
||||
perDay: "Щоденно"
|
||||
stopActivityDelivery: "Припинити розсилання активності"
|
||||
blockThisInstance: "Заблокувати цей інстанс"
|
||||
silenceThisInstance: "Обмежити цей інстанс"
|
||||
mediaSilenceThisInstance: "Обмежити медіа з цього сервера"
|
||||
operations: "Операції"
|
||||
software: "Програмне забезпечення"
|
||||
softwareName: "Програмне забезпечення"
|
||||
version: "Версія"
|
||||
metadata: "Метадані"
|
||||
withNFiles: "файли: {n}"
|
||||
@@ -209,6 +240,12 @@ clearCachedFiles: "Очистити кеш"
|
||||
clearCachedFilesConfirm: "Ви впевнені, що хочете видалити всі кешовані файли?"
|
||||
blockedInstances: "Заблоковані інстанси"
|
||||
blockedInstancesDescription: "Вкажіть інстанси, які потрібно заблокувати. Перелічені інстанси більше не зможуть спілкуватися з цим інстансом."
|
||||
silencedInstances: "Обмежені інстанси"
|
||||
silencedInstancesDescription: "Вкажіть імена хостів серверів, які потрібно обмежити, кожен з нового рядка. Усі облікові записи з указаних серверів вважатимуться обмеженими: вони зможуть лише надсилати запити на підписку та не зможуть згадувати локальні облікові записи, якщо ті на них не підписані. Це не вплине на заблоковані сервери."
|
||||
mediaSilencedInstances: "Сервери з обмеженими медіа"
|
||||
mediaSilencedInstancesDescription: "Вкажіть імена хостів серверів, для яких потрібно обмежити медіа, кожен з нового рядка. Усі облікові записи з указаних серверів вважатимуться чутливими, і вони не зможуть використовувати користувацькі емодзі. Це не вплине на заблоковані сервери."
|
||||
federationAllowedHosts: "Сервери, що підтримують федерацію"
|
||||
federationAllowedHostsDescription: "Вкажіть імена хостів серверів, з якими потрібно дозволити федерацію, кожне з нового рядка."
|
||||
muteAndBlock: "Заглушення і блокування"
|
||||
mutedUsers: "Заглушені користувачі"
|
||||
blockedUsers: "Заблоковані користувачі"
|
||||
@@ -218,6 +255,7 @@ noteDeleteConfirm: "Ви дійсно хочете видалити цей за
|
||||
pinLimitExceeded: "Більше записів не можна закріпити"
|
||||
done: "Готово"
|
||||
processing: "Обробка"
|
||||
preprocessing: "Підготовка"
|
||||
preview: "Попередній перегляд"
|
||||
default: "За умовчанням"
|
||||
defaultValueIs: "За промовчанням: {value}"
|
||||
@@ -252,6 +290,7 @@ removed: "Видалено"
|
||||
removeAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?"
|
||||
deleteAreYouSure: "Ви впевнені, що хочете видалити \"{x}\"?"
|
||||
resetAreYouSure: "Справді скинути?"
|
||||
areYouSure: "Ви впевнені?"
|
||||
saved: "Збережено"
|
||||
upload: "Завантажити"
|
||||
keepOriginalUploading: "Зберегти оригінальне зображення"
|
||||
@@ -262,12 +301,18 @@ uploadFromUrl: "Завантажити з посилання"
|
||||
uploadFromUrlDescription: "Посилання на файл для завантаження"
|
||||
uploadFromUrlRequested: "Завантаження розпочалось"
|
||||
uploadFromUrlMayTakeTime: "Завантаження може зайняти деякий час."
|
||||
uploadNFiles: "Завантажити {n} файлів"
|
||||
explore: "Огляд"
|
||||
messageRead: "Прочитано"
|
||||
readAllChatMessages: "Позначити всі повідомлення як прочитані"
|
||||
noMoreHistory: "Подальшої історії немає"
|
||||
startChat: "Почати чат"
|
||||
nUsersRead: "Прочитали {n}"
|
||||
agreeTo: "Я погоджуюсь з {0}"
|
||||
agree: "Гаразд"
|
||||
agreeBelow: "Я погоджуюся з наведеним нижче"
|
||||
basicNotesBeforeCreateAccount: "Важливі нотатки"
|
||||
termsOfService: "Умови використання"
|
||||
start: "Розпочати"
|
||||
home: "Домівка"
|
||||
remoteUserCaution: "Інформація може бути неповною, оскільки це віддалений користувач."
|
||||
@@ -286,12 +331,15 @@ dark: "Темна"
|
||||
lightThemes: "Світлі теми"
|
||||
darkThemes: "Темні теми"
|
||||
syncDeviceDarkMode: "Синхронізувати темний режим із налаштуваннями вашого пристрою"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "Увімкнено «{x}». Бажаєте вимкнути синхронізацію та перемикати режими вручну?\n"
|
||||
drive: "Диск"
|
||||
fileName: "Ім'я файлу"
|
||||
selectFile: "Вибрати файл"
|
||||
selectFiles: "Вибрати файли"
|
||||
selectFolder: "Вибрати теку"
|
||||
unselectFolder: "Скасувати вибір теки"
|
||||
selectFolders: "Вибрати теки"
|
||||
fileNotSelected: "Файл не вибрано"
|
||||
renameFile: "Перейменувати файл"
|
||||
folderName: "Ім'я теки"
|
||||
createFolder: "Створити теку"
|
||||
@@ -302,6 +350,7 @@ addFile: "Додати файл"
|
||||
showFile: "Показати файл"
|
||||
emptyDrive: "Диск порожній"
|
||||
emptyFolder: "Тека порожня"
|
||||
dropHereToUpload: "Перетягніть файли сюди, щоб завантажити"
|
||||
unableToDelete: "Видалення неможливе"
|
||||
inputNewFileName: "Введіть ім'я нового файлу"
|
||||
inputNewDescription: "Введіть новий заголовок"
|
||||
@@ -353,7 +402,7 @@ pinnedUsers: "Закріплені користувачі"
|
||||
pinnedUsersDescription: "Впишіть в список користувачів, яких хочете закріпити на сторінці \"Знайти\", ім'я в стовпчик."
|
||||
pinnedPages: "Закріплені сторінки"
|
||||
pinnedPagesDescription: "Введіть шляхи сторінок, які ви бажаєте закріпити на головній сторінці цього інстанса, розділені новими рядками."
|
||||
pinnedClipId: "Ідентифікатор закріпленої замітки."
|
||||
pinnedClipId: "Ідентифікатор закріпленої добірки."
|
||||
pinnedNotes: "Закріплена нотатка"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "Увімкнути hCaptcha"
|
||||
@@ -379,9 +428,11 @@ name: "Ім'я"
|
||||
antennaSource: "Джерело антени"
|
||||
antennaKeywords: "Ключові слова антени"
|
||||
antennaExcludeKeywords: "Винятки"
|
||||
antennaExcludeBots: "Виключити облікові записи ботів"
|
||||
antennaKeywordsDescription: "Розділення ключових слів пробілами для \"І\" або з нової лінійки для \"АБО\""
|
||||
notifyAntenna: "Сповіщати про нові нотатки"
|
||||
withFileAntenna: "Тільки нотатки з вкладеними файлами"
|
||||
excludeNotesInSensitiveChannel: "Виключати нотатки з чутливих каналів"
|
||||
enableServiceworker: "Увімкнути ServiceWorker"
|
||||
antennaUsersDescription: "Список імя користувачів в стопчик"
|
||||
caseSensitive: "З урахуванням регістру"
|
||||
@@ -406,14 +457,23 @@ aboutMisskey: "Про Misskey"
|
||||
administrator: "Адмін"
|
||||
token: "Токен"
|
||||
2fa: "Двофакторна аутентифікація"
|
||||
setupOf2fa: "Налаштувати двофакторну автентифікацію"
|
||||
totp: "Програма аутентифікації"
|
||||
totpDescription: "Використовуйте застосунок-автентифікатор для введення одноразових паролів"
|
||||
moderator: "Модератор"
|
||||
moderation: "Модерація"
|
||||
moderationNote: "Модераторська нотатка"
|
||||
moderationNoteDescription: "Ви можете додати нотатки, які будуть доступні лише модераторам.\n"
|
||||
addModerationNote: "Додати модераторську нотатку"
|
||||
moderationLogs: "Журнали модерації"
|
||||
nUsersMentioned: "Згадали: {n}"
|
||||
securityKeyAndPasskey: "Ключі безпеки та ключі доступу"
|
||||
securityKey: "Ключ захисту"
|
||||
lastUsed: "Востаннє використано"
|
||||
lastUsedAt: "Востаннє використано: {t}"
|
||||
unregister: "Скасувати реєстрацію"
|
||||
passwordLessLogin: "Налаштувати вхід без пароля"
|
||||
passwordLessLoginDescription: "Дозволяє вхід без пароля лише за допомогою ключа безпеки або ключа доступу"
|
||||
resetPassword: "Скинути пароль"
|
||||
newPasswordIs: "Новий пароль: {password}"
|
||||
reduceUiAnimation: "Зменшити анімацію інтерфейсу"
|
||||
@@ -438,8 +498,10 @@ retype: "Введіть ще раз"
|
||||
noteOf: "Нотатка {user}"
|
||||
quoteAttached: "Цитата"
|
||||
quoteQuestion: "Ви хочете додати цитату?"
|
||||
attachAsFileQuestion: "Текст у буфері обміну довгий. Хочете прикріпити його як текстовий файл?"
|
||||
onlyOneFileCanBeAttached: "До повідомлення можна вкласти лише один файл"
|
||||
signinRequired: "Будь ласка, авторизуйтесь"
|
||||
signinOrContinueOnRemote: "Щоб продовжити, потрібно перейти на свій сервер або зареєструватися / увійти на цей сервер."
|
||||
invitations: "Запрошення"
|
||||
invitationCode: "Код запрошення"
|
||||
checking: "Перевірка…"
|
||||
@@ -459,7 +521,14 @@ or: "або"
|
||||
language: "Мова"
|
||||
uiLanguage: "Мова інтерфейсу"
|
||||
aboutX: "Про {x}"
|
||||
emojiStyle: "Стиль емодзі"
|
||||
native: "місцевий"
|
||||
menuStyle: "Стиль меню"
|
||||
style: "Стиль"
|
||||
drawer: "Панель"
|
||||
popup: "Спливаючі вікна"
|
||||
showNoteActionsOnlyHover: "Показувати дії з нотаткою лише при наведенні"
|
||||
showReactionsCount: "Показувати кількість реакцій у нотатках"
|
||||
noHistory: "Історія порожня"
|
||||
signinHistory: "Історія входів"
|
||||
enableAdvancedMfm: "Увімкнути розширений MFM"
|
||||
@@ -469,9 +538,12 @@ category: "Категорія"
|
||||
tags: "Теги"
|
||||
docSource: "Джерело цього документа"
|
||||
createAccount: "Створити акаунт"
|
||||
existingAccount: "Існуючий обліковий запис"
|
||||
existingAccount: "Існуючий акаунт"
|
||||
regenerate: "Оновити"
|
||||
fontSize: "Розмір шрифту"
|
||||
mediaListWithOneImageAppearance: "Висота списків медіа лише з одним зображенням"
|
||||
limitTo: "Обмежити до {x}"
|
||||
showMediaListByGridInWideArea: "Відображати список медіа у вигляді сітки, коли екран достатньо широкий"
|
||||
noFollowRequests: "Немає запитів на підписку"
|
||||
openImageInNewTab: "Відкрити зображення в новій вкладці"
|
||||
dashboard: "Панель приладів"
|
||||
@@ -482,7 +554,7 @@ weekOverWeekChanges: "Тиждень"
|
||||
dayOverDayChanges: "Доба"
|
||||
appearance: "Вигляд"
|
||||
clientSettings: "Налаштування клієнта"
|
||||
accountSettings: "Налаштування акаунта"
|
||||
accountSettings: "Налаштування акаунту"
|
||||
promotion: "Виділене"
|
||||
promote: "Виділити"
|
||||
numberOfDays: "Кількість днів"
|
||||
@@ -505,19 +577,27 @@ objectStorageUseSSLDesc: "Вимкніть коли не використову
|
||||
objectStorageUseProxy: "Використовувати Proxy"
|
||||
objectStorageUseProxyDesc: "Вимкніть коли проксі не використовується для з'єднання ObjectStorage"
|
||||
objectStorageSetPublicRead: "Встановіть 'публічне читання' при завантаженні"
|
||||
s3ForcePathStyleDesc: "Якщо увімкнено s3ForcePathStyle, назва бакету має бути включена до шляху URL, а не до імені хосту URL. Можливо, вам потрібно ввімкнути це налаштування під час використання таких сервісів, як власний екземпляр Minio."
|
||||
serverLogs: "Журнал сервера"
|
||||
deleteAll: "Видалити все"
|
||||
showFixedPostForm: "Показати форму запису над стрічкою новин."
|
||||
showFixedPostFormInChannel: "Відображати форму публікації вгорі стрічки (Канали)"
|
||||
withRepliesByDefaultForNewlyFollowed: "Типово включати відповіді нових користувачів, на яких ви підписалися, до стрічки"
|
||||
newNoteRecived: "Є нові нотатки"
|
||||
newNote: "Нова нотатка"
|
||||
sounds: "Звуки"
|
||||
sound: "Звуки"
|
||||
notificationSoundSettings: "Вибрати звук сповіщення"
|
||||
listen: "Слухати"
|
||||
none: "Відсутній"
|
||||
showInPage: "Показати на сторінці"
|
||||
popout: "Від'єднати"
|
||||
volume: "Гучність"
|
||||
masterVolume: "Загальна гучність"
|
||||
notUseSound: "Вимкнути звук"
|
||||
useSoundOnlyWhenActive: "Відтворювати звуки лише коли Misskey активний"
|
||||
details: "Детальніше"
|
||||
renoteDetails: "Деталі поширення"
|
||||
chooseEmoji: "Виберіть емодзі"
|
||||
unableToProcess: "Не вдається завершити операцію"
|
||||
recentUsed: "Нещодавні"
|
||||
@@ -533,23 +613,32 @@ ascendingOrder: "За зростанням"
|
||||
descendingOrder: "За спаданням"
|
||||
scratchpad: "Scratchpad"
|
||||
scratchpadDescription: "Scratchpad надає середовище для експериментів з AiScript. Ви можете писати, виконувати його і тестувати взаємодію з Misskey."
|
||||
uiInspector: "Інспектор UI"
|
||||
uiInspectorDescription: "Ви можете переглянути список серверних компонентів інтерфейсу в памʼяті. Компонент інтерфейсу буде згенеровано функцією Ui:C:."
|
||||
output: "Вихід"
|
||||
script: "Скрипт"
|
||||
disablePagesScript: "Вимкнути AiScript на Сторінках"
|
||||
updateRemoteUser: "Оновити інформацію про віддаленого користувача"
|
||||
unsetUserAvatar: "Деактивувати піктограму."
|
||||
unsetUserAvatarConfirm: " Ви впевнені, що хочете прибрати аватар?"
|
||||
unsetUserBanner: "Випустити прапор."
|
||||
unsetUserBannerConfirm: "Ви впевнені, що хочете прибрати банер?"
|
||||
deleteAllFiles: "Видалити всі файли"
|
||||
deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?"
|
||||
removeAllFollowing: "Скасувати всі підписки"
|
||||
removeAllFollowingDescription: "Скасувати підписку на всі акаунти з {host}. Будь ласка, робіть це, якщо інстанс більше не існує."
|
||||
userSuspended: "Обліковий запис заблокований."
|
||||
userSilenced: "Обліковий запис приглушений."
|
||||
yourAccountSuspendedTitle: "Цей обліковий запис заблоковано"
|
||||
yourAccountSuspendedTitle: "Цей акаунт заблоковано"
|
||||
yourAccountSuspendedDescription: "Цей обліковий запис було заблоковано через порушення умов надання послуг сервера. Зв'яжіться з адміністратором, якщо ви хочете дізнатися докладнішу причину. Будь ласка, не створюйте новий обліковий запис."
|
||||
tokenRevoked: "Недійсний токен"
|
||||
tokenRevokedDescription: "Термін дії цього токена минув. Увійдіть знову."
|
||||
accountDeleted: "Акаунт видалено"
|
||||
accountDeletedDescription: "Цей акаунт було видалено."
|
||||
menu: "Меню"
|
||||
divider: "Розділювач"
|
||||
addItem: "Додати елемент"
|
||||
rearrange: "Сортувати за"
|
||||
relays: "Ретранслятори"
|
||||
addRelay: "Додати ретранслятор"
|
||||
inboxUrl: "Inbox URL"
|
||||
@@ -584,6 +673,7 @@ medium: "Середній"
|
||||
small: "Маленький"
|
||||
generateAccessToken: "Згенерувати токен доступу"
|
||||
permission: "Права"
|
||||
adminPermission: "Права адміністратора"
|
||||
enableAll: "Увімкнути все"
|
||||
disableAll: "Вимкнути все"
|
||||
tokenRequested: "Надати доступ до акаунту"
|
||||
@@ -605,13 +695,19 @@ smtpSecure: "Використовувати безумовне шифруван
|
||||
smtpSecureInfo: "Вимкніть при використанні STARTTLS "
|
||||
testEmail: "Тестовий email"
|
||||
wordMute: "Блокування слів"
|
||||
wordMuteDescription: "Згортати нотатки, що містять указане слово або фразу. Згорнуті нотатки можна показати, натиснувши на них."
|
||||
hardWordMute: "Повне приховування слів"
|
||||
showMutedWord: "Показати приховані слова"
|
||||
hardWordMuteDescription: "Приховувати нотатки, що містять указане слово або фразу. На відміну від приховування слів, нотатку буде повністю приховано з перегляду."
|
||||
regexpError: "Помилка регулярного виразу"
|
||||
regexpErrorDescription: "Сталася помилка в регулярному виразі в рядку {line} вашого слова {tab} слова що ігноруються:"
|
||||
instanceMute: "Приглушення інстансів"
|
||||
userSaysSomething: "{name} щось сказав(ла)"
|
||||
userSaysSomethingAbout: "{name} згадує «{word}»"
|
||||
makeActive: "Активувати"
|
||||
display: "Відображення"
|
||||
copy: "Скопіювати"
|
||||
copiedToClipboard: "Скопійовано до буфера обміну"
|
||||
metrics: "Показники"
|
||||
overview: "Огляд"
|
||||
logs: "Журнал"
|
||||
@@ -626,14 +722,16 @@ useGlobalSettingDesc: "Якщо увімкнено, то будуть викор
|
||||
other: "Інше"
|
||||
regenerateLoginToken: "Оновити Login Token"
|
||||
regenerateLoginTokenDescription: "Регенерувати внутрішній ключ використовуваний під час входу. Зазвичай цього не потрібно робити. При регенерації всі пристрої вийдуть з системи."
|
||||
theKeywordWhenSearchingForCustomEmoji: "Це ключове слово для пошуку користувацьких емодзі."
|
||||
setMultipleBySeparatingWithSpace: "Можна вказати кілька значень, відділивши їх пробілом."
|
||||
fileIdOrUrl: "Ідентифікатор файлу або посилання"
|
||||
behavior: "Поведінка"
|
||||
sample: "Приклад"
|
||||
abuseReports: "Скарги"
|
||||
reportAbuse: "Поскаржитись"
|
||||
reportAbuseRenote: "Поскаржитися на поширення"
|
||||
reportAbuseOf: "Поскаржитись на {name}"
|
||||
fillAbuseReportDescription: "Будь ласка вкажіть подробиці скарги. Якщо скарга стосується запису, вкажіть посилання на нього."
|
||||
fillAbuseReportDescription: "Будь ласка, вкажіть подробиці скарги. Якщо скарга стосується запису, вкажіть посилання на нього."
|
||||
abuseReported: "Дякуємо, вашу скаргу було відправлено. "
|
||||
reporter: "Репортер"
|
||||
reporteeOrigin: "Про кого повідомлено"
|
||||
@@ -652,9 +750,9 @@ desktop: "Десктоп"
|
||||
clip: "Добірка"
|
||||
createNew: "Створити новий"
|
||||
optional: "Необов'язково"
|
||||
createNewClip: "Створити нотатку"
|
||||
createNewClip: "Створити добірку"
|
||||
unclip: "Незакріплений"
|
||||
confirmToUnclipAlreadyClippedNote: "Ця нотатка вже включена до кліпу \"{name}\". Ви хочете виключити нотатку з цього кліпу?"
|
||||
confirmToUnclipAlreadyClippedNote: "Ця нотатка вже включена до добірки \"{name}\". Ви хочете виключити нотатку з цього кліпу?"
|
||||
public: "Публічний"
|
||||
private: "Приватне"
|
||||
i18nInfo: "Misskey перекладається на різні мови волонтерами. Ви можете допомогти: {link}"
|
||||
@@ -681,6 +779,8 @@ lockedAccountInfo: "Якщо видимість вашого запису не
|
||||
alwaysMarkSensitive: "Позначати NSFW за замовчуванням"
|
||||
loadRawImages: "Відображати вкладені зображення повністю замість ескізів"
|
||||
disableShowingAnimatedImages: "Не програвати анімовані зображення"
|
||||
disableShowingAnimatedImages_caption: "Якщо анімовані зображення не відтворюються навіть коли це налаштування вимкнено, причиною можуть бути налаштування доступності браузера чи ОС, режим енергоощадження"
|
||||
highlightSensitiveMedia: "Виділяти чутливі медіа"
|
||||
verificationEmailSent: "Електронний лист з підтвердженням відісланий. Будь ласка перейдіть по посиланню в листі для підтвердження."
|
||||
notSet: "Не налаштовано"
|
||||
emailVerified: "Електронну пошту підтверджено."
|
||||
@@ -691,6 +791,8 @@ contact: "Контакт"
|
||||
useSystemFont: "Використовувати стандартний шрифт системи"
|
||||
clips: "Добірки"
|
||||
experimentalFeatures: "Експериментальні функції"
|
||||
experimental: "Експериментальні"
|
||||
thisIsExperimentalFeature: "Це експериментальна функція. Її можливості можуть змінюватися, і вона може працювати не так, як очікується."
|
||||
developer: "Розробник"
|
||||
makeExplorable: "Зробіть обліковий запис видимим у розділі \"Огляд\""
|
||||
makeExplorableDescription: "Вимкніть, щоб обліковий запис не показувався у розділі \"Огляд\"."
|
||||
@@ -701,6 +803,7 @@ wide: "Широкий"
|
||||
narrow: "Вузький"
|
||||
reloadToApplySetting: "Налаштування ввійде в дію при перезавантаженні. Перезавантажити?"
|
||||
needReloadToApply: "Зміни набудуть чинності після перезавантаження сторінки."
|
||||
needToRestartServerToApply: "Щоб застосувати зміну, потрібно перезапустити Misskey."
|
||||
showTitlebar: "Показати титульний рядок"
|
||||
clearCache: "Очистити кеш"
|
||||
onlineUsersCount: "{n} користувачів онлайн"
|
||||
@@ -754,6 +857,7 @@ userInfo: "Інформація про користувача"
|
||||
unknown: "Невідомо"
|
||||
onlineStatus: "Онлайн статус"
|
||||
hideOnlineStatus: "Приховати онлайн статус."
|
||||
hideOnlineStatusDescription: "Приховування вашого онлайн-статусу може обмежити зручність деяких функцій, зокрема пошуку."
|
||||
online: "Онлайн"
|
||||
active: "Активовано"
|
||||
offline: "Офлайн"
|
||||
@@ -770,9 +874,11 @@ administration: "Управління"
|
||||
accounts: "Акаунти"
|
||||
switch: "Перемкнути"
|
||||
noMaintainerInformationWarning: "Інформація про адміністраторів не налаштована"
|
||||
noInquiryUrlWarning: "URL для звернень не встановлено"
|
||||
noBotProtectionWarning: "Захист від ботів не налаштовано"
|
||||
configure: "Налаштувати"
|
||||
postToGallery: "Допис у галерею"
|
||||
postToHashtag: "Опублікувати з цим хештегом"
|
||||
gallery: "Галерея"
|
||||
recentPosts: "Нещодавні дописи"
|
||||
popularPosts: "Популярні дописи"
|
||||
@@ -789,6 +895,7 @@ emailNotConfiguredWarning: "Email адреса не вказана"
|
||||
ratio: "Співвідношення"
|
||||
previewNoteText: "Показати передогляд"
|
||||
customCss: "Власний CSS"
|
||||
customCssWarn: "Використовуйте це налаштування лише якщо розумієте, що воно робить. Неправильні значення можуть призвести до некоректної роботи клієнта."
|
||||
global: "Глобальна"
|
||||
squareAvatars: "Квадратні аватарки"
|
||||
sent: "Відправити"
|
||||
@@ -803,15 +910,20 @@ whatIsNew: "Показати зміни"
|
||||
translate: "Переклад"
|
||||
translatedFrom: "Переклад з {x}"
|
||||
accountDeletionInProgress: "Наразі триває видалення акаунту"
|
||||
usernameInfo: "Ім’я, яке відрізняє ваш обліковий запис від інших на цьому сервері. Можна використовувати латинські літери (az, AZ), цифри (0~9) або підкреслення (_). Ім’я користувача не можна буде змінити пізніше."
|
||||
aiChanMode: "Режим Ai"
|
||||
devMode: "Режим розробника"
|
||||
keepCw: "Зберігати попередження щодо вмісту"
|
||||
pubSub: "Акаунти Pub/Sub"
|
||||
lastCommunication: "Останній зв'язок"
|
||||
resolved: "Вирішено"
|
||||
unresolved: "Не вирішено"
|
||||
breakFollow: "Видалити підписника"
|
||||
breakFollowConfirm: "Справді видалити цього підписника?"
|
||||
itsOn: "Увімкнено"
|
||||
itsOff: "Вимкнено"
|
||||
on: "Увімкнено"
|
||||
off: "Вимкнено"
|
||||
emailRequiredForSignup: "Вимагати email адресу для реєстрації"
|
||||
unread: "Непрочитане"
|
||||
filter: "Фільтр"
|
||||
@@ -822,11 +934,15 @@ makeReactionsPublicDescription: "Це зробить список усіх ва
|
||||
classic: "Класичний"
|
||||
muteThread: "Приглушити тред"
|
||||
unmuteThread: "Скасувати глушіння"
|
||||
followingVisibility: "Видимість підписок"
|
||||
followersVisibility: "Visibility of followers"
|
||||
continueThread: "Показати продовження треду"
|
||||
deleteAccountConfirm: "Це незворотно видалить ваш акаунт. Продовжити?"
|
||||
incorrectPassword: "Неправильний пароль."
|
||||
incorrectTotp: "Одноразовий пароль неправильний або його термін дії минув."
|
||||
voteConfirm: "Підтверджуєте свій голос за \"{choice}\"?"
|
||||
hide: "Сховати"
|
||||
useDrawerReactionPickerForMobile: "Показувати вибір реакцій як висувну панель на мобільних пристроях"
|
||||
welcomeBackWithName: "З поверненням, {name}!"
|
||||
clickToFinishEmailVerification: "Натисніть [{ok}], щоб завершити перевірку email."
|
||||
overridedDeviceKind: "Тип пристрою"
|
||||
@@ -839,6 +955,7 @@ numberOfColumn: "Кількість стовпців"
|
||||
searchByGoogle: "Пошук"
|
||||
instanceDefaultLightTheme: "Світла тема за промовчанням"
|
||||
instanceDefaultDarkTheme: "Темна тема за промовчанням"
|
||||
instanceDefaultThemeDescription: "Введіть код теми у форматі об’єкта."
|
||||
mutePeriod: "Тривалість приховування"
|
||||
period: "Опитування закінчується"
|
||||
indefinitely: "Ніколи"
|
||||
@@ -846,25 +963,35 @@ tenMinutes: "10 хвилин"
|
||||
oneHour: "1 година"
|
||||
oneDay: "1 день"
|
||||
oneWeek: "1 тиждень"
|
||||
oneMonth: "1 місяць"
|
||||
threeMonths: "3 months"
|
||||
oneYear: "1 рік"
|
||||
threeDays: "3 дні"
|
||||
reflectMayTakeTime: "Може знадобитися деякий час для відображення"
|
||||
failedToFetchAccountInformation: "Не вдалося отримати інформацію про акаунт"
|
||||
rateLimitExceeded: "Ліміт швидкості перевищено"
|
||||
cropImage: "Кадрування"
|
||||
cropImageAsk: "Бажаєте кадрувати це зображення?"
|
||||
cropYes: "Crop"
|
||||
cropNo: "Використати як є"
|
||||
file: "Файли"
|
||||
recentNHours: "Останні {n} годин"
|
||||
recentNDays: "Останні {n} днів"
|
||||
noEmailServerWarning: "Email сервер не налаштовано."
|
||||
thereIsUnresolvedAbuseReportWarning: "Є нерозглянуті скарги."
|
||||
recommended: "Рекомендоване"
|
||||
check: "Перевірити"
|
||||
driveCapOverrideLabel: "Змінити ємність диска для цього користувача"
|
||||
driveCapOverrideCaption: "Для скасування вкажіть 0 або менше."
|
||||
requireAdminForView: "Для перегляду ви повинні увійти в акаунт адміністратора."
|
||||
isSystemAccount: "Акаунт, створений і автоматично керований системою."
|
||||
typeToConfirm: "Введіть {x} для підтвердження"
|
||||
deleteAccount: "Видалення акаунту"
|
||||
document: "Документація"
|
||||
numberOfPageCache: "Кількість кешованих сторінок"
|
||||
numberOfPageCacheDescription: "Збільшення цього значення покращить зручність, але підвищить навантаження через більше використання пам’яті на пристрої користувача."
|
||||
logoutConfirm: "Справді вийти?"
|
||||
logoutWillClearClientData: "Вихід з облікового запису видалить налаштування клієнта з браузера. Щоб відновити налаштування після повторного входу, потрібно увімкнути автоматичне резервне копіювання налаштувань."
|
||||
lastActiveDate: "Останнє використання"
|
||||
statusbar: "Рядок стану"
|
||||
pleaseSelect: "Виберіть будь ласка"
|
||||
@@ -880,9 +1007,14 @@ sensitiveMediaDetection: "Виявлення NSFW"
|
||||
localOnly: "Локально"
|
||||
remoteOnly: "Тільки віддаленi"
|
||||
failedToUpload: "Збій завантаження"
|
||||
cannotUploadBecauseInappropriate: "Не вдалося завантажити цей файл, оскільки деякі його частини визначено як потенційно неприйнятні."
|
||||
cannotUploadBecauseNoFreeSpace: "Помилка завантаження через брак місця на Диску."
|
||||
cannotUploadBecauseExceedsFileSizeLimit: "Цей файл не можна завантажити, оскільки він перевищує обмеження розміру."
|
||||
cannotUploadBecauseUnallowedFileType: "Не вдалося завантажити файл через недозволений тип файлу."
|
||||
beta: "Бета"
|
||||
enableAutoSensitive: "Автоматичне маркування NSFW"
|
||||
enableAutoSensitiveDescription: "Дозволяє, за можливості, автоматично виявляти й позначати чутливі медіа за допомогою машинного навчання. Навіть якщо цю опцію вимкнено, вона може бути увімкнена на рівні інстансу."
|
||||
activeEmailValidationDescription: "Увімкнути суворішу перевірку адрес електронної пошти, зокрема перевірку на тимчасові адреси та можливість фактичного зв’язку з ними. Якщо вимкнено, перевірятиметься лише формат адреси."
|
||||
navbar: "Рядок навігації"
|
||||
shuffle: "Перемішати"
|
||||
account: "Акаунти"
|
||||
@@ -890,52 +1022,388 @@ move: "Пересунути"
|
||||
pushNotification: "Push сповіщення"
|
||||
subscribePushNotification: "Увімкнути push-сповіщення"
|
||||
unsubscribePushNotification: "Вимкнути push-сповіщення"
|
||||
pushNotificationAlreadySubscribed: "Push-сповіщення вже увімкнено"
|
||||
pushNotificationNotSupported: "Ваш браузер або інстанс не підтримує push-сповіщення"
|
||||
sendPushNotificationReadMessage: "Видаляти push-сповіщення після прочитання"
|
||||
sendPushNotificationReadMessageCaption: "Це може збільшити споживання енергії вашим пристроєм."
|
||||
pleaseAllowPushNotification: "Увімкніть push-сповіщення у браузері"
|
||||
browserPushNotificationDisabled: "Не вдалося отримати дозвіл на надсилання сповіщень"
|
||||
browserPushNotificationDisabledDescription: "Немає дозволу на надсилання сповіщень від {serverName}. Дозвольте сповіщення в налаштуваннях браузера й спробуйте ще раз."
|
||||
windowMaximize: "Розгорнути"
|
||||
windowMinimize: "Згорнути"
|
||||
windowRestore: "Відновити"
|
||||
caption: "Підпис"
|
||||
loggedInAsBot: "Зараз виконано вхід як бот"
|
||||
tools: "Інструменти"
|
||||
cannotLoad: "Не вдалося завантажити"
|
||||
numberOfProfileView: "Перегляди профілю"
|
||||
like: "Вподобати"
|
||||
unlike: "Не вподобати"
|
||||
numberOfLikes: "Вподобання"
|
||||
show: "Відображення"
|
||||
neverShow: "Більше не показувати"
|
||||
remindMeLater: "Можливо, пізніше"
|
||||
didYouLikeMisskey: "Вам сподобався Misskey?"
|
||||
pleaseDonate: "{host} використовує вільне програмне забезпечення Misskey. Ми будемо дуже вдячні за ваші донати, щоб розробка Misskey могла тривати!"
|
||||
correspondingSourceIsAvailable: "Відповідний вихідний код доступний за посиланням: {anchor}"
|
||||
roles: "Ролі"
|
||||
role: "Роль"
|
||||
noRole: "Роль не знайдено"
|
||||
normalUser: "Звичайний користувач"
|
||||
undefined: "Не визначено"
|
||||
assign: "Призначити"
|
||||
unassign: "Скасувати призначення"
|
||||
color: "Колір"
|
||||
manageCustomEmojis: "Керування користувацькими емодзі"
|
||||
manageAvatarDecorations: "Керувати прикрасами аватара"
|
||||
youCannotCreateAnymore: "Ви досягли ліміту створення."
|
||||
cannotPerformTemporary: "Тимчасово недоступний"
|
||||
cannotPerformTemporaryDescription: "Цю дію тимчасово неможливо виконати через перевищення ліміту виконання. Будь ласка, зачекайте трохи й спробуйте ще раз."
|
||||
invalidParamError: "Неправильні параметри"
|
||||
invalidParamErrorDescription: "Параметри запиту неправильні. Зазвичай це спричинено помилкою, але також може бути пов’язано з перевищенням обмежень розміру введених даних або подібними причинами."
|
||||
permissionDeniedError: "Операцію заборонено"
|
||||
permissionDeniedErrorDescription: "Цей обліковий запис не має дозволу на виконання цієї дії."
|
||||
preset: "Пресет"
|
||||
selectFromPresets: "Вибрати з пресетів"
|
||||
custom: "Користувацькі"
|
||||
achievements: "Досягнення"
|
||||
gotInvalidResponseError: "Неправильна відповідь сервера"
|
||||
gotInvalidResponseErrorDescription: "Сервер може бути недоступний або перебувати на технічному обслуговуванні. Будь ласка, спробуйте пізніше."
|
||||
thisPostMayBeAnnoying: "Ця нотатка може дратувати інших."
|
||||
thisPostMayBeAnnoyingHome: "Опублікувати в домашній стрічці"
|
||||
thisPostMayBeAnnoyingCancel: "Скасувати"
|
||||
thisPostMayBeAnnoyingIgnore: "Усе одно опублікувати"
|
||||
collapseRenotes: "Згортати поширення, які ви вже бачили"
|
||||
collapseRenotesDescription: "Згортати нотатки, на які ви вже відреагували або які поширили раніше."
|
||||
internalServerError: "Внутрішня помилка сервера"
|
||||
internalServerErrorDescription: "На сервері сталася неочікувана помилка."
|
||||
copyErrorInfo: "Скопіювати код помилки"
|
||||
joinThisServer: "Зареєструватися на цьому сервері"
|
||||
exploreOtherServers: "Знайти інший сервер"
|
||||
letsLookAtTimeline: "Перегляд історії"
|
||||
disableFederationConfirm: "Справді вимкнути федерацію?"
|
||||
disableFederationConfirmWarn: "Навіть якщо федерацію вимкнено, дописи залишатимуться публічними, якщо не вказано інше. Зазвичай вам не потрібно цього робити."
|
||||
disableFederationOk: "Не федерується"
|
||||
invitationRequiredToRegister: "Цей інстанс доступний лише за запрошенням. Щоб зареєструватися, потрібно ввести дійсний код запрошення."
|
||||
emailNotSupported: "Цей інстанс не підтримує надсилання електронних листів."
|
||||
postToTheChannel: "Опублікувати в каналі"
|
||||
cannotBeChangedLater: "Це не можна буде змінити пізніше."
|
||||
reactionAcceptance: "Прийняття реакцій"
|
||||
likeOnly: "Лише вподобання"
|
||||
likeOnlyForRemote: "Усі — лише вподобання для віддалених інстансів"
|
||||
nonSensitiveOnly: "Тільки нечутливий контент"
|
||||
nonSensitiveOnlyForLocalLikeOnlyForRemote: "Тільки нечутливий контент (тільки віддалені вподобання)"
|
||||
rolesAssignedToMe: "Ролі, призначені мені"
|
||||
resetPasswordConfirm: "Справді скинути пароль?"
|
||||
sensitiveWords: "Чутливі слова"
|
||||
sensitiveWordsDescription: "Видимість усіх нотаток, що містять будь-яке з налаштованих слів, автоматично буде встановлено на «Домашня». Можна вказати кілька слів, розділяючи їх переносами рядка."
|
||||
sensitiveWordsDescription2: "Використання пробілів створює AND-вирази, а ключові слова, взяті в скісні риски, перетворюються на регулярний вираз."
|
||||
prohibitedWords: "Заборонені слова"
|
||||
prohibitedWordsDescription: "Вмикає помилку під час спроби опублікувати нотатку, що містить налаштоване слово або слова. Можна вказати кілька слів, розділяючи їх новим рядком."
|
||||
prohibitedWordsDescription2: "Використання пробілів створює AND-вирази, а ключові слова, взяті в скісні риски, перетворюються на регулярний вираз."
|
||||
hiddenTags: "Приховані хештеги"
|
||||
hiddenTagsDescription: "Виберіть теги, які не зображатимуться у списку трендів. Можна зареєструвати кілька тегів, розділяючи їх рядками."
|
||||
notesSearchNotAvailable: "Пошук нотаток недоступний."
|
||||
usersSearchNotAvailable: "Пошук користувачів недоступний."
|
||||
license: "Ліцензія"
|
||||
unfavoriteConfirm: "Справді видалити з обраного?"
|
||||
myClips: "Мої добірки"
|
||||
drivecleaner: "Очищувач Диска\n"
|
||||
retryAllQueuesNow: "Повторно запустити всі черги"
|
||||
retryAllQueuesConfirmTitle: "Справді повторити все?"
|
||||
retryAllQueuesConfirmText: "Це тимчасово збільшить навантаження на сервер."
|
||||
enableChartsForRemoteUser: "Створити графіки даних віддалених користувачів"
|
||||
enableChartsForFederatedInstances: "Створити графіки даних віддалених інстансів"
|
||||
enableStatsForFederatedInstances: "Отримувати статистику віддаленого сервера"
|
||||
showClipButtonInNoteFooter: "Додати «Добірка» до меню дій нотатки"
|
||||
reactionsDisplaySize: "Розмір відображення реакцій"
|
||||
limitWidthOfReaction: "Обмежити максимальну ширину реакцій і показувати їх у зменшеному розмірі."
|
||||
noteIdOrUrl: "ID або URL нотатки"
|
||||
video: "Відео"
|
||||
videos: "Відео"
|
||||
audio: "Аудіо"
|
||||
audioFiles: "Аудіо"
|
||||
dataSaver: "Заощадження трафіку"
|
||||
accountMigration: "Міграція акаунту"
|
||||
accountMoved: "Цей користувач перейшов на новий акаунт:"
|
||||
accountMovedShort: "Цей акаунт було перенесено."
|
||||
operationForbidden: "Операцію заборонено"
|
||||
forceShowAds: "Завжди показувати рекламу"
|
||||
addMemo: "Додати пам'ятку"
|
||||
editMemo: "Редагувати пам'ятку"
|
||||
reactionsList: "Реакції"
|
||||
renotesList: "Поширення"
|
||||
notificationDisplay: "Сповіщення"
|
||||
leftTop: "Ліворуч зверху"
|
||||
rightTop: "Праворуч зверху"
|
||||
leftBottom: "Ліворуч знизу"
|
||||
rightBottom: "Праворуч знизу"
|
||||
stackAxis: "Напрямок накладання"
|
||||
vertical: "Вертикально"
|
||||
horizontal: "Збоку"
|
||||
position: "Позиція"
|
||||
serverRules: "Правила сервера"
|
||||
pleaseConfirmBelowBeforeSignup: "Щоб зареєструватися на цьому сервері, ви повинні переглянути та прийняти наведені нижче умови:"
|
||||
pleaseAgreeAllToContinue: "Щоб продовжити, потрібно погодитися з усіма полями вище.\n\n"
|
||||
continue: "Продовжити"
|
||||
preservedUsernames: "Зарезервовані імена користувачів"
|
||||
preservedUsernamesDescription: "Укажіть імена користувачів, які потрібно зарезервувати, розділяючи їх переносами рядка. Вони стануть недоступними під час звичайного створення облікового запису, але адміністратори зможуть використовувати їх для ручного створення облікових записів. Уже наявні облікові записи з такими іменами користувачів не будуть зачеплені."
|
||||
createNoteFromTheFile: "Створити нотатку з цього файла"
|
||||
archive: "Архів"
|
||||
archived: "Заархівовано"
|
||||
unarchive: "Розархівувати"
|
||||
channelArchiveConfirmTitle: "Справді архівувати {name}?"
|
||||
channelArchiveConfirmDescription: "Архівований канал більше не відображатиметься у списку каналів або результатах пошуку. До нього також більше не можна буде додавати нові дописи."
|
||||
thisChannelArchived: "Цей канал заархівовано."
|
||||
displayOfNote: "Відображення нотаток"
|
||||
initialAccountSetting: "Налаштування профілю"
|
||||
youFollowing: "Підписки"
|
||||
preventAiLearning: "Відхилити використання в машинному навчанні (генеративному ШІ)"
|
||||
preventAiLearningDescription: "Запит до пошукових роботів не використовувати опубліковані тексти, зображення тощо в наборах даних для машинного навчання (прогнозного / генеративного ШІ). Це досягається додаванням HTML-прапорця відповіді «noai» до відповідного вмісту. Однак повного запобігання за допомогою цього прапорця досягти неможливо, оскільки його можуть просто ігнорувати."
|
||||
options: "Опції"
|
||||
specifyUser: "Вказаний користувач"
|
||||
lookupConfirm: "Хочете дізнатись?"
|
||||
openTagPageConfirm: "Хочете відкрити сторінку хештега?"
|
||||
specifyHost: "Вказати хост"
|
||||
failedToPreviewUrl: "Не вдалося переглянути"
|
||||
update: "Оновити"
|
||||
rolesThatCanBeUsedThisEmojiAsReaction: "Ролі, які можуть використовувати цей емодзі як реакцію"
|
||||
rolesThatCanBeUsedThisEmojiAsReactionEmptyDescription: "Якщо ролі не вказано, будь-хто може використовувати цей емодзі як реакцію."
|
||||
rolesThatCanBeUsedThisEmojiAsReactionPublicRoleWarn: "Ці ролі мають бути публічними."
|
||||
cancelReactionConfirm: "Справді видалити вашу реакцію?"
|
||||
changeReactionConfirm: "Справді змінити вашу реакцію?"
|
||||
later: "Пізніше"
|
||||
goToMisskey: "До Misskey"
|
||||
additionalEmojiDictionary: "Додаткові словники емодзі"
|
||||
installed: "Встановлено"
|
||||
branding: "Брендинг"
|
||||
enableServerMachineStats: "Публікувати статистику серверного обладнання"
|
||||
enableIdenticonGeneration: "Увімкнути генерацію ідентиконів користувачів"
|
||||
showRoleBadgesOfRemoteUsers: "Відображати значки ролей, призначені віддаленим користувачам"
|
||||
turnOffToImprovePerformance: "Вимкнення цієї опції може підвищити продуктивність."
|
||||
createInviteCode: "Створити запрошення"
|
||||
createWithOptions: "Створити з параметрами"
|
||||
createCount: "Кількість запрошень"
|
||||
inviteCodeCreated: "Запрошення створено"
|
||||
inviteLimitExceeded: "Ви перевищили ліміт запрошень, які можете створити."
|
||||
createLimitRemaining: "Ліміт запрошень: залишилося {limit}"
|
||||
inviteLimitResetCycle: "Цей ліміт буде скинуто до {limit} о {time}."
|
||||
expirationDate: "Дата закінчення терміну дії"
|
||||
noExpirationDate: "Без закінчення терміну дії"
|
||||
inviteCodeUsedAt: "Код запрошення використано о"
|
||||
registeredUserUsingInviteCode: "Запрошення використав(-ла)"
|
||||
waitingForMailAuth: "Очікується підтвердження електронної пошти"
|
||||
inviteCodeCreator: "Запрошення створив(-ла)"
|
||||
usedAt: "Використано"
|
||||
unused: "Не використано"
|
||||
used: "Використаний"
|
||||
expired: "Термін дії минув"
|
||||
doYouAgree: "Погоджуєтеся?"
|
||||
beSureToReadThisAsItIsImportant: "Будь ласка, прочитайте цю важливу інформацію."
|
||||
iHaveReadXCarefullyAndAgree: "Я прочитав/прочитала текст «{x}» і погоджуюся."
|
||||
dialog: "Діалог"
|
||||
icon: "Аватар"
|
||||
forYou: "Для вас"
|
||||
currentAnnouncements: "Поточні оголошення"
|
||||
pastAnnouncements: "Минулі оголошення"
|
||||
youHaveUnreadAnnouncements: "Є непрочитані оголошення."
|
||||
useSecurityKey: "Дотримуйтеся інструкцій вашого браузера або пристрою, щоб скористатися ключем безпеки або passkey."
|
||||
replies: "Відповісти"
|
||||
renotes: "Поширити"
|
||||
loadReplies: "Показати відповіді"
|
||||
loadConversation: "Показати розмову"
|
||||
pinnedList: "Закріплений список"
|
||||
keepScreenOn: "Не вимикати екран"
|
||||
verifiedLink: "Право власності на посилання підтверджено"
|
||||
notifyNotes: "Сповіщати про нові нотатки"
|
||||
unnotifyNotes: "Припинити сповіщати про нові нотатки"
|
||||
notifyUsers: "Користувачі, які ввімкнули сповіщення про публікації"
|
||||
authentication: "Автентикація"
|
||||
authenticationRequiredToContinue: "Будь ласка, автентифікуйтеся, щоб продовжити"
|
||||
dateAndTime: "Дата та час"
|
||||
showRenotes: "Показати поширення"
|
||||
edited: "Відредаговано"
|
||||
notificationRecieveConfig: "Налаштування сповіщень"
|
||||
mutualFollow: "Взаємна підписка"
|
||||
followingOrFollower: "Підписки або підписники"
|
||||
fileAttachedOnly: "Лише нотатки з файлами"
|
||||
showRepliesToOthersInTimeline: "Показувати відповіді іншим у стрічці"
|
||||
hideRepliesToOthersInTimeline: "Приховувати відповіді іншим зі стрічки"
|
||||
showRepliesToOthersInTimelineAll: "Показувати відповіді іншим від усіх, на кого ви підписані, у стрічці"
|
||||
hideRepliesToOthersInTimelineAll: "Приховувати відповіді іншим від усіх, на кого ви підписані, зі стрічки"
|
||||
confirmShowRepliesAll: "Ви впевнені, що хочете показувати відповіді від усіх, на кого ви підписані, у своїй стрічці? Цю дію не можна скасувати."
|
||||
confirmHideRepliesAll: "Ви впевнені, що хочете приховувати відповіді від усіх, на кого ви підписані, у своїй стрічці? Цю дію не можна скасувати."
|
||||
externalServices: "Зовнішні сервіси"
|
||||
sourceCode: "Вихідний код"
|
||||
sourceCodeIsNotYetProvided: "Вихідний код ще недоступний. Зверніться до адміністратора, щоб виправити цю проблему."
|
||||
repositoryUrl: "URL репозиторію"
|
||||
repositoryUrlDescription: "Якщо ви використовуєте Misskey без змін у вихідному коді, введіть https://github.com/misskey-dev/misskey"
|
||||
repositoryUrlOrTarballRequired: "Якщо ви не опублікували репозиторій, натомість потрібно надати tarball-архів. Докладніше див. у .config/example.yml."
|
||||
feedback: "Відгук"
|
||||
feedbackUrl: "URL відгуків"
|
||||
impressumDescription: "У деяких країнах, наприклад у Німеччині, для комерційних сайтів юридично обов’язково вказувати контактну інформацію оператора сайту — вихідні дані."
|
||||
privacyPolicy: "Політика конфіденційності"
|
||||
privacyPolicyUrl: "URL політики конфіденційності"
|
||||
tosAndPrivacyPolicy: "Умови користування та політика конфіденційності"
|
||||
avatarDecorations: "Прикраси аватара"
|
||||
attach: "Прикріпити"
|
||||
detach: "Відкріпити"
|
||||
detachAll: "Видалити все"
|
||||
angle: "Кут"
|
||||
flip: "Перевернути"
|
||||
showAvatarDecorations: "Показувати прикраси аватара"
|
||||
releaseToRefresh: "Відпустіть, щоб оновити"
|
||||
refreshing: "Оновлення..."
|
||||
pullDownToRefresh: "Потягніть вниз, щоб оновити"
|
||||
useGroupedNotifications: "Показувати згруповані сповіщення"
|
||||
emailVerificationFailedError: "Під час підтвердження адреси електронної пошти сталася помилка. Можливо, посилання застаріло."
|
||||
cwNotationRequired: "Якщо ввімкнено «Приховати вміст», потрібно додати опис."
|
||||
doReaction: "Додати реакцію"
|
||||
code: "Код"
|
||||
reloadRequiredToApplySettings: "Щоб застосувати налаштування, потрібно перезавантажити сторінку."
|
||||
remainingN: "Залишилося: {n}"
|
||||
overwriteContentConfirm: "Ви впевнені, що хочете перезаписати поточний вміст?"
|
||||
seasonalScreenEffect: "Сезонний ефект екрана"
|
||||
decorate: "Прикрасити"
|
||||
addMfmFunction: "Додати MFM"
|
||||
enableQuickAddMfmFunction: "Показувати розширений вибір MFM"
|
||||
bubbleGame: "Bubble Game"
|
||||
sfx: "Звукові ефекти"
|
||||
soundWillBePlayed: "Буде відтворено звук"
|
||||
showReplay: "Переглянути повтор"
|
||||
replay: "Повтор"
|
||||
replaying: "Показ повтору"
|
||||
endReplay: "Вийти з повтору"
|
||||
copyReplayData: "Копіювати дані повтору"
|
||||
ranking: "Рейтинг"
|
||||
lastNDays: "Останні {n} днів"
|
||||
backToTitle: "Повернутися до заголовного екрана"
|
||||
hemisphere: "Місце проживання"
|
||||
withSensitive: "Допис від {name} містить чутливий вміст"
|
||||
userSaysSomethingSensitive: "Нотатка від {name} містить чутливий вміст"
|
||||
enableHorizontalSwipe: "Проведіть, щоб перемикати вкладки"
|
||||
loading: "Завантаження"
|
||||
surrender: "Скасувати"
|
||||
gameRetry: "Спробувати знову"
|
||||
notUsePleaseLeaveBlank: "Залиште порожнім, якщо не використовується"
|
||||
useTotp: "Введіть одноразовий пароль"
|
||||
useBackupCode: "Використати резервні коди"
|
||||
launchApp: "Запуск додатку"
|
||||
useNativeUIForVideoAudioPlayer: "Використовувати інтерфейс браузера під час відтворення відео й аудіо"
|
||||
keepOriginalFilename: "Зберігати початкову назву файлу"
|
||||
keepOriginalFilenameDescription: "Якщо вимкнути це налаштування, під час завантаження файлів їхні назви автоматично замінюватимуться випадковими рядками."
|
||||
noDescription: "Пояснення відсутнє"
|
||||
alwaysConfirmFollow: "Завжди підтверджувати підписку"
|
||||
inquiry: "Зв'язок"
|
||||
tryAgain: "Повторіть спробу."
|
||||
createdLists: "Створені списки"
|
||||
createdAntennas: "Створені антени"
|
||||
discard: "Відхилити"
|
||||
prohibitedWordsForNameOfUser: "Заборонені слова (імʼя користувача)"
|
||||
pleaseSelectAccount: "Виберіть акаунт"
|
||||
draft: "Чернетка"
|
||||
preferences: "Налаштування"
|
||||
untitled: "Без назви"
|
||||
skip: "Пропустити"
|
||||
restore: "Відновити"
|
||||
paste: "Вставити"
|
||||
emojiPalette: "Палітра емодзі"
|
||||
postForm: "Створення нотатки"
|
||||
textCount: "Кількість символів"
|
||||
information: "Інформація"
|
||||
chat: "Чат"
|
||||
directMessage: "Чат із користувачем"
|
||||
directMessage_short: "Повідомлення"
|
||||
compress: "Стиснути"
|
||||
right: "Праворуч"
|
||||
bottom: "Зверху"
|
||||
top: "Знизу"
|
||||
embed: "Вбудувати"
|
||||
readonly: "Лише для читання"
|
||||
goToDeck: "Повернутися до Деки"
|
||||
federationJobs: "Завдання федерації"
|
||||
driveAboutTip: "У Диску відображатиметься список файлів, які ви раніше завантажили.<br>Ви можете повторно використовувати ці файли, прикріплюючи їх до нотаток, або завантажувати файли заздалегідь, щоб опублікувати їх пізніше.<br><b>Будьте обережні під час видалення файлу, адже він стане недоступним усюди, де використовувався (наприклад, у нотатках, сторінках, аватарах, банерах тощо).</b><br>Ви також можете створювати теки, щоб упорядкувати файли."
|
||||
scrollToClose: "Прокрутіть, щоб закрити"
|
||||
advice: "Порада"
|
||||
realtimeMode: "Режим реального часу"
|
||||
turnItOn: "Увімкнути"
|
||||
turnItOff: "Вимкнути"
|
||||
emojiMute: "Приховати емодзі"
|
||||
emojiUnmute: "Показувати емодзі"
|
||||
muteX: "Приховати {x}"
|
||||
unmuteX: "Показувати {x}"
|
||||
abort: "Перервати"
|
||||
tip: "Поради та підказки"
|
||||
redisplayAllTips: "Знову показувати всі «Поради й підказки»"
|
||||
hideAllTips: "Приховати всі «Поради й підказки»"
|
||||
defaultImageCompressionLevel: "Рівень стиснення зображень по замовчуванню"
|
||||
defaultImageCompressionLevel_description: "Нижчий рівень зберігає якість зображення, але збільшує розмір файлу.<br>Вищий рівень зменшує розмір файлу, але погіршує якість зображення."
|
||||
defaultCompressionLevel: "Рівень стиснення по замовчуванню"
|
||||
defaultCompressionLevel_description: "Нижчий рівень стиснення зберігає якість, але збільшує розмір файлу.<br>Вищий рівень стиснення зменшує розмір файлу, але погіршує якість."
|
||||
inMinutes: "х"
|
||||
inDays: "д"
|
||||
safeModeEnabled: "Безпечний режим увімкнено"
|
||||
pluginsAreDisabledBecauseSafeMode: "Усі плагіни вимкнено, оскільки ввімкнено безпечний режим."
|
||||
customCssIsDisabledBecauseSafeMode: "Користувацький CSS не застосовується, оскільки ввімкнено безпечний режим."
|
||||
themeIsDefaultBecauseSafeMode: "Поки активний безпечний режим, використовується типова тема. Вимкнення безпечного режиму скасує ці зміни."
|
||||
thankYouForTestingBeta: "Дякуємо, що допомагаєте нам тестувати бета-версію!"
|
||||
createUserSpecifiedNote: "Створити особисту нотатку"
|
||||
schedulePost: "Запланувати нотатку"
|
||||
scheduleToPostOnX: "Заплановано створити нотатку на {x}"
|
||||
scheduledToPostOnX: "Нотатку заплановано на {x}"
|
||||
schedule: "Запланувати"
|
||||
scheduled: "Заплановано"
|
||||
widgets: "Віджети"
|
||||
deviceInfo: "Відомості про пристрій"
|
||||
deviceInfoDescription: "Під час технічного звернення додавання наведеної нижче інформації може допомогти розв’язати проблему."
|
||||
youAreAdmin: "Ви адмін"
|
||||
frame: "Кадр"
|
||||
presets: "Пресети"
|
||||
zeroPadding: "Доповнення нулями"
|
||||
nothingToConfigure: "Немає доступних параметрів для налаштування"
|
||||
viewRenotedChannel: "Показувати канал поширення"
|
||||
previewingTheme: "Попередній перегляд теми"
|
||||
previewingThemeRestore: "Відновити"
|
||||
accessToken: "Токен доступу"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Ім'я файлу"
|
||||
camera_f: "Діафрагма (f-число)"
|
||||
camera_iso: "ISO"
|
||||
gps_lat: "Широта"
|
||||
gps_long: "Довгота"
|
||||
_imageFrameEditor:
|
||||
header: "Заголовок"
|
||||
withQrCode: "QR-код"
|
||||
textColor: "Колір тексту"
|
||||
font: "Шрифт"
|
||||
fontSerif: "Serif"
|
||||
fontSansSerif: "Sans serif"
|
||||
_compression:
|
||||
_quality:
|
||||
high: "Висока якість"
|
||||
medium: "Середня якість"
|
||||
low: "Низька якість"
|
||||
_size:
|
||||
large: "Великий розмір"
|
||||
medium: "Середній розмір"
|
||||
small: "Малий розмір"
|
||||
_order:
|
||||
newest: "Найновіші спочатку"
|
||||
oldest: "Спочатку старі"
|
||||
_chat:
|
||||
messages: "Повідомлення"
|
||||
noMessagesYet: "Повідомлень поки немає"
|
||||
newMessage: "Нове повідомлення"
|
||||
invitations: "Запросити"
|
||||
history: "Історія"
|
||||
noHistory: "Історія порожня"
|
||||
inviteUser: "Запросити користувачів"
|
||||
ignore: "Ігнорувати"
|
||||
members: "Учасники"
|
||||
home: "Домівка"
|
||||
send: "Відправити"
|
||||
newline: "Новий рядок"
|
||||
_delivery:
|
||||
stop: "Призупинено"
|
||||
_type:
|
||||
@@ -1144,7 +1612,7 @@ _achievements:
|
||||
description: "Минув рік з моменту створення акаунта"
|
||||
_passedSinceAccountCreated2:
|
||||
title: "Друга річниця"
|
||||
description: "Минуло 2 роки з моменту створення акаунта"
|
||||
description: "Минуло 2 роки з моменту створення акаунту"
|
||||
_passedSinceAccountCreated3:
|
||||
title: "Третя річниця"
|
||||
description: "Минуло 3 роки з моменту створення акаунта"
|
||||
@@ -1168,11 +1636,15 @@ _role:
|
||||
permission: "Права ролі"
|
||||
assignTarget: "Призначити"
|
||||
manual: "Вручну"
|
||||
condition: "Умови"
|
||||
priority: "Пріоритет"
|
||||
_priority:
|
||||
low: "Низький"
|
||||
middle: "Середній"
|
||||
high: "Високий"
|
||||
_options:
|
||||
canManageCustomEmojis: "Керування користувацькими емодзі"
|
||||
canManageAvatarDecorations: "Керувати прикрасами аватара"
|
||||
_sensitiveMediaDetection:
|
||||
sensitivity: "Чутливість детектування"
|
||||
setSensitiveFlagAutomatically: "Позначити як NSFW"
|
||||
@@ -1653,6 +2125,7 @@ _abuseReport:
|
||||
_moderationLogTypes:
|
||||
suspend: "Призупинити"
|
||||
resetPassword: "Скинути пароль"
|
||||
createInvitation: "Створити запрошення"
|
||||
_reversi:
|
||||
total: "Всього"
|
||||
_remoteLookupErrors:
|
||||
@@ -1661,20 +2134,35 @@ _remoteLookupErrors:
|
||||
_search:
|
||||
searchScopeAll: "Всі"
|
||||
searchScopeLocal: "Локальна"
|
||||
searchScopeUser: "Вказаний користувач"
|
||||
watermark: "Водяний знак"
|
||||
defaultPreset: "Default Preset"
|
||||
_watermarkEditor:
|
||||
opacity: "Непрозорість"
|
||||
scale: "Розмір"
|
||||
text: "Текст"
|
||||
qr: "QR-код"
|
||||
position: "Позиція"
|
||||
type: "Тип"
|
||||
image: "Зображення"
|
||||
advanced: "Розширені"
|
||||
angle: "Кут"
|
||||
_imageEffector:
|
||||
_fxs:
|
||||
grayscale: "Чорно-білий"
|
||||
stripe: "Смуги"
|
||||
_fxProps:
|
||||
angle: "Кут"
|
||||
scale: "Розмір"
|
||||
size: "Розмір"
|
||||
offset: "Позиція"
|
||||
color: "Колір"
|
||||
opacity: "Непрозорість"
|
||||
lightness: "Яскравість"
|
||||
drafts: "Чернетка"
|
||||
_drafts:
|
||||
restore: "Відновити"
|
||||
qr: "QR-код"
|
||||
_qr:
|
||||
showTabTitle: "Відображення"
|
||||
raw: "Текст"
|
||||
|
||||
+1
-2
@@ -1219,13 +1219,12 @@ paste: "dán"
|
||||
postForm: "Mẫu đăng"
|
||||
information: "Giới thiệu"
|
||||
chat: "Trò chuyện"
|
||||
migrateOldSettings: "Di chuyển cài đặt cũ"
|
||||
migrateOldSettings_description: "Thông thường, quá trình này diễn ra tự động, nhưng nếu vì lý do nào đó mà quá trình di chuyển không thành công, bạn có thể kích hoạt thủ công quy trình di chuyển, quá trình này sẽ ghi đè lên thông tin cấu hình hiện tại của bạn."
|
||||
driveAboutTip: "Trong Drive, danh sách các tệp bạn đã tải lên trước đây sẽ được hiển thị.<br>\nBạn có thể sử dụng lại chúng khi đính kèm vào ghi chú, hoặc tải lên trước các tệp để đăng sau.<br>\n<b>Lưu ý rằng nếu bạn xóa một tệp, tệp đó cũng sẽ biến mất khỏi tất cả những nơi đã sử dụng tệp đó (ghi chú, trang, ảnh đại diện, biểu ngữ, v.v.).</b><br>\nBạn cũng có thể tạo các thư mục để sắp xếp chúng."
|
||||
inMinutes: "phút"
|
||||
inDays: "ngày"
|
||||
widgets: "Tiện ích"
|
||||
presets: "Mẫu thiết lập"
|
||||
previewingThemeRestore: "Khôi phục"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
filename: "Tên tập tin"
|
||||
|
||||
+157
-146
@@ -13,14 +13,14 @@ initialPasswordForSetup: "初始化密码"
|
||||
initialPasswordIsIncorrect: "初始化密码不正确。"
|
||||
initialPasswordForSetupDescription: "如果是自己安装的 Misskey,请输入配置文件里设好的密码。\n如果使用的是 Misskey 的托管服务等,请输入服务商提供的密码。\n如果没有设置密码,请留空并继续。"
|
||||
forgotPassword: "忘记密码"
|
||||
fetchingAsApObject: "在联邦宇宙查询中..."
|
||||
fetchingAsApObject: "在联邦中查找中…"
|
||||
ok: "OK"
|
||||
gotIt: "好"
|
||||
cancel: "取消"
|
||||
noThankYou: "不用,谢谢"
|
||||
enterUsername: "输入用户名"
|
||||
renotedBy: "{user} 转发了"
|
||||
noNotes: "没有帖文"
|
||||
noNotes: "没有帖子"
|
||||
noNotifications: "无通知"
|
||||
instance: "服务器"
|
||||
settings: "设置"
|
||||
@@ -53,7 +53,7 @@ copyRemoteLink: "复制远程链接"
|
||||
copyLinkRenote: "复制转帖链接"
|
||||
delete: "删除"
|
||||
deleteAndEdit: "删除并编辑"
|
||||
deleteAndEditConfirm: "要删除此帖并再次编辑吗?此帖下所有的回应、转发和回复也将被删除。"
|
||||
deleteAndEditConfirm: "要删除该帖并重新编辑吗?该帖下的所有回应、转发和回复也将被删除。"
|
||||
addToList: "添加至列表"
|
||||
addToAntenna: "添加到天线"
|
||||
sendMessage: "发送消息"
|
||||
@@ -81,11 +81,11 @@ import: "导入"
|
||||
export: "导出"
|
||||
files: "文件"
|
||||
download: "下载"
|
||||
driveFileDeleteConfirm: "要删除「{name}」文件吗?附加此文件的帖子也会被删除。"
|
||||
driveFileDeleteConfirm: "确认删除文件 “{name}” 吗?使用此文件的帖子也将被删除。"
|
||||
unfollowConfirm: "要取消对 {name} 的关注吗?"
|
||||
cancelFollowRequestConfirm: "要取消申请关注{name}吗?"
|
||||
rejectFollowRequestConfirm: "要拒绝{name}的关注申请吗?"
|
||||
exportRequested: "导出请求已提交,这可能需要花一些时间,导出的文件将保存到网盘中。"
|
||||
exportRequested: "已请求导出,这可能需要一段时间,导出的文件将保存至网盘中。"
|
||||
importRequested: "导入请求已提交,这可能需要花一点时间。"
|
||||
lists: "列表"
|
||||
noLists: "列表为空"
|
||||
@@ -102,7 +102,7 @@ retry: "重试"
|
||||
pageLoadError: "页面加载失败。"
|
||||
pageLoadErrorDescription: "这通常是由于网络或浏览器缓存的原因。请清除缓存或等待片刻后重试。"
|
||||
serverIsDead: "服务器未响应。 请稍后再试。"
|
||||
youShouldUpgradeClient: "请重新加载并使用新版本的客户端查看此页面。"
|
||||
youShouldUpgradeClient: "请刷新并使用新版本客户端查看此页面。"
|
||||
enterListName: "输入列表名称"
|
||||
privacy: "隐私"
|
||||
makeFollowManuallyApprove: "关注请求需要批准"
|
||||
@@ -116,15 +116,15 @@ enterEmoji: "输入表情符号"
|
||||
renote: "转发"
|
||||
unrenote: "取消转发"
|
||||
renoted: "已转发。"
|
||||
renotedToX: "转帖给 {name}"
|
||||
renotedToX: "转发给 {name} 了"
|
||||
cantRenote: "该帖无法转发。"
|
||||
cantReRenote: "转发无法被再次转发。"
|
||||
quote: "引用"
|
||||
inChannelRenote: "在频道内转发"
|
||||
inChannelQuote: "在频道内引用"
|
||||
renoteToChannel: "转帖至频道"
|
||||
renoteToOtherChannel: "转帖至其它频道"
|
||||
pinnedNote: "已置顶的帖子"
|
||||
renoteToChannel: "转发至频道"
|
||||
renoteToOtherChannel: "转发至其它频道"
|
||||
pinnedNote: "置顶的帖子"
|
||||
pinned: "置顶"
|
||||
you: "您"
|
||||
clickToShow: "点击以显示"
|
||||
@@ -149,12 +149,12 @@ mute: "屏蔽"
|
||||
unmute: "取消隐藏"
|
||||
renoteMute: "隐藏转帖"
|
||||
renoteUnmute: "取消隐藏转帖"
|
||||
block: "禁止对方与我互动"
|
||||
unblock: "允许对方与我互动"
|
||||
block: "屏蔽"
|
||||
unblock: "取消屏蔽"
|
||||
suspend: "冻结"
|
||||
unsuspend: "解除冻结"
|
||||
blockConfirm: "确定要禁止对方与我互动吗?"
|
||||
unblockConfirm: "确定要允许对方与我互动吗?"
|
||||
unblockConfirm: "确认解除对方的互动限制吗?"
|
||||
suspendConfirm: "要冻结吗?"
|
||||
unsuspendConfirm: "要解除冻结吗?"
|
||||
selectList: "选择列表"
|
||||
@@ -243,14 +243,14 @@ blockedInstancesDescription: "设定要屏蔽的服务器,以换行分隔。
|
||||
silencedInstances: "被静音的服务器"
|
||||
silencedInstancesDescription: "设置要静音的服务器,以换行分隔。被静音的服务器内所有的账户都被视为「静音」状态,且关注操作均需要被批准。已被屏蔽的实例不受影响。"
|
||||
mediaSilencedInstances: "已隐藏媒体文件的服务器"
|
||||
mediaSilencedInstancesDescription: "设置要隐藏媒体文件的服务器,以换行分隔。被设置的服务器内所有账号的文件均按照「敏感内容」处理,且将无法使用自定义表情符号。已被屏蔽的实例不受影响。"
|
||||
mediaSilencedInstancesDescription: "设置要隐藏媒体文件的服务器,以换行分隔。被设置的服务器内所有账号的文件均按照 “敏感内容” 处理,且将无法使用自定义表情符号。已被屏蔽的实例不受影响。"
|
||||
federationAllowedHosts: "允许联邦交互的服务器"
|
||||
federationAllowedHostsDescription: "设定允许联邦通信的服务器,以换行分隔。"
|
||||
muteAndBlock: "屏蔽用户/禁止用户与我互动"
|
||||
mutedUsers: "已屏蔽的用户"
|
||||
blockedUsers: "禁止与我互动的用户"
|
||||
muteAndBlock: "隐藏和屏蔽"
|
||||
mutedUsers: "已隐藏的用户"
|
||||
blockedUsers: "已屏蔽的用户"
|
||||
noUsers: "无用户"
|
||||
editProfile: "编辑资料"
|
||||
editProfile: "编辑个人资料"
|
||||
noteDeleteConfirm: "确定要删除该帖子吗?"
|
||||
pinLimitExceeded: "无法置顶更多了"
|
||||
done: "完成"
|
||||
@@ -281,15 +281,15 @@ attachFile: "添加附件"
|
||||
more: "更多!"
|
||||
featured: "热门"
|
||||
usernameOrUserId: "用户名或用户 ID"
|
||||
noSuchUser: "用户不存在"
|
||||
lookup: "查询"
|
||||
noSuchUser: "未找到该用户"
|
||||
lookup: "查找用户"
|
||||
announcements: "公告"
|
||||
imageUrl: "图片 URL"
|
||||
remove: "删除"
|
||||
removed: "已删除"
|
||||
removeAreYouSure: "要删掉「{x}」吗?"
|
||||
deleteAreYouSure: "要删掉「{x}」吗?"
|
||||
resetAreYouSure: "恢复默认设置?"
|
||||
resetAreYouSure: "确定要重置吗?"
|
||||
areYouSure: "你确定吗?"
|
||||
saved: "已保存"
|
||||
upload: "本地上传"
|
||||
@@ -331,7 +331,7 @@ dark: "深色"
|
||||
lightThemes: "浅色主题"
|
||||
darkThemes: "深色主题"
|
||||
syncDeviceDarkMode: "将深色模式与设备设置同步"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "「{x}」已开启。要关闭同步并手动切换模式吗?"
|
||||
switchDarkModeManuallyWhenSyncEnabledConfirm: "“{x}” 已开启。要关闭同步并手动切换模式吗?"
|
||||
drive: "网盘"
|
||||
fileName: "文件名称"
|
||||
selectFile: "选择文件"
|
||||
@@ -349,7 +349,7 @@ folder: "文件夹"
|
||||
addFile: "添加文件"
|
||||
showFile: "显示文件"
|
||||
emptyDrive: "网盘中无文件"
|
||||
emptyFolder: "此文件夹中无文件"
|
||||
emptyFolder: "此文件夹为空"
|
||||
dropHereToUpload: "将文件拖动到这里来上传"
|
||||
unableToDelete: "无法删除"
|
||||
inputNewFileName: "请输入新文件名"
|
||||
@@ -364,9 +364,9 @@ banner: "横幅"
|
||||
displayOfSensitiveMedia: "显示敏感媒体"
|
||||
whenServerDisconnected: "与服务器连接中断时"
|
||||
disconnectedFromServer: "已和服务器断开连接"
|
||||
reload: "重新加载"
|
||||
reload: "刷新"
|
||||
doNothing: "关闭"
|
||||
reloadConfirm: "确定要重新加载吗?"
|
||||
reloadConfirm: "确定要刷新吗?"
|
||||
watch: "关注"
|
||||
unwatch: "取消关注"
|
||||
accept: "允许"
|
||||
@@ -399,11 +399,11 @@ bannerUrl: "横幅 URL"
|
||||
backgroundImageUrl: "背景图片的链接"
|
||||
basicInfo: "基本信息"
|
||||
pinnedUsers: "置顶用户"
|
||||
pinnedUsersDescription: "在「发现」页面中使用换行标记想要置顶的用户。"
|
||||
pinnedUsersDescription: "在 “发现” 页面中使用换行标记要置顶的用户。"
|
||||
pinnedPages: "固定页面"
|
||||
pinnedPagesDescription: "输入您要固定到服务器首页的页面路径,以换行符分隔。"
|
||||
pinnedClipId: "置顶的便签 ID"
|
||||
pinnedNotes: "已置顶的帖子"
|
||||
pinnedNotes: "置顶的帖子"
|
||||
hcaptcha: "hCaptcha"
|
||||
enableHcaptcha: "启用 hCaptcha"
|
||||
hcaptchaSiteKey: "网站密钥"
|
||||
@@ -431,12 +431,12 @@ antennaExcludeKeywords: "排除关键字"
|
||||
antennaExcludeBots: "排除机器人账户"
|
||||
antennaKeywordsDescription: "AND 条件用空格分隔,OR 条件用换行符分隔。"
|
||||
notifyAntenna: "开启通知"
|
||||
withFileAntenna: "仅带有附件的帖子"
|
||||
withFileAntenna: "仅包含附件的帖子"
|
||||
excludeNotesInSensitiveChannel: "排除敏感频道的帖子"
|
||||
enableServiceworker: "启用 ServiceWorker"
|
||||
antennaUsersDescription: "指定用户名,用换行符进行分隔"
|
||||
caseSensitive: "区分大小写"
|
||||
withReplies: "包括回复"
|
||||
withReplies: "包含回复"
|
||||
connectedTo: "您的账号已连到接以下第三方账号"
|
||||
notesAndReplies: "帖子与回复"
|
||||
withFiles: "附件"
|
||||
@@ -595,7 +595,7 @@ popout: "弹窗"
|
||||
volume: "音量"
|
||||
masterVolume: "主音量"
|
||||
notUseSound: "静音"
|
||||
useSoundOnlyWhenActive: "仅在 Misskey 活跃时输出声音"
|
||||
useSoundOnlyWhenActive: "仅在使用 Misskey 时发出音效"
|
||||
details: "详情"
|
||||
renoteDetails: "转帖详情"
|
||||
chooseEmoji: "选择表情符号"
|
||||
@@ -697,13 +697,13 @@ testEmail: "邮件发送测试"
|
||||
wordMute: "折叠关键词"
|
||||
wordMuteDescription: "折叠包含指定关键词的帖子。被折叠的帖子可单击展开。"
|
||||
hardWordMute: "屏蔽关键词"
|
||||
showMutedWord: "显示已折叠的关键词"
|
||||
hardWordMuteDescription: "屏蔽包含指定关键词的帖子。与折叠关键词不同,帖子将完全不会显示。"
|
||||
showMutedWord: "显示折叠关键词"
|
||||
hardWordMuteDescription: "屏蔽包含指定关键词的帖子。与折叠关键词不同,帖子将完全不会被显示。"
|
||||
regexpError: "正则表达式错误"
|
||||
regexpErrorDescription: "{tab} 折叠关键词的第 {line} 行的正则表达式有错误:"
|
||||
instanceMute: "已隐藏的服务器"
|
||||
userSaysSomething: "{name} 说了什么,但是被屏蔽词过滤了"
|
||||
userSaysSomethingAbout: "{name} 说了关于「{word}」的什么"
|
||||
userSaysSomething: "{name} 说了些什么,但被屏蔽词过滤了"
|
||||
userSaysSomethingAbout: "{name} 说了关于 “{word}” 的什么"
|
||||
makeActive: "启用"
|
||||
display: "显示"
|
||||
copy: "复制"
|
||||
@@ -752,7 +752,9 @@ createNew: "新建"
|
||||
optional: "可选"
|
||||
createNewClip: "新建便签"
|
||||
unclip: "移除便签"
|
||||
confirmToUnclipAlreadyClippedNote: "本帖已包含在便签 \"{name}\" 里。您想要将本帖从该便签中移除吗?"
|
||||
confirmToUnclipAlreadyClippedNote: "本帖已包含在便签 “{name}” 里。您想要将本帖从该便签中移除吗?"
|
||||
removeFromAntenna: "从此天线中删除"
|
||||
removeNoteFromAntennaConfirm: "要从「{name}」中删除此帖子吗?"
|
||||
public: "公开"
|
||||
private: "私密"
|
||||
i18nInfo: "Misskey 已经被志愿者们翻译成了各种语言。如果你也有兴趣,可以通过 {link} 帮助翻译。"
|
||||
@@ -775,7 +777,7 @@ driveFilesCount: "网盘的文件数"
|
||||
driveUsage: "网盘的空间用量"
|
||||
noCrawle: "拒绝搜索引擎的索引"
|
||||
noCrawleDescription: "拒绝搜索引擎收录(索引)您的个人资料,帖子,页面等。"
|
||||
lockedAccountInfo: "即使启用该功能,只要帖子可见范围不是「仅关注者」,任何人都可以看到您的帖子。"
|
||||
lockedAccountInfo: "即使启用该功能,只要帖子可见范围不是 “仅关注者”,任何人都可以看到您的帖子。"
|
||||
alwaysMarkSensitive: "默认将媒体文件标记为敏感内容"
|
||||
loadRawImages: "添加附件图像的缩略图时使用原始图像质量"
|
||||
disableShowingAnimatedImages: "不播放动态图像"
|
||||
@@ -807,7 +809,7 @@ needToRestartServerToApply: "需要重启服务才能应用更改。"
|
||||
showTitlebar: "显示标题栏"
|
||||
clearCache: "清除缓存"
|
||||
onlineUsersCount: "{n} 人在线"
|
||||
nUsers: "{n} 用户"
|
||||
nUsers: "{n} 位用户"
|
||||
nNotes: "{n}帖子"
|
||||
sendErrorReports: "发送错误报告"
|
||||
sendErrorReportsDescription: "启用后,如果出现问题,可以与 Misskey 共享详细的错误信息,从而帮助提高软件的质量。错误信息包括操作系统版本、浏览器类型、行为历史记录等。"
|
||||
@@ -877,7 +879,7 @@ noMaintainerInformationWarning: "尚未设置管理员信息。"
|
||||
noInquiryUrlWarning: "尚未设置联络地址。"
|
||||
noBotProtectionWarning: "尚未设置 Bot 防御。"
|
||||
configure: "设置"
|
||||
postToGallery: "发表相册"
|
||||
postToGallery: "发布相册"
|
||||
postToHashtag: "发布至该话题"
|
||||
gallery: "相册"
|
||||
recentPosts: "最新发布"
|
||||
@@ -940,7 +942,7 @@ continueThread: "查看更多帖子"
|
||||
deleteAccountConfirm: "将要删除账户。是否确认?"
|
||||
incorrectPassword: "密码错误"
|
||||
incorrectTotp: "一次性密码不正确或已过期"
|
||||
voteConfirm: "确定投给 “{choice}” ?"
|
||||
voteConfirm: "要投给 “{choice}” 吗?"
|
||||
hide: "隐藏"
|
||||
useDrawerReactionPickerForMobile: "在移动设备上使用抽屉显示"
|
||||
welcomeBackWithName: "欢迎回来,{name}"
|
||||
@@ -1033,7 +1035,7 @@ windowMaximize: "最大化"
|
||||
windowMinimize: "最小化"
|
||||
windowRestore: "还原"
|
||||
caption: "描述文本"
|
||||
loggedInAsBot: "以 Bot 账户登录"
|
||||
loggedInAsBot: "以机器人账户登录中"
|
||||
tools: "工具"
|
||||
cannotLoad: "无法加载"
|
||||
numberOfProfileView: "个人资料展示次数"
|
||||
@@ -1069,8 +1071,8 @@ custom: "自定义"
|
||||
achievements: "成就"
|
||||
gotInvalidResponseError: "服务器无应答"
|
||||
gotInvalidResponseErrorDescription: "您的网络连接可能出现了问题, 或是远程服务器暂时不可用. 请稍后重试。"
|
||||
thisPostMayBeAnnoying: "这个帖子可能会让其他人感到困扰。"
|
||||
thisPostMayBeAnnoyingHome: "发到首页"
|
||||
thisPostMayBeAnnoying: "该帖文可能会使他人感到不适。"
|
||||
thisPostMayBeAnnoyingHome: "发布到首页"
|
||||
thisPostMayBeAnnoyingCancel: "取消"
|
||||
thisPostMayBeAnnoyingIgnore: "就这样发布"
|
||||
collapseRenotes: "折叠已经看过的转贴"
|
||||
@@ -1132,7 +1134,7 @@ forceShowAds: "总是显示广告"
|
||||
addMemo: "添加备注"
|
||||
editMemo: "编辑备注"
|
||||
reactionsList: "回应列表"
|
||||
renotesList: "转发列表"
|
||||
renotesList: "转贴列表"
|
||||
notificationDisplay: "显示通知"
|
||||
leftTop: "屏幕左上方"
|
||||
rightTop: "屏幕右上方"
|
||||
@@ -1144,7 +1146,7 @@ horizontal: "横向"
|
||||
position: "位置"
|
||||
serverRules: "服务器规则"
|
||||
pleaseConfirmBelowBeforeSignup: "如果要在此服务器上注册,需要确认并同意以下内容。"
|
||||
pleaseAgreeAllToContinue: "必须全部勾选「同意」才能够继续。"
|
||||
pleaseAgreeAllToContinue: "必须全部勾选 “同意” 才能够继续。"
|
||||
continue: "继续"
|
||||
preservedUsernames: "保留的用户名"
|
||||
preservedUsernamesDescription: "列出需要保留的用户名,使用换行来作为分割。被指定的用户名在建立账户时无法使用,但由管理员所创建的账户不受该限制。此外,现有的账户也不会受到影响。"
|
||||
@@ -1162,7 +1164,7 @@ preventAiLearning: "拒绝用于训练生成式 AI"
|
||||
preventAiLearningDescription: "要求文章生成 AI 或图像生成 AI 不能够以发布的帖子和图像等内容作为学习对象。这是通过在 HTML 响应中包含 noai 标志来实现的,这不能完全阻止 AI 学习你的发布内容,并不是所有 AI 都会遵守这类请求。"
|
||||
options: "选项"
|
||||
specifyUser: "指定用户"
|
||||
lookupConfirm: "确定查询?"
|
||||
lookupConfirm: "确定查找吗?"
|
||||
openTagPageConfirm: "确定打开话题标签页面?"
|
||||
specifyHost: "指定主机名"
|
||||
failedToPreviewUrl: "无法预览"
|
||||
@@ -1200,7 +1202,7 @@ used: "已使用"
|
||||
expired: "已过期"
|
||||
doYouAgree: "你同意吗?"
|
||||
beSureToReadThisAsItIsImportant: "请好好阅读,这真的很重要。"
|
||||
iHaveReadXCarefullyAndAgree: "我已经仔细阅读并同意了「{x}」的内容。"
|
||||
iHaveReadXCarefullyAndAgree: "我已经仔细阅读并同意了 “{x}” 的内容。"
|
||||
dialog: "对话框"
|
||||
icon: "头像"
|
||||
forYou: "您的"
|
||||
@@ -1209,14 +1211,15 @@ pastAnnouncements: "过去的公告"
|
||||
youHaveUnreadAnnouncements: "您有未读的公告"
|
||||
useSecurityKey: "请根据浏览器或设备的提示,使用安全密钥或通行密钥。"
|
||||
replies: "回复"
|
||||
renotes: "转发"
|
||||
renotes: "转贴"
|
||||
loadReplies: "查看回复"
|
||||
loadConversation: "查看对话"
|
||||
pinnedList: "已置顶的列表"
|
||||
keepScreenOn: "保持屏幕常亮"
|
||||
verifiedLink: "已验证的链接"
|
||||
notifyNotes: "打开发帖通知"
|
||||
notifyNotes: "开启发帖通知"
|
||||
unnotifyNotes: "关闭发帖通知"
|
||||
notifyUsers: "已开启发帖通知的用户"
|
||||
authentication: "验证"
|
||||
authenticationRequiredToContinue: "要继续,请先进行验证"
|
||||
dateAndTime: "日期和时间"
|
||||
@@ -1258,7 +1261,7 @@ refreshing: "刷新中"
|
||||
pullDownToRefresh: "下拉以刷新"
|
||||
useGroupedNotifications: "分组显示通知"
|
||||
emailVerificationFailedError: "确认电子邮件时出现错误。链接可能已过期。"
|
||||
cwNotationRequired: "在启用「隐藏内容」时必须输入注释"
|
||||
cwNotationRequired: "如果启用了 “隐藏内容”,则需要进行注解。"
|
||||
doReaction: "回应"
|
||||
code: "代码"
|
||||
reloadRequiredToApplySettings: "需要重新载入来使设置生效"
|
||||
@@ -1330,7 +1333,7 @@ federationDisabled: "此服务器已禁用联邦功能。无法与其它服务
|
||||
draft: "草稿"
|
||||
draftsAndScheduledNotes: "草稿和定时发送"
|
||||
confirmOnReact: "发送回应前需要确认"
|
||||
reactAreYouSure: "要用「{emoji}」进行回应吗?"
|
||||
reactAreYouSure: "要用 “{emoji}” 进行回应吗?"
|
||||
markAsSensitiveConfirm: "确定标记此媒体为敏感内容吗?"
|
||||
unmarkAsSensitiveConfirm: "确定取消标记为敏感内容吗?"
|
||||
preferences: "偏好设置"
|
||||
@@ -1358,14 +1361,11 @@ information: "关于"
|
||||
chat: "聊天"
|
||||
directMessage: "私信"
|
||||
directMessage_short: "消息"
|
||||
migrateOldSettings: "迁移旧设置信息"
|
||||
migrateOldSettings_description: "通常设置信息将自动迁移。但如果由于某种原因迁移不成功,则可以手动触发迁移过程。当前的配置信息将被覆盖。"
|
||||
compress: "压缩"
|
||||
right: "右"
|
||||
bottom: "下"
|
||||
top: "上"
|
||||
embed: "嵌入"
|
||||
settingsMigrating: "正在迁移设置,请稍候。(之后也可以在设置 → 其它 → 迁移旧设置来手动迁移)"
|
||||
readonly: "只读"
|
||||
goToDeck: "返回至 Deck"
|
||||
federationJobs: "联邦作业"
|
||||
@@ -1375,13 +1375,13 @@ advice: "建议"
|
||||
realtimeMode: "实时模式"
|
||||
turnItOn: "开启"
|
||||
turnItOff: "关闭"
|
||||
emojiMute: "打码表情符号"
|
||||
emojiUnmute: "取消表情符号打码"
|
||||
emojiMute: "屏蔽表情符号"
|
||||
emojiUnmute: "取消屏蔽表情符号"
|
||||
muteX: "隐藏{x}"
|
||||
unmuteX: "取消对{x}的隐藏"
|
||||
abort: "中止"
|
||||
tip: "提示和技巧"
|
||||
redisplayAllTips: "重新显示所有的提示和技巧"
|
||||
redisplayAllTips: "重新显示所有 “提示和技巧”"
|
||||
hideAllTips: "隐藏所有的 “提示与技巧”"
|
||||
defaultImageCompressionLevel: "默认图像压缩等级"
|
||||
defaultImageCompressionLevel_description: "较低的等级可以保持画质,但会增加文件大小。<br>较高的等级可以减少文件大小,但相对应的画质将会降低。"
|
||||
@@ -1409,6 +1409,14 @@ presets: "预设值"
|
||||
zeroPadding: "填充 0"
|
||||
nothingToConfigure: "没有项目"
|
||||
viewRenotedChannel: "查看转帖所属频道"
|
||||
previewingTheme: "正在预览主题"
|
||||
previewingThemeRestore: "还原"
|
||||
accessToken: "访问令牌"
|
||||
chooseEmojiPalette: "选择表情符号选择器"
|
||||
addToEmojiPalette: "添加至表情符号选择器"
|
||||
emojiPaletteAlreadyAddedConfirm: "此表情符号已存在于此表情符号选择器中。要再次添加吗?"
|
||||
append: "加到最后"
|
||||
prepend: "加到最前"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "文件标题"
|
||||
@@ -1562,10 +1570,10 @@ _settings:
|
||||
_preferencesProfile:
|
||||
profileName: "配置文件名"
|
||||
profileNameDescription: "请指定用于识别此设备的名称"
|
||||
profileNameDescription2: "如「PC」、「手机」等"
|
||||
profileNameDescription2: "例如:“PC\"、“手机” 等"
|
||||
manageProfiles: "管理配置文件"
|
||||
shareSameProfileBetweenDevicesIsNotRecommended: "不建议在多个设备间共用同一个配置文件。"
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "若想在多个设备间同步某些设置,请为每个设置打开「多设备间同步」选项。"
|
||||
useSyncBetweenDevicesOptionIfYouWantToSyncSetting: "若想在多个设备间同步某些设置,请为每个设置打开 “多设备间同步” 选项。"
|
||||
_preferencesBackup:
|
||||
autoBackup: "自动备份"
|
||||
restoreFromBackup: "从备份恢复"
|
||||
@@ -1591,11 +1599,11 @@ _accountSettings:
|
||||
notesOlderThanSpecifiedDateAndTime: "指定日期前的帖子"
|
||||
_abuseUserReport:
|
||||
forward: "转发"
|
||||
forwardDescription: "目标是匿名系统账户,将把举报转发给远程服务器。"
|
||||
forwardDescription: "以匿名系统账户的身份,将举报转发至远程服务器。"
|
||||
resolve: "解决"
|
||||
accept: "确认"
|
||||
reject: "拒绝"
|
||||
resolveTutorial: "如果认可举报并已解决,选择「确认」将案件以肯定的态度标记为已解决。\n如果不认可举报,选择「拒绝」将案件以否定的态度标记为已解决。"
|
||||
accept: "认可"
|
||||
reject: "驳回"
|
||||
resolveTutorial: "若处理的举报内容属实,请选择 “认可”,以标记该案件已得到妥善解决。\n若举报内容不属实,请选择 “驳回”,以标记该案件未得到妥善解决。"
|
||||
_delivery:
|
||||
status: "投递状态"
|
||||
stop: "停止投递"
|
||||
@@ -1629,7 +1637,7 @@ _announcement:
|
||||
end: "结束公告"
|
||||
tooManyActiveAnnouncementDescription: "若有大量活动公告,可能会造成用户体验下降。请考虑归档已完成的公告。"
|
||||
readConfirmTitle: "标记为已读?"
|
||||
readConfirmText: "阅读“{title}”的内容并将其标记为已读。"
|
||||
readConfirmText: "阅读 “{title}” 的内容,并标记为已读。"
|
||||
shouldNotBeUsedToPresentPermanentInfo: "因可能损坏新用户的 UX 体验,建议将通知用于发布具有时效性的信息,而不是用于长期展示的信息。"
|
||||
dialogAnnouncementUxWarn: "同时存在 2 个或以上的对话框公告极有可能对用户体验产生负面的影响,建议谨慎使用。"
|
||||
silence: "不发送通知"
|
||||
@@ -1641,7 +1649,7 @@ _initialAccountSetting:
|
||||
profileSetting: "个人资料设置"
|
||||
privacySetting: "隐私设置"
|
||||
theseSettingsCanEditLater: "也可以在稍后修改这里的设置。"
|
||||
youCanEditMoreSettingsInSettingsPageLater: "还可以在「设置」页面进行其它各种设置,稍后就来确认一下看看吧。"
|
||||
youCanEditMoreSettingsInSettingsPageLater: "还可以在 “设置” 页面进行各种其它设置,稍后来确认一下吧。"
|
||||
followUsers: "为了建立属于你自己的时间线,试着去关注你感兴趣的用户吧。"
|
||||
pushNotificationDescription: "启用推送通知的话,就可以在设备上接收来自 {name} 的通知了。"
|
||||
initialAccountSettingCompleted: "初始设定已经完成了!"
|
||||
@@ -1660,18 +1668,18 @@ _initialTutorial:
|
||||
description: "在这里,您可以查看 Misskey 的基本使用方法和功能。"
|
||||
_note:
|
||||
title: "什么是帖子?"
|
||||
description: "在 Misskey 上发表的文章称为「帖子」。帖子在时间线上按照时间顺序排列,并实时更新。"
|
||||
description: "在 Misskey 上发表的文章称为 “帖子”。帖子在时间线上按照时间顺序排列,并实时更新。"
|
||||
reply: "用来回复帖子。可以对回复进行回复,从而形成一串对话。"
|
||||
renote: "用来将帖子共享到自己的时间线上。也可以加上自己的文字然后引用它。"
|
||||
reaction: "用来添加回应。详细信息将在下一页进行说明。"
|
||||
menu: "用来进行例如显示帖子详情、复制链接等各种各样的操作。"
|
||||
_reaction:
|
||||
title: "什么是回应?"
|
||||
description: "您可以在帖子中添加“回应”。 您可以使用反应轻松地表达点“赞”所无法传达的细微差别。"
|
||||
letsTryReacting: "回应可以通过点击帖子中的「+」按钮来添加。试着给这个示例帖子添加一个回应!"
|
||||
description: "您可以在帖子中添加 “回应”。 使用回应可以轻松地表达 “点赞” 无法传达的心情。"
|
||||
letsTryReacting: "点击帖子下方的 “+” 可以添加回应。试着给这个示例帖子添加一个回应!"
|
||||
reactToContinue: "添加一个回应来继续"
|
||||
reactNotification: "当您的帖子被某人添加了回应时,将实时收到通知。"
|
||||
reactDone: "通过按下「ー」按钮,可以取消已经添加的回应"
|
||||
reactDone: "点击 “ー” 可以取消回应。"
|
||||
_timeline:
|
||||
title: "时间线的运作方式"
|
||||
description1: "Misskey 根据使用方式提供了多个时间线(根据服务器的设定,可能有一些被禁用)。"
|
||||
@@ -1687,27 +1695,27 @@ _initialTutorial:
|
||||
_visibility:
|
||||
description: "您可以限制谁可以看到您的帖子。"
|
||||
public: "向所有用户公开。\n"
|
||||
home: "仅在首页时间线上发布。 关注者、从个人资料页查看过来的用户、以及通过转帖也能被别的用户看见。"
|
||||
followers: "仅对关注者可见。 除了您自己之外,没有人可以转贴,并且只有您的关注者可以查看它。\n"
|
||||
home: "仅发布至首页时间线。 仅您的关注者,以及从个人资料页、通过转帖,其他用户才能够看到。"
|
||||
followers: "仅关注者可见。 除了您自己,其他人无法转贴。"
|
||||
direct: "仅对指定用户公开,且收件人将收到通知。"
|
||||
doNotSendConfidencialOnDirect1: "发送敏感信息时请注意。\n"
|
||||
doNotSendConfidencialOnDirect2: "目标服务器的管理员可以看到发布的内容,因此如果您向不受信任的服务器上的用户发送私信,则在处理敏感信息时需要小心。"
|
||||
localOnly: "不将帖子通过联邦推送到其它服务器。 无论上述公开范围如何,其它服务器的用户将无法看到附加了此设定的帖子。\n"
|
||||
_cw:
|
||||
title: "隐藏内容 (CW)\n"
|
||||
description: "显示「注解」里的内容而不是正文。点击「查看更多」将会把正文显示出来。"
|
||||
title: "隐藏内容(CW)"
|
||||
description: "显示 “注释” 中的内容,而非正文。点击 “查看更多” 以显示正文。"
|
||||
_exampleNote:
|
||||
cw: "深夜报复社会"
|
||||
note: "茨了带巧克力的甜甜圈🍩😋"
|
||||
useCases: "用于服务器条款所规定的帖子,或对剧透内容和敏感内容进行自主规制。"
|
||||
_howToMakeAttachmentsSensitive:
|
||||
title: "如何标记附件为敏感内容?"
|
||||
description: "对于服务器方针所要求要求的,又或者不适合直接展示的附件,请添加「敏感」标记。\n"
|
||||
tryThisFile: "试试看,将附加到此窗口的图像标注为敏感!"
|
||||
description: "对于服务器守则所要求的,或不适合直接展示的附件,请添加 “敏感” 标记。"
|
||||
tryThisFile: "试试看!将添加到该窗口的图像标记为敏感内容。"
|
||||
_exampleNote:
|
||||
note: "拆纳豆包装时失手了…"
|
||||
method: "要标注附件为敏感内容,请单击该文件以打开菜单,然后单击「标记为敏感内容」。"
|
||||
sensitiveSucceeded: "附加文件时,请遵循服务器的条款来设置正确敏感设定。\n"
|
||||
method: "要标注附件为敏感内容,请单击该文件以打开菜单,然后单击 “标记为敏感内容”。"
|
||||
sensitiveSucceeded: "添加附件时,请遵循服务器的条款、适当设定敏感内容。"
|
||||
doItToContinue: "将图像标记为敏感后才能够继续"
|
||||
_done:
|
||||
title: "恭喜您,已经完成了教程🎉\n"
|
||||
@@ -1755,7 +1763,7 @@ _serverSettings:
|
||||
userGeneratedContentsVisibilityForVisitor_description: "对于防止诸如难以管理的不适当的远程内容通过自己的服务器意外地在互联网上公开等问题很有用。"
|
||||
userGeneratedContentsVisibilityForVisitor_description2: "包含服务器接收到的远程内容在内,无条件将服务器上的所有内容公开在互联网上存在风险。特别是对去中心化的特性不是很了解的访问者有可能将远程服务器上的内容误认为是在此服务器内生成的,需要特别留意。"
|
||||
restartServerSetupWizardConfirm_title: "要重新开始服务器初始设定向导吗?"
|
||||
restartServerSetupWizardConfirm_text: "现有的部分设定将重置。"
|
||||
restartServerSetupWizardConfirm_text: "当前的部分设置将被重置。"
|
||||
entrancePageStyle: "入口页面样式"
|
||||
showTimelineForVisitor: "显示时间线"
|
||||
showActivitiesForVisitor: "显示活动"
|
||||
@@ -1776,7 +1784,7 @@ _accountMigration:
|
||||
startMigration: "迁移"
|
||||
migrationConfirm: "确定要把此账户迁移到 {account} 吗?一旦确定后,此操作无法取消,此账户也无法以原来的状态使用。\n同时,请确认迁移后的账户,已创造别名。"
|
||||
movedAndCannotBeUndone: "该账户已被迁移。\n迁移操作无法撤销。"
|
||||
postMigrationNote: "这个账户的关注会在迁移操作后的 24 小时后解除。该账户的「关注中」和「关注者」皆会变为 0。由于不会解除关注关系,你的关注者仍然可以继续查看该账户发补给关注者的帖子。"
|
||||
postMigrationNote: "这个账户的关注会在迁移操作后的24小时后解除。该账户的 “关注中” 和 “关注者” 的数量都将变为0。由于不会解除关注关系,你的关注者仍然可以继续查看该账户发布的帖子。"
|
||||
movedTo: "迁移后的账户"
|
||||
_achievements:
|
||||
earnedAt: "达成时间"
|
||||
@@ -1882,7 +1890,7 @@ _achievements:
|
||||
description: "累计登录 1000 天"
|
||||
flavor: "感谢您使用 Misskey!"
|
||||
_noteClipped1:
|
||||
title: "忍不住要收藏到便签"
|
||||
title: "忍不住想加入便签"
|
||||
description: "第一次将帖子加入便签"
|
||||
_noteFavorited1:
|
||||
title: "观星者"
|
||||
@@ -1968,7 +1976,7 @@ _achievements:
|
||||
description: "引用了自己的帖子"
|
||||
_htl20npm:
|
||||
title: "流动的时间线"
|
||||
description: "在首页时间线的流速超过 20npm"
|
||||
description: "首页时间线中,帖子加载速度超过每分钟20篇"
|
||||
_viewInstanceChart:
|
||||
title: "分析师"
|
||||
description: "查看了服务器信息中的图表"
|
||||
@@ -2056,7 +2064,7 @@ _role:
|
||||
asBadge: "作为徽章显示"
|
||||
descriptionOfAsBadge: "开启后,用户名旁边将会出现角色图标。"
|
||||
isExplorable: "公开角色时间线"
|
||||
descriptionOfIsExplorable: "打开后将公开角色时间线。如果角色不是公开的,就无法公开时间线。"
|
||||
descriptionOfIsExplorable: "开启后将公开角色时间线。如果角色为非公开,则无法公开时间线。"
|
||||
displayOrder: "显示顺序"
|
||||
descriptionOfDisplayOrder: "数字越大,显示位置越靠前。"
|
||||
preserveAssignmentOnMoveAccount: "将分配状态继承到目标账户"
|
||||
@@ -2082,15 +2090,16 @@ _role:
|
||||
driveCapacity: "网盘容量"
|
||||
maxFileSize: "可上传的最大文件大小"
|
||||
maxFileSize_caption: "可能在反向代理或 CDN 等前端存在其它设定值。"
|
||||
maxFileSize_caption2: "服务器整体的最大文件大小限制为 {max}。若要允许上传大于此限制的文件,请在 Misskey 配置文件中放宽此设置。"
|
||||
alwaysMarkNsfw: "总是将文件标记为 NSFW"
|
||||
canUpdateBioMedia: "允许更新头像和横幅"
|
||||
pinMax: "帖子置顶数量限制"
|
||||
antennaMax: "可创建的最大天线数量"
|
||||
antennaMax: "可创建的天线数量"
|
||||
wordMuteMax: "折叠词的字数限制"
|
||||
webhookMax: "Webhook 创建数量限制"
|
||||
clipMax: "便签创建数量限制"
|
||||
webhookMax: "可创建的 Webhook 的数量"
|
||||
clipMax: "可创建的便签数量"
|
||||
noteEachClipsMax: "便签内贴文的最大数量"
|
||||
userListMax: "用户列表创建数量限制"
|
||||
userListMax: "可创建的用户列表数量"
|
||||
userEachUserListsMax: "单个用户列表内用户数量限制"
|
||||
rateLimitFactor: "速率限制"
|
||||
descriptionOfRateLimitFactor: "值越小限制越少,值越大限制越多。"
|
||||
@@ -2120,13 +2129,13 @@ _role:
|
||||
isBot: "机器人用户"
|
||||
isSuspended: "停用的用户"
|
||||
isLocked: "锁推用户"
|
||||
isExplorable: "启用“使账号可见”的用户"
|
||||
isExplorable: "启用 “使账号可见” 的用户"
|
||||
createdLessThan: "账户创建时间少于"
|
||||
createdMoreThan: "账户创建时间超过"
|
||||
followersLessThanOrEq: "关注者不多于"
|
||||
followersMoreThanOrEq: "关注者不少于"
|
||||
followingLessThanOrEq: "关注中不多于"
|
||||
followingMoreThanOrEq: "关注中不少于"
|
||||
followingLessThanOrEq: "关注人数不多于"
|
||||
followingMoreThanOrEq: "关注人数不少于"
|
||||
notesLessThanOrEq: "帖子数在~以下"
|
||||
notesMoreThanOrEq: "帖子数在~以上"
|
||||
and: "符合以下全部条件"
|
||||
@@ -2149,7 +2158,7 @@ _emailUnavailable:
|
||||
banned: "无法使用此邮件地址注册"
|
||||
_ffVisibility:
|
||||
public: "公开"
|
||||
followers: "只有关注你的用户能看到"
|
||||
followers: "仅关注者可见"
|
||||
private: "私密"
|
||||
_signup:
|
||||
almostThere: "即将完成"
|
||||
@@ -2168,7 +2177,7 @@ _ad:
|
||||
hide: "不显示"
|
||||
timezoneinfo: "星期几是根据服务器的时区确定的。"
|
||||
adsSettings: "广告设置"
|
||||
notesPerOneAd: "在实时更新时间线中插入广告的间隔(帖子个数)"
|
||||
notesPerOneAd: "实时更新时插入广告的间隔(每条帖文)"
|
||||
setZeroToDisable: "设为 0 将不在实时更新时间线中投放广告"
|
||||
adsTooClose: "广告投放时间间隔过短将可能显著损害用户体验。"
|
||||
_forgotPassword:
|
||||
@@ -2176,8 +2185,8 @@ _forgotPassword:
|
||||
ifNoEmail: "如果您没有设置电子邮件地址,请联系管理员。"
|
||||
contactAdmin: "该服务器不支持发送电子邮件。如果您想重设密码,请联系管理员。"
|
||||
_gallery:
|
||||
my: "我的图集"
|
||||
liked: "喜欢的图集"
|
||||
my: "我的相册"
|
||||
liked: "喜欢的相册"
|
||||
like: "喜欢!"
|
||||
unlike: "取消喜欢"
|
||||
_email:
|
||||
@@ -2199,12 +2208,12 @@ _preferencesBackups:
|
||||
save: "覆盖存档"
|
||||
inputName: "请输入备份的名称"
|
||||
cannotSave: "无法保存"
|
||||
nameAlreadyExists: "备份名称 \"{name}\" 已经存在,请指定其他名称。"
|
||||
nameAlreadyExists: "备份名称 “{name}” 已经存在,请指定其他名称。"
|
||||
applyConfirm: "您是否要将备份 \"{name}\" 应用到当前设备上?当前设备现有配置将被丢弃。"
|
||||
saveConfirm: "您确定要覆盖保存 {name} 吗?"
|
||||
deleteConfirm: "您确定要删除 {name} 吗?"
|
||||
renameConfirm: "您确定要把“{old}”改为“{new}”吗?"
|
||||
noBackups: "当前没有备份,“另存为”允许您在服务器上保存当前客户端的配置。"
|
||||
renameConfirm: "确定要把 “{old}” 改为 “{new}” 吗?"
|
||||
noBackups: "当前没有备份,“另存为” 允许您在服务器上保存当前客户端的配置。"
|
||||
createdAt: "创建日期:{date} {time}"
|
||||
updatedAt: "更新日期:{date} {time}"
|
||||
cannotLoad: "无法加载"
|
||||
@@ -2245,13 +2254,13 @@ _channel:
|
||||
setBanner: "设置横幅"
|
||||
removeBanner: "删除横幅"
|
||||
featured: "热门"
|
||||
owned: "正在管理"
|
||||
owned: "我的频道"
|
||||
following: "正在关注"
|
||||
usersCount: "有{n}人参与"
|
||||
notesCount: "有{n}个帖子"
|
||||
usersCount: "{n} 人参与"
|
||||
notesCount: "{n} 篇帖子"
|
||||
nameAndDescription: "名称与描述"
|
||||
nameOnly: "仅名称"
|
||||
allowRenoteToExternal: "允许转发到频道外和引用"
|
||||
allowRenoteToExternal: "允许转发至频道外及引用"
|
||||
_menuDisplay:
|
||||
sideFull: "横向"
|
||||
sideIcon: "横向(图标)"
|
||||
@@ -2264,7 +2273,7 @@ _wordMute:
|
||||
_instanceMute:
|
||||
instanceMuteDescription: "隐藏来自这些服务器的所有帖子和转贴,包括这些服务器上用户的回复。"
|
||||
instanceMuteDescription2: "通过换行符分隔进行设置"
|
||||
title: "下面实例中的帖子将被隐藏。"
|
||||
title: "以下服务器中的帖子将被隐藏。"
|
||||
heading: "已隐藏的服务器"
|
||||
_theme:
|
||||
explore: "寻找主题"
|
||||
@@ -2337,7 +2346,7 @@ _sfx:
|
||||
note: "帖子"
|
||||
noteMy: "发帖"
|
||||
notification: "通知"
|
||||
reaction: "选择回应时"
|
||||
reaction: "添加回应"
|
||||
chatMessage: "私信"
|
||||
_soundSettings:
|
||||
driveFile: "使用网盘内的音频"
|
||||
@@ -2436,7 +2445,7 @@ _permissions:
|
||||
"write:gallery-likes": "管理喜欢的相册"
|
||||
"read:flash": "查看 Play"
|
||||
"write:flash": "编辑 Play"
|
||||
"read:flash-likes": "查看 Play 的点赞"
|
||||
"read:flash-likes": "查看喜欢的 Play"
|
||||
"write:flash-likes": "编辑 Play 的点赞列表"
|
||||
"read:admin:abuse-user-reports": "查看来自用户的举报"
|
||||
"write:admin:delete-account": "删除用户账户"
|
||||
@@ -2446,7 +2455,7 @@ _permissions:
|
||||
"read:admin:user-ips": "查看用户 IP 地址"
|
||||
"read:admin:meta": "查看实例的元数据"
|
||||
"write:admin:reset-password": "重置用户密码"
|
||||
"write:admin:resolve-abuse-user-report": "将来自用户的报告标记为「已解决」"
|
||||
"write:admin:resolve-abuse-user-report": "处理来自用户的举报"
|
||||
"write:admin:send-email": "发送邮件"
|
||||
"read:admin:server-info": "查看服务器信息"
|
||||
"read:admin:show-moderation-log": "查看管理日志"
|
||||
@@ -2474,16 +2483,16 @@ _permissions:
|
||||
"read:admin:emoji": "查看表情符号"
|
||||
"write:admin:queue": "编辑作业队列"
|
||||
"read:admin:queue": "查看作业队列相关情报"
|
||||
"write:admin:promo": "运营推广说明"
|
||||
"write:admin:promo": "编辑推广帖文"
|
||||
"write:admin:drive": "管理用户网盘"
|
||||
"read:admin:drive": "查看用户网盘相关情报"
|
||||
"read:admin:drive": "查看用户网盘的相关信息"
|
||||
"read:admin:stream": "使用管理员用的 Websocket API"
|
||||
"write:admin:ad": "管理广告"
|
||||
"read:admin:ad": "查看广告"
|
||||
"write:invite-codes": "生成邀请码"
|
||||
"read:invite-codes": "获取已发行的邀请码"
|
||||
"write:clip-favorite": "管理喜欢的便签"
|
||||
"read:clip-favorite": "查看便签的点赞"
|
||||
"read:clip-favorite": "查看收藏的便签"
|
||||
"read:federation": "查看联邦相关信息"
|
||||
"write:report-abuse": "举报用户"
|
||||
"write:chat": "撰写或删除消息"
|
||||
@@ -2519,7 +2528,7 @@ _weekday:
|
||||
_widgets:
|
||||
profile: "个人资料"
|
||||
instanceInfo: "服务器信息"
|
||||
memo: "便利贴"
|
||||
memo: "便签"
|
||||
notifications: "通知"
|
||||
timeline: "时间线"
|
||||
calendar: "日历"
|
||||
@@ -2599,7 +2608,7 @@ _poll:
|
||||
expiration: "截止时间"
|
||||
infinite: "永久"
|
||||
at: "指定日期"
|
||||
after: "指定时间"
|
||||
after: "指定时长"
|
||||
deadlineDate: "截止日期"
|
||||
deadlineTime: "时间"
|
||||
duration: "期限"
|
||||
@@ -2615,20 +2624,20 @@ _poll:
|
||||
remainingSeconds: "{s}秒后截止"
|
||||
_visibility:
|
||||
public: "公开"
|
||||
publicDescription: "您的帖子将出现在全局时间线上"
|
||||
publicDescription: "所有用户均可见"
|
||||
home: "首页"
|
||||
homeDescription: "仅发送至首页的时间线"
|
||||
homeDescription: "仅发布至首页"
|
||||
followers: "仅关注者"
|
||||
followersDescription: "仅发送至关注者"
|
||||
followersDescription: "仅关注者可见"
|
||||
specified: "指定用户"
|
||||
specifiedDescription: "仅发送至指定用户"
|
||||
disableFederation: "仅限本地"
|
||||
disableFederationDescription: "不发送到其他服务器"
|
||||
_postForm:
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "还有未上传的文件,要丢弃并关闭窗口吗?"
|
||||
quitInspiteOfThereAreUnuploadedFilesConfirm: "还有一些文件尚未上传,要放弃上传并关闭窗口吗?"
|
||||
uploaderTip: "文件尚未上传。您可以在文件菜单中设置重命名、裁剪图片、添加水印以及是否压缩等功能。文件将在帖子发布时自动上传。"
|
||||
replyPlaceholder: "回复这个帖子..."
|
||||
quotePlaceholder: "引用这个帖子..."
|
||||
replyPlaceholder: "回复该帖…"
|
||||
quotePlaceholder: "引用该贴…"
|
||||
channelPlaceholder: "发布到频道…"
|
||||
showHowToUse: "显示窗口说明"
|
||||
_howToUse:
|
||||
@@ -2645,12 +2654,12 @@ _postForm:
|
||||
submit_title: "发帖按钮"
|
||||
submit_description: "发布帖子。也可用 Ctrl + Enter / Cmd + Enter 来发帖。"
|
||||
_placeholders:
|
||||
a: "现在怎么样?"
|
||||
b: "想好发些什么了吗?"
|
||||
a: "最近怎么样?"
|
||||
b: "有什么新鲜事吗?"
|
||||
c: "在想些什么呢?"
|
||||
d: "你想要发布些什么吗?"
|
||||
e: "请写下来吧"
|
||||
f: "等待您的发布..."
|
||||
d: "想说些什么?"
|
||||
e: "写些什么吧"
|
||||
f: "期待您的发文…"
|
||||
_profile:
|
||||
name: "昵称"
|
||||
username: "用户名"
|
||||
@@ -2783,8 +2792,8 @@ _notification:
|
||||
fileUploaded: "文件已上传"
|
||||
youGotMention: "来自{name}的提及"
|
||||
youGotReply: "来自{name}的回复"
|
||||
youGotQuote: "来自{name}的引用"
|
||||
youRenoted: "来自{name}的转发"
|
||||
youGotQuote: "{name} 引用了您"
|
||||
youRenoted: "{name} 转发你的帖子"
|
||||
youWereFollowed: "关注了你"
|
||||
youReceivedFollowRequest: "您有新的关注请求"
|
||||
yourFollowRequestAccepted: "您的关注请求已通过"
|
||||
@@ -2809,14 +2818,14 @@ _notification:
|
||||
exportOfXCompleted: "已完成 {x} 的导出"
|
||||
login: "有新的登录"
|
||||
createToken: "访问令牌已创建"
|
||||
createTokenDescription: "如果不明白其用途,请遵循「{text}」的指示删除访问令牌。"
|
||||
createTokenDescription: "如果不明白其用途,请遵循 “{text}” 的指示删除访问令牌。"
|
||||
_types:
|
||||
all: "全部"
|
||||
note: "用户的新帖子"
|
||||
follow: "关注中"
|
||||
mention: "提及"
|
||||
reply: "回复"
|
||||
renote: "转发"
|
||||
renote: "转贴"
|
||||
quote: "引用"
|
||||
reaction: "回应"
|
||||
pollEnded: "问卷调查结束"
|
||||
@@ -2856,9 +2865,9 @@ _deck:
|
||||
deleteProfile: "删除配置文件"
|
||||
introduction: "将各列进行组合以创建您自己的界面!"
|
||||
introduction2: "可以随时通过屏幕右侧的 + 来添加列"
|
||||
widgetsIntroduction: "从列菜单中,选择“小工具编辑”来添加小工具"
|
||||
widgetsIntroduction: "从列菜单中,选择 “小工具编辑” 来添加小工具"
|
||||
useSimpleUiForNonRootPages: "使用简易UI显示导航页面"
|
||||
usedAsMinWidthWhenFlexible: "「自适应宽度」被启用的时候,这就是最小的宽度"
|
||||
usedAsMinWidthWhenFlexible: "如果启用 “自适应宽度”,此为最小宽度"
|
||||
flexible: "自适应宽度"
|
||||
enableSyncBetweenDevicesForProfiles: "启用配置文件跨设备同步"
|
||||
showHowToUse: "查看用户界面说明"
|
||||
@@ -2895,7 +2904,7 @@ _webhookSettings:
|
||||
modifyWebhook: "编辑 webhook"
|
||||
name: "名称"
|
||||
secret: "密钥"
|
||||
trigger: "触发器"
|
||||
trigger: "触发"
|
||||
active: "已启用"
|
||||
_events:
|
||||
follow: "关注时"
|
||||
@@ -2955,8 +2964,8 @@ _moderationLogTypes:
|
||||
suspendRemoteInstance: "停止远程服务器"
|
||||
unsuspendRemoteInstance: "恢复远程服务器"
|
||||
updateRemoteInstanceNote: "更新远程服务器的管理笔记"
|
||||
markSensitiveDriveFile: "标记网盘文件为敏感媒体"
|
||||
unmarkSensitiveDriveFile: "取消标记网盘文件为敏感媒体"
|
||||
markSensitiveDriveFile: "标记为敏感内容"
|
||||
unmarkSensitiveDriveFile: "取消标记为敏感内容"
|
||||
resolveAbuseReport: "处理举报"
|
||||
forwardAbuseReport: "转发举报"
|
||||
updateAbuseReportNote: "更新举报用管理笔记"
|
||||
@@ -3035,10 +3044,10 @@ _dataSaver:
|
||||
description: "防止自动加载图像和视频。 点击隐藏的图像/视频即可加载它们。\n"
|
||||
_avatar:
|
||||
title: "头像"
|
||||
description: "不播放头像的动画。 由于动态图像的文件大小远大于一般图像,停止播放能够进一步节省数据流量。"
|
||||
description: "不播放动态头像。 动态图像的文件大小远大于一般图像,不播放能够节省更多数据流量。"
|
||||
_urlPreviewThumbnail:
|
||||
title: "不显示 URL预览缩略图"
|
||||
description: "将不再加载 URL 预览缩略图。"
|
||||
title: "隐藏 URL 预览图"
|
||||
description: "不再加载 URL 预览图。"
|
||||
_disableUrlPreview:
|
||||
title: "禁用 URL 预览"
|
||||
description: "关闭 URL 预览功能。与预览缩略图不同,减少了链接信息的加载。"
|
||||
@@ -3172,8 +3181,8 @@ _customEmojisManager:
|
||||
_register:
|
||||
uploadSettingTitle: "上传设置"
|
||||
uploadSettingDescription: "可以在此页面设置上传表情符号时的行为。"
|
||||
directoryToCategoryLabel: "将目录名设为「category」"
|
||||
directoryToCategoryCaption: "拖放目录时,将目录名设置为「category」"
|
||||
directoryToCategoryLabel: "将目录名设为 “category”"
|
||||
directoryToCategoryCaption: "拖放目录时,将目录名设置为 “category”。"
|
||||
confirmRegisterEmojisDescription: "要将列表内显示的表情符号替换为新的自定义表情符号吗?(为降低服务器负载,一次操作最多只能注册 {count} 个表情符号)"
|
||||
confirmClearEmojisDescription: "要放弃编辑并将列表内表示的表情符号清空吗?"
|
||||
confirmUploadEmojisDescription: "要将拖放的 {count} 个文件上传到网盘上吗?"
|
||||
@@ -3193,7 +3202,7 @@ _embedCodeGen:
|
||||
codeGeneratedDescription: "将生成的代码贴到网站上来使用。"
|
||||
_selfXssPrevention:
|
||||
warning: "警告"
|
||||
title: "「在此处粘贴什么东西」是欺诈行为。"
|
||||
title: "任何要求 “在屏幕上贴些什么吧” 的都是诈骗。"
|
||||
description1: "如果在此处粘贴了什么,恶意用户可能会接管账户或者盗取个人资料。"
|
||||
description2: "如果不能完全理解将要粘贴的内容,%c 请立即停止操作并关闭这个窗口。"
|
||||
description3: "详情请看这里。{link}"
|
||||
@@ -3212,7 +3221,7 @@ _remoteLookupErrors:
|
||||
description: "与该服务器的通信失败。对面服务器可能不可用。另外,请确认是否输入了无效或不存在的 URI。"
|
||||
_responseInvalid:
|
||||
title: "响应无效"
|
||||
description: "成功与此服务器通信,但返回的数据无效。"
|
||||
description: "成功与该服务器建立通信,但获取的数据有误。"
|
||||
_noSuchObject:
|
||||
title: "未找到"
|
||||
description: "未找到请求的资源。请再次检查 URI。"
|
||||
@@ -3250,6 +3259,8 @@ _search:
|
||||
pleaseEnterServerHost: "请填写服务器的主机名称"
|
||||
pleaseSelectUser: "请选择用户"
|
||||
serverHostPlaceholder: "如:misskey.example.com"
|
||||
postFrom: "起始日期"
|
||||
postTo: "终止日期"
|
||||
_serverSetupWizard:
|
||||
installCompleted: "Misskey 安装完成!"
|
||||
firstCreateAccount: "首先,创建一个管理员帐户。"
|
||||
@@ -3276,7 +3287,7 @@ _serverSetupWizard:
|
||||
largeScaleServerAdvice: "运营大规模服务器可能需要高级基础设施知识,如负载均衡和数据库复制。"
|
||||
doYouConnectToFediverse: "要加入 Fediverse 吗?"
|
||||
doYouConnectToFediverse_description1: "若加入由分散性服务器所构成的网络(Fediverse),将能与其它服务器交换内容。"
|
||||
doYouConnectToFediverse_description2: "加入 Fediverse 在这里被称为「联邦」。"
|
||||
doYouConnectToFediverse_description2: "接入 Fediverse 被称为 “联邦”。"
|
||||
youCanConfigureMoreFederationSettingsLater: "可在之后进行如哪些服务器允许进行联邦交互等高级设置。"
|
||||
remoteContentsCleaning: "自动清理传入内容"
|
||||
remoteContentsCleaning_description: "开启联邦互通后,服务器将持续接收大量内容。打开自动清理后,将自动删除无法找到的旧内容,可节省存储空间。"
|
||||
@@ -3288,7 +3299,7 @@ _serverSetupWizard:
|
||||
skipSettings: "跳过设置"
|
||||
settingsCompleted: "设置完成!"
|
||||
settingsCompleted_description: "辛苦了。设置已完成,可以立即开始使用服务器了。"
|
||||
settingsCompleted_description2: "服务器的详细设置可在「控制面板」进行。"
|
||||
settingsCompleted_description2: "服务器的详细设置可在 “控制面板” 进行。"
|
||||
donationRequest: "请求捐助"
|
||||
_donationRequest:
|
||||
text1: "Misskey 是由志愿者开发的免费软件。"
|
||||
@@ -3302,7 +3313,7 @@ _uploader:
|
||||
doneConfirm: "部分文件尚未上传,是否继续?"
|
||||
maxFileSizeIsX: "可上传最大 {x} 的文件。"
|
||||
allowedTypes: "可上传的文件类型"
|
||||
tip: "文件尚未上传。在此对话框中,您可以进行上传前的确认、重命名、压缩和裁剪等操作。准备就绪后,点击“上传”按钮即可开始上传。"
|
||||
tip: "文件尚未上传。在此对话框中,您可以进行上传前的确认、重命名、压缩和裁剪等操作。准备就绪后,点击 “上传” 按钮即可开始上传。"
|
||||
_clientPerformanceIssueTip:
|
||||
title: "如果觉得电池耗电过高"
|
||||
makeSureDisabledAdBlocker: "请关闭广告拦截器"
|
||||
@@ -3413,31 +3424,31 @@ _drafts:
|
||||
cannotCreateDraftAnymore: "已超过可创建的草稿数量。"
|
||||
cannotCreateDraft: "此内容无法创建草稿。"
|
||||
delete: "删除草稿"
|
||||
deleteAreYouSure: "要删除草稿吗?"
|
||||
deleteAreYouSure: "确认删除草稿吗?"
|
||||
noDrafts: "没有草稿"
|
||||
replyTo: "回复给 {user}"
|
||||
quoteOf: "对 {user} 帖子的引用"
|
||||
quoteOf: "引用自 {user} 的帖子"
|
||||
postTo: "向 {channel} 的投稿"
|
||||
saveToDraft: "保存到草稿"
|
||||
restoreFromDraft: "从草稿恢复"
|
||||
restore: "恢复"
|
||||
listDrafts: "草稿一览"
|
||||
listDrafts: "草稿列表"
|
||||
schedule: "定时发布"
|
||||
listScheduledNotes: "定时发布列表"
|
||||
cancelSchedule: "取消定时"
|
||||
qr: "二维码"
|
||||
_qr:
|
||||
showTabTitle: "显示"
|
||||
readTabTitle: "读取"
|
||||
readTabTitle: "扫描"
|
||||
shareTitle: "{name} {acct}"
|
||||
shareText: "请在 Fediverse 上关注我!"
|
||||
chooseCamera: "选择相机"
|
||||
chooseCamera: "切换镜头"
|
||||
cannotToggleFlash: "无法开关闪光灯"
|
||||
turnOnFlash: "打开闪光灯"
|
||||
turnOnFlash: "开启闪光灯"
|
||||
turnOffFlash: "关闭闪光灯"
|
||||
startQr: "重新打开二维码扫描器"
|
||||
stopQr: "关闭二维码扫描器"
|
||||
stopQr: "关闭扫码器"
|
||||
noQrCodeFound: "未找到二维码"
|
||||
scanFile: "扫描设备上的图像"
|
||||
scanFile: "从设备扫描图像"
|
||||
raw: "文本"
|
||||
mfm: "MFM"
|
||||
|
||||
+20
-8
@@ -136,8 +136,8 @@ emojiPicker: "表情符號選擇器"
|
||||
pinnedEmojisForReactionSettingDescription: "選擇反應時可以設定要固定顯示在頂端的表情符號"
|
||||
pinnedEmojisSettingDescription: "輸入表情符號時可以設定要固定顯示在頂端的表情符號"
|
||||
emojiPickerDisplay: "顯示表情符號選擇器"
|
||||
overwriteFromPinnedEmojisForReaction: "從反應複寫設定"
|
||||
overwriteFromPinnedEmojis: "從一般複寫設定"
|
||||
overwriteFromPinnedEmojisForReaction: "覆寫反應的設定"
|
||||
overwriteFromPinnedEmojis: "覆寫一般的設定"
|
||||
reactionSettingDescription2: "拖動以交換,點擊以刪除,按下「+」以新增。"
|
||||
rememberNoteVisibility: "記住貼文可見性"
|
||||
attachCancel: "移除附件"
|
||||
@@ -219,7 +219,7 @@ perDay: "每日"
|
||||
stopActivityDelivery: "停止發送活動"
|
||||
blockThisInstance: "封鎖此伺服器"
|
||||
silenceThisInstance: "禁言此伺服器"
|
||||
mediaSilenceThisInstance: "將這個伺服器的媒體設為禁言"
|
||||
mediaSilenceThisInstance: "將這個伺服器的媒體設為禁言(隱藏媒體預覽)"
|
||||
operations: "操作"
|
||||
software: "軟體"
|
||||
softwareName: "軟體名稱"
|
||||
@@ -227,7 +227,7 @@ version: "版本"
|
||||
metadata: "詮釋資料"
|
||||
withNFiles: "{n} 個檔案"
|
||||
monitor: "監視器"
|
||||
jobQueue: "佇列"
|
||||
jobQueue: "工作佇列"
|
||||
cpuAndMemory: "CPU 及記憶體"
|
||||
network: "網路"
|
||||
disk: "硬碟"
|
||||
@@ -237,7 +237,7 @@ clearQueue: "清除佇列"
|
||||
clearQueueConfirmTitle: "確定要清除佇列嗎?"
|
||||
clearQueueConfirmText: "未成功發佈的貼文將不會再嘗試發佈。通常不需要進行這項操作。"
|
||||
clearCachedFiles: "清除快取資料"
|
||||
clearCachedFilesConfirm: "確定要清除所有遠端暫存資料嗎?"
|
||||
clearCachedFilesConfirm: "確定要刪除所有快取的遠端資料嗎?"
|
||||
blockedInstances: "已封鎖的伺服器"
|
||||
blockedInstancesDescription: "請逐行輸入需要封鎖的伺服器。已封鎖的伺服器將無法與本伺服器進行通訊。"
|
||||
silencedInstances: "被禁言的伺服器"
|
||||
@@ -753,6 +753,8 @@ optional: "可選"
|
||||
createNewClip: "建立新摘錄"
|
||||
unclip: "解除摘錄"
|
||||
confirmToUnclipAlreadyClippedNote: "此貼文已包含在摘錄「{name}」中。 你想將貼文從這個摘錄中排除嗎?"
|
||||
removeFromAntenna: "從這個天線刪除"
|
||||
removeNoteFromAntennaConfirm: "要從「{name}」刪除這則貼文嗎?"
|
||||
public: "公開"
|
||||
private: "私密"
|
||||
i18nInfo: "Misskey 已被志願者們翻譯成各種語言版本。您可以前往 {link} 以協助翻譯。"
|
||||
@@ -1217,6 +1219,7 @@ keepScreenOn: "保持裝置螢幕開啟"
|
||||
verifiedLink: "已驗證連結"
|
||||
notifyNotes: "開啟貼文通知"
|
||||
unnotifyNotes: "關閉貼文通知"
|
||||
notifyUsers: "設定了貼文通知的使用者"
|
||||
authentication: "驗證"
|
||||
authenticationRequiredToContinue: "請於繼續前完成驗證"
|
||||
dateAndTime: "日期與時間"
|
||||
@@ -1358,14 +1361,11 @@ information: "關於"
|
||||
chat: "聊天"
|
||||
directMessage: "直接訊息"
|
||||
directMessage_short: "訊息"
|
||||
migrateOldSettings: "遷移舊設定資訊"
|
||||
migrateOldSettings_description: "通常情況下,這會自動進行,但若因某些原因未能順利遷移,您可以手動觸發遷移處理。請注意,當前的設定資訊將會被覆寫。"
|
||||
compress: "壓縮"
|
||||
right: "右"
|
||||
bottom: "下"
|
||||
top: "上"
|
||||
embed: "嵌入"
|
||||
settingsMigrating: "正在移轉設定。請稍候……(之後也可以到「設定 → 其他 → 舊設定資訊移轉」中手動進行移轉)"
|
||||
readonly: "唯讀"
|
||||
goToDeck: "回到多欄模式"
|
||||
federationJobs: "聯邦通訊作業"
|
||||
@@ -1409,6 +1409,14 @@ presets: "預設值"
|
||||
zeroPadding: "補零"
|
||||
nothingToConfigure: "無可設定的項目"
|
||||
viewRenotedChannel: "顯示轉發貼文者的頻道"
|
||||
previewingTheme: "正在預覽主題"
|
||||
previewingThemeRestore: "復原"
|
||||
accessToken: "存取權杖"
|
||||
chooseEmojiPalette: "選擇表情符號調色盤"
|
||||
addToEmojiPalette: "增加表情符號調色盤"
|
||||
emojiPaletteAlreadyAddedConfirm: "此表情符號在這個表情符號調色盤裡已經有了。確定要增加嗎?"
|
||||
append: "加在最後"
|
||||
prepend: "加在前面"
|
||||
_imageEditing:
|
||||
_vars:
|
||||
caption: "檔案標題"
|
||||
@@ -2082,6 +2090,7 @@ _role:
|
||||
driveCapacity: "雲端硬碟容量"
|
||||
maxFileSize: "可上傳的最大檔案大小"
|
||||
maxFileSize_caption: "前端可能還有其他設定值,例如反向代理或 CDN。"
|
||||
maxFileSize_caption2: "伺服器整體的最大檔案大小設定為 {max}。若要允許上傳更大的檔案,請在 Misskey 設定檔中放寬此設定。"
|
||||
alwaysMarkNsfw: "總是將檔案標記為NSFW"
|
||||
canUpdateBioMedia: "允許更新大頭貼和橫幅"
|
||||
pinMax: "置頂貼文的最大數量"
|
||||
@@ -2098,6 +2107,7 @@ _role:
|
||||
canSearchNotes: "可否搜尋貼文"
|
||||
canSearchUsers: "可使用使用者搜尋功能"
|
||||
canUseTranslator: "使用翻譯功能"
|
||||
canCreateChannel: "建立頻道"
|
||||
avatarDecorationLimit: "頭像可掛上的最大裝飾數量"
|
||||
canImportAntennas: "允許匯入天線"
|
||||
canImportBlocking: "允許匯入封鎖名單"
|
||||
@@ -3249,6 +3259,8 @@ _search:
|
||||
pleaseEnterServerHost: "請輸入伺服器的主機名稱"
|
||||
pleaseSelectUser: "請選擇使用者"
|
||||
serverHostPlaceholder: "例:misskey.example.com"
|
||||
postFrom: "發布時間 from"
|
||||
postTo: "發布時間 to"
|
||||
_serverSetupWizard:
|
||||
installCompleted: "Misskey 的安裝已經完成了!"
|
||||
firstCreateAccount: "首先,請建立管理者帳戶。"
|
||||
|
||||
+30
-37
@@ -1,24 +1,26 @@
|
||||
{
|
||||
"name": "misskey",
|
||||
"version": "2026.6.0-alpha.0",
|
||||
"version": "2026.7.0-beta.4",
|
||||
"codename": "nasubi",
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/misskey-dev/misskey.git"
|
||||
},
|
||||
"packageManager": "pnpm@11.1.2",
|
||||
"packageManager": "pnpm@11.11.0",
|
||||
"workspaces": [
|
||||
"packages/misskey-js",
|
||||
"packages/backend",
|
||||
"packages/frontend-shared",
|
||||
"packages/frontend",
|
||||
"packages/frontend-builder",
|
||||
"packages/frontend-embed",
|
||||
"packages/i18n",
|
||||
"packages/icons-subsetter",
|
||||
"packages/sw",
|
||||
"packages/misskey-js",
|
||||
"packages/misskey-js/generator",
|
||||
"packages/misskey-reversi",
|
||||
"packages/misskey-bubble-game",
|
||||
"packages/icons-subsetter",
|
||||
"packages/frontend-shared",
|
||||
"packages/frontend-builder",
|
||||
"packages/sw",
|
||||
"packages/backend",
|
||||
"packages/frontend",
|
||||
"packages/frontend-embed"
|
||||
"packages-private/*"
|
||||
],
|
||||
"private": true,
|
||||
"scripts": {
|
||||
@@ -39,11 +41,10 @@
|
||||
"migrateandstart": "pnpm migrate && pnpm start",
|
||||
"watch": "pnpm dev",
|
||||
"dev": "node scripts/dev.mjs",
|
||||
"lint": "pnpm --no-bail -r lint",
|
||||
"cy:open": "pnpm cypress open --config-file=cypress.config.ts",
|
||||
"cy:run": "pnpm cypress run",
|
||||
"e2e": "pnpm start-server-and-test start:test http://localhost:61812 cy:run",
|
||||
"e2e-dev-container": "ncp ./.config/cypress-devcontainer.yml ./.config/test.yml && pnpm start-server-and-test start:test http://localhost:61812 cy:run",
|
||||
"check-dts": "node scripts/check-dts.mjs",
|
||||
"lint": "pnpm --no-bail -r lint && pnpm check-dts",
|
||||
"e2e": "pnpm start-server-and-test start:test http://localhost:61812 \"pnpm --filter frontend test:e2e\"",
|
||||
"e2e-dev-container": "ncp ./.config/playwright-devcontainer.yml ./.config/test.yml && pnpm start-server-and-test start:test http://localhost:61812 \"pnpm --filter frontend test:e2e\"",
|
||||
"backend-unit-test": "cd packages/backend && pnpm test",
|
||||
"backend-unit-test-and-coverage": "cd packages/backend && pnpm test-and-coverage",
|
||||
"test": "pnpm -r test",
|
||||
@@ -53,33 +54,25 @@
|
||||
"cleanall": "pnpm clean-all"
|
||||
},
|
||||
"dependencies": {
|
||||
"cssnano": "8.0.1",
|
||||
"esbuild": "0.28.0",
|
||||
"esbuild": "0.28.1",
|
||||
"execa": "9.6.1",
|
||||
"ignore-walk": "8.0.0",
|
||||
"js-yaml": "4.1.1",
|
||||
"postcss": "8.5.14",
|
||||
"tar": "7.5.15",
|
||||
"terser": "5.47.1"
|
||||
"ignore-walk": "9.0.0",
|
||||
"js-yaml": "5.2.1",
|
||||
"tar": "7.5.20"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@eslint/js": "9.39.4",
|
||||
"@eslint/js": "9.39.5",
|
||||
"@misskey-dev/eslint-plugin": "2.1.0",
|
||||
"@types/js-yaml": "4.0.9",
|
||||
"@types/node": "24.12.4",
|
||||
"@typescript-eslint/eslint-plugin": "8.59.3",
|
||||
"@typescript-eslint/parser": "8.59.3",
|
||||
"@typescript/native-preview": "7.0.0-dev.20260426.1",
|
||||
"@types/node": "26.1.1",
|
||||
"@typescript-eslint/eslint-plugin": "8.63.0",
|
||||
"@typescript-eslint/parser": "8.63.0",
|
||||
"@typescript/native": "npm:typescript@7.0.2",
|
||||
"cross-env": "10.1.0",
|
||||
"cypress": "15.15.0",
|
||||
"eslint": "9.39.4",
|
||||
"globals": "17.6.0",
|
||||
"eslint": "9.39.5",
|
||||
"globals": "17.7.0",
|
||||
"ncp": "2.0.0",
|
||||
"pnpm": "11.1.2",
|
||||
"start-server-and-test": "3.0.5",
|
||||
"typescript": "5.9.3"
|
||||
},
|
||||
"optionalDependencies": {
|
||||
"@tensorflow/tfjs-core": "4.22.0"
|
||||
"pnpm": "11.11.0",
|
||||
"start-server-and-test": "3.0.11",
|
||||
"typescript": "npm:@typescript/typescript6@6.0.2"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
# packages-private
|
||||
|
||||
`packages-private` は、CIなどで使用するためのユーティリティなどを格納する場所です。この配下にあるものは**プロダクションの `/packages`**の依存となるものではありません。
|
||||
|
||||
## パッケージ一覧
|
||||
|
||||
| パッケージ | 用途 |
|
||||
| --- | --- |
|
||||
| [`diagnostics-shared`](./diagnostics-shared) | 計測系パッケージが共有する統計・書式整形・V8 heap snapshot解析のユーティリティ |
|
||||
| [`diagnostics-backend`](./diagnostics-backend) | バックエンドのメモリ使用量をbase/headで比較し、PRコメント用のMarkdownを生成する |
|
||||
| [`diagnostics-frontend`](./diagnostics-frontend) | フロントエンドをブラウザで起動した際のメトリクスと生成されたchunk情報等をbase/headで比較する |
|
||||
| [`changelog-checker`](./changelog-checker) | `CHANGELOG.md` の追記内容を検証する |
|
||||
|
||||
## GitHub Actionsからの呼び出し方
|
||||
|
||||
ワークフロー側にロジックを持たせず、各パッケージのnpm scriptを呼ぶだけにしている。
|
||||
CLIに渡すパスはすべて呼び出し側のカレントディレクトリ基準で解決されるため、
|
||||
ワークフローからは `$GITHUB_WORKSPACE` / `$RUNNER_TEMP` を使った絶対パスを渡すこと。
|
||||
|
||||
```yaml
|
||||
- name: Generate report
|
||||
working-directory: head
|
||||
run: >-
|
||||
pnpm --filter diagnostics-frontend run render-md
|
||||
"$GITHUB_WORKSPACE/base" "$GITHUB_WORKSPACE/head"
|
||||
"$REPORT_DIR/base-bundle-stats.json" "$REPORT_DIR/head-bundle-stats.json"
|
||||
"$REPORT_DIR/base-browser.json" "$REPORT_DIR/head-browser.json"
|
||||
"$REPORT_DIR/report.md"
|
||||
```
|
||||
|
||||
base/head を比較する計測では、**head側のチェックアウトにあるハーネスで両方を計測する**
|
||||
(計測コードの差分ではなくビルド成果物の差分だけが結果に出るようにするため)。
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user