diff --git a/UPGRADE_NOTES.md b/UPGRADE_NOTES.md index 47ac649c31..c16a65eb10 100644 --- a/UPGRADE_NOTES.md +++ b/UPGRADE_NOTES.md @@ -1,6 +1,18 @@ # Upgrade Notes -## 2025.X.X +## 2025.5.2 + +### Mark instance as NSFW + +The "Mark instance as NSFW" has been removed in favor of the new "mandatory CW" / "force CW" system. +Moderators can now apply any Content Warning of their choice to all notes from an instance by populating the "Force content warning" field on that instance's info page. +The new Content Warning applies immediately, is retroactive, and does not federate or "infect" replies in a thread. + +The upgrade will automatically a content warning of "NSFW" for instances that were formerly marked as NSFW, which displays as `[instance name] is flagged: "NSFW"` to users. +The `notes` table is also cleaned up to remove any leftover "Instance is marked as NSFW" content warnings from posts. +Staff can then remove or modify the new CW as usual. + +## 2025.2.2 ### Authorized Fetch @@ -13,6 +25,8 @@ Do not remove it before migration, or else the setting will reset to default (di ### Hellspawns +**Note: this workaround is no longer needed on Sharkey version 2025.5.2 and later, as "Mark instance as NSFW" has been completely rewritten.** + Sharkey versions before 2024.10 suffered from a bug in the "Mark instance as NSFW" feature. When a user from such an instance boosted a note, the boost would be converted to a hellspawn (pure renote with Content Warning). Hellspawns are buggy and do not properly federate, so it may be desirable to correct any that already exist in the database. diff --git a/locales/index.d.ts b/locales/index.d.ts index 06b9e26006..303f5df9c5 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -10964,14 +10964,6 @@ export interface Locale extends ILocale { * Set content warning for instance */ "setMandatoryCWForInstance": string; - /** - * Set remote instance as NSFW - */ - "setRemoteInstanceNSFW": string; - /** - * Unset remote instance as NSFW - */ - "unsetRemoteInstanceNSFW": string; /** * Rejected reports from remote instance */ diff --git a/packages/backend/migration/1751236746539-replace-instance-isNSFW.js b/packages/backend/migration/1751236746539-replace-instance-isNSFW.js new file mode 100644 index 0000000000..632fa98d6b --- /dev/null +++ b/packages/backend/migration/1751236746539-replace-instance-isNSFW.js @@ -0,0 +1,25 @@ +/* + * SPDX-FileCopyrightText: hazelnoot and other Sharkey contributors + * SPDX-License-Identifier: AGPL-3.0-only + */ + +export class ReplaceInstanceIsNSFW1751236746539 { + name = 'ReplaceInstanceIsNSFW1751236746539' + + async up(queryRunner) { + // Data migration + await queryRunner.query(`UPDATE "instance" SET "mandatoryCW" = 'NSFW' WHERE "isNSFW" = true`); + await queryRunner.query(`UPDATE "note" SET "cw" = null WHERE "cw" = 'Instance is marked as NSFW'`); + + // Schema migration + await queryRunner.query(`ALTER TABLE "instance" DROP COLUMN "isNSFW"`); + } + + async down(queryRunner) { + // Schema migration + await queryRunner.query(`ALTER TABLE "instance" ADD "isNSFW" boolean NOT NULL DEFAULT false`); + + // Data migration + await queryRunner.query(`UPDATE "instance" SET "isNSFW" = true WHERE "mandatoryCW" ILIKE '%NSFW%'`); + } +} diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts index bf7d209fef..0732624a99 100644 --- a/packages/backend/src/core/NoteCreateService.ts +++ b/packages/backend/src/core/NoteCreateService.ts @@ -414,14 +414,6 @@ export class NoteCreateService implements OnApplicationShutdown { } } - if (user.host && !data.cw) { - await this.federatedInstanceService.fetchOrRegister(user.host).then(async i => { - if (i.isNSFW && !this.isPureRenote(data)) { - data.cw = 'Instance is marked as NSFW'; - } - }); - } - if (mentionedUsers.length > 0 && mentionedUsers.length > (await this.roleService.getUserPolicies(user.id)).mentionLimit) { throw new IdentifiableError('9f466dab-c856-48cd-9e65-ff90ff750580', 'Note contains too many mentions'); } diff --git a/packages/backend/src/core/NoteEditService.ts b/packages/backend/src/core/NoteEditService.ts index 5b0d1980c3..f8c732c4f1 100644 --- a/packages/backend/src/core/NoteEditService.ts +++ b/packages/backend/src/core/NoteEditService.ts @@ -443,14 +443,6 @@ export class NoteEditService implements OnApplicationShutdown { } } - if (user.host && !data.cw) { - await this.federatedInstanceService.fetchOrRegister(user.host).then(async i => { - if (i.isNSFW && !this.noteCreateService.isPureRenote(data)) { - data.cw = 'Instance is marked as NSFW'; - } - }); - } - if (mentionedUsers.length > 0 && mentionedUsers.length > (await this.roleService.getUserPolicies(user.id)).mentionLimit) { throw new IdentifiableError('9f466dab-c856-48cd-9e65-ff90ff750580', 'Note contains too many mentions'); } diff --git a/packages/backend/src/core/activitypub/models/ApImageService.ts b/packages/backend/src/core/activitypub/models/ApImageService.ts index 8973195f53..51ea4f5ed3 100644 --- a/packages/backend/src/core/activitypub/models/ApImageService.ts +++ b/packages/backend/src/core/activitypub/models/ApImageService.ts @@ -75,7 +75,7 @@ export class ApImageService { const shouldBeCached = this.meta.cacheRemoteFiles && (this.meta.cacheRemoteSensitiveFiles || !image.sensitive); await this.federatedInstanceService.fetchOrRegister(actor.host).then(async i => { - if (i.isNSFW) { + if (i.isMediaSilenced) { image.sensitive = true; } }); diff --git a/packages/backend/src/core/entities/InstanceEntityService.ts b/packages/backend/src/core/entities/InstanceEntityService.ts index 09dd54812c..1225b6484a 100644 --- a/packages/backend/src/core/entities/InstanceEntityService.ts +++ b/packages/backend/src/core/entities/InstanceEntityService.ts @@ -63,7 +63,6 @@ export class InstanceEntityService { themeColor: instance.themeColor, infoUpdatedAt: instance.infoUpdatedAt ? instance.infoUpdatedAt.toISOString() : null, latestRequestReceivedAt: instance.latestRequestReceivedAt ? instance.latestRequestReceivedAt.toISOString() : null, - isNSFW: instance.isNSFW, rejectReports: instance.rejectReports, rejectQuotes: instance.rejectQuotes, moderationNote: iAmModerator ? instance.moderationNote : null, diff --git a/packages/backend/src/models/Instance.ts b/packages/backend/src/models/Instance.ts index b445247176..e52ba65e1c 100644 --- a/packages/backend/src/models/Instance.ts +++ b/packages/backend/src/models/Instance.ts @@ -205,11 +205,6 @@ export class MiInstance { }) public infoUpdatedAt: Date | null; - @Column('boolean', { - default: false, - }) - public isNSFW: boolean; - @Column('boolean', { default: false, }) diff --git a/packages/backend/src/models/json-schema/federation-instance.ts b/packages/backend/src/models/json-schema/federation-instance.ts index 51452b4598..f04ac810d1 100644 --- a/packages/backend/src/models/json-schema/federation-instance.ts +++ b/packages/backend/src/models/json-schema/federation-instance.ts @@ -116,11 +116,6 @@ export const packedFederationInstanceSchema = { optional: false, nullable: true, format: 'date-time', }, - isNSFW: { - type: 'boolean', - optional: false, - nullable: false, - }, rejectReports: { type: 'boolean', optional: false, diff --git a/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts b/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts index 24d0b8527c..e4b2a28429 100644 --- a/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts +++ b/packages/backend/src/server/api/endpoints/admin/federation/update-instance.ts @@ -24,7 +24,6 @@ export const paramDef = { properties: { host: { type: 'string' }, isSuspended: { type: 'boolean' }, - isNSFW: { type: 'boolean' }, rejectReports: { type: 'boolean' }, moderationNote: { type: 'string' }, rejectQuotes: { type: 'boolean' }, @@ -58,7 +57,6 @@ export default class extends Endpoint { // eslint- await this.federatedInstanceService.update(instance.id, { suspensionState, - isNSFW: ps.isNSFW, rejectReports: ps.rejectReports, rejectQuotes: ps.rejectQuotes, moderationNote: ps.moderationNote, @@ -78,14 +76,6 @@ export default class extends Endpoint { // eslint- } } - if (ps.isNSFW != null && instance.isNSFW !== ps.isNSFW) { - const message = ps.rejectReports ? 'setRemoteInstanceNSFW' : 'unsetRemoteInstanceNSFW'; - this.moderationLogService.log(me, message, { - id: instance.id, - host: instance.host, - }); - } - if (ps.rejectReports != null && instance.rejectReports !== ps.rejectReports) { const message = ps.rejectReports ? 'rejectRemoteInstanceReports' : 'acceptRemoteInstanceReports'; this.moderationLogService.log(me, message, { diff --git a/packages/backend/src/types.ts b/packages/backend/src/types.ts index cbc490156f..8f37b45004 100644 --- a/packages/backend/src/types.ts +++ b/packages/backend/src/types.ts @@ -108,8 +108,6 @@ export const moderationLogTypes = [ 'setMandatoryCW', 'setMandatoryCWForNote', 'setMandatoryCWForInstance', - 'setRemoteInstanceNSFW', - 'unsetRemoteInstanceNSFW', 'suspendRemoteInstance', 'unsuspendRemoteInstance', 'rejectRemoteInstanceReports', @@ -309,14 +307,6 @@ export type ModerationLogPayloads = { oldCW: string | null; host: string; }; - setRemoteInstanceNSFW: { - id: string; - host: string; - }; - unsetRemoteInstanceNSFW: { - id: string; - host: string; - }; suspendRemoteInstance: { id: string; host: string; diff --git a/packages/frontend/src/pages/about.federation.vue b/packages/frontend/src/pages/about.federation.vue index 675f1eb809..48dc7cff42 100644 --- a/packages/frontend/src/pages/about.federation.vue +++ b/packages/frontend/src/pages/about.federation.vue @@ -19,7 +19,6 @@ SPDX-License-Identifier: AGPL-3.0-only - @@ -83,18 +82,16 @@ const pagination = { state.value === 'blocked' ? { blocked: true } : state.value === 'silenced' ? { silenced: true } : state.value === 'notResponding' ? { notResponding: true } : - state.value === 'nsfw' ? { nsfw: true } : state.value === 'bubble' ? { bubble: true } : {}), })), -} as Paging; +} satisfies Paging; function getStatus(instance) { if (instance.isSuspended) return 'Suspended'; if (instance.isBlocked) return 'Blocked'; if (instance.isSilenced) return 'Silenced'; if (instance.isNotResponding) return 'Error'; - if (instance.isNSFW) return 'NSFW'; return 'Alive'; } diff --git a/packages/frontend/src/pages/admin/federation.vue b/packages/frontend/src/pages/admin/federation.vue index 16bed50002..9b67854145 100644 --- a/packages/frontend/src/pages/admin/federation.vue +++ b/packages/frontend/src/pages/admin/federation.vue @@ -19,8 +19,6 @@ SPDX-License-Identifier: AGPL-3.0-only - - @@ -85,7 +83,6 @@ const pagination = { state.value === 'blocked' ? { blocked: true } : state.value === 'silenced' ? { silenced: true } : state.value === 'notResponding' ? { notResponding: true } : - state.value === 'nsfw' ? { nsfw: true } : {}), })), }; @@ -104,7 +101,6 @@ function getStatus(instance: Misskey.entities.FederationInstance) { if (instance.isBlocked) return 'Blocked'; if (instance.isSilenced) return 'Silenced'; if (instance.isNotResponding) return 'Error'; - if (instance.isNSFW) return 'NSFW'; return 'Alive'; } diff --git a/packages/frontend/src/pages/admin/modlog.ModLog.vue b/packages/frontend/src/pages/admin/modlog.ModLog.vue index 1e3706c90e..03c59ae0f5 100644 --- a/packages/frontend/src/pages/admin/modlog.ModLog.vue +++ b/packages/frontend/src/pages/admin/modlog.ModLog.vue @@ -30,8 +30,6 @@ SPDX-License-Identifier: AGPL-3.0-only 'setMandatoryCWForNote', 'setMandatoryCWForInstance', 'suspendRemoteInstance', - 'setRemoteInstanceNSFW', - 'unsetRemoteInstanceNSFW', 'rejectRemoteInstanceReports', 'acceptRemoteInstanceReports', 'rejectQuotesUser', @@ -69,7 +67,7 @@ SPDX-License-Identifier: AGPL-3.0-only 'removeRelay', ].includes(log.type) }" - >{{ i18n.ts._moderationLogTypes[log.type] }} + >{{ i18n.ts._moderationLogTypes[log.type] ?? log.type }} : @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }} : @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }} : @{{ log.info.userUsername }}{{ log.info.userHost ? '@' + log.info.userHost : '' }} @@ -95,8 +93,6 @@ SPDX-License-Identifier: AGPL-3.0-only : @{{ log.info.fileUserUsername }}{{ log.info.fileUserHost ? '@' + log.info.fileUserHost : '' }} : {{ log.info.host }} : {{ log.info.host }} - : {{ log.info.host }} - : {{ log.info.host }} : {{ log.info.host }} : {{ log.info.host }} : {{ log.info.announcement.title }} diff --git a/packages/frontend/src/pages/instance-info.vue b/packages/frontend/src/pages/instance-info.vue index 813b1a471f..1ac95c3a95 100644 --- a/packages/frontend/src/pages/instance-info.vue +++ b/packages/frontend/src/pages/instance-info.vue @@ -118,7 +118,6 @@ SPDX-License-Identifier: AGPL-3.0-only {{ i18n.ts.blockedByBase }} {{ i18n.ts.blockThisInstance }} {{ i18n.ts.rejectQuotesInstance }} - {{ i18n.ts.markInstanceAsNSFW }} {{ i18n.ts.rejectReports }} {{ i18n.ts.mediaSilencedByBase }} {{ i18n.ts.mediaSilenceThisInstance }} @@ -259,7 +258,6 @@ const suspensionState = ref<'none' | 'manuallySuspended' | 'goneSuspended' | 'au const isSuspended = ref(false); const isBlocked = ref(false); const isSilenced = ref(false); -const isNSFW = ref(false); const rejectQuotes = ref(false); const rejectReports = ref(false); const isMediaSilenced = ref(false); @@ -320,13 +318,6 @@ const badges = computed(() => { style: 'warning', }); } - if (instance.value.isNSFW) { - arr.push({ - key: 'nsfw', - label: i18n.ts.nsfw, - style: 'warning', - }); - } if (instance.value.isBubbled) { arr.push({ key: 'bubbled', @@ -404,7 +395,6 @@ async function fetch(withHint = false): Promise { isSuspended.value = suspensionState.value !== 'none'; isBlocked.value = instance.value?.isBlocked ?? false; isSilenced.value = instance.value?.isSilenced ?? false; - isNSFW.value = instance.value?.isNSFW ?? false; rejectReports.value = instance.value?.rejectReports ?? false; rejectQuotes.value = instance.value?.rejectQuotes ?? false; isMediaSilenced.value = instance.value?.isMediaSilenced ?? false; @@ -470,18 +460,6 @@ async function toggleSuspended(): Promise { }); } -async function toggleNSFW(): Promise { - if (!iAmModerator) return; - await os.promiseDialog(async () => { - if (!instance.value) throw new Error('No instance?'); - await misskeyApi('admin/federation/update-instance', { - host: instance.value.host, - isNSFW: isNSFW.value, - }); - await fetch(); - }); -} - async function toggleRejectReports(): Promise { if (!iAmModerator) return; await os.promiseDialog(async () => { diff --git a/packages/misskey-js/etc/misskey-js.api.md b/packages/misskey-js/etc/misskey-js.api.md index 3575786e88..a6b5fa8338 100644 --- a/packages/misskey-js/etc/misskey-js.api.md +++ b/packages/misskey-js/etc/misskey-js.api.md @@ -2964,12 +2964,6 @@ type ModerationLog = { } | { type: 'setMandatoryCWForInstance'; info: ModerationLogPayloads['setMandatoryCWForInstance']; -} | { - type: 'setRemoteInstanceNSFW'; - info: ModerationLogPayloads['setRemoteInstanceNSFW']; -} | { - type: 'unsetRemoteInstanceNSFW'; - info: ModerationLogPayloads['unsetRemoteInstanceNSFW']; } | { type: 'resetPassword'; info: ModerationLogPayloads['resetPassword']; @@ -3111,7 +3105,7 @@ type ModerationLog = { }); // @public (undocumented) -export const moderationLogTypes: readonly ["updateServerSettings", "suspend", "approve", "decline", "unsuspend", "updateUserNote", "addCustomEmoji", "updateCustomEmoji", "deleteCustomEmoji", "assignRole", "unassignRole", "createRole", "updateRole", "deleteRole", "clearQueue", "promoteQueue", "deleteDriveFile", "deleteNote", "createGlobalAnnouncement", "createUserAnnouncement", "updateGlobalAnnouncement", "updateUserAnnouncement", "deleteGlobalAnnouncement", "deleteUserAnnouncement", "resetPassword", "setMandatoryCW", "setMandatoryCWForNote", "setMandatoryCWForInstance", "setRemoteInstanceNSFW", "unsetRemoteInstanceNSFW", "suspendRemoteInstance", "unsuspendRemoteInstance", "rejectRemoteInstanceReports", "acceptRemoteInstanceReports", "updateRemoteInstanceNote", "markSensitiveDriveFile", "unmarkSensitiveDriveFile", "resolveAbuseReport", "forwardAbuseReport", "updateAbuseReportNote", "createInvitation", "createAd", "updateAd", "deleteAd", "createAvatarDecoration", "updateAvatarDecoration", "deleteAvatarDecoration", "unsetUserAvatar", "unsetUserBanner", "createSystemWebhook", "updateSystemWebhook", "deleteSystemWebhook", "createAbuseReportNotificationRecipient", "updateAbuseReportNotificationRecipient", "deleteAbuseReportNotificationRecipient", "deleteAccount", "deletePage", "deleteFlash", "deleteGalleryPost", "deleteChatRoom"]; +export const moderationLogTypes: readonly ["updateServerSettings", "suspend", "approve", "decline", "unsuspend", "updateUserNote", "addCustomEmoji", "updateCustomEmoji", "deleteCustomEmoji", "assignRole", "unassignRole", "createRole", "updateRole", "deleteRole", "clearQueue", "promoteQueue", "deleteDriveFile", "deleteNote", "createGlobalAnnouncement", "createUserAnnouncement", "updateGlobalAnnouncement", "updateUserAnnouncement", "deleteGlobalAnnouncement", "deleteUserAnnouncement", "resetPassword", "setMandatoryCW", "setMandatoryCWForNote", "setMandatoryCWForInstance", "suspendRemoteInstance", "unsuspendRemoteInstance", "rejectRemoteInstanceReports", "acceptRemoteInstanceReports", "updateRemoteInstanceNote", "markSensitiveDriveFile", "unmarkSensitiveDriveFile", "resolveAbuseReport", "forwardAbuseReport", "updateAbuseReportNote", "createInvitation", "createAd", "updateAd", "deleteAd", "createAvatarDecoration", "updateAvatarDecoration", "deleteAvatarDecoration", "unsetUserAvatar", "unsetUserBanner", "createSystemWebhook", "updateSystemWebhook", "deleteSystemWebhook", "createAbuseReportNotificationRecipient", "updateAbuseReportNotificationRecipient", "deleteAbuseReportNotificationRecipient", "deleteAccount", "deletePage", "deleteFlash", "deleteGalleryPost", "deleteChatRoom"]; // @public (undocumented) type MuteCreateRequest = operations['mute___create']['requestBody']['content']['application/json']; diff --git a/packages/misskey-js/src/autogen/types.ts b/packages/misskey-js/src/autogen/types.ts index f41bca6fb3..ead1ca0c27 100644 --- a/packages/misskey-js/src/autogen/types.ts +++ b/packages/misskey-js/src/autogen/types.ts @@ -5346,7 +5346,6 @@ export type components = { infoUpdatedAt: string | null; /** Format: date-time */ latestRequestReceivedAt: string | null; - isNSFW: boolean; rejectReports: boolean; rejectQuotes: boolean; moderationNote?: string | null; @@ -8909,7 +8908,6 @@ export type operations = { 'application/json': { host: string; isSuspended?: boolean; - isNSFW?: boolean; rejectReports?: boolean; moderationNote?: string; rejectQuotes?: boolean; diff --git a/packages/misskey-js/src/consts.ts b/packages/misskey-js/src/consts.ts index 25e02a9f1c..51c6c85053 100644 --- a/packages/misskey-js/src/consts.ts +++ b/packages/misskey-js/src/consts.ts @@ -152,8 +152,6 @@ export const moderationLogTypes = [ 'setMandatoryCW', 'setMandatoryCWForNote', 'setMandatoryCWForInstance', - 'setRemoteInstanceNSFW', - 'unsetRemoteInstanceNSFW', 'suspendRemoteInstance', 'unsuspendRemoteInstance', 'rejectRemoteInstanceReports', @@ -360,14 +358,6 @@ export type ModerationLogPayloads = { oldCW: string | null; host: string; }; - setRemoteInstanceNSFW: { - id: string; - host: string; - }; - unsetRemoteInstanceNSFW: { - id: string; - host: string; - }; suspendRemoteInstance: { id: string; host: string; diff --git a/packages/misskey-js/src/entities.ts b/packages/misskey-js/src/entities.ts index b42d52115c..be3f83fda5 100644 --- a/packages/misskey-js/src/entities.ts +++ b/packages/misskey-js/src/entities.ts @@ -139,12 +139,6 @@ export type ModerationLog = { } | { type: 'setMandatoryCWForInstance'; info: ModerationLogPayloads['setMandatoryCWForInstance']; -} | { - type: 'setRemoteInstanceNSFW'; - info: ModerationLogPayloads['setRemoteInstanceNSFW']; -} | { - type: 'unsetRemoteInstanceNSFW'; - info: ModerationLogPayloads['unsetRemoteInstanceNSFW']; } | { type: 'resetPassword'; info: ModerationLogPayloads['resetPassword']; diff --git a/sharkey-locales/de-DE.yml b/sharkey-locales/de-DE.yml index bde6c9d759..7c7fcced01 100644 --- a/sharkey-locales/de-DE.yml +++ b/sharkey-locales/de-DE.yml @@ -221,8 +221,6 @@ _moderationLogTypes: approve: "Genehmigt" decline: "Abgelehnt" setMandatoryCW: "Inhaltswarnung für Benutzer gesetzt" - setRemoteInstanceNSFW: "Fremde Instanz als NSFW markiert" - unsetRemoteInstanceNSFW: "NSFW-Markierung für fremde Instanz entfernt" rejectRemoteInstanceReports: "Meldungen von fremder Instanz abgelehnt" acceptRemoteInstanceReports: "Meldungen von fremder Instanz akzeptiert" rejectQuotesUser: "Zitate von Benutzer gesperrt/entfernt" diff --git a/sharkey-locales/en-US.yml b/sharkey-locales/en-US.yml index 96a3d58fe0..f3e3951a7b 100644 --- a/sharkey-locales/en-US.yml +++ b/sharkey-locales/en-US.yml @@ -348,8 +348,6 @@ _moderationLogTypes: setMandatoryCW: "Set content warning for user" setMandatoryCWForNote: "Set content warning for note" setMandatoryCWForInstance: "Set content warning for instance" - setRemoteInstanceNSFW: "Set remote instance as NSFW" - unsetRemoteInstanceNSFW: "Unset remote instance as NSFW" rejectRemoteInstanceReports: "Rejected reports from remote instance" acceptRemoteInstanceReports: "Accepted reports from remote instance" rejectQuotesUser: "Blocked/Stripped quote posts from user" diff --git a/sharkey-locales/ja-JP.yml b/sharkey-locales/ja-JP.yml index 46566c39ac..9f326ed8e4 100644 --- a/sharkey-locales/ja-JP.yml +++ b/sharkey-locales/ja-JP.yml @@ -277,8 +277,6 @@ _abuseReport: webhook: "指定したSystemWebhookに通知を送ります(通報を受けた時と通報を解決した時にそれぞれ発信)" _moderationLogTypes: approve: "承認済み" - setRemoteInstanceNSFW: "Set remote instance as NSFW" - unsetRemoteInstanceNSFW: "Set remote instance as NSFW" rejectRemoteInstanceReports: "Rejected reports from remote instance" acceptRemoteInstanceReports: "Accepted reports from remote instance" _mfm: diff --git a/sharkey-locales/th-TH.yml b/sharkey-locales/th-TH.yml index 22d1eda8dd..5160361f46 100644 --- a/sharkey-locales/th-TH.yml +++ b/sharkey-locales/th-TH.yml @@ -46,8 +46,6 @@ _moderationLogTypes: approve: "ที่ได้รับการอนุมัติ" decline: "ปฏิเสธ" setMandatoryCW: "ตั้งค่าคำเตือนเนื้อหาสำหรับผู้ใช้" - setRemoteInstanceNSFW: "ตั้งค่าเซิร์ฟเวอร์ระยะไกลเป็น NSFW" - unsetRemoteInstanceNSFW: "ปิดการใช้งานการตั้งค่าเซิร์ฟเวอร์ระยะไกลเป็น NSFW" rejectRemoteInstanceReports: "รายงานถูกปฏิเสธจากเซิร์ฟเวอร์ระยะไกล" acceptRemoteInstanceReports: "รายงานได้รับการยอมรับจากเซิร์ฟเวอร์ระยะไกล" rejectQuotesUser: "โพสต์คำพูดของผู้ใช้ถูกบล็อค/ลบ" diff --git a/sharkey-locales/vi-VN.yml b/sharkey-locales/vi-VN.yml index c382e317e6..2ff8bd7225 100644 --- a/sharkey-locales/vi-VN.yml +++ b/sharkey-locales/vi-VN.yml @@ -41,8 +41,6 @@ _moderationLogTypes: approve: "Đã chấp thuận" decline: "Từ chối" setMandatoryCW: "Đặt cảnh báo nội dung cho người dùng" - setRemoteInstanceNSFW: "Đặt máy chủ từ xa thành NSFW" - unsetRemoteInstanceNSFW: "Hủy cài đặt máy chủ từ xa thành NSFW" rejectRemoteInstanceReports: "Báo cáo bị từ chối từ máy chủ từ xa" acceptRemoteInstanceReports: "Đã chấp nhận báo cáo từ máy chủ từ xa" rejectQuotesUser: "Đã chặn/Xóa bài đăng trích dẫn của người dùng"