mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
|
Before Width: | Height: | Size: 63 KiB After Width: | Height: | Size: 63 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 80 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 392 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 415 KiB |
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "الرد على {{cid}}",
|
"reply_to_cid": "الرد على {{cid}}",
|
||||||
"submit": "إرسال",
|
"submit": "إرسال",
|
||||||
"gif": "جي آي إف",
|
"gif": "جي آي إف",
|
||||||
"moderating": "تدير"
|
"moderating": "تدير",
|
||||||
|
"not_moderating": "لست تدير أي منتدى",
|
||||||
|
"not_subscribed": "لست مشتركًا في أي منتدى",
|
||||||
|
"total_posts": "إجمالي المشاركات:",
|
||||||
|
"current_users": "المستخدمون الحاليون:",
|
||||||
|
"boards_tracked": "المنتديات المتابعة:",
|
||||||
|
"interests": "اهتمامات",
|
||||||
|
"random": "عشوائي",
|
||||||
|
"international": "دولية",
|
||||||
|
"projects": "مشاريع"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "{{cid}}-এ উত্তর দিন",
|
"reply_to_cid": "{{cid}}-এ উত্তর দিন",
|
||||||
"submit": "জমা দিন",
|
"submit": "জমা দিন",
|
||||||
"gif": "জিআইএফ",
|
"gif": "জিআইএফ",
|
||||||
"moderating": "মডারেটিং"
|
"moderating": "মডারেটিং",
|
||||||
|
"not_moderating": "কোনো বোর্ডসমূহ মডারেট করছেন না",
|
||||||
|
"not_subscribed": "কোনো বোর্ডসমূহে সাবস্ক্রাইব করা হয়নি",
|
||||||
|
"total_posts": "মোট পোস্টসমূহ:",
|
||||||
|
"current_users": "বর্তমান ব্যবহারকারীরা:",
|
||||||
|
"boards_tracked": "ট্র্যাক করা বোর্ডসমূহ:",
|
||||||
|
"interests": "আগ্রহসমূহ",
|
||||||
|
"random": "এলোমেলো",
|
||||||
|
"international": "আন্তর্জাতিক",
|
||||||
|
"projects": "প্রকল্পসমূহ"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Odpovědět na {{cid}}",
|
"reply_to_cid": "Odpovědět na {{cid}}",
|
||||||
"submit": "Odeslat",
|
"submit": "Odeslat",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderování"
|
"moderating": "moderování",
|
||||||
|
"not_moderating": "Nemoderujete žádné nástěnky",
|
||||||
|
"not_subscribed": "Nejste přihlášeni k odběru žádných nástěnek",
|
||||||
|
"total_posts": "Celkem příspěvků:",
|
||||||
|
"current_users": "současní uživatelé:",
|
||||||
|
"boards_tracked": "sledované nástěnky:",
|
||||||
|
"interests": "zájmy",
|
||||||
|
"random": "náhodný",
|
||||||
|
"international": "mezinárodní",
|
||||||
|
"projects": "projekty"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Svar til {{cid}}",
|
"reply_to_cid": "Svar til {{cid}}",
|
||||||
"submit": "Indsend",
|
"submit": "Indsend",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "modererer"
|
"moderating": "modererer",
|
||||||
|
"not_moderating": "Du modererer ikke nogen opslagstavler",
|
||||||
|
"not_subscribed": "Ikke abonneret på nogen opslagstavler",
|
||||||
|
"total_posts": "Samlede opslag:",
|
||||||
|
"current_users": "nuværende brugere:",
|
||||||
|
"boards_tracked": "sporede opslagstavler:",
|
||||||
|
"interests": "interesser",
|
||||||
|
"random": "tilfældig",
|
||||||
|
"international": "internationale",
|
||||||
|
"projects": "projekter"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Antwort an {{cid}}",
|
"reply_to_cid": "Antwort an {{cid}}",
|
||||||
"submit": "Einreichen",
|
"submit": "Einreichen",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderieren"
|
"moderating": "moderieren",
|
||||||
|
"not_moderating": "Du moderierst keine Foren",
|
||||||
|
"not_subscribed": "Kein Abonnement für irgendwelche Foren",
|
||||||
|
"total_posts": "Gesamtanzahl der Beiträge:",
|
||||||
|
"current_users": "aktuelle Benutzer:",
|
||||||
|
"boards_tracked": "verfolgte Boards:",
|
||||||
|
"interests": "Interessen",
|
||||||
|
"random": "zufällig",
|
||||||
|
"international": "internationale",
|
||||||
|
"projects": "Projekte"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Απάντηση σε {{cid}}",
|
"reply_to_cid": "Απάντηση σε {{cid}}",
|
||||||
"submit": "Υποβολή",
|
"submit": "Υποβολή",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "διαχειρίζεστε"
|
"moderating": "διαχειρίζεστε",
|
||||||
|
"not_moderating": "Δεν διαχειρίζεστε καμία διαδικτυακή πινακίδα",
|
||||||
|
"not_subscribed": "Δεν έχετε εγγραφεί σε καμία διαδικτυακή πινακίδα",
|
||||||
|
"total_posts": "Συνολικές Δημοσιεύσεις:",
|
||||||
|
"current_users": "τρέχοντες χρήστες:",
|
||||||
|
"boards_tracked": "πίνακες που παρακολουθούνται:",
|
||||||
|
"interests": "ενδιαφέροντα",
|
||||||
|
"random": "τυχαίος",
|
||||||
|
"international": "διεθνείς",
|
||||||
|
"projects": "έργα"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Reply to {{cid}}",
|
"reply_to_cid": "Reply to {{cid}}",
|
||||||
"submit": "Submit",
|
"submit": "Submit",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderating"
|
"moderating": "moderating",
|
||||||
|
"not_moderating": "Not moderating any boards",
|
||||||
|
"not_subscribed": "Not subscribed to any boards",
|
||||||
|
"total_posts": "Total Posts:",
|
||||||
|
"current_users": "current users:",
|
||||||
|
"boards_tracked": "boards tracked:",
|
||||||
|
"interests": "interests",
|
||||||
|
"random": "random",
|
||||||
|
"international": "international",
|
||||||
|
"projects": "projects"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Responder a {{cid}}",
|
"reply_to_cid": "Responder a {{cid}}",
|
||||||
"submit": "Enviar",
|
"submit": "Enviar",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderando"
|
"moderating": "moderando",
|
||||||
|
"not_moderating": "No estás moderando ningún foro",
|
||||||
|
"not_subscribed": "No suscrito a ningún foro",
|
||||||
|
"total_posts": "Total de publicaciones:",
|
||||||
|
"current_users": "usuarios actuales:",
|
||||||
|
"boards_tracked": "foros seguidos:",
|
||||||
|
"interests": "intereses",
|
||||||
|
"random": "aleatorio",
|
||||||
|
"international": "internacionales",
|
||||||
|
"projects": "proyectos"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "پاسخ به {{cid}}",
|
"reply_to_cid": "پاسخ به {{cid}}",
|
||||||
"submit": "ارسال",
|
"submit": "ارسال",
|
||||||
"gif": "گیف",
|
"gif": "گیف",
|
||||||
"moderating": "مدیریت"
|
"moderating": "مدیریت",
|
||||||
|
"not_moderating": "هیچ تالار پیامی را مدیریت نمیکنید",
|
||||||
|
"not_subscribed": "به هیچ تالار پیامی اشتراک ندارید",
|
||||||
|
"total_posts": "کل پستها:",
|
||||||
|
"current_users": "کاربران فعلی:",
|
||||||
|
"boards_tracked": "تالارهای پیگیری شده:",
|
||||||
|
"interests": "علایق",
|
||||||
|
"random": "تصادفی",
|
||||||
|
"international": "بینالمللی",
|
||||||
|
"projects": "پروژهها"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Vastaa {{cid}}",
|
"reply_to_cid": "Vastaa {{cid}}",
|
||||||
"submit": "Lähetä",
|
"submit": "Lähetä",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderoit"
|
"moderating": "moderoit",
|
||||||
|
"not_moderating": "Et moderoi mitään foorumeita",
|
||||||
|
"not_subscribed": "Et ole tilaajana missään foorumeissa",
|
||||||
|
"total_posts": "Viestejä yhteensä:",
|
||||||
|
"current_users": "nykyiset käyttäjät:",
|
||||||
|
"boards_tracked": "seuratut foorumit:",
|
||||||
|
"interests": "kiinnostuksen kohteet",
|
||||||
|
"random": "satunnainen",
|
||||||
|
"international": "kansainväliset",
|
||||||
|
"projects": "projektit"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Tumugon sa {{cid}}",
|
"reply_to_cid": "Tumugon sa {{cid}}",
|
||||||
"submit": "Isumite",
|
"submit": "Isumite",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "namamahala"
|
"moderating": "namamahala",
|
||||||
|
"not_moderating": "Hindi namamahala ng anumang mga board",
|
||||||
|
"not_subscribed": "Hindi nakasubscribe sa anumang mga board",
|
||||||
|
"total_posts": "Kabuuang Posts:",
|
||||||
|
"current_users": "kasalukuyang mga gumagamit:",
|
||||||
|
"boards_tracked": "mga board na sinusubaybayan:",
|
||||||
|
"interests": "mga interes",
|
||||||
|
"random": "random",
|
||||||
|
"international": "internasyonal",
|
||||||
|
"projects": "mga proyekto"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Répondre à {{cid}}",
|
"reply_to_cid": "Répondre à {{cid}}",
|
||||||
"submit": "Soumettre",
|
"submit": "Soumettre",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "modération"
|
"moderating": "modération",
|
||||||
|
"not_moderating": "Vous ne modérez aucun forum",
|
||||||
|
"not_subscribed": "Non abonné à aucun forum",
|
||||||
|
"total_posts": "Total des publications:",
|
||||||
|
"current_users": "utilisateurs actuels:",
|
||||||
|
"boards_tracked": "forums suivis:",
|
||||||
|
"interests": "intérêts",
|
||||||
|
"random": "aléatoire",
|
||||||
|
"international": "internationaux",
|
||||||
|
"projects": "projets"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "תגובה ל{{cid}}",
|
"reply_to_cid": "תגובה ל{{cid}}",
|
||||||
"submit": "שלח",
|
"submit": "שלח",
|
||||||
"gif": "גיף",
|
"gif": "גיף",
|
||||||
"moderating": "מנהל"
|
"moderating": "מנהל",
|
||||||
|
"not_moderating": "אינך מנהל פורומים",
|
||||||
|
"not_subscribed": "לא רשום כמנוי לפורומים",
|
||||||
|
"total_posts": "סה\"כ פוסטים:",
|
||||||
|
"current_users": "משתמשים נוכחיים:",
|
||||||
|
"boards_tracked": "פורומים שנמצאים במעקב:",
|
||||||
|
"interests": "עניינים",
|
||||||
|
"random": "אקראי",
|
||||||
|
"international": "בינלאומיים",
|
||||||
|
"projects": "פרויקטים"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "{{cid}} का उत्तर दें",
|
"reply_to_cid": "{{cid}} का उत्तर दें",
|
||||||
"submit": "जमा करें",
|
"submit": "जमा करें",
|
||||||
"gif": "जीआईएफ",
|
"gif": "जीआईएफ",
|
||||||
"moderating": "मॉडरेटिंग"
|
"moderating": "मॉडरेटिंग",
|
||||||
|
"not_moderating": "किसी भी मंच का मॉडरेशन नहीं कर रहे हैं",
|
||||||
|
"not_subscribed": "किसी भी मंच की सदस्यता नहीं ली है",
|
||||||
|
"total_posts": "कुल पोस्ट:",
|
||||||
|
"current_users": "वर्तमान उपयोगकर्ता:",
|
||||||
|
"boards_tracked": "ट्रैक किए गए बोर्ड:",
|
||||||
|
"interests": "रुचियाँ",
|
||||||
|
"random": "यादृच्छिक",
|
||||||
|
"international": "अंतरराष्ट्रीय",
|
||||||
|
"projects": "परियोजनाएं"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Válasz erre: {{cid}}",
|
"reply_to_cid": "Válasz erre: {{cid}}",
|
||||||
"submit": "Beküldés",
|
"submit": "Beküldés",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderálás"
|
"moderating": "moderálás",
|
||||||
|
"not_moderating": "Nem moderál semmilyen fórumot",
|
||||||
|
"not_subscribed": "Nem vagy feliratkozva semmilyen fórumra",
|
||||||
|
"total_posts": "Összes bejegyzés:",
|
||||||
|
"current_users": "jelenlegi felhasználók:",
|
||||||
|
"boards_tracked": "követett fórumok:",
|
||||||
|
"interests": "érdeklődési körök",
|
||||||
|
"random": "véletlenszerű",
|
||||||
|
"international": "nemzetközi",
|
||||||
|
"projects": "projektek"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Balas ke {{cid}}",
|
"reply_to_cid": "Balas ke {{cid}}",
|
||||||
"submit": "Kirim",
|
"submit": "Kirim",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "memoderasi"
|
"moderating": "memoderasi",
|
||||||
|
"not_moderating": "Tidak memoderasi papan pesan apa pun",
|
||||||
|
"not_subscribed": "Tidak berlangganan papan pesan apa pun",
|
||||||
|
"total_posts": "Total Posting:",
|
||||||
|
"current_users": "pengguna saat ini:",
|
||||||
|
"boards_tracked": "papan yang dilacak:",
|
||||||
|
"interests": "minat",
|
||||||
|
"random": "acak",
|
||||||
|
"international": "internasional",
|
||||||
|
"projects": "proyek"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Rispondi a {{cid}}",
|
"reply_to_cid": "Rispondi a {{cid}}",
|
||||||
"submit": "Invia",
|
"submit": "Invia",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "stai moderando"
|
"moderating": "stai moderando",
|
||||||
|
"not_moderating": "Non stai moderando nessun forum",
|
||||||
|
"not_subscribed": "Non iscritto a nessun forum",
|
||||||
|
"total_posts": "Post totali:",
|
||||||
|
"current_users": "utenti attuali:",
|
||||||
|
"boards_tracked": "forum tracciati:",
|
||||||
|
"interests": "interessi",
|
||||||
|
"random": "casuale",
|
||||||
|
"international": "internazionali",
|
||||||
|
"projects": "progetti"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "{{cid}}に返信",
|
"reply_to_cid": "{{cid}}に返信",
|
||||||
"submit": "送信",
|
"submit": "送信",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "モデレート中"
|
"moderating": "モデレート中",
|
||||||
|
"not_moderating": "掲示板をモデレートしていません",
|
||||||
|
"not_subscribed": "どの掲示板にも購読していません",
|
||||||
|
"total_posts": "総投稿数:",
|
||||||
|
"current_users": "現在のユーザー:",
|
||||||
|
"boards_tracked": "追跡されたボード:",
|
||||||
|
"interests": "興味",
|
||||||
|
"random": "ランダム",
|
||||||
|
"international": "国際的な",
|
||||||
|
"projects": "プロジェクト"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "{{cid}}에 답변",
|
"reply_to_cid": "{{cid}}에 답변",
|
||||||
"submit": "제출",
|
"submit": "제출",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "중재 중"
|
"moderating": "중재 중",
|
||||||
|
"not_moderating": "어떤 게시판도 중재하고 있지 않습니다",
|
||||||
|
"not_subscribed": "어떤 게시판에도 구독하지 않았습니다",
|
||||||
|
"total_posts": "총 게시물:",
|
||||||
|
"current_users": "현재 사용자:",
|
||||||
|
"boards_tracked": "추적된 게시판:",
|
||||||
|
"interests": "관심사",
|
||||||
|
"random": "랜덤",
|
||||||
|
"international": "국제적인",
|
||||||
|
"projects": "프로젝트"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "{{cid}} ला उत्तर द्या",
|
"reply_to_cid": "{{cid}} ला उत्तर द्या",
|
||||||
"submit": "सबमिट करा",
|
"submit": "सबमिट करा",
|
||||||
"gif": "जीआईएफ",
|
"gif": "जीआईएफ",
|
||||||
"moderating": "मॉडरेट करीत आहे"
|
"moderating": "मॉडरेट करीत आहे",
|
||||||
|
"not_moderating": "कोणत्याही संदेश फलकाचे मॉडरेशन करीत नाही आहात",
|
||||||
|
"not_subscribed": "कोणत्याही संदेश फलकावर सदस्यता घेतलेली नाही",
|
||||||
|
"total_posts": "एकूण पोस्ट:",
|
||||||
|
"current_users": "सध्याचे वापरकर्ते:",
|
||||||
|
"boards_tracked": "ट्रॅक केलेले बोर्ड:",
|
||||||
|
"interests": "आवडी",
|
||||||
|
"random": "यादृच्छ",
|
||||||
|
"international": "आंतरराष्ट्रीय",
|
||||||
|
"projects": "प्रकल्प"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Reageren op {{cid}}",
|
"reply_to_cid": "Reageren op {{cid}}",
|
||||||
"submit": "Verzenden",
|
"submit": "Verzenden",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "modereren"
|
"moderating": "modereren",
|
||||||
|
"not_moderating": "Je modereert geen forums",
|
||||||
|
"not_subscribed": "Niet geabonneerd op forums",
|
||||||
|
"total_posts": "Totaal aantal berichten:",
|
||||||
|
"current_users": "huidige gebruikers:",
|
||||||
|
"boards_tracked": "gevolgde borden:",
|
||||||
|
"interests": "interesses",
|
||||||
|
"random": "willekeurig",
|
||||||
|
"international": "internationale",
|
||||||
|
"projects": "projecten"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Svar til {{cid}}",
|
"reply_to_cid": "Svar til {{cid}}",
|
||||||
"submit": "Send inn",
|
"submit": "Send inn",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "modererer"
|
"moderating": "modererer",
|
||||||
|
"not_moderating": "Modererer ingen fora",
|
||||||
|
"not_subscribed": "Ikke abonnert på noen fora",
|
||||||
|
"total_posts": "Totalt antall innlegg:",
|
||||||
|
"current_users": "nåværende brukere:",
|
||||||
|
"boards_tracked": "sporede fora:",
|
||||||
|
"interests": "interesser",
|
||||||
|
"random": "tilfeldig",
|
||||||
|
"international": "internasjonale",
|
||||||
|
"projects": "prosjekter"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Odpowiedz na {{cid}}",
|
"reply_to_cid": "Odpowiedz na {{cid}}",
|
||||||
"submit": "Zatwierdź",
|
"submit": "Zatwierdź",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderujesz"
|
"moderating": "moderujesz",
|
||||||
|
"not_moderating": "Nie moderujesz żadnych for",
|
||||||
|
"not_subscribed": "Nie subskrybujesz żadnych for",
|
||||||
|
"total_posts": "Łączna liczba postów:",
|
||||||
|
"current_users": "obecni użytkownicy:",
|
||||||
|
"boards_tracked": "śledzone fora:",
|
||||||
|
"interests": "zainteresowania",
|
||||||
|
"random": "losowy",
|
||||||
|
"international": "międzynarodowe",
|
||||||
|
"projects": "projekty"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Responder a {{cid}}",
|
"reply_to_cid": "Responder a {{cid}}",
|
||||||
"submit": "Enviar",
|
"submit": "Enviar",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderando"
|
"moderating": "moderando",
|
||||||
|
"not_moderating": "Não está moderando nenhum fórum",
|
||||||
|
"not_subscribed": "Não inscrito em nenhum fórum",
|
||||||
|
"total_posts": "Total de postagens:",
|
||||||
|
"current_users": "usuários atuais:",
|
||||||
|
"boards_tracked": "fóruns rastreados:",
|
||||||
|
"interests": "interesses",
|
||||||
|
"random": "aleatório",
|
||||||
|
"international": "internacionais",
|
||||||
|
"projects": "projetos"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Răspundeți la {{cid}}",
|
"reply_to_cid": "Răspundeți la {{cid}}",
|
||||||
"submit": "Trimite",
|
"submit": "Trimite",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderează"
|
"moderating": "moderează",
|
||||||
|
"not_moderating": "Nu moderezi niciun forum",
|
||||||
|
"not_subscribed": "Nu sunteți abonat la niciun forum",
|
||||||
|
"total_posts": "Total postări:",
|
||||||
|
"current_users": "utilizatori actuali:",
|
||||||
|
"boards_tracked": "forumuri urmărite:",
|
||||||
|
"interests": "interese",
|
||||||
|
"random": "aleator",
|
||||||
|
"international": "internaționale",
|
||||||
|
"projects": "proiecte"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Ответить на {{cid}}",
|
"reply_to_cid": "Ответить на {{cid}}",
|
||||||
"submit": "Отправить",
|
"submit": "Отправить",
|
||||||
"gif": "ГИФ",
|
"gif": "ГИФ",
|
||||||
"moderating": "модерируете"
|
"moderating": "модерируете",
|
||||||
|
"not_moderating": "Вы не модерируете ни один форум",
|
||||||
|
"not_subscribed": "Вы не подписаны ни на один форум",
|
||||||
|
"total_posts": "Всего сообщений:",
|
||||||
|
"current_users": "текущие пользователи:",
|
||||||
|
"boards_tracked": "отслеживаемые форумы:",
|
||||||
|
"interests": "интересы",
|
||||||
|
"random": "случайный",
|
||||||
|
"international": "международные",
|
||||||
|
"projects": "проекты"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Përgjigju në {{cid}}",
|
"reply_to_cid": "Përgjigju në {{cid}}",
|
||||||
"submit": "Dorëzo",
|
"submit": "Dorëzo",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderimi"
|
"moderating": "moderimi",
|
||||||
|
"not_moderating": "Nuk jeni duke moderuar ndonjë forum",
|
||||||
|
"not_subscribed": "Nuk jeni abonuar në ndonjë forum",
|
||||||
|
"total_posts": "Postime totale:",
|
||||||
|
"current_users": "përdoruesit aktualë:",
|
||||||
|
"boards_tracked": "forume të gjurmueshme:",
|
||||||
|
"interests": "interesat",
|
||||||
|
"random": "i rastësishëm",
|
||||||
|
"international": "ndërkombëtare",
|
||||||
|
"projects": "projekte"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Svara på {{cid}}",
|
"reply_to_cid": "Svara på {{cid}}",
|
||||||
"submit": "Skicka in",
|
"submit": "Skicka in",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "modererar"
|
"moderating": "modererar",
|
||||||
|
"not_moderating": "Modererar inga forum",
|
||||||
|
"not_subscribed": "Inte prenumererar på några forum",
|
||||||
|
"total_posts": "Totalt antal inlägg:",
|
||||||
|
"current_users": "aktuella användare:",
|
||||||
|
"boards_tracked": "spårade forum:",
|
||||||
|
"interests": "intressen",
|
||||||
|
"random": "slumpmässig",
|
||||||
|
"international": "internationella",
|
||||||
|
"projects": "projekt"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "{{cid}}కి స్పందించండి",
|
"reply_to_cid": "{{cid}}కి స్పందించండి",
|
||||||
"submit": "సమర్పించు",
|
"submit": "సమర్పించు",
|
||||||
"gif": "జీఐఎఫ్",
|
"gif": "జీఐఎఫ్",
|
||||||
"moderating": "మాడరేటింగ్"
|
"moderating": "మాడరేటింగ్",
|
||||||
|
"not_moderating": "మీరు ఏ సందేశ బోర్డులను మాడరేట్ చేయడం లేదు",
|
||||||
|
"not_subscribed": "ఏ సందేశ బోర్డులకు సబ్స్క్రైబ్ చేయలేదు",
|
||||||
|
"total_posts": "మొత్తం పోస్ట్లు:",
|
||||||
|
"current_users": "ప్రస్తుత వాడుకరులు:",
|
||||||
|
"boards_tracked": "ట్రాక్ చేయబడిన బోర్డులు:",
|
||||||
|
"interests": "ఆసక్తులు",
|
||||||
|
"random": "యాదృచ్ఛిక",
|
||||||
|
"international": "అంతర్జాతీయ",
|
||||||
|
"projects": "ప్రాజెక్టులు"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "ตอบกลับ {{cid}}",
|
"reply_to_cid": "ตอบกลับ {{cid}}",
|
||||||
"submit": "ส่ง",
|
"submit": "ส่ง",
|
||||||
"gif": "จีไอเอฟ",
|
"gif": "จีไอเอฟ",
|
||||||
"moderating": "กำลังดูแล"
|
"moderating": "กำลังดูแล",
|
||||||
|
"not_moderating": "ไม่ได้ดูแลกระดานข่าวใด ๆ",
|
||||||
|
"not_subscribed": "ไม่ได้สมัครสมาชิกกระดานข่าวใด ๆ",
|
||||||
|
"total_posts": "โพสต์ทั้งหมด:",
|
||||||
|
"current_users": "ผู้ใช้งานปัจจุบัน:",
|
||||||
|
"boards_tracked": "บอร์ดที่ติดตาม:",
|
||||||
|
"interests": "ความสนใจ",
|
||||||
|
"random": "สุ่ม",
|
||||||
|
"international": "นานาชาติ",
|
||||||
|
"projects": "โครงการ"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "{{cid}}’ye yanıt ver",
|
"reply_to_cid": "{{cid}}’ye yanıt ver",
|
||||||
"submit": "Gönder",
|
"submit": "Gönder",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "moderatörlük yapıyorsun"
|
"moderating": "moderatörlük yapıyorsun",
|
||||||
|
"not_moderating": "Hiçbir forumu moderatörlük yapmıyorsun",
|
||||||
|
"not_subscribed": "Hiçbir foruma abone değilsiniz",
|
||||||
|
"total_posts": "Toplam Gönderi:",
|
||||||
|
"current_users": "mevcut kullanıcılar:",
|
||||||
|
"boards_tracked": "takip edilen panolar:",
|
||||||
|
"interests": "ilgi alanları",
|
||||||
|
"random": "rastgele",
|
||||||
|
"international": "uluslararası",
|
||||||
|
"projects": "projeler"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Відповісти на {{cid}}",
|
"reply_to_cid": "Відповісти на {{cid}}",
|
||||||
"submit": "Надіслати",
|
"submit": "Надіслати",
|
||||||
"gif": "ГІФ",
|
"gif": "ГІФ",
|
||||||
"moderating": "модеруєте"
|
"moderating": "модеруєте",
|
||||||
|
"not_moderating": "Ви не модеруєте жодного форуму",
|
||||||
|
"not_subscribed": "Ви не підписані на жоден форум",
|
||||||
|
"total_posts": "Всього повідомлень:",
|
||||||
|
"current_users": "поточні користувачі:",
|
||||||
|
"boards_tracked": "відстежувані форуми:",
|
||||||
|
"interests": "інтереси",
|
||||||
|
"random": "випадковий",
|
||||||
|
"international": "міжнародні",
|
||||||
|
"projects": "проекти"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "{{cid}} کا جواب دیں",
|
"reply_to_cid": "{{cid}} کا جواب دیں",
|
||||||
"submit": "جمع کرائیں",
|
"submit": "جمع کرائیں",
|
||||||
"gif": "جی آئی ایف",
|
"gif": "جی آئی ایف",
|
||||||
"moderating": "منتظم کر رہے ہیں"
|
"moderating": "منتظم کر رہے ہیں",
|
||||||
|
"not_moderating": "آپ کسی پیغام بورڈ کا انتظام نہیں کر رہے",
|
||||||
|
"not_subscribed": "آپ کسی پیغام بورڈ کی سبسکرپشن نہیں لے رہے",
|
||||||
|
"total_posts": "کل پوسٹس:",
|
||||||
|
"current_users": "موجودہ صارفین:",
|
||||||
|
"boards_tracked": "ٹریک کیے گئے بورڈز:",
|
||||||
|
"interests": "دلچسپیاں",
|
||||||
|
"random": "بے ترتیب",
|
||||||
|
"international": "بین الاقوامی",
|
||||||
|
"projects": "منصوبے"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "Trả lời {{cid}}",
|
"reply_to_cid": "Trả lời {{cid}}",
|
||||||
"submit": "Gửi",
|
"submit": "Gửi",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "đang điều hành"
|
"moderating": "đang điều hành",
|
||||||
|
"not_moderating": "Không điều hành diễn đàn nào",
|
||||||
|
"not_subscribed": "Không đăng ký bất kỳ diễn đàn nào",
|
||||||
|
"total_posts": "Tổng số bài viết:",
|
||||||
|
"current_users": "người dùng hiện tại:",
|
||||||
|
"boards_tracked": "bảng được theo dõi:",
|
||||||
|
"interests": "sở thích",
|
||||||
|
"random": "ngẫu nhiên",
|
||||||
|
"international": "quốc tế",
|
||||||
|
"projects": "dự án"
|
||||||
}
|
}
|
||||||
@@ -63,5 +63,14 @@
|
|||||||
"reply_to_cid": "回复{{cid}}",
|
"reply_to_cid": "回复{{cid}}",
|
||||||
"submit": "提交",
|
"submit": "提交",
|
||||||
"gif": "GIF",
|
"gif": "GIF",
|
||||||
"moderating": "正在管理"
|
"moderating": "正在管理",
|
||||||
|
"not_moderating": "你没有管理任何论坛",
|
||||||
|
"not_subscribed": "你没有订阅任何论坛",
|
||||||
|
"total_posts": "总帖数:",
|
||||||
|
"current_users": "当前用户:",
|
||||||
|
"boards_tracked": "跟踪的板块:",
|
||||||
|
"interests": "兴趣",
|
||||||
|
"random": "随机",
|
||||||
|
"international": "国际的",
|
||||||
|
"projects": "项目"
|
||||||
}
|
}
|
||||||
+17
-4
@@ -1,11 +1,12 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom';
|
import { Outlet, Route, Routes, useLocation, useParams } from 'react-router-dom';
|
||||||
import { isHomeView } from './lib/utils/view-utils';
|
import { isHomeView, isNotFoundView } from './lib/utils/view-utils';
|
||||||
import useTheme from './hooks/use-theme';
|
import useTheme from './hooks/use-theme';
|
||||||
import styles from './app.module.css';
|
import styles from './app.module.css';
|
||||||
import Board from './views/board';
|
import Board from './views/board';
|
||||||
import Catalog from './views/catalog';
|
import Catalog from './views/catalog';
|
||||||
import Home from './views/home';
|
import Home from './views/home';
|
||||||
|
import NotFound from './views/not-found';
|
||||||
import PendingPost from './views/pending-post';
|
import PendingPost from './views/pending-post';
|
||||||
import PostPage from './views/post-page';
|
import PostPage from './views/post-page';
|
||||||
import Settings from './views/settings';
|
import Settings from './views/settings';
|
||||||
@@ -17,9 +18,17 @@ import SubplebbitStats from './components/subplebbit-stats';
|
|||||||
import PostForm from './components/post-form';
|
import PostForm from './components/post-form';
|
||||||
|
|
||||||
const BoardLayout = () => {
|
const BoardLayout = () => {
|
||||||
const { subplebbitAddress } = useParams();
|
const { accountCommentIndex, commentCid, subplebbitAddress } = useParams();
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
|
||||||
|
const isValidAccountCommentIndex = !accountCommentIndex || (!isNaN(parseInt(accountCommentIndex)) && parseInt(accountCommentIndex) >= 0);
|
||||||
|
const isValidCommentCid = !commentCid || /^Qm[a-zA-Z0-9]{44}$/.test(commentCid);
|
||||||
|
const isValidSubplebbitAddress = !subplebbitAddress || subplebbitAddress.includes('.') || /^12D3K[a-zA-Z0-9]{44}$/.test(subplebbitAddress);
|
||||||
|
|
||||||
|
if (!isValidAccountCommentIndex || !isValidCommentCid || !isValidSubplebbitAddress) {
|
||||||
|
return <NotFound />;
|
||||||
|
}
|
||||||
|
|
||||||
// force rerender of post form when navigating between pages
|
// force rerender of post form when navigating between pages
|
||||||
const key = `${subplebbitAddress}-${location.pathname}`;
|
const key = `${subplebbitAddress}-${location.pathname}`;
|
||||||
|
|
||||||
@@ -38,14 +47,16 @@ const BoardLayout = () => {
|
|||||||
|
|
||||||
const App = () => {
|
const App = () => {
|
||||||
const location = useLocation();
|
const location = useLocation();
|
||||||
|
const params = useParams();
|
||||||
const isInHomeView = isHomeView(location.pathname);
|
const isInHomeView = isHomeView(location.pathname);
|
||||||
|
const isInNotFoundPage = isNotFoundView(location.pathname, params);
|
||||||
const [theme] = useTheme();
|
const [theme] = useTheme();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
document.body.classList.forEach((className) => document.body.classList.remove(className));
|
document.body.classList.forEach((className) => document.body.classList.remove(className));
|
||||||
const classToAdd = isInHomeView ? 'yotsuba' : theme;
|
const classToAdd = isInHomeView || isInNotFoundPage ? 'yotsuba' : theme;
|
||||||
document.body.classList.add(classToAdd);
|
document.body.classList.add(classToAdd);
|
||||||
}, [theme, isInHomeView]);
|
}, [theme, isInHomeView, isInNotFoundPage]);
|
||||||
|
|
||||||
const globalLayout = (
|
const globalLayout = (
|
||||||
<>
|
<>
|
||||||
@@ -71,6 +82,8 @@ const App = () => {
|
|||||||
<Route path='/profile/:accountCommentIndex' element={<PendingPost />} />
|
<Route path='/profile/:accountCommentIndex' element={<PendingPost />} />
|
||||||
</Route>
|
</Route>
|
||||||
<Route path='/settings' element={<Settings />} />
|
<Route path='/settings' element={<Settings />} />
|
||||||
|
|
||||||
|
<Route path='*' element={<NotFound />} />
|
||||||
</Route>
|
</Route>
|
||||||
</Routes>
|
</Routes>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -8,7 +8,8 @@ const totalBanners = 57;
|
|||||||
const ImageBanner = () => {
|
const ImageBanner = () => {
|
||||||
const [imagePath] = useState(() => {
|
const [imagePath] = useState(() => {
|
||||||
const randomBannerIndex = Math.floor(Math.random() * totalBanners) + 1;
|
const randomBannerIndex = Math.floor(Math.random() * totalBanners) + 1;
|
||||||
return `assets/banners/banner-${randomBannerIndex}.jpg`;
|
const cacheBuster = new Date().getTime();
|
||||||
|
return `assets/banners/banner-${randomBannerIndex}.jpg?cacheBuster=${cacheBuster}`;
|
||||||
});
|
});
|
||||||
|
|
||||||
return <img src={imagePath} alt='' />;
|
return <img src={imagePath} alt='' />;
|
||||||
|
|||||||
@@ -96,9 +96,7 @@ const Challenge = ({ challenge, closeModal }: ChallengeProps) => {
|
|||||||
/>
|
/>
|
||||||
<div className={styles.challengeMediaWrapper}>
|
<div className={styles.challengeMediaWrapper}>
|
||||||
{isTextChallenge && <div className={styles.challengeMedia}>{challenges[currentChallengeIndex]?.challenge}</div>}
|
{isTextChallenge && <div className={styles.challengeMedia}>{challenges[currentChallengeIndex]?.challenge}</div>}
|
||||||
{isImageChallenge && (
|
{isImageChallenge && <img alt='' className={styles.challengeMedia} src={`data:image/png;base64,${challenges[currentChallengeIndex]?.challenge}`} />}
|
||||||
<img alt={t('loading')} className={styles.challengeMedia} src={`data:image/png;base64,${challenges[currentChallengeIndex]?.challenge}`} />
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.challengeFooter}>
|
<div className={styles.challengeFooter}>
|
||||||
|
|||||||
@@ -191,6 +191,10 @@
|
|||||||
color: var(--post-mobile-abbr-text-color);
|
color: var(--post-mobile-abbr-text-color);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.stateString {
|
||||||
|
color: var(--post-mobile-abbr-text-color);
|
||||||
|
}
|
||||||
|
|
||||||
.postDesktop .summary .expandButtonWrapper {
|
.postDesktop .summary .expandButtonWrapper {
|
||||||
position: absolute;
|
position: absolute;
|
||||||
top: 8px;
|
top: 8px;
|
||||||
|
|||||||
@@ -61,6 +61,11 @@ const PostDesktop = ({ openReplyModal, post, roles, showAllReplies }: PostProps)
|
|||||||
const account = useAccount();
|
const account = useAccount();
|
||||||
const accountShortAddress = account?.author?.shortAddress;
|
const accountShortAddress = account?.author?.shortAddress;
|
||||||
|
|
||||||
|
const stateString = useStateString(post);
|
||||||
|
const loadingString = stateString && (
|
||||||
|
<div className={`${styles.stateString} ${styles.ellipsis}`}>{stateString !== 'Failed' ? <LoadingEllipsis string={stateString} /> : stateString}</div>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.postDesktop}>
|
<div className={styles.postDesktop}>
|
||||||
<div className={styles.hrWrapper}>
|
<div className={styles.hrWrapper}>
|
||||||
@@ -154,9 +159,11 @@ const PostDesktop = ({ openReplyModal, post, roles, showAllReplies }: PostProps)
|
|||||||
<img src='assets/icons/closed.gif' alt='' className={styles.closedIcon} title={t('closed')} />
|
<img src='assets/icons/closed.gif' alt='' className={styles.closedIcon} title={t('closed')} />
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
{!isInPostPage && (
|
||||||
<span className={styles.replyButton}>
|
<span className={styles.replyButton}>
|
||||||
[<Link to={`/p/${subplebbitAddress}/${isDescription ? 'description' : isRules ? 'rules' : `c/${postCid}`}`}>{t('reply')}</Link>]
|
[<Link to={`/p/${subplebbitAddress}/${isDescription ? 'description' : isRules ? 'rules' : `c/${postCid}`}`}>{t('reply')}</Link>]
|
||||||
</span>
|
</span>
|
||||||
|
)}
|
||||||
</span>
|
</span>
|
||||||
<span className={styles.postMenuBtnWrapper}>
|
<span className={styles.postMenuBtnWrapper}>
|
||||||
<span
|
<span
|
||||||
@@ -179,9 +186,15 @@ const PostDesktop = ({ openReplyModal, post, roles, showAllReplies }: PostProps)
|
|||||||
<Trans i18nKey={'comment_too_long'} shouldUnescape={true} components={{ 1: <Link to={`/p/${subplebbitAddress}/c/${cid}`} /> }} />
|
<Trans i18nKey={'comment_too_long'} shouldUnescape={true} components={{ 1: <Link to={`/p/${subplebbitAddress}/c/${cid}`} /> }} />
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
{!cid && state === 'pending' && (
|
||||||
|
<>
|
||||||
|
<br />
|
||||||
|
{loadingString}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</blockquote>
|
</blockquote>
|
||||||
)}
|
)}
|
||||||
{(replies.length > 5 || (pinned && replies.length > 0)) && !isInPostPage && (
|
{!isDescription && !isRules && (replies.length > 5 || (pinned && replies.length > 0)) && !isInPostPage && (
|
||||||
<span className={styles.summary}>
|
<span className={styles.summary}>
|
||||||
<span className={styles.expandButtonWrapper}>
|
<span className={styles.expandButtonWrapper}>
|
||||||
<span className={styles.expandButton} />
|
<span className={styles.expandButton} />
|
||||||
@@ -199,6 +212,8 @@ const PostDesktop = ({ openReplyModal, post, roles, showAllReplies }: PostProps)
|
|||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
{!(pinned && !isInPostPage) &&
|
{!(pinned && !isInPostPage) &&
|
||||||
|
!isDescription &&
|
||||||
|
!isRules &&
|
||||||
replies &&
|
replies &&
|
||||||
(showAllReplies ? replies : replies.slice(-5)).map((reply, index) => (
|
(showAllReplies ? replies : replies.slice(-5)).map((reply, index) => (
|
||||||
<div key={index} className={styles.replyContainer}>
|
<div key={index} className={styles.replyContainer}>
|
||||||
@@ -373,6 +388,11 @@ const PostMobile = ({ openReplyModal, post, roles, showAllReplies }: PostProps)
|
|||||||
const account = useAccount();
|
const account = useAccount();
|
||||||
const accountShortAddress = account?.author?.shortAddress;
|
const accountShortAddress = account?.author?.shortAddress;
|
||||||
|
|
||||||
|
const stateString = useStateString(post);
|
||||||
|
const loadingString = stateString && (
|
||||||
|
<div className={`${styles.stateString} ${styles.ellipsis}`}>{stateString !== 'Failed' ? <LoadingEllipsis string={stateString} /> : stateString}</div>
|
||||||
|
);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.postMobile}>
|
<div className={styles.postMobile}>
|
||||||
<div className={styles.hrWrapper}>
|
<div className={styles.hrWrapper}>
|
||||||
@@ -446,6 +466,12 @@ const PostMobile = ({ openReplyModal, post, roles, showAllReplies }: PostProps)
|
|||||||
<Trans i18nKey={'comment_too_long'} shouldUnescape={true} components={{ 1: <Link to={`/p/${subplebbitAddress}/c/${cid}`} /> }} />
|
<Trans i18nKey={'comment_too_long'} shouldUnescape={true} components={{ 1: <Link to={`/p/${subplebbitAddress}/c/${cid}`} /> }} />
|
||||||
</span>
|
</span>
|
||||||
)}
|
)}
|
||||||
|
{!cid && state === 'pending' && (
|
||||||
|
<>
|
||||||
|
<br />
|
||||||
|
{loadingString}
|
||||||
|
</>
|
||||||
|
)}
|
||||||
</blockquote>
|
</blockquote>
|
||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
@@ -462,6 +488,8 @@ const PostMobile = ({ openReplyModal, post, roles, showAllReplies }: PostProps)
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
{!(pinned && !isInPostPage) &&
|
{!(pinned && !isInPostPage) &&
|
||||||
|
!isDescription &&
|
||||||
|
!isRules &&
|
||||||
replies &&
|
replies &&
|
||||||
(showAllReplies ? replies : replies.slice(-5)).map((reply, index) => (
|
(showAllReplies ? replies : replies.slice(-5)).map((reply, index) => (
|
||||||
<div key={reply.cid} className={styles.replyContainer}>
|
<div key={reply.cid} className={styles.replyContainer}>
|
||||||
|
|||||||
@@ -1,8 +1,10 @@
|
|||||||
|
import i18next from 'i18next';
|
||||||
|
|
||||||
export const getFormattedDate = (commentTimestamp: number) => {
|
export const getFormattedDate = (commentTimestamp: number) => {
|
||||||
if (commentTimestamp === undefined || isNaN(commentTimestamp)) {
|
if (commentTimestamp === undefined || isNaN(commentTimestamp)) {
|
||||||
return '';
|
return '';
|
||||||
}
|
}
|
||||||
const locale = Intl.DateTimeFormat().resolvedOptions().locale;
|
const locale = i18next.language || 'en';
|
||||||
const string = new Intl.DateTimeFormat(locale, {
|
const string = new Intl.DateTimeFormat(locale, {
|
||||||
hour12: false,
|
hour12: false,
|
||||||
year: '2-digit',
|
year: '2-digit',
|
||||||
|
|||||||
@@ -34,3 +34,14 @@ export const isCatalogView = (pathname: string, params: ParamsType): boolean =>
|
|||||||
export const isPendingPostView = (pathname: string, params: ParamsType): boolean => {
|
export const isPendingPostView = (pathname: string, params: ParamsType): boolean => {
|
||||||
return pathname === `/profile/${params.accountCommentIndex}`;
|
return pathname === `/profile/${params.accountCommentIndex}`;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const isNotFoundView = (pathname: string, params: ParamsType): boolean => {
|
||||||
|
return (
|
||||||
|
!isHomeView(pathname) &&
|
||||||
|
!isDescriptionView(pathname, params) &&
|
||||||
|
!isRulesView(pathname, params) &&
|
||||||
|
!isPostPageView(pathname, params) &&
|
||||||
|
!isCatalogView(pathname, params) &&
|
||||||
|
!isPendingPostView(pathname, params)
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|||||||
@@ -32,6 +32,7 @@
|
|||||||
.boxBar, .infoboxBar {
|
.boxBar, .infoboxBar {
|
||||||
padding-left: 0.5em;
|
padding-left: 0.5em;
|
||||||
line-height: 2em;
|
line-height: 2em;
|
||||||
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
|
|
||||||
.infoboxBar {
|
.infoboxBar {
|
||||||
@@ -253,6 +254,7 @@
|
|||||||
.stats .stat {
|
.stats .stat {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
width: 33%;
|
width: 33%;
|
||||||
|
text-transform: capitalize;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (max-width: 640px) {
|
@media (max-width: 640px) {
|
||||||
|
|||||||
+25
-18
@@ -76,12 +76,13 @@ const InfoBox = () => {
|
|||||||
const Board = ({ isOffline, subplebbit }: { isOffline: boolean; subplebbit: Subplebbit }) => {
|
const Board = ({ isOffline, subplebbit }: { isOffline: boolean; subplebbit: Subplebbit }) => {
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
const { address, title, tags } = subplebbit;
|
const { address, title, tags } = subplebbit;
|
||||||
const isSubNsfw = tags.includes('porn') || tags.includes('gore') || tags.includes('violence') || tags.includes('vulgar');
|
const nsfwTags = ['adult', 'gore'];
|
||||||
|
const nsfwTag = tags.find((tag: string) => nsfwTags.includes(tag));
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.subplebbit} key={address}>
|
<div className={styles.subplebbit} key={address}>
|
||||||
<Link to={`/p/${address}`}>{title || address}</Link>
|
<Link to={`/p/${address}`}>{title || address}</Link>
|
||||||
{isSubNsfw && <span className={styles.nsfw}> ({t('nsfw')})</span>}
|
{nsfwTag && <span className={styles.nsfw}> ({t(nsfwTag)})</span>}
|
||||||
{isOffline && <span className={styles.offlineIcon} />}
|
{isOffline && <span className={styles.offlineIcon} />}
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -104,7 +105,7 @@ const Boards = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subplebbits
|
|||||||
|
|
||||||
const isSubOffline = (address: string) => {
|
const isSubOffline = (address: string) => {
|
||||||
const subplebbit = subplebbits && subplebbits.find((sub: Subplebbit) => sub?.address === address);
|
const subplebbit = subplebbits && subplebbits.find((sub: Subplebbit) => sub?.address === address);
|
||||||
const isOffline = subplebbit?.updatedAt && subplebbit.updatedAt < Date.now() / 1000 - 60 * 30;
|
const isOffline = subplebbit?.updatedAt && subplebbit.updatedAt < Date.now() / 1000 - 60 * 60;
|
||||||
return isOffline;
|
return isOffline;
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -122,7 +123,7 @@ const Boards = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subplebbits
|
|||||||
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<h3>Projects</h3>
|
<h3>{t('projects')}</h3>
|
||||||
<div className={styles.list}>
|
<div className={styles.list}>
|
||||||
{projectsSubs.map((sub) => (
|
{projectsSubs.map((sub) => (
|
||||||
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
||||||
@@ -130,7 +131,7 @@ const Boards = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subplebbits
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.column}>
|
<div className={styles.column}>
|
||||||
<h3>Interests</h3>
|
<h3>{t('interests')}</h3>
|
||||||
<div className={styles.list}>
|
<div className={styles.list}>
|
||||||
{interestsSubs.map((sub) => (
|
{interestsSubs.map((sub) => (
|
||||||
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
||||||
@@ -138,13 +139,13 @@ const Boards = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subplebbits
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.column}>
|
<div className={styles.column}>
|
||||||
<h3>Random</h3>
|
<h3>{t('random')}</h3>
|
||||||
<div className={styles.list}>
|
<div className={styles.list}>
|
||||||
{randomSubs.map((sub) => (
|
{randomSubs.map((sub) => (
|
||||||
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
<h3>International</h3>
|
<h3>{t('international')}</h3>
|
||||||
<div className={styles.list}>
|
<div className={styles.list}>
|
||||||
{internationalSubs.map((sub) => (
|
{internationalSubs.map((sub) => (
|
||||||
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
<Board key={sub.address} subplebbit={sub} isOffline={sub.address && isSubOffline(sub.address)} />
|
||||||
@@ -157,10 +158,10 @@ const Boards = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subplebbits
|
|||||||
{subscriptions.length > 0
|
{subscriptions.length > 0
|
||||||
? subscriptions.map((address: string, index: number) => (
|
? subscriptions.map((address: string, index: number) => (
|
||||||
<div className={styles.subplebbit} key={index}>
|
<div className={styles.subplebbit} key={index}>
|
||||||
<Link to={`/p/${address}`}>p/{address}</Link>
|
<Link to={`/p/${address}`}>{address}</Link>
|
||||||
</div>
|
</div>
|
||||||
))
|
))
|
||||||
: 'Not subscribed to any board.'}
|
: t('not_subscribed')}
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.list}>
|
<div className={styles.list}>
|
||||||
<h3>{t('moderating')}</h3>
|
<h3>{t('moderating')}</h3>
|
||||||
@@ -170,7 +171,7 @@ const Boards = ({ multisub, subplebbits }: { multisub: Subplebbit[]; subplebbits
|
|||||||
<Link to={`/p/${address}`}>p/{address}</Link>
|
<Link to={`/p/${address}`}>p/{address}</Link>
|
||||||
</div>
|
</div>
|
||||||
))
|
))
|
||||||
: 'Not moderating any board.'}
|
: t('not_moderating')}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -366,13 +367,13 @@ const Stats = ({ multisub, subplebbitAddresses }: { multisub: any; subplebbitAdd
|
|||||||
{enoughStats ? (
|
{enoughStats ? (
|
||||||
<>
|
<>
|
||||||
<div className={styles.stat}>
|
<div className={styles.stat}>
|
||||||
<b>Total Posts:</b> {totalPosts}
|
<b>{t('total_posts')}</b> {totalPosts}
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.stat}>
|
<div className={styles.stat}>
|
||||||
<b>Current Users:</b> {currentUsers}
|
<b>{t('current_users')}</b> {currentUsers}
|
||||||
</div>
|
</div>
|
||||||
<div className={styles.stat}>
|
<div className={styles.stat}>
|
||||||
<b>Boards Tracked:</b> {boardsTracked}
|
<b>{t('boards_tracked')}</b> {boardsTracked}
|
||||||
</div>
|
</div>
|
||||||
</>
|
</>
|
||||||
) : (
|
) : (
|
||||||
@@ -471,6 +472,16 @@ const Footer = () => {
|
|||||||
);
|
);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
export const HomeLogo = () => {
|
||||||
|
return (
|
||||||
|
<Link to='/'>
|
||||||
|
<div className={styles.logo}>
|
||||||
|
<img alt='' src='/assets/logo/logo-transparent.png' />
|
||||||
|
</div>
|
||||||
|
</Link>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
const Home = () => {
|
const Home = () => {
|
||||||
const defaultSubplebbits = useDefaultSubplebbits();
|
const defaultSubplebbits = useDefaultSubplebbits();
|
||||||
const subplebbitAddresses = useDefaultSubplebbitAddresses();
|
const subplebbitAddresses = useDefaultSubplebbitAddresses();
|
||||||
@@ -478,11 +489,7 @@ const Home = () => {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className={styles.content}>
|
<div className={styles.content}>
|
||||||
<Link to='/'>
|
<HomeLogo />
|
||||||
<div className={styles.logo}>
|
|
||||||
<img alt='' src='/assets/logo/logo-transparent.png' />
|
|
||||||
</div>
|
|
||||||
</Link>
|
|
||||||
<SearchBar />
|
<SearchBar />
|
||||||
<InfoBox />
|
<InfoBox />
|
||||||
<Boards multisub={defaultSubplebbits} subplebbits={subplebbits} />
|
<Boards multisub={defaultSubplebbits} subplebbits={subplebbits} />
|
||||||
|
|||||||
@@ -1 +1 @@
|
|||||||
export { default } from './home';
|
export { HomeLogo, default } from './home';
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
export { default } from './not-found';
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
.content {
|
||||||
|
margin: auto;
|
||||||
|
text-align: left;
|
||||||
|
width: 57.69em;
|
||||||
|
min-width: 750px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.boxOuter {
|
||||||
|
background: #fff;
|
||||||
|
border: 1px solid;
|
||||||
|
zoom: 100%;
|
||||||
|
margin-bottom: .5em;
|
||||||
|
padding-bottom: .5em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.boxBar {
|
||||||
|
background: #fca;
|
||||||
|
color: #800;
|
||||||
|
position: relative;
|
||||||
|
zoom: 100%;
|
||||||
|
padding-left: .5em;
|
||||||
|
line-height: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.boxBar h2 {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 131%;
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
.boxContent {
|
||||||
|
margin-top: 10px;
|
||||||
|
color: #000;
|
||||||
|
line-height: 1.5em;
|
||||||
|
font-size: 93%;
|
||||||
|
padding: .5em;
|
||||||
|
padding-top: .25em;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.boxContent img {
|
||||||
|
display: block;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backToBoard {
|
||||||
|
text-align: center;
|
||||||
|
font-size: 12pt !important;
|
||||||
|
margin: 0 20px 10px 20px;
|
||||||
|
color: #800;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.backToBoard a {
|
||||||
|
color: blue;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 640px) {
|
||||||
|
.content {
|
||||||
|
min-width: 0;
|
||||||
|
width: auto;
|
||||||
|
padding: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.boxContent img {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
import { useState } from 'react';
|
||||||
|
import { Link, useParams } from 'react-router-dom';
|
||||||
|
import { HomeLogo } from '../home';
|
||||||
|
import styles from './not-found.module.css';
|
||||||
|
import Plebbit from '@plebbit/plebbit-js/dist/browser/index.js';
|
||||||
|
|
||||||
|
const totalNotFoundImages = 2;
|
||||||
|
|
||||||
|
const NotFoundImage = () => {
|
||||||
|
const [imagePath] = useState(() => {
|
||||||
|
const randomBannerIndex = Math.floor(Math.random() * totalNotFoundImages) + 1;
|
||||||
|
const cacheBuster = new Date().getTime();
|
||||||
|
return `assets/not-found/not-found-${randomBannerIndex}.jpg?cacheBuster=${cacheBuster}`;
|
||||||
|
});
|
||||||
|
|
||||||
|
return <img src={imagePath} alt='' />;
|
||||||
|
};
|
||||||
|
|
||||||
|
const NotFound = () => {
|
||||||
|
const { subplebbitAddress } = useParams();
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div className={styles.content}>
|
||||||
|
<HomeLogo />
|
||||||
|
<div className={styles.boxOuter}>
|
||||||
|
<div className={styles.boxInner}>
|
||||||
|
<div className={styles.boxBar}>
|
||||||
|
<h2>404 Not Found</h2>
|
||||||
|
</div>
|
||||||
|
<div className={styles.boxContent}>
|
||||||
|
<NotFoundImage />
|
||||||
|
{subplebbitAddress && (
|
||||||
|
<>
|
||||||
|
<br />
|
||||||
|
<div className={styles.backToBoard}>
|
||||||
|
[<Link to={`/p/${subplebbitAddress}`}>Back to p/{Plebbit.getShortAddress(subplebbitAddress)}</Link>]
|
||||||
|
</div>
|
||||||
|
</>
|
||||||
|
)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
export default NotFound;
|
||||||
@@ -1,16 +0,0 @@
|
|||||||
.stateString {
|
|
||||||
white-space: nowrap;
|
|
||||||
overflow: hidden;
|
|
||||||
text-overflow: ellipsis;
|
|
||||||
width: calc(100vw - 28px);
|
|
||||||
width: 100vw;
|
|
||||||
margin-top: 10px;
|
|
||||||
margin-left: 40px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (max-width: 640px) {
|
|
||||||
.stateString {
|
|
||||||
margin-top: 0px;
|
|
||||||
margin-left: 10px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,17 +1,13 @@
|
|||||||
import { useEffect } from 'react';
|
import { useEffect } from 'react';
|
||||||
import { useNavigate, useParams } from 'react-router-dom';
|
import { useNavigate, useParams } from 'react-router-dom';
|
||||||
import { useAccountComment } from '@plebbit/plebbit-react-hooks';
|
import { useAccountComment } from '@plebbit/plebbit-react-hooks';
|
||||||
import styles from './pending-post.module.css';
|
|
||||||
import Post from '../../components/post';
|
import Post from '../../components/post';
|
||||||
import useStateString from '../../hooks/use-state-string';
|
|
||||||
import LoadingEllipsis from '../../components/loading-ellipsis';
|
|
||||||
|
|
||||||
const PendingPost = () => {
|
const PendingPost = () => {
|
||||||
const { accountCommentIndex } = useParams<{ accountCommentIndex?: string }>();
|
const { accountCommentIndex } = useParams<{ accountCommentIndex?: string }>();
|
||||||
const commentIndex = accountCommentIndex ? parseInt(accountCommentIndex) : undefined;
|
const commentIndex = accountCommentIndex ? parseInt(accountCommentIndex) : undefined;
|
||||||
const post = useAccountComment({ commentIndex });
|
const post = useAccountComment({ commentIndex });
|
||||||
const navigate = useNavigate();
|
const navigate = useNavigate();
|
||||||
const stateString = useStateString(post);
|
|
||||||
|
|
||||||
useEffect(() => window.scrollTo(0, 0), []);
|
useEffect(() => window.scrollTo(0, 0), []);
|
||||||
|
|
||||||
@@ -21,16 +17,7 @@ const PendingPost = () => {
|
|||||||
}
|
}
|
||||||
}, [post, navigate]);
|
}, [post, navigate]);
|
||||||
|
|
||||||
const loadingString = stateString && (
|
return <Post post={post} />;
|
||||||
<div className={`${styles.stateString} ${styles.ellipsis}`}>{stateString !== 'Failed' ? <LoadingEllipsis string={stateString} /> : stateString}</div>
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
|
||||||
<div className={styles.container}>
|
|
||||||
<Post post={post} />
|
|
||||||
{loadingString}
|
|
||||||
</div>
|
|
||||||
);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export default PendingPost;
|
export default PendingPost;
|
||||||
|
|||||||
Reference in New Issue
Block a user