Merge pull request #677 from plebbit/development

Development
This commit is contained in:
Tom (plebeius.eth)
2025-03-03 17:27:23 +01:00
committed by GitHub
56 changed files with 551 additions and 289 deletions
+2
View File
@@ -9,6 +9,7 @@
"@capacitor/app": "6.0.1",
"@floating-ui/react": "0.26.1",
"@plebbit/plebbit-react-hooks": "https://github.com/plebbit/plebbit-react-hooks.git#6d35eb3b4dc84f8fdcbb46d95e3b1d78f1750b5f",
"@react-spring/web": "9.7.5",
"@testing-library/jest-dom": "5.14.1",
"@testing-library/react": "13.0.0",
"@testing-library/user-event": "13.2.1",
@@ -16,6 +17,7 @@
"@types/node": "20.8.2",
"@types/react": "18.2.25",
"@types/react-dom": "18.2.10",
"@use-gesture/react": "10.3.1",
"cross-env": "7.0.3",
"electron-context-menu": "3.3.0",
"electron-is-dev": "2.0.0",
Binary file not shown.

After

Width:  |  Height:  |  Size: 89 KiB

+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "التعليق طويل جدًا. <1>اضغط هنا</1> لعرض النص الكامل.",
"replies_omitted": "{{repliesCount}} ردود محذوفة. <1>اضغط هنا</1> لعرضها.",
"replies_and_links_omitted": "{{repliesCount}} ردود و{{linksCount}} روابط محذوفة. <1>اضغط هنا</1> لعرضها.",
"thread_closed_alert": "الموضوع مغلق",
"this_thread_is_closed": "الموضوع مغلق",
"reply_to_cid": "الرد على {{cid}}",
"submit": "إرسال",
"gif": "جي آي إف",
@@ -284,5 +284,11 @@
"loading_subscriptions": "جارٍ تحميل الاشتراكات",
"create_board": "إنشاء لوحة",
"enter_board_address": "أدخل عنوان أي لوحة",
"board_not_reachable": "اللوحة غير قابلة للوصول"
"board_not_reachable": "اللوحة غير قابلة للوصول",
"cannot_edit_thread": "لا يمكنك تعديل هذا الموضوع",
"cannot_edit_reply": "لا يمكنك تعديل هذه الردود",
"this_thread_was_deleted": "تم حذف هذا الموضوع بواسطة مؤلفه",
"this_thread_was_removed": "تم إزالة هذا الموضوع بواسطة مشرفي المنتدى",
"this_reply_was_deleted": "تم حذف هذه الرد من قبل مؤلفه",
"this_reply_was_removed": "تمت إزالة هذه الرد من قبل مشرفي المنتدى"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "মন্তব্য খুব দীর্ঘ। <1>পূর্ণ পাঠ্য দেখতে এখানে ক্লিক করুন</1>।",
"replies_omitted": "{{repliesCount}}টি উত্তর বাদ দেওয়া হয়েছে। <1>দেখতে এখানে ক্লিক করুন</1>।",
"replies_and_links_omitted": "{{repliesCount}}টি উত্তর এবং {{linksCount}}টি লিঙ্ক বাদ দেওয়া হয়েছে। <1>দেখতে এখানে ক্লিক করুন</1>।",
"thread_closed_alert": "থ্রেডটি বন্ধ করা হয়েছে",
"this_thread_is_closed": "থ্রেডটি বন্ধ করা হয়েছে",
"reply_to_cid": "{{cid}}-এ উত্তর দিন",
"submit": "জমা দিন",
"gif": "জিআইএফ",
@@ -284,5 +284,11 @@
"loading_subscriptions": "সাবস্ক্রিপশন লোড হচ্ছে",
"create_board": "বোর্ড তৈরি করুন",
"enter_board_address": "যেকোনো বোর্ডের ঠিকানা লিখুন",
"board_not_reachable": "বোর্ডটি অ্যাক্সেসযোগ্য নয়"
"board_not_reachable": "বোর্ডটি অ্যাক্সেসযোগ্য নয়",
"cannot_edit_thread": "আপনি এই থ্রেডটি সম্পাদনা করতে পারবেন না",
"cannot_edit_reply": "আপনি এই রিপ্লাইটি সম্পাদনা করতে পারবেন না",
"this_thread_was_deleted": "এই থ্রেডটি এর লেখক দ্বারা মুছে ফেলা হয়েছে",
"this_thread_was_removed": "এই থ্রেডটি বোর্ড moderators দ্বারা মুছে ফেলা হয়েছে",
"this_reply_was_deleted": "এই প্রতিক্রিয়া তার লেখক দ্বারা মুছে ফেলা হয়েছে",
"this_reply_was_removed": "এই প্রতিক্রিয়া বোর্ড পরিচালকদের দ্বারা সরানো হয়েছে"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Komentář je příliš dlouhý. <1>Klikněte zde</1> pro zobrazení celého textu.",
"replies_omitted": "{{repliesCount}} odpovědí vynecháno. <1>Klikněte zde</1> pro zobrazení.",
"replies_and_links_omitted": "{{repliesCount}} odpovědí a {{linksCount}} odkazů vynecháno. <1>Klikněte zde</1> pro zobrazení.",
"thread_closed_alert": "Vlákno je uzavřeno",
"this_thread_is_closed": "Vlákno je uzavřeno",
"reply_to_cid": "Odpovědět na {{cid}}",
"submit": "Odeslat",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Načítání odběrů",
"create_board": "Vytvořit desku",
"enter_board_address": "Zadejte adresu libovolné desky",
"board_not_reachable": "Deska není dostupná"
"board_not_reachable": "Deska není dostupná",
"cannot_edit_thread": "Nemůžete upravit toto vlákno",
"cannot_edit_reply": "Tento příspěvek nelze upravit",
"this_thread_was_deleted": "Toto vlákno bylo smazáno jeho autorem",
"this_thread_was_removed": "Toto vlákno bylo odstraněno moderátory fóra",
"this_reply_was_deleted": "Tato odpověď byla smazána autorem",
"this_reply_was_removed": "Tato odpověď byla odstraněna moderátory fóra"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Kommentaren er for lang. <1>Klik her</1> for at se hele teksten.",
"replies_omitted": "{{repliesCount}} svar udeladt. <1>Klik her</1> for at se dem.",
"replies_and_links_omitted": "{{repliesCount}} svar og {{linksCount}} links udeladt. <1>Klik her</1> for at se dem.",
"thread_closed_alert": "Tråden er lukket",
"this_thread_is_closed": "Tråden er lukket",
"reply_to_cid": "Svar til {{cid}}",
"submit": "Indsend",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Indlæser abonnementer",
"create_board": "Opret tavle",
"enter_board_address": "Indtast enhver tavleadresse",
"board_not_reachable": "Boardet er ikke tilgængeligt"
"board_not_reachable": "Boardet er ikke tilgængeligt",
"cannot_edit_thread": "Du kan ikke redigere dette emne",
"cannot_edit_reply": "Du kan ikke redigere dette svar",
"this_thread_was_deleted": "Denne tråd blev slettet af dens forfatter",
"this_thread_was_removed": "Denne tråd blev fjernet af boardmoderatorer",
"this_reply_was_deleted": "Dette svar blev slettet af forfatteren",
"this_reply_was_removed": "Dette svar blev fjernet af forummoderatorer"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Kommentar zu lang. <1>Klicken Sie hier</1>, um den vollständigen Text anzuzeigen.",
"replies_omitted": "{{repliesCount}} Antworten ausgelassen. <1>Klicken Sie hier</1>, um sie anzuzeigen.",
"replies_and_links_omitted": "{{repliesCount}} Antworten und {{linksCount}} Links ausgelassen. <1>Klicken Sie hier</1>, um sie anzuzeigen.",
"thread_closed_alert": "Der Thread ist geschlossen",
"this_thread_is_closed": "Der Thread ist geschlossen",
"reply_to_cid": "Antwort an {{cid}}",
"submit": "Einreichen",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Lade Abonnements",
"create_board": "Board erstellen",
"enter_board_address": "Geben Sie eine beliebige Board-Adresse ein",
"board_not_reachable": "Board ist nicht erreichbar"
"board_not_reachable": "Board ist nicht erreichbar",
"cannot_edit_thread": "Sie können dieses Thema nicht bearbeiten",
"cannot_edit_reply": "Sie können diese Antwort nicht bearbeiten",
"this_thread_was_deleted": "Dieser Thread wurde von seinem Autor gelöscht",
"this_thread_was_removed": "Dieser Thread wurde von den Moderatoren des Boards entfernt",
"this_reply_was_deleted": "Diese Antwort wurde vom Autor gelöscht",
"this_reply_was_removed": "Diese Antwort wurde von den Forenmoderatoren entfernt"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Το σχόλιο είναι πολύ μακροσκελές. <1>Κάντε κλικ εδώ</1> για να δείτε το πλήρες κείμενο.",
"replies_omitted": "{{repliesCount}} απαντήσεις παραλείφθηκαν. <1>Κάντε κλικ εδώ</1> για να τις δείτε.",
"replies_and_links_omitted": "{{repliesCount}} απαντήσεις και {{linksCount}} σύνδεσμοι παραλείφθηκαν. <1>Κάντε κλικ εδώ</1> για να τις δείτε.",
"thread_closed_alert": "Το νήμα έχει κλείσει",
"this_thread_is_closed": "Το νήμα έχει κλείσει",
"reply_to_cid": "Απάντηση σε {{cid}}",
"submit": "Υποβολή",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Φορτώνει συνδρομές",
"create_board": "Δημιουργία πίνακα",
"enter_board_address": "Εισάγετε οποιαδήποτε διεύθυνση πίνακα",
"board_not_reachable": "Ο πίνακας δεν είναι προσβάσιμος"
"board_not_reachable": "Ο πίνακας δεν είναι προσβάσιμος",
"cannot_edit_thread": "Δεν μπορείτε να επεξεργαστείτε αυτήν την ανάρτηση",
"cannot_edit_reply": "Δεν μπορείτε να επεξεργαστείτε αυτήν την απάντηση",
"this_thread_was_deleted": "Αυτή η συζήτηση διαγράφηκε από τον συγγραφέα της",
"this_thread_was_removed": "Αυτή η συζήτηση αφαιρέθηκε από τους διαχειριστές του φόρουμ",
"this_reply_was_deleted": "Αυτή η απάντηση διαγράφηκε από τον συγγραφέα της",
"this_reply_was_removed": "Η απάντηση αυτή αφαιρέθηκε από τους διαχειριστές του φόρουμ"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Comment too long. <1>Click here</1> to view the full text.",
"replies_omitted": "{{repliesCount}} replies omitted. <1>Click here</1> to view.",
"replies_and_links_omitted": "{{repliesCount}} replies and {{linksCount}} links omitted. <1>Click here</1> to view.",
"thread_closed_alert": "This thread is closed",
"this_thread_is_closed": "This thread is closed",
"reply_to_cid": "Reply to {{cid}}",
"submit": "Submit",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Loading subscriptions",
"create_board": "Create Board",
"enter_board_address": "Enter any board address",
"board_not_reachable": "Board is not reachable"
"board_not_reachable": "Board is not reachable",
"cannot_edit_thread": "You cannot edit this thread",
"cannot_edit_reply": "You cannot edit this reply",
"this_thread_was_deleted": "This thread was deleted by its author",
"this_thread_was_removed": "This thread was removed by board moderators",
"this_reply_was_deleted": "This reply was deleted by its author",
"this_reply_was_removed": "This reply was removed by board moderators"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Comentario demasiado largo. <1>Haz clic aquí</1> para ver el texto completo.",
"replies_omitted": "{{repliesCount}} respuestas omitidas. <1>Haz clic aquí</1> para verlas.",
"replies_and_links_omitted": "{{repliesCount}} respuestas y {{linksCount}} enlaces omitidos. <1>Haz clic aquí</1> para verlos.",
"thread_closed_alert": "El hilo está cerrado",
"this_thread_is_closed": "El hilo está cerrado",
"reply_to_cid": "Responder a {{cid}}",
"submit": "Enviar",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Cargando suscripciones",
"create_board": "Crear tablero",
"enter_board_address": "Ingrese cualquier dirección de tablero",
"board_not_reachable": "El tablero no es accesible"
"board_not_reachable": "El tablero no es accesible",
"cannot_edit_thread": "No puedes editar este hilo",
"cannot_edit_reply": "No puedes editar esta respuesta",
"this_thread_was_deleted": "Este hilo fue eliminado por su autor",
"this_thread_was_removed": "Este hilo fue eliminado por los moderadores del foro",
"this_reply_was_deleted": "Esta respuesta fue eliminada por su autor",
"this_reply_was_removed": "Esta respuesta fue eliminada por los moderadores del foro"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "نظر بسیار طولانی است. <1>اینجا کلیک کنید</1> تا متن کامل را ببینید.",
"replies_omitted": "{{repliesCount}} پاسخ حذف شده است. <1>اینجا کلیک کنید</1> تا آنها را مشاهده کنید.",
"replies_and_links_omitted": "{{repliesCount}} پاسخ و {{linksCount}} لینک حذف شده است. <1>اینجا کلیک کنید</1> تا آنها را مشاهده کنید.",
"thread_closed_alert": "موضوع بسته شده است",
"this_thread_is_closed": "موضوع بسته شده است",
"reply_to_cid": "پاسخ به {{cid}}",
"submit": "ارسال",
"gif": "گیف",
@@ -284,5 +284,11 @@
"loading_subscriptions": "در حال بارگذاری اشترا‌ک‌ها",
"create_board": "ایجاد تابلو",
"enter_board_address": "آدرس هر تابلو را وارد کنید",
"board_not_reachable": "تابلو قابل دسترسی نیست"
"board_not_reachable": "تابلو قابل دسترسی نیست",
"cannot_edit_thread": "شما نمی‌توانید این موضوع را ویرایش کنید",
"cannot_edit_reply": "شما نمی‌توانید این پاسخ را ویرایش کنید",
"this_thread_was_deleted": "این موضوع توسط نویسنده‌اش حذف شد",
"this_thread_was_removed": "این تاپیک توسط مدیران انجمن حذف شد",
"this_reply_was_deleted": "این پاسخ توسط نویسنده‌اش حذف شد",
"this_reply_was_removed": "این پاسخ توسط مدیران انجمن حذف شد"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Kommentti on liian pitkä. <1>Napsauta tästä</1> nähdäksesi koko tekstin.",
"replies_omitted": "{{repliesCount}} vastausta jätetty pois. <1>Napsauta tästä</1> nähdäksesi ne.",
"replies_and_links_omitted": "{{repliesCount}} vastausta ja {{linksCount}} linkkiä jätetty pois. <1>Napsauta tästä</1> nähdäksesi ne.",
"thread_closed_alert": "Ketju on suljettu",
"this_thread_is_closed": "Ketju on suljettu",
"reply_to_cid": "Vastaa {{cid}}",
"submit": "Lähetä",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Ladataan tilauksia",
"create_board": "Luo taulu",
"enter_board_address": "Syötä mikä tahansa taulun osoite",
"board_not_reachable": "Taulua ei ole käytettävissä"
"board_not_reachable": "Taulua ei ole käytettävissä",
"cannot_edit_thread": "Et voi muokata tätä ketjua",
"cannot_edit_reply": "Et voi muokata tätä vastausta",
"this_thread_was_deleted": "Tämä ketju poistettiin sen kirjoittajan toimesta",
"this_thread_was_removed": "Tämä ketju poistettiin foorumin moderaattoreiden toimesta",
"this_reply_was_deleted": "Tämä vastaus poistettiin sen kirjoittajalta",
"this_reply_was_removed": "Tämä vastaus poistettiin foorumin moderaattoreiden toimesta"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Masyadong mahaba ang komento. <1>I-click dito</1> upang makita ang buong teksto.",
"replies_omitted": "{{repliesCount}} mga tugon ang hindi ipinakita. <1>I-click dito</1> upang makita.",
"replies_and_links_omitted": "{{repliesCount}} mga tugon at {{linksCount}} mga link ang hindi ipinakita. <1>I-click dito</1> upang makita.",
"thread_closed_alert": "Sarado na ang thread",
"this_thread_is_closed": "Sarado na ang thread",
"reply_to_cid": "Tumugon sa {{cid}}",
"submit": "Isumite",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Naglo-load ng mga subscription",
"create_board": "Gumawa ng board",
"enter_board_address": "Ipasok ang anumang address ng board",
"board_not_reachable": "Hindi maa-access ang board"
"board_not_reachable": "Hindi maa-access ang board",
"cannot_edit_thread": "Hindi mo maaaring i-edit ang thread na ito",
"cannot_edit_reply": "Hindi mo maaaring i-edit ang reply na ito",
"this_thread_was_deleted": "Ang thread na ito ay tinanggal ng may-akda nito",
"this_thread_was_removed": "Inalis ang thread na ito ng mga moderator ng board",
"this_reply_was_deleted": "Ang tugon na ito ay tinanggal ng may-akda nito",
"this_reply_was_removed": "Ang sagot na ito ay tinanggal ng mga moderator ng board"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Commentaire trop long. <1>Cliquez ici</1> pour voir le texte complet.",
"replies_omitted": "{{repliesCount}} réponses omises. <1>Cliquez ici</1> pour les afficher.",
"replies_and_links_omitted": "{{repliesCount}} réponses et {{linksCount}} liens omis. <1>Cliquez ici</1> pour les afficher.",
"thread_closed_alert": "Le fil est fermé",
"this_thread_is_closed": "Le fil est fermé",
"reply_to_cid": "Répondre à {{cid}}",
"submit": "Soumettre",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Chargement des abonnements",
"create_board": "Créer un tableau",
"enter_board_address": "Entrez n'importe quelle adresse du forum",
"board_not_reachable": "Le tableau n'est pas accessible"
"board_not_reachable": "Le tableau n'est pas accessible",
"cannot_edit_thread": "Vous ne pouvez pas modifier ce fil",
"cannot_edit_reply": "Vous ne pouvez pas modifier cette réponse",
"this_thread_was_deleted": "Ce sujet a été supprimé par son auteur",
"this_thread_was_removed": "Ce sujet a été supprimé par les modérateurs du forum",
"this_reply_was_deleted": "Cette réponse a été supprimée par son auteur",
"this_reply_was_removed": "Cette réponse a été supprimée par les modérateurs du forum"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "התגובה ארוכה מדי. <1>לחץ כאן</1> כדי לראות את הטקסט המלא.",
"replies_omitted": "{{repliesCount}} תגובות נשמטו. <1>לחץ כאן</1> לצפייה.",
"replies_and_links_omitted": "{{repliesCount}} תגובות ו{{linksCount}} קישורים נשמטו. <1>לחץ כאן</1> לצפייה.",
"thread_closed_alert": "האשכול סגור",
"this_thread_is_closed": "האשכול סגור",
"reply_to_cid": "תגובה ל{{cid}}",
"submit": "שלח",
"gif": "גיף",
@@ -284,5 +284,11 @@
"loading_subscriptions": "טוען מנויים",
"create_board": "צור לוח",
"enter_board_address": "הזן כתובת לוח כלשהי",
"board_not_reachable": "הלוח לא נגיש"
"board_not_reachable": "הלוח לא נגיש",
"cannot_edit_thread": "אינך יכול לערוך את השרשור הזה",
"cannot_edit_reply": "אינך יכול לערוך את התגובה הזו",
"this_thread_was_deleted": "השרשור הזה נמחק על ידי המחבר שלו",
"this_thread_was_removed": "השרשור הזה הוסר על ידי מנהלי הפורום",
"this_reply_was_deleted": "תשובה זו נמחקה על ידי המחבר שלה",
"this_reply_was_removed": "תשובה זו הוסרה על ידי מנהלי הפורום"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "टिप्पणी बहुत लंबी है। <1>पूरा टेक्स्ट देखने के लिए यहां क्लिक करें</1>।",
"replies_omitted": "{{repliesCount}} उत्तर छोड़े गए हैं। <1>देखने के लिए यहां क्लिक करें</1>।",
"replies_and_links_omitted": "{{repliesCount}} उत्तर और {{linksCount}} लिंक छोड़े गए हैं। <1>देखने के लिए यहां क्लिक करें</1>।",
"thread_closed_alert": "यह थ्रेड बंद है",
"this_thread_is_closed": "यह थ्रेड बंद है",
"reply_to_cid": "{{cid}} का उत्तर दें",
"submit": "जमा करें",
"gif": "जीआईएफ",
@@ -284,5 +284,11 @@
"loading_subscriptions": "सब्सक्रिप्शन लोड हो रहे हैं",
"create_board": "बोर्ड बनाएं",
"enter_board_address": "किसी भी बोर्ड का पता दर्ज करें",
"board_not_reachable": "बोर्ड पहुँच योग्य नहीं है"
"board_not_reachable": "बोर्ड पहुँच योग्य नहीं है",
"cannot_edit_thread": "आप इस थ्रेड को संपादित नहीं कर सकते",
"cannot_edit_reply": "आप इस उत्तर को संपादित नहीं कर सकते",
"this_thread_was_deleted": "इस थ्रेड को इसके लेखक ने हटा दिया है",
"this_thread_was_removed": "यह थ्रेड बोर्ड मॉडरेटर्स द्वारा हटा दिया गया था",
"this_reply_was_deleted": "इस उत्तर को इसके लेखक द्वारा हटा दिया गया था",
"this_reply_was_removed": "यह उत्तर बोर्ड मॉडरेटर द्वारा हटा दिया गया था"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "A megjegyzés túl hosszú. <1>Kattintson ide</1> a teljes szöveg megtekintéséhez.",
"replies_omitted": "{{repliesCount}} válasz kihagyva. <1>Kattintson ide</1> a megtekintéshez.",
"replies_and_links_omitted": "{{repliesCount}} válasz és {{linksCount}} link kihagyva. <1>Kattintson ide</1> a megtekintéshez.",
"thread_closed_alert": "A téma lezárva",
"this_thread_is_closed": "A téma lezárva",
"reply_to_cid": "Válasz erre: {{cid}}",
"submit": "Beküldés",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Előfizetések betöltése",
"create_board": "Hozzon létre táblát",
"enter_board_address": "Adjon meg bármilyen táblázat címet",
"board_not_reachable": "A tábla nem elérhető"
"board_not_reachable": "A tábla nem elérhető",
"cannot_edit_thread": "Nem szerkesztheted ezt a szálat",
"cannot_edit_reply": "Nem szerkesztheted ezt a választ",
"this_thread_was_deleted": "Ez a szál törlésre került a szerzője által",
"this_thread_was_removed": "Ezt a témát a fórum moderátorai eltávolították",
"this_reply_was_deleted": "Ez a válasz törölve lett a szerzője által",
"this_reply_was_removed": "Ez a válasz törlésre került a fórum moderátorai által"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Komentar terlalu panjang. <1>Klik di sini</1> untuk melihat teks lengkap.",
"replies_omitted": "{{repliesCount}} balasan dihilangkan. <1>Klik di sini</1> untuk melihat.",
"replies_and_links_omitted": "{{repliesCount}} balasan dan {{linksCount}} tautan dihilangkan. <1>Klik di sini</1> untuk melihat.",
"thread_closed_alert": "Thread ini ditutup",
"this_thread_is_closed": "Thread ini ditutup",
"reply_to_cid": "Balas ke {{cid}}",
"submit": "Kirim",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Memuat langganan",
"create_board": "Buat papan",
"enter_board_address": "Masukkan alamat papan apa saja",
"board_not_reachable": "Papan tidak dapat dijangkau"
"board_not_reachable": "Papan tidak dapat dijangkau",
"cannot_edit_thread": "Anda tidak dapat mengedit thread ini",
"cannot_edit_reply": "Anda tidak dapat mengedit balasan ini",
"this_thread_was_deleted": "Thread ini dihapus oleh penulisnya",
"this_thread_was_removed": "Thread ini dihapus oleh moderator papan",
"this_reply_was_deleted": "Balasan ini dihapus oleh penulisnya",
"this_reply_was_removed": "Balasan ini dihapus oleh moderator papan"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Commento troppo lungo. <1>Clicca qui</1> per vedere il testo completo.",
"replies_omitted": "{{repliesCount}} risposte omesse. <1>Clicca qui</1> per visualizzare.",
"replies_and_links_omitted": "{{repliesCount}} risposte e {{linksCount}} link omessi. <1>Clicca qui</1> per visualizzare.",
"thread_closed_alert": "Questo thread è chiuso",
"this_thread_is_closed": "Questo thread è chiuso",
"reply_to_cid": "Rispondi a {{cid}}",
"submit": "Invia",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Caricamento abbonamenti",
"create_board": "Crea Board",
"enter_board_address": "Inserisci indirizzo di qualsiasi board",
"board_not_reachable": "Board non raggiungibile"
"board_not_reachable": "Board non raggiungibile",
"cannot_edit_thread": "Non puoi modificare questa discussione",
"cannot_edit_reply": "Non puoi modificare questa risposta",
"this_thread_was_deleted": "Questo thread è stato eliminato dal suo autore",
"this_thread_was_removed": "Questo thread è stato rimosso dai moderatori del board",
"this_reply_was_deleted": "Questa risposta è stata eliminata dal suo autore",
"this_reply_was_removed": "Questa risposta è stata rimossa dai moderatori del forum"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "コメントが長すぎます。 <1>ここをクリック</1>して全文を表示。",
"replies_omitted": "{{repliesCount}}件の返信が省略されました。 <1>ここをクリック</1>して表示。",
"replies_and_links_omitted": "{{repliesCount}}件の返信と{{linksCount}}件のリンクが省略されました。 <1>ここをクリック</1>して表示。",
"thread_closed_alert": "このスレッドは閉じられています",
"this_thread_is_closed": "このスレッドは閉じられています",
"reply_to_cid": "{{cid}}に返信",
"submit": "送信",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "購読を読み込み中",
"create_board": "ボードを作成",
"enter_board_address": "任意のボードアドレスを入力してください",
"board_not_reachable": "ボードにアクセスできません"
"board_not_reachable": "ボードにアクセスできません",
"cannot_edit_thread": "このスレッドを編集できません",
"cannot_edit_reply": "この返信は編集できません",
"this_thread_was_deleted": "このスレッドは著者によって削除されました",
"this_thread_was_removed": "このスレッドはボードのモデレーターによって削除されました",
"this_reply_was_deleted": "この返信はその著者によって削除されました",
"this_reply_was_removed": "この返信は掲示板のモデレーターによって削除されました"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "댓글이 너무 깁니다. <1>여기를 클릭하십시오</1> 전체 텍스트를 보려면.",
"replies_omitted": "{{repliesCount}}개의 답글이 생략되었습니다. <1>여기를 클릭하십시오</1> 보려면.",
"replies_and_links_omitted": "{{repliesCount}}개의 답글과 {{linksCount}}개의 링크가 생략되었습니다. <1>여기를 클릭하십시오</1> 보려면.",
"thread_closed_alert": "이 스레드는 닫혔습니다",
"this_thread_is_closed": "이 스레드는 닫혔습니다",
"reply_to_cid": "{{cid}}에 답변",
"submit": "제출",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "구독 로딩 중",
"create_board": "보드 만들기",
"enter_board_address": "어떤 보드 주소든 입력하세요",
"board_not_reachable": "보드를 찾을 수 없습니다"
"board_not_reachable": "보드를 찾을 수 없습니다",
"cannot_edit_thread": "이 스레드를 편집할 수 없습니다",
"cannot_edit_reply": "이 답글을 수정할 수 없습니다",
"this_thread_was_deleted": "이 스레드는 작성자에 의해 삭제되었습니다",
"this_thread_was_removed": "이 스레드는 보드 관리자에 의해 제거되었습니다",
"this_reply_was_deleted": "이 답글은 작성자에 의해 삭제되었습니다",
"this_reply_was_removed": "이 답글은 게시판 관리자에 의해 삭제되었습니다"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "टिप्पणी खूप लांब आहे. <1>पूर्ण मजकूर पाहण्यासाठी येथे क्लिक करा</1>.",
"replies_omitted": "{{repliesCount}} प्रतिसाद वगळले गेले आहेत. <1>पाहण्यासाठी येथे क्लिक करा</1>.",
"replies_and_links_omitted": "{{repliesCount}} प्रतिसाद आणि {{linksCount}} दुवे वगळले गेले आहेत. <1>पाहण्यासाठी येथे क्लिक करा</1>.",
"thread_closed_alert": "हा थ्रेड बंद आहे",
"this_thread_is_closed": "हा थ्रेड बंद आहे",
"reply_to_cid": "{{cid}} ला उत्तर द्या",
"submit": "सबमिट करा",
"gif": "जीआईएफ",
@@ -284,5 +284,11 @@
"loading_subscriptions": "सदस्यता लोड होत आहे",
"create_board": "बोर्ड तयार करा",
"enter_board_address": "कोणत्याही बोर्ड पत्त्याची नोंद करा",
"board_not_reachable": "बोर्ड उपलब्ध नाही"
"board_not_reachable": "बोर्ड उपलब्ध नाही",
"cannot_edit_thread": "तुम्ही हा थ्रेड संपादित करू शकत नाही",
"cannot_edit_reply": "तुम्ही हा प्रतिसाद संपादित करू शकत नाही",
"this_thread_was_deleted": "हा धागा त्याच्या लेखकाने हटविला",
"this_thread_was_removed": "हे थ्रेड बोर्ड मध्यमाने काढले गेले आहे",
"this_reply_was_deleted": "हा प्रतिसाद त्याच्या लेखकाने हटवला आहे",
"this_reply_was_removed": "या उत्तराला बोर्ड मॉडरेटरने काढले आहे"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Reactie te lang. <1>Klik hier</1> om de volledige tekst te bekijken.",
"replies_omitted": "{{repliesCount}} reacties weggelaten. <1>Klik hier</1> om ze te bekijken.",
"replies_and_links_omitted": "{{repliesCount}} reacties en {{linksCount}} links weggelaten. <1>Klik hier</1> om ze te bekijken.",
"thread_closed_alert": "De thread is gesloten",
"this_thread_is_closed": "De thread is gesloten",
"reply_to_cid": "Reageren op {{cid}}",
"submit": "Verzenden",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Abonnementen laden",
"create_board": "Maak bord",
"enter_board_address": "Voer een willekeurig bordadres in",
"board_not_reachable": "Bord is niet bereikbaar"
"board_not_reachable": "Bord is niet bereikbaar",
"cannot_edit_thread": "Je kunt deze thread niet bewerken",
"cannot_edit_reply": "Je kunt deze reactie niet bewerken",
"this_thread_was_deleted": "Dit draadje is verwijderd door de auteur",
"this_thread_was_removed": "Deze thread werd verwijderd door boardmoderators",
"this_reply_was_deleted": "Dit antwoord werd verwijderd door de auteur",
"this_reply_was_removed": "Dit antwoord is verwijderd door de forum moderators"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Kommentaren er for lang. <1>Klikk her</1> for å se hele teksten.",
"replies_omitted": "{{repliesCount}} svar utelatt. <1>Klikk her</1> for å se dem.",
"replies_and_links_omitted": "{{repliesCount}} svar og {{linksCount}} lenker utelatt. <1>Klikk her</1> for å se dem.",
"thread_closed_alert": "Tråden er stengt",
"this_thread_is_closed": "Tråden er stengt",
"reply_to_cid": "Svar til {{cid}}",
"submit": "Send inn",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Laster abonnementer",
"create_board": "Lag tavle",
"enter_board_address": "Skriv inn hvilken som helst brettadresse",
"board_not_reachable": "Brettet er ikke tilgjengelig"
"board_not_reachable": "Brettet er ikke tilgjengelig",
"cannot_edit_thread": "Du kan ikke redigere denne tråden",
"cannot_edit_reply": "Du kan ikke redigere dette svaret",
"this_thread_was_deleted": "Denne tråden ble slettet av forfatteren",
"this_thread_was_removed": "Denne tråden ble fjernet av boardmoderatorer",
"this_reply_was_deleted": "Dette svaret ble slettet av forfatteren",
"this_reply_was_removed": "Dette svaret ble fjernet av forummoderatorer"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Komentarz jest za długi. <1>Kliknij tutaj</1>, aby zobaczyć pełny tekst.",
"replies_omitted": "Pominięto {{repliesCount}} odpowiedzi. <1>Kliknij tutaj</1>, aby je zobaczyć.",
"replies_and_links_omitted": "Pominięto {{repliesCount}} odpowiedzi i {{linksCount}} linków. <1>Kliknij tutaj</1>, aby je zobaczyć.",
"thread_closed_alert": "Wątek jest zamknięty",
"this_thread_is_closed": "Wątek jest zamknięty",
"reply_to_cid": "Odpowiedz na {{cid}}",
"submit": "Zatwierdź",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Ładowanie subskrypcji",
"create_board": "Utwórz tablicę",
"enter_board_address": "Wprowadź dowolny adres tablicy",
"board_not_reachable": "Tablica jest niedostępna"
"board_not_reachable": "Tablica jest niedostępna",
"cannot_edit_thread": "Nie możesz edytować tego wątku",
"cannot_edit_reply": "Nie możesz edytować tej odpowiedzi",
"this_thread_was_deleted": "Wątek ten został usunięty przez jego autora",
"this_thread_was_removed": "Wątek został usunięty przez moderatorów forum",
"this_reply_was_deleted": "Ta odpowiedź została usunięta przez autora",
"this_reply_was_removed": "Ta odpowiedź została usunięta przez moderatorów forum"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Comentário muito longo. <1>Clique aqui</1> para ver o texto completo.",
"replies_omitted": "{{repliesCount}} respostas omitidas. <1>Clique aqui</1> para visualizar.",
"replies_and_links_omitted": "{{repliesCount}} respostas e {{linksCount}} links omitidos. <1>Clique aqui</1> para visualizar.",
"thread_closed_alert": "O tópico está fechado",
"this_thread_is_closed": "O tópico está fechado",
"reply_to_cid": "Responder a {{cid}}",
"submit": "Enviar",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Carregando assinaturas",
"create_board": "Criar quadro",
"enter_board_address": "Digite qualquer endereço de quadro",
"board_not_reachable": "O quadro não é acessível"
"board_not_reachable": "O quadro não é acessível",
"cannot_edit_thread": "Você não pode editar este tópico",
"cannot_edit_reply": "Você não pode editar esta resposta",
"this_thread_was_deleted": "Este tópico foi excluído pelo seu autor",
"this_thread_was_removed": "Este tópico foi removido pelos moderadores do fórum",
"this_reply_was_deleted": "Esta resposta foi excluída pelo autor",
"this_reply_was_removed": "Esta resposta foi removida pelos moderadores do fórum"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Comentariul este prea lung. <1>Click aici</1> pentru a vedea textul complet.",
"replies_omitted": "{{repliesCount}} răspunsuri omise. <1>Click aici</1> pentru a le vizualiza.",
"replies_and_links_omitted": "{{repliesCount}} răspunsuri și {{linksCount}} linkuri omise. <1>Click aici</1> pentru a le vizualiza.",
"thread_closed_alert": "Acest fir de discuție este închis",
"this_thread_is_closed": "Acest fir de discuție este închis",
"reply_to_cid": "Răspundeți la {{cid}}",
"submit": "Trimite",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Încărcarea abonamentelor",
"create_board": "Creați tablou",
"enter_board_address": "Introduceți orice adresă de tablă",
"board_not_reachable": "Tabloul nu este accesibil"
"board_not_reachable": "Tabloul nu este accesibil",
"cannot_edit_thread": "Nu poți edita acest subiect",
"cannot_edit_reply": "Nu poți edita acest răspuns",
"this_thread_was_deleted": "Acest thread a fost șters de autorul său",
"this_thread_was_removed": "Acest thread a fost eliminat de moderatorii board-ului",
"this_reply_was_deleted": "Acest răspuns a fost șters de autorul său",
"this_reply_was_removed": "Acest răspuns a fost eliminat de moderatorii forumului"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Комментарий слишком длинный. <1>Нажмите здесь</1>, чтобы прочитать полный текст.",
"replies_omitted": "{{repliesCount}} ответов пропущено. <1>Нажмите здесь</1>, чтобы посмотреть.",
"replies_and_links_omitted": "{{repliesCount}} ответов и {{linksCount}} ссылок пропущено. <1>Нажмите здесь</1>, чтобы посмотреть.",
"thread_closed_alert": "Тема закрыта",
"this_thread_is_closed": "Тема закрыта",
"reply_to_cid": "Ответить на {{cid}}",
"submit": "Отправить",
"gif": "ГИФ",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Загрузка подписок",
"create_board": "Создать доску",
"enter_board_address": "Введите любой адрес доски",
"board_not_reachable": "Доска недоступна"
"board_not_reachable": "Доска недоступна",
"cannot_edit_thread": "Вы не можете редактировать эту тему",
"cannot_edit_reply": "Вы не можете отредактировать этот ответ",
"this_thread_was_deleted": "Эта тема была удалена её автором",
"this_thread_was_removed": "Эта тема была удалена модераторами форума",
"this_reply_was_deleted": "Этот ответ был удален автором",
"this_reply_was_removed": "Этот ответ был удален модераторами форума"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Komenti është shumë i gjatë. <1>Kliko këtu</1> për të parë tekstin e plotë.",
"replies_omitted": "{{repliesCount}} përgjigje janë lënë jashtë. <1>Kliko këtu</1> për t'i shikuar.",
"replies_and_links_omitted": "{{repliesCount}} përgjigje dhe {{linksCount}} lidhje janë lënë jashtë. <1>Kliko këtu</1> për t'i shikuar.",
"thread_closed_alert": "Temë është mbyllur",
"this_thread_is_closed": "Temë është mbyllur",
"reply_to_cid": "Përgjigju në {{cid}}",
"submit": "Dorëzo",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Po ngarkohen abonimet",
"create_board": "Krijo bord",
"enter_board_address": "Shkruani çdo adresë bordi",
"board_not_reachable": "Tabela nuk është e arritshme"
"board_not_reachable": "Tabela nuk është e arritshme",
"cannot_edit_thread": "Nuk mund ta redaktoni këtë temë",
"cannot_edit_reply": "Nuk mund ta redaktoni këtë përgjigje",
"this_thread_was_deleted": "Ky thread u fshi nga autori i tij",
"this_thread_was_removed": "Ky thread u hoq nga moderatorët e bordit",
"this_reply_was_deleted": "Ky përgjigje u fshi nga autori i saj",
"this_reply_was_removed": "Ky përgjigje u hoq nga moderatorët e forumit"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Kommentaren är för lång. <1>Klicka här</1> för att se hela texten.",
"replies_omitted": "{{repliesCount}} svar utelämnade. <1>Klicka här</1> för att visa dem.",
"replies_and_links_omitted": "{{repliesCount}} svar och {{linksCount}} länkar utelämnade. <1>Klicka här</1> för att visa dem.",
"thread_closed_alert": "Tråden är stängd",
"this_thread_is_closed": "Tråden är stängd",
"reply_to_cid": "Svara på {{cid}}",
"submit": "Skicka in",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Laddar prenumerationer",
"create_board": "Skapa tavla",
"enter_board_address": "Ange vilken som helst brädets adress",
"board_not_reachable": "Tavlan är inte tillgänglig"
"board_not_reachable": "Tavlan är inte tillgänglig",
"cannot_edit_thread": "Du kan inte redigera denna tråd",
"cannot_edit_reply": "Du kan inte redigera detta svar",
"this_thread_was_deleted": "Denna tråd raderades av dess författare",
"this_thread_was_removed": "Denna tråd togs bort av forumets moderatorer",
"this_reply_was_deleted": "Detta svar togs bort av författaren",
"this_reply_was_removed": "Detta svar togs bort av forumets moderatorer"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "వ్యాఖ్య చాలా పొడవుగా ఉంది. <1>పూర్తి టెక్స్ట్ చూడటానికి ఇక్కడ క్లిక్ చేయండి</1>.",
"replies_omitted": "{{repliesCount}} స్పందనలు వదిలివేయబడ్డాయి. <1>చూడటానికి ఇక్కడ క్లిక్ చేయండి</1>.",
"replies_and_links_omitted": "{{repliesCount}} స్పందనలు మరియు {{linksCount}} లింకులు వదిలివేయబడ్డాయి. <1>చూడటానికి ఇక్కడ క్లిక్ చేయండి</1>.",
"thread_closed_alert": "ఈ థ్రెడ్ మూసివేయబడింది",
"this_thread_is_closed": "ఈ థ్రెడ్ మూసివేయబడింది",
"reply_to_cid": "{{cid}}కి స్పందించండి",
"submit": "సమర్పించు",
"gif": "జీఐఎఫ్",
@@ -284,5 +284,11 @@
"loading_subscriptions": "సబ్‌స్క్రిప్షన్‌లు లోడ్ అవుతున్నాయి",
"create_board": "బోర్డ్ రూపొందించండి",
"enter_board_address": "ఏదైనా బోర్డ్ అడ్రస్ నమోదు చేయండి",
"board_not_reachable": "బోర్డు అందుబాటులో లేదు"
"board_not_reachable": "బోర్డు అందుబాటులో లేదు",
"cannot_edit_thread": "మీరు ఈ థ్రెడ్‌ని ఎడిట్ చేయలేరు",
"cannot_edit_reply": "మీరు ఈ రిప్లయ్‌ను ఎడిట్ చేయలేరు",
"this_thread_was_deleted": "ఈ థ్రెడ్‌ను దాని రచయిత తొలగించారు",
"this_thread_was_removed": "ఈ థ్రెడ్ బోర్డ్ మోడరేటర్ల ద్వారా తీసివేయబడింది",
"this_reply_was_deleted": "ఈ స్పందనను దాని రచయిత తొలగించారు",
"this_reply_was_removed": "ఈ స్పందన బోర్డ్ మోడరేటర్లచే తొలగించబడింది"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "ความคิดเห็นยาวเกินไป <1>คลิกที่นี่</1> เพื่อดูข้อความเต็ม.",
"replies_omitted": "ข้าม {{repliesCount}} คำตอบ <1>คลิกที่นี่</1> เพื่อดู.",
"replies_and_links_omitted": "ข้าม {{repliesCount}} คำตอบและ {{linksCount}} ลิงก์ <1>คลิกที่นี่</1> เพื่อดู.",
"thread_closed_alert": "กระทู้นี้ถูกปิด",
"this_thread_is_closed": "กระทู้นี้ถูกปิด",
"reply_to_cid": "ตอบกลับ {{cid}}",
"submit": "ส่ง",
"gif": "จีไอเอฟ",
@@ -284,5 +284,11 @@
"loading_subscriptions": "กำลังโหลดการสมัครสมาชิก",
"create_board": "สร้างกระดาน",
"enter_board_address": "ป้อนที่อยู่บอร์ดใดก็ได้",
"board_not_reachable": "ไม่สามารถเข้าถึงบอร์ดได้"
"board_not_reachable": "ไม่สามารถเข้าถึงบอร์ดได้",
"cannot_edit_thread": "คุณไม่สามารถแก้ไขกระทู้นี้ได้",
"cannot_edit_reply": "คุณไม่สามารถแก้ไขคำตอบนี้ได้",
"this_thread_was_deleted": "กระทู้นี้ถูกลบโดยผู้แต่ง",
"this_thread_was_removed": "กระทู้นี้ถูกลบโดยผู้ดูแลบอร์ด",
"this_reply_was_deleted": "การตอบกลับนี้ถูกลบโดยผู้แต่ง",
"this_reply_was_removed": "คำตอบนี้ถูกลบโดยผู้ดูแลบอร์ด"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Yorum çok uzun. <1>Buraya tıklayın</1> tam metni görüntülemek için.",
"replies_omitted": "{{repliesCount}} yanıt göz ardı edildi. <1>Buraya tıklayın</1> görüntülemek için.",
"replies_and_links_omitted": "{{repliesCount}} yanıt ve {{linksCount}} bağlantı göz ardı edildi. <1>Buraya tıklayın</1> görüntülemek için.",
"thread_closed_alert": "Bu konu kapatılmıştır",
"this_thread_is_closed": "Bu konu kapatılmıştır",
"reply_to_cid": "{{cid}}ye yanıt ver",
"submit": "Gönder",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Abonelikler yükleniyor",
"create_board": "Tahta oluştur",
"enter_board_address": "Herhangi bir tahta adresini girin",
"board_not_reachable": "Board erişilemez"
"board_not_reachable": "Board erişilemez",
"cannot_edit_thread": "Bu başlığı düzenleyemezsiniz",
"cannot_edit_reply": "Bu yanıtı düzenleyemezsiniz",
"this_thread_was_deleted": "Bu başlık, yazarının tarafından silindi",
"this_thread_was_removed": "Bu konu, board moderatörleri tarafından kaldırıldı",
"this_reply_was_deleted": "Bu yanıt, yazar tarafından silindi",
"this_reply_was_removed": "Bu yanıt, forum moderatörleri tarafından kaldırıldı"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Коментар занадто довгий. <1>Натисніть тут</1>, щоб переглянути повний текст.",
"replies_omitted": "{{repliesCount}} відповідей пропущено. <1>Натисніть тут</1>, щоб переглянути.",
"replies_and_links_omitted": "{{repliesCount}} відповідей та {{linksCount}} посилань пропущено. <1>Натисніть тут</1>, щоб переглянути.",
"thread_closed_alert": "Тему закрито",
"this_thread_is_closed": "Тему закрито",
"reply_to_cid": "Відповісти на {{cid}}",
"submit": "Надіслати",
"gif": "ГІФ",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Завантаження підписок",
"create_board": "Створити дошку",
"enter_board_address": "Введіть будь-яку адресу дошки",
"board_not_reachable": "Дошка недоступна"
"board_not_reachable": "Дошка недоступна",
"cannot_edit_thread": "Ви не можете редагувати цю тему",
"cannot_edit_reply": "Ви не можете редагувати цю відповідь",
"this_thread_was_deleted": "Цю тему видалив її автор",
"this_thread_was_removed": "Цю тему було видалено модераторами форуму",
"this_reply_was_deleted": "Цю відповідь було видалено її автором",
"this_reply_was_removed": "Цю відповідь було видалено модераторами форуму"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "تبصرہ بہت طویل ہے۔ <1>مکمل متن دیکھنے کے لیے یہاں کلک کریں</1>۔",
"replies_omitted": "{{repliesCount}} جوابات چھوڑ دیے گئے ہیں۔ <1>مکمل دیکھنے کے لیے یہاں کلک کریں</1>۔",
"replies_and_links_omitted": "{{repliesCount}} جوابات اور {{linksCount}} لنکس چھوڑ دیے گئے ہیں۔ <1>مکمل دیکھنے کے لیے یہاں کلک کریں</1>۔",
"thread_closed_alert": "یہ دھاگہ بند ہے",
"this_thread_is_closed": "یہ دھاگہ بند ہے",
"reply_to_cid": "{{cid}} کا جواب دیں",
"submit": "جمع کرائیں",
"gif": "جی آئی ایف",
@@ -284,5 +284,11 @@
"loading_subscriptions": "سبسکرپشن لوڈ ہو رہی ہے",
"create_board": "بورڈ بنائیں",
"enter_board_address": "کسی بھی بورڈ کا پتہ درج کریں",
"board_not_reachable": "بورڈ قابل رسائی نہیں ہے"
"board_not_reachable": "بورڈ قابل رسائی نہیں ہے",
"cannot_edit_thread": "آپ اس تھریڈ کو ایڈٹ نہیں کر سکتے",
"cannot_edit_reply": "آپ اس جواب کو ایڈٹ نہیں کر سکتے",
"this_thread_was_deleted": "اس تھریڈ کو اس کے مصنف نے حذف کیا",
"this_thread_was_removed": "اس تھریڈ کو بورڈ کے موڈریٹرز نے ہٹا دیا ہے",
"this_reply_was_deleted": "اس جواب کو اس کے مصنف نے حذف کر دیا تھا",
"this_reply_was_removed": "اس جواب کو بورڈ کے منتظمین نے حذف کر دیا ہے"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "Bình luận quá dài. <1>Nhấn vào đây</1> để xem toàn bộ văn bản.",
"replies_omitted": "{{repliesCount}} câu trả lời bị bỏ qua. <1>Nhấn vào đây</1> để xem.",
"replies_and_links_omitted": "{{repliesCount}} câu trả lời và {{linksCount}} liên kết bị bỏ qua. <1>Nhấn vào đây</1> để xem.",
"thread_closed_alert": "Chủ đề này đã đóng",
"this_thread_is_closed": "Chủ đề này đã đóng",
"reply_to_cid": "Trả lời {{cid}}",
"submit": "Gửi",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "Đang tải đăng ký",
"create_board": "Tạo bảng",
"enter_board_address": "Nhập bất kỳ địa chỉ bảng nào",
"board_not_reachable": "Bảng không thể truy cập"
"board_not_reachable": "Bảng không thể truy cập",
"cannot_edit_thread": "Bạn không thể chỉnh sửa chủ đề này",
"cannot_edit_reply": "Bạn không thể chỉnh sửa phản hồi này",
"this_thread_was_deleted": "Chủ đề này đã bị tác giả của nó xóa",
"this_thread_was_removed": "Chủ đề này đã bị các quản trị viên diễn đàn xóa",
"this_reply_was_deleted": "Câu trả lời này đã bị tác giả của nó xóa",
"this_reply_was_removed": "Phản hồi này đã bị xóa bởi các quản trị viên diễn đàn"
}
+8 -2
View File
@@ -59,7 +59,7 @@
"comment_too_long": "评论太长。 <1>点击这里</1>查看完整文本。",
"replies_omitted": "省略了{{repliesCount}}条回复。 <1>点击这里</1>查看。",
"replies_and_links_omitted": "省略了{{repliesCount}}条回复和{{linksCount}}个链接。 <1>点击这里</1>查看。",
"thread_closed_alert": "该主题已关闭",
"this_thread_is_closed": "该主题已关闭",
"reply_to_cid": "回复{{cid}}",
"submit": "提交",
"gif": "GIF",
@@ -284,5 +284,11 @@
"loading_subscriptions": "加载订阅",
"create_board": "创建板块",
"enter_board_address": "输入任何板块地址",
"board_not_reachable": "无法访问板块"
"board_not_reachable": "无法访问板块",
"cannot_edit_thread": "您无法编辑此线程",
"cannot_edit_reply": "您无法编辑此回复",
"this_thread_was_deleted": "该线程已被其作者删除",
"this_thread_was_removed": "此帖子已被论坛版主删除",
"this_reply_was_deleted": "该回复已被其作者删除",
"this_reply_was_removed": "该回复已被版主删除"
}
+2 -2
View File
@@ -9,7 +9,7 @@ import useIsSubplebbitOffline from '../../hooks/use-is-subplebbit-offline';
import { shouldShowSnow } from '../../lib/snow';
import Tooltip from '../tooltip';
const totalBanners = 61;
const totalBanners = 62;
const ImageBanner = () => {
const [imagePath] = useState(() => {
@@ -42,7 +42,7 @@ const BoardHeader = () => {
<div className={`${styles.content} ${shouldShowSnow() ? styles.garland : ''}`}>
{!useIsMobile() && (
<div className={styles.bannerCnt}>
<ImageBanner key={isInAllView ? 'all' : isInSubscriptionsView ? 'subscriptions' : address} />
<ImageBanner key={isInAllView ? 'all' : isInSubscriptionsView ? 'subscriptions' : subplebbitAddress} />
</div>
)}
<div className={styles.boardTitle}>
+15 -5
View File
@@ -34,8 +34,7 @@ const timestampToDays = (timestamp: number) => {
const EditMenu = ({ post }: { post: Comment }) => {
const { t } = useTranslation();
const isMobile = useIsMobile();
const { author, cid, content, deleted, locked, parentCid, pinned, postCid, reason, removed, spoiler, subplebbitAddress } = post || {};
const isReply = parentCid;
const { author, cid, content, deleted, isRules, locked, parentCid, pinned, postCid, reason, removed, spoiler, subplebbitAddress } = post || {};
const [isEditMenuOpen, setIsEditMenuOpen] = useState(false);
const [isContentEditorOpen, setIsContentEditorOpen] = useState(false);
@@ -236,8 +235,19 @@ const EditMenu = ({ post }: { post: Comment }) => {
return (
<>
<span className={`${styles.checkbox} ${isReply && styles.replyCheckbox}`} ref={refs.setReference} {...(cid && getReferenceProps())}>
<input type='checkbox' onChange={() => setIsEditMenuOpen(cid && (isAccountCommentAuthor || isAccountMod) ? !isEditMenuOpen : false)} checked={isEditMenuOpen} />
<span className={`${styles.checkbox} ${parentCid && styles.replyCheckbox}`} ref={refs.setReference} {...(cid && getReferenceProps())}>
<input
type='checkbox'
onChange={() => {
if (cid && (isAccountCommentAuthor || isAccountMod)) {
setIsEditMenuOpen(!isEditMenuOpen);
} else {
setIsEditMenuOpen(false);
alert(parentCid || isRules ? t('cannot_edit_reply') : t('cannot_edit_thread'));
}
}}
checked={isEditMenuOpen}
/>
</span>
{isEditMenuOpen && (isAccountCommentAuthor || isAccountMod) && (
<FloatingFocusManager context={context} modal={false}>
@@ -282,7 +292,7 @@ const EditMenu = ({ post }: { post: Comment }) => {
{_.capitalize(t('remove'))}?]
</label>
</div>
{!isReply && (
{!parentCid && (
<div className={styles.menuItem}>
[
<label>
+2
View File
@@ -74,6 +74,8 @@ const YoutubeEmbed = ({ parsedUrl }: EmbedComponentProps) => {
if (!videoId) {
if (parsedUrl.host.includes('youtu.be')) {
videoId = parsedUrl.pathname.substring(1);
} else if (parsedUrl.pathname.includes('/shorts/')) {
videoId = parsedUrl.pathname.split('/shorts/')[1];
} else if (isInvidious) {
if (parsedUrl.pathname.startsWith('/watch')) {
videoId = parsedUrl.searchParams.get('v');
+14 -6
View File
@@ -76,6 +76,18 @@ const PostInfo = ({ openReplyModal, post, postReplyCount = 0, roles, isHidden }:
const { hidden } = useHide(post);
const onReplyModalClick = () => {
deleted
? isReply
? alert(t('this_reply_was_deleted'))
: alert(t('this_thread_was_deleted'))
: removed
? isReply
? alert(t('this_reply_was_removed'))
: alert(t('this_thread_was_removed'))
: openReplyModal && openReplyModal(cid, postCid, subplebbitAddress);
};
return (
<div className={styles.postInfo}>
{isHidden ? parentCid && <span className={styles.hiddenReplyEditMenuSpacer} /> : <EditMenu post={post} />}
@@ -160,11 +172,7 @@ const PostInfo = ({ openReplyModal, post, postReplyCount = 0, roles, isHidden }:
<Link to={`/p/${subplebbitAddress}/c/${cid}`} className={styles.linkToPost} title={t('link_to_post')} onClick={(e) => !cid && e.preventDefault()}>
c/
</Link>
<span
className={styles.replyToPost}
title={t('reply_to_post')}
onMouseDown={() => openReplyModal && !(deleted || removed) && openReplyModal(cid, postCid, subplebbitAddress)}
>
<span className={styles.replyToPost} title={t('reply_to_post')} onMouseDown={onReplyModalClick}>
{shortCid}
</span>
</span>
@@ -407,7 +415,7 @@ const PostDesktop = ({ openReplyModal, post, roles, showAllReplies, showReplies
)}
</div>
{!isInPendingPostView &&
!isDescription &&
(!isDescription || (isDescription && !subplebbit?.updatedAt)) &&
!isRules &&
stateString &&
stateString !== 'Failed' &&
+14 -6
View File
@@ -57,6 +57,18 @@ const PostInfoAndMedia = ({ openReplyModal, post, postReplyCount = 0, roles }: P
const { hidden } = useHide(post);
const onReplyModalClick = () => {
deleted
? isReply
? alert(t('this_reply_was_deleted'))
: alert(t('this_thread_was_deleted'))
: removed
? isReply
? alert(t('this_reply_was_removed'))
: alert(t('this_thread_was_removed'))
: openReplyModal && openReplyModal(cid, postCid, subplebbitAddress);
};
return (
<>
<div className={styles.postInfo}>
@@ -152,11 +164,7 @@ const PostInfoAndMedia = ({ openReplyModal, post, postReplyCount = 0, roles }: P
<Link to={`/p/${subplebbitAddress}/c/${cid}`} className={styles.linkToPost} title={t('link_to_post')} onClick={(e) => !cid && e.preventDefault()}>
c/
</Link>
<span
className={styles.replyToPost}
title={t('reply_to_post')}
onMouseDown={() => openReplyModal && !(deleted || removed) && openReplyModal(cid, postCid, subplebbitAddress)}
>
<span className={styles.replyToPost} title={t('reply_to_post')} onMouseDown={onReplyModalClick}>
{shortCid.slice(0, -4)}
</span>
</span>
@@ -333,7 +341,7 @@ const PostMobile = ({ openReplyModal, post, roles, showAllReplies, showReplies =
)}
</div>
{!isInPendingPostView &&
!isDescription &&
(!isDescription || (isDescription && !subplebbit?.updatedAt)) &&
!isRules &&
stateString &&
stateString !== 'Failed' &&
@@ -1,7 +1,5 @@
.container {
position: fixed;
top: calc(50% - 150px);
left: calc(50% - 150px);
display: block;
padding: 2px;
font-size: 10pt;
@@ -10,6 +8,9 @@
z-index: 3;
background-color: var(--challenge-modal-background-color);
border: var(--challenge-modal-border);
will-change: transform;
backface-visibility: hidden;
-webkit-backface-visibility: hidden;
}
.title {
@@ -24,6 +25,9 @@
background-color: var(--challenge-modal-title-background-color);
color: var(--challenge-modal-title-text-color);
border: var(--challenge-modal-title-border);
user-select: none;
-webkit-user-select: none;
touch-action: none;
}
.closeIcon {
+33 -18
View File
@@ -1,7 +1,6 @@
import { useCallback, useEffect, useRef, useState } from 'react';
import { useLocation, useParams } from 'react-router-dom';
import { Trans, useTranslation } from 'react-i18next';
import Draggable from 'react-draggable';
import { setAccount, useAccount, useComment, useSubplebbit } from '@plebbit/plebbit-react-hooks';
import Plebbit from '@plebbit/plebbit-js/dist/browser/index.js';
import { formatMarkdown } from '../../lib/utils/post-utils';
@@ -17,6 +16,8 @@ import _ from 'lodash';
import useAnonMode from '../../hooks/use-anon-mode';
import FileUploader from '../../plugins/file-uploader';
import { Capacitor } from '@capacitor/core';
import { useSpring, animated } from '@react-spring/web';
import { useDrag } from '@use-gesture/react';
const isAndroid = Capacitor.getPlatform() === 'android';
@@ -144,14 +145,29 @@ const ReplyModal = ({ closeModal, showReplyModal, parentCid, postCid, scrollY, s
const nodeRef = useRef<HTMLDivElement>(null);
const isMobile = useIsMobile();
const [{ x, y }, api] = useSpring(() => ({
x: window.innerWidth / 2 - 150,
y: window.innerHeight / 2 - 400,
}));
const bind = useDrag(
({ offset: [ox, oy] }) => {
api.start({ x: ox, y: oy, immediate: true });
},
{
from: () => [x.get(), y.get()],
filterTaps: true,
bounds: undefined,
},
);
useEffect(() => {
if (nodeRef.current && isMobile) {
const viewportHeight = window.innerHeight;
const modalHeight = 150;
const centeredPosition = scrollY + viewportHeight / 2 - modalHeight / 2;
nodeRef.current.style.top = `${centeredPosition}px`;
const centeredPosition = scrollY + viewportHeight / 2 - 300;
api.start({ y: centeredPosition, immediate: true });
}
}, [isMobile, scrollY]);
}, [isMobile, scrollY, api]);
const parentCidRef = useRef<HTMLSpanElement>(null);
@@ -275,8 +291,16 @@ const ReplyModal = ({ closeModal, showReplyModal, parentCid, postCid, scrollY, s
}, [displayName, setPublishReplyOptions]);
const modalContent = (
<div className={styles.container} ref={nodeRef}>
<div className={`replyModalHandle ${styles.title}`}>
<animated.div
className={styles.container}
ref={nodeRef}
style={{
x,
y,
touchAction: 'none',
}}
>
<div className={`replyModalHandle ${styles.title}`} {...(!isMobile ? bind() : {})}>
{t('reply_to_cid', { cid: `c/${parentCid && Plebbit.getShortCid(parentCid)}`, interpolation: { escapeValue: false } })}
<button
className={styles.closeIcon}
@@ -346,19 +370,10 @@ const ReplyModal = ({ closeModal, showReplyModal, parentCid, postCid, scrollY, s
{lengthError ? <div className={styles.error}>{lengthError}</div> : error && <div className={styles.error}>{error}</div>}
{!(isInAllView || isInSubscriptionsView) && offlineAlert}
</div>
</div>
</animated.div>
);
return (
showReplyModal &&
(isMobile ? (
modalContent
) : (
<Draggable handle='.replyModalHandle' nodeRef={nodeRef}>
{modalContent}
</Draggable>
))
);
return showReplyModal && modalContent;
};
export default ReplyModal;
+1 -7
View File
@@ -5,12 +5,6 @@ const { version } = packageJson;
const commitRef = process.env.REACT_APP_COMMIT_REF;
const isElectron = window.isElectron === true;
const getBetaVersion = (version: string) => {
const parts = version.split('.');
parts[parts.length - 1] = (parseInt(parts[parts.length - 1]) + 1).toString();
return parts.join('.') + '-beta';
};
const Version = () => {
const { t } = useTranslation();
@@ -21,7 +15,7 @@ const Version = () => {
target='_blank'
rel='noopener noreferrer'
>
v{commitRef ? getBetaVersion(version) : version}
v{commitRef ? '-dev' : version}
</a>
{isElectron && (
<>
-15
View File
@@ -1,15 +0,0 @@
import { useMemo } from 'react';
const getUniqueTags = (multisub: any) => {
const allTags = new Set<string>();
Object.values(multisub).forEach((sub: any) => {
if (sub?.tags?.length) {
sub.tags.forEach((tag: string) => allTags.add(tag));
}
});
return Array.from(allTags).sort();
};
export const useDefaultSubplebbitTags = (subplebbits: any) => {
return useMemo(() => getUniqueTags(subplebbits), [subplebbits]);
};
+21 -4
View File
@@ -13,6 +13,7 @@ export interface MultisubSubplebbit {
tags?: string[];
features?: string[];
plebchanAutoSubscribe?: boolean;
lowUptime?: boolean;
}
export interface DefaultSubplebbitsState {
@@ -51,15 +52,17 @@ export const useDefaultSubplebbits = () => {
return res.json();
});
cacheSubplebbits = multisub.subplebbits;
const filteredSubplebbits = multisub.subplebbits.filter((sub: MultisubSubplebbit) => !sub.lowUptime);
cacheSubplebbits = filteredSubplebbits;
// Cache auto-subscribe addresses when we fetch subplebbits
cacheAutoSubscribeAddresses = multisub.subplebbits
cacheAutoSubscribeAddresses = filteredSubplebbits
.filter((sub: MultisubSubplebbit) => sub.plebchanAutoSubscribe && sub.address)
.map((sub: MultisubSubplebbit) => sub.address);
setState({
subplebbits: multisub.subplebbits,
subplebbits: filteredSubplebbits,
loading: false,
error: null,
});
@@ -78,6 +81,8 @@ export const useDefaultSubplebbits = () => {
return cacheSubplebbits || state.subplebbits;
};
export const getAutoSubscribeAddresses = () => cacheAutoSubscribeAddresses || [];
export const useDefaultSubplebbitsState = () => {
const [state, setState] = useState<DefaultSubplebbitsState>({
subplebbits: cacheSubplebbits || [],
@@ -154,4 +159,16 @@ export const useMultisubMetadata = () => {
return cacheMetadata || metadata;
};
export const getAutoSubscribeAddresses = () => cacheAutoSubscribeAddresses || [];
const getUniqueTags = (multisub: any) => {
const allTags = new Set<string>();
Object.values(multisub).forEach((sub: any) => {
if (sub?.tags?.length) {
sub.tags.forEach((tag: string) => allTags.add(tag));
}
});
return Array.from(allTags).sort();
};
export const useDefaultSubplebbitTags = (subplebbits: any) => {
return useMemo(() => getUniqueTags(subplebbits), [subplebbits]);
};
-99
View File
@@ -1,99 +0,0 @@
import { useMemo } from 'react';
import useStateString from './use-state-string';
import { useSubplebbit, useSubplebbitsStates } from '@plebbit/plebbit-react-hooks';
const clientHosts: { [key: string]: string } = {};
const getClientHost = (clientUrl: string): string => {
if (!clientHosts[clientUrl]) {
try {
clientHosts[clientUrl] = new URL(clientUrl).hostname || clientUrl;
} catch (e) {
clientHosts[clientUrl] = clientUrl;
}
}
return clientHosts[clientUrl];
};
const useFeedStateString = (subplebbitAddresses?: string[]): string | undefined => {
// single subplebbit feed state string
const subplebbitAddress = subplebbitAddresses?.length === 1 ? subplebbitAddresses[0] : undefined;
const subplebbit = useSubplebbit({ subplebbitAddress });
const singleSubplebbitFeedStateString = useStateString(subplebbit);
// multiple subplebbit feed state string
const { states } = useSubplebbitsStates({ subplebbitAddresses });
const multipleSubplebbitsFeedStateString = useMemo(() => {
if (subplebbitAddress) {
return;
}
// e.g. Resolving 2 addresses from infura.io, fetching 2 IPNS, 1 IPFS from cloudflare-ipfs.com, ipfs.io
let stateString = '';
if (states['resolving-address']) {
const { subplebbitAddresses, clientUrls } = states['resolving-address'];
if (subplebbitAddresses.length && clientUrls.length) {
stateString += `resolving ${subplebbitAddresses.length} ${subplebbitAddresses.length === 1 ? 'address' : 'addresses'} from ${clientUrls
.map(getClientHost)
.join(', ')}`;
}
}
// find all page client and sub addresses
const pagesStatesClientHosts = new Set();
const pagesStatesSubplebbitAddresses = new Set();
for (const state in states) {
if (state.match('page')) {
states[state].clientUrls.forEach((clientUrl) => pagesStatesClientHosts.add(getClientHost(clientUrl)));
states[state].subplebbitAddresses.forEach((subplebbitAddress) => pagesStatesSubplebbitAddresses.add(subplebbitAddress));
}
}
if (states['fetching-ipns'] || states['fetching-ipfs'] || pagesStatesSubplebbitAddresses.size) {
// separate 2 different states using ', '
if (stateString) {
stateString += ', ';
}
// find all client urls
const clientHosts = new Set([...pagesStatesClientHosts]);
states['fetching-ipns']?.clientUrls.forEach((clientUrl) => clientHosts.add(getClientHost(clientUrl)));
states['fetching-ipfs']?.clientUrls.forEach((clientUrl) => clientHosts.add(getClientHost(clientUrl)));
if (clientHosts.size) {
stateString += 'loading ';
if (states['fetching-ipns']) {
stateString += `${states['fetching-ipns'].subplebbitAddresses.length} boards`;
}
if (states['fetching-ipfs']) {
if (states['fetching-ipns']) {
stateString += ', ';
}
stateString += `${states['fetching-ipfs'].subplebbitAddresses.length} posts`;
}
if (pagesStatesSubplebbitAddresses.size) {
if (states['fetching-ipns'] || states['fetching-ipfs']) {
stateString += ', ';
}
stateString += `${pagesStatesSubplebbitAddresses.size} ${pagesStatesSubplebbitAddresses.size === 1 ? 'page' : 'pages'}`;
}
stateString += ` from ${[...clientHosts].join(', ')}`;
}
}
// capitalize first letter
stateString = stateString.charAt(0).toUpperCase() + stateString.slice(1);
// if string is empty, return undefined instead
return stateString === '' ? undefined : stateString;
}, [states, subplebbitAddress]);
if (singleSubplebbitFeedStateString) {
return singleSubplebbitFeedStateString;
}
return multipleSubplebbitsFeedStateString;
};
export default useFeedStateString;
+85 -4
View File
@@ -1,5 +1,5 @@
import { useMemo } from 'react';
import { useClientsStates } from '@plebbit/plebbit-react-hooks';
import { useClientsStates, useSubplebbit, useSubplebbitsStates } from '@plebbit/plebbit-react-hooks';
import { debounce } from 'lodash';
interface CommentOrSubplebbit {
@@ -61,11 +61,11 @@ const useStateString = (commentOrSubplebbit: CommentOrSubplebbit): string | unde
if (stateString) {
stateString = stateString
.replaceAll('-', ' ')
.replace('ipfs', 'post')
.replace('ipfs', 'thread')
.replace('ipns', 'subplebbit')
.replace('fetching', 'loading')
.replace('fetching', 'downloading')
.replace('subplebbit subplebbit', 'board')
.replace('loading subplebbit', 'loading board');
.replace('downloading subplebbit', 'downloading board');
}
}
@@ -77,4 +77,85 @@ const useStateString = (commentOrSubplebbit: CommentOrSubplebbit): string | unde
}, [debouncedStates, commentOrSubplebbit]);
};
export const useFeedStateString = (subplebbitAddresses?: string[]): string | undefined => {
// single subplebbit feed state string
const subplebbitAddress = subplebbitAddresses?.length === 1 ? subplebbitAddresses[0] : undefined;
const subplebbit = useSubplebbit({ subplebbitAddress });
const singleSubplebbitFeedStateString = useStateString(subplebbit);
// multiple subplebbit feed state string
const { states } = useSubplebbitsStates({ subplebbitAddresses });
const multipleSubplebbitsFeedStateString = useMemo(() => {
if (subplebbitAddress) {
return;
}
// e.g. Resolving 2 addresses from infura.io, fetching 2 IPNS, 1 IPFS from cloudflare-ipfs.com, ipfs.io
let stateString = '';
if (states['resolving-address']) {
const { subplebbitAddresses, clientUrls } = states['resolving-address'];
if (subplebbitAddresses.length && clientUrls.length) {
stateString += `resolving ${subplebbitAddresses.length} ${subplebbitAddresses.length === 1 ? 'address' : 'addresses'} from ${clientUrls
.map(getClientHost)
.join(', ')}`;
}
}
// find all page client and sub addresses
const pagesStatesClientHosts = new Set();
const pagesStatesSubplebbitAddresses = new Set();
for (const state in states) {
if (state.match('page')) {
states[state].clientUrls.forEach((clientUrl) => pagesStatesClientHosts.add(getClientHost(clientUrl)));
states[state].subplebbitAddresses.forEach((subplebbitAddress) => pagesStatesSubplebbitAddresses.add(subplebbitAddress));
}
}
if (states['fetching-ipns'] || states['fetching-ipfs'] || pagesStatesSubplebbitAddresses.size) {
// separate 2 different states using ', '
if (stateString) {
stateString += ', ';
}
// find all client urls
const clientHosts = new Set([...pagesStatesClientHosts]);
states['fetching-ipns']?.clientUrls.forEach((clientUrl) => clientHosts.add(getClientHost(clientUrl)));
states['fetching-ipfs']?.clientUrls.forEach((clientUrl) => clientHosts.add(getClientHost(clientUrl)));
if (clientHosts.size) {
stateString += 'downloading ';
if (states['fetching-ipns']) {
stateString += `${states['fetching-ipns'].subplebbitAddresses.length} boards`;
}
if (states['fetching-ipfs']) {
if (states['fetching-ipns']) {
stateString += ', ';
}
stateString += `${states['fetching-ipfs'].subplebbitAddresses.length} threads`;
}
if (pagesStatesSubplebbitAddresses.size) {
if (states['fetching-ipns'] || states['fetching-ipfs']) {
stateString += ', ';
}
stateString += `${pagesStatesSubplebbitAddresses.size} ${pagesStatesSubplebbitAddresses.size === 1 ? 'page' : 'pages'}`;
}
stateString += ` from ${[...clientHosts].join(', ')}`;
}
}
// capitalize first letter
stateString = stateString.charAt(0).toUpperCase() + stateString.slice(1);
// if string is empty, return undefined instead
return stateString === '' ? undefined : stateString;
}, [states, subplebbitAddress]);
if (singleSubplebbitFeedStateString) {
return singleSubplebbitFeedStateString;
}
return multipleSubplebbitsFeedStateString;
};
export default useStateString;
+2
View File
@@ -52,6 +52,8 @@ export const getHasThumbnail = (commentMediaInfo: CommentMediaInfo | undefined,
const getYouTubeVideoId = (url: URL): string | null => {
if (url.host.includes('youtu.be')) {
return url.pathname.slice(1);
} else if (url.pathname.includes('/shorts/')) {
return url.pathname.split('/shorts/')[1].split('/')[0];
} else if (url.searchParams.has('v')) {
return url.searchParams.get('v');
}
+8 -11
View File
@@ -8,7 +8,7 @@ import { shouldShowSnow } from '../../lib/snow';
import { getCommentMediaInfo, getHasThumbnail } from '../../lib/utils/media-utils';
import { isAllView, isSubscriptionsView } from '../../lib/utils/view-utils';
import { useDefaultSubplebbitAddresses } from '../../hooks/use-default-subplebbits';
import useFeedStateString from '../../hooks/use-feed-state-string';
import { useFeedStateString } from '../../hooks/use-state-string';
import useReplyModal from '../../hooks/use-reply-modal';
import useTimeFilter from '../../hooks/use-time-filter';
import useInterfaceSettingsStore from '../../stores/use-interface-settings-store';
@@ -56,16 +56,13 @@ const Board = () => {
const { sortType } = useSortingStore();
const { timeFilterSeconds, timeFilterName } = useTimeFilter();
const feedOptions: any = useMemo(
() => ({
subplebbitAddresses,
sortType,
postsPerPage: isInAllView || isInSubscriptionsView ? 5 : 25,
...(isInAllView || isInSubscriptionsView ? { newerThan: timeFilterSeconds } : {}),
filter: hideThreadsWithoutImages ? threadsWithoutImagesFilter : undefined,
}),
[subplebbitAddresses, sortType, timeFilterSeconds, isInAllView, isInSubscriptionsView, hideThreadsWithoutImages],
);
const feedOptions = {
subplebbitAddresses,
sortType,
postsPerPage: isInAllView || isInSubscriptionsView ? 5 : 25,
...(isInAllView || isInSubscriptionsView ? { newerThan: timeFilterSeconds } : {}),
filter: hideThreadsWithoutImages ? threadsWithoutImagesFilter : undefined,
};
const { feed, hasMore, loadMore, reset, subplebbitAddressesWithNewerPosts } = useFeed(feedOptions);
const { accountComments } = useAccountComments();
+1 -1
View File
@@ -7,7 +7,7 @@ import { getCommentMediaInfo, getHasThumbnail } from '../../lib/utils/media-util
import { isAllView, isSubscriptionsView } from '../../lib/utils/view-utils';
import useCatalogFeedRows from '../../hooks/use-catalog-feed-rows';
import { useDefaultSubplebbits } from '../../hooks/use-default-subplebbits';
import useFeedStateString from '../../hooks/use-feed-state-string';
import { useFeedStateString } from '../../hooks/use-state-string';
import useTimeFilter from '../../hooks/use-time-filter';
import useWindowWidth from '../../hooks/use-window-width';
import useCatalogStyleStore from '../../stores/use-catalog-style-store';
+1 -2
View File
@@ -3,8 +3,7 @@ import { Link, useLocation } from 'react-router-dom';
import { useTranslation } from 'react-i18next';
import Plebbit from '@plebbit/plebbit-js/dist/browser/index.js';
import { Subplebbit, useSubplebbit, useSubplebbitStats } from '@plebbit/plebbit-react-hooks';
import { useDefaultSubplebbitsState } from '../../../hooks/use-default-subplebbits';
import { useDefaultSubplebbitTags } from '../../../hooks/use-default-subplebbits-tags';
import { useDefaultSubplebbitsState, useDefaultSubplebbitTags } from '../../../hooks/use-default-subplebbits';
import useIsMobile from '../../../hooks/use-is-mobile';
import useIsSubplebbitOffline from '../../../hooks/use-is-subplebbit-offline';
import LoadingEllipsis from '../../../components/loading-ellipsis';
+5 -26
View File
@@ -3,7 +3,6 @@ import { Link, useNavigate } from 'react-router-dom';
import { Trans, useTranslation } from 'react-i18next';
import { useSubplebbits } from '@plebbit/plebbit-react-hooks';
import styles from './home.module.css';
import packageJson from '../../../package.json';
import { useDefaultSubplebbits, useDefaultSubplebbitAddresses } from '../../hooks/use-default-subplebbits';
import useSubplebbitsStats from '../../hooks/use-subplebbits-stats';
import PopularThreadsBox from './popular-threads-box';
@@ -106,24 +105,6 @@ const Stats = ({ subplebbitAddresses }: { subplebbitAddresses: string[] }) => {
);
};
const { version } = packageJson;
const downloadAppLink = (() => {
const platform = navigator.platform;
if (platform === 'Linux' || platform === 'Linux x86_64' || platform === 'Linux i686' || platform === 'Linux aarch64') {
return `https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan-${version}.AppImage`;
} else if (platform === 'Win32' || platform === 'Win64' || platform === 'Windows') {
return `https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan.Portable.${version}.exe`;
} else if (platform === 'MacIntel' || platform === 'Macintosh') {
return `https://github.com/plebbit/plebchan/releases/download/v${version}/plebchan-${version}.dmg`;
} else if (platform === 'Android') {
return undefined;
} else if (platform === 'iPhone' || platform === 'iPad') {
return undefined;
} else {
return undefined;
}
})();
export const Footer = () => {
const { t } = useTranslation();
return (
@@ -134,13 +115,11 @@ export const Footer = () => {
{t('about')}
</a>
</li>
{downloadAppLink && (
<li>
<a href={downloadAppLink} target='_blank' rel='noopener noreferrer'>
{t('download_app')}
</a>
</li>
)}
<li>
<a href='https://blog.plebbit.eth.limo' target='_blank' rel='noopener noreferrer'>
Blog
</a>
</li>
<li>
<Link to='/faq'>FAQ</Link>
</li>
+2 -11
View File
@@ -30,14 +30,6 @@ export const Post = ({ post, showAllReplies = false, showReplies = true, openRep
const subplebbit = useSubplebbit({ subplebbitAddress: post?.subplebbitAddress });
const isMobile = useIsMobile();
const { deleted, locked, removed } = post || {};
const isThreadClosed = deleted || locked || removed;
const { t } = useTranslation();
if (isThreadClosed) {
openReplyModal = () => alert(t('thread_closed_alert'));
}
let comment = post;
// handle pending mod or author edit
@@ -85,8 +77,7 @@ const PostPage = () => {
post = comment;
}
const { error, deleted, locked, removed, replyCount } = post || {};
const isThreadClosed = deleted || locked || removed;
const { error, replyCount } = post || {};
useEffect(() => {
window.scrollTo(0, 0);
@@ -128,7 +119,7 @@ const PostPage = () => {
) : isInRulesView ? (
<SubplebbitRules createdAt={createdAt} rules={rules} subplebbitAddress={subplebbitAddress} />
) : (
<Post post={post} showAllReplies={true} openReplyModal={isThreadClosed ? () => alert(t('thread_closed_alert')) : openReplyModal} />
<Post post={post} showAllReplies={true} openReplyModal={openReplyModal} />
)}
</div>
);
+57
View File
@@ -3412,6 +3412,51 @@
resolved "https://registry.yarnpkg.com/@protobufjs/utf8/-/utf8-1.1.0.tgz#a777360b5b39a1a2e5106f8e858f2fd2d060c570"
integrity sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==
"@react-spring/animated@~9.7.5":
version "9.7.5"
resolved "https://registry.yarnpkg.com/@react-spring/animated/-/animated-9.7.5.tgz#eb0373aaf99b879736b380c2829312dae3b05f28"
integrity sha512-Tqrwz7pIlsSDITzxoLS3n/v/YCUHQdOIKtOJf4yL6kYVSDTSmVK1LI1Q3M/uu2Sx4X3pIWF3xLUhlsA6SPNTNg==
dependencies:
"@react-spring/shared" "~9.7.5"
"@react-spring/types" "~9.7.5"
"@react-spring/core@~9.7.5":
version "9.7.5"
resolved "https://registry.yarnpkg.com/@react-spring/core/-/core-9.7.5.tgz#72159079f52c1c12813d78b52d4f17c0bf6411f7"
integrity sha512-rmEqcxRcu7dWh7MnCcMXLvrf6/SDlSokLaLTxiPlAYi11nN3B5oiCUAblO72o+9z/87j2uzxa2Inm8UbLjXA+w==
dependencies:
"@react-spring/animated" "~9.7.5"
"@react-spring/shared" "~9.7.5"
"@react-spring/types" "~9.7.5"
"@react-spring/rafz@~9.7.5":
version "9.7.5"
resolved "https://registry.yarnpkg.com/@react-spring/rafz/-/rafz-9.7.5.tgz#ee7959676e7b5d6a3813e8c17d5e50df98b95df9"
integrity sha512-5ZenDQMC48wjUzPAm1EtwQ5Ot3bLIAwwqP2w2owG5KoNdNHpEJV263nGhCeKKmuA3vG2zLLOdu3or6kuDjA6Aw==
"@react-spring/shared@~9.7.5":
version "9.7.5"
resolved "https://registry.yarnpkg.com/@react-spring/shared/-/shared-9.7.5.tgz#6d513622df6ad750bbbd4dedb4ca0a653ec92073"
integrity sha512-wdtoJrhUeeyD/PP/zo+np2s1Z820Ohr/BbuVYv+3dVLW7WctoiN7std8rISoYoHpUXtbkpesSKuPIw/6U1w1Pw==
dependencies:
"@react-spring/rafz" "~9.7.5"
"@react-spring/types" "~9.7.5"
"@react-spring/types@~9.7.5":
version "9.7.5"
resolved "https://registry.yarnpkg.com/@react-spring/types/-/types-9.7.5.tgz#e5dd180f3ed985b44fd2cd2f32aa9203752ef3e8"
integrity sha512-HVj7LrZ4ReHWBimBvu2SKND3cDVUPWKLqRTmWe/fNY6o1owGOX0cAHbdPDTMelgBlVbrTKrre6lFkhqGZErK/g==
"@react-spring/web@^9.7.5":
version "9.7.5"
resolved "https://registry.yarnpkg.com/@react-spring/web/-/web-9.7.5.tgz#7d7782560b3a6fb9066b52824690da738605de80"
integrity sha512-lmvqGwpe+CSttsWNZVr+Dg62adtKhauGwLyGE/RRyZ8AAMLgb9x3NDMA5RMElXo+IMyTkPp7nxTB8ZQlmhb6JQ==
dependencies:
"@react-spring/animated" "~9.7.5"
"@react-spring/core" "~9.7.5"
"@react-spring/shared" "~9.7.5"
"@react-spring/types" "~9.7.5"
"@remix-run/router@1.9.0":
version "1.9.0"
resolved "https://registry.yarnpkg.com/@remix-run/router/-/router-1.9.0.tgz#9033238b41c4cbe1e961eccb3f79e2c588328cf6"
@@ -4471,6 +4516,18 @@
resolved "https://registry.yarnpkg.com/@ungap/structured-clone/-/structured-clone-1.2.1.tgz#28fa185f67daaf7b7a1a8c1d445132c5d979f8bd"
integrity sha512-fEzPV3hSkSMltkw152tJKNARhOupqbH96MZWyRjNaYZOMIzbrTeQDG+MTc6Mr2pgzFQzFxAfmhGDNP5QK++2ZA==
"@use-gesture/core@10.3.1":
version "10.3.1"
resolved "https://registry.yarnpkg.com/@use-gesture/core/-/core-10.3.1.tgz#976c9421e905f0079d49822cfd5c2e56b808fc56"
integrity sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==
"@use-gesture/react@^10.3.1":
version "10.3.1"
resolved "https://registry.yarnpkg.com/@use-gesture/react/-/react-10.3.1.tgz#17a743a894d9bd9a0d1980c618f37f0164469867"
integrity sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==
dependencies:
"@use-gesture/core" "10.3.1"
"@webassemblyjs/ast@1.14.1", "@webassemblyjs/ast@^1.14.1":
version "1.14.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.14.1.tgz#a9f6a07f2b03c95c8d38c4536a1fdfb521ff55b6"