refactor(nsfw): replace per-tag NSFW filters with single directory nsfw boolean

Remove the topbar Tags dropdown and the four per-tag hide settings
(adult/gore/anti/vulgar) inherited from the retired json lists. NSFW
status now comes from a per-directory nsfw boolean in the seedit
directories metadata, controlled by a single 'Hide communities tagged
as NSFW/18+' setting (persisted state migrates automatically).
This commit is contained in:
Tommaso Casaburi
2026-07-10 16:13:03 +07:00
parent 1593dc2a9b
commit 8d165d0b15
52 changed files with 120 additions and 653 deletions

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "إخفاء المجتمعات الافتراضية من شريط الأدوات العلوي",
"media": "وسائط",
"hide_communities_tagged_as_nsfw": "إخفاء المجتمعات المعلمة كـ NSFW/18+",
"tagged_as_adult": "تم وسمها كـ \"بالغ\"",
"tagged_as_gore": "موسوم كـ \"جور\"",
"tagged_as_anti": "تم وضع علامة كـ \"مناهض\"",
"tagged_as_vulgar": "تم وسمه كـ \"بذيء\"",
"drop_here_or": "إسقاط هنا أو",
"upload_button_warning": "التحميل التلقائي محظور بواسطة سياسة CORS في متصفحك، ولكنه متاح في تطبيق Seedit لنظام Android وتطبيقات سطح المكتب (Win/Mac/Linux).\n\nاذهب إلى صفحة روابط التنزيل على GitHub؟",
"create_community_warning": "إنشاء مجتمع يتطلب تشغيل عقدة كاملة. يقوم تطبيق Seedit لسطح المكتب (Win/Mac/Linux) بتشغيل عقدة كاملة تلقائيًا.\n\nاذهب إلى صفحة روابط التنزيل على GitHub؟",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "تشغيل الفيديوهات تلقائيًا في صفحة التعليقات",
"mute_videos_by_default": "كتم الفيديوهات افتراضياً",
"expand_media_previews_based_on_community_media_preferences": "قم بتوسيع معاينات الوسائط بناءً على تفضيلات الوسائط في تلك المجتمع",
"show_all_nsfw": "عرض كل المحتوى NSFW",
"hide_all_nsfw": "إخفاء كل المحتوى غير الآمن",
"tags": "الوسوم",
"moderator_of": "مشرف على",
"not_subscriber_nor_moderator": "أنت لست مشتركًا ولا مشرفًا في أي مجتمع.",
"more_posts_last_year": "{{count}} منشورات في {{currentTimeFilterName}}: <1>عرض المزيد من المنشورات من العام الماضي</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "টপবার থেকে ডিফল্ট কমিউনিটিগুলি লুকান",
"media": "মিডিয়া",
"hide_communities_tagged_as_nsfw": "NSFW/18+ হিসেবে ট্যাগকৃত কমিউনিটিগুলি লুকান",
"tagged_as_adult": "\"এডাল্ট\" হিসেবে ট্যাগ করা হয়েছে",
"tagged_as_gore": "\"গোর\" হিসেবে চিহ্নিত",
"tagged_as_anti": "\"এন্টি\" হিসেবে চিহ্নিত",
"tagged_as_vulgar": "\"বদতুমিজ\" হিসেবে ট্যাগ করা হয়েছে",
"drop_here_or": "এখানে ফেলুন অথবা",
"upload_button_warning": "অটো-আপলোড আপনার ব্রাউজারের CORS নীতি দ্বারা ব্লক করা হয়েছে, তবে এটি Seedit অ্যান্ড্রয়েড অ্যাপ এবং ডেস্কটপ অ্যাপ (Win/Mac/Linux)-এ উপলব্ধ।\n\nGitHub এ ডাউনলোড লিঙ্ক পৃষ্ঠায় যান?",
"create_community_warning": "একটি কমিউনিটি তৈরি করতে একটি ফুল নোড চালানো প্রয়োজন। Seedit ডেস্কটপ অ্যাপ (Win/Mac/Linux) স্বয়ংক্রিয়ভাবে একটি ফুল নোড চালায়।\n\nGitHub এ ডাউনলোড লিঙ্ক পৃষ্ঠায় যান?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "মন্তব্য পৃষ্ঠায় ভিডিও স্বয়ংক্রিয়ভাবে চালান",
"mute_videos_by_default": "ডিফল্টভাবে ভিডিও মিউট করুন",
"expand_media_previews_based_on_community_media_preferences": "সেই কমিউনিটির মিডিয়া পছন্দের উপর ভিত্তি করে মিডিয়া প্রিভিউগুলি সম্প্রসারণ করুন",
"show_all_nsfw": "সব NSFW দেখান",
"hide_all_nsfw": "সব NSFW লুকান",
"tags": "ট্যাগসমূহ",
"moderator_of": "মডারেটর",
"not_subscriber_nor_moderator": "আপনি কোনও কমিউনিটির সদস্য বা মডারেটর নন।",
"more_posts_last_year": "{{count}} পোস্ট {{currentTimeFilterName}} এ: <1>গত বছরের আরও পোস্ট দেখান</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Skrýt výchozí komunity z horního panelu",
"media": "mediální",
"hide_communities_tagged_as_nsfw": "Skrýt komunity označené jako NSFW/18+",
"tagged_as_adult": "označeno jako \"dospělý\"",
"tagged_as_gore": "označeno jako \"gore\"",
"tagged_as_anti": "označeno jako \"anti\"",
"tagged_as_vulgar": "označeno jako \"vulgární\"",
"drop_here_or": "Přetáhněte sem nebo",
"upload_button_warning": "Automatické nahrávání je blokováno politikou CORS vašeho prohlížeče, ale je k dispozici v aplikaci Seedit pro Android a desktopovou aplikaci (Win/Mac/Linux).\n\nPřejděte na stránku odkazů ke stažení na GitHubu?",
"create_community_warning": "Vytvoření komunity vyžaduje spuštění plného uzlu. Aplikace Seedit pro desktop (Win/Mac/Linux) automaticky spouští plný uzel.\n\nPřejděte na stránku odkazů ke stažení na GitHubu?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Automatické přehrávání videí na stránce komentářů",
"mute_videos_by_default": "Zvuk videí vypnutý ve výchozím nastavení",
"expand_media_previews_based_on_community_media_preferences": "Rozbalte náhledy médií na základě preferencí médií dané komunity",
"show_all_nsfw": "Zobrazit vše NSFW",
"hide_all_nsfw": "Skrýt vše NSFW",
"tags": "Štítky",
"moderator_of": "moderátor",
"not_subscriber_nor_moderator": "Nejste odběratelem ani moderátorem žádné komunity.",
"more_posts_last_year": "{{count}} příspěvků v {{currentTimeFilterName}}: <1>zobrazit více příspěvků z minulého roku</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Skjul standardfællesskaber fra topbaren",
"media": "medier",
"hide_communities_tagged_as_nsfw": "Skjul fællesskaber mærket som NSFW/18+",
"tagged_as_adult": "mærket som \"voksen\"",
"tagged_as_gore": "mærket som \"gore\"",
"tagged_as_anti": "mærket som \"anti\"",
"tagged_as_vulgar": "mærket som \"vulgar\"",
"drop_here_or": "Drop her eller",
"upload_button_warning": "Auto-uploading er blokeret af din browsers CORS-politik, men det er tilgængeligt på Seedit Android-appen og desktopappen (Win/Mac/Linux).\n\nGå til downloadlinks-siden på GitHub?",
"create_community_warning": "Oprettelse af et fællesskab kræver, at du kører en fuld node. Seedit desktop-appen (Win/Mac/Linux) kører automatisk en fuld node.\n\nGå til downloadlinks-siden på GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Autoplay videoer på kommentarsiden",
"mute_videos_by_default": "Slå lyden fra videoer som standard",
"expand_media_previews_based_on_community_media_preferences": "Udvid mediepræsentationer baseret på det fællesskabs mediepræferencer",
"show_all_nsfw": "Vis alle NSFW",
"hide_all_nsfw": "Skjul alle NSFW",
"tags": "Tags",
"moderator_of": "moderator af",
"not_subscriber_nor_moderator": "Du er hverken abonnent eller moderator i nogen fællesskab.",
"more_posts_last_year": "{{count}} indlæg sidste {{currentTimeFilterName}}: <1>vis flere indlæg fra sidste år</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Standardgemeinschaften aus der oberen Leiste ausblenden",
"media": "Medien",
"hide_communities_tagged_as_nsfw": "Verstecke Communities, die als NSFW/18+ gekennzeichnet sind",
"tagged_as_adult": "als \"Erwachsen\" markiert",
"tagged_as_gore": "gekennzeichnet als \"gore\"",
"tagged_as_anti": "als \"anti\" markiert",
"tagged_as_vulgar": "als \"vulgär\" markiert",
"drop_here_or": "Hier ablegen oder",
"upload_button_warning": "Auto-Upload wird durch die CORS-Richtlinie Ihres Browsers blockiert, ist jedoch in der Seedit Android-App und Desktop-App (Win/Mac/Linux) verfügbar.\n\nGehen Sie zur Download-Link-Seite auf GitHub?",
"create_community_warning": "Das Erstellen einer Community erfordert das Ausführen eines vollständigen Knotens. Die Seedit-Desktop-App (Win/Mac/Linux) führt automatisch einen vollständigen Knoten aus.\n\nGehen Sie zur Download-Link-Seite auf GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Videos auf der Kommentarseite automatisch abspielen",
"mute_videos_by_default": "Videos standardmäßig stummschalten",
"expand_media_previews_based_on_community_media_preferences": "Erweitern Sie Medienvorschauen basierend auf den Medienpräferenzen dieser Community",
"show_all_nsfw": "Alle NSFW anzeigen",
"hide_all_nsfw": "Alle NSFW ausblenden",
"tags": "Tags",
"moderator_of": "Moderator von",
"not_subscriber_nor_moderator": "Sie sind weder Abonnent noch Moderator einer Community.",
"more_posts_last_year": "{{count}} Beiträge im letzten {{currentTimeFilterName}}: <1>zeige mehr Beiträge vom letzten Jahr</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Απόκρυψη προεπιλεγμένων κοινοτήτων από την πάνω μπάρα",
"media": "μέσα",
"hide_communities_tagged_as_nsfw": "Απόκρυψη κοινοτήτων με ετικέτα NSFW/18+",
"tagged_as_adult": "σημειώθηκε ως \"ενήλικας\"",
"tagged_as_gore": "επισημασμένο ως \"gore\"",
"tagged_as_anti": "επισημασμένο ως \"αντι\"",
"tagged_as_vulgar": "επισημάνθηκε ως \"χονδροειδές\"",
"drop_here_or": "Μεταφέρετε εδώ ή",
"upload_button_warning": "Η αυτόματη αποστολή είναι αποκλεισμένη από την πολιτική CORS του προγράμματος περιήγησής σας, αλλά είναι διαθέσιμη στην εφαρμογή Seedit Android και στην επιτραπέζια εφαρμογή (Win/Mac/Linux).\n\nΜεταβείτε στη σελίδα συνδέσμων λήψης στο GitHub;",
"create_community_warning": "Η δημιουργία μιας κοινότητας απαιτεί τη λειτουργία ενός πλήρους κόμβου. Η εφαρμογή Seedit για επιτραπέζιους υπολογιστές (Win/Mac/Linux) εκτελεί αυτόματα έναν πλήρη κόμβο.\n\nΜεταβείτε στη σελίδα συνδέσμων λήψης στο GitHub;",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Αυτόματη αναπαραγωγή βίντεο στη σελίδα σχολίων",
"mute_videos_by_default": "Σίγαση βίντεο από προεπιλογή",
"expand_media_previews_based_on_community_media_preferences": "Επεκτείνετε τις προεπισκοπήσεις μέσων βάσει των προτιμήσεων μέσων της κοινότητας",
"show_all_nsfw": "Εμφάνιση όλων NSFW",
"hide_all_nsfw": "Απόκρυψη όλων των NSFW",
"tags": "Ετικέτες",
"moderator_of": "διαχειριστής του",
"not_subscriber_nor_moderator": "Δεν είστε συνδρομητής ούτε διαχειριστής σε καμία κοινότητα.",
"more_posts_last_year": "{{count}} αναρτήσεις στο {{currentTimeFilterName}}: <1>δείτε περισσότερες αναρτήσεις από το περασμένο έτος</1>",

View File

@@ -358,10 +358,6 @@
"hide_default_communities_from_topbar": "Hide default communities from topbar",
"media": "media",
"hide_communities_tagged_as_nsfw": "Hide communities tagged as NSFW/18+",
"tagged_as_adult": "tagged as \"adult\"",
"tagged_as_gore": "tagged as \"gore\"",
"tagged_as_anti": "tagged as \"anti\"",
"tagged_as_vulgar": "tagged as \"vulgar\"",
"drop_here_or": "Drop here or",
"upload_button_warning": "Auto-uploading is blocked by your browser's CORS policy, but it is available on the Seedit Android app and desktop app (Win/Mac/Linux).\n\nGo to the download links page on GitHub?",
"create_community_warning": "Creating a community requires running a full node. The Seedit desktop app (Win/Mac/Linux) runs a full node automatically.\n\nGo to the download links page on GitHub?",
@@ -384,9 +380,6 @@
"autoplay_videos_on_comments_page": "Autoplay videos on the comments page",
"mute_videos_by_default": "Mute videos by default",
"expand_media_previews_based_on_community_media_preferences": "Expand media previews based on that community's media preferences",
"show_all_nsfw": "show all nsfw",
"hide_all_nsfw": "hide all nsfw",
"tags": "Tags",
"moderator_of": "moderator of",
"not_subscriber_nor_moderator": "You are not a subscriber nor a moderator of any community.",
"more_posts_last_year": "{{count}} posts last {{currentTimeFilterName}}: <1>show more posts from last year</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Ocultar comunidades predeterminadas de la barra superior",
"media": "medios",
"hide_communities_tagged_as_nsfw": "Ocultar comunidades etiquetadas como NSFW/18+",
"tagged_as_adult": "etiquetado como \"adulto\"",
"tagged_as_gore": "etiquetado como \"gore\"",
"tagged_as_anti": "etiquetado como \"anti\"",
"tagged_as_vulgar": "etiquetado como \"vulgar\"",
"drop_here_or": "Suelta aquí o",
"upload_button_warning": "La carga automática está bloqueada por la política CORS de su navegador, pero está disponible en la aplicación Seedit para Android y en la aplicación de escritorio (Win/Mac/Linux).\n\n¿Vaya a la página de enlaces de descarga en GitHub?",
"create_community_warning": "Crear una comunidad requiere ejecutar un nodo completo. La aplicación de escritorio Seedit (Win/Mac/Linux) ejecuta automáticamente un nodo completo.\n\n¿Vaya a la página de enlaces de descarga en GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Reproducción automática de videos en la página de comentarios",
"mute_videos_by_default": "Silenciar videos por defecto",
"expand_media_previews_based_on_community_media_preferences": "Expande las vistas previas de medios según las preferencias de medios de esa comunidad",
"show_all_nsfw": "mostrar todo NSFW",
"hide_all_nsfw": "ocultar todo NSFW",
"tags": "Etiquetas",
"moderator_of": "moderador de",
"not_subscriber_nor_moderator": "No eres suscriptor ni moderador de ninguna comunidad.",
"more_posts_last_year": "{{count}} publicaciones en {{currentTimeFilterName}}: <1>mostrar más publicaciones del año pasado</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "پنهان کردن جوامع پیش‌فرض از نوار بالای صفحه",
"media": "رسانه‌ها",
"hide_communities_tagged_as_nsfw": "پنهان کردن جوامع برچسب خورده به عنوان NSFW/18+",
"tagged_as_adult": "برچسب زده شده به عنوان \"بالغ\"",
"tagged_as_gore": "برچسب‌گذاری شده به عنوان \"گور\"",
"tagged_as_anti": "برچسب خورده به عنوان \"مخالف\"",
"tagged_as_vulgar": "برچسب‌گذاری شده به عنوان \"زشت\"",
"drop_here_or": "اینجا رها کنید یا",
"upload_button_warning": "بارگذاری خودکار توسط سیاست CORS مرورگر شما مسدود شده است، اما در اپلیکیشن Seedit برای Android و اپلیکیشن دسکتاپ (Win/Mac/Linux) در دسترس است.\n\nبه صفحه لینک‌های دانلود در GitHub بروید؟",
"create_community_warning": "ایجاد یک جامعه نیاز به اجرای یک گره کامل دارد. اپلیکیشن دسکتاپ Seedit (Win/Mac/Linux) به‌طور خودکار یک گره کامل اجرا می‌کند.\n\nبه صفحه لینک‌های دانلود در GitHub بروید؟",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "پخش خودکار ویدیوها در صفحه نظرات",
"mute_videos_by_default": "بی‌صدا کردن ویدیوها به طور پیش‌فرض",
"expand_media_previews_based_on_community_media_preferences": "پیش‌نمایش‌های رسانه‌ای را بر اساس ترجیحات رسانه‌ای آن جامعه گسترش دهید",
"show_all_nsfw": "نمایش همه NSFW",
"hide_all_nsfw": "مخفی کردن همه محتوای NSFW",
"tags": "برچسب‌ها",
"moderator_of": "مدیر",
"not_subscriber_nor_moderator": "شما نه عضو مشترک هستید و نه مدیر هیچ جامعه‌ای.",
"more_posts_last_year": "{{count}} پست در {{currentTimeFilterName}}: <1>نمایش پست‌های بیشتر از سال گذشته</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Piilota oletusyhteisöt yläpalkista",
"media": "media",
"hide_communities_tagged_as_nsfw": "Piilota yhteisöt, jotka on merkitty NSFW/18+",
"tagged_as_adult": "merkitty \"aikuiseksi\"",
"tagged_as_gore": "merkitty \"gore\" -tunnisteella",
"tagged_as_anti": "merkitty \"anti\"-tunnisteeksi",
"tagged_as_vulgar": "merkitty \"vulgaariseksi\"",
"drop_here_or": "Pudota tänne tai",
"upload_button_warning": "Automaattinen lataus on estetty selaimesi CORS-politiikalla, mutta se on saatavilla Seedit Android -sovelluksessa ja työpöytäsovelluksessa (Win/Mac/Linux).\n\nMene GitHubin latauslinkkisivulle?",
"create_community_warning": "Yhteisön luominen vaatii täyden solmun ajamisen. Seeditin työpöytäsovellus (Win/Mac/Linux) ajaa automaattisesti täyden solmun.\n\nMene GitHubin latauslinkkisivulle?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Toista videot automaattisesti kommenttisivulla",
"mute_videos_by_default": "Mykistä videot oletuksena",
"expand_media_previews_based_on_community_media_preferences": "Laajenna mediakatsauksia kyseisen yhteisön mediatoiveiden perusteella",
"show_all_nsfw": "näytä kaikki NSFW",
"hide_all_nsfw": "piilota kaikki NSFW",
"tags": "Tagit",
"moderator_of": "moderaattori",
"not_subscriber_nor_moderator": "Et ole tilaaja etkä moderaattori missään yhteisössä.",
"more_posts_last_year": "{{count}} julkaisua viime {{currentTimeFilterName}}: <1>näytä lisää julkaisuja viime vuodelta</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Itago ang mga default na komunidad mula sa topbar",
"media": "midya",
"hide_communities_tagged_as_nsfw": "Itago ang mga komunidad na may label na NSFW/18+",
"tagged_as_adult": "tinag na bilang \"adulto\"",
"tagged_as_gore": "tinag na \"gore\"",
"tagged_as_anti": "minarkahan bilang \"anti\"",
"tagged_as_vulgar": "tinag na \"vulgar\"",
"drop_here_or": "I-drag dito o",
"upload_button_warning": "Ang awtomatikong pag-upload ay naharang ng CORS policy ng iyong browser, ngunit ito ay magagamit sa Seedit Android app at desktop app (Win/Mac/Linux).\n\nPumunta sa page ng download links sa GitHub?",
"create_community_warning": "Ang paggawa ng komunidad ay nangangailangan ng pagpapatakbo ng isang buong node. Ang Seedit desktop app (Win/Mac/Linux) ay awtomatikong nagpapatakbo ng isang buong node.\n\nPumunta sa page ng download links sa GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Awtomatikong pag-play ng mga video sa pahina ng mga komento",
"mute_videos_by_default": "I-mute ang mga video bilang default",
"expand_media_previews_based_on_community_media_preferences": "Palawakin ang mga preview ng media batay sa mga kagustuhan ng media ng komunidad na iyon",
"show_all_nsfw": "ipakita lahat ng NSFW",
"hide_all_nsfw": "Itago lahat ng NSFW",
"tags": "Mga tag",
"moderator_of": "moderator ng",
"not_subscriber_nor_moderator": "Hindi ka subscriber ni moderator ng anumang komunidad.",
"more_posts_last_year": "{{count}} post sa huling {{currentTimeFilterName}}: <1>ipakita ang mas maraming post mula sa nakaraang taon</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Masquer les communautés par défaut de la barre supérieure",
"media": "média",
"hide_communities_tagged_as_nsfw": "Cacher les communautés étiquetées comme NSFW/18+",
"tagged_as_adult": "étiqueté comme \"adulte\"",
"tagged_as_gore": "étiqueté comme \"gore\"",
"tagged_as_anti": "étiqueté comme \"anti\"",
"tagged_as_vulgar": "étiqueté comme \"vulgaire\"",
"drop_here_or": "Déposez ici ou",
"upload_button_warning": "Le téléchargement automatique est bloqué par la politique CORS de votre navigateur, mais il est disponible sur l'application Seedit Android et l'application de bureau (Win/Mac/Linux).\n\nAllez à la page des liens de téléchargement sur GitHub?",
"create_community_warning": "Créer une communauté nécessite l'exécution d'un nœud complet. L'application Seedit pour bureau (Win/Mac/Linux) exécute automatiquement un nœud complet.\n\nAllez à la page des liens de téléchargement sur GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Lecture automatique des vidéos sur la page des commentaires",
"mute_videos_by_default": "Mettre les vidéos en sourdine par défaut",
"expand_media_previews_based_on_community_media_preferences": "Développez les aperçus des médias en fonction des préférences médias de cette communauté",
"show_all_nsfw": "afficher tout NSFW",
"hide_all_nsfw": "masquer tout NSFW",
"tags": "Tags",
"moderator_of": "modérateur de",
"not_subscriber_nor_moderator": "Vous n'êtes ni abonné ni modérateur d'aucune communauté.",
"more_posts_last_year": "{{count}} publications lors du dernier {{currentTimeFilterName}} : <1>afficher plus de publications de l'année dernière</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "הסתר קהילות ברירת מחדל מהסרגל העליון",
"media": "מדיה",
"hide_communities_tagged_as_nsfw": "הסתר קהילות שסומנו כ-NSFW/18+",
"tagged_as_adult": "סווג כ\"מותאם לבוגרים\"",
"tagged_as_gore": "מסומן כ-\"גורה\"",
"tagged_as_anti": "מתויג כ\"נגד\"",
"tagged_as_vulgar": "סומן כ-\"גס\"",
"drop_here_or": "הנח כאן או",
"upload_button_warning": "העלאה אוטומטית חסומה על ידי מדיניות ה-CORS של הדפדפן שלך, אך היא זמינה באפליקציית Seedit לאנדרואיד ובאפליקציית הדסקטופ (Win/Mac/Linux).\n\nעבור לדף קישורי ההורדה ב-GitHub?",
"create_community_warning": "יצירת קהילה דורשת הפעלת צומת מלא. אפליקציית שולחן העבודה של Seedit (Win/Mac/Linux) מפעילה צומת מלא באופן אוטומטי.\n\nעבור לדף קישורי ההורדה ב-GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "השמעת וידאו אוטומטית בדף ההערות",
"mute_videos_by_default": "כיבוי קול לסרטונים כבררת מחדל",
"expand_media_previews_based_on_community_media_preferences": "הרחב תצוגות מדיה בהתאם להעדפות המדיה של הקהילה",
"show_all_nsfw": "הצג הכל NSFW",
"hide_all_nsfw": "הסתר את כל התוכן הלא בטוח",
"tags": "תגיות",
"moderator_of": "מנהל של",
"not_subscriber_nor_moderator": "אתה לא מנוי ולא מפקח על שום קהילה.",
"more_posts_last_year": "{{count}} פוסטים ב{{currentTimeFilterName}} האחרון: <1>הצג עוד פוסטים מהשנה שעברה</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "टॉपबार से डिफ़ॉल्ट समुदायों को छिपाएं",
"media": "मीडिया",
"hide_communities_tagged_as_nsfw": "NSFW/18+ के रूप में टैग की गई समुदायों को छिपाएं",
"tagged_as_adult": "\"एडल्ट\" के रूप में टैग किया गया",
"tagged_as_gore": "\"गोर\" के रूप में चिह्नित",
"tagged_as_anti": "\"एंटी\" के रूप में टैग किया गया",
"tagged_as_vulgar": "को \"वुल्गर\" के रूप में टैग किया गया",
"drop_here_or": "यहां छोड़ें या",
"upload_button_warning": "ऑटो-अपलोड आपके ब्राउज़र की CORS नीति द्वारा अवरुद्ध है, लेकिन यह Seedit Android ऐप और डेस्कटॉप ऐप (Win/Mac/Linux) पर उपलब्ध है।\n\nGitHub पर डाउनलोड लिंक पृष्ठ पर जाएं?",
"create_community_warning": "एक समुदाय बनाने के लिए एक पूर्ण नोड चलाना आवश्यक है। Seedit डेस्कटॉप ऐप (Win/Mac/Linux) स्वचालित रूप से एक पूर्ण नोड चलाता है।\n\nGitHub पर डाउनलोड लिंक पृष्ठ पर जाएं?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "टिप्पणियों के पृष्ठ पर वीडियो स्वचालित रूप से चलाएं",
"mute_videos_by_default": "वीडियो को डिफ़ॉल्ट रूप से म्यूट करें",
"expand_media_previews_based_on_community_media_preferences": "उस समुदाय की मीडिया प्राथमिकताओं के आधार पर मीडिया पूर्वावलोकन का विस्तार करें",
"show_all_nsfw": "सभी NSFW दिखाएं",
"hide_all_nsfw": "सभी NSFW छुपाएं",
"tags": "टैग",
"moderator_of": "मॉडरेटर",
"not_subscriber_nor_moderator": "आप किसी भी समुदाय के सदस्य या मॉडरेटर नहीं हैं।",
"more_posts_last_year": "{{count}} पोस्ट पिछले {{currentTimeFilterName}} में: <1>पिछले साल के और पोस्ट दिखाएं</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Alapértelmezett közösségek elrejtése a felső sávból",
"media": "médiák",
"hide_communities_tagged_as_nsfw": "Rejtse el a NSFW/18+ címkézett közösségeket",
"tagged_as_adult": "\"felnőtt\"-ként megjelölve",
"tagged_as_gore": "címkézve mint \"gore\"",
"tagged_as_anti": "címkézve \"anti\" néven",
"tagged_as_vulgar": "megjegyezve mint \"vulgáris\"",
"drop_here_or": "Húzza ide, vagy",
"upload_button_warning": "Az automatikus feltöltés a böngészője CORS irányelvei által blokkolva van, de elérhető a Seedit Android alkalmazásban és asztali alkalmazásban (Win/Mac/Linux).\n\nMenjen a letöltési linkek oldalára a GitHub-on?",
"create_community_warning": "Közösség létrehozása teljes csomópont futtatását igényli. A Seedit asztali alkalmazás (Win/Mac/Linux) automatikusan futtat egy teljes csomópontot.\n\nMenjen a letöltési linkek oldalára a GitHub-on?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Videók automatikus lejátszása a hozzászólások oldalán",
"mute_videos_by_default": "Videók alapértelmezett némítása",
"expand_media_previews_based_on_community_media_preferences": "Bővítse a média előnézeteket a közösség média preferenciái alapján",
"show_all_nsfw": "mutasd az összes NSFW-t",
"hide_all_nsfw": "Minden NSFW elrejtése",
"tags": "Címkék",
"moderator_of": "moderátora",
"not_subscriber_nor_moderator": "Nem vagy előfizető vagy moderátor egyetlen közösségben sem.",
"more_posts_last_year": "{{count}} bejegyzés a múlt {{currentTimeFilterName}}: <1>több bejegyzés mutatása a múlt évből</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Sembunyikan komunitas default dari topbar",
"media": "media",
"hide_communities_tagged_as_nsfw": "Sembunyikan komunitas yang ditandai sebagai NSFW/18+",
"tagged_as_adult": "ditandai sebagai \"dewasa\"",
"tagged_as_gore": "ditandai sebagai \"gore\"",
"tagged_as_anti": "ditandai sebagai \"anti\"",
"tagged_as_vulgar": "ditandai sebagai \"vulgar\"",
"drop_here_or": "Seretkan di sini atau",
"upload_button_warning": "Pengunggahan otomatis diblokir oleh kebijakan CORS browser Anda, tetapi tersedia di aplikasi Seedit Android dan aplikasi desktop (Win/Mac/Linux).\n\nPergi ke halaman tautan unduhan di GitHub?",
"create_community_warning": "Membuat komunitas memerlukan menjalankan node penuh. Aplikasi desktop Seedit (Win/Mac/Linux) secara otomatis menjalankan node penuh.\n\nPergi ke halaman tautan unduhan di GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Putar otomatis video di halaman komentar",
"mute_videos_by_default": "Diamkan video secara default",
"expand_media_previews_based_on_community_media_preferences": "Perluas pratinjau media berdasarkan preferensi media komunitas tersebut",
"show_all_nsfw": "tampilkan semua NSFW",
"hide_all_nsfw": "sembunyikan semua NSFW",
"tags": "Tag",
"moderator_of": "moderator dari",
"not_subscriber_nor_moderator": "Anda bukan pelanggan maupun moderator komunitas manapun.",
"more_posts_last_year": "{{count}} postingan pada {{currentTimeFilterName}} terakhir: <1>tampilkan lebih banyak postingan dari tahun lalu</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Nascondi comunità di default dalla topbar",
"media": "media",
"hide_communities_tagged_as_nsfw": "Nascondi comunità taggate come NSFW/18+",
"tagged_as_adult": "taggate come \"adult\"",
"tagged_as_gore": "taggate come \"gore\"",
"tagged_as_anti": "taggate come \"anti\"",
"tagged_as_vulgar": "taggate come \"vulgar\"",
"drop_here_or": "Trascina qui o",
"upload_button_warning": "Il caricamento automatico è bloccato dalla politica CORS del tuo browser, ma è disponibile nell'app Seedit per Android e nell'app desktop (Win/Mac/Linux).\n\nVai alla pagina dei link per il download su GitHub?",
"create_community_warning": "Creare una comunità richiede l'esecuzione di un nodo completo. L'app Seedit per desktop (Win/Mac/Linux) esegue automaticamente un nodo completo.\n\nVai alla pagina dei link per il download su GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Riproduci automaticamente i video nella pagina dei commenti",
"mute_videos_by_default": "Disattiva laudio dei video per impostazione predefinita",
"expand_media_previews_based_on_community_media_preferences": "Espandi le anteprime multimediali in base alle preferenze multimediali di quella comunità",
"show_all_nsfw": "mostra tutto NSFW",
"hide_all_nsfw": "nascondi tutto NSFW",
"tags": "Tag",
"moderator_of": "moderatore di",
"not_subscriber_nor_moderator": "Non sei né iscritto né moderatore di nessuna community.",
"more_posts_last_year": "{{count}} post nell'ultimo {{currentTimeFilterName}}: <1>mostra più post dell'anno scorso</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "トップバーからデフォルトのコミュニティを隠す",
"media": "メディア",
"hide_communities_tagged_as_nsfw": "NSFW/18+としてタグ付けされたコミュニティを非表示にする",
"tagged_as_adult": "\"成人\"としてタグ付けされました",
"tagged_as_gore": "\"gore\"としてタグ付けされました",
"tagged_as_anti": "\"anti\" としてタグ付けされた",
"tagged_as_vulgar": "\"vulgar\"としてタグ付けされました",
"drop_here_or": "ここにドロップまたは",
"upload_button_warning": "自動アップロードはブラウザのCORSポリシーでブロックされていますが、SeeditのAndroidアプリおよびデスクトップアプリWin/Mac/Linuxでは利用可能です。\n\nGitHubのダウンロードリンクページに移動しますか",
"create_community_warning": "コミュニティを作成するには、フルードを実行する必要があります。SeeditのデスクトップアプリWin/Mac/Linuxは自動的にフルードを実行します。\n\nGitHubのダウンロードリンクページに移動しますか",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "コメントページで動画を自動再生",
"mute_videos_by_default": "動画をデフォルトでミュートにする",
"expand_media_previews_based_on_community_media_preferences": "そのコミュニティのメディアの好みに基づいてメディアプレビューを展開する",
"show_all_nsfw": "すべてのNSFWを表示",
"hide_all_nsfw": "すべてのNSFWを非表示",
"tags": "タグ",
"moderator_of": "のモデレーター",
"not_subscriber_nor_moderator": "あなたはどのコミュニティの購読者でもモデレーターでもありません。",
"more_posts_last_year": "{{count}} 件の投稿(直近の{{currentTimeFilterName}}: <1>昨年の投稿をもっと見る</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "상단바에서 기본 커뮤니티 숨기기",
"media": "미디어",
"hide_communities_tagged_as_nsfw": "NSFW/18+로 태그된 커뮤니티 숨기기",
"tagged_as_adult": "\"성인\"으로 태그됨",
"tagged_as_gore": "\"gore\"로 태그됨",
"tagged_as_anti": "\"anti\"로 태그됨",
"tagged_as_vulgar": "\"vulgar\"로 태그됨",
"drop_here_or": "여기에 드롭 또는",
"upload_button_warning": "자동 업로드는 브라우저의 CORS 정책에 의해 차단되었지만 Seedit Android 앱과 데스크탑 앱(Win/Mac/Linux)에서 사용할 수 있습니다.\n\nGitHub의 다운로드 링크 페이지로 이동하시겠습니까?",
"create_community_warning": "커뮤니티를 만들려면 전체 노드를 실행해야 합니다. Seedit 데스크탑 앱 (Win/Mac/Linux)은 자동으로 전체 노드를 실행합니다.\n\nGitHub의 다운로드 링크 페이지로 이동하시겠습니까?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "댓글 페이지에서 동영상 자동 재생",
"mute_videos_by_default": "기본적으로 동영상 음소거",
"expand_media_previews_based_on_community_media_preferences": "해당 커뮤니티의 미디어 선호도에 따라 미디어 미리보기를 확장합니다",
"show_all_nsfw": "모든 NSFW 보기",
"hide_all_nsfw": "모든 NSFW 숨기기",
"tags": "태그",
"moderator_of": "의 관리자",
"not_subscriber_nor_moderator": "당신은 어떤 커뮤니티의 구독자도 아니고 중재자도 아닙니다.",
"more_posts_last_year": "{{count}} 개 게시물 지난 {{currentTimeFilterName}}: <1>작년 게시물 더 보기</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "टॉपबारमधून डिफॉल्ट समुदाय लपवा",
"media": "मीडिया",
"hide_communities_tagged_as_nsfw": "NSFW/18+ म्हणून टॅग केलेल्या समुदायांना लपवा",
"tagged_as_adult": "\"एडल्ट\" म्हणून टॅग केले",
"tagged_as_gore": "\"गोर\" म्हणून टॅग केले",
"tagged_as_anti": "\"एंटी\" म्हणून टॅग केलेले",
"tagged_as_vulgar": "\"vulgar\" म्हणून टॅग केले",
"drop_here_or": "इथे ड्रॉप करा किंवा",
"upload_button_warning": "ऑटो-अपलोड आपल्या ब्राउझरच्या CORS धोरणामुळे अवरुद्ध आहे, परंतु ते Seedit Android अॅप आणि डेस्कटॉप अॅप (Win/Mac/Linux) वर उपलब्ध आहे.\n\nGitHub वर डाउनलोड लिंक पृष्ठावर जा?",
"create_community_warning": "एक समुदाय तयार करण्यासाठी एक पूर्ण नोड चालवणे आवश्यक आहे. Seedit डेस्कटॉप अॅप (Win/Mac/Linux) स्वयंचलितपणे एक पूर्ण नोड चालवते.\n\nGitHub वर डाउनलोड लिंक पृष्ठावर जा?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "टिप्पण्यांच्या पृष्ठावर व्हिडिओ ऑटोप्ले करा",
"mute_videos_by_default": "व्हिडिओ डिफॉल्टने म्यूट करा",
"expand_media_previews_based_on_community_media_preferences": "त्या समुदायाच्या मीडिया प्राधान्यांनुसार मीडिया प्रीव्ह्यू विस्तारा",
"show_all_nsfw": "सर्व NSFW दाखवा",
"hide_all_nsfw": "सर्व NSFW लपवा",
"tags": "टॅग",
"moderator_of": "मॉडरेटर",
"not_subscriber_nor_moderator": "तुम कोणत्याही समुदायाचे सदस्य किंवा मॉडरेटर नाही.",
"more_posts_last_year": "{{count}} पोस्ट मागील {{currentTimeFilterName}}: <1>मागील वर्षीचे अधिक पोस्ट दाखवा</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Verberg standaardgemeenschappen van de bovenbalk",
"media": "media",
"hide_communities_tagged_as_nsfw": "Verberg gemeenschappen gemarkeerd als NSFW/18+",
"tagged_as_adult": "geëtiketteerd als \"volwassen\"",
"tagged_as_gore": "getagd als \"gore\"",
"tagged_as_anti": "getagd als \"anti\"",
"tagged_as_vulgar": "getagd als \"vulgar\"",
"drop_here_or": "Sleep hierheen of",
"upload_button_warning": "Auto-upload wordt geblokkeerd door het CORS-beleid van uw browser, maar het is beschikbaar op de Seedit Android-app en desktopapp (Win/Mac/Linux).\n\nGa naar de downloadlinks-pagina op GitHub?",
"create_community_warning": "Een gemeenschap creëren vereist het uitvoeren van een volledige node. De Seedit desktop-app (Win/Mac/Linux) voert automatisch een volledige node uit.\n\nGa naar de downloadlinks-pagina op GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Video's automatisch afspelen op de reactiespagina",
"mute_videos_by_default": "Videos standaard dempen",
"expand_media_previews_based_on_community_media_preferences": "Breid mediavoorbeelden uit op basis van de mediavoorkeuren van die gemeenschap",
"show_all_nsfw": "toon alle NSFW",
"hide_all_nsfw": "verberg alle NSFW",
"tags": "Tags",
"moderator_of": "moderator van",
"not_subscriber_nor_moderator": "Je bent geen abonnee of moderator van een gemeenschap.",
"more_posts_last_year": "{{count}} berichten afgelopen {{currentTimeFilterName}}: <1>toon meer berichten van vorig jaar</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Skjul standardfellesskap fra toppfeltet",
"media": "media",
"hide_communities_tagged_as_nsfw": "Skjul samfunn merket som NSFW/18+",
"tagged_as_adult": "merket som \"voksen\"",
"tagged_as_gore": "merket som \"gore\"",
"tagged_as_anti": "merket som \"anti\"",
"tagged_as_vulgar": "merket som \"vulgar\"",
"drop_here_or": "Slipp her eller",
"upload_button_warning": "Auto-opplasting er blokkert av CORS-policyen til nettleseren din, men det er tilgjengelig på Seedit Android-app og desktopapp (Win/Mac/Linux).\n\nGå til nedlastingslenkesiden på GitHub?",
"create_community_warning": "Opprettelse av et fellesskap krever at du kjører en full node. Seedit desktop-appen (Win/Mac/Linux) kjører automatisk en full node.\n\nGå til nedlastingslenkesiden på GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Autospill videoer på kommentarsiden",
"mute_videos_by_default": "Demp videoer som standard",
"expand_media_previews_based_on_community_media_preferences": "Utvid medievisninger basert på det fellesskapets mediepreferanser",
"show_all_nsfw": "vis alle NSFW",
"hide_all_nsfw": "skjul all NSFW",
"tags": "Tagger",
"moderator_of": "moderator av",
"not_subscriber_nor_moderator": "Du er verken abonnent eller moderator i noe fellesskap.",
"more_posts_last_year": "{{count}} innlegg siste {{currentTimeFilterName}}: <1>vis flere innlegg fra i fjor</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Ukryj domyślne społeczności z paska na górze",
"media": "media",
"hide_communities_tagged_as_nsfw": "Ukryj społeczności oznaczone jako NSFW/18+",
"tagged_as_adult": "otagowane jako \"dorosły\"",
"tagged_as_gore": "otagowane jako \"gore\"",
"tagged_as_anti": "otagowane jako \"anti\"",
"tagged_as_vulgar": "oznaczone jako \"wulgarne\"",
"drop_here_or": "Upuść tutaj lub",
"upload_button_warning": "Automatyczne przesyłanie jest blokowane przez politykę CORS w twojej przeglądarce, ale jest dostępne w aplikacji Seedit na Androida oraz w aplikacji desktopowej (Win/Mac/Linux).\n\nPrzejdź do strony linków do pobrania na GitHubie?",
"create_community_warning": "Tworzenie społeczności wymaga uruchomienia pełnego węzła. Aplikacja Seedit desktop (Win/Mac/Linux) automatycznie uruchamia pełny węzeł.\n\nPrzejdź do strony linków do pobrania na GitHubie?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Autoodtwarzanie filmów na stronie komentarzy",
"mute_videos_by_default": "Domyślnie wycisz filmy",
"expand_media_previews_based_on_community_media_preferences": "Rozwiń podglądy mediów na podstawie preferencji mediów tej społeczności",
"show_all_nsfw": "pokaż wszystkie NSFW",
"hide_all_nsfw": "ukryj wszystkie NSFW",
"tags": "Tagi",
"moderator_of": "moderator",
"not_subscriber_nor_moderator": "Nie jesteś subskrybentem ani moderatorem żadnej społeczności.",
"more_posts_last_year": "{{count}} postów w ostatnim {{currentTimeFilterName}}: <1>pokaż więcej postów z zeszłego roku</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Ocultar comunidades padrão da barra superior",
"media": "mídia",
"hide_communities_tagged_as_nsfw": "Ocultar comunidades marcadas como NSFW/18+",
"tagged_as_adult": "marcado como \"adulto\"",
"tagged_as_gore": "marcado como \"gore\"",
"tagged_as_anti": "marcado como \"anti\"",
"tagged_as_vulgar": "marcado como \"vulgar\"",
"drop_here_or": "Solte aqui ou",
"upload_button_warning": "O upload automático está bloqueado pela política CORS do seu navegador, mas está disponível no aplicativo Seedit para Android e no aplicativo desktop (Win/Mac/Linux).\n\nVá para a página de links de download no GitHub?",
"create_community_warning": "Criar uma comunidade exige a execução de um nó completo. O aplicativo Seedit para desktop (Win/Mac/Linux) executa automaticamente um nó completo.\n\nVá para a página de links de download no GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Reproduzir vídeos automaticamente na página de comentários",
"mute_videos_by_default": "Silenciar vídeos por padrão",
"expand_media_previews_based_on_community_media_preferences": "Expanda as visualizações de mídia com base nas preferências de mídia daquela comunidade",
"show_all_nsfw": "mostrar todo NSFW",
"hide_all_nsfw": "ocultar todo NSFW",
"tags": "Tags",
"moderator_of": "moderador de",
"not_subscriber_nor_moderator": "Você não é assinante nem moderador de nenhuma comunidade.",
"more_posts_last_year": "{{count}} posts no último {{currentTimeFilterName}}: <1>mostrar mais posts do ano passado</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Ascunde comunitățile implicite din bara de sus",
"media": "media",
"hide_communities_tagged_as_nsfw": "Ascunde comunitățile etichetate ca NSFW/18+",
"tagged_as_adult": "etichetat ca \"adult\"",
"tagged_as_gore": "etichetat ca \"gore\"",
"tagged_as_anti": "etichetați ca \"anti\"",
"tagged_as_vulgar": "marcat ca \"vulgar\"",
"drop_here_or": "Aruncați aici sau",
"upload_button_warning": "Încărcarea automată este blocată de politica CORS a browser-ului tău, dar este disponibilă în aplicația Seedit pentru Android și aplicațiile desktop (Win/Mac/Linux).\n\nMergi la pagina cu linkuri de descărcare pe GitHub?",
"create_community_warning": "Crearea unei comunități necesită rularea unui nod complet. Aplicația Seedit pentru desktop (Win/Mac/Linux) rulează automat un nod complet.\n\nMergi la pagina cu linkuri de descărcare pe GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Redare automată a videoclipurilor pe pagina de comentarii",
"mute_videos_by_default": "Dezactivează sunetul videoclipurilor în mod implicit",
"expand_media_previews_based_on_community_media_preferences": "Extindeți previzualizările media pe baza preferințelor media ale comunității respective",
"show_all_nsfw": "arată tot NSFW",
"hide_all_nsfw": "ascunde tot NSFW",
"tags": "Etichete",
"moderator_of": "moderator al",
"not_subscriber_nor_moderator": "Nu ești abonat și nici moderator al vreunei comunități.",
"more_posts_last_year": "{{count}} postări în ultimul {{currentTimeFilterName}}: <1>arată mai multe postări din anul trecut</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Скрыть стандартные сообщества с верхней панели",
"media": "медиа",
"hide_communities_tagged_as_nsfw": "Скрыть сообщества, помеченные как NSFW/18+",
"tagged_as_adult": "отмечено как \"взрослый\"",
"tagged_as_gore": "помечено как \"gore\"",
"tagged_as_anti": "помечено как \"анти\"",
"tagged_as_vulgar": "отмечено как \"вульгарное\"",
"drop_here_or": "Перетащите сюда или",
"upload_button_warning": "Автоматическая загрузка заблокирована политикой CORS вашего браузера, но она доступна в приложении Seedit для Android и в настольных приложениях (Win/Mac/Linux).\n\nПерейдите на страницу ссылок для загрузки на GitHub?",
"create_community_warning": "Создание сообщества требует запуска полного узла. Приложение Seedit для настольных ПК (Win/Mac/Linux) автоматически запускает полный узел.\n\nПерейдите на страницу ссылок для загрузки на GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Автовоспроизведение видео на странице комментариев",
"mute_videos_by_default": "Отключать звук видео по умолчанию",
"expand_media_previews_based_on_community_media_preferences": "Расширьте предварительный просмотр медиа на основе предпочтений медиа этого сообщества",
"show_all_nsfw": "показать все NSFW",
"hide_all_nsfw": "скрыть весь NSFW",
"tags": "Теги",
"moderator_of": "модератор",
"not_subscriber_nor_moderator": "Вы не являетесь подписчиком или модератором ни одного сообщества.",
"more_posts_last_year": "{{count}} постов за последний {{currentTimeFilterName}}: <1>показать больше постов за прошлый год</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Fshih komunitetet e paracaktuara nga barra e sipërme",
"media": "media",
"hide_communities_tagged_as_nsfw": "Fsheh komunitetet e etiketuar si NSFW/18+",
"tagged_as_adult": "etiketuar si \"i rritur\"",
"tagged_as_gore": "etiketuar si \"gore\"",
"tagged_as_anti": "etiketuar si \"anti\"",
"tagged_as_vulgar": "etiketuar si \"vulgar\"",
"drop_here_or": "Hidh këtu ose",
"upload_button_warning": "Ngarkohet automatikisht është bllokuar nga politika CORS e shfletuesit tuaj, por është në dispozicion në aplikacionin Seedit për Android dhe aplikacionin desktop (Win/Mac/Linux).\n\nShkoni te faqja e lidhjeve për shkarkimin në GitHub?",
"create_community_warning": "Krijimi i një komuniteti kërkon ekzekutimin e një nyjeje të plotë. Aplikacioni Seedit për desktop (Win/Mac/Linux) ekzekuton automatikisht një nyje të plotë.\n\nShkoni te faqja e lidhjeve për shkarkimin në GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Luaj automatikisht videot në faqen e komenteve",
"mute_videos_by_default": "Çkyçni videot si parazgjedhje",
"expand_media_previews_based_on_community_media_preferences": "Zgjeroni parapamjet e mediave bazuar në preferencat e mediave të asaj komuniteti",
"show_all_nsfw": "trego të gjitha NSFW",
"hide_all_nsfw": "fsheh të gjitha NSFW",
"tags": "Etiketat",
"moderator_of": "moderator i",
"not_subscriber_nor_moderator": "Nuk jeni as abonues as moderator i ndonjë komuniteti.",
"more_posts_last_year": "{{count}} postime në {{currentTimeFilterName}} e fundit: <1>shfaq më shumë postime nga viti i kaluar</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Dölj standardgemenskaper från topplistan",
"media": "media",
"hide_communities_tagged_as_nsfw": "Dölj gemenskaper märkta som NSFW/18+",
"tagged_as_adult": "märkt som \"vuxen\"",
"tagged_as_gore": "märkt som \"gore\"",
"tagged_as_anti": "märkt som \"anti\"",
"tagged_as_vulgar": "märkt som \"vulgar\"",
"drop_here_or": "Dra hit eller",
"upload_button_warning": "Auto-uppladdning blockeras av din webbläsares CORS-policy, men det är tillgängligt i Seedit Android-app och skrivbordsapp (Win/Mac/Linux).\n\nGå till sidan för nedladdningslänkar på GitHub?",
"create_community_warning": "Att skapa ett community kräver att du kör en full node. Seedit desktop-appen (Win/Mac/Linux) kör automatiskt en full node.\n\nGå till sidan för nedladdningslänkar på GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Autospelning av videor på kommentarsidan",
"mute_videos_by_default": "Stäng av ljudet i videor som standard",
"expand_media_previews_based_on_community_media_preferences": "Expandera medieförhandsvisningar baserat på den gemenskapens mediapreferenser",
"show_all_nsfw": "visa all NSFW",
"hide_all_nsfw": "göm allt NSFW",
"tags": "Taggar",
"moderator_of": "moderator för",
"not_subscriber_nor_moderator": "Du är varken prenumerant eller moderator i någon community.",
"more_posts_last_year": "{{count}} inlägg senaste {{currentTimeFilterName}}: <1>visa fler inlägg från förra året</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "టాప్‌బార్ నుండి డిఫాల్ట్ కమ్యూనిటీలను దాచండి",
"media": "మీడియా",
"hide_communities_tagged_as_nsfw": "NSFW/18+ గా ట్యాగ్ చేయబడిన కమ్యూనిటీలను దాచండి",
"tagged_as_adult": "\"ఎడల్ట్\" గా ట్యాగ్ చేయబడింది",
"tagged_as_gore": "\"గోర్\" గా ట్యాగ్ చేయబడింది",
"tagged_as_anti": "\"ఆంటీ\"గా ట్యాగ్ చేయబడింది",
"tagged_as_vulgar": "\"vulgar\" గా ట్యాగ్ చేయబడింది",
"drop_here_or": "ఇక్కడ వదిలివేయండి లేదా",
"upload_button_warning": "ఆటో-అప్లోడింగ్ మీ బ్రౌజర్ యొక్క CORS విధానం ద్వారా అడ్డుకోబడింది, కానీ ఇది Seedit Android యాప్ మరియు డెస్క్టాప్ యాప్ (Win/Mac/Linux) లో లభిస్తుంది.\n\nGitHub లో డౌన్లోడ్ లింకుల పేజీకి వెళ్లండి?",
"create_community_warning": "ఒక కమ్యూనిటీని సృష్టించడానికి పూర్తి నోడు నడపడం అవసరం. Seedit డెస్క్‌టాప్ యాప్ (Win/Mac/Linux) ఆటోమేటిక్‌గా పూర్తి నోడును నడుపుతుంది.\n\nGitHub లో డౌన్లోడ్ లింకుల పేజీకి వెళ్లండి?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "వ్యాఖ్యల పేజీలో వీడియోలను ఆటోప్లే చేయండి",
"mute_videos_by_default": "డిఫాల్ట్‌గా వీడియోలను మ్యూట్ చేయండి",
"expand_media_previews_based_on_community_media_preferences": "ఆ కమ్యూనిటీ మీడియా అభిరుచుల ఆధారంగా మీడియా ప్రివ్యూలను విస్తరించండి",
"show_all_nsfw": "అన్నీ NSFW చూపించు",
"hide_all_nsfw": "అన్ని NSFW దాచు",
"tags": "ట్యాగ్లు",
"moderator_of": "మోడరేటర్",
"not_subscriber_nor_moderator": "మీరు ఏ కమ్యూనిటీలో సభ్యుడూ, మోడరేటర్ కూడా కాదు.",
"more_posts_last_year": "{{count}} పోస్ట్లు గత {{currentTimeFilterName}}: <1>గత సంవత్సరం నుండి మరిన్ని పోస్ట్లు చూపించు</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "ซ่อนชุมชนเริ่มต้นจากแถบด้านบน",
"media": "สื่อ",
"hide_communities_tagged_as_nsfw": "ซ่อนชุมชนที่ถูกแท็กเป็น NSFW/18+",
"tagged_as_adult": "ถูกแท็กเป็น \"ผู้ใหญ่\"",
"tagged_as_gore": "แท็กged เป็น \"gore\"",
"tagged_as_anti": "แท็กเป็น \"anti\"",
"tagged_as_vulgar": "แท็กเป็น \"vulgar\"",
"drop_here_or": "วางที่นี่หรือ",
"upload_button_warning": "การอัปโหลดอัตโนมัติถูกบล็อกโดยนโยบาย CORS ของเบราว์เซอร์ของคุณ แต่สามารถใช้ได้ในแอป Seedit สำหรับ Android และแอปเดสก์ท็อป (Win/Mac/Linux)\n\nไปที่หน้าลิงก์ดาวน์โหลดบน GitHub?",
"create_community_warning": "การสร้างชุมชนต้องการการรันโหนดเต็ม Seedit desktop app (Win/Mac/Linux) รันโหนดเต็มโดยอัตโนมัติ\n\nไปที่หน้าลิงก์ดาวน์โหลดบน GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "เล่นวิดีโออัตโนมัติบนหน้าคอมเมนต์",
"mute_videos_by_default": "ปิดเสียงวิดีโอโดยค่าเริ่มต้น",
"expand_media_previews_based_on_community_media_preferences": "ขยายตัวอย่างสื่อโดยอิงตามความชอบสื่อของชุมชนนั้น",
"show_all_nsfw": "แสดง NSFW ทั้งหมด",
"hide_all_nsfw": "ซ่อนทั้งหมด NSFW",
"tags": "แท็ก",
"moderator_of": "ผู้ดูแล",
"not_subscriber_nor_moderator": "คุณไม่ใช่ผู้สมัครสมาชิกและไม่ใช่ผู้ดูแลชุมชนใดๆ",
"more_posts_last_year": "{{count}} โพสต์ใน{{currentTimeFilterName}} ล่าสุด: <1>แสดงโพสต์เพิ่มเติมจากปีที่แล้ว</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Varsayılan toplulukları üst çubuktan gizle",
"media": "medya",
"hide_communities_tagged_as_nsfw": "NSFW/18+ olarak etiketlenmiş toplulukları gizle",
"tagged_as_adult": "\"yetişkin\" olarak etiketlendi",
"tagged_as_gore": "\"gore\" olarak etiketlendi",
"tagged_as_anti": "\"anti\" olarak etiketlendi",
"tagged_as_vulgar": "\"vulgar\" olarak etiketlendi",
"drop_here_or": "Burası veya bırak",
"upload_button_warning": "Otomatik yükleme, tarayıcınızın CORS politikası nedeniyle engelleniyor, ancak Seedit Android uygulaması ve masaüstü uygulamasında (Win/Mac/Linux) mevcuttur.\n\nGitHub'daki indirme bağlantıları sayfasına gidin?",
"create_community_warning": "Bir topluluk oluşturmak, tam bir düğüm çalıştırmayı gerektirir. Seedit masaüstü uygulaması (Win/Mac/Linux) otomatik olarak tam bir düğüm çalıştırır.\n\nGitHub'daki indirme bağlantıları sayfasına gidin?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Yorum sayfasında videoları otomatik oynat",
"mute_videos_by_default": "Videoları varsayılan olarak sessize al",
"expand_media_previews_based_on_community_media_preferences": "Topluluğun medya tercihleri temelinde medya önizlemelerini genişlet",
"show_all_nsfw": "tüm NSFW'yi göster",
"hide_all_nsfw": "tüm NSFW'yi gizle",
"tags": "Etiketler",
"moderator_of": "moderatorü",
"not_subscriber_nor_moderator": "Hiçbir topluluğun abonesi veya moderatörü değilsiniz.",
"more_posts_last_year": "{{count}} gönderi son {{currentTimeFilterName}}: <1>geçen yıldan daha fazla gönderi göster</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Сховати стандартні спільноти з верхньої панелі",
"media": "медіа",
"hide_communities_tagged_as_nsfw": "Сховати спільноти, позначені як NSFW/18+",
"tagged_as_adult": "мітка \"дорослий\"",
"tagged_as_gore": "позначено як \"gore\"",
"tagged_as_anti": "позначено як \"анти\"",
"tagged_as_vulgar": "позначено як \"вульгарне\"",
"drop_here_or": "Перетягніть сюди або",
"upload_button_warning": "Автозавантаження заблоковано політикою CORS вашого браузера, але воно доступне в додатку Seedit для Android та настільному додатку (Win/Mac/Linux).\n\nПерейдіть на сторінку посилань для завантаження на GitHub?",
"create_community_warning": "Створення спільноти вимагає запуску повного вузла. Десктоп-додаток Seedit (Win/Mac/Linux) автоматично запускає повний вузол.\n\nПерейдіть на сторінку посилань для завантаження на GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Автовідтворення відео на сторінці коментарів",
"mute_videos_by_default": "Вимикати звук відео за замовчуванням",
"expand_media_previews_based_on_community_media_preferences": "Розгорніть попередній перегляд медіа на основі медіапредпочтань цієї спільноти",
"show_all_nsfw": "показати всі NSFW",
"hide_all_nsfw": "приховати весь NSFW",
"tags": "Теги",
"moderator_of": "модератор",
"not_subscriber_nor_moderator": "Ви не є підписником або модератором жодної спільноти.",
"more_posts_last_year": "{{count}} постів за останній {{currentTimeFilterName}}: <1>показати більше постів з минулого року</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "اوپر بار سے ڈیفالٹ کمیونٹیز چھپائیں",
"media": "میڈیا",
"hide_communities_tagged_as_nsfw": "NSFW/18+ کے طور پر ٹیگ کردہ کمیونٹیز کو چھپائیں",
"tagged_as_adult": "\"ایڈلٹ\" کے طور پر ٹیگ کیا گیا",
"tagged_as_gore": "\"گور\" کے طور پر ٹیگ کیا گیا",
"tagged_as_anti": "\"اینٹی\" کے طور پر ٹیگ کیا گیا",
"tagged_as_vulgar": "\"vulgar\" کے طور پر ٹیگ کیا گیا",
"drop_here_or": "یہاں چھوڑیں یا",
"upload_button_warning": "آٹو اپلوڈ آپ کے براؤزر کی CORS پالیسی کے ذریعہ بلاک کر دیا گیا ہے، لیکن یہ Seedit اینڈروئیڈ ایپ اور ڈیسک ٹاپ ایپ (Win/Mac/Linux) پر دستیاب ہے۔\n\nGitHub پر ڈاؤن لوڈ لنکس پیج پر جائیں؟",
"create_community_warning": "کمیونٹی بنانے کے لیے مکمل نوڈ چلانا ضروری ہے۔ Seedit ڈیسک ٹاپ ایپ (Win/Mac/Linux) خودکار طور پر مکمل نوڈ چلاتا ہے۔\n\nGitHub پر ڈاؤن لوڈ لنکس پیج پر جائیں؟",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "کمنٹس پیج پر ویڈیوز خودکار چلائیں",
"mute_videos_by_default": "ویڈیوز کو ڈیفالٹ طور پر خاموش کریں",
"expand_media_previews_based_on_community_media_preferences": "کمیونٹی کی میڈیا ترجیحات کی بنیاد پر میڈیا پریویوز کو وسعت دیں",
"show_all_nsfw": "تمام NSFW دکھائیں",
"hide_all_nsfw": "تمام NSFW چھپائیں",
"tags": "ٹیگز",
"moderator_of": "منتظم",
"not_subscriber_nor_moderator": "آپ کسی کمیونٹی کے سبسکرائبر یا ماڈریٹر نہیں ہیں۔",
"more_posts_last_year": "{{count}} پوسٹس پچھلے {{currentTimeFilterName}} میں: <1>پچھلے سال کی مزید پوسٹس دکھائیں</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "Ẩn cộng đồng mặc định từ thanh trên",
"media": "phương tiện truyền thông",
"hide_communities_tagged_as_nsfw": "Ẩn cộng đồng được gắn thẻ là NSFW/18+",
"tagged_as_adult": "gắn thẻ là \"người lớn\"",
"tagged_as_gore": "được gắn thẻ là \"gore\"",
"tagged_as_anti": "được gắn thẻ là \"anti\"",
"tagged_as_vulgar": "được gắn thẻ là \"vulgar\"",
"drop_here_or": "Thả ở đây hoặc",
"upload_button_warning": "Tải lên tự động bị chặn bởi chính sách CORS của trình duyệt của bạn, nhưng có sẵn trên ứng dụng Seedit Android và ứng dụng desktop (Win/Mac/Linux).\n\nĐi đến trang liên kết tải xuống trên GitHub?",
"create_community_warning": "Tạo cộng đồng yêu cầu chạy một node đầy đủ. Ứng dụng Seedit desktop (Win/Mac/Linux) tự động chạy một node đầy đủ.\n\nĐi đến trang liên kết tải xuống trên GitHub?",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "Phát video tự động trên trang bình luận",
"mute_videos_by_default": "Tắt tiếng video theo mặc định",
"expand_media_previews_based_on_community_media_preferences": "Mở rộng bản xem trước phương tiện dựa trên sở thích phương tiện của cộng đồng đó",
"show_all_nsfw": "hiển thị tất cả NSFW",
"hide_all_nsfw": "ẩn tất cả NSFW",
"tags": "Thẻ",
"moderator_of": "quản trị viên của",
"not_subscriber_nor_moderator": "Bạn không phải là người đăng ký cũng không phải là người điều hành của bất kỳ cộng đồng nào.",
"more_posts_last_year": "{{count}} bài viết trong {{currentTimeFilterName}} vừa qua: <1>hiển thị thêm bài viết từ năm ngoái</1>",

View File

@@ -316,10 +316,6 @@
"hide_default_communities_from_topbar": "从顶部栏中隐藏默认社区",
"media": "媒体",
"hide_communities_tagged_as_nsfw": "隐藏标记为 NSFW/18+ 的社区",
"tagged_as_adult": "标记为“成人”",
"tagged_as_gore": "标记为 \"gore\"",
"tagged_as_anti": "标记为\"反\"",
"tagged_as_vulgar": "标记为“vulgar”",
"drop_here_or": "拖放到此处或",
"upload_button_warning": "自动上传被浏览器的CORS政策阻止但可以在Seedit Android应用程序和桌面应用程序Win/Mac/Linux上使用。\n\n前往GitHub上的下载链接页面",
"create_community_warning": "创建社区需要运行一个完整的节点。Seedit桌面应用程序Win/Mac/Linux会自动运行一个完整的节点。\n\n前往GitHub上的下载链接页面",
@@ -341,9 +337,6 @@
"autoplay_videos_on_comments_page": "在评论页面自动播放视频",
"mute_videos_by_default": "默认静音视频",
"expand_media_previews_based_on_community_media_preferences": "根据该社区的媒体偏好展开媒体预览",
"show_all_nsfw": "显示所有 NSFW",
"hide_all_nsfw": "隐藏所有NSFW",
"tags": "标签",
"moderator_of": "版主",
"not_subscriber_nor_moderator": "您既不是任何社区的订阅者,也不是管理员。",
"more_posts_last_year": "{{count}} 篇帖子在过去的 {{currentTimeFilterName}}<1>显示去年的更多帖子</1>",

View File

@@ -44,7 +44,7 @@ import {
import getShortAddress from '../../lib/utils/address-utils';
import useContentOptionsStore from '../../stores/use-content-options-store';
import useNotFoundStore from '../../stores/use-not-found-store';
import { useIsBroadlyNsfwCommunity } from '../../hooks/use-is-broadly-nsfw-community';
import { useIsNsfwCommunity } from '../../hooks/use-is-nsfw-community';
import useTheme from '../../hooks/use-theme';
import useWindowWidth from '../../hooks/use-window-width';
import { getCommunityIdentifier } from '../../hooks/use-community-identifier';
@@ -324,9 +324,8 @@ const HeaderTitle = ({ title, pendingPostCommunityAddress }: { title: string; pe
const communityAddress = params.communityAddress;
const { hideAdultCommunities, hideGoreCommunities, hideAntiCommunities, hideVulgarCommunities } = useContentOptionsStore();
const hasUnhiddenAnyNsfwCommunity = !hideAdultCommunities || !hideGoreCommunities || !hideAntiCommunities || !hideVulgarCommunities;
const isBroadlyNsfwCommunity = useIsBroadlyNsfwCommunity(communityAddress || '');
const { hideNsfwCommunities } = useContentOptionsStore();
const isHiddenNsfwCommunity = useIsNsfwCommunity(communityAddress || '') && hideNsfwCommunities;
const communityTitle = (
<Link to={`/s/${isInPendingPostView ? pendingPostCommunityAddress : communityAddress}`}>
@@ -338,7 +337,7 @@ const HeaderTitle = ({ title, pendingPostCommunityAddress }: { title: string; pe
const profileTitle = <Link to='/profile'>{account?.author?.shortAddress}</Link>;
const authorTitle = <Link to={`/u/${params.authorAddress}/c/${params.commentCid}`}>{params.authorAddress && getShortAddress(params.authorAddress)}</Link>;
if (isBroadlyNsfwCommunity && !hasUnhiddenAnyNsfwCommunity) {
if (isHiddenNsfwCommunity) {
return <span>{t('over_18')}</span>;
} else if (isInCommunitySubmitView) {
return (
@@ -430,15 +429,10 @@ const Header = () => {
const communityAddress = params.communityAddress;
const contentOptionsStore = useContentOptionsStore();
const hasUnhiddenAnyNsfwCommunity =
!contentOptionsStore.hideAdultCommunities ||
!contentOptionsStore.hideGoreCommunities ||
!contentOptionsStore.hideAntiCommunities ||
!contentOptionsStore.hideVulgarCommunities;
const isBroadlyNsfwCommunity = useIsBroadlyNsfwCommunity(communityAddress || '');
const { hideNsfwCommunities } = useContentOptionsStore();
const isHiddenNsfwCommunity = useIsNsfwCommunity(communityAddress || '') && hideNsfwCommunities;
const logoIsAvatar = isInCommunityView && suggested?.avatarUrl && !(isBroadlyNsfwCommunity && !hasUnhiddenAnyNsfwCommunity);
const logoIsAvatar = isInCommunityView && suggested?.avatarUrl && !isHiddenNsfwCommunity;
const logoSrc = logoIsAvatar ? suggested?.avatarUrl : 'assets/sprout/sprout.png';
const logoLink = '/';
@@ -478,14 +472,14 @@ const Header = () => {
<HeaderTitle title={title} pendingPostCommunityAddress={accountComment?.subplebbitAddress} />
</div>
)}
{!isMobile && !(isBroadlyNsfwCommunity && !hasUnhiddenAnyNsfwCommunity) && (
{!isMobile && !isHiddenNsfwCommunity && (
<ul className={styles.tabMenu}>
<HeaderTabs />
{(isInHomeView || isInHomeAboutView) && <AboutButton />}
</ul>
)}
</div>
{isMobile && !isInCommunitySubmitView && !(isBroadlyNsfwCommunity && !hasUnhiddenAnyNsfwCommunity) && (
{isMobile && !isInCommunitySubmitView && !isHiddenNsfwCommunity && (
<ul className={`${styles.tabMenu} ${isInProfileView ? styles.horizontalScroll : ''}`}>
<HeaderTabs />
{(isInHomeView || isInHomeAboutView || isInCommunityView || isInHomeAboutView || isInPostPageView) && <AboutButton />}

View File

@@ -8,10 +8,7 @@ const Over18Warning = () => {
const contentOptionsStore = useContentOptionsStore();
const handleAcceptWarning = () => {
contentOptionsStore.setHideAdultCommunities(false);
contentOptionsStore.setHideGoreCommunities(false);
contentOptionsStore.setHideAntiCommunities(false);
contentOptionsStore.setHideVulgarCommunities(false);
contentOptionsStore.setHideNsfwCommunities(false);
contentOptionsStore.setHasAcceptedWarning(true);
};

View File

@@ -43,19 +43,6 @@
margin-right: 5px;
}
.nsfwFilters {
background-image: url("/assets/buttons/droparrowgray.gif");
background-repeat: no-repeat;
background-position: right bottom;
display: inline-block;
padding-right: 21px;
cursor: pointer;
height: 13px;
padding-top: 10px;
text-transform: uppercase;
font-size: 9px;
}
.dropChoices {
top: 18px;
margin-top: 0;

View File

@@ -5,12 +5,11 @@ import { useAccount, useAccountCommunities } from '@bitsocial/bitsocial-react-ho
import { isAllView, isDomainView, isHomeView, isModView, isCommunityView } from '../../lib/utils/view-utils';
import getShortAddress from '../../lib/utils/address-utils';
import useContentOptionsStore from '../../stores/use-content-options-store';
import { useDefaultSubscriptions, useFilteredDefaultSubscriptions } from '../../hooks/use-default-subscriptions';
import { useFilteredDefaultSubscriptions } from '../../hooks/use-default-subscriptions';
import { isDirectoryCode, isResolvableCommunityAddress } from '../../lib/utils/directory-codes';
import useTimeFilter, { setSessionTimeFilterPreference } from '../../hooks/use-time-filter';
import { sortTypes } from '../../constants/sort-types';
import { sortLabels } from '../../constants/sort-labels';
import { handleNSFWSubscriptionPrompt } from '../../lib/utils/nsfw-subscription-utils';
import styles from './topbar.module.css';
// Directory-code subscriptions (e.g. "memes") have no dot and are shorter than raw public
@@ -70,117 +69,6 @@ const CommunitiesDropdown = () => {
);
};
const TagFilterDropdown = () => {
const { t } = useTranslation();
const account = useAccount();
const defaultCommunities = useDefaultSubscriptions();
const {
hideAdultCommunities,
hideGoreCommunities,
hideAntiCommunities,
hideVulgarCommunities,
setHideAdultCommunities,
setHideGoreCommunities,
setHideAntiCommunities,
setHideVulgarCommunities,
} = useContentOptionsStore();
const tags = useMemo(
() => [
{ name: 'adult', isHidden: hideAdultCommunities, setter: setHideAdultCommunities },
{ name: 'gore', isHidden: hideGoreCommunities, setter: setHideGoreCommunities },
{ name: 'vulgar', isHidden: hideVulgarCommunities, setter: setHideVulgarCommunities },
{ name: 'anti', isHidden: hideAntiCommunities, setter: setHideAntiCommunities },
],
[
hideAdultCommunities,
hideGoreCommunities,
hideAntiCommunities,
hideVulgarCommunities,
setHideAdultCommunities,
setHideGoreCommunities,
setHideAntiCommunities,
setHideVulgarCommunities,
],
);
const [isTagFilterDropdownOpen, setIsTagFilterDropdownOpen] = useState(false);
const toggleTagFilterDropdown = () => setIsTagFilterDropdownOpen(!isTagFilterDropdownOpen);
const tagFilterDropdownRef = useRef<HTMLDivElement>(null);
const tagFilterdropdownItemsRef = useRef<HTMLDivElement>(null);
const tagFilterDropdownClass = isTagFilterDropdownOpen ? styles.visible : styles.hidden;
const allHidden = hideAdultCommunities && hideGoreCommunities && hideAntiCommunities && hideVulgarCommunities;
const handleToggleAll = async (event: React.MouseEvent) => {
event.stopPropagation();
const newState = !allHidden;
if (!newState) {
await handleNSFWSubscriptionPrompt({
account,
defaultCommunities,
tagsToShow: ['adult', 'gore', 'anti', 'vulgar'],
isShowingAll: true,
});
}
setHideAdultCommunities(newState);
setHideGoreCommunities(newState);
setHideAntiCommunities(newState);
setHideVulgarCommunities(newState);
};
const handleToggleTag = async (event: React.MouseEvent, setter: (hide: boolean) => void, currentState: boolean, tagName: string) => {
event.stopPropagation();
const newState = !currentState;
if (!newState) {
await handleNSFWSubscriptionPrompt({
account,
defaultCommunities,
tagsToShow: [tagName],
});
}
setter(newState);
};
useEffect(() => {
const handleClickOutside = (event: MouseEvent) => {
if (tagFilterDropdownRef.current && !tagFilterDropdownRef.current.contains(event.target as Node)) {
setIsTagFilterDropdownOpen(false);
}
};
document.addEventListener('mousedown', handleClickOutside);
return () => {
document.removeEventListener('mousedown', handleClickOutside);
};
}, []);
return (
<div className={styles.dropdown} ref={tagFilterDropdownRef} onClick={toggleTagFilterDropdown}>
<span className={styles.selectedTitle}>{t('tags')}</span>
<div className={`${styles.dropChoices} ${styles.filterDropChoices} ${tagFilterDropdownClass}`} ref={tagFilterdropdownItemsRef}>
<div className={styles.dropdownItem} onClick={handleToggleAll} style={{ cursor: 'pointer' }}>
<span className={styles.dropdownItemText}>{allHidden ? t('show_all_nsfw') : t('hide_all_nsfw')}</span>
</div>
{tags.map((tag, index) => (
<div key={index} className={styles.dropdownItem} onClick={(e) => handleToggleTag(e, tag.setter, tag.isHidden, tag.name)} style={{ cursor: 'pointer' }}>
<span className={styles.dropdownItemText}>
{tag.isHidden ? t('show') : t('hide')} <i>{tag.name}</i>
</span>
</div>
))}
<Link to='/settings/content-options' className={`${styles.dropdownItem} ${styles.myCommunitiesItemButtonDotted}`}>
{t('content_options')}
</Link>
</div>
</div>
);
};
const SortTypesDropdown = () => {
const { t } = useTranslation();
const params = useParams();
@@ -335,7 +223,6 @@ const TopBar = memo(() => {
<div className={styles.headerArea}>
<div className={styles.widthClip}>
<CommunitiesDropdown />
<TagFilterDropdown />
<SortTypesDropdown />
<TimeFilterDropdown />
<div className={styles.srList}>

View File

@@ -1,2 +0,0 @@
// https://github.com/bitsocialhq/lists/blob/master/README.md
export const nsfwTags = ['adult', 'gore', 'vulgar', 'anti'];

View File

@@ -6,6 +6,7 @@ import { SEEDIT_DIRECTORY_CODES, isResolvableCommunityAddress } from '../lib/uti
export interface DefaultSubscription {
title?: string;
address: string;
nsfw?: boolean;
tags?: string[];
directoryCode?: string;
}
@@ -14,8 +15,8 @@ const DIRECTORY_CODES: string[] = [...SEEDIT_DIRECTORY_CODES];
/**
* Default communities derived from the seedit directories: each default directory code
* resolves to its highest-ranked online candidate community, with title/tags coming from
* the shared seedit-directories-defaults.json metadata. Replaces the retired
* resolves to its highest-ranked online candidate community, with title/nsfw/tags coming
* from the shared seedit-directories-defaults.json metadata. Replaces the retired
* seedit-default-subscriptions.json multisub.
*/
export const useDefaultSubscriptions = (): DefaultSubscription[] => {
@@ -32,6 +33,7 @@ export const useDefaultSubscriptions = (): DefaultSubscription[] => {
address,
directoryCode: code,
...(list?.title ? { title: list.title } : {}),
...(list?.nsfw ? { nsfw: list.nsfw } : {}),
...(list?.tags ? { tags: list.tags } : {}),
},
];
@@ -41,23 +43,19 @@ export const useDefaultSubscriptions = (): DefaultSubscription[] => {
};
/**
* Default communities filtered by the user's content options (NSFW tag filtering against
* the directory tags).
* Default communities filtered by the user's content options (NSFW directories hidden
* unless the user opted in).
*/
export const useFilteredDefaultSubscriptions = (): DefaultSubscription[] => {
const defaultSubscriptions = useDefaultSubscriptions();
const { hideAdultCommunities, hideGoreCommunities, hideAntiCommunities, hideVulgarCommunities } = useContentOptionsStore();
const { hideNsfwCommunities } = useContentOptionsStore();
return useMemo(() => {
return defaultSubscriptions.filter((subscription) => {
const tags = subscription.tags || [];
if (hideAdultCommunities && tags.includes('adult')) return false;
if (hideGoreCommunities && tags.includes('gore')) return false;
if (hideAntiCommunities && tags.includes('anti')) return false;
if (hideVulgarCommunities && tags.includes('vulgar')) return false;
return true;
});
}, [defaultSubscriptions, hideAdultCommunities, hideGoreCommunities, hideAntiCommunities, hideVulgarCommunities]);
if (!hideNsfwCommunities) {
return defaultSubscriptions;
}
return defaultSubscriptions.filter((subscription) => !subscription.nsfw);
}, [defaultSubscriptions, hideNsfwCommunities]);
};
/**

View File

@@ -1,18 +0,0 @@
import { useMemo } from 'react';
import { useDefaultSubscriptions } from './use-default-subscriptions';
const SENSITIVE_TAGS = ['adult', 'gore', 'anti', 'vulgar'];
export const useIsBroadlyNsfwCommunity = (communityAddress: string) => {
const defaultCommunities = useDefaultSubscriptions();
return useMemo(() => {
if (!communityAddress || !defaultCommunities) return false;
// Find the community in the default list
const community = defaultCommunities.find((sub) => sub.address === communityAddress);
// Check if the community has any of the sensitive tags
return Boolean(community?.tags?.some((tag) => SENSITIVE_TAGS.includes(tag)));
}, [communityAddress, defaultCommunities]);
};

View File

@@ -1,16 +1,18 @@
import { useMemo } from 'react';
import { useDefaultSubscriptions } from './use-default-subscriptions';
/**
* Whether the community is the winner of a directory marked `nsfw: true` (e.g. "nsfw").
* Non-directory communities have no NSFW metadata, so they return false.
*/
export const useIsNsfwCommunity = (communityAddress: string) => {
const defaultCommunities = useDefaultSubscriptions();
return useMemo(() => {
if (!communityAddress || !defaultCommunities) return false;
// Find the community in the default list
const community = defaultCommunities.find((sub) => sub.address === communityAddress);
// Check if the community has adult or gore tags
return Boolean(community?.tags?.includes('adult') || community?.tags?.includes('gore'));
return Boolean(community?.nsfw);
}, [communityAddress, defaultCommunities]);
};

View File

@@ -74,6 +74,25 @@ describe('normalizeDirectoryList', () => {
expect(list?.communities.map((community) => community.address)).toEqual(['g-board.eth']);
});
it('merges the nsfw boolean, preferring the defaults entry over the raw list', () => {
const defaults = normalizeDirectoryDefaultsData({
directories: { nsfw: { directoryCode: 'nsfw', nsfw: true } },
});
const fromDefaults = normalizeDirectoryList({ communities: [{ address: 'nsfw-winner.eth' }] }, 'nsfw', defaults);
expect(fromDefaults?.nsfw).toBe(true);
const fromRaw = normalizeDirectoryList({ nsfw: true, communities: [{ address: 'raw-winner.eth' }] }, 'raw');
expect(fromRaw?.nsfw).toBe(true);
const defaultsOverrideRaw = normalizeDirectoryList({ nsfw: true, communities: [{ address: 'sfw-winner.eth' }] }, 'nsfw', {
directories: { nsfw: { directoryCode: 'nsfw', nsfw: false } },
});
expect(defaultsOverrideRaw?.nsfw).toBe(false);
const absent = normalizeDirectoryList({ communities: [{ address: 'plain-winner.eth' }] }, 'memes');
expect(absent?.nsfw).toBeUndefined();
});
it('rejects payloads without valid candidates', () => {
expect(normalizeDirectoryList({ communities: [] }, 'memes')).toBeNull();
expect(normalizeDirectoryList({ communities: [{ score: 1 }] }, 'memes')).toBeNull();

View File

@@ -16,6 +16,7 @@ export interface DirectoryList {
directoryCode: string;
title?: string;
description?: string;
nsfw?: boolean;
tags?: string[];
createdAt?: number;
updatedAt?: number;
@@ -26,6 +27,7 @@ export interface DirectoryDefaultsEntry {
directoryCode?: string;
title?: string;
description?: string;
nsfw?: boolean;
tags?: string[];
}
@@ -66,6 +68,7 @@ const normalizeDirectoryDefaultsEntry = (code: string, raw: unknown): DirectoryD
directoryCode: toString(raw.directoryCode) ?? code,
...(toString(raw.title) ? { title: toString(raw.title)! } : {}),
...(toString(raw.description) ? { description: toString(raw.description)! } : {}),
...(typeof raw.nsfw === 'boolean' ? { nsfw: raw.nsfw } : {}),
...(tags ? { tags } : {}),
};
};
@@ -115,11 +118,13 @@ export const normalizeDirectoryList = (raw: unknown, fallbackCode: string, defau
const title = toString(defaultEntry?.title) ?? toString(raw.title);
const description = toString(defaultEntry?.description) ?? toString(raw.description);
const tags = toTags(defaultEntry?.tags) ?? toTags(raw.tags);
const nsfw = typeof defaultEntry?.nsfw === 'boolean' ? defaultEntry.nsfw : typeof raw.nsfw === 'boolean' ? raw.nsfw : undefined;
return {
directoryCode,
...(title ? { title } : {}),
...(description ? { description } : {}),
...(nsfw !== undefined ? { nsfw } : {}),
...(tags ? { tags } : {}),
...(toNumber(raw.createdAt) !== undefined ? { createdAt: toNumber(raw.createdAt) } : {}),
...(toNumber(raw.updatedAt) !== undefined ? { updatedAt: toNumber(raw.updatedAt) } : {}),

View File

@@ -1,65 +1,30 @@
import { setAccount } from '@bitsocial/bitsocial-react-hooks';
import type { DefaultSubscription } from '../../hooks/use-default-subscriptions';
const NSFW_SUBSCRIPTION_PROMPT_KEY_PREFIX = 'seedit-nsfw-subscription-prompt-shown-';
const NSFW_SUBSCRIPTION_PROMPT_KEY = 'seedit-nsfw-subscription-prompt-shown';
export interface NSFWSubscriptionOptions {
account: any;
defaultCommunities: any[];
tagsToShow: string[];
isShowingAll?: boolean;
defaultCommunities: DefaultSubscription[];
}
const getPromptKey = (tagsToShow: string[], isShowingAll: boolean): string => {
if (isShowingAll) {
return `${NSFW_SUBSCRIPTION_PROMPT_KEY_PREFIX}all`;
}
// Sort tags to ensure consistent key regardless of order
const sortedTags = [...tagsToShow].sort();
return `${NSFW_SUBSCRIPTION_PROMPT_KEY_PREFIX}${sortedTags.join('-')}`;
};
export const shouldShowNSFWSubscriptionPrompt = (tagsToShow: string[], isShowingAll: boolean = false): boolean => {
const key = getPromptKey(tagsToShow, isShowingAll);
return !localStorage.getItem(key);
};
export const markNSFWSubscriptionPromptShown = (tagsToShow: string[], isShowingAll: boolean = false): void => {
const key = getPromptKey(tagsToShow, isShowingAll);
localStorage.setItem(key, 'true');
};
export const getCommunitiesWithTags = (defaultCommunities: any[], tags: string[]): string[] => {
return defaultCommunities
.filter((sub) => {
const subTags = sub.tags || [];
return tags.some((tag) => subTags.includes(tag));
})
.map((sub) => sub.address);
};
export const handleNSFWSubscriptionPrompt = async ({ account, defaultCommunities, tagsToShow, isShowingAll = false }: NSFWSubscriptionOptions): Promise<void> => {
if (!shouldShowNSFWSubscriptionPrompt(tagsToShow, isShowingAll) || !account || !defaultCommunities.length) {
export const handleNSFWSubscriptionPrompt = async ({ account, defaultCommunities }: NSFWSubscriptionOptions): Promise<void> => {
if (localStorage.getItem(NSFW_SUBSCRIPTION_PROMPT_KEY) || !account || !defaultCommunities.length) {
return;
}
const communitiesToSubscribe = getCommunitiesWithTags(defaultCommunities, tagsToShow);
const communitiesToSubscribe = defaultCommunities.filter((sub) => sub.nsfw).map((sub) => sub.address);
if (communitiesToSubscribe.length === 0) {
return;
}
const tagText = isShowingAll
? 'all NSFW communities'
: tagsToShow.length === 1
? `communities tagged as "${tagsToShow[0]}"`
: `communities tagged as: ${tagsToShow.join(', ')}`;
const confirmMessage = `You're now showing ${tagText}. Would you like to subscribe to these communities? This will add them to your subscriptions.`;
const confirmMessage = `You're now showing NSFW communities. Would you like to subscribe to these communities? This will add them to your subscriptions.`;
const shouldSubscribe = window.confirm(confirmMessage);
// Mark as shown regardless of user choice
markNSFWSubscriptionPromptShown(tagsToShow, isShowingAll);
localStorage.setItem(NSFW_SUBSCRIPTION_PROMPT_KEY, 'true');
if (shouldSubscribe) {
try {

View File

@@ -3,15 +3,9 @@ import { persist } from 'zustand/middleware';
interface ContentOptionsState {
blurNsfwThumbnails: boolean;
hideAdultCommunities: boolean;
hideGoreCommunities: boolean;
hideAntiCommunities: boolean;
hideVulgarCommunities: boolean;
hideNsfwCommunities: boolean;
setBlurNsfwThumbnails: (blur: boolean) => void;
setHideAdultCommunities: (hide: boolean) => void;
setHideGoreCommunities: (hide: boolean) => void;
setHideAntiCommunities: (hide: boolean) => void;
setHideVulgarCommunities: (hide: boolean) => void;
setHideNsfwCommunities: (hide: boolean) => void;
thumbnailDisplayOption: 'show' | 'hide' | 'community';
setThumbnailDisplayOption: (option: 'show' | 'hide' | 'community') => void;
mediaPreviewOption: 'autoExpandAll' | 'autoExpandExceptComments' | 'community';
@@ -37,10 +31,7 @@ const useContentOptionsStore = create<ContentOptionsStore>()(
persist(
(set) => ({
blurNsfwThumbnails: true,
hideAdultCommunities: true,
hideGoreCommunities: true,
hideAntiCommunities: true,
hideVulgarCommunities: true,
hideNsfwCommunities: true,
hasAcceptedWarning: false,
hideDefaultCommunities: false,
enableLocalNotifications: false,
@@ -50,10 +41,7 @@ const useContentOptionsStore = create<ContentOptionsStore>()(
autoplayVideosOnComments: true,
muteVideosOnComments: true,
setBlurNsfwThumbnails: (blur) => set({ blurNsfwThumbnails: blur }),
setHideAdultCommunities: (hide) => set({ hideAdultCommunities: hide }),
setHideGoreCommunities: (hide) => set({ hideGoreCommunities: hide }),
setHideAntiCommunities: (hide) => set({ hideAntiCommunities: hide }),
setHideVulgarCommunities: (hide) => set({ hideVulgarCommunities: hide }),
setHideNsfwCommunities: (hide) => set({ hideNsfwCommunities: hide }),
setHasAcceptedWarning: (value) => set({ hasAcceptedWarning: value }),
setHideDefaultCommunities: (hide) => set({ hideDefaultCommunities: hide }),
setEnableLocalNotifications: (enable) => set({ enableLocalNotifications: enable }),
@@ -65,6 +53,21 @@ const useContentOptionsStore = create<ContentOptionsStore>()(
}),
{
name: 'content-options',
version: 1,
migrate: (persistedState, version) => {
const state = persistedState as Record<string, unknown>;
if (version === 0) {
// Collapse the retired per-tag booleans (adult/gore/anti/vulgar) into the single
// NSFW toggle: stay hidden only if the user still had every tag hidden.
state.hideNsfwCommunities =
state.hideAdultCommunities !== false && state.hideGoreCommunities !== false && state.hideAntiCommunities !== false && state.hideVulgarCommunities !== false;
delete state.hideAdultCommunities;
delete state.hideGoreCommunities;
delete state.hideAntiCommunities;
delete state.hideVulgarCommunities;
}
return state as unknown as ContentOptionsStore;
},
},
),
);

View File

@@ -27,12 +27,12 @@ import Markdown from '../../components/markdown';
import Label from '../../components/post/label';
import Sidebar from '../../components/sidebar';
import SubscribeButton from '../../components/subscribe-button';
import { nsfwTags } from '../../constants/nsfw-tags';
import _ from 'lodash';
interface SubplebbitProps {
index?: number;
subplebbit: CommunityType;
nsfw?: boolean;
tags?: string[];
isUnsubscribed?: boolean;
onUnsubscribe?: (address: string) => void;
@@ -205,7 +205,7 @@ const Infobar = () => {
</div>
{currentTag && (
<div className={styles.infobar}>
{currentTag === 'nsfw' ? t('filtering_by_nsfw') + ' ("adult", "gore", "vulgar", "anti") —' : t('filtering_by_tag', { tag: currentTag }) + ' —'}{' '}
{currentTag === 'nsfw' ? t('filtering_by_nsfw') + ' —' : t('filtering_by_tag', { tag: currentTag }) + ' —'}{' '}
<Link className={styles.undoLink} to={basePath}>
{t('undo')}
</Link>
@@ -215,7 +215,7 @@ const Infobar = () => {
);
};
const CommunityItem = ({ subplebbit, tags, index, isUnsubscribed, onUnsubscribe, directoryCode }: SubplebbitProps) => {
const CommunityItem = ({ subplebbit, nsfw, tags, index, isUnsubscribed, onUnsubscribe, directoryCode }: SubplebbitProps) => {
const { t } = useTranslation();
const { address, createdAt, description, roles, shortAddress, settings, suggested, title } = subplebbit || {};
const [avatarLoadFailed, setAvatarLoadFailed] = useState(false);
@@ -248,8 +248,6 @@ const CommunityItem = ({ subplebbit, tags, index, isUnsubscribed, onUnsubscribe,
const { allActiveUserCount } = useCommunityStats(canLoadCommunity ? { community: getCommunityIdentifier(address) } : undefined);
const { isOffline, isOnlineStatusLoading, offlineTitle } = useIsCommunityOffline(subplebbit);
const isNsfw = tags?.some((tag) => nsfwTags.includes(tag));
const isMobile = useIsMobile();
const descriptionText =
description &&
@@ -328,10 +326,10 @@ const CommunityItem = ({ subplebbit, tags, index, isUnsubscribed, onUnsubscribe,
</span>
{(userRole || isUserOwner) && (
<Link to={`/s/${address}/settings`}>
<span className={`${styles.moderatorIcon} ${isNsfw ? styles.addMarginRight : ''}`} title={userRole || 'owner'} />
<span className={`${styles.moderatorIcon} ${nsfw ? styles.addMarginRight : ''}`} title={userRole || 'owner'} />
</Link>
)}
{isNsfw && (
{nsfw && (
<Link to={getTagFilterRoute('nsfw')}>
<span className={styles.over18icon} title='Filter NSFW communities' />
</Link>
@@ -381,19 +379,18 @@ const AccountSubplebbits = ({ viewRole }: { viewRole: string }) => {
})
.filter((communityData: any) => {
if (currentTag) {
const tags = defaultCommunities.find((defaultSub) => defaultSub.address === (communityData as any).address)?.tags;
const defaultCommunity = defaultCommunities.find((defaultSub) => defaultSub.address === (communityData as any).address);
if (currentTag === 'nsfw') {
return tags?.some((tag) => nsfwTags.includes(tag));
} else {
return tags?.includes(currentTag);
return Boolean(defaultCommunity?.nsfw);
}
return Boolean(defaultCommunity?.tags?.includes(currentTag));
}
return true;
})
.map((communityData, index) => {
const tags = defaultCommunities.find((defaultSub) => defaultSub.address === (communityData as any).address)?.tags;
return <CommunityItem key={index} subplebbit={communityData} tags={tags} index={index} />;
const defaultCommunity = defaultCommunities.find((defaultSub) => defaultSub.address === (communityData as any).address);
return <CommunityItem key={index} subplebbit={communityData} nsfw={defaultCommunity?.nsfw} tags={defaultCommunity?.tags} index={index} />;
});
if (communityElements.length === 0) {
@@ -437,24 +434,25 @@ const SubscriberSubplebbits = () => {
// the user can still see and unsubscribe them; plain addresses wait for community data.
if (!communityData && !directoryCode) return false;
if (currentTag) {
const tags = defaultCommunities.find((defaultSub) => defaultSub.address === address)?.tags;
const defaultCommunity = defaultCommunities.find((defaultSub) => defaultSub.address === address);
if (currentTag === 'nsfw') {
return Boolean(tags?.some((tag) => nsfwTags.includes(tag)));
return Boolean(defaultCommunity?.nsfw);
}
return Boolean(tags?.includes(currentTag));
return Boolean(defaultCommunity?.tags?.includes(currentTag));
}
return true;
})
.map(({ entry, directoryCode, address }, index) => {
const communityData = address ? communityByAddress[address] : undefined;
const subplebbit = communityData ?? ({ address: address ?? entry } as CommunityType);
const tags = defaultCommunities.find((defaultSub) => defaultSub.address === address)?.tags;
const defaultCommunity = defaultCommunities.find((defaultSub) => defaultSub.address === address);
return (
<CommunityItem
key={entry}
subplebbit={subplebbit}
directoryCode={directoryCode}
tags={tags}
nsfw={defaultCommunity?.nsfw}
tags={defaultCommunity?.tags}
index={index}
isUnsubscribed={isUnsubscribed(entry)}
onUnsubscribe={handleUnsubscribe}
@@ -487,19 +485,18 @@ const AllDefaultSubplebbits = () => {
.filter((community): community is CommunityType => Boolean(community))
.filter((communityData) => {
if (currentTag) {
const tags = defaultCommunitiesList.find((defaultSub) => defaultSub.address === (communityData as any).address)?.tags;
const defaultCommunity = defaultCommunitiesList.find((defaultSub) => defaultSub.address === (communityData as any).address);
if (currentTag === 'nsfw') {
return tags?.some((tag) => nsfwTags.includes(tag));
} else {
return tags?.includes(currentTag);
return Boolean(defaultCommunity?.nsfw);
}
return Boolean(defaultCommunity?.tags?.includes(currentTag));
}
return true;
})
.map((communityData, index) => {
const tags = defaultCommunitiesList.find((defaultSub) => defaultSub.address === (communityData as any).address)?.tags;
return <CommunityItem key={communityData.address || index} subplebbit={communityData} tags={tags} index={index} />;
const defaultCommunity = defaultCommunitiesList.find((defaultSub) => defaultSub.address === (communityData as any).address);
return <CommunityItem key={communityData.address || index} subplebbit={communityData} nsfw={defaultCommunity?.nsfw} tags={defaultCommunity?.tags} index={index} />;
});
if (communityElements.length === 0) {
@@ -541,24 +538,25 @@ const AllAccountSubplebbits = () => {
const communityData = address ? communityByAddress[address] : undefined;
if (!communityData && !directoryCode) return false;
if (currentTag) {
const tags = defaultCommunities.find((defaultSub) => defaultSub.address === address)?.tags;
const defaultCommunity = defaultCommunities.find((defaultSub) => defaultSub.address === address);
if (currentTag === 'nsfw') {
return Boolean(tags?.some((tag) => nsfwTags.includes(tag)));
return Boolean(defaultCommunity?.nsfw);
}
return Boolean(tags?.includes(currentTag));
return Boolean(defaultCommunity?.tags?.includes(currentTag));
}
return true;
})
.map(({ entry, directoryCode, address }, index) => {
const communityData = address ? communityByAddress[address] : undefined;
const subplebbit = communityData ?? ({ address: address ?? entry } as CommunityType);
const tags = defaultCommunities.find((defaultSub) => defaultSub.address === address)?.tags;
const defaultCommunity = defaultCommunities.find((defaultSub) => defaultSub.address === address);
return (
<CommunityItem
key={entry}
subplebbit={subplebbit}
directoryCode={directoryCode}
tags={tags}
nsfw={defaultCommunity?.nsfw}
tags={defaultCommunity?.tags}
index={index}
isUnsubscribed={isUnsubscribed(entry)}
onUnsubscribe={handleUnsubscribe}

View File

@@ -11,7 +11,7 @@ import useContentOptionsStore from '../../stores/use-content-options-store';
import useFeedFiltersStore from '../../stores/use-feed-filters-store';
import useFeedResetStore from '../../stores/use-feed-reset-store';
import { usePinnedPostsStore } from '../../stores/use-pinned-posts-store';
import { useIsBroadlyNsfwCommunity } from '../../hooks/use-is-broadly-nsfw-community';
import { useIsNsfwCommunity } from '../../hooks/use-is-nsfw-community';
import useIsCommunityOffline from '../../hooks/use-is-community-offline';
import { useResolvedCommunityAddress } from '../../hooks/use-resolved-community-address';
import { isResolvableCommunityAddress } from '../../lib/utils/directory-codes';
@@ -345,10 +345,9 @@ const CommunityView = () => {
}, [communityAddress, sortType, timeFilterName, searchQuery]);
const lastVirtuosoState = lastVirtuosoStates?.[communityAddress + sortType + timeFilterName + searchQuery];
// over 18 warning for community with nsfw tag in multisub default list
const { hideAdultCommunities, hideGoreCommunities, hideAntiCommunities, hideVulgarCommunities } = useContentOptionsStore();
const hasUnhiddenAnyNsfwCommunity = !hideAdultCommunities || !hideGoreCommunities || !hideAntiCommunities || !hideVulgarCommunities;
const isBroadlyNsfwCommunity = useIsBroadlyNsfwCommunity(communityAddress || '');
// over 18 warning for community served by a directory marked nsfw
const { hideNsfwCommunities } = useContentOptionsStore();
const isHiddenNsfwCommunity = useIsNsfwCommunity(communityAddress || '') && hideNsfwCommunities;
const prevErrorMessageRef = useRef<string | undefined>(undefined);
useEffect(() => {
@@ -366,7 +365,7 @@ const CommunityView = () => {
// Derive whether to show error directly from current feed state
const shouldShowErrorToUser = Boolean(error?.message && feed.length === 0);
return isBroadlyNsfwCommunity && !hasUnhiddenAnyNsfwCommunity ? (
return isHiddenNsfwCommunity ? (
<Over18Warning />
) : (
<div className={styles.content}>

View File

@@ -8,7 +8,7 @@ import { sortRepliesByBest } from '../../lib/utils/post-utils';
import { isPendingPostView, isPostContextView } from '../../lib/utils/view-utils';
import useContentOptionsStore from '../../stores/use-content-options-store';
import useFeedResetStore from '../../stores/use-feed-reset-store';
import { useIsBroadlyNsfwCommunity } from '../../hooks/use-is-broadly-nsfw-community';
import { useIsNsfwCommunity } from '../../hooks/use-is-nsfw-community';
import useReplies from '../../hooks/use-replies';
import { getCommunityIdentifier } from '../../hooks/use-community-identifier';
import useOptionalAccountComment from '../../hooks/use-account-comment';
@@ -287,9 +287,9 @@ const PostPage = () => {
const _communityAddr = isInPendingPostView ? pendingPost?.subplebbitAddress : communityAddress;
const community = useCommunity(_communityAddr ? { community: getCommunityIdentifier(_communityAddr) } : undefined);
// over 18 warning for community with nsfw tag in multisub default list
// over 18 warning for community served by a directory marked nsfw
const { hasAcceptedWarning } = useContentOptionsStore();
const isBroadlyNsfwCommunity = useIsBroadlyNsfwCommunity(communityAddress || '');
const isNsfwCommunity = useIsNsfwCommunity(communityAddress || '');
useEffect(() => {
if (post?.error) {
@@ -310,7 +310,7 @@ const PostPage = () => {
// Derive whether to show error directly from current post state
const shouldShowErrorToUser = Boolean(post?.error && ((post?.replyCount > 0 && post?.replies?.length === 0) || post?.state === 'failed'));
return isBroadlyNsfwCommunity && !hasAcceptedWarning ? (
return isNsfwCommunity && !hasAcceptedWarning ? (
<Over18Warning />
) : (
<div className={styles.content}>

View File

@@ -42,10 +42,6 @@
margin-right: 5px;
}
.contentOptions .nsfwTag {
padding-left: 20px;
}
@media (max-width: 640px) {
.categoryTitle {
flex: 0 0 65px;

View File

@@ -139,146 +139,28 @@ const CommunitiesOptions = () => {
const { t } = useTranslation();
const account = useAccount();
const defaultCommunities = useDefaultSubscriptions();
const {
hideAdultCommunities,
hideGoreCommunities,
hideAntiCommunities,
hideVulgarCommunities,
setHideAdultCommunities,
setHideGoreCommunities,
setHideAntiCommunities,
setHideVulgarCommunities,
hideDefaultCommunities,
setHideDefaultCommunities,
} = useContentOptionsStore();
const { hideNsfwCommunities, setHideNsfwCommunities, hideDefaultCommunities, setHideDefaultCommunities } = useContentOptionsStore();
return (
<div className={styles.contentOptions}>
<div className={styles.contentOptionTitle}>{t('default_communities')}</div>
<div>
<input
type='checkbox'
id='hideAdultCommunities'
ref={(el) => {
if (el) {
const allHidden = hideAdultCommunities && hideGoreCommunities && hideAntiCommunities && hideVulgarCommunities;
const someHidden = hideAdultCommunities || hideGoreCommunities || hideAntiCommunities || hideVulgarCommunities;
el.checked = allHidden;
el.indeterminate = someHidden && !allHidden;
}
}}
onChange={async (e) => {
const newValue = e.target.checked;
// If showing (newValue = false), handle subscription prompt
if (!newValue) {
await handleNSFWSubscriptionPrompt({
account,
defaultCommunities,
tagsToShow: ['adult', 'gore', 'anti', 'vulgar'],
isShowingAll: true,
});
}
setHideAdultCommunities(newValue);
setHideGoreCommunities(newValue);
setHideAntiCommunities(newValue);
setHideVulgarCommunities(newValue);
}}
/>
<label htmlFor='hideAdultCommunities'>{t('hide_communities_tagged_as_nsfw')}</label>
</div>
<div className={styles.nsfwTag}>
<label>
<input
type='checkbox'
checked={hideAdultCommunities}
checked={hideNsfwCommunities}
onChange={async (e) => {
const newValue = e.target.checked;
// If showing (newValue = false), handle subscription prompt
if (!newValue) {
await handleNSFWSubscriptionPrompt({
account,
defaultCommunities,
tagsToShow: ['adult'],
});
await handleNSFWSubscriptionPrompt({ account, defaultCommunities });
}
setHideAdultCommunities(newValue);
setHideNsfwCommunities(newValue);
}}
/>
{t('tagged_as_adult')}
</label>
</div>
<div className={styles.nsfwTag}>
<label>
<input
type='checkbox'
checked={hideGoreCommunities}
onChange={async (e) => {
const newValue = e.target.checked;
// If showing (newValue = false), handle subscription prompt
if (!newValue) {
await handleNSFWSubscriptionPrompt({
account,
defaultCommunities,
tagsToShow: ['gore'],
});
}
setHideGoreCommunities(newValue);
}}
/>
{t('tagged_as_gore')}
</label>
</div>
<div className={styles.nsfwTag}>
<label>
<input
type='checkbox'
checked={hideAntiCommunities}
onChange={async (e) => {
const newValue = e.target.checked;
// If showing (newValue = false), handle subscription prompt
if (!newValue) {
await handleNSFWSubscriptionPrompt({
account,
defaultCommunities,
tagsToShow: ['anti'],
});
}
setHideAntiCommunities(newValue);
}}
/>
{t('tagged_as_anti')}
</label>
</div>
<div className={styles.nsfwTag}>
<label>
<input
type='checkbox'
checked={hideVulgarCommunities}
onChange={async (e) => {
const newValue = e.target.checked;
// If showing (newValue = false), handle subscription prompt
if (!newValue) {
await handleNSFWSubscriptionPrompt({
account,
defaultCommunities,
tagsToShow: ['vulgar'],
});
}
setHideVulgarCommunities(newValue);
}}
/>
{t('tagged_as_vulgar')}
{t('hide_communities_tagged_as_nsfw')}
</label>
</div>
<br />