Merge branch 'develop' of https://github.com/misskey-dev/misskey into enchase-kidoku
This commit is contained in:
commit
756206b80d
|
@ -14,7 +14,7 @@ jobs:
|
||||||
- run: corepack enable
|
- run: corepack enable
|
||||||
|
|
||||||
- name: Setup Node.js
|
- name: Setup Node.js
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -37,7 +37,7 @@ jobs:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -19,7 +19,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- uses: actions/setup-node@v4.0.0
|
- uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
@ -46,7 +46,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
version: 7
|
version: 7
|
||||||
run_install: false
|
run_install: false
|
||||||
- uses: actions/setup-node@v4.0.0
|
- uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
@ -72,7 +72,7 @@ jobs:
|
||||||
with:
|
with:
|
||||||
version: 7
|
version: 7
|
||||||
run_install: false
|
run_install: false
|
||||||
- uses: actions/setup-node@v4.0.0
|
- uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version-file: '.node-version'
|
node-version-file: '.node-version'
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -17,7 +17,7 @@ jobs:
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:13
|
image: postgres:15
|
||||||
ports:
|
ports:
|
||||||
- 54312:5432
|
- 54312:5432
|
||||||
env:
|
env:
|
||||||
|
@ -38,7 +38,7 @@ jobs:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -25,7 +25,7 @@ jobs:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
@ -56,7 +56,7 @@ jobs:
|
||||||
|
|
||||||
services:
|
services:
|
||||||
postgres:
|
postgres:
|
||||||
image: postgres:13
|
image: postgres:15
|
||||||
ports:
|
ports:
|
||||||
- 54312:5432
|
- 54312:5432
|
||||||
env:
|
env:
|
||||||
|
@ -83,7 +83,7 @@ jobs:
|
||||||
version: 7
|
version: 7
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -26,7 +26,7 @@ jobs:
|
||||||
- run: corepack enable
|
- run: corepack enable
|
||||||
|
|
||||||
- name: Setup Node.js ${{ matrix.node-version }}
|
- name: Setup Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -28,7 +28,7 @@ jobs:
|
||||||
version: 8
|
version: 8
|
||||||
run_install: false
|
run_install: false
|
||||||
- name: Use Node.js ${{ matrix.node-version }}
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
uses: actions/setup-node@v4.0.0
|
uses: actions/setup-node@v4.0.1
|
||||||
with:
|
with:
|
||||||
node-version: ${{ matrix.node-version }}
|
node-version: ${{ matrix.node-version }}
|
||||||
cache: 'pnpm'
|
cache: 'pnpm'
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
### Note
|
### Note
|
||||||
- Node.js 20.10.0が最小要件になりました
|
- Node.js 20.10.0が最小要件になりました
|
||||||
|
- 絵文字の追加辞書を既にインストールしている場合は、お手数ですが再インストールのほどお願いします
|
||||||
- 絵文字ピッカーにピン留め表示する絵文字設定が「リアクション用」と「絵文字入力用」に分かれました。以前の設定は「リアクション用」として使用されます。
|
- 絵文字ピッカーにピン留め表示する絵文字設定が「リアクション用」と「絵文字入力用」に分かれました。以前の設定は「リアクション用」として使用されます。
|
||||||
|
|
||||||
**影響:**
|
**影響:**
|
||||||
|
@ -31,9 +32,12 @@
|
||||||
- Feat: メールアドレスの認証にverifymail.ioを使えるように (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/971ba07a44550f68d2ba31c62066db2d43a0caed)
|
- Feat: メールアドレスの認証にverifymail.ioを使えるように (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/971ba07a44550f68d2ba31c62066db2d43a0caed)
|
||||||
- Feat: モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能を追加 (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/e0eb5a752f6e5616d6312bb7c9790302f9dbff83)
|
- Feat: モデレーターがユーザーのアイコンもしくはバナー画像を未設定状態にできる機能を追加 (cherry-pick from https://github.com/TeamNijimiss/misskey/commit/e0eb5a752f6e5616d6312bb7c9790302f9dbff83)
|
||||||
- Feat: TL上からノートが見えなくなるワードミュートであるハードミュートを追加
|
- Feat: TL上からノートが見えなくなるワードミュートであるハードミュートを追加
|
||||||
|
- Enhance: 公開ロールにアサインされたときに通知が作成されるように
|
||||||
- Enhance: アイコンデコレーションを複数設定できるように
|
- Enhance: アイコンデコレーションを複数設定できるように
|
||||||
- Enhance: アイコンデコレーションの位置を微調整できるように
|
- Enhance: アイコンデコレーションの位置を微調整できるように
|
||||||
- Enhance: つながりの公開範囲をフォロー/フォロワーで個別に設定可能に #12072
|
- Enhance: つながりの公開範囲をフォロー/フォロワーで個別に設定可能に #12072
|
||||||
|
- Enhance: ローカリゼーションの更新
|
||||||
|
- Enhance: 依存関係の更新
|
||||||
- Fix: MFM `$[unixtime ]` に不正な値を入力した際に発生する各種エラーを修正
|
- Fix: MFM `$[unixtime ]` に不正な値を入力した際に発生する各種エラーを修正
|
||||||
|
|
||||||
### Client
|
### Client
|
||||||
|
@ -79,6 +83,7 @@
|
||||||
- Fix: AiScriptの`readline`が不正な値を返すことがある問題を修正
|
- Fix: AiScriptの`readline`が不正な値を返すことがある問題を修正
|
||||||
- Fix: 投票のみ/画像のみの引用RNが、通知欄でただのRNとして判定されるバグを修正
|
- Fix: 投票のみ/画像のみの引用RNが、通知欄でただのRNとして判定されるバグを修正
|
||||||
- Fix: CWをつけて引用RNしても、普通のRNとして扱われてしまうバグを修正しました。
|
- Fix: CWをつけて引用RNしても、普通のRNとして扱われてしまうバグを修正しました。
|
||||||
|
- Fix: 「画像が1枚のみのメディアリストの高さ」を「デフォルト」以外に設定していると、CWの中などに添付された画像が見られないバグを修正
|
||||||
|
|
||||||
### Server
|
### Server
|
||||||
- Enhance: MFM `$[ruby ]` が他ソフトウェアと連合されるように
|
- Enhance: MFM `$[ruby ]` が他ソフトウェアと連合されるように
|
||||||
|
@ -97,6 +102,7 @@
|
||||||
- Fix: 「みつける」が年越し時に壊れる問題を修正
|
- Fix: 「みつける」が年越し時に壊れる問題を修正
|
||||||
- Fix: アカウントをブロックした際に、自身のユーザーのページでノートが相手に表示される問題を修正
|
- Fix: アカウントをブロックした際に、自身のユーザーのページでノートが相手に表示される問題を修正
|
||||||
- Fix: モデレーションログがモデレーターは閲覧できないように修正
|
- Fix: モデレーションログがモデレーターは閲覧できないように修正
|
||||||
|
- Fix: ハッシュタグのトレンド除外設定が即時に効果を持つように修正
|
||||||
- Fix: HTTP Digestヘッダのアルゴリズム部分に大文字の"SHA-256"しか使えない
|
- Fix: HTTP Digestヘッダのアルゴリズム部分に大文字の"SHA-256"しか使えない
|
||||||
- Fix: 管理者用APIのアクセス権限が適切に設定されていない問題を修正
|
- Fix: 管理者用APIのアクセス権限が適切に設定されていない問題を修正
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,7 @@ spec:
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 3000
|
- containerPort: 3000
|
||||||
- name: postgres
|
- name: postgres
|
||||||
image: postgres:14-alpine
|
image: postgres:15-alpine
|
||||||
env:
|
env:
|
||||||
- name: POSTGRES_USER
|
- name: POSTGRES_USER
|
||||||
value: "example-misskey-user"
|
value: "example-misskey-user"
|
||||||
|
@ -38,7 +38,7 @@ spec:
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 5432
|
- containerPort: 5432
|
||||||
- name: redis
|
- name: redis
|
||||||
image: redis:alpine
|
image: redis:7-alpine
|
||||||
ports:
|
ports:
|
||||||
- containerPort: 6379
|
- containerPort: 6379
|
||||||
volumes:
|
volumes:
|
||||||
|
|
|
@ -120,7 +120,6 @@ sensitive: "محتوى حساس"
|
||||||
add: "إضافة"
|
add: "إضافة"
|
||||||
reaction: "التفاعلات"
|
reaction: "التفاعلات"
|
||||||
reactions: "التفاعلات"
|
reactions: "التفاعلات"
|
||||||
reactionSetting: "التفاعلات المراد عرضها في منتقي التفاعلات."
|
|
||||||
reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة."
|
reactionSettingDescription2: "اسحب لترتيب ، انقر للحذف ، استخدم \"+\" للإضافة."
|
||||||
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
|
rememberNoteVisibility: "تذكر إعدادت مدى رؤية الملاحظات"
|
||||||
attachCancel: "أزل المرفق"
|
attachCancel: "أزل المرفق"
|
||||||
|
@ -817,8 +816,6 @@ makeReactionsPublicDescription: "هذا سيجعل قائمة تفاعلاتك
|
||||||
classic: "تقليدي"
|
classic: "تقليدي"
|
||||||
muteThread: "اكتم النقاش"
|
muteThread: "اكتم النقاش"
|
||||||
unmuteThread: "ارفع الكتم عن النقاش"
|
unmuteThread: "ارفع الكتم عن النقاش"
|
||||||
ffVisibility: "مرئية المتابِعين/المتابَعين"
|
|
||||||
ffVisibilityDescription: "يسمح لك بتحديد من يمكنهم رؤية متابِعيك ومتابَعيك."
|
|
||||||
continueThread: "اعرض بقية النقاش"
|
continueThread: "اعرض بقية النقاش"
|
||||||
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
|
deleteAccountConfirm: "سيحذف حسابك نهائيًا، أتريد المتابعة؟"
|
||||||
incorrectPassword: "كلمة السر خاطئة."
|
incorrectPassword: "كلمة السر خاطئة."
|
||||||
|
@ -947,9 +944,12 @@ rolesAssignedToMe: "الأدوار المسندة إلي"
|
||||||
resetPasswordConfirm: "هل تريد إعادة تعيين كلمة السر؟"
|
resetPasswordConfirm: "هل تريد إعادة تعيين كلمة السر؟"
|
||||||
license: "الرخصة"
|
license: "الرخصة"
|
||||||
unfavoriteConfirm: "أتريد إزالتها من المفضلة؟"
|
unfavoriteConfirm: "أتريد إزالتها من المفضلة؟"
|
||||||
|
reactionsDisplaySize: "حجم التفاعلات"
|
||||||
|
limitWidthOfReaction: "تصغير حجم التفاعلات"
|
||||||
noteIdOrUrl: "معرف الملاحظة أو رابطها"
|
noteIdOrUrl: "معرف الملاحظة أو رابطها"
|
||||||
video: "فيديو"
|
video: "فيديو"
|
||||||
videos: "فيديوهات"
|
videos: "فيديوهات"
|
||||||
|
dataSaver: "موفر البيانات"
|
||||||
accountMigration: "ترحيل الحساب"
|
accountMigration: "ترحيل الحساب"
|
||||||
accountMoved: "نقل هذا المستخدم حسابه:"
|
accountMoved: "نقل هذا المستخدم حسابه:"
|
||||||
accountMovedShort: "رُحل هذا الحساب."
|
accountMovedShort: "رُحل هذا الحساب."
|
||||||
|
@ -957,6 +957,7 @@ operationForbidden: "عملية ممنوعة"
|
||||||
forceShowAds: "أظهر الإعلانات التجارية دائما"
|
forceShowAds: "أظهر الإعلانات التجارية دائما"
|
||||||
reactionsList: "التفاعلات"
|
reactionsList: "التفاعلات"
|
||||||
renotesList: "إعادات النشر"
|
renotesList: "إعادات النشر"
|
||||||
|
notificationDisplay: "إشعارات"
|
||||||
leftTop: "أعلى اليسار"
|
leftTop: "أعلى اليسار"
|
||||||
rightTop: "أعلى اليمين"
|
rightTop: "أعلى اليمين"
|
||||||
leftBottom: "أسفل اليسار"
|
leftBottom: "أسفل اليسار"
|
||||||
|
@ -979,6 +980,7 @@ thisChannelArchived: "أُرشفت هذه القناة."
|
||||||
displayOfNote: "عرض الملاحظة"
|
displayOfNote: "عرض الملاحظة"
|
||||||
initialAccountSetting: "إعداد الملف الشخصي"
|
initialAccountSetting: "إعداد الملف الشخصي"
|
||||||
youFollowing: "متابَع"
|
youFollowing: "متابَع"
|
||||||
|
preventAiLearning: "منع استخدام البيانات في تعليم الآلة"
|
||||||
options: "خيارات"
|
options: "خيارات"
|
||||||
specifyUser: "مستخدم محدد"
|
specifyUser: "مستخدم محدد"
|
||||||
failedToPreviewUrl: "تتعذر المعاينة"
|
failedToPreviewUrl: "تتعذر المعاينة"
|
||||||
|
@ -992,7 +994,16 @@ later: "لاحقاً"
|
||||||
goToMisskey: "لميسكي"
|
goToMisskey: "لميسكي"
|
||||||
additionalEmojiDictionary: "قواميس إيموجي إضافية"
|
additionalEmojiDictionary: "قواميس إيموجي إضافية"
|
||||||
installed: "مُثبت"
|
installed: "مُثبت"
|
||||||
|
enableServerMachineStats: "نشر إحصائيات عتاد الخادم"
|
||||||
|
turnOffToImprovePerformance: "تفعيله قد يزيد الأداء."
|
||||||
|
createInviteCode: "ولِّد دعوة"
|
||||||
|
inviteCodeCreated: "ولِّدت دعوة"
|
||||||
|
inviteLimitExceeded: "وصلتَ لحد عدد الدعوات المسموح لك توليدها."
|
||||||
|
createLimitRemaining: "حد عدد الدعوات: {limit} دعوة"
|
||||||
expirationDate: "تاريخ انتهاء الصلاحية"
|
expirationDate: "تاريخ انتهاء الصلاحية"
|
||||||
|
noExpirationDate: "لا نهاية لصلاحيتها"
|
||||||
|
inviteCodeUsedAt: "اُستخدم رمز الدعوة في"
|
||||||
|
registeredUserUsingInviteCode: "اِستخدم رمز الدعوة"
|
||||||
unused: "غير مستعمَل"
|
unused: "غير مستعمَل"
|
||||||
expired: "منتهية صلاحيته"
|
expired: "منتهية صلاحيته"
|
||||||
icon: "الصورة الرمزية"
|
icon: "الصورة الرمزية"
|
||||||
|
@ -1549,3 +1560,4 @@ _webhookSettings:
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
suspend: "علِق"
|
suspend: "علِق"
|
||||||
resetPassword: "أعد تعيين كلمتك السرية"
|
resetPassword: "أعد تعيين كلمتك السرية"
|
||||||
|
createInvitation: "ولِّد دعوة"
|
||||||
|
|
|
@ -108,7 +108,6 @@ sensitive: "সংবেদনশীল বিষয়বস্তু"
|
||||||
add: "যুক্ত করুন"
|
add: "যুক্ত করুন"
|
||||||
reaction: "প্রতিক্রিয়া"
|
reaction: "প্রতিক্রিয়া"
|
||||||
reactions: "প্রতিক্রিয়া"
|
reactions: "প্রতিক্রিয়া"
|
||||||
reactionSetting: "রিঅ্যাকশন পিকারে যেসকল প্রতিক্রিয়া দেখানো হবে"
|
|
||||||
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
|
reactionSettingDescription2: "পুনরায় সাজাতে টেনে আনুন, মুছতে ক্লিক করুন, যোগ করতে + টিপুন।"
|
||||||
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
|
rememberNoteVisibility: "নোটের দৃশ্যমান্যতার সেটিংস মনে রাখুন"
|
||||||
attachCancel: "অ্যাটাচমেন্ট সরান "
|
attachCancel: "অ্যাটাচমেন্ট সরান "
|
||||||
|
@ -794,8 +793,6 @@ makeReactionsPublicDescription: "আপনার পূর্ববর্তী
|
||||||
classic: "ক্লাসিক"
|
classic: "ক্লাসিক"
|
||||||
muteThread: "থ্রেড মিউট করুন"
|
muteThread: "থ্রেড মিউট করুন"
|
||||||
unmuteThread: "থ্রেড আনমিউট করুন"
|
unmuteThread: "থ্রেড আনমিউট করুন"
|
||||||
ffVisibility: "অনুসরণ/অনুসরণকারীদের দৃশ্যমান্যতা"
|
|
||||||
ffVisibilityDescription: "আপনি কাকে অনুসরণ করেন এবং কে আপনাকে অনুসরণ করে, সেটা কারা দেখতে পাবে তা নির্ধারণ করে।"
|
|
||||||
continueThread: "আরো থ্রেড দেখুন"
|
continueThread: "আরো থ্রেড দেখুন"
|
||||||
deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?"
|
deleteAccountConfirm: "আপনার অ্যাকাউন্ট মুছে ফেলা হবে। ঠিক আছে?"
|
||||||
incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।"
|
incorrectPassword: "আপনার দেওয়া পাসওয়ার্ডটি ভুল।"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "NSFW"
|
||||||
add: "Afegir"
|
add: "Afegir"
|
||||||
reaction: "Reaccions"
|
reaction: "Reaccions"
|
||||||
reactions: "Reaccions"
|
reactions: "Reaccions"
|
||||||
reactionSetting: "Reaccions a mostrar al selector de reaccions"
|
|
||||||
reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem \"+\" per afegir."
|
reactionSettingDescription2: "Arrossega per reordenar, fes clic per suprimir, prem \"+\" per afegir."
|
||||||
rememberNoteVisibility: "Recorda la configuració de visibilitat de les notes"
|
rememberNoteVisibility: "Recorda la configuració de visibilitat de les notes"
|
||||||
attachCancel: "Eliminar el fitxer adjunt"
|
attachCancel: "Eliminar el fitxer adjunt"
|
||||||
|
|
|
@ -120,7 +120,6 @@ sensitive: "NSFW"
|
||||||
add: "Přidat"
|
add: "Přidat"
|
||||||
reaction: "Reakce"
|
reaction: "Reakce"
|
||||||
reactions: "Reakce"
|
reactions: "Reakce"
|
||||||
reactionSetting: "Reakce zobrazené ve výběru reakcí"
|
|
||||||
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte \"+\" k přidání"
|
reactionSettingDescription2: "Přetažením změníte pořadí, kliknutím smažete, zmáčkněte \"+\" k přidání"
|
||||||
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
|
rememberNoteVisibility: "Zapamatovat nastavení zobrazení poznámky"
|
||||||
attachCancel: "Odstranit přílohu"
|
attachCancel: "Odstranit přílohu"
|
||||||
|
@ -855,8 +854,6 @@ makeReactionsPublicDescription: "Tohle zviditelný seznam vašich předchozích
|
||||||
classic: "Klasický"
|
classic: "Klasický"
|
||||||
muteThread: "Ztlumit vlákno"
|
muteThread: "Ztlumit vlákno"
|
||||||
unmuteThread: "Zrušit ztlumení vlákna"
|
unmuteThread: "Zrušit ztlumení vlákna"
|
||||||
ffVisibility: "Viditelnost Sledovaných/Sledujících"
|
|
||||||
ffVisibilityDescription: "Umožní vám nastavit kdo uvidí koho sledujete a kdo vás sleduje."
|
|
||||||
continueThread: "Zobrazit pokračování vlákna"
|
continueThread: "Zobrazit pokračování vlákna"
|
||||||
deleteAccountConfirm: "Tohle nenávratně smaže váš účet, chcete pokračovat?"
|
deleteAccountConfirm: "Tohle nenávratně smaže váš účet, chcete pokračovat?"
|
||||||
incorrectPassword: "Nesprávné heslo."
|
incorrectPassword: "Nesprávné heslo."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Sensibel"
|
||||||
add: "Hinzufügen"
|
add: "Hinzufügen"
|
||||||
reaction: "Reaktionen"
|
reaction: "Reaktionen"
|
||||||
reactions: "Reaktionen"
|
reactions: "Reaktionen"
|
||||||
reactionSetting: "In der Reaktionsauswahl anzuzeigende Reaktionen"
|
|
||||||
reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“ um hinzuzufügen"
|
reactionSettingDescription2: "Ziehe um Anzuordnen, klicke um zu löschen, drücke „+“ um hinzuzufügen"
|
||||||
rememberNoteVisibility: "Notizsichtbarkeit merken"
|
rememberNoteVisibility: "Notizsichtbarkeit merken"
|
||||||
attachCancel: "Anhang entfernen"
|
attachCancel: "Anhang entfernen"
|
||||||
|
@ -874,8 +873,6 @@ makeReactionsPublicDescription: "Jeder wird die Liste deiner gesendeten Reaktion
|
||||||
classic: "Classic"
|
classic: "Classic"
|
||||||
muteThread: "Thread stummschalten"
|
muteThread: "Thread stummschalten"
|
||||||
unmuteThread: "Threadstummschaltung aufheben"
|
unmuteThread: "Threadstummschaltung aufheben"
|
||||||
ffVisibility: "Sichtbarkeit von Gefolgten/Followern"
|
|
||||||
ffVisibilityDescription: "Konfiguriere wer sehen kann, wem du folgst sowie wer dir folgt."
|
|
||||||
continueThread: "Weiteren Threadverlauf anzeigen"
|
continueThread: "Weiteren Threadverlauf anzeigen"
|
||||||
deleteAccountConfirm: "Dein Benutzerkonto wird unwiderruflich gelöscht. Trotzdem fortfahren?"
|
deleteAccountConfirm: "Dein Benutzerkonto wird unwiderruflich gelöscht. Trotzdem fortfahren?"
|
||||||
incorrectPassword: "Falsches Passwort."
|
incorrectPassword: "Falsches Passwort."
|
||||||
|
|
|
@ -104,7 +104,6 @@ clickToShow: "Κάντε κλικ για εμφάνιση"
|
||||||
add: "Προσθέστε"
|
add: "Προσθέστε"
|
||||||
reaction: "Αντιδράσεις"
|
reaction: "Αντιδράσεις"
|
||||||
reactions: "Αντιδράσεις"
|
reactions: "Αντιδράσεις"
|
||||||
reactionSetting: "Αντιδράσεις για εμφάνιση στην επιλογή αντίδρασης"
|
|
||||||
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε, πατήστε \"+\" για να προσθέσετε."
|
reactionSettingDescription2: "Σύρετε για να αλλάξετε τη σειρά, κάντε κλικ για να διαγράψετε, πατήστε \"+\" για να προσθέσετε."
|
||||||
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας σημειώματος"
|
rememberNoteVisibility: "Θυμήσου τις ρυθμίσεις ορατότητας σημειώματος"
|
||||||
attachCancel: "Διαγραφή αρχείου"
|
attachCancel: "Διαγραφή αρχείου"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Sensitive"
|
||||||
add: "Add"
|
add: "Add"
|
||||||
reaction: "Reactions"
|
reaction: "Reactions"
|
||||||
reactions: "Reactions"
|
reactions: "Reactions"
|
||||||
reactionSetting: "Reactions to show in the reaction picker"
|
|
||||||
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
|
reactionSettingDescription2: "Drag to reorder, click to delete, press \"+\" to add."
|
||||||
rememberNoteVisibility: "Remember note visibility settings"
|
rememberNoteVisibility: "Remember note visibility settings"
|
||||||
attachCancel: "Remove attachment"
|
attachCancel: "Remove attachment"
|
||||||
|
@ -875,8 +874,6 @@ makeReactionsPublicDescription: "This will make the list of all your past reacti
|
||||||
classic: "Classic"
|
classic: "Classic"
|
||||||
muteThread: "Mute thread"
|
muteThread: "Mute thread"
|
||||||
unmuteThread: "Unmute thread"
|
unmuteThread: "Unmute thread"
|
||||||
ffVisibility: "Follows/Followers Visibility"
|
|
||||||
ffVisibilityDescription: "Allows you to configure who can see who you follow and who follows you."
|
|
||||||
continueThread: "View thread continuation"
|
continueThread: "View thread continuation"
|
||||||
deleteAccountConfirm: "This will irreversibly delete your account. Proceed?"
|
deleteAccountConfirm: "This will irreversibly delete your account. Proceed?"
|
||||||
incorrectPassword: "Incorrect password."
|
incorrectPassword: "Incorrect password."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Marcado como sensible"
|
||||||
add: "Agregar"
|
add: "Agregar"
|
||||||
reaction: "Reacción"
|
reaction: "Reacción"
|
||||||
reactions: "Reacción"
|
reactions: "Reacción"
|
||||||
reactionSetting: "Reacciones para mostrar en el menú de reacciones"
|
|
||||||
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
|
reactionSettingDescription2: "Arrastre para reordenar, click para borrar, apriete la tecla + para añadir."
|
||||||
rememberNoteVisibility: "Recordar visibilidad"
|
rememberNoteVisibility: "Recordar visibilidad"
|
||||||
attachCancel: "Quitar adjunto"
|
attachCancel: "Quitar adjunto"
|
||||||
|
@ -874,8 +873,6 @@ makeReactionsPublicDescription: "Todas las reacciones que hayas hecho serán pú
|
||||||
classic: "Clásico"
|
classic: "Clásico"
|
||||||
muteThread: "Silenciar hilo"
|
muteThread: "Silenciar hilo"
|
||||||
unmuteThread: "Mostrar hilo"
|
unmuteThread: "Mostrar hilo"
|
||||||
ffVisibility: "Visibilidad de seguidores y seguidos"
|
|
||||||
ffVisibilityDescription: "Puedes configurar quien puede ver a quienes sigues y quienes te siguen"
|
|
||||||
continueThread: "Ver la continuación del hilo"
|
continueThread: "Ver la continuación del hilo"
|
||||||
deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?"
|
deleteAccountConfirm: "La cuenta será borrada. ¿Está seguro?"
|
||||||
incorrectPassword: "La contraseña es incorrecta"
|
incorrectPassword: "La contraseña es incorrecta"
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "Contenu sensible"
|
||||||
add: "Ajouter"
|
add: "Ajouter"
|
||||||
reaction: "Réactions"
|
reaction: "Réactions"
|
||||||
reactions: "Réactions"
|
reactions: "Réactions"
|
||||||
reactionSetting: "Réactions à afficher dans le sélecteur de réactions"
|
emojiPicker: "Sélecteur d’émojis"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "Vous pouvez définir les émojis épinglés lors de la réaction"
|
||||||
|
pinnedEmojisSettingDescription: "Vous pouvez définir les émojis épinglés lors de la saisie de l'émoji"
|
||||||
|
emojiPickerDisplay: "Affichage du sélecteur d'émojis"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "Remplacer par les émojis épinglés pour la réaction"
|
||||||
|
overwriteFromPinnedEmojis: "Remplacer par les émojis épinglés globalement"
|
||||||
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter."
|
reactionSettingDescription2: "Déplacer pour réorganiser, cliquer pour effacer, utiliser « + » pour ajouter."
|
||||||
rememberNoteVisibility: "Se souvenir de la visibilité des notes"
|
rememberNoteVisibility: "Se souvenir de la visibilité des notes"
|
||||||
attachCancel: "Supprimer le fichier attaché"
|
attachCancel: "Supprimer le fichier attaché"
|
||||||
|
@ -873,8 +878,8 @@ makeReactionsPublicDescription: "Ceci rendra la liste de toutes vos réactions d
|
||||||
classic: "Classique"
|
classic: "Classique"
|
||||||
muteThread: "Masquer cette discussion"
|
muteThread: "Masquer cette discussion"
|
||||||
unmuteThread: "Ne plus masquer le fil"
|
unmuteThread: "Ne plus masquer le fil"
|
||||||
ffVisibility: "Visibilité des abonnés/abonnements"
|
followingVisibility: "Visibilité des abonnements"
|
||||||
ffVisibilityDescription: "Permet de configurer qui peut voir les personnes que tu suis et les personnes qui te suivent."
|
followersVisibility: "Visibilité des abonnés"
|
||||||
continueThread: "Afficher la suite du fil"
|
continueThread: "Afficher la suite du fil"
|
||||||
deleteAccountConfirm: "Votre compte sera supprimé. Êtes vous certain ?"
|
deleteAccountConfirm: "Votre compte sera supprimé. Êtes vous certain ?"
|
||||||
incorrectPassword: "Le mot de passe est incorrect."
|
incorrectPassword: "Le mot de passe est incorrect."
|
||||||
|
@ -1024,6 +1029,8 @@ license: "Licence"
|
||||||
myClips: "Mes clips"
|
myClips: "Mes clips"
|
||||||
drivecleaner: "Nettoyeur du Disque"
|
drivecleaner: "Nettoyeur du Disque"
|
||||||
retryAllQueuesConfirmText: "Cela peut augmenter temporairement la charge du serveur."
|
retryAllQueuesConfirmText: "Cela peut augmenter temporairement la charge du serveur."
|
||||||
|
enableChartsForRemoteUser: "Générer les graphiques pour les utilisateurs distants"
|
||||||
|
enableChartsForFederatedInstances: "Générer les graphiques pour les instances distantes"
|
||||||
showClipButtonInNoteFooter: "Ajouter « Clip » au menu d'action de la note"
|
showClipButtonInNoteFooter: "Ajouter « Clip » au menu d'action de la note"
|
||||||
reactionsDisplaySize: "Taille de l'affichage des réactions"
|
reactionsDisplaySize: "Taille de l'affichage des réactions"
|
||||||
limitWidthOfReaction: "Limiter la largeur maximale des réactions et les afficher en taille réduite"
|
limitWidthOfReaction: "Limiter la largeur maximale des réactions et les afficher en taille réduite"
|
||||||
|
@ -1067,6 +1074,7 @@ options: "Options"
|
||||||
specifyUser: "Spécifier l'utilisateur·rice"
|
specifyUser: "Spécifier l'utilisateur·rice"
|
||||||
failedToPreviewUrl: "Aperçu d'URL échoué"
|
failedToPreviewUrl: "Aperçu d'URL échoué"
|
||||||
update: "Mettre à jour"
|
update: "Mettre à jour"
|
||||||
|
rolesThatCanBeUsedThisEmojiAsReaction: "Rôles qui peuvent utiliser cet émoji comme réaction"
|
||||||
later: "Plus tard"
|
later: "Plus tard"
|
||||||
goToMisskey: "Retour vers Misskey"
|
goToMisskey: "Retour vers Misskey"
|
||||||
additionalEmojiDictionary: "Dictionnaires d'émojis additionnels"
|
additionalEmojiDictionary: "Dictionnaires d'émojis additionnels"
|
||||||
|
@ -1129,6 +1137,9 @@ doReaction: "Réagir"
|
||||||
code: "Code"
|
code: "Code"
|
||||||
reloadRequiredToApplySettings: "Le rafraîchissement est nécessaire pour que les paramètres prennent effet."
|
reloadRequiredToApplySettings: "Le rafraîchissement est nécessaire pour que les paramètres prennent effet."
|
||||||
remainingN: "Restants : {n}"
|
remainingN: "Restants : {n}"
|
||||||
|
overwriteContentConfirm: "Voulez-vous remplacer le contenu actuel ?"
|
||||||
|
seasonalScreenEffect: "Effet d'écran saisonnier"
|
||||||
|
decorate: "Décorer"
|
||||||
_announcement:
|
_announcement:
|
||||||
readConfirmTitle: "Marquer comme lu ?"
|
readConfirmTitle: "Marquer comme lu ?"
|
||||||
shouldNotBeUsedToPresentPermanentInfo: "Puisque cela pourrait nuire considérablement à l'expérience utilisateur pour les nouveaux utilisateurs, il est recommandé d'utiliser les annonces pour afficher des informations temporaires plutôt que des informations persistantes."
|
shouldNotBeUsedToPresentPermanentInfo: "Puisque cela pourrait nuire considérablement à l'expérience utilisateur pour les nouveaux utilisateurs, il est recommandé d'utiliser les annonces pour afficher des informations temporaires plutôt que des informations persistantes."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Konten sensitif"
|
||||||
add: "Tambahkan"
|
add: "Tambahkan"
|
||||||
reaction: "Reaksi"
|
reaction: "Reaksi"
|
||||||
reactions: "Reaksi"
|
reactions: "Reaksi"
|
||||||
reactionSetting: "Reaksi untuk dimunculkan di bilah reaksi"
|
|
||||||
reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
reactionSettingDescription2: "Geser untuk memindah urutan emoji, klik untuk menghapus, tekan \"+\" untuk menambahkan"
|
||||||
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
rememberNoteVisibility: "Ingat pengaturan visibilitas catatan"
|
||||||
attachCancel: "Hapus lampiran"
|
attachCancel: "Hapus lampiran"
|
||||||
|
@ -261,6 +260,7 @@ removed: "Telah dihapus"
|
||||||
removeAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
removeAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
||||||
deleteAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
deleteAreYouSure: "Apakah kamu yakin ingin menghapus \"{x}\"?"
|
||||||
resetAreYouSure: "Yakin mau atur ulang?"
|
resetAreYouSure: "Yakin mau atur ulang?"
|
||||||
|
areYouSure: "Apakah kamu yakin?"
|
||||||
saved: "Telah disimpan"
|
saved: "Telah disimpan"
|
||||||
messaging: "Pesan"
|
messaging: "Pesan"
|
||||||
upload: "Unggah"
|
upload: "Unggah"
|
||||||
|
@ -311,6 +311,7 @@ folderName: "Nama folder"
|
||||||
createFolder: "Buat folder"
|
createFolder: "Buat folder"
|
||||||
renameFolder: "Ubah nama folder"
|
renameFolder: "Ubah nama folder"
|
||||||
deleteFolder: "Hapus folder"
|
deleteFolder: "Hapus folder"
|
||||||
|
folder: "Folder"
|
||||||
addFile: "Tambahkan berkas"
|
addFile: "Tambahkan berkas"
|
||||||
emptyDrive: "Drive kosong"
|
emptyDrive: "Drive kosong"
|
||||||
emptyFolder: "Folder kosong"
|
emptyFolder: "Folder kosong"
|
||||||
|
@ -543,6 +544,8 @@ showInPage: "Tampilkan di halaman"
|
||||||
popout: "Pop-out"
|
popout: "Pop-out"
|
||||||
volume: "Volume"
|
volume: "Volume"
|
||||||
masterVolume: "Master volume"
|
masterVolume: "Master volume"
|
||||||
|
notUseSound: "Tidak ada keluaran suara"
|
||||||
|
useSoundOnlyWhenActive: "Hanya keluarkan suara jika Misskey sedang aktif"
|
||||||
details: "Selengkapnya"
|
details: "Selengkapnya"
|
||||||
chooseEmoji: "Pilih emoji"
|
chooseEmoji: "Pilih emoji"
|
||||||
unableToProcess: "Operasi tersebut tidak dapat diselesaikan."
|
unableToProcess: "Operasi tersebut tidak dapat diselesaikan."
|
||||||
|
@ -871,8 +874,6 @@ makeReactionsPublicDescription: "Pengaturan ini akan membuat daftar dari semua r
|
||||||
classic: "Klasik"
|
classic: "Klasik"
|
||||||
muteThread: "Bisukan thread"
|
muteThread: "Bisukan thread"
|
||||||
unmuteThread: "Suarakan thread"
|
unmuteThread: "Suarakan thread"
|
||||||
ffVisibility: "Visibilitas Mengikuti/Pengikut"
|
|
||||||
ffVisibilityDescription: "Mengatur siapa yang dapat melihat pengikutmu dan yang kamu ikuti."
|
|
||||||
continueThread: "Lihat lanjutan thread"
|
continueThread: "Lihat lanjutan thread"
|
||||||
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
|
deleteAccountConfirm: "Akun akan dihapus. Apakah kamu yakin?"
|
||||||
incorrectPassword: "Kata sandi salah."
|
incorrectPassword: "Kata sandi salah."
|
||||||
|
@ -1023,6 +1024,8 @@ resetPasswordConfirm: "Yakin untuk mereset kata sandimu?"
|
||||||
sensitiveWords: "Kata sensitif"
|
sensitiveWords: "Kata sensitif"
|
||||||
sensitiveWordsDescription: "Visibilitas dari semua catatan mengandung kata yang telah diatur akan dijadikan \"Beranda\" secara otomatis. Kamu dapat mendaftarkan kata tersebut lebih dari satu dengan menuliskannya di baris baru."
|
sensitiveWordsDescription: "Visibilitas dari semua catatan mengandung kata yang telah diatur akan dijadikan \"Beranda\" secara otomatis. Kamu dapat mendaftarkan kata tersebut lebih dari satu dengan menuliskannya di baris baru."
|
||||||
sensitiveWordsDescription2: "Menggunakan spasi akan membuat ekspresi AND dan kata kunci disekitarnya dengan garis miring akan mengubahnya menjadi ekspresi reguler."
|
sensitiveWordsDescription2: "Menggunakan spasi akan membuat ekspresi AND dan kata kunci disekitarnya dengan garis miring akan mengubahnya menjadi ekspresi reguler."
|
||||||
|
hiddenTags: "Tagar tersembunyi"
|
||||||
|
hiddenTagsDescription: "Pilih tanda yang mana akan tidak diperlihatkan dalam daftar tren.\nTanda lebih dari satu dapat didaftarkan dengan tiap baris."
|
||||||
notesSearchNotAvailable: "Pencarian catatan tidak tersedia."
|
notesSearchNotAvailable: "Pencarian catatan tidak tersedia."
|
||||||
license: "Lisensi"
|
license: "Lisensi"
|
||||||
unfavoriteConfirm: "Yakin ingin menghapusnya dari favorit?"
|
unfavoriteConfirm: "Yakin ingin menghapusnya dari favorit?"
|
||||||
|
@ -1035,6 +1038,7 @@ enableChartsForRemoteUser: "Buat bagan data pengguna instansi luar"
|
||||||
enableChartsForFederatedInstances: "Buat bagan data peladen instansi luar"
|
enableChartsForFederatedInstances: "Buat bagan data peladen instansi luar"
|
||||||
showClipButtonInNoteFooter: "Tambahkan \"Klip\" ke menu aksi catatan"
|
showClipButtonInNoteFooter: "Tambahkan \"Klip\" ke menu aksi catatan"
|
||||||
reactionsDisplaySize: "Ukuran tampilan reaksi"
|
reactionsDisplaySize: "Ukuran tampilan reaksi"
|
||||||
|
limitWidthOfReaction: "Batasi lebar maksimum reaksi dan tampilkan dalam ukuran terbatasi."
|
||||||
noteIdOrUrl: "ID catatan atau URL"
|
noteIdOrUrl: "ID catatan atau URL"
|
||||||
video: "Video"
|
video: "Video"
|
||||||
videos: "Video"
|
videos: "Video"
|
||||||
|
@ -1161,6 +1165,9 @@ useGroupedNotifications: "Tampilkan notifikasi secara dikelompokkan"
|
||||||
signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa."
|
signupPendingError: "Terdapat masalah ketika memverifikasi alamat surel. Tautan kemungkinan telah kedaluwarsa."
|
||||||
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
|
cwNotationRequired: "Jika \"Sembunyikan konten\" diaktifkan, deskripsi harus disediakan."
|
||||||
doReaction: "Tambahkan reaksi"
|
doReaction: "Tambahkan reaksi"
|
||||||
|
code: "Kode"
|
||||||
|
reloadRequiredToApplySettings: "Muat ulang diperlukan untuk menerapkan pengaturan."
|
||||||
|
remainingN: "Sisa : {n}"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "Hanya pengguna yang telah ada"
|
forExistingUsers: "Hanya pengguna yang telah ada"
|
||||||
forExistingUsersDescription: "Pengumuman ini akan dimunculkan ke pengguna yang sudah ada dari titik waktu publikasi jika dinyalakan. Apabila dimatikan, mereka yang baru mendaftar setelah publikasi ini akan juga melihatnya."
|
forExistingUsersDescription: "Pengumuman ini akan dimunculkan ke pengguna yang sudah ada dari titik waktu publikasi jika dinyalakan. Apabila dimatikan, mereka yang baru mendaftar setelah publikasi ini akan juga melihatnya."
|
||||||
|
@ -1189,12 +1196,17 @@ _initialAccountSetting:
|
||||||
_initialTutorial:
|
_initialTutorial:
|
||||||
launchTutorial: "Lihat Tutorial"
|
launchTutorial: "Lihat Tutorial"
|
||||||
title: "Tutorial"
|
title: "Tutorial"
|
||||||
|
wellDone: "Kerja bagus!"
|
||||||
skipAreYouSure: "Berhenti dari Tutorial?"
|
skipAreYouSure: "Berhenti dari Tutorial?"
|
||||||
_landing:
|
_landing:
|
||||||
title: "Selamat datang di Tutorial"
|
title: "Selamat datang di Tutorial"
|
||||||
description: "Di sini kamu dapat mempelajari dasar-dasar dari penggunaan Misskey dan fitur-fiturnya."
|
description: "Di sini kamu dapat mempelajari dasar-dasar dari penggunaan Misskey dan fitur-fiturnya."
|
||||||
_note:
|
_note:
|
||||||
title: "Apa itu Catatan?"
|
title: "Apa itu Catatan?"
|
||||||
|
_reaction:
|
||||||
|
title: "Apa itu Reaksi?"
|
||||||
|
_timeline:
|
||||||
|
title: "Konsep Lini Masa"
|
||||||
_postNote:
|
_postNote:
|
||||||
title: "Pengaturan posting Catatan"
|
title: "Pengaturan posting Catatan"
|
||||||
_visibility:
|
_visibility:
|
||||||
|
@ -1202,6 +1214,12 @@ _initialTutorial:
|
||||||
home: "Hanya publik ke lini masa Beranda. Pengguna yang mengunjungi profilmu melalui pengikut dan renote dapat melihatnya."
|
home: "Hanya publik ke lini masa Beranda. Pengguna yang mengunjungi profilmu melalui pengikut dan renote dapat melihatnya."
|
||||||
followers: "Perlihatkan ke pengikut saja. Hanya pengikut yang dapat melihat postinganmu dan tidak dapat direnote oleh siapapun."
|
followers: "Perlihatkan ke pengikut saja. Hanya pengikut yang dapat melihat postinganmu dan tidak dapat direnote oleh siapapun."
|
||||||
direct: "Hanya perlihatkan ke pengguna spesifik dan penerima akan diberi tahu. Dapat juga digunakan sebagai alternatif dari pesan langsung."
|
direct: "Hanya perlihatkan ke pengguna spesifik dan penerima akan diberi tahu. Dapat juga digunakan sebagai alternatif dari pesan langsung."
|
||||||
|
_cw:
|
||||||
|
_exampleNote:
|
||||||
|
cw: "Peringatan: Bikin Lapar!"
|
||||||
|
note: "Baru aja makan donat berlapis coklat 🍩😋"
|
||||||
|
_howToMakeAttachmentsSensitive:
|
||||||
|
title: "Bagaimana menandai lampiran sebagai sensitif?"
|
||||||
_serverRules:
|
_serverRules:
|
||||||
description: "Daftar peraturan akan ditampilkan sebelum pendaftaran. Mengatur ringkasan dari Syarat dan Ketentuan sangat direkomendasikan."
|
description: "Daftar peraturan akan ditampilkan sebelum pendaftaran. Mengatur ringkasan dari Syarat dan Ketentuan sangat direkomendasikan."
|
||||||
_serverSettings:
|
_serverSettings:
|
||||||
|
|
|
@ -2325,6 +2325,7 @@ export interface Locale {
|
||||||
"pollEnded": string;
|
"pollEnded": string;
|
||||||
"newNote": string;
|
"newNote": string;
|
||||||
"unreadAntennaNote": string;
|
"unreadAntennaNote": string;
|
||||||
|
"roleAssigned": string;
|
||||||
"emptyPushNotificationMessage": string;
|
"emptyPushNotificationMessage": string;
|
||||||
"achievementEarned": string;
|
"achievementEarned": string;
|
||||||
"testNotification": string;
|
"testNotification": string;
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "Allegato esplicito"
|
||||||
add: "Aggiungi"
|
add: "Aggiungi"
|
||||||
reaction: "Reazioni"
|
reaction: "Reazioni"
|
||||||
reactions: "Reazioni"
|
reactions: "Reazioni"
|
||||||
reactionSetting: "Reazioni visualizzate sul pannello"
|
emojiPicker: "Selettore emoji"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "Scegli quale sia l'emoji in cima, quando reagisci"
|
||||||
|
pinnedEmojisSettingDescription: "Scegli quale sia l'emoji in cima, quando reagisci"
|
||||||
|
emojiPickerDisplay: "Visualizza selettore"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "Sovrascrivi con le impostazioni reazioni"
|
||||||
|
overwriteFromPinnedEmojis: "Sovrascrivi con le impostazioni globali"
|
||||||
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
|
reactionSettingDescription2: "Trascina per riorganizzare, clicca per cancellare, usa il pulsante \"+\" per aggiungere."
|
||||||
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
|
rememberNoteVisibility: "Ricordare le impostazioni di visibilità delle note"
|
||||||
attachCancel: "Rimuovi allegato"
|
attachCancel: "Rimuovi allegato"
|
||||||
|
@ -261,6 +266,7 @@ removed: "Eliminato con successo"
|
||||||
removeAreYouSure: "Vuoi davvero eliminare \"{x}\"?"
|
removeAreYouSure: "Vuoi davvero eliminare \"{x}\"?"
|
||||||
deleteAreYouSure: "Vuoi davvero eliminare \"{x}\"?"
|
deleteAreYouSure: "Vuoi davvero eliminare \"{x}\"?"
|
||||||
resetAreYouSure: "Ripristinare?"
|
resetAreYouSure: "Ripristinare?"
|
||||||
|
areYouSure: "Confermi?"
|
||||||
saved: "Salvato"
|
saved: "Salvato"
|
||||||
messaging: "Messaggi"
|
messaging: "Messaggi"
|
||||||
upload: "Carica"
|
upload: "Carica"
|
||||||
|
@ -875,8 +881,6 @@ makeReactionsPublicDescription: "La lista delle reazioni che avete fatto è a di
|
||||||
classic: "Classico"
|
classic: "Classico"
|
||||||
muteThread: "Silenzia conversazione"
|
muteThread: "Silenzia conversazione"
|
||||||
unmuteThread: "Riattiva la conversazione"
|
unmuteThread: "Riattiva la conversazione"
|
||||||
ffVisibility: "Visibilità delle connessioni"
|
|
||||||
ffVisibilityDescription: "Puoi scegliere a chi mostrare le tue relazioni con altri profili nel fediverso."
|
|
||||||
continueThread: "Altre conversazioni"
|
continueThread: "Altre conversazioni"
|
||||||
deleteAccountConfirm: "Così verrà eliminato il profilo. Vuoi procedere?"
|
deleteAccountConfirm: "Così verrà eliminato il profilo. Vuoi procedere?"
|
||||||
incorrectPassword: "La password è errata."
|
incorrectPassword: "La password è errata."
|
||||||
|
@ -1157,6 +1161,7 @@ tosAndPrivacyPolicy: "Condizioni d'uso e informativa privacy"
|
||||||
avatarDecorations: "Decorazioni foto profilo"
|
avatarDecorations: "Decorazioni foto profilo"
|
||||||
attach: "Applica"
|
attach: "Applica"
|
||||||
detach: "Rimuovi"
|
detach: "Rimuovi"
|
||||||
|
detachAll: "Togli tutto"
|
||||||
angle: "Angolo"
|
angle: "Angolo"
|
||||||
flip: "Inverti"
|
flip: "Inverti"
|
||||||
showAvatarDecorations: "Mostra decorazione della foto profilo"
|
showAvatarDecorations: "Mostra decorazione della foto profilo"
|
||||||
|
@ -1170,6 +1175,10 @@ cwNotationRequired: "Devi indicare perché il contenuto è indicato come esplici
|
||||||
doReaction: "Reagisci"
|
doReaction: "Reagisci"
|
||||||
code: "Codice"
|
code: "Codice"
|
||||||
reloadRequiredToApplySettings: "Per applicare le impostazioni, occorre ricaricare."
|
reloadRequiredToApplySettings: "Per applicare le impostazioni, occorre ricaricare."
|
||||||
|
remainingN: "Rimangono: {n}"
|
||||||
|
overwriteContentConfirm: "Vuoi davvero sostituire l'attuale contenuto?"
|
||||||
|
seasonalScreenEffect: "Schermate in base alla stagione"
|
||||||
|
decorate: "Decora"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "Solo ai profili attuali"
|
forExistingUsers: "Solo ai profili attuali"
|
||||||
forExistingUsersDescription: "L'annuncio sarà visibile solo ai profili esistenti in questo momento. Se disabilitato, sarà visibile anche ai profili che verranno creati dopo la pubblicazione di questo annuncio."
|
forExistingUsersDescription: "L'annuncio sarà visibile solo ai profili esistenti in questo momento. Se disabilitato, sarà visibile anche ai profili che verranno creati dopo la pubblicazione di questo annuncio."
|
||||||
|
@ -1601,6 +1610,7 @@ _role:
|
||||||
canHideAds: "Nascondere i banner"
|
canHideAds: "Nascondere i banner"
|
||||||
canSearchNotes: "Ricercare nelle Note"
|
canSearchNotes: "Ricercare nelle Note"
|
||||||
canUseTranslator: "Tradurre le Note"
|
canUseTranslator: "Tradurre le Note"
|
||||||
|
avatarDecorationLimit: "Numero massimo di decorazioni foto profilo installabili"
|
||||||
_condition:
|
_condition:
|
||||||
isLocal: "Profilo locale"
|
isLocal: "Profilo locale"
|
||||||
isRemote: "Profilo remoto"
|
isRemote: "Profilo remoto"
|
||||||
|
@ -2037,6 +2047,7 @@ _profile:
|
||||||
changeAvatar: "Modifica immagine profilo"
|
changeAvatar: "Modifica immagine profilo"
|
||||||
changeBanner: "Cambia intestazione"
|
changeBanner: "Cambia intestazione"
|
||||||
verifiedLinkDescription: "Puoi verificare il tuo profilo mostrando una icona. Devi inserire la URL alla pagina che contiene un link al tuo profilo."
|
verifiedLinkDescription: "Puoi verificare il tuo profilo mostrando una icona. Devi inserire la URL alla pagina che contiene un link al tuo profilo."
|
||||||
|
avatarDecorationMax: "Puoi aggiungere fino a {max} decorazioni."
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "Tutte le note"
|
allNotes: "Tutte le note"
|
||||||
favoritedNotes: "Note preferite"
|
favoritedNotes: "Note preferite"
|
||||||
|
|
|
@ -2227,6 +2227,7 @@ _notification:
|
||||||
pollEnded: "アンケートの結果が出ました"
|
pollEnded: "アンケートの結果が出ました"
|
||||||
newNote: "新しい投稿"
|
newNote: "新しい投稿"
|
||||||
unreadAntennaNote: "アンテナ {name}"
|
unreadAntennaNote: "アンテナ {name}"
|
||||||
|
roleAssigned: "ロールが付与されました"
|
||||||
emptyPushNotificationMessage: "プッシュ通知の更新をしました"
|
emptyPushNotificationMessage: "プッシュ通知の更新をしました"
|
||||||
achievementEarned: "実績を獲得"
|
achievementEarned: "実績を獲得"
|
||||||
testNotification: "通知テスト"
|
testNotification: "通知テスト"
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "気いつけて見いや"
|
||||||
add: "増やす"
|
add: "増やす"
|
||||||
reaction: "ツッコミ"
|
reaction: "ツッコミ"
|
||||||
reactions: "ツッコミ"
|
reactions: "ツッコミ"
|
||||||
reactionSetting: "ピッカーに出しとくツッコミ"
|
emojiPicker: "絵文字ピッカー"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "リアクションしたときにピンで留めてる表示をする絵文字を設定するで"
|
||||||
|
pinnedEmojisSettingDescription: "絵文字打ったときにピン留め表示する絵文字設定できるで"
|
||||||
|
emojiPickerDisplay: "ピッカーの表示"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "リアクション設定から上書きする"
|
||||||
|
overwriteFromPinnedEmojis: "全般設定から上書きする"
|
||||||
reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。"
|
reactionSettingDescription2: "ドラッグで並び替え、クリックで削除、+を押して追加やで。"
|
||||||
rememberNoteVisibility: "公開範囲覚えといて"
|
rememberNoteVisibility: "公開範囲覚えといて"
|
||||||
attachCancel: "のっけるのやめる"
|
attachCancel: "のっけるのやめる"
|
||||||
|
@ -261,6 +266,7 @@ removed: "ほかしたで!"
|
||||||
removeAreYouSure: "「{x}」はほかしてええか?"
|
removeAreYouSure: "「{x}」はほかしてええか?"
|
||||||
deleteAreYouSure: "「{x}」はほかしてええか?"
|
deleteAreYouSure: "「{x}」はほかしてええか?"
|
||||||
resetAreYouSure: "リセットしてええん?"
|
resetAreYouSure: "リセットしてええん?"
|
||||||
|
areYouSure: "いいん?"
|
||||||
saved: "保存したで!"
|
saved: "保存したで!"
|
||||||
messaging: "チャット"
|
messaging: "チャット"
|
||||||
upload: "アップロード"
|
upload: "アップロード"
|
||||||
|
@ -875,8 +881,6 @@ makeReactionsPublicDescription: "あんたがしたツッコミ一覧を誰で
|
||||||
classic: "クラシック"
|
classic: "クラシック"
|
||||||
muteThread: "スレッドをミュート"
|
muteThread: "スレッドをミュート"
|
||||||
unmuteThread: "スレッドのミュートを解除"
|
unmuteThread: "スレッドのミュートを解除"
|
||||||
ffVisibility: "つながりの公開範囲"
|
|
||||||
ffVisibilityDescription: "あんたのフォロー/フォロワー情報の公開範囲を設定できるで。"
|
|
||||||
continueThread: "さらにスレッドを見るで"
|
continueThread: "さらにスレッドを見るで"
|
||||||
deleteAccountConfirm: "アカウントを消すで?ええんか?"
|
deleteAccountConfirm: "アカウントを消すで?ええんか?"
|
||||||
incorrectPassword: "パスワードがちゃうわ。"
|
incorrectPassword: "パスワードがちゃうわ。"
|
||||||
|
@ -1157,6 +1161,7 @@ tosAndPrivacyPolicy: "利用規約・プライバシーポリシー"
|
||||||
avatarDecorations: "アイコンデコレーション"
|
avatarDecorations: "アイコンデコレーション"
|
||||||
attach: "のっける"
|
attach: "のっける"
|
||||||
detach: "取る"
|
detach: "取る"
|
||||||
|
detachAll: "全部とる"
|
||||||
angle: "角度"
|
angle: "角度"
|
||||||
flip: "反転"
|
flip: "反転"
|
||||||
showAvatarDecorations: "アイコンのデコレーション映す"
|
showAvatarDecorations: "アイコンのデコレーション映す"
|
||||||
|
@ -1170,6 +1175,10 @@ cwNotationRequired: "「内容を隠す」んやったら注釈書かなアカ
|
||||||
doReaction: "ツッコむで"
|
doReaction: "ツッコむで"
|
||||||
code: "コード"
|
code: "コード"
|
||||||
reloadRequiredToApplySettings: "設定を見るんにはリロードが必要やで。"
|
reloadRequiredToApplySettings: "設定を見るんにはリロードが必要やで。"
|
||||||
|
remainingN: "残り:{n}"
|
||||||
|
overwriteContentConfirm: "今の内容に上書きされるけどいい?"
|
||||||
|
seasonalScreenEffect: "季節にあった画面の動き"
|
||||||
|
decorate: "デコる"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "もうおるユーザーのみ"
|
forExistingUsers: "もうおるユーザーのみ"
|
||||||
forExistingUsersDescription: "オンにしたらこのお知らせができた時点でおる人らにだけお知らせが行くで。切ったらこの知らせが行ったあとにアカウント作った人にもちゃんとお知らせが行くで。"
|
forExistingUsersDescription: "オンにしたらこのお知らせができた時点でおる人らにだけお知らせが行くで。切ったらこの知らせが行ったあとにアカウント作った人にもちゃんとお知らせが行くで。"
|
||||||
|
@ -1601,6 +1610,7 @@ _role:
|
||||||
canHideAds: "広告映さへん"
|
canHideAds: "広告映さへん"
|
||||||
canSearchNotes: "ノート探せるかどうか"
|
canSearchNotes: "ノート探せるかどうか"
|
||||||
canUseTranslator: "翻訳使えるかどうか"
|
canUseTranslator: "翻訳使えるかどうか"
|
||||||
|
avatarDecorationLimit: "アイコンデコのいっちばんつけれる数"
|
||||||
_condition:
|
_condition:
|
||||||
isLocal: "ローカルユーザー"
|
isLocal: "ローカルユーザー"
|
||||||
isRemote: "リモートユーザー"
|
isRemote: "リモートユーザー"
|
||||||
|
@ -2037,6 +2047,7 @@ _profile:
|
||||||
changeAvatar: "アバター画像を変更するで"
|
changeAvatar: "アバター画像を変更するで"
|
||||||
changeBanner: "バナー画像を変更するで"
|
changeBanner: "バナー画像を変更するで"
|
||||||
verifiedLinkDescription: "内容をURLに設定すると、リンク先のwebサイトに自分のプロフのリンクが含まれてる場合に所有者確認済みアイコンを表示させることができるで。"
|
verifiedLinkDescription: "内容をURLに設定すると、リンク先のwebサイトに自分のプロフのリンクが含まれてる場合に所有者確認済みアイコンを表示させることができるで。"
|
||||||
|
avatarDecorationMax: "最大{max}つまでデコつけれんで"
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "全てのノート"
|
allNotes: "全てのノート"
|
||||||
favoritedNotes: "お気に入りにしたノート"
|
favoritedNotes: "お気に入りにしたノート"
|
||||||
|
|
|
@ -15,7 +15,7 @@ gotIt: "알것어예"
|
||||||
cancel: "아이예"
|
cancel: "아이예"
|
||||||
noThankYou: "뎃어예"
|
noThankYou: "뎃어예"
|
||||||
enterUsername: "사용자 이럼 서기"
|
enterUsername: "사용자 이럼 서기"
|
||||||
renotedBy: "{user}님이 리노트햇십니다"
|
renotedBy: "{user}님이 리노트햇어예"
|
||||||
noNotes: "노트가 없십니다"
|
noNotes: "노트가 없십니다"
|
||||||
noNotifications: "알림이 없십니다"
|
noNotifications: "알림이 없십니다"
|
||||||
instance: "서버"
|
instance: "서버"
|
||||||
|
@ -76,7 +76,7 @@ export: "내가기"
|
||||||
files: "파일"
|
files: "파일"
|
||||||
download: "내리받기"
|
download: "내리받기"
|
||||||
driveFileDeleteConfirm: "‘{name}’ 파일얼 뭉캡니꺼? 요 파일얼 서넌 콘텐츠도 뭉캐집니다."
|
driveFileDeleteConfirm: "‘{name}’ 파일얼 뭉캡니꺼? 요 파일얼 서넌 콘텐츠도 뭉캐집니다."
|
||||||
unfollowConfirm: "{name}님얼 고만 팔로잉합니꺼?"
|
unfollowConfirm: "{name}님얼 고마 팔로잉합니꺼?"
|
||||||
exportRequested: "내가기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다. 요청이 껕나모 ‘드라이브’에 옇십니다."
|
exportRequested: "내가기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다. 요청이 껕나모 ‘드라이브’에 옇십니다."
|
||||||
importRequested: "가오기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다."
|
importRequested: "가오기 요청얼 햇십니다. 시간이 쪼매 걸릴 깁니다."
|
||||||
lists: "리스트"
|
lists: "리스트"
|
||||||
|
@ -113,7 +113,7 @@ cantReRenote: "리노트넌 지럴 리노트 몬 합니다."
|
||||||
quote: "따오기"
|
quote: "따오기"
|
||||||
inChannelRenote: "채널 안 리노트"
|
inChannelRenote: "채널 안 리노트"
|
||||||
inChannelQuote: "채널 안 따오기"
|
inChannelQuote: "채널 안 따오기"
|
||||||
pinnedNote: "프로필에 붙인 노트"
|
pinnedNote: "붙인 노트"
|
||||||
pinned: "프로필에 붙이기"
|
pinned: "프로필에 붙이기"
|
||||||
you: "나"
|
you: "나"
|
||||||
clickToShow: "누질라서 보기"
|
clickToShow: "누질라서 보기"
|
||||||
|
@ -121,7 +121,6 @@ sensitive: "수ᇚ힛섭니다"
|
||||||
add: "옇기"
|
add: "옇기"
|
||||||
reaction: "반엉"
|
reaction: "반엉"
|
||||||
reactions: "반엉"
|
reactions: "반엉"
|
||||||
reactionSetting: "모엄함서 포시할 반엉"
|
|
||||||
reactionSettingDescription2: "꺼시서 두고, 누질라서 뭉캐고, ‘+’럴 누질라서 옇십니다."
|
reactionSettingDescription2: "꺼시서 두고, 누질라서 뭉캐고, ‘+’럴 누질라서 옇십니다."
|
||||||
rememberNoteVisibility: "공개 범위럴 기억하기"
|
rememberNoteVisibility: "공개 범위럴 기억하기"
|
||||||
attachCancel: "붙임 빼기"
|
attachCancel: "붙임 빼기"
|
||||||
|
@ -330,7 +329,7 @@ whenServerDisconnected: "서버하고 옌겔이 껂기모"
|
||||||
disconnectedFromServer: "서버하고 옌겔이 껂깃십니다"
|
disconnectedFromServer: "서버하고 옌겔이 껂깃십니다"
|
||||||
reload: "새로곤침"
|
reload: "새로곤침"
|
||||||
doNothing: "무시하기"
|
doNothing: "무시하기"
|
||||||
reloadConfirm: "새로곤침합니까?"
|
reloadConfirm: "새로곤침합니꺼?"
|
||||||
watch: "간심 갖기"
|
watch: "간심 갖기"
|
||||||
unwatch: "간심 고마 갖기"
|
unwatch: "간심 고마 갖기"
|
||||||
accept: "받기"
|
accept: "받기"
|
||||||
|
@ -368,7 +367,7 @@ pinnedUsersDescription: "‘살펴보기’서 붙일라넌 사용자럴 줄 바
|
||||||
pinnedPages: "붙인 바닥"
|
pinnedPages: "붙인 바닥"
|
||||||
pinnedPagesDescription: "서버으 대문서 붙일라넌 바닥으 겡로럴 줄 바꿈해서로 적십니다."
|
pinnedPagesDescription: "서버으 대문서 붙일라넌 바닥으 겡로럴 줄 바꿈해서로 적십니다."
|
||||||
pinnedClipId: "붙일 클립으 아이디"
|
pinnedClipId: "붙일 클립으 아이디"
|
||||||
pinnedNotes: "프로필에 붙인 노트"
|
pinnedNotes: "붙인 노트"
|
||||||
hcaptcha: "에이치캡차"
|
hcaptcha: "에이치캡차"
|
||||||
enableHcaptcha: "에이치캡차 키기"
|
enableHcaptcha: "에이치캡차 키기"
|
||||||
hcaptchaSiteKey: "사이트키"
|
hcaptchaSiteKey: "사이트키"
|
||||||
|
@ -381,7 +380,7 @@ turnstile: "턴스타일"
|
||||||
enableTurnstile: "턴스타일 키기"
|
enableTurnstile: "턴스타일 키기"
|
||||||
turnstileSiteKey: "사이트키"
|
turnstileSiteKey: "사이트키"
|
||||||
turnstileSecretKey: "시크릿키"
|
turnstileSecretKey: "시크릿키"
|
||||||
avoidMultiCaptchaConfirm: "오만 캡차럴 서모 간섭이 잇얼 깁니다. 다린 캡차를 껍니까? ‘아이예’럴 누질리모 오만 캡차럴 키 둘 수도 잇십니다."
|
avoidMultiCaptchaConfirm: "오만 캡차럴 서모 간섭이 잇얼 깁니다. 다린 캡차를 껍니꺼? ‘아이예’럴 누질리모 오만 캡차럴 키 둘 수도 잇십니다."
|
||||||
antennas: "안테나"
|
antennas: "안테나"
|
||||||
manageAntennas: "안테나 간리"
|
manageAntennas: "안테나 간리"
|
||||||
name: "이럼"
|
name: "이럼"
|
||||||
|
@ -413,7 +412,7 @@ userList: "리스트"
|
||||||
about: "정보"
|
about: "정보"
|
||||||
aboutMisskey: "Misskey넌예"
|
aboutMisskey: "Misskey넌예"
|
||||||
administrator: "간리자"
|
administrator: "간리자"
|
||||||
token: "학인 코드"
|
token: "학인 기호"
|
||||||
2fa: "두 단게 정멩"
|
2fa: "두 단게 정멩"
|
||||||
setupOf2fa: "두 단게 정멩 설정"
|
setupOf2fa: "두 단게 정멩 설정"
|
||||||
totp: "정멩 앱"
|
totp: "정멩 앱"
|
||||||
|
@ -426,13 +425,45 @@ moderationLogs: "중재 일지"
|
||||||
nUsersMentioned: "{n}멩이 이바구하고 잇어예"
|
nUsersMentioned: "{n}멩이 이바구하고 잇어예"
|
||||||
securityKeyAndPasskey: "보안키·패스키"
|
securityKeyAndPasskey: "보안키·패스키"
|
||||||
securityKey: "보안키"
|
securityKey: "보안키"
|
||||||
|
unregister: "맨걸기 무루기"
|
||||||
|
share: "노누기"
|
||||||
|
notFound: "몬 찾앗십니다"
|
||||||
|
help: "도움말"
|
||||||
invites: "초대하기"
|
invites: "초대하기"
|
||||||
|
retype: "다시 서기"
|
||||||
|
noteOf: "{user}님으 노트"
|
||||||
invitations: "초대하기"
|
invitations: "초대하기"
|
||||||
|
checking: "학인하고 잇십니다"
|
||||||
|
passwordMatched: "맞십니다"
|
||||||
|
passwordNotMatched: "안 맞십니다"
|
||||||
language: "언어"
|
language: "언어"
|
||||||
|
remote: "웬겍"
|
||||||
|
script: "스크립트"
|
||||||
manage: "간리"
|
manage: "간리"
|
||||||
|
emailServer: "전자우펜 서버"
|
||||||
|
email: "전자우펜"
|
||||||
|
emailAddress: "전자우펜 주소"
|
||||||
smtpHost: "호스트 이럼"
|
smtpHost: "호스트 이럼"
|
||||||
|
smtpPort: "포트"
|
||||||
smtpUser: "사용자 이럼"
|
smtpUser: "사용자 이럼"
|
||||||
smtpPass: "비밀번호"
|
smtpPass: "비밀번호"
|
||||||
|
abuseReports: "신고하기"
|
||||||
|
reportAbuse: "신고하기"
|
||||||
|
reportAbuseRenote: "리노트 신고하기"
|
||||||
|
reportAbuseOf: "{name}님얼 신고하기"
|
||||||
|
reporter: "신고한 사람"
|
||||||
|
reporteeOrigin: "신고덴 사람"
|
||||||
|
reporterOrigin: "신고한 곳"
|
||||||
|
forwardReport: "웬겍 서버에 신고 보내기"
|
||||||
|
random: "무작이"
|
||||||
|
system: "시스템"
|
||||||
|
clip: "클립 맨걸기"
|
||||||
|
notesCount: "노트 수"
|
||||||
|
renotesCount: "리노트한 수"
|
||||||
|
renotedCount: "리노트덴 수"
|
||||||
|
followingCount: "팔로우 수"
|
||||||
|
followersCount: "팔로워 수"
|
||||||
|
clips: "클립 맨걸기"
|
||||||
clearCache: "캐시 비우기"
|
clearCache: "캐시 비우기"
|
||||||
unlikeConfirm: "좋네예럴 무룹니꺼?"
|
unlikeConfirm: "좋네예럴 무룹니꺼?"
|
||||||
info: "정보"
|
info: "정보"
|
||||||
|
@ -440,6 +471,7 @@ user: "사용자"
|
||||||
administration: "간리"
|
administration: "간리"
|
||||||
on: "킴"
|
on: "킴"
|
||||||
off: "껌"
|
off: "껌"
|
||||||
|
clickToFinishEmailVerification: "[{ok}]럴 누질라서 전자우펜 정멩얼 껕내이소."
|
||||||
searchByGoogle: "찾기"
|
searchByGoogle: "찾기"
|
||||||
tenMinutes: "십 분"
|
tenMinutes: "십 분"
|
||||||
oneHour: "한 시간"
|
oneHour: "한 시간"
|
||||||
|
@ -459,6 +491,20 @@ likeOnly: "좋네예마"
|
||||||
icon: "아바타"
|
icon: "아바타"
|
||||||
replies: "답하기"
|
replies: "답하기"
|
||||||
renotes: "리노트"
|
renotes: "리노트"
|
||||||
|
_initialAccountSetting:
|
||||||
|
startTutorial: "길라잡이 하기"
|
||||||
|
_initialTutorial:
|
||||||
|
launchTutorial: "길라잡이 보기"
|
||||||
|
title: "길라잡이"
|
||||||
|
skipAreYouSure: "길라잡이럴 껕냅니까?"
|
||||||
|
_landing:
|
||||||
|
title: "길라잡이에 어서 오이소"
|
||||||
|
_done:
|
||||||
|
title: "길라잡이가 껕낫십니다!🎉"
|
||||||
|
_achievements:
|
||||||
|
_types:
|
||||||
|
_tutorialCompleted:
|
||||||
|
description: "길라잡이럴 껕냇십니다"
|
||||||
_gallery:
|
_gallery:
|
||||||
liked: "좋네예한 걸"
|
liked: "좋네예한 걸"
|
||||||
like: "좋네예!"
|
like: "좋네예!"
|
||||||
|
@ -466,13 +512,16 @@ _gallery:
|
||||||
_email:
|
_email:
|
||||||
_follow:
|
_follow:
|
||||||
title: "새 팔로워가 잇십니다"
|
title: "새 팔로워가 잇십니다"
|
||||||
|
_channel:
|
||||||
|
removeBanner: "배너 뭉캐기"
|
||||||
_theme:
|
_theme:
|
||||||
keys:
|
keys:
|
||||||
mention: "멘션"
|
mention: "멘션"
|
||||||
_sfx:
|
_sfx:
|
||||||
note: "노트"
|
note: "새 노트"
|
||||||
notification: "알림"
|
notification: "알림"
|
||||||
_2fa:
|
_2fa:
|
||||||
|
step3Title: "학인 기호럴 서기"
|
||||||
renewTOTPCancel: "뎃어예"
|
renewTOTPCancel: "뎃어예"
|
||||||
_widgets:
|
_widgets:
|
||||||
profile: "프로필"
|
profile: "프로필"
|
||||||
|
@ -501,11 +550,15 @@ _charts:
|
||||||
federation: "옌합"
|
federation: "옌합"
|
||||||
_timelines:
|
_timelines:
|
||||||
home: "덜머리"
|
home: "덜머리"
|
||||||
|
_play:
|
||||||
|
script: "스크립트"
|
||||||
_pages:
|
_pages:
|
||||||
like: "좋네예"
|
like: "좋네예"
|
||||||
unlike: "좋네예 무루기"
|
unlike: "좋네예 무루기"
|
||||||
blocks:
|
blocks:
|
||||||
image: "이미지"
|
image: "이미지"
|
||||||
|
_note:
|
||||||
|
id: "노트 아이디"
|
||||||
_notification:
|
_notification:
|
||||||
youWereFollowed: "새 팔로워가 잇십니다"
|
youWereFollowed: "새 팔로워가 잇십니다"
|
||||||
_types:
|
_types:
|
||||||
|
@ -526,3 +579,6 @@ _webhookSettings:
|
||||||
name: "이럼"
|
name: "이럼"
|
||||||
_moderationLogTypes:
|
_moderationLogTypes:
|
||||||
suspend: "얼우기"
|
suspend: "얼우기"
|
||||||
|
deleteNote: "노트 뭉캐기"
|
||||||
|
deleteUserAnnouncement: "사용자 공지 걸 뭉캐기"
|
||||||
|
resolveAbuseReport: "신고 해겔하기"
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "열람 주의"
|
||||||
add: "추가"
|
add: "추가"
|
||||||
reaction: "리액션"
|
reaction: "리액션"
|
||||||
reactions: "리액션"
|
reactions: "리액션"
|
||||||
reactionSetting: "선택기에 표시할 리액션"
|
emojiPicker: "이모지 선택기"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "리액션을 할 때 프로필에 고정하여 표시할 이모지를 설정할 수 있습니다"
|
||||||
|
pinnedEmojisSettingDescription: "이모지를 입력할 때 프로필에 고정하여 표시할 이모지를 설정할 수 있습니다"
|
||||||
|
emojiPickerDisplay: "선택기 표시"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "리액션 설정을 덮어쓰기"
|
||||||
|
overwriteFromPinnedEmojis: "일반 설정을 덮어쓰기"
|
||||||
reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다."
|
reactionSettingDescription2: "끌어서 순서 변경, 클릭해서 삭제, +를 눌러서 추가할 수 있습니다."
|
||||||
rememberNoteVisibility: "공개 범위를 기억하기"
|
rememberNoteVisibility: "공개 범위를 기억하기"
|
||||||
attachCancel: "첨부 취소"
|
attachCancel: "첨부 취소"
|
||||||
|
@ -261,6 +266,7 @@ removed: "삭제하였습니다"
|
||||||
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
removeAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
||||||
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
deleteAreYouSure: "\"{x}\" 을(를) 삭제하시겠습니까?"
|
||||||
resetAreYouSure: "초기화 하시겠습니까?"
|
resetAreYouSure: "초기화 하시겠습니까?"
|
||||||
|
areYouSure: "계속 진행하시겠습니까?"
|
||||||
saved: "저장하였습니다"
|
saved: "저장하였습니다"
|
||||||
messaging: "대화"
|
messaging: "대화"
|
||||||
upload: "업로드"
|
upload: "업로드"
|
||||||
|
@ -686,7 +692,7 @@ defaultNavigationBehaviour: "기본 탐색 동작"
|
||||||
editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다."
|
editTheseSettingsMayBreakAccount: "이 설정을 변경하면 계정이 손상될 수 있습니다."
|
||||||
instanceTicker: "노트의 서버 정보"
|
instanceTicker: "노트의 서버 정보"
|
||||||
waitingFor: "{x}을(를) 기다리고 있습니다"
|
waitingFor: "{x}을(를) 기다리고 있습니다"
|
||||||
random: "랜덤"
|
random: "무작위"
|
||||||
system: "시스템"
|
system: "시스템"
|
||||||
switchUi: "UI 전환"
|
switchUi: "UI 전환"
|
||||||
desktop: "데스크탑"
|
desktop: "데스크탑"
|
||||||
|
@ -875,8 +881,8 @@ makeReactionsPublicDescription: "나의 리액션을 누구나 볼 수 있게
|
||||||
classic: "클래식"
|
classic: "클래식"
|
||||||
muteThread: "글타래 뮤트"
|
muteThread: "글타래 뮤트"
|
||||||
unmuteThread: "글타래 뮤트 해제"
|
unmuteThread: "글타래 뮤트 해제"
|
||||||
ffVisibility: "내 인맥의 공개 범위"
|
followingVisibility: "팔로우의 공개 범위"
|
||||||
ffVisibilityDescription: "나의 팔로우와 팔로워 정보에 대한 공개 범위를 설정할 수 있습니다."
|
followersVisibility: "팔로워의 공개 범위"
|
||||||
continueThread: "글타래 더 보기"
|
continueThread: "글타래 더 보기"
|
||||||
deleteAccountConfirm: "계정이 삭제되고 되돌릴 수 없게 됩니다. 계속하시겠습니까? "
|
deleteAccountConfirm: "계정이 삭제되고 되돌릴 수 없게 됩니다. 계속하시겠습니까? "
|
||||||
incorrectPassword: "비밀번호가 올바르지 않습니다."
|
incorrectPassword: "비밀번호가 올바르지 않습니다."
|
||||||
|
@ -1156,7 +1162,8 @@ privacyPolicyUrl: "개인정보 보호 정책 URL"
|
||||||
tosAndPrivacyPolicy: "약관 및 개인정보 보호 정책"
|
tosAndPrivacyPolicy: "약관 및 개인정보 보호 정책"
|
||||||
avatarDecorations: "아바타 장식"
|
avatarDecorations: "아바타 장식"
|
||||||
attach: "붙이기"
|
attach: "붙이기"
|
||||||
detach: "떼기"
|
detach: "빼기"
|
||||||
|
detachAll: "모두 빼기"
|
||||||
angle: "각도"
|
angle: "각도"
|
||||||
flip: "플립"
|
flip: "플립"
|
||||||
showAvatarDecorations: "아바타 장식 표시"
|
showAvatarDecorations: "아바타 장식 표시"
|
||||||
|
@ -1170,6 +1177,10 @@ cwNotationRequired: "'내용을 숨기기'를 체크한 경우 주석을 써야
|
||||||
doReaction: "리액션 추가"
|
doReaction: "리액션 추가"
|
||||||
code: "문자열"
|
code: "문자열"
|
||||||
reloadRequiredToApplySettings: "설정을 적용하려면 새로고침을 해야 합니다."
|
reloadRequiredToApplySettings: "설정을 적용하려면 새로고침을 해야 합니다."
|
||||||
|
remainingN: "나머지: {n}"
|
||||||
|
overwriteContentConfirm: "현재 내용을 덮어쓰기 합니다. 계속 진행하시겠습니까?"
|
||||||
|
seasonalScreenEffect: "철에 맞는 화면으로 꾸미기"
|
||||||
|
decorate: "장식하기"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "기존 유저에게만 알림"
|
forExistingUsers: "기존 유저에게만 알림"
|
||||||
forExistingUsersDescription: "활성화하면 이 공지사항을 게시한 시점에서 이미 가입한 유저에게만 표시합니다. 비활성화하면 게시 후에 가입한 유저에게도 표시합니다."
|
forExistingUsersDescription: "활성화하면 이 공지사항을 게시한 시점에서 이미 가입한 유저에게만 표시합니다. 비활성화하면 게시 후에 가입한 유저에게도 표시합니다."
|
||||||
|
@ -1601,6 +1612,7 @@ _role:
|
||||||
canHideAds: "광고 숨기기"
|
canHideAds: "광고 숨기기"
|
||||||
canSearchNotes: "노트 검색 이용 가능 여부"
|
canSearchNotes: "노트 검색 이용 가능 여부"
|
||||||
canUseTranslator: "번역 기능의 사용"
|
canUseTranslator: "번역 기능의 사용"
|
||||||
|
avatarDecorationLimit: "아바타 장식의 최대 붙임 개수"
|
||||||
_condition:
|
_condition:
|
||||||
isLocal: "로컬 사용자"
|
isLocal: "로컬 사용자"
|
||||||
isRemote: "리모트 사용자"
|
isRemote: "리모트 사용자"
|
||||||
|
@ -1828,8 +1840,8 @@ _soundSettings:
|
||||||
driveFileWarn: "드라이브에 있는 파일을 선택하세요."
|
driveFileWarn: "드라이브에 있는 파일을 선택하세요."
|
||||||
driveFileTypeWarn: "이 파일은 지원되지 않습니다."
|
driveFileTypeWarn: "이 파일은 지원되지 않습니다."
|
||||||
driveFileTypeWarnDescription: "오디오 파일을 선택하세요."
|
driveFileTypeWarnDescription: "오디오 파일을 선택하세요."
|
||||||
driveFileDurationWarn: "오디오가 너무 길어요."
|
driveFileDurationWarn: "오디오가 너무 깁니다"
|
||||||
driveFileDurationWarnDescription: "길은 오디오를 사용하시는 경우 미스키 사용에 지장이 갈 수도 있습니다. 그래도 괜찮습니까?"
|
driveFileDurationWarnDescription: "긴 오디오로 설정할 경우 미스키 사용에 지장이 갈 수도 있습니다. 그래도 괜찮습니까?"
|
||||||
_ago:
|
_ago:
|
||||||
future: "미래"
|
future: "미래"
|
||||||
justNow: "방금 전"
|
justNow: "방금 전"
|
||||||
|
@ -2037,6 +2049,7 @@ _profile:
|
||||||
changeAvatar: "아바타 이미지 변경"
|
changeAvatar: "아바타 이미지 변경"
|
||||||
changeBanner: "배너 이미지 변경"
|
changeBanner: "배너 이미지 변경"
|
||||||
verifiedLinkDescription: "내용에 자신의 프로필로 향하는 링크가 포함된 페이지의 URL을 삽입하면 소유자 인증 마크가 표시됩니다."
|
verifiedLinkDescription: "내용에 자신의 프로필로 향하는 링크가 포함된 페이지의 URL을 삽입하면 소유자 인증 마크가 표시됩니다."
|
||||||
|
avatarDecorationMax: "최대 {max}개까지 장식을 할 수 있습니다."
|
||||||
_exportOrImport:
|
_exportOrImport:
|
||||||
allNotes: "모든 노트"
|
allNotes: "모든 노트"
|
||||||
favoritedNotes: "즐겨찾기한 노트"
|
favoritedNotes: "즐겨찾기한 노트"
|
||||||
|
@ -2270,9 +2283,9 @@ _moderationLogTypes:
|
||||||
createAd: "광고 생성"
|
createAd: "광고 생성"
|
||||||
deleteAd: "광고 삭제"
|
deleteAd: "광고 삭제"
|
||||||
updateAd: "광고 수정"
|
updateAd: "광고 수정"
|
||||||
createAvatarDecoration: "아이콘 장식 추가"
|
createAvatarDecoration: "아바타 장식 만들기"
|
||||||
updateAvatarDecoration: "아이콘 장식 수정"
|
updateAvatarDecoration: "아바타 장식 수정"
|
||||||
deleteAvatarDecoration: "아이콘 장식 삭제"
|
deleteAvatarDecoration: "아바타 장식 삭제"
|
||||||
unsetUserAvatar: "유저 아바타 제거"
|
unsetUserAvatar: "유저 아바타 제거"
|
||||||
unsetUserBanner: "유저 배너 제거"
|
unsetUserBanner: "유저 배너 제거"
|
||||||
_fileViewer:
|
_fileViewer:
|
||||||
|
|
|
@ -119,7 +119,6 @@ sensitive: "NSFW"
|
||||||
add: "Toevoegen"
|
add: "Toevoegen"
|
||||||
reaction: "Reacties"
|
reaction: "Reacties"
|
||||||
reactions: "Reacties"
|
reactions: "Reacties"
|
||||||
reactionSetting: "Reacties die in de reactie-selector worden getoond"
|
|
||||||
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen, Druk op \"+\" om toe te voegen"
|
reactionSettingDescription2: "Sleep om opnieuw te ordenen, Klik om te verwijderen, Druk op \"+\" om toe te voegen"
|
||||||
rememberNoteVisibility: "Vergeet niet de notitie zichtbaarheidsinstellingen"
|
rememberNoteVisibility: "Vergeet niet de notitie zichtbaarheidsinstellingen"
|
||||||
attachCancel: "Verwijder bijlage"
|
attachCancel: "Verwijder bijlage"
|
||||||
|
|
|
@ -102,7 +102,6 @@ clickToShow: "Klikk for å vise"
|
||||||
add: "Legg til"
|
add: "Legg til"
|
||||||
reaction: "Reaksjon"
|
reaction: "Reaksjon"
|
||||||
reactions: "Reaksjoner"
|
reactions: "Reaksjoner"
|
||||||
reactionSetting: "Reaksjoner som vises i reaksjonsvelgeren"
|
|
||||||
reactionSettingDescription2: "Dra for å endre rekkefølgen, klikk for å slette, trykk \"+\" for å legge til."
|
reactionSettingDescription2: "Dra for å endre rekkefølgen, klikk for å slette, trykk \"+\" for å legge til."
|
||||||
rememberNoteVisibility: "Husk innstillingene for synlighet av Notes"
|
rememberNoteVisibility: "Husk innstillingene for synlighet av Notes"
|
||||||
attachCancel: "Fjern vedlegg"
|
attachCancel: "Fjern vedlegg"
|
||||||
|
|
|
@ -111,7 +111,6 @@ sensitive: "NSFW"
|
||||||
add: "Dodaj"
|
add: "Dodaj"
|
||||||
reaction: "Reakcja"
|
reaction: "Reakcja"
|
||||||
reactions: "Reakcja"
|
reactions: "Reakcja"
|
||||||
reactionSetting: "Reakcje do pokazania w wyborniku reakcji"
|
|
||||||
reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć, naciśnij „+” aby dodać"
|
reactionSettingDescription2: "Przeciągnij aby zmienić kolejność, naciśnij aby usunąć, naciśnij „+” aby dodać"
|
||||||
rememberNoteVisibility: "Zapamiętuj ustawienia widoczności wpisu"
|
rememberNoteVisibility: "Zapamiętuj ustawienia widoczności wpisu"
|
||||||
attachCancel: "Usuń załącznik"
|
attachCancel: "Usuń załącznik"
|
||||||
|
@ -807,8 +806,6 @@ makeReactionsPublicDescription: "To spowoduje, że lista wszystkich Twoich dotyc
|
||||||
classic: "Klasyczny"
|
classic: "Klasyczny"
|
||||||
muteThread: "Wycisz wątek"
|
muteThread: "Wycisz wątek"
|
||||||
unmuteThread: "Wyłącz wyciszenie wątku"
|
unmuteThread: "Wyłącz wyciszenie wątku"
|
||||||
ffVisibility: "Widoczność obserwowanych/obserwujących"
|
|
||||||
ffVisibilityDescription: "Pozwala skonfigurować, kto może zobaczyć, kogo obserwujesz i kto Cię obserwuje."
|
|
||||||
continueThread: "Pokaż kontynuację wątku"
|
continueThread: "Pokaż kontynuację wątku"
|
||||||
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
|
deleteAccountConfirm: "Spowoduje to nieodwracalne usunięcie Twojego konta. Kontynuować?"
|
||||||
incorrectPassword: "Nieprawidłowe hasło."
|
incorrectPassword: "Nieprawidłowe hasło."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Conteúdo sensível"
|
||||||
add: "Adicionar"
|
add: "Adicionar"
|
||||||
reaction: "Reações"
|
reaction: "Reações"
|
||||||
reactions: "Reações"
|
reactions: "Reações"
|
||||||
reactionSetting: "Quais reações exibir no seletor de reações"
|
|
||||||
reactionSettingDescription2: "Arraste para reordenar, clique para excluir, pressione + para adicionar."
|
reactionSettingDescription2: "Arraste para reordenar, clique para excluir, pressione + para adicionar."
|
||||||
rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas"
|
rememberNoteVisibility: "Lembrar das configurações de visibilidade de notas"
|
||||||
attachCancel: "Remover anexo"
|
attachCancel: "Remover anexo"
|
||||||
|
@ -859,8 +858,6 @@ makeReactionsPublicDescription: "Isto vai deixar o histórico de todas as suas r
|
||||||
classic: "Clássico"
|
classic: "Clássico"
|
||||||
muteThread: "Silenciar esta conversa"
|
muteThread: "Silenciar esta conversa"
|
||||||
unmuteThread: "Desativar silêncio desta conversa"
|
unmuteThread: "Desativar silêncio desta conversa"
|
||||||
ffVisibility: "Visibilidade de Seguidos/Seguidores"
|
|
||||||
ffVisibilityDescription: "Permite configurar quem pode ver quem lhe segue e quem você está seguindo."
|
|
||||||
continueThread: "Ver mais desta conversa"
|
continueThread: "Ver mais desta conversa"
|
||||||
deleteAccountConfirm: "Deseja realmente excluir a conta?"
|
deleteAccountConfirm: "Deseja realmente excluir a conta?"
|
||||||
incorrectPassword: "Senha inválida."
|
incorrectPassword: "Senha inválida."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "NSFW"
|
||||||
add: "Adaugă"
|
add: "Adaugă"
|
||||||
reaction: "Reacție"
|
reaction: "Reacție"
|
||||||
reactions: "Reacție"
|
reactions: "Reacție"
|
||||||
reactionSetting: "Reacții care să apară in selectorul de reacții"
|
|
||||||
reactionSettingDescription2: "Trage pentru a rearanja, apasă pe \"+\" pentru a adăuga."
|
reactionSettingDescription2: "Trage pentru a rearanja, apasă pe \"+\" pentru a adăuga."
|
||||||
rememberNoteVisibility: "Amintește setarea de vizibilitate a notelor"
|
rememberNoteVisibility: "Amintește setarea de vizibilitate a notelor"
|
||||||
attachCancel: "Înlătură atașament"
|
attachCancel: "Înlătură atașament"
|
||||||
|
|
|
@ -120,7 +120,6 @@ sensitive: "Содержимое не для всех"
|
||||||
add: "Добавить"
|
add: "Добавить"
|
||||||
reaction: "Реакции"
|
reaction: "Реакции"
|
||||||
reactions: "Реакции"
|
reactions: "Реакции"
|
||||||
reactionSetting: "Реакции, отображаемые в палитре"
|
|
||||||
reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»."
|
reactionSettingDescription2: "Расставляйте перетаскиванием, удаляйте нажатием, добавляйте кнопкой «+»."
|
||||||
rememberNoteVisibility: "Запоминать видимость заметок"
|
rememberNoteVisibility: "Запоминать видимость заметок"
|
||||||
attachCancel: "Удалить вложение"
|
attachCancel: "Удалить вложение"
|
||||||
|
@ -857,8 +856,6 @@ makeReactionsPublicDescription: "Список сделанных вами реа
|
||||||
classic: "Классика"
|
classic: "Классика"
|
||||||
muteThread: "Скрыть цепочку"
|
muteThread: "Скрыть цепочку"
|
||||||
unmuteThread: "Отменить сокрытие цепочки"
|
unmuteThread: "Отменить сокрытие цепочки"
|
||||||
ffVisibility: "Видимость подписок и подписчиков"
|
|
||||||
ffVisibilityDescription: "Здесь можно настроить, кто будет видеть ваши подписки и подписчиков."
|
|
||||||
continueThread: "Показать следующие ответы"
|
continueThread: "Показать следующие ответы"
|
||||||
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
|
deleteAccountConfirm: "Учётная запись будет безвозвратно удалена. Подтверждаете?"
|
||||||
incorrectPassword: "Пароль неверен."
|
incorrectPassword: "Пароль неверен."
|
||||||
|
|
|
@ -113,7 +113,6 @@ sensitive: "NSFW"
|
||||||
add: "Pridať"
|
add: "Pridať"
|
||||||
reaction: "Reakcie"
|
reaction: "Reakcie"
|
||||||
reactions: "Reakcie"
|
reactions: "Reakcie"
|
||||||
reactionSetting: "Reakcie zobrazené vo výbere reakcií"
|
|
||||||
reactionSettingDescription2: "Ťahaním preusporiadate, kliknutím odstránite, Stlačením \"+\" pridáte"
|
reactionSettingDescription2: "Ťahaním preusporiadate, kliknutím odstránite, Stlačením \"+\" pridáte"
|
||||||
rememberNoteVisibility: "Zapamätať nastavenia viditeľnosti poznámky"
|
rememberNoteVisibility: "Zapamätať nastavenia viditeľnosti poznámky"
|
||||||
attachCancel: "Odstrániť prílohu"
|
attachCancel: "Odstrániť prílohu"
|
||||||
|
@ -822,8 +821,6 @@ makeReactionsPublicDescription: "Toto spraví všetky vaše minulé reakcie vidi
|
||||||
classic: "Klasika"
|
classic: "Klasika"
|
||||||
muteThread: "Ztíšiť vlákno"
|
muteThread: "Ztíšiť vlákno"
|
||||||
unmuteThread: "Zrušiť stíšenie vlákna"
|
unmuteThread: "Zrušiť stíšenie vlákna"
|
||||||
ffVisibility: "Viditeľnosť sledujúcich/sledovaných"
|
|
||||||
ffVisibilityDescription: "Umožňuje nastaviť kto vidí koho sledujete a kto vás sleduje."
|
|
||||||
continueThread: "Zobraziť pokračovanie vlákna"
|
continueThread: "Zobraziť pokračovanie vlákna"
|
||||||
deleteAccountConfirm: "Toto nezvrátiteľne vymaže váš účet. Pokračovať?"
|
deleteAccountConfirm: "Toto nezvrátiteľne vymaže váš účet. Pokračovať?"
|
||||||
incorrectPassword: "Nesprávne heslo."
|
incorrectPassword: "Nesprávne heslo."
|
||||||
|
|
|
@ -118,7 +118,6 @@ sensitive: "Känsligt innehåll"
|
||||||
add: "Lägg till"
|
add: "Lägg till"
|
||||||
reaction: "Reaktioner"
|
reaction: "Reaktioner"
|
||||||
reactions: "Reaktioner"
|
reactions: "Reaktioner"
|
||||||
reactionSetting: "Reaktioner som ska visas i reaktionsväljaren"
|
|
||||||
reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"+\" för att lägga till."
|
reactionSettingDescription2: "Dra för att omordna, klicka för att radera, tryck \"+\" för att lägga till."
|
||||||
rememberNoteVisibility: "Komihåg notvisningsinställningar"
|
rememberNoteVisibility: "Komihåg notvisningsinställningar"
|
||||||
attachCancel: "Ta bort bilaga"
|
attachCancel: "Ta bort bilaga"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "เนื้อหาที่ละเอียดอ่อน NSFW
|
||||||
add: "เพิ่ม"
|
add: "เพิ่ม"
|
||||||
reaction: "รีแอคชั่น"
|
reaction: "รีแอคชั่น"
|
||||||
reactions: "รีแอคชั่น"
|
reactions: "รีแอคชั่น"
|
||||||
reactionSetting: "รีแอคชั่นไปยังแสดงผลในตัวเลือกการรีแอคชั่น"
|
|
||||||
reactionSettingDescription2: "กดลากเพื่อจัดลำดับใหม่ กดคลิกเพื่อลบ กด \"+\" เพื่อเพิ่ม"
|
reactionSettingDescription2: "กดลากเพื่อจัดลำดับใหม่ กดคลิกเพื่อลบ กด \"+\" เพื่อเพิ่ม"
|
||||||
rememberNoteVisibility: "จดจำการตั้งค่าการมองเห็นตัวโน้ต"
|
rememberNoteVisibility: "จดจำการตั้งค่าการมองเห็นตัวโน้ต"
|
||||||
attachCancel: "ลบไฟล์ออกที่แนบมา"
|
attachCancel: "ลบไฟล์ออกที่แนบมา"
|
||||||
|
@ -870,8 +869,6 @@ makeReactionsPublicDescription: "การทำเช่นนี้จะท
|
||||||
classic: "คลาสสิค"
|
classic: "คลาสสิค"
|
||||||
muteThread: "ปิดเสียงเธรด"
|
muteThread: "ปิดเสียงเธรด"
|
||||||
unmuteThread: "เปิดเสียงเธรด"
|
unmuteThread: "เปิดเสียงเธรด"
|
||||||
ffVisibility: "การมองเห็นผู้ติดตาม/ผู้ติดตาม"
|
|
||||||
ffVisibilityDescription: "ช่วยให้คุณสามารถกำหนดค่าได้ว่าใครสามารถดูได้ว่าคุณติดตามใครและใครติดตามคุณบ้าง"
|
|
||||||
continueThread: "ดูความต่อเนื่องเธรด"
|
continueThread: "ดูความต่อเนื่องเธรด"
|
||||||
deleteAccountConfirm: "การดำเนินการนี้จะลบบัญชีของคุณอย่างถาวรเลยนะ แน่ใจหรอดำเนินการ?"
|
deleteAccountConfirm: "การดำเนินการนี้จะลบบัญชีของคุณอย่างถาวรเลยนะ แน่ใจหรอดำเนินการ?"
|
||||||
incorrectPassword: "รหัสผ่านไม่ถูกต้อง"
|
incorrectPassword: "รหัสผ่านไม่ถูกต้อง"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Hassas içerik"
|
||||||
add: "Ekle"
|
add: "Ekle"
|
||||||
reaction: "Tepkiler"
|
reaction: "Tepkiler"
|
||||||
reactions: "Tepkiler"
|
reactions: "Tepkiler"
|
||||||
reactionSetting: "Palette görünecek tepkiler"
|
|
||||||
reactionSettingDescription2: "Sıralamak için sürükleyin, silmek için tıklayın, eklemek için \"+\" tuşuna tıklayın."
|
reactionSettingDescription2: "Sıralamak için sürükleyin, silmek için tıklayın, eklemek için \"+\" tuşuna tıklayın."
|
||||||
rememberNoteVisibility: "Görünürlük ayarlarını hatırla"
|
rememberNoteVisibility: "Görünürlük ayarlarını hatırla"
|
||||||
attachCancel: "Eki sil"
|
attachCancel: "Eki sil"
|
||||||
|
|
|
@ -55,6 +55,7 @@ copyRSS: "Скопіювати RSS"
|
||||||
copyUsername: "Скопіювати ім’я користувача"
|
copyUsername: "Скопіювати ім’я користувача"
|
||||||
copyUserId: "Копіювати ID користувача"
|
copyUserId: "Копіювати ID користувача"
|
||||||
copyNoteId: "блокнот ID користувача"
|
copyNoteId: "блокнот ID користувача"
|
||||||
|
copyFileId: "Скопіювати ідентифікатор файлу."
|
||||||
searchUser: "Пошук користувачів"
|
searchUser: "Пошук користувачів"
|
||||||
reply: "Відповісти"
|
reply: "Відповісти"
|
||||||
loadMore: "Показати більше"
|
loadMore: "Показати більше"
|
||||||
|
@ -115,7 +116,6 @@ sensitive: "NSFW"
|
||||||
add: "Додати"
|
add: "Додати"
|
||||||
reaction: "Реакції"
|
reaction: "Реакції"
|
||||||
reactions: "Реакції"
|
reactions: "Реакції"
|
||||||
reactionSetting: "Налаштування реакцій"
|
|
||||||
reactionSettingDescription2: "Перемістити щоб змінити порядок, Клацнути мишою щоб видалити, Натиснути \"+\" щоб додати."
|
reactionSettingDescription2: "Перемістити щоб змінити порядок, Клацнути мишою щоб видалити, Натиснути \"+\" щоб додати."
|
||||||
rememberNoteVisibility: "Пам’ятати параметри видимісті"
|
rememberNoteVisibility: "Пам’ятати параметри видимісті"
|
||||||
attachCancel: "Видалити вкладення"
|
attachCancel: "Видалити вкладення"
|
||||||
|
@ -133,6 +133,7 @@ unblockConfirm: "Ви впевнені, що хочете розблокуват
|
||||||
suspendConfirm: "Ви впевнені, що хочете призупинити цей акаунт?"
|
suspendConfirm: "Ви впевнені, що хочете призупинити цей акаунт?"
|
||||||
unsuspendConfirm: "Ви впевнені, що хочете відновити цей акаунт?"
|
unsuspendConfirm: "Ви впевнені, що хочете відновити цей акаунт?"
|
||||||
selectList: "Виберіть список"
|
selectList: "Виберіть список"
|
||||||
|
editList: "Редагувати список."
|
||||||
selectChannel: "Виберіть канал"
|
selectChannel: "Виберіть канал"
|
||||||
selectAntenna: "Виберіть антену"
|
selectAntenna: "Виберіть антену"
|
||||||
selectWidget: "Виберіть віджет"
|
selectWidget: "Виберіть віджет"
|
||||||
|
@ -448,6 +449,7 @@ or: "або"
|
||||||
language: "Мова"
|
language: "Мова"
|
||||||
uiLanguage: "Мова інтерфейсу"
|
uiLanguage: "Мова інтерфейсу"
|
||||||
aboutX: "Про {x}"
|
aboutX: "Про {x}"
|
||||||
|
native: "місцевий"
|
||||||
disableDrawer: "Не використовувати висувні меню"
|
disableDrawer: "Не використовувати висувні меню"
|
||||||
noHistory: "Історія порожня"
|
noHistory: "Історія порожня"
|
||||||
signinHistory: "Історія входів"
|
signinHistory: "Історія входів"
|
||||||
|
@ -526,6 +528,8 @@ output: "Вихід"
|
||||||
script: "Скрипт"
|
script: "Скрипт"
|
||||||
disablePagesScript: "Вимкнути AiScript на Сторінках"
|
disablePagesScript: "Вимкнути AiScript на Сторінках"
|
||||||
updateRemoteUser: "Оновити інформацію про віддаленого користувача"
|
updateRemoteUser: "Оновити інформацію про віддаленого користувача"
|
||||||
|
unsetUserAvatar: "Деактивувати піктограму."
|
||||||
|
unsetUserBanner: "Випустити прапор."
|
||||||
deleteAllFiles: "Видалити всі файли"
|
deleteAllFiles: "Видалити всі файли"
|
||||||
deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?"
|
deleteAllFilesConfirm: "Ви дійсно хочете видалити всі файли?"
|
||||||
removeAllFollowing: "Скасувати всі підписки"
|
removeAllFollowing: "Скасувати всі підписки"
|
||||||
|
@ -813,7 +817,6 @@ makeReactionsPublicDescription: "Це зробить список усіх ва
|
||||||
classic: "Класичний"
|
classic: "Класичний"
|
||||||
muteThread: "Приглушити тред"
|
muteThread: "Приглушити тред"
|
||||||
unmuteThread: "Скасувати глушіння"
|
unmuteThread: "Скасувати глушіння"
|
||||||
ffVisibility: "Видимість підписок/підписників"
|
|
||||||
continueThread: "Показати продовження треду"
|
continueThread: "Показати продовження треду"
|
||||||
deleteAccountConfirm: "Це незворотно видалить ваш акаунт. Продовжити?"
|
deleteAccountConfirm: "Це незворотно видалить ваш акаунт. Продовжити?"
|
||||||
incorrectPassword: "Неправильний пароль."
|
incorrectPassword: "Неправильний пароль."
|
||||||
|
|
|
@ -120,7 +120,6 @@ sensitive: "Sezuvchan"
|
||||||
add: "Qo'shish"
|
add: "Qo'shish"
|
||||||
reaction: "Reaktsiyalar"
|
reaction: "Reaktsiyalar"
|
||||||
reactions: "Reaktsiyalar"
|
reactions: "Reaktsiyalar"
|
||||||
reactionSetting: "Reaksiyalar ro'yxati"
|
|
||||||
reactionSettingDescription2: "Qayta tartiblash uchun ushlab turib siljiting, oʻchirish uchun bosing, qoʻshish uchun “+” tugmasini bosing."
|
reactionSettingDescription2: "Qayta tartiblash uchun ushlab turib siljiting, oʻchirish uchun bosing, qoʻshish uchun “+” tugmasini bosing."
|
||||||
rememberNoteVisibility: "Qaydning ko'rinish sozlamarini eslab qolish"
|
rememberNoteVisibility: "Qaydning ko'rinish sozlamarini eslab qolish"
|
||||||
attachCancel: "Qo'shimchani olib tashlash"
|
attachCancel: "Qo'shimchani olib tashlash"
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "Nhạy cảm"
|
||||||
add: "Thêm"
|
add: "Thêm"
|
||||||
reaction: "Biểu cảm"
|
reaction: "Biểu cảm"
|
||||||
reactions: "Biểu cảm"
|
reactions: "Biểu cảm"
|
||||||
reactionSetting: "Chọn những biểu cảm hiển thị"
|
|
||||||
reactionSettingDescription2: "Kéo để sắp xếp, nhấn để xóa, nhấn \"+\" để thêm."
|
reactionSettingDescription2: "Kéo để sắp xếp, nhấn để xóa, nhấn \"+\" để thêm."
|
||||||
rememberNoteVisibility: "Lưu kiểu tút mặc định"
|
rememberNoteVisibility: "Lưu kiểu tút mặc định"
|
||||||
attachCancel: "Gỡ tập tin đính kèm"
|
attachCancel: "Gỡ tập tin đính kèm"
|
||||||
|
@ -858,8 +857,6 @@ makeReactionsPublicDescription: "Điều này sẽ hiển thị công khai danh
|
||||||
classic: "Cổ điển"
|
classic: "Cổ điển"
|
||||||
muteThread: "Không quan tâm nữa"
|
muteThread: "Không quan tâm nữa"
|
||||||
unmuteThread: "Quan tâm tút này"
|
unmuteThread: "Quan tâm tút này"
|
||||||
ffVisibility: "Hiển thị Theo dõi/Người theo dõi"
|
|
||||||
ffVisibilityDescription: "Quyết định ai có thể xem những người bạn theo dõi và những người theo dõi bạn."
|
|
||||||
continueThread: "Tiếp tục xem chuỗi tút"
|
continueThread: "Tiếp tục xem chuỗi tút"
|
||||||
deleteAccountConfirm: "Điều này sẽ khiến tài khoản bị xóa vĩnh viễn. Vẫn tiếp tục?"
|
deleteAccountConfirm: "Điều này sẽ khiến tài khoản bị xóa vĩnh viễn. Vẫn tiếp tục?"
|
||||||
incorrectPassword: "Sai mật khẩu."
|
incorrectPassword: "Sai mật khẩu."
|
||||||
|
|
|
@ -121,7 +121,6 @@ sensitive: "敏感内容"
|
||||||
add: "添加"
|
add: "添加"
|
||||||
reaction: "回应"
|
reaction: "回应"
|
||||||
reactions: "回应"
|
reactions: "回应"
|
||||||
reactionSetting: "在选择器中显示回应"
|
|
||||||
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
reactionSettingDescription2: "拖动重新排序,单击删除,点击 + 添加。"
|
||||||
rememberNoteVisibility: "保存上次设置的可见性"
|
rememberNoteVisibility: "保存上次设置的可见性"
|
||||||
attachCancel: "删除附件"
|
attachCancel: "删除附件"
|
||||||
|
@ -867,8 +866,6 @@ makeReactionsPublicDescription: "将您发表过的回应设置成公开可见
|
||||||
classic: "经典"
|
classic: "经典"
|
||||||
muteThread: "屏蔽帖子列表"
|
muteThread: "屏蔽帖子列表"
|
||||||
unmuteThread: "取消屏蔽帖子列表"
|
unmuteThread: "取消屏蔽帖子列表"
|
||||||
ffVisibility: "关注关系的可见范围"
|
|
||||||
ffVisibilityDescription: "您可以设置您的关注/关注者信息的公开范围"
|
|
||||||
continueThread: "查看更多帖子"
|
continueThread: "查看更多帖子"
|
||||||
deleteAccountConfirm: "将要删除账户。是否确认?"
|
deleteAccountConfirm: "将要删除账户。是否确认?"
|
||||||
incorrectPassword: "密码错误"
|
incorrectPassword: "密码错误"
|
||||||
|
@ -1164,7 +1161,7 @@ _serverSettings:
|
||||||
appIconUsageExample: "例如:作为书签添加到 PWA 或手机主屏幕的时候"
|
appIconUsageExample: "例如:作为书签添加到 PWA 或手机主屏幕的时候"
|
||||||
appIconStyleRecommendation: "因为有可能会被裁切为圆形或者圆角矩形,建议使用边缘带有留白背景的图标。"
|
appIconStyleRecommendation: "因为有可能会被裁切为圆形或者圆角矩形,建议使用边缘带有留白背景的图标。"
|
||||||
appIconResolutionMustBe: "分辨率必须为 {resolution}。"
|
appIconResolutionMustBe: "分辨率必须为 {resolution}。"
|
||||||
manifestJsonOverride: "覆盖 mainfest.json"
|
manifestJsonOverride: "覆盖 manifest.json"
|
||||||
shortName: "简称"
|
shortName: "简称"
|
||||||
shortNameDescription: "如果服务器的正式名称很长,可以用简称或者別名来替代。"
|
shortNameDescription: "如果服务器的正式名称很长,可以用简称或者別名来替代。"
|
||||||
_accountMigration:
|
_accountMigration:
|
||||||
|
|
|
@ -121,7 +121,12 @@ sensitive: "敏感內容"
|
||||||
add: "新增"
|
add: "新增"
|
||||||
reaction: "反應"
|
reaction: "反應"
|
||||||
reactions: "反應"
|
reactions: "反應"
|
||||||
reactionSetting: "在選擇器中顯示反應"
|
emojiPicker: "表情符號選擇器"
|
||||||
|
pinnedEmojisForReactionSettingDescription: "選擇反應時可以設定要固定顯示在頂端的表情符號"
|
||||||
|
pinnedEmojisSettingDescription: "輸入表情符號時可以設定要固定顯示在頂端的表情符號"
|
||||||
|
emojiPickerDisplay: "顯示表情符號選擇器"
|
||||||
|
overwriteFromPinnedEmojisForReaction: "從反應複寫設定"
|
||||||
|
overwriteFromPinnedEmojis: "從一般複寫設定"
|
||||||
reactionSettingDescription2: "拖動以交換,點擊以刪除,按下「+」以新增。"
|
reactionSettingDescription2: "拖動以交換,點擊以刪除,按下「+」以新增。"
|
||||||
rememberNoteVisibility: "記住貼文可見性"
|
rememberNoteVisibility: "記住貼文可見性"
|
||||||
attachCancel: "移除附件"
|
attachCancel: "移除附件"
|
||||||
|
@ -261,7 +266,7 @@ removed: "已刪除"
|
||||||
removeAreYouSure: "確定要刪掉「{x}」嗎?"
|
removeAreYouSure: "確定要刪掉「{x}」嗎?"
|
||||||
deleteAreYouSure: "確定要刪掉「{x}」嗎?"
|
deleteAreYouSure: "確定要刪掉「{x}」嗎?"
|
||||||
resetAreYouSure: "確定要重設嗎?"
|
resetAreYouSure: "確定要重設嗎?"
|
||||||
areYouSure: "您確定要移除所有裝飾嗎?"
|
areYouSure: "是否確定?"
|
||||||
saved: "已儲存"
|
saved: "已儲存"
|
||||||
messaging: "聊天"
|
messaging: "聊天"
|
||||||
upload: "上傳"
|
upload: "上傳"
|
||||||
|
@ -782,7 +787,7 @@ receiveAnnouncementFromInstance: "接收由本實例發出的電郵通知"
|
||||||
emailNotification: "郵件通知"
|
emailNotification: "郵件通知"
|
||||||
publish: "發布"
|
publish: "發布"
|
||||||
inChannelSearch: "頻道内搜尋"
|
inChannelSearch: "頻道内搜尋"
|
||||||
useReactionPickerForContextMenu: "點擊右鍵開啟反應工具欄"
|
useReactionPickerForContextMenu: "點擊右鍵開啟反應選擇器"
|
||||||
typingUsers: "{users}輸入中"
|
typingUsers: "{users}輸入中"
|
||||||
jumpToSpecifiedDate: "跳轉到特定日期"
|
jumpToSpecifiedDate: "跳轉到特定日期"
|
||||||
showingPastTimeline: "顯示過往的時間軸"
|
showingPastTimeline: "顯示過往的時間軸"
|
||||||
|
@ -876,8 +881,8 @@ makeReactionsPublicDescription: "將您做過的反應設為公開可見。"
|
||||||
classic: "經典"
|
classic: "經典"
|
||||||
muteThread: "將貼文串設為靜音"
|
muteThread: "將貼文串設為靜音"
|
||||||
unmuteThread: "將貼文串的靜音解除"
|
unmuteThread: "將貼文串的靜音解除"
|
||||||
ffVisibility: "連繫的可見性"
|
followingVisibility: "追隨中的可見性"
|
||||||
ffVisibilityDescription: "您可以設定追隨或追隨者資訊的公開範圍"
|
followersVisibility: "追隨者的可見性"
|
||||||
continueThread: "查看更多貼文"
|
continueThread: "查看更多貼文"
|
||||||
deleteAccountConfirm: "將要刪除帳戶。是否確定?"
|
deleteAccountConfirm: "將要刪除帳戶。是否確定?"
|
||||||
incorrectPassword: "密碼錯誤。"
|
incorrectPassword: "密碼錯誤。"
|
||||||
|
@ -1173,6 +1178,9 @@ doReaction: "做出反應"
|
||||||
code: "程式碼"
|
code: "程式碼"
|
||||||
reloadRequiredToApplySettings: "需要重新載入頁面設定才能生效。"
|
reloadRequiredToApplySettings: "需要重新載入頁面設定才能生效。"
|
||||||
remainingN: "剩餘:{n}"
|
remainingN: "剩餘:{n}"
|
||||||
|
overwriteContentConfirm: "確定要覆蓋目前的內容嗎?"
|
||||||
|
seasonalScreenEffect: "隨季節變換畫面的呈現"
|
||||||
|
decorate: "設置頭像裝飾"
|
||||||
_announcement:
|
_announcement:
|
||||||
forExistingUsers: "僅限既有的使用者"
|
forExistingUsers: "僅限既有的使用者"
|
||||||
forExistingUsersDescription: "啟用代表僅向現存使用者顯示;停用代表張貼後註冊的新使用者也會看到。"
|
forExistingUsersDescription: "啟用代表僅向現存使用者顯示;停用代表張貼後註冊的新使用者也會看到。"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{
|
{
|
||||||
"name": "misskey",
|
"name": "misskey",
|
||||||
"version": "2023.12.0-beta.5",
|
"version": "2023.12.0-beta.6",
|
||||||
"codename": "nasubi",
|
"codename": "nasubi",
|
||||||
"repository": {
|
"repository": {
|
||||||
"type": "git",
|
"type": "git",
|
||||||
|
|
|
@ -77,6 +77,17 @@ export class FeaturedService {
|
||||||
return Array.from(ranking.keys());
|
return Array.from(ranking.keys());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
private async removeFromRanking(name: string, windowRange: number, element: string): Promise<void> {
|
||||||
|
const currentWindow = this.getCurrentWindow(windowRange);
|
||||||
|
const previousWindow = currentWindow - 1;
|
||||||
|
|
||||||
|
const redisPipeline = this.redisClient.pipeline();
|
||||||
|
redisPipeline.zrem(`${name}:${currentWindow}`, element);
|
||||||
|
redisPipeline.zrem(`${name}:${previousWindow}`, element);
|
||||||
|
await redisPipeline.exec();
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public updateGlobalNotesRanking(noteId: MiNote['id'], score = 1): Promise<void> {
|
public updateGlobalNotesRanking(noteId: MiNote['id'], score = 1): Promise<void> {
|
||||||
return this.updateRankingOf('featuredGlobalNotesRanking', GLOBAL_NOTES_RANKING_WINDOW, noteId, score);
|
return this.updateRankingOf('featuredGlobalNotesRanking', GLOBAL_NOTES_RANKING_WINDOW, noteId, score);
|
||||||
|
@ -126,4 +137,9 @@ export class FeaturedService {
|
||||||
public getHashtagsRanking(threshold: number): Promise<string[]> {
|
public getHashtagsRanking(threshold: number): Promise<string[]> {
|
||||||
return this.getRankingOf('featuredHashtagsRanking', HASHTAG_RANKING_WINDOW, threshold);
|
return this.getRankingOf('featuredHashtagsRanking', HASHTAG_RANKING_WINDOW, threshold);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@bindThis
|
||||||
|
public removeHashtagsFromRanking(hashtag: string): Promise<void> {
|
||||||
|
return this.removeFromRanking('featuredHashtagsRanking', HASHTAG_RANKING_WINDOW, hashtag);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import { MiMeta } from '@/models/Meta.js';
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
||||||
|
import { FeaturedService } from '@/core/FeaturedService.js';
|
||||||
import type { OnApplicationShutdown } from '@nestjs/common';
|
import type { OnApplicationShutdown } from '@nestjs/common';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
|
@ -25,6 +26,7 @@ export class MetaService implements OnApplicationShutdown {
|
||||||
@Inject(DI.db)
|
@Inject(DI.db)
|
||||||
private db: DataSource,
|
private db: DataSource,
|
||||||
|
|
||||||
|
private featuredService: FeaturedService,
|
||||||
private globalEventService: GlobalEventService,
|
private globalEventService: GlobalEventService,
|
||||||
) {
|
) {
|
||||||
//this.onMessage = this.onMessage.bind(this);
|
//this.onMessage = this.onMessage.bind(this);
|
||||||
|
@ -95,6 +97,8 @@ export class MetaService implements OnApplicationShutdown {
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
public async update(data: Partial<MiMeta>): Promise<MiMeta> {
|
public async update(data: Partial<MiMeta>): Promise<MiMeta> {
|
||||||
|
let before: MiMeta | undefined;
|
||||||
|
|
||||||
const updated = await this.db.transaction(async transactionalEntityManager => {
|
const updated = await this.db.transaction(async transactionalEntityManager => {
|
||||||
const metas = await transactionalEntityManager.find(MiMeta, {
|
const metas = await transactionalEntityManager.find(MiMeta, {
|
||||||
order: {
|
order: {
|
||||||
|
@ -102,10 +106,10 @@ export class MetaService implements OnApplicationShutdown {
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
const meta = metas[0];
|
before = metas[0];
|
||||||
|
|
||||||
if (meta) {
|
if (before) {
|
||||||
await transactionalEntityManager.update(MiMeta, meta.id, data);
|
await transactionalEntityManager.update(MiMeta, before.id, data);
|
||||||
|
|
||||||
const metas = await transactionalEntityManager.find(MiMeta, {
|
const metas = await transactionalEntityManager.find(MiMeta, {
|
||||||
order: {
|
order: {
|
||||||
|
@ -119,6 +123,21 @@ export class MetaService implements OnApplicationShutdown {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (data.hiddenTags) {
|
||||||
|
process.nextTick(() => {
|
||||||
|
const hiddenTags = new Set<string>(data.hiddenTags);
|
||||||
|
if (before) {
|
||||||
|
for (const previousHiddenTag of before.hiddenTags) {
|
||||||
|
hiddenTags.delete(previousHiddenTag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const hiddenTag of hiddenTags) {
|
||||||
|
this.featuredService.removeHashtagsFromRanking(hiddenTag);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
this.globalEventService.publishInternalEvent('metaUpdated', updated);
|
this.globalEventService.publishInternalEvent('metaUpdated', updated);
|
||||||
|
|
||||||
return updated;
|
return updated;
|
||||||
|
|
|
@ -6,7 +6,14 @@
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import * as Redis from 'ioredis';
|
import * as Redis from 'ioredis';
|
||||||
import { In } from 'typeorm';
|
import { In } from 'typeorm';
|
||||||
import type { MiRole, MiRoleAssignment, RoleAssignmentsRepository, RolesRepository, UsersRepository } from '@/models/_.js';
|
import { ModuleRef } from '@nestjs/core';
|
||||||
|
import type {
|
||||||
|
MiRole,
|
||||||
|
MiRoleAssignment,
|
||||||
|
RoleAssignmentsRepository,
|
||||||
|
RolesRepository,
|
||||||
|
UsersRepository,
|
||||||
|
} from '@/models/_.js';
|
||||||
import { MemoryKVCache, MemorySingleCache } from '@/misc/cache.js';
|
import { MemoryKVCache, MemorySingleCache } from '@/misc/cache.js';
|
||||||
import type { MiUser } from '@/models/User.js';
|
import type { MiUser } from '@/models/User.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
|
@ -16,12 +23,13 @@ import { CacheService } from '@/core/CacheService.js';
|
||||||
import type { RoleCondFormulaValue } from '@/models/Role.js';
|
import type { RoleCondFormulaValue } from '@/models/Role.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
import { ModerationLogService } from '@/core/ModerationLogService.js';
|
||||||
import type { Packed } from '@/misc/json-schema.js';
|
import type { Packed } from '@/misc/json-schema.js';
|
||||||
import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
|
import { FanoutTimelineService } from '@/core/FanoutTimelineService.js';
|
||||||
import type { OnApplicationShutdown } from '@nestjs/common';
|
import { NotificationService } from '@/core/NotificationService.js';
|
||||||
|
import type { OnApplicationShutdown, OnModuleInit } from '@nestjs/common';
|
||||||
|
|
||||||
export type RolePolicies = {
|
export type RolePolicies = {
|
||||||
gtlAvailable: boolean;
|
gtlAvailable: boolean;
|
||||||
|
@ -78,14 +86,17 @@ export const DEFAULT_POLICIES: RolePolicies = {
|
||||||
};
|
};
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class RoleService implements OnApplicationShutdown {
|
export class RoleService implements OnApplicationShutdown, OnModuleInit {
|
||||||
private rolesCache: MemorySingleCache<MiRole[]>;
|
private rolesCache: MemorySingleCache<MiRole[]>;
|
||||||
private roleAssignmentByUserIdCache: MemoryKVCache<MiRoleAssignment[]>;
|
private roleAssignmentByUserIdCache: MemoryKVCache<MiRoleAssignment[]>;
|
||||||
|
private notificationService: NotificationService;
|
||||||
|
|
||||||
public static AlreadyAssignedError = class extends Error {};
|
public static AlreadyAssignedError = class extends Error {};
|
||||||
public static NotAssignedError = class extends Error {};
|
public static NotAssignedError = class extends Error {};
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
|
private moduleRef: ModuleRef,
|
||||||
|
|
||||||
@Inject(DI.redis)
|
@Inject(DI.redis)
|
||||||
private redisClient: Redis.Redis,
|
private redisClient: Redis.Redis,
|
||||||
|
|
||||||
|
@ -120,6 +131,10 @@ export class RoleService implements OnApplicationShutdown {
|
||||||
this.redisForSub.on('message', this.onMessage);
|
this.redisForSub.on('message', this.onMessage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async onModuleInit() {
|
||||||
|
this.notificationService = this.moduleRef.get(NotificationService.name);
|
||||||
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
private async onMessage(_: string, data: string): Promise<void> {
|
private async onMessage(_: string, data: string): Promise<void> {
|
||||||
const obj = JSON.parse(data);
|
const obj = JSON.parse(data);
|
||||||
|
@ -427,6 +442,12 @@ export class RoleService implements OnApplicationShutdown {
|
||||||
|
|
||||||
this.globalEventService.publishInternalEvent('userRoleAssigned', created);
|
this.globalEventService.publishInternalEvent('userRoleAssigned', created);
|
||||||
|
|
||||||
|
if (role.isPublic) {
|
||||||
|
this.notificationService.createNotification(userId, 'roleAssigned', {
|
||||||
|
roleId: roleId,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
if (moderator) {
|
if (moderator) {
|
||||||
const user = await this.usersRepository.findOneByOrFail({ id: userId });
|
const user = await this.usersRepository.findOneByOrFail({ id: userId });
|
||||||
this.moderationLogService.log(moderator, 'assignRole', {
|
this.moderationLogService.log(moderator, 'assignRole', {
|
||||||
|
|
|
@ -10,15 +10,15 @@ import type { MiUser } from '@/models/User.js';
|
||||||
import type { MiUserList } from '@/models/UserList.js';
|
import type { MiUserList } from '@/models/UserList.js';
|
||||||
import type { MiUserListMembership } from '@/models/UserListMembership.js';
|
import type { MiUserListMembership } from '@/models/UserListMembership.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
|
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
import { UserEntityService } from '@/core/entities/UserEntityService.js';
|
||||||
import { ProxyAccountService } from '@/core/ProxyAccountService.js';
|
import { ProxyAccountService } from '@/core/ProxyAccountService.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { RoleService } from '@/core/RoleService.js';
|
|
||||||
import { QueueService } from '@/core/QueueService.js';
|
import { QueueService } from '@/core/QueueService.js';
|
||||||
import { RedisKVCache } from '@/misc/cache.js';
|
import { RedisKVCache } from '@/misc/cache.js';
|
||||||
import type { GlobalEvents } from '@/core/GlobalEventService.js';
|
import { RoleService } from '@/core/RoleService.js';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class UserListService implements OnApplicationShutdown {
|
export class UserListService implements OnApplicationShutdown {
|
||||||
|
|
|
@ -15,8 +15,8 @@ import type { Packed } from '@/misc/json-schema.js';
|
||||||
import { bindThis } from '@/decorators.js';
|
import { bindThis } from '@/decorators.js';
|
||||||
import { isNotNull } from '@/misc/is-not-null.js';
|
import { isNotNull } from '@/misc/is-not-null.js';
|
||||||
import { FilterUnionByProperty, notificationTypes } from '@/types.js';
|
import { FilterUnionByProperty, notificationTypes } from '@/types.js';
|
||||||
|
import { RoleEntityService } from './RoleEntityService.js';
|
||||||
import type { OnModuleInit } from '@nestjs/common';
|
import type { OnModuleInit } from '@nestjs/common';
|
||||||
import type { CustomEmojiService } from '../CustomEmojiService.js';
|
|
||||||
import type { UserEntityService } from './UserEntityService.js';
|
import type { UserEntityService } from './UserEntityService.js';
|
||||||
import type { NoteEntityService } from './NoteEntityService.js';
|
import type { NoteEntityService } from './NoteEntityService.js';
|
||||||
|
|
||||||
|
@ -27,7 +27,7 @@ const NOTE_REQUIRED_GROUPED_NOTIFICATION_TYPES = new Set(['note', 'mention', 're
|
||||||
export class NotificationEntityService implements OnModuleInit {
|
export class NotificationEntityService implements OnModuleInit {
|
||||||
private userEntityService: UserEntityService;
|
private userEntityService: UserEntityService;
|
||||||
private noteEntityService: NoteEntityService;
|
private noteEntityService: NoteEntityService;
|
||||||
private customEmojiService: CustomEmojiService;
|
private roleEntityService: RoleEntityService;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private moduleRef: ModuleRef,
|
private moduleRef: ModuleRef,
|
||||||
|
@ -43,14 +43,13 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
|
|
||||||
//private userEntityService: UserEntityService,
|
//private userEntityService: UserEntityService,
|
||||||
//private noteEntityService: NoteEntityService,
|
//private noteEntityService: NoteEntityService,
|
||||||
//private customEmojiService: CustomEmojiService,
|
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
onModuleInit() {
|
onModuleInit() {
|
||||||
this.userEntityService = this.moduleRef.get('UserEntityService');
|
this.userEntityService = this.moduleRef.get('UserEntityService');
|
||||||
this.noteEntityService = this.moduleRef.get('NoteEntityService');
|
this.noteEntityService = this.moduleRef.get('NoteEntityService');
|
||||||
this.customEmojiService = this.moduleRef.get('CustomEmojiService');
|
this.roleEntityService = this.moduleRef.get('RoleEntityService');
|
||||||
}
|
}
|
||||||
|
|
||||||
@bindThis
|
@bindThis
|
||||||
|
@ -81,6 +80,7 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
detail: false,
|
detail: false,
|
||||||
})
|
})
|
||||||
) : undefined;
|
) : undefined;
|
||||||
|
const role = notification.type === 'roleAssigned' ? await this.roleEntityService.pack(notification.roleId) : undefined;
|
||||||
|
|
||||||
return await awaitAll({
|
return await awaitAll({
|
||||||
id: notification.id,
|
id: notification.id,
|
||||||
|
@ -92,6 +92,9 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
...(notification.type === 'reaction' ? {
|
...(notification.type === 'reaction' ? {
|
||||||
reaction: notification.reaction,
|
reaction: notification.reaction,
|
||||||
} : {}),
|
} : {}),
|
||||||
|
...(notification.type === 'roleAssigned' ? {
|
||||||
|
role: role,
|
||||||
|
} : {}),
|
||||||
...(notification.type === 'achievementEarned' ? {
|
...(notification.type === 'achievementEarned' ? {
|
||||||
achievement: notification.achievement,
|
achievement: notification.achievement,
|
||||||
} : {}),
|
} : {}),
|
||||||
|
@ -216,6 +219,8 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const role = notification.type === 'roleAssigned' ? await this.roleEntityService.pack(notification.roleId) : undefined;
|
||||||
|
|
||||||
return await awaitAll({
|
return await awaitAll({
|
||||||
id: notification.id,
|
id: notification.id,
|
||||||
createdAt: new Date(notification.createdAt).toISOString(),
|
createdAt: new Date(notification.createdAt).toISOString(),
|
||||||
|
@ -226,6 +231,9 @@ export class NotificationEntityService implements OnModuleInit {
|
||||||
...(notification.type === 'reaction' ? {
|
...(notification.type === 'reaction' ? {
|
||||||
reaction: notification.reaction,
|
reaction: notification.reaction,
|
||||||
} : {}),
|
} : {}),
|
||||||
|
...(notification.type === 'roleAssigned' ? {
|
||||||
|
role: role,
|
||||||
|
} : {}),
|
||||||
...(notification.type === 'achievementEarned' ? {
|
...(notification.type === 'achievementEarned' ? {
|
||||||
achievement: notification.achievement,
|
achievement: notification.achievement,
|
||||||
} : {}),
|
} : {}),
|
||||||
|
|
|
@ -38,6 +38,7 @@ import { packedFlashSchema } from '@/models/json-schema/flash.js';
|
||||||
import { packedAnnouncementSchema } from '@/models/json-schema/announcement.js';
|
import { packedAnnouncementSchema } from '@/models/json-schema/announcement.js';
|
||||||
import { packedSigninSchema } from '@/models/json-schema/signin.js';
|
import { packedSigninSchema } from '@/models/json-schema/signin.js';
|
||||||
import { packedRoleLiteSchema, packedRoleSchema } from '@/models/json-schema/role.js';
|
import { packedRoleLiteSchema, packedRoleSchema } from '@/models/json-schema/role.js';
|
||||||
|
import { packedAdSchema } from '@/models/json-schema/ad.js';
|
||||||
|
|
||||||
export const refs = {
|
export const refs = {
|
||||||
UserLite: packedUserLiteSchema,
|
UserLite: packedUserLiteSchema,
|
||||||
|
@ -49,6 +50,7 @@ export const refs = {
|
||||||
User: packedUserSchema,
|
User: packedUserSchema,
|
||||||
|
|
||||||
UserList: packedUserListSchema,
|
UserList: packedUserListSchema,
|
||||||
|
Ad: packedAdSchema,
|
||||||
Announcement: packedAnnouncementSchema,
|
Announcement: packedAnnouncementSchema,
|
||||||
App: packedAppSchema,
|
App: packedAppSchema,
|
||||||
Note: packedNoteSchema,
|
Note: packedNoteSchema,
|
||||||
|
|
|
@ -3,11 +3,10 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { notificationTypes } from '@/types.js';
|
|
||||||
import { MiUser } from './User.js';
|
import { MiUser } from './User.js';
|
||||||
import { MiNote } from './Note.js';
|
import { MiNote } from './Note.js';
|
||||||
import { MiFollowRequest } from './FollowRequest.js';
|
|
||||||
import { MiAccessToken } from './AccessToken.js';
|
import { MiAccessToken } from './AccessToken.js';
|
||||||
|
import { MiRole } from './Role.js';
|
||||||
|
|
||||||
export type MiNotification = {
|
export type MiNotification = {
|
||||||
type: 'note';
|
type: 'note';
|
||||||
|
@ -68,6 +67,11 @@ export type MiNotification = {
|
||||||
id: string;
|
id: string;
|
||||||
createdAt: string;
|
createdAt: string;
|
||||||
notifierId: MiUser['id'];
|
notifierId: MiUser['id'];
|
||||||
|
} | {
|
||||||
|
type: 'roleAssigned';
|
||||||
|
id: string;
|
||||||
|
createdAt: string;
|
||||||
|
roleId: MiRole['id'];
|
||||||
} | {
|
} | {
|
||||||
type: 'achievementEarned';
|
type: 'achievementEarned';
|
||||||
id: string;
|
id: string;
|
||||||
|
|
|
@ -0,0 +1,64 @@
|
||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: syuilo and other misskey contributors
|
||||||
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const packedAdSchema = {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
format: 'id',
|
||||||
|
example: 'xxxxxxxxxx',
|
||||||
|
},
|
||||||
|
expiresAt: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
startsAt: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
place: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
priority: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
ratio: {
|
||||||
|
type: 'number',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
url: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
imageUrl: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
memo: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
dayOfWeek: {
|
||||||
|
type: 'integer',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
} as const;
|
|
@ -554,9 +554,7 @@ export const packedMeDetailedOnlySchema = {
|
||||||
mention: notificationRecieveConfig,
|
mention: notificationRecieveConfig,
|
||||||
reaction: notificationRecieveConfig,
|
reaction: notificationRecieveConfig,
|
||||||
pollEnded: notificationRecieveConfig,
|
pollEnded: notificationRecieveConfig,
|
||||||
achievementEarned: notificationRecieveConfig,
|
|
||||||
receiveFollowRequest: notificationRecieveConfig,
|
receiveFollowRequest: notificationRecieveConfig,
|
||||||
followRequestAccepted: notificationRecieveConfig,
|
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
emailNotificationTypes: {
|
emailNotificationTypes: {
|
||||||
|
|
|
@ -153,8 +153,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.systemQueueWorker
|
this.systemQueueWorker
|
||||||
.on('active', (job) => systemLogger.debug(`active id=${job.id}`))
|
.on('active', (job) => systemLogger.debug(`active id=${job.id}`))
|
||||||
.on('completed', (job, result) => systemLogger.debug(`completed(${result}) id=${job.id}`))
|
.on('completed', (job, result) => systemLogger.debug(`completed(${result}) id=${job.id}`))
|
||||||
.on('failed', (job, err) => systemLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => systemLogger.warn(`failed(${err.stack}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => systemLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => systemLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => systemLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => systemLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -191,8 +191,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.dbQueueWorker
|
this.dbQueueWorker
|
||||||
.on('active', (job) => dbLogger.debug(`active id=${job.id}`))
|
.on('active', (job) => dbLogger.debug(`active id=${job.id}`))
|
||||||
.on('completed', (job, result) => dbLogger.debug(`completed(${result}) id=${job.id}`))
|
.on('completed', (job, result) => dbLogger.debug(`completed(${result}) id=${job.id}`))
|
||||||
.on('failed', (job, err) => dbLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => dbLogger.warn(`failed(${err.stack}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => dbLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => dbLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => dbLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => dbLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -215,8 +215,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.deliverQueueWorker
|
this.deliverQueueWorker
|
||||||
.on('active', (job) => deliverLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`))
|
.on('active', (job) => deliverLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`))
|
||||||
.on('completed', (job, result) => deliverLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
|
.on('completed', (job, result) => deliverLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
|
||||||
.on('failed', (job, err) => deliverLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`))
|
.on('failed', (job, err) => deliverLogger.warn(`failed(${err.stack}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`))
|
||||||
.on('error', (err: Error) => deliverLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => deliverLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => deliverLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => deliverLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -239,8 +239,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.inboxQueueWorker
|
this.inboxQueueWorker
|
||||||
.on('active', (job) => inboxLogger.debug(`active ${getJobInfo(job, true)}`))
|
.on('active', (job) => inboxLogger.debug(`active ${getJobInfo(job, true)}`))
|
||||||
.on('completed', (job, result) => inboxLogger.debug(`completed(${result}) ${getJobInfo(job, true)}`))
|
.on('completed', (job, result) => inboxLogger.debug(`completed(${result}) ${getJobInfo(job, true)}`))
|
||||||
.on('failed', (job, err) => inboxLogger.warn(`failed(${err}) ${getJobInfo(job)} activity=${job ? (job.data.activity ? job.data.activity.id : 'none') : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => inboxLogger.warn(`failed(${err.stack}) ${getJobInfo(job)} activity=${job ? (job.data.activity ? job.data.activity.id : 'none') : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => inboxLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => inboxLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => inboxLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => inboxLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -263,8 +263,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.webhookDeliverQueueWorker
|
this.webhookDeliverQueueWorker
|
||||||
.on('active', (job) => webhookLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`))
|
.on('active', (job) => webhookLogger.debug(`active ${getJobInfo(job, true)} to=${job.data.to}`))
|
||||||
.on('completed', (job, result) => webhookLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
|
.on('completed', (job, result) => webhookLogger.debug(`completed(${result}) ${getJobInfo(job, true)} to=${job.data.to}`))
|
||||||
.on('failed', (job, err) => webhookLogger.warn(`failed(${err}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`))
|
.on('failed', (job, err) => webhookLogger.warn(`failed(${err.stack}) ${getJobInfo(job)} to=${job ? job.data.to : '-'}`))
|
||||||
.on('error', (err: Error) => webhookLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => webhookLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => webhookLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => webhookLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -292,8 +292,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.relationshipQueueWorker
|
this.relationshipQueueWorker
|
||||||
.on('active', (job) => relationshipLogger.debug(`active id=${job.id}`))
|
.on('active', (job) => relationshipLogger.debug(`active id=${job.id}`))
|
||||||
.on('completed', (job, result) => relationshipLogger.debug(`completed(${result}) id=${job.id}`))
|
.on('completed', (job, result) => relationshipLogger.debug(`completed(${result}) id=${job.id}`))
|
||||||
.on('failed', (job, err) => relationshipLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => relationshipLogger.warn(`failed(${err.stack}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => relationshipLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => relationshipLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => relationshipLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => relationshipLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
@ -315,8 +315,8 @@ export class QueueProcessorService implements OnApplicationShutdown {
|
||||||
this.objectStorageQueueWorker
|
this.objectStorageQueueWorker
|
||||||
.on('active', (job) => objectStorageLogger.debug(`active id=${job.id}`))
|
.on('active', (job) => objectStorageLogger.debug(`active id=${job.id}`))
|
||||||
.on('completed', (job, result) => objectStorageLogger.debug(`completed(${result}) id=${job.id}`))
|
.on('completed', (job, result) => objectStorageLogger.debug(`completed(${result}) id=${job.id}`))
|
||||||
.on('failed', (job, err) => objectStorageLogger.warn(`failed(${err}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
.on('failed', (job, err) => objectStorageLogger.warn(`failed(${err.stack}) id=${job ? job.id : '-'}`, { job, e: renderError(err) }))
|
||||||
.on('error', (err: Error) => objectStorageLogger.error(`error ${err}`, { e: renderError(err) }))
|
.on('error', (err: Error) => objectStorageLogger.error(`error ${err.stack}`, { e: renderError(err) }))
|
||||||
.on('stalled', (jobId) => objectStorageLogger.warn(`stalled id=${jobId}`));
|
.on('stalled', (jobId) => objectStorageLogger.warn(`stalled id=${jobId}`));
|
||||||
//#endregion
|
//#endregion
|
||||||
|
|
||||||
|
|
|
@ -25,6 +25,11 @@ export const meta = {
|
||||||
id: 'cb865949-8af5-4062-a88c-ef55e8786d1d',
|
id: 'cb865949-8af5-4062-a88c-ef55e8786d1d',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
ref: 'User',
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -17,6 +17,12 @@ export const meta = {
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
ref: 'Ad',
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
@ -63,7 +69,18 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
ad: ad,
|
ad: ad,
|
||||||
});
|
});
|
||||||
|
|
||||||
return ad;
|
return {
|
||||||
|
id: ad.id,
|
||||||
|
expiresAt: ad.expiresAt.toISOString(),
|
||||||
|
startsAt: ad.startsAt.toISOString(),
|
||||||
|
dayOfWeek: ad.dayOfWeek,
|
||||||
|
url: ad.url,
|
||||||
|
imageUrl: ad.imageUrl,
|
||||||
|
priority: ad.priority,
|
||||||
|
ratio: ad.ratio,
|
||||||
|
place: ad.place,
|
||||||
|
memo: ad.memo,
|
||||||
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,6 +16,17 @@ export const meta = {
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
ref: 'Ad',
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
@ -46,7 +57,18 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
}
|
}
|
||||||
const ads = await query.limit(ps.limit).getMany();
|
const ads = await query.limit(ps.limit).getMany();
|
||||||
|
|
||||||
return ads;
|
return ads.map(ad => ({
|
||||||
|
id: ad.id,
|
||||||
|
expiresAt: ad.expiresAt.toISOString(),
|
||||||
|
startsAt: ad.startsAt.toISOString(),
|
||||||
|
dayOfWeek: ad.dayOfWeek,
|
||||||
|
url: ad.url,
|
||||||
|
imageUrl: ad.imageUrl,
|
||||||
|
memo: ad.memo,
|
||||||
|
place: ad.place,
|
||||||
|
priority: ad.priority,
|
||||||
|
ratio: ad.ratio,
|
||||||
|
}));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,8 @@ export const meta = {
|
||||||
id: 'f7a3462c-4e6e-4069-8421-b9bd4f4c3975',
|
id: 'f7a3462c-4e6e-4069-8421-b9bd4f4c3975',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
ref: 'EmojiDetailed',
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -15,6 +15,16 @@ export const meta = {
|
||||||
kind: 'read:admin',
|
kind: 'read:admin',
|
||||||
|
|
||||||
tags: ['admin'],
|
tags: ['admin'],
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
tablename: { type: 'string' },
|
||||||
|
indexname: { type: 'string' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -16,6 +16,25 @@ export const meta = {
|
||||||
|
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
requireModerator: true,
|
requireModerator: true,
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
properties: {
|
||||||
|
ip: { type: 'string' },
|
||||||
|
createdAt: {
|
||||||
|
type: 'string',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -28,6 +28,20 @@ export const meta = {
|
||||||
id: '224eff5e-2488-4b18-b3e7-f50d94421648',
|
id: '224eff5e-2488-4b18-b3e7-f50d94421648',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: { type: 'string', format: 'misskey:id' },
|
||||||
|
createdAt: { type: 'string', format: 'date-time' },
|
||||||
|
user: { ref: 'UserDetailed' },
|
||||||
|
expiresAt: { type: 'string', format: 'date-time', nullable: true },
|
||||||
|
},
|
||||||
|
required: ['id', 'createdAt', 'user'],
|
||||||
|
},
|
||||||
|
}
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
@ -80,7 +94,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
id: assign.id,
|
id: assign.id,
|
||||||
createdAt: this.idService.parse(assign.id).date.toISOString(),
|
createdAt: this.idService.parse(assign.id).date.toISOString(),
|
||||||
user: await this.userEntityService.pack(assign.user!, me, { detail: true }),
|
user: await this.userEntityService.pack(assign.user!, me, { detail: true }),
|
||||||
expiresAt: assign.expiresAt,
|
expiresAt: assign.expiresAt?.toISOString() ?? null,
|
||||||
})));
|
})));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,23 @@ export const meta = {
|
||||||
requireCredential: false,
|
requireCredential: false,
|
||||||
|
|
||||||
tags: ['meta'],
|
tags: ['meta'],
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: true,
|
||||||
|
properties: {
|
||||||
|
params: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
name: { type: 'string' },
|
||||||
|
type: { type: 'string' },
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -18,6 +18,92 @@ export const meta = {
|
||||||
|
|
||||||
allowGet: true,
|
allowGet: true,
|
||||||
cacheSec: 60 * 60,
|
cacheSec: 60 * 60,
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
properties: {
|
||||||
|
topSubInstances: {
|
||||||
|
type: 'array',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
items: {
|
||||||
|
properties: {
|
||||||
|
id: { type: 'string' },
|
||||||
|
firstRetrievedAt: { type: 'string' },
|
||||||
|
host: { type: 'string' },
|
||||||
|
usersCount: { type: 'number' },
|
||||||
|
notesCount: { type: 'number' },
|
||||||
|
followingCount: { type: 'number' },
|
||||||
|
followersCount: { type: 'number' },
|
||||||
|
isNotResponding: { type: 'boolean' },
|
||||||
|
isSuspended: { type: 'boolean' },
|
||||||
|
isBlocked: { type: 'boolean' },
|
||||||
|
softwareName: { type: 'string' },
|
||||||
|
softwareVersion: { type: 'string' },
|
||||||
|
openRegistrations: { type: 'boolean' },
|
||||||
|
name: { type: 'string' },
|
||||||
|
description: { type: 'string' },
|
||||||
|
maintainerName: { type: 'string' },
|
||||||
|
maintainerEmail: { type: 'string' },
|
||||||
|
isSilenced: { type: 'boolean' },
|
||||||
|
iconUrl: { type: 'string' },
|
||||||
|
faviconUrl: { type: 'string' },
|
||||||
|
themeColor: { type: 'string' },
|
||||||
|
infoUpdatedAt: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
latestRequestReceivedAt: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
otherFollowersCount: { type: 'number' },
|
||||||
|
topPubInstances: {
|
||||||
|
type: 'array',
|
||||||
|
optional: false,
|
||||||
|
nullable: false,
|
||||||
|
items: {
|
||||||
|
properties: {
|
||||||
|
id: { type: 'string' },
|
||||||
|
firstRetrievedAt: { type: 'string' },
|
||||||
|
host: { type: 'string' },
|
||||||
|
usersCount: { type: 'number' },
|
||||||
|
notesCount: { type: 'number' },
|
||||||
|
followingCount: { type: 'number' },
|
||||||
|
followersCount: { type: 'number' },
|
||||||
|
isNotResponding: { type: 'boolean' },
|
||||||
|
isSuspended: { type: 'boolean' },
|
||||||
|
isBlocked: { type: 'boolean' },
|
||||||
|
softwareName: { type: 'string' },
|
||||||
|
softwareVersion: { type: 'string' },
|
||||||
|
openRegistrations: { type: 'boolean' },
|
||||||
|
name: { type: 'string' },
|
||||||
|
description: { type: 'string' },
|
||||||
|
maintainerName: { type: 'string' },
|
||||||
|
maintainerEmail: { type: 'string' },
|
||||||
|
isSilenced: { type: 'boolean' },
|
||||||
|
iconUrl: { type: 'string' },
|
||||||
|
faviconUrl: { type: 'string' },
|
||||||
|
themeColor: { type: 'string' },
|
||||||
|
infoUpdatedAt: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
latestRequestReceivedAt: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
otherFollowingCount: { type: 'number' },
|
||||||
|
},
|
||||||
|
}
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -32,6 +32,18 @@ export const meta = {
|
||||||
id: '693ba8ba-b486-40df-a174-72f8279b56a4',
|
id: '693ba8ba-b486-40df-a174-72f8279b56a4',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
type: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
data: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -16,6 +16,18 @@ export const meta = {
|
||||||
requireCredential: false,
|
requireCredential: false,
|
||||||
allowGet: true,
|
allowGet: true,
|
||||||
cacheSec: 60 * 3,
|
cacheSec: 60 * 3,
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
items: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -27,6 +27,12 @@ export const meta = {
|
||||||
|
|
||||||
errors: {
|
errors: {
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
ref: 'Flash',
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -16,6 +16,16 @@ export const meta = {
|
||||||
requireCredential: false,
|
requireCredential: false,
|
||||||
allowGet: true,
|
allowGet: true,
|
||||||
cacheSec: 60 * 1,
|
cacheSec: 60 * 1,
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
properties: {
|
||||||
|
count: {
|
||||||
|
type: 'number',
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -32,6 +32,16 @@ export const meta = {
|
||||||
id: '798d6847-b1ed-4f9c-b1f9-163c42655995',
|
id: '798d6847-b1ed-4f9c-b1f9-163c42655995',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: false,
|
||||||
|
optional: false,
|
||||||
|
properties: {
|
||||||
|
id: { type: 'string' },
|
||||||
|
name: { type: 'string' },
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -36,6 +36,140 @@ export const meta = {
|
||||||
id: 'bf32b864-449b-47b8-974e-f9a5468546f1',
|
id: 'bf32b864-449b-47b8-974e-f9a5468546f1',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: false,
|
||||||
|
optional: false,
|
||||||
|
properties: {
|
||||||
|
rp: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
displayName: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
challenge: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
pubKeyCredParams: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
type: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
alg: {
|
||||||
|
type: 'number',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
timeout: {
|
||||||
|
type: 'number',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
excludeCredentials: {
|
||||||
|
type: 'array',
|
||||||
|
nullable: true,
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
type: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
transports: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'string',
|
||||||
|
enum: [
|
||||||
|
"ble",
|
||||||
|
"cable",
|
||||||
|
"hybrid",
|
||||||
|
"internal",
|
||||||
|
"nfc",
|
||||||
|
"smart-card",
|
||||||
|
"usb",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
authenticatorSelection: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: true,
|
||||||
|
properties: {
|
||||||
|
authenticatorAttachment: {
|
||||||
|
type: 'string',
|
||||||
|
enum: [
|
||||||
|
"cross-platform",
|
||||||
|
"platform",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
requireResidentKey: {
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
userVerification: {
|
||||||
|
type: 'string',
|
||||||
|
enum: [
|
||||||
|
"discouraged",
|
||||||
|
"preferred",
|
||||||
|
"required",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
attestation: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: true,
|
||||||
|
enum: [
|
||||||
|
"direct",
|
||||||
|
"enterprise",
|
||||||
|
"indirect",
|
||||||
|
"none",
|
||||||
|
],
|
||||||
|
},
|
||||||
|
extensions: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: true,
|
||||||
|
properties: {
|
||||||
|
appid: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
credProps: {
|
||||||
|
type: 'boolean',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
hmacCreateSecret: {
|
||||||
|
type: 'boolean',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -26,6 +26,19 @@ export const meta = {
|
||||||
id: '78d6c839-20c9-4c66-b90a-fc0542168b48',
|
id: '78d6c839-20c9-4c66-b90a-fc0542168b48',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: false,
|
||||||
|
optional: false,
|
||||||
|
properties: {
|
||||||
|
qr: { type: 'string' },
|
||||||
|
url: { type: 'string' },
|
||||||
|
secret: { type: 'string' },
|
||||||
|
label: { type: 'string' },
|
||||||
|
issuer: { type: 'string' },
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -13,6 +13,37 @@ export const meta = {
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
|
|
||||||
secure: true,
|
secure: true,
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
lastUsedAt: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
permission: {
|
||||||
|
type: 'array',
|
||||||
|
uniqueItems: true,
|
||||||
|
items: {
|
||||||
|
type: 'string'
|
||||||
|
},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
@ -50,7 +81,7 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
id: token.id,
|
id: token.id,
|
||||||
name: token.name ?? token.app?.name,
|
name: token.name ?? token.app?.name,
|
||||||
createdAt: this.idService.parse(token.id).date.toISOString(),
|
createdAt: this.idService.parse(token.id).date.toISOString(),
|
||||||
lastUsedAt: token.lastUsedAt,
|
lastUsedAt: token.lastUsedAt?.toISOString(),
|
||||||
permission: token.permission,
|
permission: token.permission,
|
||||||
})));
|
})));
|
||||||
});
|
});
|
||||||
|
|
|
@ -14,6 +14,36 @@ export const meta = {
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
|
|
||||||
secure: true,
|
secure: true,
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id',
|
||||||
|
},
|
||||||
|
name: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
callbackUrl: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
permission: {
|
||||||
|
type: 'array',
|
||||||
|
uniqueItems: true,
|
||||||
|
items: {
|
||||||
|
type: 'string'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
isAuthorized: {
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -64,6 +64,10 @@ export const meta = {
|
||||||
id: 'b234a14e-9ebe-4581-8000-074b3c215962',
|
id: 'b234a14e-9ebe-4581-8000-074b3c215962',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -9,6 +9,10 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -18,6 +18,10 @@ export const meta = {
|
||||||
id: '97a1e8e7-c0f7-47d2-957a-92e61256e01a',
|
id: '97a1e8e7-c0f7-47d2-957a-92e61256e01a',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
}
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -18,6 +18,10 @@ export const meta = {
|
||||||
id: 'ac3ed68a-62f0-422b-a7bc-d5e09e8f6a6a',
|
id: 'ac3ed68a-62f0-422b-a7bc-d5e09e8f6a6a',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
}
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -9,6 +9,10 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -10,6 +10,28 @@ import { RegistryApiService } from '@/core/RegistryApiService.js';
|
||||||
export const meta = {
|
export const meta = {
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
secure: true,
|
secure: true,
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
scopes: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'string',
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
domain: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -40,6 +40,11 @@ export const meta = {
|
||||||
id: 'a2defefb-f220-8849-0af6-17f816099323',
|
id: 'a2defefb-f220-8849-0af6-17f816099323',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
ref: 'UserDetailed',
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -27,6 +27,33 @@ export const meta = {
|
||||||
id: '87a9bb19-111e-4e37-81d3-a3e7426453b0',
|
id: '87a9bb19-111e-4e37-81d3-a3e7426453b0',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id'
|
||||||
|
},
|
||||||
|
userId: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id',
|
||||||
|
},
|
||||||
|
name: { type: 'string' },
|
||||||
|
on: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'string',
|
||||||
|
enum: webhookEventTypes,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
url: { type: 'string' },
|
||||||
|
secret: { type: 'string' },
|
||||||
|
active: { type: 'boolean' },
|
||||||
|
latestSentAt: { type: 'string', format: 'date-time', nullable: true },
|
||||||
|
latestStatus: { type: 'integer', nullable: true },
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
@ -73,7 +100,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
|
|
||||||
this.globalEventService.publishInternalEvent('webhookCreated', webhook);
|
this.globalEventService.publishInternalEvent('webhookCreated', webhook);
|
||||||
|
|
||||||
return webhook;
|
return {
|
||||||
|
id: webhook.id,
|
||||||
|
userId: webhook.userId,
|
||||||
|
name: webhook.name,
|
||||||
|
on: webhook.on,
|
||||||
|
url: webhook.url,
|
||||||
|
secret: webhook.secret,
|
||||||
|
active: webhook.active,
|
||||||
|
latestSentAt: webhook.latestSentAt?.toISOString(),
|
||||||
|
latestStatus: webhook.latestStatus,
|
||||||
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
|
import { webhookEventTypes } from '@/models/Webhook.js';
|
||||||
import type { WebhooksRepository } from '@/models/_.js';
|
import type { WebhooksRepository } from '@/models/_.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
|
|
||||||
|
@ -14,6 +15,36 @@ export const meta = {
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
|
|
||||||
kind: 'read:account',
|
kind: 'read:account',
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id'
|
||||||
|
},
|
||||||
|
userId: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id',
|
||||||
|
},
|
||||||
|
name: { type: 'string' },
|
||||||
|
on: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'string',
|
||||||
|
enum: webhookEventTypes,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
url: { type: 'string' },
|
||||||
|
secret: { type: 'string' },
|
||||||
|
active: { type: 'boolean' },
|
||||||
|
latestSentAt: { type: 'string', format: 'date-time', nullable: true },
|
||||||
|
latestStatus: { type: 'integer', nullable: true },
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
@ -33,7 +64,19 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
userId: me.id,
|
userId: me.id,
|
||||||
});
|
});
|
||||||
|
|
||||||
return webhooks;
|
return webhooks.map(webhook => (
|
||||||
|
{
|
||||||
|
id: webhook.id,
|
||||||
|
userId: webhook.userId,
|
||||||
|
name: webhook.name,
|
||||||
|
on: webhook.on,
|
||||||
|
url: webhook.url,
|
||||||
|
secret: webhook.secret,
|
||||||
|
active: webhook.active,
|
||||||
|
latestSentAt: webhook.latestSentAt?.toISOString(),
|
||||||
|
latestStatus: webhook.latestStatus,
|
||||||
|
}
|
||||||
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
import { Inject, Injectable } from '@nestjs/common';
|
import { Inject, Injectable } from '@nestjs/common';
|
||||||
import { Endpoint } from '@/server/api/endpoint-base.js';
|
import { Endpoint } from '@/server/api/endpoint-base.js';
|
||||||
|
import { webhookEventTypes } from '@/models/Webhook.js';
|
||||||
import type { WebhooksRepository } from '@/models/_.js';
|
import type { WebhooksRepository } from '@/models/_.js';
|
||||||
import { DI } from '@/di-symbols.js';
|
import { DI } from '@/di-symbols.js';
|
||||||
import { ApiError } from '../../../error.js';
|
import { ApiError } from '../../../error.js';
|
||||||
|
@ -23,6 +24,33 @@ export const meta = {
|
||||||
id: '50f614d9-3047-4f7e-90d8-ad6b2d5fb098',
|
id: '50f614d9-3047-4f7e-90d8-ad6b2d5fb098',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id'
|
||||||
|
},
|
||||||
|
userId: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id',
|
||||||
|
},
|
||||||
|
name: { type: 'string' },
|
||||||
|
on: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'string',
|
||||||
|
enum: webhookEventTypes,
|
||||||
|
}
|
||||||
|
},
|
||||||
|
url: { type: 'string' },
|
||||||
|
secret: { type: 'string' },
|
||||||
|
active: { type: 'boolean' },
|
||||||
|
latestSentAt: { type: 'string', format: 'date-time', nullable: true },
|
||||||
|
latestStatus: { type: 'integer', nullable: true },
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
@ -49,7 +77,17 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
|
||||||
throw new ApiError(meta.errors.noSuchWebhook);
|
throw new ApiError(meta.errors.noSuchWebhook);
|
||||||
}
|
}
|
||||||
|
|
||||||
return webhook;
|
return {
|
||||||
|
id: webhook.id,
|
||||||
|
userId: webhook.userId,
|
||||||
|
name: webhook.name,
|
||||||
|
on: webhook.on,
|
||||||
|
url: webhook.url,
|
||||||
|
secret: webhook.secret,
|
||||||
|
active: webhook.active,
|
||||||
|
latestSentAt: webhook.latestSentAt?.toISOString(),
|
||||||
|
latestStatus: webhook.latestStatus,
|
||||||
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,25 @@ export const meta = {
|
||||||
id: '30aaaee3-4792-48dc-ab0d-cf501a575ac5',
|
id: '30aaaee3-4792-48dc-ab0d-cf501a575ac5',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: false,
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id'
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
type: 'object',
|
||||||
|
ref: 'User'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
required: ['id', 'user'],
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -15,6 +15,53 @@ export const meta = {
|
||||||
cacheSec: 60 * 1,
|
cacheSec: 60 * 1,
|
||||||
|
|
||||||
tags: ['meta'],
|
tags: ['meta'],
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
optional: false, nullable: false,
|
||||||
|
properties: {
|
||||||
|
machine: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
cpu: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: false,
|
||||||
|
properties: {
|
||||||
|
model: {
|
||||||
|
type: 'string',
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
cores: {
|
||||||
|
type: 'number',
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
mem: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
total: {
|
||||||
|
type: 'number',
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
fs: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: false,
|
||||||
|
properties: {
|
||||||
|
total: {
|
||||||
|
type: 'number',
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
used: {
|
||||||
|
type: 'number',
|
||||||
|
nullable: false,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -12,6 +12,30 @@ export const meta = {
|
||||||
description: 'Endpoint for testing input validation.',
|
description: 'Endpoint for testing input validation.',
|
||||||
|
|
||||||
requireCredential: false,
|
requireCredential: false,
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id'
|
||||||
|
},
|
||||||
|
required: {
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
string: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
default: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
nullableDefault: {
|
||||||
|
type: 'string',
|
||||||
|
default: 'hello',
|
||||||
|
nullable: true,
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -10,6 +10,21 @@ import { DI } from '@/di-symbols.js';
|
||||||
|
|
||||||
export const meta = {
|
export const meta = {
|
||||||
requireCredential: true,
|
requireCredential: true,
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
properties: {
|
||||||
|
name: {
|
||||||
|
type: 'string',
|
||||||
|
},
|
||||||
|
unlockedAt: {
|
||||||
|
type: 'number',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
}
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -25,6 +25,35 @@ export const meta = {
|
||||||
id: '7bc05c21-1d7a-41ae-88f1-66820f4dc686',
|
id: '7bc05c21-1d7a-41ae-88f1-66820f4dc686',
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
res: {
|
||||||
|
type: 'array',
|
||||||
|
items: {
|
||||||
|
type: 'object',
|
||||||
|
nullable: false,
|
||||||
|
properties: {
|
||||||
|
id: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id',
|
||||||
|
},
|
||||||
|
createdAt: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'date-time',
|
||||||
|
},
|
||||||
|
userId: {
|
||||||
|
type: 'string',
|
||||||
|
format: 'misskey:id',
|
||||||
|
},
|
||||||
|
user: {
|
||||||
|
type: 'object',
|
||||||
|
ref: 'User',
|
||||||
|
},
|
||||||
|
withReplies: {
|
||||||
|
type: 'boolean',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
} as const;
|
} as const;
|
||||||
|
|
||||||
export const paramDef = {
|
export const paramDef = {
|
||||||
|
|
|
@ -14,11 +14,26 @@
|
||||||
* pollEnded - 自分のアンケートもしくは自分が投票したアンケートが終了した
|
* pollEnded - 自分のアンケートもしくは自分が投票したアンケートが終了した
|
||||||
* receiveFollowRequest - フォローリクエストされた
|
* receiveFollowRequest - フォローリクエストされた
|
||||||
* followRequestAccepted - 自分の送ったフォローリクエストが承認された
|
* followRequestAccepted - 自分の送ったフォローリクエストが承認された
|
||||||
|
* roleAssigned - ロールが付与された
|
||||||
* achievementEarned - 実績を獲得
|
* achievementEarned - 実績を獲得
|
||||||
* app - アプリ通知
|
* app - アプリ通知
|
||||||
* test - テスト通知(サーバー側)
|
* test - テスト通知(サーバー側)
|
||||||
*/
|
*/
|
||||||
export const notificationTypes = ['note', 'follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollEnded', 'receiveFollowRequest', 'followRequestAccepted', 'achievementEarned', 'app', 'test'] as const;
|
export const notificationTypes = [
|
||||||
|
'note',
|
||||||
|
'follow',
|
||||||
|
'mention',
|
||||||
|
'reply',
|
||||||
|
'renote',
|
||||||
|
'quote',
|
||||||
|
'reaction',
|
||||||
|
'pollEnded',
|
||||||
|
'receiveFollowRequest',
|
||||||
|
'followRequestAccepted',
|
||||||
|
'roleAssigned',
|
||||||
|
'achievementEarned',
|
||||||
|
'app',
|
||||||
|
'test'] as const;
|
||||||
export const obsoleteNotificationTypes = ['pollVote', 'groupInvited'] as const;
|
export const obsoleteNotificationTypes = ['pollVote', 'groupInvited'] as const;
|
||||||
|
|
||||||
export const noteVisibilities = ['public', 'home', 'followers', 'specified'] as const;
|
export const noteVisibilities = ['public', 'home', 'followers', 'specified'] as const;
|
||||||
|
|
|
@ -7,7 +7,7 @@ services:
|
||||||
- "127.0.0.1:56312:6379"
|
- "127.0.0.1:56312:6379"
|
||||||
|
|
||||||
dbtest:
|
dbtest:
|
||||||
image: postgres:13
|
image: postgres:15
|
||||||
ports:
|
ports:
|
||||||
- "127.0.0.1:54312:5432"
|
- "127.0.0.1:54312:5432"
|
||||||
environment:
|
environment:
|
||||||
|
|
|
@ -19,6 +19,7 @@ import { CacheService } from '@/core/CacheService.js';
|
||||||
import { IdService } from '@/core/IdService.js';
|
import { IdService } from '@/core/IdService.js';
|
||||||
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
import { GlobalEventService } from '@/core/GlobalEventService.js';
|
||||||
import { secureRndstr } from '@/misc/secure-rndstr.js';
|
import { secureRndstr } from '@/misc/secure-rndstr.js';
|
||||||
|
import { NotificationService } from '@/core/NotificationService.js';
|
||||||
import { sleep } from '../utils.js';
|
import { sleep } from '../utils.js';
|
||||||
import type { TestingModule } from '@nestjs/testing';
|
import type { TestingModule } from '@nestjs/testing';
|
||||||
import type { MockFunctionMetadata } from 'jest-mock';
|
import type { MockFunctionMetadata } from 'jest-mock';
|
||||||
|
@ -32,6 +33,7 @@ describe('RoleService', () => {
|
||||||
let rolesRepository: RolesRepository;
|
let rolesRepository: RolesRepository;
|
||||||
let roleAssignmentsRepository: RoleAssignmentsRepository;
|
let roleAssignmentsRepository: RoleAssignmentsRepository;
|
||||||
let metaService: jest.Mocked<MetaService>;
|
let metaService: jest.Mocked<MetaService>;
|
||||||
|
let notificationService: jest.Mocked<NotificationService>;
|
||||||
let clock: lolex.InstalledClock;
|
let clock: lolex.InstalledClock;
|
||||||
|
|
||||||
function createUser(data: Partial<MiUser> = {}) {
|
function createUser(data: Partial<MiUser> = {}) {
|
||||||
|
@ -76,6 +78,8 @@ describe('RoleService', () => {
|
||||||
.useMocker((token) => {
|
.useMocker((token) => {
|
||||||
if (token === MetaService) {
|
if (token === MetaService) {
|
||||||
return { fetch: jest.fn() };
|
return { fetch: jest.fn() };
|
||||||
|
} else if (token === NotificationService) {
|
||||||
|
return { createNotification: jest.fn() };
|
||||||
}
|
}
|
||||||
if (typeof token === 'function') {
|
if (typeof token === 'function') {
|
||||||
const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
|
const mockMetadata = moduleMocker.getMetadata(token) as MockFunctionMetadata<any, any>;
|
||||||
|
@ -93,6 +97,7 @@ describe('RoleService', () => {
|
||||||
roleAssignmentsRepository = app.get<RoleAssignmentsRepository>(DI.roleAssignmentsRepository);
|
roleAssignmentsRepository = app.get<RoleAssignmentsRepository>(DI.roleAssignmentsRepository);
|
||||||
|
|
||||||
metaService = app.get<MetaService>(MetaService) as jest.Mocked<MetaService>;
|
metaService = app.get<MetaService>(MetaService) as jest.Mocked<MetaService>;
|
||||||
|
notificationService = app.get<NotificationService>(NotificationService) as jest.Mocked<NotificationService>;
|
||||||
});
|
});
|
||||||
|
|
||||||
afterEach(async () => {
|
afterEach(async () => {
|
||||||
|
@ -273,4 +278,53 @@ describe('RoleService', () => {
|
||||||
expect(resultAfter25hAgain.canManageCustomEmojis).toBe(true);
|
expect(resultAfter25hAgain.canManageCustomEmojis).toBe(true);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('assign', () => {
|
||||||
|
test('公開ロールの場合は通知される', async () => {
|
||||||
|
const user = await createUser();
|
||||||
|
const role = await createRole({
|
||||||
|
isPublic: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
await roleService.assign(user.id, role.id);
|
||||||
|
|
||||||
|
await sleep(100);
|
||||||
|
|
||||||
|
const assignments = await roleAssignmentsRepository.find({
|
||||||
|
where: {
|
||||||
|
userId: user.id,
|
||||||
|
roleId: role.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(assignments).toHaveLength(1);
|
||||||
|
|
||||||
|
expect(notificationService.createNotification).toHaveBeenCalled();
|
||||||
|
expect(notificationService.createNotification.mock.lastCall![0]).toBe(user.id);
|
||||||
|
expect(notificationService.createNotification.mock.lastCall![1]).toBe('roleAssigned');
|
||||||
|
expect(notificationService.createNotification.mock.lastCall![2]).toBe({
|
||||||
|
roleId: role.id,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('非公開ロールの場合は通知されない', async () => {
|
||||||
|
const user = await createUser();
|
||||||
|
const role = await createRole({
|
||||||
|
isPublic: false,
|
||||||
|
});
|
||||||
|
|
||||||
|
await roleService.assign(user.id, role.id);
|
||||||
|
|
||||||
|
await sleep(100);
|
||||||
|
|
||||||
|
const assignments = await roleAssignmentsRepository.find({
|
||||||
|
where: {
|
||||||
|
userId: user.id,
|
||||||
|
roleId: role.id,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
expect(assignments).toHaveLength(1);
|
||||||
|
|
||||||
|
expect(notificationService.createNotification).not.toHaveBeenCalled();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,16 +3,16 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent, App } from 'vue';
|
import { computed, watch, version as vueVersion, App } from 'vue';
|
||||||
import { compareVersions } from 'compare-versions';
|
import { compareVersions } from 'compare-versions';
|
||||||
import widgets from '@/widgets/index.js';
|
import widgets from '@/widgets/index.js';
|
||||||
import directives from '@/directives/index.js';
|
import directives from '@/directives/index.js';
|
||||||
import components from '@/components/index.js';
|
import components from '@/components/index.js';
|
||||||
import { version, ui, lang, updateLocale, locale } from '@/config.js';
|
import { version, lang, updateLocale, locale } from '@/config.js';
|
||||||
import { applyTheme } from '@/scripts/theme.js';
|
import { applyTheme } from '@/scripts/theme.js';
|
||||||
import { isDeviceDarkmode } from '@/scripts/is-device-darkmode.js';
|
import { isDeviceDarkmode } from '@/scripts/is-device-darkmode.js';
|
||||||
import { i18n, updateI18n } from '@/i18n.js';
|
import { updateI18n } from '@/i18n.js';
|
||||||
import { $i, refreshAccount, login, updateAccount, signout } from '@/account.js';
|
import { $i, refreshAccount, login } from '@/account.js';
|
||||||
import { defaultStore, ColdDeviceStorage } from '@/store.js';
|
import { defaultStore, ColdDeviceStorage } from '@/store.js';
|
||||||
import { fetchInstance, instance } from '@/instance.js';
|
import { fetchInstance, instance } from '@/instance.js';
|
||||||
import { deviceKind } from '@/scripts/device-kind.js';
|
import { deviceKind } from '@/scripts/device-kind.js';
|
||||||
|
|
|
@ -3,14 +3,14 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent } from 'vue';
|
import { createApp, markRaw, defineAsyncComponent } from 'vue';
|
||||||
import { common } from './common.js';
|
import { common } from './common.js';
|
||||||
import { version, ui, lang, updateLocale } from '@/config.js';
|
import { ui } from '@/config.js';
|
||||||
import { i18n, updateI18n } from '@/i18n.js';
|
import { i18n } from '@/i18n.js';
|
||||||
import { confirm, alert, post, popup, toast } from '@/os.js';
|
import { confirm, alert, post, popup, toast } from '@/os.js';
|
||||||
import { useStream } from '@/stream.js';
|
import { useStream } from '@/stream.js';
|
||||||
import * as sound from '@/scripts/sound.js';
|
import * as sound from '@/scripts/sound.js';
|
||||||
import { $i, refreshAccount, login, updateAccount, signout } from '@/account.js';
|
import { $i, updateAccount, signout } from '@/account.js';
|
||||||
import { defaultStore, ColdDeviceStorage } from '@/store.js';
|
import { defaultStore, ColdDeviceStorage } from '@/store.js';
|
||||||
import { makeHotkey } from '@/scripts/hotkey.js';
|
import { makeHotkey } from '@/scripts/hotkey.js';
|
||||||
import { reactionPicker } from '@/scripts/reaction-picker.js';
|
import { reactionPicker } from '@/scripts/reaction-picker.js';
|
||||||
|
@ -20,7 +20,6 @@ import { mainRouter } from '@/router.js';
|
||||||
import { initializeSw } from '@/scripts/initialize-sw.js';
|
import { initializeSw } from '@/scripts/initialize-sw.js';
|
||||||
import { deckStore } from '@/ui/deck/deck-store.js';
|
import { deckStore } from '@/ui/deck/deck-store.js';
|
||||||
import { emojiPicker } from '@/scripts/emoji-picker.js';
|
import { emojiPicker } from '@/scripts/emoji-picker.js';
|
||||||
import { SnowfallEffect } from '@/scripts/snowfall-effect.js';
|
|
||||||
|
|
||||||
export async function mainBoot() {
|
export async function mainBoot() {
|
||||||
const { isClientUpdated } = await common(() => createApp(
|
const { isClientUpdated } = await common(() => createApp(
|
||||||
|
@ -79,6 +78,7 @@ export async function mainBoot() {
|
||||||
if (defaultStore.state.enableSeasonalScreenEffect) {
|
if (defaultStore.state.enableSeasonalScreenEffect) {
|
||||||
const month = new Date().getMonth() + 1;
|
const month = new Date().getMonth() + 1;
|
||||||
if (month === 12 || month === 1) {
|
if (month === 12 || month === 1) {
|
||||||
|
const SnowfallEffect = (await import('@/scripts/snowfall-effect.js')).SnowfallEffect;
|
||||||
new SnowfallEffect().render();
|
new SnowfallEffect().render();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* SPDX-License-Identifier: AGPL-3.0-only
|
* SPDX-License-Identifier: AGPL-3.0-only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import { computed, createApp, watch, markRaw, version as vueVersion, defineAsyncComponent } from 'vue';
|
import { createApp, defineAsyncComponent } from 'vue';
|
||||||
import { common } from './common.js';
|
import { common } from './common.js';
|
||||||
|
|
||||||
export async function subBoot() {
|
export async function subBoot() {
|
||||||
|
|
|
@ -24,8 +24,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, nextTick, ref, shallowRef, watch, computed, toRefs } from 'vue';
|
import { ref, shallowRef, toRefs } from 'vue';
|
||||||
import { i18n } from '@/i18n.js';
|
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
modelValue: string | null;
|
modelValue: string | null;
|
||||||
|
|
|
@ -42,7 +42,7 @@ const emit = defineEmits<{
|
||||||
const label = computed(() => {
|
const label = computed(() => {
|
||||||
return concat([
|
return concat([
|
||||||
props.text ? [i18n.t('_cw.chars', { count: props.text.length })] : [],
|
props.text ? [i18n.t('_cw.chars', { count: props.text.length })] : [],
|
||||||
props.renote != null ? [i18n.ts.quote] : [],
|
props.renote ? [i18n.ts.quote] : [],
|
||||||
props.files.length !== 0 ? [i18n.t('_cw.files', { count: props.files.length })] : [],
|
props.files.length !== 0 ? [i18n.t('_cw.files', { count: props.files.length })] : [],
|
||||||
props.poll != null ? [i18n.ts.poll] : [],
|
props.poll != null ? [i18n.ts.poll] : [],
|
||||||
] as string[][]).join(' / ');
|
] as string[][]).join(' / ');
|
||||||
|
|
|
@ -32,7 +32,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { onMounted, shallowRef, watch, ref } from 'vue';
|
import { shallowRef, watch, ref } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import { i18n } from '@/i18n.js';
|
import { i18n } from '@/i18n.js';
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
-->
|
-->
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<div ref="root">
|
<div>
|
||||||
<XBanner v-for="media in mediaList.filter(media => !previewable(media))" :key="media.id" :media="media"/>
|
<XBanner v-for="media in mediaList.filter(media => !previewable(media))" :key="media.id" :media="media"/>
|
||||||
<div v-if="mediaList.filter(media => previewable(media)).length > 0" :class="$style.container">
|
<div v-if="mediaList.filter(media => previewable(media)).length > 0" :class="$style.container">
|
||||||
<div
|
<div
|
||||||
|
@ -27,41 +27,6 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
|
||||||
/**
|
|
||||||
* アスペクト比算出のためにHTMLElement.clientWidthを使うが、
|
|
||||||
* 大変重たいのでコンテナ要素とメディアリスト幅のペアをキャッシュする
|
|
||||||
* (タイムラインごとにスクロールコンテナが存在する前提だが……)
|
|
||||||
*/
|
|
||||||
const widthCache = new Map<Element, number>();
|
|
||||||
|
|
||||||
/**
|
|
||||||
* コンテナ要素がリサイズされたらキャッシュを削除する
|
|
||||||
*/
|
|
||||||
const ro = new ResizeObserver(entries => {
|
|
||||||
for (const entry of entries) {
|
|
||||||
widthCache.delete(entry.target);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
async function getClientWidthWithCache(targetEl: HTMLElement, containerEl: HTMLElement, count = 0) {
|
|
||||||
if (_DEV_) console.log('getClientWidthWithCache', { targetEl, containerEl, count, cache: widthCache.get(containerEl) });
|
|
||||||
if (widthCache.has(containerEl)) return widthCache.get(containerEl)!;
|
|
||||||
|
|
||||||
const width = targetEl.clientWidth;
|
|
||||||
|
|
||||||
if (count <= 10 && width < 64) {
|
|
||||||
// widthが64未満はおかしいのでリトライする
|
|
||||||
await new Promise(resolve => setTimeout(resolve, 50));
|
|
||||||
return getClientWidthWithCache(targetEl, containerEl, count + 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
widthCache.set(containerEl, width);
|
|
||||||
ro.observe(containerEl);
|
|
||||||
return width;
|
|
||||||
}
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, onMounted, onUnmounted, shallowRef } from 'vue';
|
import { computed, onMounted, onUnmounted, shallowRef } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
|
@ -74,15 +39,12 @@ import XVideo from '@/components/MkMediaVideo.vue';
|
||||||
import * as os from '@/os.js';
|
import * as os from '@/os.js';
|
||||||
import { FILE_TYPE_BROWSERSAFE } from '@/const';
|
import { FILE_TYPE_BROWSERSAFE } from '@/const';
|
||||||
import { defaultStore } from '@/store.js';
|
import { defaultStore } from '@/store.js';
|
||||||
import { getScrollContainer, getBodyScrollHeight } from '@/scripts/scroll.js';
|
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
mediaList: Misskey.entities.DriveFile[];
|
mediaList: Misskey.entities.DriveFile[];
|
||||||
raw?: boolean;
|
raw?: boolean;
|
||||||
}>();
|
}>();
|
||||||
|
|
||||||
const root = shallowRef<HTMLDivElement>();
|
|
||||||
const container = shallowRef<HTMLElement | null | undefined>(undefined);
|
|
||||||
const gallery = shallowRef<HTMLDivElement>();
|
const gallery = shallowRef<HTMLDivElement>();
|
||||||
const pswpZIndex = os.claimZIndex('middle');
|
const pswpZIndex = os.claimZIndex('middle');
|
||||||
document.documentElement.style.setProperty('--mk-pswp-root-z-index', pswpZIndex.toString());
|
document.documentElement.style.setProperty('--mk-pswp-root-z-index', pswpZIndex.toString());
|
||||||
|
@ -95,12 +57,8 @@ const popstateHandler = (): void => {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
|
||||||
* アスペクト比をmediaListWithOneImageAppearanceに基づいていい感じに調整する
|
|
||||||
* aspect-ratioではなくheightを使う
|
|
||||||
*/
|
|
||||||
async function calcAspectRatio() {
|
async function calcAspectRatio() {
|
||||||
if (!gallery.value || !root.value) return;
|
if (!gallery.value) return;
|
||||||
|
|
||||||
let img = props.mediaList[0];
|
let img = props.mediaList[0];
|
||||||
|
|
||||||
|
@ -109,43 +67,24 @@ async function calcAspectRatio() {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!container.value) container.value = getScrollContainer(root.value);
|
const ratioMax = (ratio: number) => `${Math.max(ratio, img.properties.width / img.properties.height).toString()} / 1`;
|
||||||
const width = container.value ? await getClientWidthWithCache(root.value, container.value) : root.value.clientWidth;
|
|
||||||
|
|
||||||
const heightMin = (ratio: number) => {
|
|
||||||
const imgResizeRatio = width / img.properties.width;
|
|
||||||
const imgDrawHeight = img.properties.height * imgResizeRatio;
|
|
||||||
const maxHeight = width * ratio;
|
|
||||||
const height = Math.min(imgDrawHeight, maxHeight);
|
|
||||||
if (_DEV_) console.log('Image height calculated:', { width, properties: img.properties, imgResizeRatio, imgDrawHeight, maxHeight, height });
|
|
||||||
return `${height}px`;
|
|
||||||
};
|
|
||||||
|
|
||||||
switch (defaultStore.state.mediaListWithOneImageAppearance) {
|
switch (defaultStore.state.mediaListWithOneImageAppearance) {
|
||||||
case '16_9':
|
case '16_9':
|
||||||
gallery.value.style.height = heightMin(9 / 16);
|
gallery.value.style.aspectRatio = ratioMax(16 / 9);
|
||||||
break;
|
break;
|
||||||
case '1_1':
|
case '1_1':
|
||||||
gallery.value.style.height = heightMin(1);
|
gallery.value.style.aspectRatio = ratioMax(1 / 1);
|
||||||
break;
|
break;
|
||||||
case '2_3':
|
case '2_3':
|
||||||
gallery.value.style.height = heightMin(3 / 2);
|
gallery.value.style.aspectRatio = ratioMax(2 / 3);
|
||||||
break;
|
break;
|
||||||
default: {
|
default:
|
||||||
const maxHeight = Math.max(64, (container.value ? container.value.clientHeight : getBodyScrollHeight()) * 0.5 || 360);
|
gallery.value.style.aspectRatio = '';
|
||||||
if (width === 0 || !maxHeight) return;
|
|
||||||
const imgResizeRatio = width / img.properties.width;
|
|
||||||
const imgDrawHeight = img.properties.height * imgResizeRatio;
|
|
||||||
gallery.value.style.height = `${Math.max(64, Math.min(imgDrawHeight, maxHeight))}px`;
|
|
||||||
gallery.value.style.minHeight = 'initial';
|
|
||||||
gallery.value.style.maxHeight = 'initial';
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
gallery.value.style.aspectRatio = 'initial';
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(() => {
|
onMounted(() => {
|
||||||
calcAspectRatio();
|
calcAspectRatio();
|
||||||
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts">
|
<script lang="ts">
|
||||||
import { Ref, computed, defineAsyncComponent, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';
|
import { computed, defineAsyncComponent, nextTick, onBeforeUnmount, onMounted, ref, shallowRef, watch } from 'vue';
|
||||||
import { focusPrev, focusNext } from '@/scripts/focus.js';
|
import { focusPrev, focusNext } from '@/scripts/focus.js';
|
||||||
import MkSwitchButton from '@/components/MkSwitch.button.vue';
|
import MkSwitchButton from '@/components/MkSwitch.button.vue';
|
||||||
import { MenuItem, InnerMenuItem, MenuPending, MenuAction, MenuSwitch, MenuParent } from '@/types/menu';
|
import { MenuItem, InnerMenuItem, MenuPending, MenuAction, MenuSwitch, MenuParent } from '@/types/menu';
|
||||||
|
|
|
@ -54,7 +54,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div style="container-type: inline-size;">
|
<div style="container-type: inline-size;">
|
||||||
<p v-if="appearNote.cw != null" :class="$style.cw">
|
<p v-if="appearNote.cw != null" :class="$style.cw">
|
||||||
<Mfm v-if="appearNote.cw != ''" style="margin-right: 8px;" :text="appearNote.cw" :author="appearNote.user" :nyaize="'respect'"/>
|
<Mfm v-if="appearNote.cw != ''" style="margin-right: 8px;" :text="appearNote.cw" :author="appearNote.user" :nyaize="'respect'"/>
|
||||||
<MkCwButton v-model="showContent" :text="appearNote.text" :renote="appearNote" :files="appearNote.files" :poll="appearNote.poll" style="margin: 4px 0;"/>
|
<MkCwButton v-model="showContent" :text="appearNote.text" :renote="appearNote.renote" :files="appearNote.files" :poll="appearNote.poll" style="margin: 4px 0;"/>
|
||||||
</p>
|
</p>
|
||||||
<div v-show="appearNote.cw == null || showContent" :class="[{ [$style.contentCollapsed]: collapsed }]">
|
<div v-show="appearNote.cw == null || showContent" :class="[{ [$style.contentCollapsed]: collapsed }]">
|
||||||
<div :class="$style.text">
|
<div :class="$style.text">
|
||||||
|
@ -151,7 +151,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { computed, inject, onMounted, ref, shallowRef, Ref, defineAsyncComponent, watch, provide } from 'vue';
|
import { computed, inject, onMounted, ref, shallowRef, Ref, watch, provide } from 'vue';
|
||||||
import * as mfm from 'mfm-js';
|
import * as mfm from 'mfm-js';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import MkNoteSub from '@/components/MkNoteSub.vue';
|
import MkNoteSub from '@/components/MkNoteSub.vue';
|
||||||
|
|
|
@ -221,11 +221,10 @@ import { useNoteCapture } from '@/scripts/use-note-capture.js';
|
||||||
import { deepClone } from '@/scripts/clone.js';
|
import { deepClone } from '@/scripts/clone.js';
|
||||||
import { useTooltip } from '@/scripts/use-tooltip.js';
|
import { useTooltip } from '@/scripts/use-tooltip.js';
|
||||||
import { claimAchievement } from '@/scripts/achievements.js';
|
import { claimAchievement } from '@/scripts/achievements.js';
|
||||||
import { MenuItem } from '@/types/menu.js';
|
|
||||||
import MkRippleEffect from '@/components/MkRippleEffect.vue';
|
import MkRippleEffect from '@/components/MkRippleEffect.vue';
|
||||||
import { showMovedDialog } from '@/scripts/show-moved-dialog.js';
|
import { showMovedDialog } from '@/scripts/show-moved-dialog.js';
|
||||||
import MkUserCardMini from '@/components/MkUserCardMini.vue';
|
import MkUserCardMini from '@/components/MkUserCardMini.vue';
|
||||||
import MkPagination, { Paging } from '@/components/MkPagination.vue';
|
import MkPagination from '@/components/MkPagination.vue';
|
||||||
import MkReactionIcon from '@/components/MkReactionIcon.vue';
|
import MkReactionIcon from '@/components/MkReactionIcon.vue';
|
||||||
import MkButton from '@/components/MkButton.vue';
|
import MkButton from '@/components/MkButton.vue';
|
||||||
|
|
||||||
|
|
|
@ -27,7 +27,6 @@ import * as Misskey from 'misskey-js';
|
||||||
import MkNoteHeader from '@/components/MkNoteHeader.vue';
|
import MkNoteHeader from '@/components/MkNoteHeader.vue';
|
||||||
import MkSubNoteContent from '@/components/MkSubNoteContent.vue';
|
import MkSubNoteContent from '@/components/MkSubNoteContent.vue';
|
||||||
import MkCwButton from '@/components/MkCwButton.vue';
|
import MkCwButton from '@/components/MkCwButton.vue';
|
||||||
import { $i } from '@/account.js';
|
|
||||||
|
|
||||||
const props = defineProps<{
|
const props = defineProps<{
|
||||||
note: Misskey.entities.Note;
|
note: Misskey.entities.Note;
|
||||||
|
|
|
@ -51,7 +51,6 @@ import { i18n } from '@/i18n.js';
|
||||||
import { $i } from '@/account.js';
|
import { $i } from '@/account.js';
|
||||||
import { userPage } from '@/filters/user.js';
|
import { userPage } from '@/filters/user.js';
|
||||||
import { checkWordMute } from '@/scripts/check-word-mute.js';
|
import { checkWordMute } from '@/scripts/check-word-mute.js';
|
||||||
import { defaultStore } from '@/store.js';
|
|
||||||
|
|
||||||
const props = withDefaults(defineProps<{
|
const props = withDefaults(defineProps<{
|
||||||
note: Misskey.entities.Note;
|
note: Misskey.entities.Note;
|
||||||
|
|
|
@ -8,6 +8,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<div :class="$style.head">
|
<div :class="$style.head">
|
||||||
<MkAvatar v-if="notification.type === 'pollEnded'" :class="$style.icon" :user="notification.note.user" link preview/>
|
<MkAvatar v-if="notification.type === 'pollEnded'" :class="$style.icon" :user="notification.note.user" link preview/>
|
||||||
<MkAvatar v-else-if="notification.type === 'note'" :class="$style.icon" :user="notification.note.user" link preview/>
|
<MkAvatar v-else-if="notification.type === 'note'" :class="$style.icon" :user="notification.note.user" link preview/>
|
||||||
|
<MkAvatar v-else-if="notification.type === 'roleAssigned'" :class="$style.icon" :user="$i" link preview/>
|
||||||
<MkAvatar v-else-if="notification.type === 'achievementEarned'" :class="$style.icon" :user="$i" link preview/>
|
<MkAvatar v-else-if="notification.type === 'achievementEarned'" :class="$style.icon" :user="$i" link preview/>
|
||||||
<div v-else-if="notification.type === 'reaction:grouped'" :class="[$style.icon, $style.icon_reactionGroup]"><i class="ti ti-plus" style="line-height: 1;"></i></div>
|
<div v-else-if="notification.type === 'reaction:grouped'" :class="[$style.icon, $style.icon_reactionGroup]"><i class="ti ti-plus" style="line-height: 1;"></i></div>
|
||||||
<div v-else-if="notification.type === 'renote:grouped'" :class="[$style.icon, $style.icon_renoteGroup]"><i class="ti ti-repeat" style="line-height: 1;"></i></div>
|
<div v-else-if="notification.type === 'renote:grouped'" :class="[$style.icon, $style.icon_renoteGroup]"><i class="ti ti-repeat" style="line-height: 1;"></i></div>
|
||||||
|
@ -36,6 +37,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<i v-else-if="notification.type === 'quote'" class="ti ti-quote"></i>
|
<i v-else-if="notification.type === 'quote'" class="ti ti-quote"></i>
|
||||||
<i v-else-if="notification.type === 'pollEnded'" class="ti ti-chart-arrows"></i>
|
<i v-else-if="notification.type === 'pollEnded'" class="ti ti-chart-arrows"></i>
|
||||||
<i v-else-if="notification.type === 'achievementEarned'" class="ti ti-medal"></i>
|
<i v-else-if="notification.type === 'achievementEarned'" class="ti ti-medal"></i>
|
||||||
|
<img v-else-if="notification.type === 'roleAssigned'" :src="notification.role.iconUrl" alt=""/>
|
||||||
<!-- notification.reaction が null になることはまずないが、ここでoptional chaining使うと一部ブラウザで刺さるので念の為 -->
|
<!-- notification.reaction が null になることはまずないが、ここでoptional chaining使うと一部ブラウザで刺さるので念の為 -->
|
||||||
<MkReactionIcon
|
<MkReactionIcon
|
||||||
v-else-if="notification.type === 'reaction'"
|
v-else-if="notification.type === 'reaction'"
|
||||||
|
@ -50,6 +52,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<header :class="$style.header">
|
<header :class="$style.header">
|
||||||
<span v-if="notification.type === 'pollEnded'">{{ i18n.ts._notification.pollEnded }}</span>
|
<span v-if="notification.type === 'pollEnded'">{{ i18n.ts._notification.pollEnded }}</span>
|
||||||
<span v-else-if="notification.type === 'note'">{{ i18n.ts._notification.newNote }}: <MkUserName :user="notification.note.user"/></span>
|
<span v-else-if="notification.type === 'note'">{{ i18n.ts._notification.newNote }}: <MkUserName :user="notification.note.user"/></span>
|
||||||
|
<span v-else-if="notification.type === 'roleAssigned'">{{ i18n.ts._notification.roleAssigned }}</span>
|
||||||
<span v-else-if="notification.type === 'achievementEarned'">{{ i18n.ts._notification.achievementEarned }}</span>
|
<span v-else-if="notification.type === 'achievementEarned'">{{ i18n.ts._notification.achievementEarned }}</span>
|
||||||
<span v-else-if="notification.type === 'test'">{{ i18n.ts._notification.testNotification }}</span>
|
<span v-else-if="notification.type === 'test'">{{ i18n.ts._notification.testNotification }}</span>
|
||||||
<MkA v-else-if="notification.user" v-user-preview="notification.user.id" :class="$style.headerName" :to="userPage(notification.user)"><MkUserName :user="notification.user"/></MkA>
|
<MkA v-else-if="notification.user" v-user-preview="notification.user.id" :class="$style.headerName" :to="userPage(notification.user)"><MkUserName :user="notification.user"/></MkA>
|
||||||
|
@ -86,6 +89,9 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
<Mfm :text="getNoteSummary(notification.note)" :plain="true" :nowrap="true" :author="notification.note.user"/>
|
<Mfm :text="getNoteSummary(notification.note)" :plain="true" :nowrap="true" :author="notification.note.user"/>
|
||||||
<i class="ti ti-quote" :class="$style.quote"></i>
|
<i class="ti ti-quote" :class="$style.quote"></i>
|
||||||
</MkA>
|
</MkA>
|
||||||
|
<div v-else-if="notification.type === 'roleAssigned'" :class="$style.text">
|
||||||
|
{{ notification.role.name }}
|
||||||
|
</div>
|
||||||
<MkA v-else-if="notification.type === 'achievementEarned'" :class="$style.text" to="/my/achievements">
|
<MkA v-else-if="notification.type === 'achievementEarned'" :class="$style.text" to="/my/achievements">
|
||||||
{{ i18n.ts._achievements._types['_' + notification.achievement].title }}
|
{{ i18n.ts._achievements._types['_' + notification.achievement].title }}
|
||||||
</MkA>
|
</MkA>
|
||||||
|
@ -130,7 +136,7 @@ SPDX-License-Identifier: AGPL-3.0-only
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { ref, shallowRef } from 'vue';
|
import { ref } from 'vue';
|
||||||
import * as Misskey from 'misskey-js';
|
import * as Misskey from 'misskey-js';
|
||||||
import MkReactionIcon from '@/components/MkReactionIcon.vue';
|
import MkReactionIcon from '@/components/MkReactionIcon.vue';
|
||||||
import MkFollowButton from '@/components/MkFollowButton.vue';
|
import MkFollowButton from '@/components/MkFollowButton.vue';
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue