fix(mod queue): restrict trash action to trash board

This commit is contained in:
Tommaso Casaburi
2026-07-04 23:48:43 +07:00
parent dad43a0830
commit 9dfd638b71
45 changed files with 383 additions and 439 deletions
+7 -7
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "يجب عليك الرد برابط.", "reply_link_required_alert": "يجب عليك الرد برابط.",
"reply_media_link_required_alert": "يجب عليك الرد برابط لصورة أو فيديو.", "reply_media_link_required_alert": "يجب عليك الرد برابط لصورة أو فيديو.",
"reply_links_not_allowed_alert": "لا يُسمح بروابط الردود في هذه اللوحة.", "reply_links_not_allowed_alert": "لا يُسمح بروابط الردود في هذه اللوحة.",
"transfer": "نقل", "modQueue.transferTitle": "انقل المنشور إلى /trash/",
"modQueue.transferTitle": "نقل المنشور",
"modQueue.transferSource": "من", "modQueue.transferSource": "من",
"modQueue.transferTarget": "إلى منتدى", "modQueue.transferTarget": "إلى",
"modQueue.transferFields": "نسخ الحقول", "modQueue.transferFields": "نسخ الحقول",
"modQueue.transferNoFields": "اختر حقلًا واحدًا على الأقل للنسخ.", "modQueue.transferNoFields": "اختر حقلًا واحدًا على الأقل للنسخ.",
"modQueue.transferSuccess": "تم النقل. يشير المنشور الأصلي الآن إلى اللوحة الجديدة.", "modQueue.transferSuccess": "نُقل إلى /trash/. يشير المنشور الأصلي الآن إلى /trash/.",
"transferred": "منقول", "transferred": "منقول",
"modQueue.transferTitleWithNumber": "نقل المنشور رقم {{number}}", "modQueue.transferTitleWithNumber": "انقل المنشور رقم {{number}} إلى /trash/",
"modQueue.transferRecreateNotice": "هذا ليس نقلا حقيقيا على مستوى البروتوكول. يعيد 5chan إنشاء المنشور على اللوحة المحددة ويزيل الأصل.", "modQueue.transferRecreateNotice": "هذا ليس نقلاً حقيقياً على مستوى البروتوكول. يعيد 5chan إنشاء المنشور على /trash/ ويزيل الأصل.",
"modQueue.transferRepliesNotice": "لن تُنقل الردود. سيتم حذفها مع المنشور الأصلي.", "modQueue.transferRepliesNotice": "لن تُنقل الردود. سيتم حذفها مع المنشور الأصلي.",
"modQueue.transferTemporaryAccountNotice": "سينشئ 5chan حسابا مؤقتا جديدا لهذا المنشور المنسوخ فقط، ثم يحذفه بعد النشر." "modQueue.transferTemporaryAccountNotice": "سينشئ 5chan حسابا مؤقتا جديدا لهذا المنشور المنسوخ فقط، ثم يحذفه بعد النشر.",
"trash": "سلة المهملات"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "আপনাকে একটি লিঙ্ক দিয়ে উত্তর দিতে হবে।", "reply_link_required_alert": "আপনাকে একটি লিঙ্ক দিয়ে উত্তর দিতে হবে।",
"reply_media_link_required_alert": "আপনাকে একটি ছবি বা ভিডিও লিঙ্ক দিয়ে উত্তর দিতে হবে।", "reply_media_link_required_alert": "আপনাকে একটি ছবি বা ভিডিও লিঙ্ক দিয়ে উত্তর দিতে হবে।",
"reply_links_not_allowed_alert": "এই বোর্ডে উত্তরের লিঙ্ক অনুমোদিত নয়।", "reply_links_not_allowed_alert": "এই বোর্ডে উত্তরের লিঙ্ক অনুমোদিত নয়।",
"transfer": "স্থানান্তর", "modQueue.transferTitle": "পোস্টটি /trash/-এ সরান",
"modQueue.transferTitle": "পোস্ট স্থানান্তর",
"modQueue.transferSource": "থেকে", "modQueue.transferSource": "থেকে",
"modQueue.transferTarget": "বোর্ডে", "modQueue.transferTarget": "গন্তব্য",
"modQueue.transferFields": "ক্ষেত্র কপি করুন", "modQueue.transferFields": "ক্ষেত্র কপি করুন",
"modQueue.transferNoFields": "কপি করতে অন্তত একটি ক্ষেত্র নির্বাচন করুন।", "modQueue.transferNoFields": "কপি করতে অন্তত একটি ক্ষেত্র নির্বাচন করুন।",
"modQueue.transferSuccess": "স্থানান্তরিত হয়েছে। মূল পোস্টটি এখন নতুন বোর্ডের দিকে নির্দেশ করে।", "modQueue.transferSuccess": "/trash/-এ সরানো হয়েছে। মূল পোস্টটি এখন /trash/-এর দিকে নির্দেশ করে।",
"transferred": "স্থানান্তরিত", "transferred": "স্থানান্তরিত",
"modQueue.transferTitleWithNumber": "পোস্ট No.{{number}} স্থানান্তর", "modQueue.transferTitleWithNumber": "পোস্ট No.{{number}} /trash/-এ সরান",
"modQueue.transferRecreateNotice": "এটি প্রোটোকলের আসল স্থানান্তর নয়। 5chan নির্বাচিত বোর্ডে পোস্টটি আবার তৈরি করে এবং আসলটি সরিয়ে দেয়।", "modQueue.transferRecreateNotice": "এটি প্রোটোকল স্তরের আসল স্থানান্তর নয়। 5chan পোস্টটি /trash/-এ আবার তৈরি করে এবং আসলটি সরিয়ে দেয়।",
"modQueue.transferRepliesNotice": "উত্তরগুলো স্থানান্তরিত হবে না। সেগুলো মূল পোস্টের সঙ্গে মুছে যাবে।", "modQueue.transferRepliesNotice": "উত্তরগুলো সরানো হবে না। সেগুলো মূল পোস্টের সঙ্গে মুছে যাবে।",
"modQueue.transferTemporaryAccountNotice": "5chan শুধু এই কপি করা পোস্টের জন্য একটি নতুন অস্থায়ী অ্যাকাউন্ট তৈরি করবে, তারপর প্রকাশের পর সেটি মুছে দেবে।" "modQueue.transferTemporaryAccountNotice": "5chan শুধু এই কপি করা পোস্টের জন্য একটি নতুন অস্থায়ী অ্যাকাউন্ট তৈরি করবে, তারপর প্রকাশের পর সেটি মুছে দেবে।",
"trash": "ট্র্যাশ"
} }
+7 -7
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Musíte odpovědět odkazem.", "reply_link_required_alert": "Musíte odpovědět odkazem.",
"reply_media_link_required_alert": "Musíte odpovědět odkazem na obrázek nebo video.", "reply_media_link_required_alert": "Musíte odpovědět odkazem na obrázek nebo video.",
"reply_links_not_allowed_alert": "Odkazy v odpovědích nejsou na této nástěnce povoleny.", "reply_links_not_allowed_alert": "Odkazy v odpovědích nejsou na této nástěnce povoleny.",
"transfer": "Přesunout", "modQueue.transferTitle": "Přesunout příspěvek do /trash/",
"modQueue.transferTitle": "Přesunout příspěvek",
"modQueue.transferSource": "Od", "modQueue.transferSource": "Od",
"modQueue.transferTarget": "Do fóra", "modQueue.transferTarget": "Do",
"modQueue.transferFields": "Kopírovat pole", "modQueue.transferFields": "Kopírovat pole",
"modQueue.transferNoFields": "Vyberte alespoň jedno pole ke kopírování.", "modQueue.transferNoFields": "Vyberte alespoň jedno pole ke kopírování.",
"modQueue.transferSuccess": "Přesunuto. Původní příspěvek teď odkazuje na novou nástěnku.", "modQueue.transferSuccess": "Přesunuto do /trash/. Původní příspěvek teď odkazuje na /trash/.",
"transferred": "Přesunuto", "transferred": "Přesunuto",
"modQueue.transferTitleWithNumber": "Přesunout příspěvek č. {{number}}", "modQueue.transferTitleWithNumber": "Přesunout příspěvek č. {{number}} do /trash/",
"modQueue.transferRecreateNotice": "Toto není skutečný protokolový přesun. 5chan příspěvek znovu vytvoří na vybrané nástěnce a původní odstraní.", "modQueue.transferRecreateNotice": "Toto není skutečný protokolový přesun. 5chan příspěvek znovu vytvoří v /trash/ a původní odstraní.",
"modQueue.transferRepliesNotice": "Odpovědi se nepřesunou. Budou odstraněny spolu s původním příspěvkem.", "modQueue.transferRepliesNotice": "Odpovědi se nepřesunou. Budou odstraněny spolu s původním příspěvkem.",
"modQueue.transferTemporaryAccountNotice": "5chan vytvoří nový dočasný účet jen pro tento zkopírovaný příspěvek a po zveřejnění ho smaže." "modQueue.transferTemporaryAccountNotice": "5chan vytvoří nový dočasný účet jen pro tento zkopírovaný příspěvek a po zveřejnění ho smaže.",
"trash": "Koš"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Du skal svare med et link.", "reply_link_required_alert": "Du skal svare med et link.",
"reply_media_link_required_alert": "Du skal svare med et billed- eller videolink.", "reply_media_link_required_alert": "Du skal svare med et billed- eller videolink.",
"reply_links_not_allowed_alert": "Svarlinks er ikke tilladt på dette board.", "reply_links_not_allowed_alert": "Svarlinks er ikke tilladt på dette board.",
"transfer": "Overfør", "modQueue.transferTitle": "Flyt indlæg til /trash/",
"modQueue.transferTitle": "Overfør indlæg",
"modQueue.transferSource": "Fra", "modQueue.transferSource": "Fra",
"modQueue.transferTarget": "Til forum", "modQueue.transferTarget": "Til",
"modQueue.transferFields": "Kopiér felter", "modQueue.transferFields": "Kopiér felter",
"modQueue.transferNoFields": "Vælg mindst ét felt, der skal kopieres.", "modQueue.transferNoFields": "Vælg mindst ét felt, der skal kopieres.",
"modQueue.transferSuccess": "Overført. Det oprindelige opslag peger nu på det nye board.", "modQueue.transferSuccess": "Flyttet til /trash/. Det oprindelige opslag peger nu på /trash/.",
"transferred": "Overført", "transferred": "Overført",
"modQueue.transferTitleWithNumber": "Overfør opslag No.{{number}}", "modQueue.transferTitleWithNumber": "Flyt opslag No.{{number}} til /trash/",
"modQueue.transferRecreateNotice": "Dette er ikke en rigtig protokoloverførsel. 5chan genskaber opslaget på det valgte board og fjerner originalen.", "modQueue.transferRecreateNotice": "Dette er ikke en rigtig protokoloverførsel. 5chan genskaber opslaget i /trash/ og fjerner originalen.",
"modQueue.transferRepliesNotice": "Svar bliver ikke overført. De slettes sammen med det oprindelige opslag.", "modQueue.transferRepliesNotice": "Svar flyttes ikke. De slettes sammen med det oprindelige opslag.",
"modQueue.transferTemporaryAccountNotice": "5chan opretter en ny midlertidig konto kun til dette kopierede opslag og sletter den efter publicering." "modQueue.transferTemporaryAccountNotice": "5chan opretter en ny midlertidig konto kun til dette kopierede opslag og sletter den efter publicering.",
"trash": "Papirkurv"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Du musst mit einem Link antworten.", "reply_link_required_alert": "Du musst mit einem Link antworten.",
"reply_media_link_required_alert": "Du musst mit einem Bild- oder Videolink antworten.", "reply_media_link_required_alert": "Du musst mit einem Bild- oder Videolink antworten.",
"reply_links_not_allowed_alert": "Antwortlinks sind auf diesem Board nicht erlaubt.", "reply_links_not_allowed_alert": "Antwortlinks sind auf diesem Board nicht erlaubt.",
"transfer": "Übertragen", "modQueue.transferTitle": "Beitrag nach /trash/ verschieben",
"modQueue.transferTitle": "Beitrag übertragen",
"modQueue.transferSource": "Von", "modQueue.transferSource": "Von",
"modQueue.transferTarget": "Zum Forum", "modQueue.transferTarget": "Nach",
"modQueue.transferFields": "Felder kopieren", "modQueue.transferFields": "Felder kopieren",
"modQueue.transferNoFields": "Wählen Sie mindestens ein Feld zum Kopieren aus.", "modQueue.transferNoFields": "Wählen Sie mindestens ein Feld zum Kopieren aus.",
"modQueue.transferSuccess": "Übertragen. Der ursprüngliche Beitrag verweist jetzt auf das neue Board.", "modQueue.transferSuccess": "Nach /trash/ verschoben. Der ursprüngliche Beitrag verweist jetzt auf /trash/.",
"transferred": "Übertragen", "transferred": "Übertragen",
"modQueue.transferTitleWithNumber": "Beitrag Nr. {{number}} übertragen", "modQueue.transferTitleWithNumber": "Beitrag Nr. {{number}} nach /trash/ verschieben",
"modQueue.transferRecreateNotice": "Das ist keine echte Protokoll-Übertragung. 5chan erstellt den Beitrag auf dem gewählten Board neu und entfernt das Original.", "modQueue.transferRecreateNotice": "Das ist keine echte Protokoll-Übertragung. 5chan erstellt den Beitrag in /trash/ neu und entfernt das Original.",
"modQueue.transferRepliesNotice": "Antworten werden nicht übertragen. Sie werden mit dem ursprünglichen Beitrag gelöscht.", "modQueue.transferRepliesNotice": "Antworten werden nicht verschoben. Sie werden mit dem ursprünglichen Beitrag gelöscht.",
"modQueue.transferTemporaryAccountNotice": "5chan erstellt nur für diesen kopierten Beitrag ein neues temporäres Konto und löscht es nach dem Veröffentlichen." "modQueue.transferTemporaryAccountNotice": "5chan erstellt nur für diesen kopierten Beitrag ein neues temporäres Konto und löscht es nach dem Veröffentlichen.",
"trash": "Papierkorb"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Πρέπει να απαντήσετε με έναν σύνδεσμο.", "reply_link_required_alert": "Πρέπει να απαντήσετε με έναν σύνδεσμο.",
"reply_media_link_required_alert": "Πρέπει να απαντήσετε με σύνδεσμο εικόνας ή βίντεο.", "reply_media_link_required_alert": "Πρέπει να απαντήσετε με σύνδεσμο εικόνας ή βίντεο.",
"reply_links_not_allowed_alert": "Οι σύνδεσμοι στις απαντήσεις δεν επιτρέπονται σε αυτόν τον πίνακα.", "reply_links_not_allowed_alert": "Οι σύνδεσμοι στις απαντήσεις δεν επιτρέπονται σε αυτόν τον πίνακα.",
"transfer": "Μεταφορά", "modQueue.transferTitle": "Μετακίνηση ανάρτησης στο /trash/",
"modQueue.transferTitle": "Μεταφορά δημοσίευσης",
"modQueue.transferSource": "Από", "modQueue.transferSource": "Από",
"modQueue.transferTarget": "Στο φόρουμ", "modQueue.transferTarget": "Προς",
"modQueue.transferFields": "Αντιγραφή πεδίων", "modQueue.transferFields": "Αντιγραφή πεδίων",
"modQueue.transferNoFields": "Επιλέξτε τουλάχιστον ένα πεδίο για αντιγραφή.", "modQueue.transferNoFields": "Επιλέξτε τουλάχιστον ένα πεδίο για αντιγραφή.",
"modQueue.transferSuccess": "Μεταφέρθηκε. Η αρχική ανάρτηση δείχνει πλέον στον νέο πίνακα.", "modQueue.transferSuccess": "Μετακινήθηκε στο /trash/. Η αρχική ανάρτηση δείχνει πλέον στο /trash/.",
"transferred": "Μεταφέρθηκε", "transferred": "Μεταφέρθηκε",
"modQueue.transferTitleWithNumber": "Μεταφορά ανάρτησης No.{{number}}", "modQueue.transferTitleWithNumber": "Μετακίνηση ανάρτησης No.{{number}} στο /trash/",
"modQueue.transferRecreateNotice": "Αυτό δεν είναι πραγματική μεταφορά στο πρωτόκολλο. Το 5chan αναδημιουργεί την ανάρτηση στον επιλεγμένο πίνακα και αφαιρεί την αρχική.", "modQueue.transferRecreateNotice": "Αυτό δεν είναι πραγματική μεταφορά στο πρωτόκολλο. Το 5chan αναδημιουργεί την ανάρτηση στο /trash/ και αφαιρεί την αρχική.",
"modQueue.transferRepliesNotice": "Οι απαντήσεις δεν μεταφέρονται. Θα διαγραφούν μαζί με την αρχική ανάρτηση.", "modQueue.transferRepliesNotice": "Οι απαντήσεις δεν μετακινούνται. Θα διαγραφούν μαζί με την αρχική ανάρτηση.",
"modQueue.transferTemporaryAccountNotice": "Το 5chan θα δημιουργήσει έναν νέο προσωρινό λογαριασμό μόνο για αυτό το αντιγραμμένο post και θα τον διαγράψει μετά τη δημοσίευση." "modQueue.transferTemporaryAccountNotice": "Το 5chan θα δημιουργήσει έναν νέο προσωρινό λογαριασμό μόνο για αυτό το αντιγραμμένο post και θα τον διαγράψει μετά τη δημοσίευση.",
"trash": "Κάδος"
} }
+8 -8
View File
@@ -469,16 +469,16 @@
"reply_link_required_alert": "You must reply with a link.", "reply_link_required_alert": "You must reply with a link.",
"reply_media_link_required_alert": "You must reply with an image or video link.", "reply_media_link_required_alert": "You must reply with an image or video link.",
"reply_links_not_allowed_alert": "Reply links are not allowed on this board.", "reply_links_not_allowed_alert": "Reply links are not allowed on this board.",
"transfer": "Transfer", "modQueue.transferTitle": "Move post to /trash/",
"modQueue.transferTitle": "Transfer post",
"modQueue.transferSource": "From", "modQueue.transferSource": "From",
"modQueue.transferTarget": "To board", "modQueue.transferTarget": "To",
"modQueue.transferFields": "Copy fields", "modQueue.transferFields": "Copy fields",
"modQueue.transferNoFields": "Choose at least one field to copy.", "modQueue.transferNoFields": "Choose at least one field to copy.",
"modQueue.transferSuccess": "Transferred. The original post now points to the new board.", "modQueue.transferSuccess": "Moved to /trash/. The original post now points to /trash/.",
"transferred": "Transferred", "transferred": "Transferred",
"modQueue.transferTitleWithNumber": "Transfer Post No.{{number}}", "modQueue.transferTitleWithNumber": "Move Post No.{{number}} to /trash/",
"modQueue.transferRecreateNotice": "This is not a real protocol transfer. 5chan recreates the post on the selected board and removes the original.", "modQueue.transferRecreateNotice": "This is not a real protocol transfer. 5chan recreates the post on /trash/ and removes the original.",
"modQueue.transferRepliesNotice": "Replies are not transferred. They are deleted with the original post.", "modQueue.transferRepliesNotice": "Replies are not moved. They are deleted with the original post.",
"modQueue.transferTemporaryAccountNotice": "5chan will create a new temporary account just for this copied post, then delete it after publishing." "modQueue.transferTemporaryAccountNotice": "5chan will create a new temporary account just for this copied post, then delete it after publishing.",
"trash": "Trash"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Debes responder con un enlace.", "reply_link_required_alert": "Debes responder con un enlace.",
"reply_media_link_required_alert": "Debes responder con un enlace a una imagen o un video.", "reply_media_link_required_alert": "Debes responder con un enlace a una imagen o un video.",
"reply_links_not_allowed_alert": "Los enlaces en respuestas no están permitidos en este tablón.", "reply_links_not_allowed_alert": "Los enlaces en respuestas no están permitidos en este tablón.",
"transfer": "Transferir", "modQueue.transferTitle": "Mover publicación a /trash/",
"modQueue.transferTitle": "Transferir publicación",
"modQueue.transferSource": "De", "modQueue.transferSource": "De",
"modQueue.transferTarget": "Al foro", "modQueue.transferTarget": "A",
"modQueue.transferFields": "Copiar campos", "modQueue.transferFields": "Copiar campos",
"modQueue.transferNoFields": "Elige al menos un campo para copiar.", "modQueue.transferNoFields": "Elige al menos un campo para copiar.",
"modQueue.transferSuccess": "Transferido. La publicación original ahora apunta al nuevo foro.", "modQueue.transferSuccess": "Movida a /trash/. La publicación original ahora apunta a /trash/.",
"transferred": "Transferido", "transferred": "Transferido",
"modQueue.transferTitleWithNumber": "Transferir publicación No.{{number}}", "modQueue.transferTitleWithNumber": "Mover publicación No.{{number}} a /trash/",
"modQueue.transferRecreateNotice": "Esto no es una transferencia real del protocolo. 5chan vuelve a crear la publicación en el foro seleccionado y elimina la original.", "modQueue.transferRecreateNotice": "Esto no es una transferencia real del protocolo. 5chan vuelve a crear la publicación en /trash/ y elimina la original.",
"modQueue.transferRepliesNotice": "Las respuestas no se transfieren. Se eliminan junto con la publicación original.", "modQueue.transferRepliesNotice": "Las respuestas no se mueven. Se eliminan junto con la publicación original.",
"modQueue.transferTemporaryAccountNotice": "5chan creará una nueva cuenta temporal solo para esta publicación copiada y la eliminará después de publicarla." "modQueue.transferTemporaryAccountNotice": "5chan creará una nueva cuenta temporal solo para esta publicación copiada y la eliminará después de publicarla.",
"trash": "Papelera"
} }
+7 -7
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "باید با یک پیوند پاسخ دهید.", "reply_link_required_alert": "باید با یک پیوند پاسخ دهید.",
"reply_media_link_required_alert": "باید با یک پیوند تصویر یا ویدیو پاسخ دهید.", "reply_media_link_required_alert": "باید با یک پیوند تصویر یا ویدیو پاسخ دهید.",
"reply_links_not_allowed_alert": "پیوندها در پاسخ‌ها در این برد مجاز نیستند.", "reply_links_not_allowed_alert": "پیوندها در پاسخ‌ها در این برد مجاز نیستند.",
"transfer": "انتقال", "modQueue.transferTitle": "انتقال پست به /trash/",
"modQueue.transferTitle": "انتقال پست",
"modQueue.transferSource": "از", "modQueue.transferSource": "از",
"modQueue.transferTarget": "به تالار", "modQueue.transferTarget": "به",
"modQueue.transferFields": "کپی فیلدها", "modQueue.transferFields": "کپی فیلدها",
"modQueue.transferNoFields": "حداقل یک فیلد برای کپی انتخاب کنید.", "modQueue.transferNoFields": "حداقل یک فیلد برای کپی انتخاب کنید.",
"modQueue.transferSuccess": "منتقل شد. پست اصلی اکنون به برد جدید اشاره می‌کند.", "modQueue.transferSuccess": "به /trash/ منتقل شد. پست اصلی اکنون به /trash/ اشاره می‌کند.",
"transferred": "منتقل شد", "transferred": "منتقل شد",
"modQueue.transferTitleWithNumber": "انتقال پست شماره {{number}}", "modQueue.transferTitleWithNumber": "انتقال پست شماره {{number}} به /trash/",
"modQueue.transferRecreateNotice": "این یک انتقال واقعی در سطح پروتکل نیست. 5chan پست را در برد انتخاب‌شده دوباره می‌سازد و نسخه اصلی را حذف می‌کند.", "modQueue.transferRecreateNotice": "این یک انتقال واقعی در سطح پروتکل نیست. 5chan پست را در /trash/ دوباره می‌سازد و نسخه اصلی را حذف می‌کند.",
"modQueue.transferRepliesNotice": "پاسخ‌ها منتقل نمی‌شوند. آن‌ها همراه با پست اصلی حذف می‌شوند.", "modQueue.transferRepliesNotice": "پاسخ‌ها منتقل نمی‌شوند. آن‌ها همراه با پست اصلی حذف می‌شوند.",
"modQueue.transferTemporaryAccountNotice": "5chan فقط برای این پست کپی‌شده یک حساب موقت جدید می‌سازد و پس از انتشار آن را حذف می‌کند." "modQueue.transferTemporaryAccountNotice": "5chan فقط برای این پست کپی‌شده یک حساب موقت جدید می‌سازد و پس از انتشار آن را حذف می‌کند.",
"trash": "زباله‌دان"
} }
+7 -7
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Sinun on vastattava linkillä.", "reply_link_required_alert": "Sinun on vastattava linkillä.",
"reply_media_link_required_alert": "Sinun on vastattava kuva- tai videolinkillä.", "reply_media_link_required_alert": "Sinun on vastattava kuva- tai videolinkillä.",
"reply_links_not_allowed_alert": "Vastauslinkit eivät ole sallittuja tällä laudalla.", "reply_links_not_allowed_alert": "Vastauslinkit eivät ole sallittuja tällä laudalla.",
"transfer": "Siirrä", "modQueue.transferTitle": "Siirrä viesti /trash/-laudalle",
"modQueue.transferTitle": "Siirrä viesti",
"modQueue.transferSource": "Mistä", "modQueue.transferSource": "Mistä",
"modQueue.transferTarget": "Foorumille", "modQueue.transferTarget": "Kohde",
"modQueue.transferFields": "Kopioi kentät", "modQueue.transferFields": "Kopioi kentät",
"modQueue.transferNoFields": "Valitse vähintään yksi kopioitava kenttä.", "modQueue.transferNoFields": "Valitse vähintään yksi kopioitava kenttä.",
"modQueue.transferSuccess": "Siirretty. Alkuperäinen viesti osoittaa nyt uudelle laudalle.", "modQueue.transferSuccess": "Siirretty /trash/-laudalle. Alkuperäinen viesti osoittaa nyt /trash/-laudalle.",
"transferred": "Siirretty", "transferred": "Siirretty",
"modQueue.transferTitleWithNumber": "Siirrä viesti No.{{number}}", "modQueue.transferTitleWithNumber": "Siirrä viesti No.{{number}} /trash/-laudalle",
"modQueue.transferRecreateNotice": "Tämä ei ole oikea protokollatason siirto. 5chan luo viestin uudelleen valitulle laudalle ja poistaa alkuperäisen.", "modQueue.transferRecreateNotice": "Tämä ei ole oikea protokollatason siirto. 5chan luo viestin uudelleen /trash/-laudalle ja poistaa alkuperäisen.",
"modQueue.transferRepliesNotice": "Vastauksia ei siirretä. Ne poistetaan alkuperäisen viestin mukana.", "modQueue.transferRepliesNotice": "Vastauksia ei siirretä. Ne poistetaan alkuperäisen viestin mukana.",
"modQueue.transferTemporaryAccountNotice": "5chan luo uuden väliaikaisen tilin vain tätä kopioitua viestiä varten ja poistaa sen julkaisun jälkeen." "modQueue.transferTemporaryAccountNotice": "5chan luo uuden väliaikaisen tilin vain tätä kopioitua viestiä varten ja poistaa sen julkaisun jälkeen.",
"trash": "Roskakori"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Kailangan mong tumugon gamit ang isang link.", "reply_link_required_alert": "Kailangan mong tumugon gamit ang isang link.",
"reply_media_link_required_alert": "Kailangan mong tumugon gamit ang link ng larawan o video.", "reply_media_link_required_alert": "Kailangan mong tumugon gamit ang link ng larawan o video.",
"reply_links_not_allowed_alert": "Hindi pinapayagan ang mga link sa tugon sa board na ito.", "reply_links_not_allowed_alert": "Hindi pinapayagan ang mga link sa tugon sa board na ito.",
"transfer": "Ilipat", "modQueue.transferTitle": "Ilipat ang post sa /trash/",
"modQueue.transferTitle": "Ilipat ang post",
"modQueue.transferSource": "Mula sa", "modQueue.transferSource": "Mula sa",
"modQueue.transferTarget": "Sa board", "modQueue.transferTarget": "Sa",
"modQueue.transferFields": "Kopyahin ang mga field", "modQueue.transferFields": "Kopyahin ang mga field",
"modQueue.transferNoFields": "Pumili ng kahit isang field na kopyahin.", "modQueue.transferNoFields": "Pumili ng kahit isang field na kopyahin.",
"modQueue.transferSuccess": "Nailipat. Nakaturo na ngayon ang orihinal na post sa bagong board.", "modQueue.transferSuccess": "Inilipat sa /trash/. Nakaturo na ngayon ang orihinal na post sa /trash/.",
"transferred": "Nailipat", "transferred": "Nailipat",
"modQueue.transferTitleWithNumber": "Ilipat ang post No.{{number}}", "modQueue.transferTitleWithNumber": "Ilipat ang post No.{{number}} sa /trash/",
"modQueue.transferRecreateNotice": "Hindi ito tunay na protocol transfer. Muling ginagawa ng 5chan ang post sa napiling board at inaalis ang orihinal.", "modQueue.transferRecreateNotice": "Hindi ito tunay na protocol transfer. Muling ginagawa ng 5chan ang post sa /trash/ at inaalis ang orihinal.",
"modQueue.transferRepliesNotice": "Hindi maililipat ang mga reply. Mabubura ang mga ito kasama ng orihinal na post.", "modQueue.transferRepliesNotice": "Hindi inililipat ang mga reply. Mabubura ang mga ito kasama ng orihinal na post.",
"modQueue.transferTemporaryAccountNotice": "Gagawa ang 5chan ng bagong pansamantalang account para lang sa kinopyang post na ito, at buburahin ito pagkatapos ma-publish." "modQueue.transferTemporaryAccountNotice": "Gagawa ang 5chan ng bagong pansamantalang account para lang sa kinopyang post na ito, at buburahin ito pagkatapos ma-publish.",
"trash": "Basura"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Vous devez répondre avec un lien.", "reply_link_required_alert": "Vous devez répondre avec un lien.",
"reply_media_link_required_alert": "Vous devez répondre avec un lien d'image ou de vidéo.", "reply_media_link_required_alert": "Vous devez répondre avec un lien d'image ou de vidéo.",
"reply_links_not_allowed_alert": "Les liens dans les réponses ne sont pas autorisés sur ce board.", "reply_links_not_allowed_alert": "Les liens dans les réponses ne sont pas autorisés sur ce board.",
"transfer": "Transférer", "modQueue.transferTitle": "Déplacer le message vers /trash/",
"modQueue.transferTitle": "Transférer la publication",
"modQueue.transferSource": "De", "modQueue.transferSource": "De",
"modQueue.transferTarget": "Au forum", "modQueue.transferTarget": "Vers",
"modQueue.transferFields": "Copier les champs", "modQueue.transferFields": "Copier les champs",
"modQueue.transferNoFields": "Choisissez au moins un champ à copier.", "modQueue.transferNoFields": "Choisissez au moins un champ à copier.",
"modQueue.transferSuccess": "Transféré. Le message dorigine pointe maintenant vers le nouveau board.", "modQueue.transferSuccess": "Déplacé vers /trash/. Le message dorigine pointe maintenant vers /trash/.",
"transferred": "Transféré", "transferred": "Transféré",
"modQueue.transferTitleWithNumber": "Transférer le message No.{{number}}", "modQueue.transferTitleWithNumber": "Déplacer le message No.{{number}} vers /trash/",
"modQueue.transferRecreateNotice": "Ce nest pas un vrai transfert au niveau du protocole. 5chan recrée le message sur le board choisi et retire loriginal.", "modQueue.transferRecreateNotice": "Ce nest pas un vrai transfert au niveau du protocole. 5chan recrée le message sur /trash/ et retire loriginal.",
"modQueue.transferRepliesNotice": "Les réponses ne sont pas transférées. Elles sont supprimées avec le message dorigine.", "modQueue.transferRepliesNotice": "Les réponses ne sont pas déplacées. Elles sont supprimées avec le message dorigine.",
"modQueue.transferTemporaryAccountNotice": "5chan créera un nouveau compte temporaire uniquement pour ce message copié, puis le supprimera après publication." "modQueue.transferTemporaryAccountNotice": "5chan créera un nouveau compte temporaire uniquement pour ce message copié, puis le supprimera après publication.",
"trash": "Corbeille"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "עליך להשיב עם קישור.", "reply_link_required_alert": "עליך להשיב עם קישור.",
"reply_media_link_required_alert": "עליך להשיב עם קישור לתמונה או לסרטון.", "reply_media_link_required_alert": "עליך להשיב עם קישור לתמונה או לסרטון.",
"reply_links_not_allowed_alert": "קישורים בתגובות אינם מותרים בלוח הזה.", "reply_links_not_allowed_alert": "קישורים בתגובות אינם מותרים בלוח הזה.",
"transfer": "העבר", "modQueue.transferTitle": "העבר את הפוסט אל /trash/",
"modQueue.transferTitle": "העברת פוסט",
"modQueue.transferSource": "מ-", "modQueue.transferSource": "מ-",
"modQueue.transferTarget": פורום", "modQueue.transferTarget": "אל",
"modQueue.transferFields": "העתק שדות", "modQueue.transferFields": "העתק שדות",
"modQueue.transferNoFields": "בחר לפחות שדה אחד להעתקה.", "modQueue.transferNoFields": "בחר לפחות שדה אחד להעתקה.",
"modQueue.transferSuccess": "הועבר. הפוסט המקורי מפנה עכשיו ללוח החדש.", "modQueue.transferSuccess": "הועבר אל /trash/. הפוסט המקורי מפנה עכשיו אל /trash/.",
"transferred": "הועבר", "transferred": "הועבר",
"modQueue.transferTitleWithNumber": "העברת פוסט מס׳ {{number}}", "modQueue.transferTitleWithNumber": "העבר את פוסט מס׳ {{number}} אל /trash/",
"modQueue.transferRecreateNotice": "זו לא העברה אמיתית ברמת הפרוטוקול. 5chan יוצר מחדש את הפוסט בלוח שנבחר ומסיר את המקור.", "modQueue.transferRecreateNotice": "זו לא העברה אמיתית ברמת הפרוטוקול. 5chan יוצר מחדש את הפוסט ב-/trash/ ומסיר את המקור.",
"modQueue.transferRepliesNotice": "תגובות לא מועברות. הן נמחקות יחד עם הפוסט המקורי.", "modQueue.transferRepliesNotice": "התגובות לא מועברות. הן נמחקות יחד עם הפוסט המקורי.",
"modQueue.transferTemporaryAccountNotice": "5chan ייצור חשבון זמני חדש רק עבור הפוסט המועתק הזה, ואז ימחק אותו לאחר הפרסום." "modQueue.transferTemporaryAccountNotice": "5chan ייצור חשבון זמני חדש רק עבור הפוסט המועתק הזה, ואז ימחק אותו לאחר הפרסום.",
"trash": "אשפה"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "आपको एक लिंक के साथ जवाब देना होगा।", "reply_link_required_alert": "आपको एक लिंक के साथ जवाब देना होगा।",
"reply_media_link_required_alert": "आपको किसी छवि या वीडियो लिंक के साथ जवाब देना होगा।", "reply_media_link_required_alert": "आपको किसी छवि या वीडियो लिंक के साथ जवाब देना होगा।",
"reply_links_not_allowed_alert": "इस बोर्ड पर जवाबों में लिंक की अनुमति नहीं है।", "reply_links_not_allowed_alert": "इस बोर्ड पर जवाबों में लिंक की अनुमति नहीं है।",
"transfer": "स्थानांतरित करें", "modQueue.transferTitle": "पोस्ट को /trash/ पर ले जाएँ",
"modQueue.transferTitle": "पोस्ट स्थानांतरित करें",
"modQueue.transferSource": "से", "modQueue.transferSource": "से",
"modQueue.transferTarget": "फोरम पर", "modQueue.transferTarget": "पर",
"modQueue.transferFields": "फ़ील्ड कॉपी करें", "modQueue.transferFields": "फ़ील्ड कॉपी करें",
"modQueue.transferNoFields": "कॉपी करने के लिए कम से कम एक फ़ील्ड चुनें।", "modQueue.transferNoFields": "कॉपी करने के लिए कम से कम एक फ़ील्ड चुनें।",
"modQueue.transferSuccess": "स्थानांतरित हो गया। मूल पोस्ट अब नए बोर्ड की ओर इशारा करती है।", "modQueue.transferSuccess": "/trash/ पर ले जाया गया। मूल पोस्ट अब /trash/ की ओर इशारा करती है।",
"transferred": "स्थानांतरित", "transferred": "स्थानांतरित",
"modQueue.transferTitleWithNumber": "पोस्ट No.{{number}} स्थानांतरित करें", "modQueue.transferTitleWithNumber": "पोस्ट No.{{number}} को /trash/ पर ले जाएँ",
"modQueue.transferRecreateNotice": "यह असली प्रोटोकॉल ट्रांसफर नहीं है। 5chan चुने गए बोर्ड पर पोस्ट को फिर से बनाता है और मूल पोस्ट हटा देता है।", "modQueue.transferRecreateNotice": "यह असली प्रोटोकॉल ट्रांसफर नहीं है। 5chan पोस्ट को /trash/ पर फिर से बनाता है और मूल पोस्ट हटा देता है।",
"modQueue.transferRepliesNotice": "जवाब स्थानांतरित नहीं होंगे। वे मूल पोस्ट के साथ हटा दिए जाएगे।", "modQueue.transferRepliesNotice": "जवाब नहीं ले जाए जाएँगे। वे मूल पोस्ट के साथ हटा दिए जाएगे।",
"modQueue.transferTemporaryAccountNotice": "5chan सिर्फ इस कॉपी किए गए पोस्ट के लिए एक नया अस्थायी खाता बनाएगा, फिर प्रकाशित करने के बाद उसे हटा देगा।" "modQueue.transferTemporaryAccountNotice": "5chan सिर्फ इस कॉपी किए गए पोस्ट के लिए एक नया अस्थायी खाता बनाएगा, फिर प्रकाशित करने के बाद उसे हटा देगा।",
"trash": "ट्रैश"
} }
+7 -7
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Linkkel kell válaszolnod.", "reply_link_required_alert": "Linkkel kell válaszolnod.",
"reply_media_link_required_alert": "Kép- vagy videólinkkel kell válaszolnod.", "reply_media_link_required_alert": "Kép- vagy videólinkkel kell válaszolnod.",
"reply_links_not_allowed_alert": "Ezen a táblán nem engedélyezettek a válaszlinkek.", "reply_links_not_allowed_alert": "Ezen a táblán nem engedélyezettek a válaszlinkek.",
"transfer": "Átvitel", "modQueue.transferTitle": "Bejegyzés áthelyezése ide: /trash/",
"modQueue.transferTitle": "Bejegyzés áthelyezése",
"modQueue.transferSource": "Honnan", "modQueue.transferSource": "Honnan",
"modQueue.transferTarget": "Fórumra", "modQueue.transferTarget": "Ide",
"modQueue.transferFields": "Mezők másolása", "modQueue.transferFields": "Mezők másolása",
"modQueue.transferNoFields": "Válasszon legalább egy mezőt a másoláshoz.", "modQueue.transferNoFields": "Válasszon legalább egy mezőt a másoláshoz.",
"modQueue.transferSuccess": "Áthelyezve. Az eredeti bejegyzés most az új táblára mutat.", "modQueue.transferSuccess": "Áthelyezve ide: /trash/. Az eredeti bejegyzés most a /trash/ helyre mutat.",
"transferred": "Áthelyezve", "transferred": "Áthelyezve",
"modQueue.transferTitleWithNumber": "No.{{number}} bejegyzés áthelyezése", "modQueue.transferTitleWithNumber": "No.{{number}} bejegyzés áthelyezése ide: /trash/",
"modQueue.transferRecreateNotice": "Ez nem valódi protokollszintű áthelyezés. A 5chan újra létrehozza a bejegyzést a kiválasztott táblán, majd eltávolítja az eredetit.", "modQueue.transferRecreateNotice": "Ez nem valódi protokollszintű áthelyezés. A 5chan újra létrehozza a bejegyzést a /trash/ helyen, majd eltávolítja az eredetit.",
"modQueue.transferRepliesNotice": "A válaszok nem kerülnek át. Az eredeti bejegyzéssel együtt törlődnek.", "modQueue.transferRepliesNotice": "A válaszok nem kerülnek át. Az eredeti bejegyzéssel együtt törlődnek.",
"modQueue.transferTemporaryAccountNotice": "A 5chan új ideiglenes fiókot hoz létre csak ehhez a másolt bejegyzéshez, majd közzététel után törli." "modQueue.transferTemporaryAccountNotice": "A 5chan új ideiglenes fiókot hoz létre csak ehhez a másolt bejegyzéshez, majd közzététel után törli.",
"trash": "Kuka"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Anda harus membalas dengan tautan.", "reply_link_required_alert": "Anda harus membalas dengan tautan.",
"reply_media_link_required_alert": "Anda harus membalas dengan tautan gambar atau video.", "reply_media_link_required_alert": "Anda harus membalas dengan tautan gambar atau video.",
"reply_links_not_allowed_alert": "Tautan balasan tidak diizinkan di papan ini.", "reply_links_not_allowed_alert": "Tautan balasan tidak diizinkan di papan ini.",
"transfer": "Pindahkan", "modQueue.transferTitle": "Pindahkan postingan ke /trash/",
"modQueue.transferTitle": "Transfer posting",
"modQueue.transferSource": "Dari", "modQueue.transferSource": "Dari",
"modQueue.transferTarget": "Ke forum", "modQueue.transferTarget": "Ke",
"modQueue.transferFields": "Salin bidang", "modQueue.transferFields": "Salin bidang",
"modQueue.transferNoFields": "Pilih setidaknya satu bidang untuk disalin.", "modQueue.transferNoFields": "Pilih setidaknya satu bidang untuk disalin.",
"modQueue.transferSuccess": "Ditransfer. Postingan asli sekarang mengarah ke board baru.", "modQueue.transferSuccess": "Dipindahkan ke /trash/. Postingan asli sekarang mengarah ke /trash/.",
"transferred": "Ditransfer", "transferred": "Ditransfer",
"modQueue.transferTitleWithNumber": "Transfer postingan No.{{number}}", "modQueue.transferTitleWithNumber": "Pindahkan postingan No.{{number}} ke /trash/",
"modQueue.transferRecreateNotice": "Ini bukan transfer protokol yang sebenarnya. 5chan membuat ulang postingan di board yang dipilih dan menghapus yang asli.", "modQueue.transferRecreateNotice": "Ini bukan transfer protokol yang sebenarnya. 5chan membuat ulang postingan di /trash/ dan menghapus yang asli.",
"modQueue.transferRepliesNotice": "Balasan tidak ditransfer. Balasan akan dihapus bersama postingan asli.", "modQueue.transferRepliesNotice": "Balasan tidak dipindahkan. Balasan akan dihapus bersama postingan asli.",
"modQueue.transferTemporaryAccountNotice": "5chan akan membuat akun sementara baru hanya untuk postingan salinan ini, lalu menghapusnya setelah dipublikasikan." "modQueue.transferTemporaryAccountNotice": "5chan akan membuat akun sementara baru hanya untuk postingan salinan ini, lalu menghapusnya setelah dipublikasikan.",
"trash": "Sampah"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Devi rispondere con un link.", "reply_link_required_alert": "Devi rispondere con un link.",
"reply_media_link_required_alert": "Devi rispondere con un link a un'immagine o a un video.", "reply_media_link_required_alert": "Devi rispondere con un link a un'immagine o a un video.",
"reply_links_not_allowed_alert": "I link nelle risposte non sono consentiti su questa board.", "reply_links_not_allowed_alert": "I link nelle risposte non sono consentiti su questa board.",
"transfer": "Trasferisci", "modQueue.transferTitle": "Sposta post in /trash/",
"modQueue.transferTitle": "Trasferisci post",
"modQueue.transferSource": "Da", "modQueue.transferSource": "Da",
"modQueue.transferTarget": "Al board", "modQueue.transferTarget": "A",
"modQueue.transferFields": "Copia campi", "modQueue.transferFields": "Copia campi",
"modQueue.transferNoFields": "Scegli almeno un campo da copiare.", "modQueue.transferNoFields": "Scegli almeno un campo da copiare.",
"modQueue.transferSuccess": "Trasferito. Il post originale ora punta alla nuova board.", "modQueue.transferSuccess": "Spostato in /trash/. Il post originale ora punta a /trash/.",
"transferred": "Trasferito", "transferred": "Trasferito",
"modQueue.transferTitleWithNumber": "Trasferisci post No.{{number}}", "modQueue.transferTitleWithNumber": "Sposta post No.{{number}} in /trash/",
"modQueue.transferRecreateNotice": "Questo non è un vero trasferimento del protocollo. 5chan ricrea il post nella board selezionata e rimuove loriginale.", "modQueue.transferRecreateNotice": "Questo non è un vero trasferimento del protocollo. 5chan ricrea il post in /trash/ e rimuove loriginale.",
"modQueue.transferRepliesNotice": "Le risposte non vengono trasferite. Verranno eliminate insieme al post originale.", "modQueue.transferRepliesNotice": "Le risposte non vengono spostate. Verranno eliminate insieme al post originale.",
"modQueue.transferTemporaryAccountNotice": "5chan creerà un nuovo account temporaneo solo per questo post copiato, poi lo eliminerà dopo la pubblicazione." "modQueue.transferTemporaryAccountNotice": "5chan creerà un nuovo account temporaneo solo per questo post copiato, poi lo eliminerà dopo la pubblicazione.",
"trash": "Cestino"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "リンク付きで返信する必要があります。", "reply_link_required_alert": "リンク付きで返信する必要があります。",
"reply_media_link_required_alert": "画像または動画のリンク付きで返信する必要があります。", "reply_media_link_required_alert": "画像または動画のリンク付きで返信する必要があります。",
"reply_links_not_allowed_alert": "この板では返信リンクは許可されていません。", "reply_links_not_allowed_alert": "この板では返信リンクは許可されていません。",
"transfer": "転送", "modQueue.transferTitle": "投稿を /trash/ へ移動",
"modQueue.transferTitle": "投稿を転送",
"modQueue.transferSource": "移行元", "modQueue.transferSource": "移行元",
"modQueue.transferTarget": "掲示板へ", "modQueue.transferTarget": "移動先",
"modQueue.transferFields": "フィールドをコピー", "modQueue.transferFields": "フィールドをコピー",
"modQueue.transferNoFields": "コピーする項目を1つ以上選択してください。", "modQueue.transferNoFields": "コピーする項目を1つ以上選択してください。",
"modQueue.transferSuccess": "転送しました。元の投稿は新しい板を指すようになりました。", "modQueue.transferSuccess": "/trash/ へ移動しました。元の投稿は /trash/ を指すようになりました。",
"transferred": "転送済み", "transferred": "転送済み",
"modQueue.transferTitleWithNumber": "投稿 No.{{number}} を転送", "modQueue.transferTitleWithNumber": "投稿 No.{{number}} を /trash/ へ移動",
"modQueue.transferRecreateNotice": "これはプロトコル上の本当の転送ではありません。5chan は選択した板に投稿を再作成し、元の投稿を削除します。", "modQueue.transferRecreateNotice": "これはプロトコル上の本当の転送ではありません。5chan は /trash/ に投稿を再作成し、元の投稿を削除します。",
"modQueue.transferRepliesNotice": "返信は転送されません。元の投稿と一緒に削除されます。", "modQueue.transferRepliesNotice": "返信は移動されません。元の投稿と一緒に削除されます。",
"modQueue.transferTemporaryAccountNotice": "5chan はこのコピー投稿専用の一時アカウントを新しく作成し、公開後に削除します。" "modQueue.transferTemporaryAccountNotice": "5chan はこのコピー投稿専用の一時アカウントを新しく作成し、公開後に削除します。",
"trash": "ゴミ箱"
} }
+7 -7
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "링크를 포함해 답글을 달아야 합니다.", "reply_link_required_alert": "링크를 포함해 답글을 달아야 합니다.",
"reply_media_link_required_alert": "이미지 또는 동영상 링크를 포함해 답글을 달아야 합니다.", "reply_media_link_required_alert": "이미지 또는 동영상 링크를 포함해 답글을 달아야 합니다.",
"reply_links_not_allowed_alert": "이 게시판에서는 답글 링크가 허용되지 않습니다.", "reply_links_not_allowed_alert": "이 게시판에서는 답글 링크가 허용되지 않습니다.",
"transfer": "이전", "modQueue.transferTitle": "게시글을 /trash/로 이동",
"modQueue.transferTitle": "게시글 이동",
"modQueue.transferSource": "원본", "modQueue.transferSource": "원본",
"modQueue.transferTarget": "게시판으로", "modQueue.transferTarget": "대상",
"modQueue.transferFields": "필드 복사", "modQueue.transferFields": "필드 복사",
"modQueue.transferNoFields": "복사할 필드를 하나 이상 선택하세요.", "modQueue.transferNoFields": "복사할 필드를 하나 이상 선택하세요.",
"modQueue.transferSuccess": "이동되었습니다. 원래 게시글은 이제 새 게시판을 가리킵니다.", "modQueue.transferSuccess": "/trash/로 이동되었습니다. 원래 게시글은 이제 /trash/를 가리킵니다.",
"transferred": "이동됨", "transferred": "이동됨",
"modQueue.transferTitleWithNumber": "게시글 No.{{number}} 이동", "modQueue.transferTitleWithNumber": "게시글 No.{{number}}을 /trash/로 이동",
"modQueue.transferRecreateNotice": "이것은 실제 프로토콜 전송이 아닙니다. 5chan은 선택한 게시판에 게시글을 다시 만들고 원본을 제거합니다.", "modQueue.transferRecreateNotice": "이것은 실제 프로토콜 전송이 아닙니다. 5chan은 /trash/에 게시글을 다시 만들고 원본을 제거합니다.",
"modQueue.transferRepliesNotice": "답글은 이동되지 않습니다. 원본 게시글과 함께 삭제됩니다.", "modQueue.transferRepliesNotice": "답글은 이동되지 않습니다. 원본 게시글과 함께 삭제됩니다.",
"modQueue.transferTemporaryAccountNotice": "5chan은 이 복사된 게시글만을 위한 새 임시 계정을 만든 뒤 게시 후 삭제합니다." "modQueue.transferTemporaryAccountNotice": "5chan은 이 복사된 게시글만을 위한 새 임시 계정을 만든 뒤 게시 후 삭제합니다.",
"trash": "휴지통"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "तुम्ही दुव्यासह उत्तर देणे आवश्यक आहे.", "reply_link_required_alert": "तुम्ही दुव्यासह उत्तर देणे आवश्यक आहे.",
"reply_media_link_required_alert": "तुम्ही प्रतिमा किंवा व्हिडिओ दुव्यासह उत्तर देणे आवश्यक आहे.", "reply_media_link_required_alert": "तुम्ही प्रतिमा किंवा व्हिडिओ दुव्यासह उत्तर देणे आवश्यक आहे.",
"reply_links_not_allowed_alert": "या बोर्डवर उत्तरांमधील दुवे परवानगी नाहीत.", "reply_links_not_allowed_alert": "या बोर्डवर उत्तरांमधील दुवे परवानगी नाहीत.",
"transfer": "हस्तांतरित करा", "modQueue.transferTitle": "पोस्ट /trash/ मध्ये हलवा",
"modQueue.transferTitle": "पोस्ट हस्तांतरित करा",
"modQueue.transferSource": "पासून", "modQueue.transferSource": "पासून",
"modQueue.transferTarget": "फोरमवर", "modQueue.transferTarget": "कडे",
"modQueue.transferFields": "फील्ड कॉपी करा", "modQueue.transferFields": "फील्ड कॉपी करा",
"modQueue.transferNoFields": "कॉपी करण्यासाठी किमान एक फील्ड निवडा.", "modQueue.transferNoFields": "कॉपी करण्यासाठी किमान एक फील्ड निवडा.",
"modQueue.transferSuccess": "स्थानांतरित झाले. मूळ पोस्ट आता नवीन बोर्डकडे निर्देश करते.", "modQueue.transferSuccess": "/trash/ मध्ये हलवले. मूळ पोस्ट आता /trash/ कडे निर्देश करते.",
"transferred": "स्थानांतरित", "transferred": "स्थानांतरित",
"modQueue.transferTitleWithNumber": "पोस्ट No.{{number}} स्थानांतरित करा", "modQueue.transferTitleWithNumber": "पोस्ट No.{{number}} /trash/ मध्ये हलवा",
"modQueue.transferRecreateNotice": "हे खरे प्रोटोकॉल ट्रान्सफर नाही. 5chan निवडलेल्या बोर्डावर पोस्ट पुन्हा तयार करते आणि मूळ पोस्ट काढते.", "modQueue.transferRecreateNotice": "हे खरे प्रोटोकॉल ट्रान्सफर नाही. 5chan पोस्ट /trash/ मध्ये पुन्हा तयार करते आणि मूळ काढून टाकते.",
"modQueue.transferRepliesNotice": "प्रत्युत्तरे स्थानांतरित होणार नाहीत. ती मूळ पोस्टसोबत हटवली जातील.", "modQueue.transferRepliesNotice": "प्रत्युत्तरे हलवली जाणार नाहीत. ती मूळ पोस्टसोबत हटवली जातील.",
"modQueue.transferTemporaryAccountNotice": "5chan या कॉपी केलेल्या पोस्टसाठीच एक नवीन तात्पुरते खाते तयार करेल आणि प्रकाशित झाल्यावर ते हटवेल." "modQueue.transferTemporaryAccountNotice": "5chan या कॉपी केलेल्या पोस्टसाठीच एक नवीन तात्पुरते खाते तयार करेल आणि प्रकाशित झाल्यावर ते हटवेल.",
"trash": "कचरा"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Je moet antwoorden met een link.", "reply_link_required_alert": "Je moet antwoorden met een link.",
"reply_media_link_required_alert": "Je moet antwoorden met een afbeeldings- of videolink.", "reply_media_link_required_alert": "Je moet antwoorden met een afbeeldings- of videolink.",
"reply_links_not_allowed_alert": "Antwoordlinks zijn niet toegestaan op dit bord.", "reply_links_not_allowed_alert": "Antwoordlinks zijn niet toegestaan op dit bord.",
"transfer": "Overdragen", "modQueue.transferTitle": "Bericht naar /trash/ verplaatsen",
"modQueue.transferTitle": "Bericht overdragen",
"modQueue.transferSource": "Van", "modQueue.transferSource": "Van",
"modQueue.transferTarget": "Naar forum", "modQueue.transferTarget": "Naar",
"modQueue.transferFields": "Velden kopiëren", "modQueue.transferFields": "Velden kopiëren",
"modQueue.transferNoFields": "Kies minimaal één veld om te kopiëren.", "modQueue.transferNoFields": "Kies minimaal één veld om te kopiëren.",
"modQueue.transferSuccess": "Overgezet. Het oorspronkelijke bericht verwijst nu naar het nieuwe board.", "modQueue.transferSuccess": "Verplaatst naar /trash/. Het oorspronkelijke bericht verwijst nu naar /trash/.",
"transferred": "Overgezet", "transferred": "Overgezet",
"modQueue.transferTitleWithNumber": "Bericht No.{{number}} overzetten", "modQueue.transferTitleWithNumber": "Bericht No.{{number}} naar /trash/ verplaatsen",
"modQueue.transferRecreateNotice": "Dit is geen echte protocoloverdracht. 5chan maakt het bericht opnieuw op het gekozen board en verwijdert het origineel.", "modQueue.transferRecreateNotice": "Dit is geen echte protocoloverdracht. 5chan maakt het bericht opnieuw in /trash/ en verwijdert het origineel.",
"modQueue.transferRepliesNotice": "Reacties worden niet overgezet. Ze worden samen met het oorspronkelijke bericht verwijderd.", "modQueue.transferRepliesNotice": "Reacties worden niet verplaatst. Ze worden samen met het oorspronkelijke bericht verwijderd.",
"modQueue.transferTemporaryAccountNotice": "5chan maakt alleen voor dit gekopieerde bericht een nieuw tijdelijk account aan en verwijdert het na publicatie." "modQueue.transferTemporaryAccountNotice": "5chan maakt alleen voor dit gekopieerde bericht een nieuw tijdelijk account aan en verwijdert het na publicatie.",
"trash": "Prullenbak"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Du må svare med en lenke.", "reply_link_required_alert": "Du må svare med en lenke.",
"reply_media_link_required_alert": "Du må svare med en bilde- eller videolenke.", "reply_media_link_required_alert": "Du må svare med en bilde- eller videolenke.",
"reply_links_not_allowed_alert": "Svarlenker er ikke tillatt på dette forumet.", "reply_links_not_allowed_alert": "Svarlenker er ikke tillatt på dette forumet.",
"transfer": "Overfør", "modQueue.transferTitle": "Flytt innlegg til /trash/",
"modQueue.transferTitle": "Overfør innlegg",
"modQueue.transferSource": "Fra", "modQueue.transferSource": "Fra",
"modQueue.transferTarget": "Til forum", "modQueue.transferTarget": "Til",
"modQueue.transferFields": "Kopier felt", "modQueue.transferFields": "Kopier felt",
"modQueue.transferNoFields": "Velg minst ett felt som skal kopieres.", "modQueue.transferNoFields": "Velg minst ett felt som skal kopieres.",
"modQueue.transferSuccess": "Overført. Det opprinnelige innlegget peker nå til det nye boardet.", "modQueue.transferSuccess": "Flyttet til /trash/. Det opprinnelige innlegget peker nå til /trash/.",
"transferred": "Overført", "transferred": "Overført",
"modQueue.transferTitleWithNumber": "Overfør innlegg No.{{number}}", "modQueue.transferTitleWithNumber": "Flytt innlegg No.{{number}} til /trash/",
"modQueue.transferRecreateNotice": "Dette er ikke en ekte protokolloverføring. 5chan oppretter innlegget på nytt på valgt board og fjerner originalen.", "modQueue.transferRecreateNotice": "Dette er ikke en ekte protokolloverføring. 5chan oppretter innlegget på nytt i /trash/ og fjerner originalen.",
"modQueue.transferRepliesNotice": "Svar overføres ikke. De slettes sammen med det opprinnelige innlegget.", "modQueue.transferRepliesNotice": "Svar flyttes ikke. De slettes sammen med det opprinnelige innlegget.",
"modQueue.transferTemporaryAccountNotice": "5chan oppretter en ny midlertidig konto bare for dette kopierte innlegget, og sletter den etter publisering." "modQueue.transferTemporaryAccountNotice": "5chan oppretter en ny midlertidig konto bare for dette kopierte innlegget, og sletter den etter publisering.",
"trash": "Papirkurv"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Musisz odpowiedzieć linkiem.", "reply_link_required_alert": "Musisz odpowiedzieć linkiem.",
"reply_media_link_required_alert": "Musisz odpowiedzieć linkiem do obrazu lub filmu.", "reply_media_link_required_alert": "Musisz odpowiedzieć linkiem do obrazu lub filmu.",
"reply_links_not_allowed_alert": "Linki w odpowiedziach nie są dozwolone na tej tablicy.", "reply_links_not_allowed_alert": "Linki w odpowiedziach nie są dozwolone na tej tablicy.",
"transfer": "Przenieś", "modQueue.transferTitle": "Przenieś post do /trash/",
"modQueue.transferTitle": "Przenieś post",
"modQueue.transferSource": "Z", "modQueue.transferSource": "Z",
"modQueue.transferTarget": "Do forum", "modQueue.transferTarget": "Do",
"modQueue.transferFields": "Kopiuj pola", "modQueue.transferFields": "Kopiuj pola",
"modQueue.transferNoFields": "Wybierz co najmniej jedno pole do skopiowania.", "modQueue.transferNoFields": "Wybierz co najmniej jedno pole do skopiowania.",
"modQueue.transferSuccess": "Przeniesiono. Oryginalny post wskazuje teraz nową tablicę.", "modQueue.transferSuccess": "Przeniesiono do /trash/. Oryginalny post wskazuje teraz /trash/.",
"transferred": "Przeniesiono", "transferred": "Przeniesiono",
"modQueue.transferTitleWithNumber": "Przenieś post No.{{number}}", "modQueue.transferTitleWithNumber": "Przenieś post No.{{number}} do /trash/",
"modQueue.transferRecreateNotice": "To nie jest prawdziwe przeniesienie w protokole. 5chan odtwarza post na wybranej tablicy i usuwa oryginał.", "modQueue.transferRecreateNotice": "To nie jest rzeczywisty transfer na poziomie protokołu. 5chan odtwarza post w /trash/ i usuwa oryginał.",
"modQueue.transferRepliesNotice": "Odpowiedzi nie są przenoszone. Zostaną usunięte razem z oryginalnym postem.", "modQueue.transferRepliesNotice": "Odpowiedzi nie zostaną przeniesione. Zostaną usunięte razem z oryginalnym postem.",
"modQueue.transferTemporaryAccountNotice": "5chan utworzy nowe konto tymczasowe tylko dla tego skopiowanego posta, a potem usunie je po opublikowaniu." "modQueue.transferTemporaryAccountNotice": "5chan utworzy nowe konto tymczasowe tylko dla tego skopiowanego posta, a potem usunie je po opublikowaniu.",
"trash": "Kosz"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Você deve responder com um link.", "reply_link_required_alert": "Você deve responder com um link.",
"reply_media_link_required_alert": "Você deve responder com um link de imagem ou vídeo.", "reply_media_link_required_alert": "Você deve responder com um link de imagem ou vídeo.",
"reply_links_not_allowed_alert": "Links em respostas não são permitidos neste board.", "reply_links_not_allowed_alert": "Links em respostas não são permitidos neste board.",
"transfer": "Transferir", "modQueue.transferTitle": "Mover postagem para /trash/",
"modQueue.transferTitle": "Transferir publicação",
"modQueue.transferSource": "De", "modQueue.transferSource": "De",
"modQueue.transferTarget": "Para o fórum", "modQueue.transferTarget": "Para",
"modQueue.transferFields": "Copiar campos", "modQueue.transferFields": "Copiar campos",
"modQueue.transferNoFields": "Escolha pelo menos um campo para copiar.", "modQueue.transferNoFields": "Escolha pelo menos um campo para copiar.",
"modQueue.transferSuccess": "Transferido. A postagem original agora aponta para o novo board.", "modQueue.transferSuccess": "Movido para /trash/. A postagem original agora aponta para /trash/.",
"transferred": "Transferido", "transferred": "Transferido",
"modQueue.transferTitleWithNumber": "Transferir postagem No.{{number}}", "modQueue.transferTitleWithNumber": "Mover postagem No.{{number}} para /trash/",
"modQueue.transferRecreateNotice": "Isto não é uma transferência real do protocolo. O 5chan recria a postagem no board selecionado e remove a original.", "modQueue.transferRecreateNotice": "Isto não é uma transferência real do protocolo. O 5chan recria a postagem em /trash/ e remove a original.",
"modQueue.transferRepliesNotice": "As respostas não são transferidas. Elas serão excluídas junto com a postagem original.", "modQueue.transferRepliesNotice": "As respostas não são movidas. Elas serão excluídas junto com a postagem original.",
"modQueue.transferTemporaryAccountNotice": "O 5chan criará uma nova conta temporária apenas para esta postagem copiada e a excluirá depois da publicação." "modQueue.transferTemporaryAccountNotice": "O 5chan criará uma nova conta temporária apenas para esta postagem copiada e a excluirá depois da publicação.",
"trash": "Lixeira"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Trebuie să răspunzi cu un link.", "reply_link_required_alert": "Trebuie să răspunzi cu un link.",
"reply_media_link_required_alert": "Trebuie să răspunzi cu un link de imagine sau video.", "reply_media_link_required_alert": "Trebuie să răspunzi cu un link de imagine sau video.",
"reply_links_not_allowed_alert": "Linkurile în răspunsuri nu sunt permise pe acest board.", "reply_links_not_allowed_alert": "Linkurile în răspunsuri nu sunt permise pe acest board.",
"transfer": "Transferă", "modQueue.transferTitle": "Mută postarea în /trash/",
"modQueue.transferTitle": "Transferă postarea",
"modQueue.transferSource": "De la", "modQueue.transferSource": "De la",
"modQueue.transferTarget": "La forum", "modQueue.transferTarget": "La",
"modQueue.transferFields": "Copiază câmpurile", "modQueue.transferFields": "Copiază câmpurile",
"modQueue.transferNoFields": "Alege cel puțin un câmp de copiat.", "modQueue.transferNoFields": "Alege cel puțin un câmp de copiat.",
"modQueue.transferSuccess": "Transferat. Postarea originală trimite acum la noul board.", "modQueue.transferSuccess": "Mutată în /trash/. Postarea originală trimite acum la /trash/.",
"transferred": "Transferat", "transferred": "Transferat",
"modQueue.transferTitleWithNumber": "Transferă postarea No.{{number}}", "modQueue.transferTitleWithNumber": "Mută postarea No.{{number}} în /trash/",
"modQueue.transferRecreateNotice": "Acesta nu este un transfer real la nivel de protocol. 5chan recreează postarea pe boardul ales și elimină originalul.", "modQueue.transferRecreateNotice": "Acesta nu este un transfer real la nivel de protocol. 5chan recreează postarea în /trash/ și elimină originalul.",
"modQueue.transferRepliesNotice": "Răspunsurile nu sunt transferate. Vor fi șterse odată cu postarea originală.", "modQueue.transferRepliesNotice": "Răspunsurile nu sunt mutate. Vor fi șterse odată cu postarea originală.",
"modQueue.transferTemporaryAccountNotice": "5chan va crea un cont temporar nou doar pentru această postare copiată, apoi îl va șterge după publicare." "modQueue.transferTemporaryAccountNotice": "5chan va crea un cont temporar nou doar pentru această postare copiată, apoi îl va șterge după publicare.",
"trash": "Coș"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Вы должны ответить ссылкой.", "reply_link_required_alert": "Вы должны ответить ссылкой.",
"reply_media_link_required_alert": "Вы должны ответить ссылкой на изображение или видео.", "reply_media_link_required_alert": "Вы должны ответить ссылкой на изображение или видео.",
"reply_links_not_allowed_alert": "Ссылки в ответах на этой доске запрещены.", "reply_links_not_allowed_alert": "Ссылки в ответах на этой доске запрещены.",
"transfer": "Перенести", "modQueue.transferTitle": "Переместить пост в /trash/",
"modQueue.transferTitle": "Перенести пост",
"modQueue.transferSource": "Из", "modQueue.transferSource": "Из",
"modQueue.transferTarget": "На форум", "modQueue.transferTarget": "В",
"modQueue.transferFields": "Копировать поля", "modQueue.transferFields": "Копировать поля",
"modQueue.transferNoFields": "Выберите хотя бы одно поле для копирования.", "modQueue.transferNoFields": "Выберите хотя бы одно поле для копирования.",
"modQueue.transferSuccess": "Перенесено. Исходный пост теперь указывает на новую доску.", "modQueue.transferSuccess": "Перемещено в /trash/. Исходный пост теперь указывает на /trash/.",
"transferred": "Перенесено", "transferred": "Перенесено",
"modQueue.transferTitleWithNumber": "Перенести пост No.{{number}}", "modQueue.transferTitleWithNumber": "Переместить пост No.{{number}} в /trash/",
"modQueue.transferRecreateNotice": "Это не настоящий перенос на уровне протокола. 5chan заново создаёт пост на выбранной доске и удаляет оригинал.", "modQueue.transferRecreateNotice": "Это не настоящий перенос на уровне протокола. 5chan заново создаёт пост в /trash/ и удаляет оригинал.",
"modQueue.transferRepliesNotice": "Ответы не переносятся. Они будут удалены вместе с исходным постом.", "modQueue.transferRepliesNotice": "Ответы не перемещаются. Они будут удалены вместе с исходным постом.",
"modQueue.transferTemporaryAccountNotice": "5chan создаст новый временный аккаунт только для этой скопированной публикации, а затем удалит его после публикации." "modQueue.transferTemporaryAccountNotice": "5chan создаст новый временный аккаунт только для этой скопированной публикации, а затем удалит его после публикации.",
"trash": "Корзина"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Duhet të përgjigjesh me një lidhje.", "reply_link_required_alert": "Duhet të përgjigjesh me një lidhje.",
"reply_media_link_required_alert": "Duhet të përgjigjesh me një lidhje imazhi ose videoje.", "reply_media_link_required_alert": "Duhet të përgjigjesh me një lidhje imazhi ose videoje.",
"reply_links_not_allowed_alert": "Lidhjet në përgjigje nuk lejohen në këtë bord.", "reply_links_not_allowed_alert": "Lidhjet në përgjigje nuk lejohen në këtë bord.",
"transfer": "Transfero", "modQueue.transferTitle": "Zhvendose postimin te /trash/",
"modQueue.transferTitle": "Transfero postimin",
"modQueue.transferSource": "Nga", "modQueue.transferSource": "Nga",
"modQueue.transferTarget": "Në forum", "modQueue.transferTarget": "Te",
"modQueue.transferFields": "Kopjo fushat", "modQueue.transferFields": "Kopjo fushat",
"modQueue.transferNoFields": "Zgjidhni të paktën një fushë për të kopjuar.", "modQueue.transferNoFields": "Zgjidhni të paktën një fushë për të kopjuar.",
"modQueue.transferSuccess": "U transferua. Postimi origjinal tani të drejton te bordi i ri.", "modQueue.transferSuccess": "U zhvendos te /trash/. Postimi origjinal tani të drejton te /trash/.",
"transferred": "U transferua", "transferred": "U transferua",
"modQueue.transferTitleWithNumber": "Transfero postimin No.{{number}}", "modQueue.transferTitleWithNumber": "Zhvendose postimin No.{{number}} te /trash/",
"modQueue.transferRecreateNotice": "Ky nuk është transferim i vërtetë në protokoll. 5chan e rikrijon postimin në bordin e zgjedhur dhe heq origjinalin.", "modQueue.transferRecreateNotice": "Ky nuk është transferim i vërtetë në protokoll. 5chan e rikrijon postimin te /trash/ dhe heq origjinalin.",
"modQueue.transferRepliesNotice": "Përgjigjet nuk transferohen. Ato fshihen bashkë me postimin origjinal.", "modQueue.transferRepliesNotice": "Përgjigjet nuk zhvendosen. Ato fshihen bashkë me postimin origjinal.",
"modQueue.transferTemporaryAccountNotice": "5chan do të krijojë një llogari të re të përkohshme vetëm për këtë postim të kopjuar, pastaj do ta fshijë pas publikimit." "modQueue.transferTemporaryAccountNotice": "5chan do të krijojë një llogari të re të përkohshme vetëm për këtë postim të kopjuar, pastaj do ta fshijë pas publikimit.",
"trash": "Kosh"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Du måste svara med en länk.", "reply_link_required_alert": "Du måste svara med en länk.",
"reply_media_link_required_alert": "Du måste svara med en bild- eller videolänk.", "reply_media_link_required_alert": "Du måste svara med en bild- eller videolänk.",
"reply_links_not_allowed_alert": "Svarslänkar är inte tillåtna på detta bräde.", "reply_links_not_allowed_alert": "Svarslänkar är inte tillåtna på detta bräde.",
"transfer": "Överför", "modQueue.transferTitle": "Flytta inlägg till /trash/",
"modQueue.transferTitle": "Överför inlägg",
"modQueue.transferSource": "Från", "modQueue.transferSource": "Från",
"modQueue.transferTarget": "Till forum", "modQueue.transferTarget": "Till",
"modQueue.transferFields": "Kopiera fält", "modQueue.transferFields": "Kopiera fält",
"modQueue.transferNoFields": "Välj minst ett fält att kopiera.", "modQueue.transferNoFields": "Välj minst ett fält att kopiera.",
"modQueue.transferSuccess": "Överfört. Det ursprungliga inlägget pekar nu till den nya boarden.", "modQueue.transferSuccess": "Flyttat till /trash/. Det ursprungliga inlägget pekar nu till /trash/.",
"transferred": "Överfört", "transferred": "Överfört",
"modQueue.transferTitleWithNumber": "Överför inlägg No.{{number}}", "modQueue.transferTitleWithNumber": "Flytta inlägg No.{{number}} till /trash/",
"modQueue.transferRecreateNotice": "Det här är inte en riktig protokollöverföring. 5chan återskapar inlägget på vald board och tar bort originalet.", "modQueue.transferRecreateNotice": "Det här är inte en riktig protokollöverföring. 5chan återskapar inlägget i /trash/ och tar bort originalet.",
"modQueue.transferRepliesNotice": "Svar överförs inte. De raderas tillsammans med det ursprungliga inlägget.", "modQueue.transferRepliesNotice": "Svar flyttas inte. De raderas tillsammans med det ursprungliga inlägget.",
"modQueue.transferTemporaryAccountNotice": "5chan skapar ett nytt tillfälligt konto bara för det här kopierade inlägget och raderar det efter publicering." "modQueue.transferTemporaryAccountNotice": "5chan skapar ett nytt tillfälligt konto bara för det här kopierade inlägget och raderar det efter publicering.",
"trash": "Papperskorg"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "మీరు లింక్‌తో ప్రత్యుత్తరం ఇవ్వాలి.", "reply_link_required_alert": "మీరు లింక్‌తో ప్రత్యుత్తరం ఇవ్వాలి.",
"reply_media_link_required_alert": "మీరు చిత్రం లేదా వీడియో లింక్‌తో ప్రత్యుత్తరం ఇవ్వాలి.", "reply_media_link_required_alert": "మీరు చిత్రం లేదా వీడియో లింక్‌తో ప్రత్యుత్తరం ఇవ్వాలి.",
"reply_links_not_allowed_alert": "ఈ బోర్డులో ప్రత్యుత్తర లింక్‌లకు అనుమతి లేదు.", "reply_links_not_allowed_alert": "ఈ బోర్డులో ప్రత్యుత్తర లింక్‌లకు అనుమతి లేదు.",
"transfer": "బదిలీ", "modQueue.transferTitle": "పోస్ట్‌ను /trash/కి తరలించండి",
"modQueue.transferTitle": "పోస్ట్‌ను బదిలీ చేయండి",
"modQueue.transferSource": "నుండి", "modQueue.transferSource": "నుండి",
"modQueue.transferTarget": "ఫోరంకు", "modQueue.transferTarget": "కు",
"modQueue.transferFields": "ఫీల్డ్‌లను కాపీ చేయండి", "modQueue.transferFields": "ఫీల్డ్‌లను కాపీ చేయండి",
"modQueue.transferNoFields": "కాపీ చేయడానికి కనీసం ఒక ఫీల్డ్ ఎంచుకోండి.", "modQueue.transferNoFields": "కాపీ చేయడానికి కనీసం ఒక ఫీల్డ్ ఎంచుకోండి.",
"modQueue.transferSuccess": "బదిలీ చేయబడింది. అసలు పోస్ట్ ఇప్పుడు కొత్త బోర్డును సూచిస్తుంది.", "modQueue.transferSuccess": "/trash/కి తరలించబడింది. అసలు పోస్ట్ ఇప్పుడు /trash/ను సూచిస్తుంది.",
"transferred": "బదిలీ చేయబడింది", "transferred": "బదిలీ చేయబడింది",
"modQueue.transferTitleWithNumber": "పోస్ట్ No.{{number}} బదిలీ చేయండి", "modQueue.transferTitleWithNumber": "పోస్ట్ No.{{number}}ను /trash/కి తరలించండి",
"modQueue.transferRecreateNotice": "ఇది నిజమైన ప్రోటోకాల్ బదిలీ కాదు. 5chan ఎంచుకున్న బోర్డులో పోస్ట్‌ను మళ్లీ సృష్టించి అసలుదాన్ని తొలగిస్తుంది.", "modQueue.transferRecreateNotice": "ఇది నిజమైన ప్రోటోకాల్ బదిలీ కాదు. 5chan పోస్ట్‌ను /trash/లో మళ్లీ సృష్టించి అసలుదాన్ని తొలగిస్తుంది.",
"modQueue.transferRepliesNotice": "ప్రత్యుత్తరాలు బదిలీ చేయబడవు. అవి అసలు పోస్ట్‌తో పాటు తొలగించబడతాయి.", "modQueue.transferRepliesNotice": "ప్రత్యుత్తరాలు తరలించబడవు. అవి అసలు పోస్ట్‌తో పాటు తొలగించబడతాయి.",
"modQueue.transferTemporaryAccountNotice": "5chan ఈ కాపీ చేసిన పోస్ట్ కోసమే కొత్త తాత్కాలిక ఖాతాను సృష్టించి, ప్రచురించిన తర్వాత దాన్ని తొలగిస్తుంది." "modQueue.transferTemporaryAccountNotice": "5chan ఈ కాపీ చేసిన పోస్ట్ కోసమే కొత్త తాత్కాలిక ఖాతాను సృష్టించి, ప్రచురించిన తర్వాత దాన్ని తొలగిస్తుంది.",
"trash": "ట్రాష్"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "คุณต้องตอบกลับพร้อมลิงก์", "reply_link_required_alert": "คุณต้องตอบกลับพร้อมลิงก์",
"reply_media_link_required_alert": "คุณต้องตอบกลับพร้อมลิงก์รูปภาพหรือวิดีโอ", "reply_media_link_required_alert": "คุณต้องตอบกลับพร้อมลิงก์รูปภาพหรือวิดีโอ",
"reply_links_not_allowed_alert": "ไม่อนุญาตให้ใส่ลิงก์ในคำตอบบนบอร์ดนี้", "reply_links_not_allowed_alert": "ไม่อนุญาตให้ใส่ลิงก์ในคำตอบบนบอร์ดนี้",
"transfer": "โอน", "modQueue.transferTitle": "ย้ายโพสต์ไปที่ /trash/",
"modQueue.transferTitle": "ย้ายโพสต์",
"modQueue.transferSource": "จาก", "modQueue.transferSource": "จาก",
"modQueue.transferTarget": "ไปยังกระดาน", "modQueue.transferTarget": "ไปที่",
"modQueue.transferFields": "คัดลอกฟิลด์", "modQueue.transferFields": "คัดลอกฟิลด์",
"modQueue.transferNoFields": "เลือกอย่างน้อยหนึ่งฟิลด์ที่จะคัดลอก", "modQueue.transferNoFields": "เลือกอย่างน้อยหนึ่งฟิลด์ที่จะคัดลอก",
"modQueue.transferSuccess": "โอนย้ายแล้ว โพสต์ต้นฉบับชี้ไปยังกระดานใหม่แล้ว", "modQueue.transferSuccess": "ย้ายไปที่ /trash/ แล้ว โพสต์ต้นฉบับชี้ไปที่ /trash/ แล้ว",
"transferred": "โอนย้ายแล้ว", "transferred": "โอนย้ายแล้ว",
"modQueue.transferTitleWithNumber": "โอนย้ายโพสต์ No.{{number}}", "modQueue.transferTitleWithNumber": "ย้ายโพสต์ No.{{number}} ไปที่ /trash/",
"modQueue.transferRecreateNotice": "นี่ไม่ใช่การโอนย้ายจริงในระดับโปรโตคอล 5chan จะสร้างโพสต์ใหม่บนกระดานที่เลือกและลบต้นฉบับ", "modQueue.transferRecreateNotice": "นี่ไม่ใช่การโอนย้ายจริงในระดับโปรโตคอล 5chan จะสร้างโพสต์ใหม่ใน /trash/ และลบต้นฉบับ",
"modQueue.transferRepliesNotice": "การตอบกลับจะไม่ถูกโอนย้าย และจะถูกลบไปพร้อมกับโพสต์ต้นฉบับ", "modQueue.transferRepliesNotice": "การตอบกลับจะไม่ถูกย้าย และจะถูกลบไปพร้อมกับโพสต์ต้นฉบับ",
"modQueue.transferTemporaryAccountNotice": "5chan จะสร้างบัญชีชั่วคราวใหม่สำหรับโพสต์ที่คัดลอกนี้เท่านั้น แล้วลบบัญชีนั้นหลังเผยแพร่" "modQueue.transferTemporaryAccountNotice": "5chan จะสร้างบัญชีชั่วคราวใหม่สำหรับโพสต์ที่คัดลอกนี้เท่านั้น แล้วลบบัญชีนั้นหลังเผยแพร่",
"trash": "ถังขยะ"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Bir bağlantıyla yanıt vermelisiniz.", "reply_link_required_alert": "Bir bağlantıyla yanıt vermelisiniz.",
"reply_media_link_required_alert": "Bir görsel veya video bağlantısıyla yanıt vermelisiniz.", "reply_media_link_required_alert": "Bir görsel veya video bağlantısıyla yanıt vermelisiniz.",
"reply_links_not_allowed_alert": "Bu panoda yanıt bağlantılarına izin verilmiyor.", "reply_links_not_allowed_alert": "Bu panoda yanıt bağlantılarına izin verilmiyor.",
"transfer": "Aktar", "modQueue.transferTitle": "Gönderiyi /trash/ panosuna taşı",
"modQueue.transferTitle": "Gönderiyi aktar",
"modQueue.transferSource": "Kaynak", "modQueue.transferSource": "Kaynak",
"modQueue.transferTarget": "Foruma", "modQueue.transferTarget": "Hedef",
"modQueue.transferFields": "Alanları kopyala", "modQueue.transferFields": "Alanları kopyala",
"modQueue.transferNoFields": "Kopyalamak için en az bir alan seçin.", "modQueue.transferNoFields": "Kopyalamak için en az bir alan seçin.",
"modQueue.transferSuccess": "Aktarıldı. Orijinal gönderi artık yeni panoya işaret ediyor.", "modQueue.transferSuccess": "/trash/ panosuna taşındı. Orijinal gönderi artık /trash/ panosuna işaret ediyor.",
"transferred": "Aktarıldı", "transferred": "Aktarıldı",
"modQueue.transferTitleWithNumber": "No.{{number}} gönderisini aktar", "modQueue.transferTitleWithNumber": "No.{{number}} gönderisini /trash/ panosuna taşı",
"modQueue.transferRecreateNotice": "Bu gerçek bir protokol aktarımı değildir. 5chan gönderiyi seçilen panoda yeniden oluşturur ve orijinali kaldırır.", "modQueue.transferRecreateNotice": "Bu gerçek bir protokol aktarımı değildir. 5chan gönderiyi /trash/ panosunda yeniden oluşturur ve orijinali kaldırır.",
"modQueue.transferRepliesNotice": "Yanıtlar aktarılmaz. Orijinal gönderiyle birlikte silinirler.", "modQueue.transferRepliesNotice": "Yanıtlar taşınmaz. Orijinal gönderiyle birlikte silinirler.",
"modQueue.transferTemporaryAccountNotice": "5chan yalnızca bu kopyalanan gönderi için yeni bir geçici hesap oluşturacak, yayımladıktan sonra da silecek." "modQueue.transferTemporaryAccountNotice": "5chan yalnızca bu kopyalanan gönderi için yeni bir geçici hesap oluşturacak, yayımladıktan sonra da silecek.",
"trash": "Çöp"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Ви маєте відповісти посиланням.", "reply_link_required_alert": "Ви маєте відповісти посиланням.",
"reply_media_link_required_alert": "Ви маєте відповісти посиланням на зображення або відео.", "reply_media_link_required_alert": "Ви маєте відповісти посиланням на зображення або відео.",
"reply_links_not_allowed_alert": "Посилання у відповідях на цій дошці заборонені.", "reply_links_not_allowed_alert": "Посилання у відповідях на цій дошці заборонені.",
"transfer": "Перенести", "modQueue.transferTitle": "Перемістити допис у /trash/",
"modQueue.transferTitle": "Перенести допис",
"modQueue.transferSource": "З", "modQueue.transferSource": "З",
"modQueue.transferTarget": "На форум", "modQueue.transferTarget": "До",
"modQueue.transferFields": "Копіювати поля", "modQueue.transferFields": "Копіювати поля",
"modQueue.transferNoFields": "Виберіть принаймні одне поле для копіювання.", "modQueue.transferNoFields": "Виберіть принаймні одне поле для копіювання.",
"modQueue.transferSuccess": "Перенесено. Початковий допис тепер указує на нову дошку.", "modQueue.transferSuccess": "Переміщено у /trash/. Початковий допис тепер указує на /trash/.",
"transferred": "Перенесено", "transferred": "Перенесено",
"modQueue.transferTitleWithNumber": "Перенести допис No.{{number}}", "modQueue.transferTitleWithNumber": "Перемістити допис No.{{number}} у /trash/",
"modQueue.transferRecreateNotice": "Це не справжнє перенесення на рівні протоколу. 5chan заново створює допис на вибраній дошці та видаляє оригінал.", "modQueue.transferRecreateNotice": "Це не справжнє перенесення на рівні протоколу. 5chan заново створює допис у /trash/ і видаляє оригінал.",
"modQueue.transferRepliesNotice": "Відповіді не переносяться. Їх буде видалено разом із початковим дописом.", "modQueue.transferRepliesNotice": "Відповіді не переміщуються. Їх буде видалено разом із початковим дописом.",
"modQueue.transferTemporaryAccountNotice": "5chan створить новий тимчасовий акаунт лише для цього скопійованого допису, а після публікації видалить його." "modQueue.transferTemporaryAccountNotice": "5chan створить новий тимчасовий акаунт лише для цього скопійованого допису, а після публікації видалить його.",
"trash": "Кошик"
} }
+7 -7
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "آپ کو ایک لنک کے ساتھ جواب دینا ہوگا۔", "reply_link_required_alert": "آپ کو ایک لنک کے ساتھ جواب دینا ہوگا۔",
"reply_media_link_required_alert": "آپ کو تصویر یا ویڈیو کے لنک کے ساتھ جواب دینا ہوگا۔", "reply_media_link_required_alert": "آپ کو تصویر یا ویڈیو کے لنک کے ساتھ جواب دینا ہوگا۔",
"reply_links_not_allowed_alert": "اس بورڈ پر جوابات میں لنکس کی اجازت نہیں ہے۔", "reply_links_not_allowed_alert": "اس بورڈ پر جوابات میں لنکس کی اجازت نہیں ہے۔",
"transfer": "منتقل کریں", "modQueue.transferTitle": "پوسٹ کو /trash/ میں منتقل کریں",
"modQueue.transferTitle": "پوسٹ منتقل کریں",
"modQueue.transferSource": "سے", "modQueue.transferSource": "سے",
"modQueue.transferTarget": "بورڈ پر", "modQueue.transferTarget": "طرف",
"modQueue.transferFields": "فیلڈز کاپی کریں", "modQueue.transferFields": "فیلڈز کاپی کریں",
"modQueue.transferNoFields": "کاپی کرنے کے لیے کم از کم ایک فیلڈ منتخب کریں۔", "modQueue.transferNoFields": "کاپی کرنے کے لیے کم از کم ایک فیلڈ منتخب کریں۔",
"modQueue.transferSuccess": "منتقل کر دیا گیا۔ اصل پوسٹ اب نئے بورڈ کی طرف اشارہ کرتی ہے۔", "modQueue.transferSuccess": "/trash/ میں منتقل کر دیا گیا۔ اصل پوسٹ اب /trash/ کی طرف اشارہ کرتی ہے۔",
"transferred": "منتقل شدہ", "transferred": "منتقل شدہ",
"modQueue.transferTitleWithNumber": "پوسٹ No.{{number}} منتقل کریں", "modQueue.transferTitleWithNumber": "پوسٹ No.{{number}} کو /trash/ میں منتقل کریں",
"modQueue.transferRecreateNotice": "یہ حقیقی پروٹوکول ٹرانسفر نہیں ہے۔ 5chan منتخب بورڈ پر پوسٹ دوبارہ بناتا ہے اور اصل پوسٹ ہٹا دیتا ہے۔", "modQueue.transferRecreateNotice": "یہ حقیقی پروٹوکول ٹرانسفر نہیں ہے۔ 5chan پوسٹ کو /trash/ میں دوبارہ بناتا ہے اور اصل پوسٹ ہٹا دیتا ہے۔",
"modQueue.transferRepliesNotice": "جوابات منتقل نہیں ہوں گے۔ وہ اصل پوسٹ کے ساتھ حذف ہو جائیں گے۔", "modQueue.transferRepliesNotice": "جوابات منتقل نہیں ہوں گے۔ وہ اصل پوسٹ کے ساتھ حذف ہو جائیں گے۔",
"modQueue.transferTemporaryAccountNotice": "5chan صرف اس کاپی شدہ پوسٹ کے لیے ایک نیا عارضی اکاؤنٹ بنائے گا، پھر شائع ہونے کے بعد اسے حذف کر دے گا۔" "modQueue.transferTemporaryAccountNotice": "5chan صرف اس کاپی شدہ پوسٹ کے لیے ایک نیا عارضی اکاؤنٹ بنائے گا، پھر شائع ہونے کے بعد اسے حذف کر دے گا۔",
"trash": "ردی"
} }
+7 -7
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "Bạn phải trả lời bằng một liên kết.", "reply_link_required_alert": "Bạn phải trả lời bằng một liên kết.",
"reply_media_link_required_alert": "Bạn phải trả lời bằng một liên kết hình ảnh hoặc video.", "reply_media_link_required_alert": "Bạn phải trả lời bằng một liên kết hình ảnh hoặc video.",
"reply_links_not_allowed_alert": "Liên kết trong trả lời không được phép trên bảng này.", "reply_links_not_allowed_alert": "Liên kết trong trả lời không được phép trên bảng này.",
"transfer": "Chuyển", "modQueue.transferTitle": "Chuyển bài viết vào /trash/",
"modQueue.transferTitle": "Chuyển bài đăng",
"modQueue.transferSource": "Từ", "modQueue.transferSource": "Từ",
"modQueue.transferTarget": "Đến diễn đàn", "modQueue.transferTarget": "Đến",
"modQueue.transferFields": "Sao chép trường", "modQueue.transferFields": "Sao chép trường",
"modQueue.transferNoFields": "Chọn ít nhất một trường để sao chép.", "modQueue.transferNoFields": "Chọn ít nhất một trường để sao chép.",
"modQueue.transferSuccess": "Đã chuyển. Bài viết gốc hiện trỏ tới bảng mới.", "modQueue.transferSuccess": "Đã chuyển vào /trash/. Bài viết gốc hiện trỏ tới /trash/.",
"transferred": "Đã chuyển", "transferred": "Đã chuyển",
"modQueue.transferTitleWithNumber": "Chuyển bài viết No.{{number}}", "modQueue.transferTitleWithNumber": "Chuyển bài viết No.{{number}} vào /trash/",
"modQueue.transferRecreateNotice": "Đây không phải là chuyển bài thật ở cấp giao thức. 5chan tạo lại bài viết trên bảng đã chọn và gỡ bài gốc.", "modQueue.transferRecreateNotice": "Đây không phải là chuyển bài thật ở cấp giao thức. 5chan tạo lại bài viết trong /trash/ và gỡ bài gốc.",
"modQueue.transferRepliesNotice": "Các trả lời sẽ không được chuyển. Chúng sẽ bị xóa cùng với bài viết gốc.", "modQueue.transferRepliesNotice": "Các trả lời sẽ không được chuyển. Chúng sẽ bị xóa cùng với bài viết gốc.",
"modQueue.transferTemporaryAccountNotice": "5chan sẽ tạo một tài khoản tạm thời mới chỉ cho bài viết được sao chép này, rồi xóa tài khoản đó sau khi đăng." "modQueue.transferTemporaryAccountNotice": "5chan sẽ tạo một tài khoản tạm thời mới chỉ cho bài viết được sao chép này, rồi xóa tài khoản đó sau khi đăng.",
"trash": "Thùng rác"
} }
+8 -8
View File
@@ -450,16 +450,16 @@
"reply_link_required_alert": "你必须使用链接回复。", "reply_link_required_alert": "你必须使用链接回复。",
"reply_media_link_required_alert": "你必须使用图片或视频链接回复。", "reply_media_link_required_alert": "你必须使用图片或视频链接回复。",
"reply_links_not_allowed_alert": "此版块不允许回复链接。", "reply_links_not_allowed_alert": "此版块不允许回复链接。",
"transfer": "转移", "modQueue.transferTitle": "将帖子移至 /trash/",
"modQueue.transferTitle": "转移帖子",
"modQueue.transferSource": "来源", "modQueue.transferSource": "来源",
"modQueue.transferTarget": "转至论坛", "modQueue.transferTarget": "",
"modQueue.transferFields": "复制字段", "modQueue.transferFields": "复制字段",
"modQueue.transferNoFields": "请至少选择一个要复制的字段。", "modQueue.transferNoFields": "请至少选择一个要复制的字段。",
"modQueue.transferSuccess": "已转移。原帖现在指向新版块。", "modQueue.transferSuccess": "已移至 /trash/。原帖现在指向 /trash/。",
"transferred": "已转移", "transferred": "已转移",
"modQueue.transferTitleWithNumber": "转移帖子 No.{{number}}", "modQueue.transferTitleWithNumber": "帖子 No.{{number}} 移至 /trash/",
"modQueue.transferRecreateNotice": "这不是协议层面的真实转移。5chan 会在所选版块重新创建帖子,并移除原帖。", "modQueue.transferRecreateNotice": "这不是协议层面的真实转移。5chan 会在 /trash/ 重新创建帖子,并移除原帖。",
"modQueue.transferRepliesNotice": "回复不会被移。它们会随原帖一起删除。", "modQueue.transferRepliesNotice": "回复不会被移。它们会随原帖一起删除。",
"modQueue.transferTemporaryAccountNotice": "5chan 会专门为这个复制后的帖子创建一个新的临时账号,并在发布后删除它。" "modQueue.transferTemporaryAccountNotice": "5chan 会专门为这个复制后的帖子创建一个新的临时账号,并在发布后删除它。",
"trash": "垃圾箱"
} }
@@ -3,6 +3,7 @@ import { createElement } from 'react';
import { createRoot, type Root } from 'react-dom/client'; import { createRoot, type Root } from 'react-dom/client';
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'; import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
import EditMenu from '../edit-menu'; import EditMenu from '../edit-menu';
import { TRASH_BOARD_ADDRESS } from '../../../lib/special-boards';
(globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true; (globalThis as { IS_REACT_ACT_ENVIRONMENT?: boolean }).IS_REACT_ACT_ENVIRONMENT = true;
const act = (React as { act?: (cb: () => void | Promise<void>) => void | Promise<void> }).act as (cb: () => void | Promise<void>) => void | Promise<void>; const act = (React as { act?: (cb: () => void | Promise<void>) => void | Promise<void> }).act as (cb: () => void | Promise<void>) => void | Promise<void>;
@@ -435,7 +436,7 @@ describe('EditMenu', () => {
}); });
}); });
it('lets moderators transfer top-level published posts from the edit menu', async () => { it('lets moderators move top-level published posts to trash from the edit menu', async () => {
testState.privileges = { testState.privileges = {
isAccountCommentAuthor: false, isAccountCommentAuthor: false,
isAccountMod: true, isAccountMod: true,
@@ -444,7 +445,7 @@ describe('EditMenu', () => {
await renderMenu(basePost); await renderMenu(basePost);
await openMenu(); await openMenu();
await clickButton('transfer'); await clickButton('trash');
expect(container.querySelector('[data-testid="post-transfer-modal"]')?.getAttribute('data-cid')).toBe('comment-1'); expect(container.querySelector('[data-testid="post-transfer-modal"]')?.getAttribute('data-cid')).toBe('comment-1');
}); });
@@ -456,7 +457,8 @@ describe('EditMenu', () => {
['purged', { commentModeration: { purged: true } }], ['purged', { commentModeration: { purged: true } }],
['archived', { archived: true }], ['archived', { archived: true }],
['moderation archived', { commentModeration: { archived: true } }], ['moderation archived', { commentModeration: { archived: true } }],
])('does not let moderators transfer %s posts from the edit menu', async (_label, postPatch) => { ['trash board', { communityAddress: TRASH_BOARD_ADDRESS }],
])('does not let moderators move %s posts to trash from the edit menu', async (_label, postPatch) => {
testState.privileges = { testState.privileges = {
isAccountCommentAuthor: false, isAccountCommentAuthor: false,
isAccountMod: true, isAccountMod: true,
@@ -469,7 +471,7 @@ describe('EditMenu', () => {
}); });
await openMenu(); await openMenu();
expect(hasButton('transfer')).toBe(false); expect(hasButton('trash')).toBe(false);
}); });
it('lets moderators clear an existing canonical author ban', async () => { it('lets moderators clear an existing canonical author ban', async () => {
+3 -3
View File
@@ -18,7 +18,7 @@ import useIsMobile from '../../hooks/use-is-mobile';
import useAuthorPrivileges from '../../hooks/use-author-privileges'; import useAuthorPrivileges from '../../hooks/use-author-privileges';
import { useBoardPseudonymityMode } from '../../hooks/use-board-pseudonymity-mode'; import { useBoardPseudonymityMode } from '../../hooks/use-board-pseudonymity-mode';
import { getCommentCommunityAddress, withResolvedCommentCommunityAddress } from '../../lib/utils/comment-utils'; import { getCommentCommunityAddress, withResolvedCommentCommunityAddress } from '../../lib/utils/comment-utils';
import { canTransferComment } from '../../lib/comment-transfer'; import { canMoveCommentToTrash } from '../../lib/comment-transfer';
import PostTransferModal from '../post-transfer-modal/post-transfer-modal'; import PostTransferModal from '../post-transfer-modal/post-transfer-modal';
const daysToTimestampInSeconds = (days: number) => { const daysToTimestampInSeconds = (days: number) => {
@@ -90,7 +90,7 @@ const EditMenu = ({ post }: { post: Comment }) => {
const canAttemptAuthorDelete = isAccountCommentAuthor || allowsPseudonymousDelete; const canAttemptAuthorDelete = isAccountCommentAuthor || allowsPseudonymousDelete;
const canOpenEditMenu = isAccountMod || canAttemptAuthorDelete; const canOpenEditMenu = isAccountMod || canAttemptAuthorDelete;
const canEditOwnModPost = isAccountMod && isAccountCommentAuthor; const canEditOwnModPost = isAccountMod && isAccountCommentAuthor;
const canTransferPost = isAccountMod && canTransferComment(resolvedPost); const canTransferPost = isAccountMod && canMoveCommentToTrash(resolvedPost);
const signer = isAccountCommentAuthor ? account?.signer : undefined; const signer = isAccountCommentAuthor ? account?.signer : undefined;
const latestPostRef = useRef(resolvedPost); const latestPostRef = useRef(resolvedPost);
useEffect(() => { useEffect(() => {
@@ -552,7 +552,7 @@ const EditMenu = ({ post }: { post: Comment }) => {
<div className={styles.menuItem}> <div className={styles.menuItem}>
[ [
<button type='button' className={styles.menuButton} onClick={openTransfer}> <button type='button' className={styles.menuButton} onClick={openTransfer}>
{t('transfer')} {t('trash')}
</button> </button>
?] ?]
</div> </div>
+1 -1
View File
@@ -472,7 +472,7 @@ const PostInfo = ({
<span className={styles.modQueueButtonWrapper}> <span className={styles.modQueueButtonWrapper}>
[ [
<button type='button' className={styles.modQueueActionButton} onClick={onTransfer} disabled={isPublishing}> <button type='button' className={styles.modQueueActionButton} onClick={onTransfer} disabled={isPublishing}>
{t('transfer')} {t('trash')}
</button> </button>
] ]
</span> </span>
+1 -1
View File
@@ -862,7 +862,7 @@ const PostMobile = ({
</button> </button>
{onTransfer && ( {onTransfer && (
<button type='button' className='button' onClick={onTransfer} disabled={isPublishing}> <button type='button' className='button' onClick={onTransfer} disabled={isPublishing}>
{t('transfer')} {t('trash')}
</button> </button>
)} )}
</> </>
@@ -154,28 +154,20 @@ describe('PostTransferModal', () => {
expect(modal?.style.transform).toBe(''); expect(modal?.style.transform).toBe('');
}); });
it('offers the hidden trash board as a transfer target', async () => { it('renders the hidden trash board as the fixed transfer target', async () => {
await renderTransferModal(); await renderTransferModal();
const options = Array.from(document.body.querySelectorAll<HTMLOptionElement>('select option')).map((option) => ({ expect(document.body.textContent).toContain(TRASH_BOARD_TITLE);
text: option.textContent, expect(document.body.querySelector('select')).toBeNull();
value: option.value,
}));
expect(options).toContainEqual({ text: TRASH_BOARD_TITLE, value: TRASH_BOARD_ADDRESS });
}); });
it('resolves the hidden trash board when it is the transfer source', async () => { it('disables submission when the hidden trash board is the transfer source', async () => {
await renderTransferModal({ ...baseComment, communityAddress: TRASH_BOARD_ADDRESS }); await renderTransferModal({ ...baseComment, communityAddress: TRASH_BOARD_ADDRESS });
expect(document.body.textContent).toContain(TRASH_BOARD_TITLE); expect(document.body.textContent).toContain(TRASH_BOARD_TITLE);
expect(document.body.querySelector('select')).toBeNull();
const select = document.body.querySelector<HTMLSelectElement>('select'); const submitButton = Array.from(document.body.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.type === 'submit');
expect(select).not.toBeNull(); expect(submitButton?.disabled).toBe(true);
await act(async () => {
select!.value = 'random-nsfw.bso';
select!.dispatchEvent(new Event('change', { bubbles: true }));
});
const form = document.body.querySelector<HTMLFormElement>('form'); const form = document.body.querySelector<HTMLFormElement>('form');
expect(form).not.toBeNull(); expect(form).not.toBeNull();
@@ -183,29 +175,17 @@ describe('PostTransferModal', () => {
form!.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true })); form!.dispatchEvent(new Event('submit', { bubbles: true, cancelable: true }));
}); });
const [publishOptions] = testState.publishCommentMock.mock.calls[0] as [Record<string, unknown>, string]; expect(testState.publishCommentMock).not.toHaveBeenCalled();
await act(async () => { expect(testState.publishCommentModerationMock).not.toHaveBeenCalled();
await (publishOptions.onChallengeVerification as (verification: unknown, comment: unknown) => Promise<void>)(
{ challengeSuccess: true, commentUpdate: { cid: 'target-comment' } },
{ cid: 'challenge-comment' },
);
});
const [sourceModerationOptions] = testState.publishCommentModerationMock.mock.calls[1] as [{ commentModeration: { reason: string } }, string];
expect(sourceModerationOptions.commentModeration.reason).toContain('/trash/');
expect(sourceModerationOptions.commentModeration.reason).toContain('(the rules)');
}); });
it('does not offer the hidden trash board target when the source uses its public key alias', async () => { it('disables submission when the transfer source uses the trash public key alias', async () => {
await renderTransferModal({ ...baseComment, communityAddress: TRASH_BOARD_PUBLIC_KEY }); await renderTransferModal({ ...baseComment, communityAddress: TRASH_BOARD_PUBLIC_KEY });
const options = Array.from(document.body.querySelectorAll<HTMLOptionElement>('select option')).map((option) => ({
text: option.textContent,
value: option.value,
}));
expect(document.body.textContent).toContain(TRASH_BOARD_TITLE); expect(document.body.textContent).toContain(TRASH_BOARD_TITLE);
expect(options).not.toContainEqual({ text: TRASH_BOARD_TITLE, value: TRASH_BOARD_ADDRESS }); expect(document.body.querySelector('select')).toBeNull();
const submitButton = Array.from(document.body.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.type === 'submit');
expect(submitButton?.disabled).toBe(true);
}); });
it('reopens desktop transfer modals at the last dragged session position', async () => { it('reopens desktop transfer modals at the last dragged session position', async () => {
@@ -12,7 +12,7 @@ import { alertChallengeVerificationFailed } from '../../lib/utils/challenge-util
import { areSameBoardAddress } from '../../lib/utils/route-utils'; import { areSameBoardAddress } from '../../lib/utils/route-utils';
import { getCommentCommunityAddress } from '../../lib/utils/comment-utils'; import { getCommentCommunityAddress } from '../../lib/utils/comment-utils';
import capitalize from 'lodash/capitalize'; import capitalize from 'lodash/capitalize';
import { getSpecialBoardByAddress, SPECIAL_BOARDS } from '../../lib/special-boards'; import { getSpecialBoardByAddress, TRASH_BOARD_ADDRESS } from '../../lib/special-boards';
import styles from './post-transfer-modal.module.css'; import styles from './post-transfer-modal.module.css';
import { import {
getAvailableTransferFields, getAvailableTransferFields,
@@ -43,7 +43,6 @@ const TRANSFER_MODAL_VIEWPORT_GUTTER_PX = 20;
const TRANSFER_MODAL_POSITION_SESSION_STORAGE_KEY = '5chan:transfer-modal-position'; const TRANSFER_MODAL_POSITION_SESSION_STORAGE_KEY = '5chan:transfer-modal-position';
interface TransferModalState { interface TransferModalState {
targetBoardAddress: string;
selectedFields: PostTransferFields; selectedFields: PostTransferFields;
transferState: PostTransferState; transferState: PostTransferState;
transferError?: unknown; transferError?: unknown;
@@ -51,7 +50,6 @@ interface TransferModalState {
type TransferModalAction = type TransferModalAction =
| { type: 'field'; field: PostTransferField; checked: boolean } | { type: 'field'; field: PostTransferField; checked: boolean }
| { type: 'targetBoard'; value: string }
| { type: 'publishStarted' } | { type: 'publishStarted' }
| { type: 'publishSucceeded' } | { type: 'publishSucceeded' }
| { type: 'publishFinalizationFailed'; error: unknown } | { type: 'publishFinalizationFailed'; error: unknown }
@@ -65,7 +63,6 @@ interface PostTransferModalProps {
} }
const getInitialTransferModalState = (comment: Comment): TransferModalState => ({ const getInitialTransferModalState = (comment: Comment): TransferModalState => ({
targetBoardAddress: '',
selectedFields: getInitialTransferFields(comment), selectedFields: getInitialTransferFields(comment),
transferState: 'idle', transferState: 'idle',
}); });
@@ -80,10 +77,6 @@ const transferModalReducer = (state: TransferModalState, action: TransferModalAc
if (isTerminalTransferState(state.transferState)) return state; if (isTerminalTransferState(state.transferState)) return state;
return resetTransferResult({ ...state, selectedFields: { ...state.selectedFields, [action.field]: action.checked } }); return resetTransferResult({ ...state, selectedFields: { ...state.selectedFields, [action.field]: action.checked } });
} }
if (action.type === 'targetBoard') {
if (isTerminalTransferState(state.transferState)) return state;
return resetTransferResult({ ...state, targetBoardAddress: action.value });
}
if (action.type === 'publishStarted') { if (action.type === 'publishStarted') {
return { ...state, transferState: 'publishing', transferError: undefined }; return { ...state, transferState: 'publishing', transferError: undefined };
} }
@@ -192,17 +185,13 @@ const PostTransferModal = ({ comment, onClose, onTransferStateChange, onTransfer
const deleteAccount = useAccountsStore((state) => state.accountsActions.deleteAccount) as DeleteAccountAction; const deleteAccount = useAccountsStore((state) => state.accountsActions.deleteAccount) as DeleteAccountAction;
const sourceCommunityAddress = getCommentCommunityAddress(comment); const sourceCommunityAddress = getCommentCommunityAddress(comment);
const sourceCommentCid = comment.cid; const sourceCommentCid = comment.cid;
const boardOptions = useMemo(() => { const resolvedTargetBoardAddress = TRASH_BOARD_ADDRESS;
const transferTargets = [...directories, ...SPECIAL_BOARDS]; const resolvedTargetBoard = getSpecialBoardByAddress(TRASH_BOARD_ADDRESS);
return transferTargets const targetBoardLabel = getTransferBoardLabel(resolvedTargetBoard ?? { address: TRASH_BOARD_ADDRESS });
.filter((community) => community.address && !isSameTransferBoard(community, sourceCommunityAddress)) const isSourceTargetBoard = isSameTransferBoard(resolvedTargetBoard ?? { address: TRASH_BOARD_ADDRESS }, sourceCommunityAddress);
.sort((left, right) => getTransferBoardLabel(left).localeCompare(getTransferBoardLabel(right), undefined, { sensitivity: 'base' }));
}, [directories, sourceCommunityAddress]);
const [modalState, dispatchModalState] = useReducer(transferModalReducer, comment, getInitialTransferModalState); const [modalState, dispatchModalState] = useReducer(transferModalReducer, comment, getInitialTransferModalState);
const { targetBoardAddress, selectedFields, transferState, transferError } = modalState; const { selectedFields, transferState, transferError } = modalState;
const resolvedTargetBoardAddress = targetBoardAddress;
const resolvedTargetBoard = boardOptions.find((community) => community.address === targetBoardAddress);
const availableFields = useMemo(() => getAvailableTransferFields(comment), [comment]); const availableFields = useMemo(() => getAvailableTransferFields(comment), [comment]);
const sourceBoard = useMemo(() => { const sourceBoard = useMemo(() => {
if (!sourceCommunityAddress) return undefined; if (!sourceCommunityAddress) return undefined;
@@ -217,7 +206,7 @@ const PostTransferModal = ({ comment, onClose, onTransferStateChange, onTransfer
const canSubmit = const canSubmit =
!isPublishingTransfer && !isPublishingTransfer &&
!isTransferComplete && !isTransferComplete &&
Boolean(targetBoardAddress) && !isSourceTargetBoard &&
Boolean(sourceCommunityAddress) && Boolean(sourceCommunityAddress) &&
Boolean(sourceCommentCid) && Boolean(sourceCommentCid) &&
typeof createAccount === 'function' && typeof createAccount === 'function' &&
@@ -454,23 +443,10 @@ const PostTransferModal = ({ comment, onClose, onTransferStateChange, onTransfer
<span className={styles.transferLabel}>{t('modQueue.transferSource')}</span> <span className={styles.transferLabel}>{t('modQueue.transferSource')}</span>
<span>{sourceBoardLabel}</span> <span>{sourceBoardLabel}</span>
</div> </div>
<label className={styles.transferRow}> <div className={styles.transferRow}>
<span className={styles.transferLabel}>{t('modQueue.transferTarget')}</span> <span className={styles.transferLabel}>{t('modQueue.transferTarget')}</span>
<select <span>{targetBoardLabel}</span>
value={targetBoardAddress} </div>
onChange={(event) => dispatchModalState({ type: 'targetBoard', value: event.target.value })}
disabled={isPublishingTransfer || isTransferComplete}
>
<option value='' disabled>
{t('choose_one')}
</option>
{boardOptions.map((community) => (
<option key={community.address} value={community.address}>
{getTransferBoardLabel(community)}
</option>
))}
</select>
</label>
<fieldset className={styles.transferFields}> <fieldset className={styles.transferFields}>
<legend>{t('modQueue.transferFields')}</legend> <legend>{t('modQueue.transferFields')}</legend>
@@ -507,7 +483,7 @@ const PostTransferModal = ({ comment, onClose, onTransferStateChange, onTransfer
{t('close')} {t('close')}
</button> </button>
<button type='submit' disabled={!canSubmit}> <button type='submit' disabled={!canSubmit}>
{isPublishingTransfer ? t('publishing') : t('transfer')} {isPublishingTransfer ? t('publishing') : t('trash')}
</button> </button>
</div> </div>
</form> </form>
+9 -1
View File
@@ -1,5 +1,6 @@
import { describe, expect, it } from 'vitest'; import { describe, expect, it } from 'vitest';
import { import {
canMoveCommentToTrash,
canTransferComment, canTransferComment,
getTargetTransferModerationFlairs, getTargetTransferModerationFlairs,
getTransferPublishPayload, getTransferPublishPayload,
@@ -9,7 +10,7 @@ import {
hasTransferredCommentMarker, hasTransferredCommentMarker,
TRANSFERRED_COMMENT_FLAIR, TRANSFERRED_COMMENT_FLAIR,
} from '../comment-transfer'; } from '../comment-transfer';
import { TRASH_BOARD_ADDRESS, TRASH_BOARD_CODE, TRASH_BOARD_TITLE } from '../special-boards'; import { TRASH_BOARD_ADDRESS, TRASH_BOARD_CODE, TRASH_BOARD_PUBLIC_KEY, TRASH_BOARD_TITLE } from '../special-boards';
describe('comment-transfer', () => { describe('comment-transfer', () => {
const selectedFields = { const selectedFields = {
@@ -33,6 +34,13 @@ describe('comment-transfer', () => {
expect(canTransferComment({ cid: 'source', commentModeration: { archived: true } } as never)).toBe(false); expect(canTransferComment({ cid: 'source', commentModeration: { archived: true } } as never)).toBe(false);
}); });
it('only allows movable posts outside the trash board to move to trash', () => {
expect(canMoveCommentToTrash({ cid: 'source', communityAddress: 'music-posting.eth' } as never)).toBe(true);
expect(canMoveCommentToTrash({ cid: 'source', communityAddress: TRASH_BOARD_ADDRESS } as never)).toBe(false);
expect(canMoveCommentToTrash({ cid: 'source', communityAddress: TRASH_BOARD_PUBLIC_KEY } as never)).toBe(false);
expect(canMoveCommentToTrash({ cid: 'reply', parentCid: 'source', communityAddress: 'music-posting.eth' } as never)).toBe(false);
});
it('copies selected post fields while excluding flag and transferred flairs', () => { it('copies selected post fields while excluding flag and transferred flairs', () => {
const payload = getTransferPublishPayload( const payload = getTransferPublishPayload(
{ {
+5 -1
View File
@@ -1,7 +1,8 @@
import type { Comment } from '@bitsocial/bitsocial-react-hooks'; import type { Comment } from '@bitsocial/bitsocial-react-hooks';
import { isCommentFlagFlair } from './comment-flags'; import { isCommentFlagFlair } from './comment-flags';
import { isSpecialBoardCode } from './special-boards'; import { getSpecialBoardByAddress, isSpecialBoardCode, TRASH_BOARD_CODE } from './special-boards';
import { isCommentArchived } from './utils/comment-moderation-utils'; import { isCommentArchived } from './utils/comment-moderation-utils';
import { getCommentCommunityAddress } from './utils/comment-utils';
import { normalizePublishURL } from './utils/url-utils'; import { normalizePublishURL } from './utils/url-utils';
export type PostTransferField = 'displayName' | 'title' | 'content' | 'link' | 'spoiler' | 'flairs'; export type PostTransferField = 'displayName' | 'title' | 'content' | 'link' | 'spoiler' | 'flairs';
@@ -47,6 +48,9 @@ export const canTransferComment = (comment: Comment | undefined): boolean => {
); );
}; };
export const canMoveCommentToTrash = (comment: Comment | undefined): boolean =>
canTransferComment(comment) && getSpecialBoardByAddress(getCommentCommunityAddress(comment))?.directoryCode !== TRASH_BOARD_CODE;
export const getInitialTransferFields = (comment: Comment): PostTransferFields => ({ export const getInitialTransferFields = (comment: Comment): PostTransferFields => ({
displayName: false, displayName: false,
title: Boolean(getTextField(comment.title)), title: Boolean(getTextField(comment.title)),
@@ -81,7 +81,11 @@ useModQueueStoreMock.getState = getModQueueState;
vi.mock('react-i18next', () => ({ vi.mock('react-i18next', () => ({
useTranslation: () => ({ useTranslation: () => ({
t: (key: string, options?: Record<string, unknown>) => (key === 'modQueue.transferTitleWithNumber' ? `Transfer Post No.${options?.number}` : key), t: (key: string, options?: Record<string, unknown>) => {
if (key === 'modQueue.transferTitleWithNumber') return `Move Post No.${options?.number} to /trash/`;
if (key === 'trash') return 'Trash';
return key;
},
}), }),
})); }));
@@ -311,7 +315,7 @@ vi.mock('../../post/post', () => ({
'data-testid': 'mod-queue-feed-post', 'data-testid': 'mod-queue-feed-post',
}, },
post?.cid ?? 'missing', post?.cid ?? 'missing',
onTransfer ? createElement('button', { type: 'button', onClick: onTransfer }, 'transfer') : null, onTransfer ? createElement('button', { type: 'button', onClick: onTransfer }, 'Trash') : null,
), ),
})); }));
@@ -580,7 +584,7 @@ describe('ModQueueView', () => {
expect(previewPost?.getAttribute('data-show-replies')).toBe('false'); expect(previewPost?.getAttribute('data-show-replies')).toBe('false');
}); });
it('transfers a queued post to another board with a temporary account', async () => { it('moves a queued post to /trash/ with a temporary account', async () => {
testState.directories = [ testState.directories = [
{ address: 'music-posting.eth', directoryCode: 'mu', title: '/mu/ - Music' }, { address: 'music-posting.eth', directoryCode: 'mu', title: '/mu/ - Music' },
{ address: 'tech-posting.eth', directoryCode: 'g', title: '/g/ - Technology' }, { address: 'tech-posting.eth', directoryCode: 'g', title: '/g/ - Technology' },
@@ -604,7 +608,7 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'transfer'); const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'Trash');
expect(transferButton).toBeTruthy(); expect(transferButton).toBeTruthy();
await act(async () => { await act(async () => {
@@ -612,25 +616,18 @@ describe('ModQueueView', () => {
}); });
const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]'); const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]');
expect(dialog?.textContent).toContain('Transfer Post No.8'); expect(dialog?.textContent).toContain('Move Post No.8 to /trash/');
expect(dialog?.textContent).toContain('/g/ - Technology'); expect(dialog?.textContent).toContain('/trash/ - Off-topic');
expect(dialog?.textContent).not.toContain('/g/ - Technology');
expect(dialog?.textContent).not.toContain('/a/ - Anime & Manga');
expect(dialog?.textContent).toContain('modQueue.transferRecreateNotice'); expect(dialog?.textContent).toContain('modQueue.transferRecreateNotice');
expect(dialog?.textContent).toContain('modQueue.transferRepliesNotice'); expect(dialog?.textContent).toContain('modQueue.transferRepliesNotice');
expect(dialog?.textContent).toContain('modQueue.transferTemporaryAccountNotice'); expect(dialog?.textContent).toContain('modQueue.transferTemporaryAccountNotice');
expect(dialog?.textContent).not.toContain('modQueue.transferAccount'); expect(dialog?.textContent).not.toContain('modQueue.transferAccount');
const targetSelect = dialog?.querySelector<HTMLSelectElement>('select'); expect(dialog?.querySelector('select')).toBeNull();
expect(Array.from(targetSelect?.options ?? []).map((option) => option.value)).toEqual(['', 'anime-posting.eth', 'tech-posting.eth', TRASH_BOARD_ADDRESS]);
const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit'); const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit');
expect(submitButton?.disabled).toBe(true);
await act(async () => {
if (targetSelect) {
targetSelect.value = 'tech-posting.eth';
targetSelect.dispatchEvent(new Event('change', { bubbles: true }));
}
});
expect(submitButton?.disabled).toBe(false); expect(submitButton?.disabled).toBe(false);
await act(async () => { await act(async () => {
submitButton?.click(); submitButton?.click();
await Promise.resolve(); await Promise.resolve();
@@ -643,7 +640,7 @@ describe('ModQueueView', () => {
const [payload, accountName] = testState.publishCommentMock.mock.calls[0]; const [payload, accountName] = testState.publishCommentMock.mock.calls[0];
expect(accountName).toBe(temporaryAccountName); expect(accountName).toBe(temporaryAccountName);
expect(payload).toMatchObject({ expect(payload).toMatchObject({
communityAddress: 'tech-posting.eth', communityAddress: TRASH_BOARD_ADDRESS,
content: 'belongs on tech', content: 'belongs on tech',
flairs: [{ text: 'flash:loop' }], flairs: [{ text: 'flash:loop' }],
link: 'https://example.com/image.png', link: 'https://example.com/image.png',
@@ -655,7 +652,7 @@ describe('ModQueueView', () => {
const alertSpy = vi.spyOn(window, 'alert').mockImplementation(() => undefined); const alertSpy = vi.spyOn(window, 'alert').mockImplementation(() => undefined);
await act(async () => { await act(async () => {
await payload.onChallengeVerification({ challengeSuccess: false, reason: 'try again' }, { cid: 'retry-post', communityAddress: 'tech-posting.eth' }); await payload.onChallengeVerification({ challengeSuccess: false, reason: 'try again' }, { cid: 'retry-post', communityAddress: TRASH_BOARD_ADDRESS });
await Promise.resolve(); await Promise.resolve();
}); });
@@ -673,7 +670,7 @@ describe('ModQueueView', () => {
expect(testState.publishCommentModerationActionMock).toHaveBeenCalledTimes(2); expect(testState.publishCommentModerationActionMock).toHaveBeenCalledTimes(2);
expect(testState.publishCommentModerationActionMock.mock.calls[0][0]).toMatchObject({ expect(testState.publishCommentModerationActionMock.mock.calls[0][0]).toMatchObject({
commentCid: 'transferred-post', commentCid: 'transferred-post',
communityAddress: 'tech-posting.eth', communityAddress: TRASH_BOARD_ADDRESS,
commentModeration: { commentModeration: {
flairs: [{ text: 'flash:loop' }, { text: '5chan:transferred' }], flairs: [{ text: 'flash:loop' }, { text: '5chan:transferred' }],
}, },
@@ -683,14 +680,13 @@ describe('ModQueueView', () => {
communityAddress: 'music-posting.eth', communityAddress: 'music-posting.eth',
commentModeration: { commentModeration: {
approved: false, approved: false,
reason: 'Moved to >>>/g/, this post did not belong to /mu/ ([rules](/rules#mu))', reason: 'Moved to >>>/trash/, this post did not belong to /mu/ ([rules](/rules#mu))',
}, },
}); });
expect(testState.deleteAccountMock).toHaveBeenCalledWith(temporaryAccountName); expect(testState.deleteAccountMock).toHaveBeenCalledWith(temporaryAccountName);
expect(dialog?.textContent).toContain('modQueue.transferSuccess'); expect(dialog?.textContent).toContain('modQueue.transferSuccess');
expect(dialog?.textContent).not.toContain('#12'); expect(dialog?.textContent).not.toContain('#12');
expect(submitButton?.disabled).toBe(true); expect(submitButton?.disabled).toBe(true);
expect(targetSelect?.disabled).toBe(true);
expect(testState.rememberCommentsInQueueMock).toHaveBeenCalledWith([ expect(testState.rememberCommentsInQueueMock).toHaveBeenCalledWith([
expect.objectContaining({ expect.objectContaining({
approved: false, approved: false,
@@ -699,9 +695,9 @@ describe('ModQueueView', () => {
}), }),
]); ]);
expect(container.textContent).toContain('rejected'); expect(container.textContent).toContain('rejected');
expect( expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => ['approve', 'reject', 'Trash'].includes(button.textContent ?? ''))).toBe(
Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => ['approve', 'reject', 'transfer'].includes(button.textContent ?? '')), false,
).toBe(false); );
await act(async () => { await act(async () => {
submitButton?.click(); submitButton?.click();
@@ -732,19 +728,13 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'transfer'); const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'Trash');
await act(async () => { await act(async () => {
transferButton?.click(); transferButton?.click();
}); });
const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]'); const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]');
const targetSelect = dialog?.querySelector<HTMLSelectElement>('select'); expect(dialog?.querySelector('select')).toBeNull();
await act(async () => {
if (targetSelect) {
targetSelect.value = 'tech-posting.eth';
targetSelect.dispatchEvent(new Event('change', { bubbles: true }));
}
});
const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit'); const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit');
await act(async () => { await act(async () => {
@@ -760,7 +750,6 @@ describe('ModQueueView', () => {
expect(dialog?.querySelector('[data-testid="error-display"]')?.textContent).toBe('target marker failed'); expect(dialog?.querySelector('[data-testid="error-display"]')?.textContent).toBe('target marker failed');
expect(submitButton?.disabled).toBe(true); expect(submitButton?.disabled).toBe(true);
expect(targetSelect?.disabled).toBe(true);
expect(testState.deleteAccountMock).toHaveBeenCalled(); expect(testState.deleteAccountMock).toHaveBeenCalled();
await act(async () => { await act(async () => {
@@ -775,7 +764,7 @@ describe('ModQueueView', () => {
closeButton?.click(); closeButton?.click();
}); });
expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => button.textContent === 'transfer')).toBe(false); expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => button.textContent === 'Trash')).toBe(false);
}); });
it('awaits transfer publish rollback before enabling retry', async () => { it('awaits transfer publish rollback before enabling retry', async () => {
@@ -803,19 +792,13 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'transfer'); const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'Trash');
await act(async () => { await act(async () => {
transferButton?.click(); transferButton?.click();
}); });
const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]'); const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]');
const targetSelect = dialog?.querySelector<HTMLSelectElement>('select'); expect(dialog?.querySelector('select')).toBeNull();
await act(async () => {
if (targetSelect) {
targetSelect.value = 'tech-posting.eth';
targetSelect.dispatchEvent(new Event('change', { bubbles: true }));
}
});
const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit'); const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit');
await act(async () => { await act(async () => {
@@ -874,7 +857,7 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
let transferButtons = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'transfer'); let transferButtons = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'Trash');
expect(transferButtons).toHaveLength(2); expect(transferButtons).toHaveLength(2);
await act(async () => { await act(async () => {
@@ -882,7 +865,14 @@ describe('ModQueueView', () => {
}); });
expect(document.body.querySelectorAll('[role="dialog"][aria-labelledby="post-transfer-title"]')).toHaveLength(1); expect(document.body.querySelectorAll('[role="dialog"][aria-labelledby="post-transfer-title"]')).toHaveLength(1);
expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'transfer')).toHaveLength(0); transferButtons = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'Trash');
expect(transferButtons).toHaveLength(1);
await act(async () => {
transferButtons[0]?.click();
});
expect(document.body.querySelectorAll('[role="dialog"][aria-labelledby="post-transfer-title"]')).toHaveLength(1);
const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]'); const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]');
const closeButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.textContent === 'close'); const closeButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.textContent === 'close');
@@ -891,7 +881,7 @@ describe('ModQueueView', () => {
}); });
expect(document.body.querySelectorAll('[role="dialog"][aria-labelledby="post-transfer-title"]')).toHaveLength(0); expect(document.body.querySelectorAll('[role="dialog"][aria-labelledby="post-transfer-title"]')).toHaveLength(0);
transferButtons = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'transfer'); transferButtons = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'Trash');
expect(transferButtons).toHaveLength(2); expect(transferButtons).toHaveLength(2);
}); });
@@ -920,20 +910,14 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'transfer'); const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'Trash');
await act(async () => { await act(async () => {
transferButton?.click(); transferButton?.click();
}); });
expect(document.body.querySelectorAll('[role="dialog"][aria-labelledby="post-transfer-title"]')).toHaveLength(1); expect(document.body.querySelectorAll('[role="dialog"][aria-labelledby="post-transfer-title"]')).toHaveLength(1);
const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]'); const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]');
const targetSelect = dialog?.querySelector<HTMLSelectElement>('select'); expect(dialog?.querySelector('select')).toBeNull();
await act(async () => {
if (targetSelect) {
targetSelect.value = 'tech-posting.eth';
targetSelect.dispatchEvent(new Event('change', { bubbles: true }));
}
});
const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit'); const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit');
await act(async () => { await act(async () => {
@@ -946,14 +930,14 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
expect(document.body.querySelectorAll('[role="dialog"][aria-labelledby="post-transfer-title"]')).toHaveLength(0); expect(document.body.querySelectorAll('[role="dialog"][aria-labelledby="post-transfer-title"]')).toHaveLength(0);
expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'transfer')).toHaveLength(0); expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'Trash')).toHaveLength(0);
await act(async () => { await act(async () => {
await payload.onChallengeVerification({ challengeSuccess: true, commentUpdate: { cid: 'transferred-post' } }, { cid: 'transferred-post' }); await payload.onChallengeVerification({ challengeSuccess: true, commentUpdate: { cid: 'transferred-post' } }, { cid: 'transferred-post' });
await Promise.resolve(); await Promise.resolve();
}); });
expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'transfer')).toHaveLength(1); expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).filter((button) => button.textContent === 'Trash')).toHaveLength(1);
}); });
it('does not show transfer for queued replies', async () => { it('does not show transfer for queued replies', async () => {
@@ -971,7 +955,7 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => button.textContent === 'transfer')).toBe(false); expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => button.textContent === 'Trash')).toBe(false);
}); });
it.each([ it.each([
@@ -981,6 +965,7 @@ describe('ModQueueView', () => {
['purged', { commentModeration: { purged: true } }], ['purged', { commentModeration: { purged: true } }],
['archived', { archived: true }], ['archived', { archived: true }],
['moderation archived', { commentModeration: { archived: true } }], ['moderation archived', { commentModeration: { archived: true } }],
['trash board', { communityAddress: TRASH_BOARD_ADDRESS }],
])('does not show transfer for %s queued posts', async (_label, commentPatch) => { ])('does not show transfer for %s queued posts', async (_label, commentPatch) => {
testState.feed = [ testState.feed = [
{ {
@@ -996,7 +981,7 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => button.textContent === 'transfer')).toBe(false); expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => button.textContent === 'Trash')).toBe(false);
}); });
it('cleans up the temporary account and unlocks the transfer modal when the challenge is abandoned', async () => { it('cleans up the temporary account and unlocks the transfer modal when the challenge is abandoned', async () => {
@@ -1017,19 +1002,13 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'transfer'); const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'Trash');
await act(async () => { await act(async () => {
transferButton?.click(); transferButton?.click();
}); });
const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]'); const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]');
const targetSelect = dialog?.querySelector<HTMLSelectElement>('select'); expect(dialog?.querySelector('select')).toBeNull();
await act(async () => {
if (targetSelect) {
targetSelect.value = 'tech-posting.eth';
targetSelect.dispatchEvent(new Event('change', { bubbles: true }));
}
});
const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit'); const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit');
await act(async () => { await act(async () => {
@@ -1037,9 +1016,9 @@ describe('ModQueueView', () => {
await Promise.resolve(); await Promise.resolve();
}); });
expect(container.textContent).toContain('publishing'); expect(container.textContent).toContain('publishing');
expect( expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => ['approve', 'reject', 'Trash'].includes(button.textContent ?? ''))).toBe(
Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => ['approve', 'reject', 'transfer'].includes(button.textContent ?? '')), false,
).toBe(false); );
const temporaryAccountName = testState.createAccountMock.mock.calls[0][0]; const temporaryAccountName = testState.createAccountMock.mock.calls[0][0];
const [payload] = testState.publishCommentMock.mock.calls[0]; const [payload] = testState.publishCommentMock.mock.calls[0];
@@ -1084,13 +1063,13 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
expect(container.querySelector('[data-testid="mod-queue-feed-post"]')?.getAttribute('data-cid')).toBe('wrong-board-post'); expect(container.querySelector('[data-testid="mod-queue-feed-post"]')?.getAttribute('data-cid')).toBe('wrong-board-post');
const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'transfer'); const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'Trash');
await act(async () => { await act(async () => {
transferButton?.click(); transferButton?.click();
}); });
const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]'); const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]');
expect(dialog?.textContent).toContain('Transfer Post No.8'); expect(dialog?.textContent).toContain('Move Post No.8 to /trash/');
const closeButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.textContent === 'close'); const closeButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.textContent === 'close');
await act(async () => { await act(async () => {
@@ -1120,19 +1099,13 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
const feedPost = container.querySelector('[data-testid="mod-queue-feed-post"]'); const feedPost = container.querySelector('[data-testid="mod-queue-feed-post"]');
const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'transfer'); const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'Trash');
await act(async () => { await act(async () => {
transferButton?.click(); transferButton?.click();
}); });
const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]'); const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]');
const targetSelect = dialog?.querySelector<HTMLSelectElement>('select'); expect(dialog?.querySelector('select')).toBeNull();
await act(async () => {
if (targetSelect) {
targetSelect.value = 'tech-posting.eth';
targetSelect.dispatchEvent(new Event('change', { bubbles: true }));
}
});
const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit'); const submitButton = Array.from(dialog?.querySelectorAll<HTMLButtonElement>('button') ?? []).find((button) => button.type === 'submit');
await act(async () => { await act(async () => {
@@ -1150,7 +1123,7 @@ describe('ModQueueView', () => {
expect(feedPost?.getAttribute('data-is-publishing')).toBe('false'); expect(feedPost?.getAttribute('data-is-publishing')).toBe('false');
expect(feedPost?.getAttribute('data-mod-queue-status')).toBe('rejected'); expect(feedPost?.getAttribute('data-mod-queue-status')).toBe('rejected');
expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => button.textContent === 'transfer')).toBe(false); expect(Array.from(container.querySelectorAll<HTMLButtonElement>('button')).some((button) => button.textContent === 'Trash')).toBe(false);
}); });
it('keeps the transfer modal non-blocking and closes it with Escape', async () => { it('keeps the transfer modal non-blocking and closes it with Escape', async () => {
@@ -1171,13 +1144,13 @@ describe('ModQueueView', () => {
await renderModQueue(); await renderModQueue();
const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'transfer'); const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'Trash');
await act(async () => { await act(async () => {
transferButton?.click(); transferButton?.click();
}); });
const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]'); const dialog = document.body.querySelector<HTMLElement>('[role="dialog"][aria-labelledby="post-transfer-title"]');
expect(dialog?.textContent).toContain('Transfer Post No.8'); expect(dialog?.textContent).toContain('Move Post No.8 to /trash/');
await act(async () => { await act(async () => {
dialog?.querySelector('form')?.dispatchEvent(new MouseEvent('click', { bubbles: true })); dialog?.querySelector('form')?.dispatchEvent(new MouseEvent('click', { bubbles: true }));
@@ -1218,7 +1191,7 @@ describe('ModQueueView', () => {
try { try {
await renderModQueue(); await renderModQueue();
const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'transfer'); const transferButton = Array.from(container.querySelectorAll<HTMLButtonElement>('button')).find((button) => button.textContent === 'Trash');
await act(async () => { await act(async () => {
transferButton?.click(); transferButton?.click();
}); });
+6 -5
View File
@@ -46,7 +46,7 @@ import { PageFooterDesktop, PageFooterMobile, StyleOnlyFooterFirstRow } from '..
import footerStyles from '../../components/footer/footer.module.css'; import footerStyles from '../../components/footer/footer.module.css';
import { useModeratedCommunityAddressInputs, useModeratedCommunityAddressesForInputs } from '../../hooks/use-moderated-community-addresses'; import { useModeratedCommunityAddressInputs, useModeratedCommunityAddressesForInputs } from '../../hooks/use-moderated-community-addresses';
import PostTransferModal, { type PostTransferState } from '../../components/post-transfer-modal/post-transfer-modal'; import PostTransferModal, { type PostTransferState } from '../../components/post-transfer-modal/post-transfer-modal';
import { canTransferComment } from '../../lib/comment-transfer'; import { canMoveCommentToTrash } from '../../lib/comment-transfer';
/** Path for display: directory code, or full address if has TLD, or shortened for long IPNS keys (no dot) */ /** Path for display: directory code, or full address if has TLD, or shortened for long IPNS keys (no dot) */
const getBoardDisplayPath = (address: string, path: string): string => { const getBoardDisplayPath = (address: string, path: string): string => {
@@ -282,12 +282,13 @@ const useModQueueTransfer = (comment: Comment, transferControls: ModQueueTransfe
const rememberCommentsInQueue = useModQueueStore((state) => state.rememberCommentsInQueue); const rememberCommentsInQueue = useModQueueStore((state) => state.rememberCommentsInQueue);
const { activeTransferCommentCid, setActiveTransferCommentCid } = transferControls; const { activeTransferCommentCid, setActiveTransferCommentCid } = transferControls;
const transferCommentCid = comment.cid; const transferCommentCid = comment.cid;
const canTransfer = canTransferComment(comment); const canTransfer = canMoveCommentToTrash(comment);
const isTransferOpen = Boolean(transferCommentCid && activeTransferCommentCid === transferCommentCid); const isTransferOpen = Boolean(transferCommentCid && activeTransferCommentCid === transferCommentCid);
const isTransferPublishing = transferState === 'publishing'; const isTransferPublishing = transferState === 'publishing';
const isTransferSucceeded = transferState === 'succeeded'; const isTransferSucceeded = transferState === 'succeeded';
const isTransferTerminal = isTransferSucceeded || transferState === 'finalizationFailed'; const isTransferTerminal = isTransferSucceeded || transferState === 'finalizationFailed';
const canOpenTransfer = canTransfer && !isTransferTerminal && !activeTransferCommentCid && Boolean(transferCommentCid); const canOpenTransfer = canTransfer && !isTransferTerminal && !activeTransferCommentCid && Boolean(transferCommentCid);
const canShowTransfer = canTransfer && !isTransferTerminal && Boolean(transferCommentCid) && (!activeTransferCommentCid || isTransferOpen);
const handleTransfer = useCallback(() => { const handleTransfer = useCallback(() => {
if (canOpenTransfer && transferCommentCid) { if (canOpenTransfer && transferCommentCid) {
setActiveTransferCommentCid(transferCommentCid); setActiveTransferCommentCid(transferCommentCid);
@@ -327,7 +328,7 @@ const useModQueueTransfer = (comment: Comment, transferControls: ModQueueTransfe
}, [handleCloseTransfer]); }, [handleCloseTransfer]);
return { return {
handleTransfer: canOpenTransfer ? handleTransfer : undefined, handleTransfer: canShowTransfer ? handleTransfer : undefined,
isTransferPublishing, isTransferPublishing,
isTransferSucceeded, isTransferSucceeded,
transferModal: transferModal:
@@ -421,7 +422,7 @@ const ModQueueActions = ({ status, error, errorMessage, isPublishing, handleAppr
<span className={styles.buttonWrapper}> <span className={styles.buttonWrapper}>
[ [
<button type='button' className={styles.button} onClick={handleTransfer} disabled={isPublishing}> <button type='button' className={styles.button} onClick={handleTransfer} disabled={isPublishing}>
{t('transfer')} {t('trash')}
</button> </button>
] ]
</span> </span>
@@ -437,7 +438,7 @@ const ModQueueActions = ({ status, error, errorMessage, isPublishing, handleAppr
</button> </button>
{handleTransfer && ( {handleTransfer && (
<button type='button' className='button' onClick={handleTransfer} disabled={isPublishing}> <button type='button' className='button' onClick={handleTransfer} disabled={isPublishing}>
{t('transfer')} {t('trash')}
</button> </button>
)} )}
</div> </div>