mirror of
https://github.com/bitsocialnet/5chan.git
synced 2026-08-03 07:41:04 +02:00
fix(media): clarify failed external image embeds
This commit is contained in:
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "هل سيتحكم 5chan Pass في إدارة الدليل؟",
|
||||
"pass_answer_governance": "لا. التوجه الحالي هو أن حاملي 5chan Pass يمكنهم المشاركة في التصويت على الدليل، لكن آليات الحوكمة النهائية يجب أن تتضمن مواءمة BSO-holder وضمانات بدلاً من منح حاملي pass وحدهم السيطرة النهائية."
|
||||
"pass_answer_governance": "لا. التوجه الحالي هو أن حاملي 5chan Pass يمكنهم المشاركة في التصويت على الدليل، لكن آليات الحوكمة النهائية يجب أن تتضمن مواءمة BSO-holder وضمانات بدلاً من منح حاملي pass وحدهم السيطرة النهائية.",
|
||||
"media_failed_to_load": "فشل تحميل الصورة الخارجية",
|
||||
"media_failed_to_load_hint": "قد يحجب ذلك الموقع شبكتك؛ قد يساعد VPN",
|
||||
"media_failed_to_load_source": "{{host}} وليس 5chan",
|
||||
"media_failed_to_load_source_unknown": "مستضافة خارج 5chan",
|
||||
"media_failed_to_load_open_source": "افتح الملف الأصلي",
|
||||
"media_failed_to_load_inline": "فشلت الصورة الخارجية من {{host}}. جرّب VPN.",
|
||||
"media_failed_to_load_inline_unknown": "فشلت الصورة الخارجية. جرّب VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass কি ডিরেক্টরি শাসন নিয়ন্ত্রণ করবে?",
|
||||
"pass_answer_governance": "না। বর্তমান দিকনির্দেশনা হলো 5chan Pass ধারকেরা ডিরেক্টরি ভোটিংয়ে অংশ নিতে পারবেন, তবে চূড়ান্ত শাসনব্যবস্থায় শুধু pass-ধারীদের চূড়ান্ত নিয়ন্ত্রণের বদলে BSO-holder alignment এবং সুরক্ষা ব্যবস্থা থাকতে হবে।"
|
||||
"pass_answer_governance": "না। বর্তমান দিকনির্দেশনা হলো 5chan Pass ধারকেরা ডিরেক্টরি ভোটিংয়ে অংশ নিতে পারবেন, তবে চূড়ান্ত শাসনব্যবস্থায় শুধু pass-ধারীদের চূড়ান্ত নিয়ন্ত্রণের বদলে BSO-holder alignment এবং সুরক্ষা ব্যবস্থা থাকতে হবে।",
|
||||
"media_failed_to_load": "বাইরের ছবি লোড হয়নি",
|
||||
"media_failed_to_load_hint": "ওই সাইট আপনার নেটওয়ার্ক ব্লক করতে পারে; VPN সাহায্য করতে পারে",
|
||||
"media_failed_to_load_source": "{{host}}, 5chan নয়",
|
||||
"media_failed_to_load_source_unknown": "5chan-এর বাইরে হোস্ট করা",
|
||||
"media_failed_to_load_open_source": "মূল ফাইল খুলুন",
|
||||
"media_failed_to_load_inline": "{{host}} থেকে বাইরের ছবি লোড হয়নি। VPN চেষ্টা করুন।",
|
||||
"media_failed_to_load_inline_unknown": "বাইরের ছবি লোড হয়নি। VPN চেষ্টা করুন।"
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Bude 5chan Pass řídit správu adresáře?",
|
||||
"pass_answer_governance": "Ne. Současný směr je takový, že držitelé 5chan Pass se mohou účastnit hlasování o adresáři, ale konečné mechanismy správy by měly zahrnovat sladění s BSO-holder a ochranné prvky namísto toho, aby konečnou kontrolu měli pouze držitelé passu."
|
||||
"pass_answer_governance": "Ne. Současný směr je takový, že držitelé 5chan Pass se mohou účastnit hlasování o adresáři, ale konečné mechanismy správy by měly zahrnovat sladění s BSO-holder a ochranné prvky namísto toho, aby konečnou kontrolu měli pouze držitelé passu.",
|
||||
"media_failed_to_load": "Externí obrázek se nenačetl",
|
||||
"media_failed_to_load_hint": "Ten web může blokovat vaši síť; VPN může pomoci",
|
||||
"media_failed_to_load_source": "{{host}}, ne 5chan",
|
||||
"media_failed_to_load_source_unknown": "Hostováno mimo 5chan",
|
||||
"media_failed_to_load_open_source": "Otevřít původní soubor",
|
||||
"media_failed_to_load_inline": "Externí obrázek z {{host}} selhal. Zkuste VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Externí obrázek selhal. Zkuste VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Vil 5chan Pass kontrollere katalogets styring?",
|
||||
"pass_answer_governance": "Nej. Den nuværende retning er, at indehavere af 5chan Pass kan deltage i afstemning om kataloget, men de endelige styringsmekanismer bør omfatte BSO-holder-tilpasning og sikkerhedsforanstaltninger i stedet for, at pass-indehavere alene har den endelige kontrol."
|
||||
"pass_answer_governance": "Nej. Den nuværende retning er, at indehavere af 5chan Pass kan deltage i afstemning om kataloget, men de endelige styringsmekanismer bør omfatte BSO-holder-tilpasning og sikkerhedsforanstaltninger i stedet for, at pass-indehavere alene har den endelige kontrol.",
|
||||
"media_failed_to_load": "Eksternt billede kunne ikke indlæses",
|
||||
"media_failed_to_load_hint": "Det websted kan blokere dit netværk; VPN kan hjælpe",
|
||||
"media_failed_to_load_source": "{{host}}, ikke 5chan",
|
||||
"media_failed_to_load_source_unknown": "Hostet uden for 5chan",
|
||||
"media_failed_to_load_open_source": "Åbn originalfil",
|
||||
"media_failed_to_load_inline": "Eksternt billede fra {{host}} fejlede. Prøv VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Eksternt billede fejlede. Prøv VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Wird 5chan Pass die Verzeichnis-Governance steuern?",
|
||||
"pass_answer_governance": "Nein. Die aktuelle Richtung ist, dass Inhaber von 5chan Pass an Verzeichnisabstimmungen teilnehmen können, aber die endgültigen Governance-Mechanismen sollten eine Ausrichtung auf BSO-holder und Schutzmechanismen enthalten, statt den Inhabern des Passes allein die endgültige Kontrolle zu geben."
|
||||
"pass_answer_governance": "Nein. Die aktuelle Richtung ist, dass Inhaber von 5chan Pass an Verzeichnisabstimmungen teilnehmen können, aber die endgültigen Governance-Mechanismen sollten eine Ausrichtung auf BSO-holder und Schutzmechanismen enthalten, statt den Inhabern des Passes allein die endgültige Kontrolle zu geben.",
|
||||
"media_failed_to_load": "Externes Bild fehlgeschlagen",
|
||||
"media_failed_to_load_hint": "Diese Website blockiert evtl. dein Netzwerk; VPN kann helfen",
|
||||
"media_failed_to_load_source": "{{host}}, nicht 5chan",
|
||||
"media_failed_to_load_source_unknown": "Nicht auf 5chan gehostet",
|
||||
"media_failed_to_load_open_source": "Originaldatei öffnen",
|
||||
"media_failed_to_load_inline": "Externes Bild von {{host}} fehlgeschlagen. VPN versuchen.",
|
||||
"media_failed_to_load_inline_unknown": "Externes Bild fehlgeschlagen. VPN versuchen."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Θα ελέγχει το 5chan Pass τη διακυβέρνηση του καταλόγου;",
|
||||
"pass_answer_governance": "Όχι. Η τρέχουσα κατεύθυνση είναι ότι οι κάτοχοι του 5chan Pass μπορούν να συμμετέχουν στην ψηφοφορία καταλόγου, αλλά οι τελικοί μηχανισμοί διακυβέρνησης θα πρέπει να περιλαμβάνουν ευθυγράμμιση με τους BSO-holder και δικλίδες ασφαλείας αντί για τελικό έλεγχο μόνο από κατόχους pass."
|
||||
"pass_answer_governance": "Όχι. Η τρέχουσα κατεύθυνση είναι ότι οι κάτοχοι του 5chan Pass μπορούν να συμμετέχουν στην ψηφοφορία καταλόγου, αλλά οι τελικοί μηχανισμοί διακυβέρνησης θα πρέπει να περιλαμβάνουν ευθυγράμμιση με τους BSO-holder και δικλίδες ασφαλείας αντί για τελικό έλεγχο μόνο από κατόχους pass.",
|
||||
"media_failed_to_load": "Η εξωτερική εικόνα δεν φορτώθηκε",
|
||||
"media_failed_to_load_hint": "Αυτός ο ιστότοπος μπορεί να μπλοκάρει το δίκτυό σας· ένα VPN μπορεί να βοηθήσει",
|
||||
"media_failed_to_load_source": "{{host}}, όχι 5chan",
|
||||
"media_failed_to_load_source_unknown": "Φιλοξενείται εκτός 5chan",
|
||||
"media_failed_to_load_open_source": "Άνοιγμα αρχικού αρχείου",
|
||||
"media_failed_to_load_inline": "Η εξωτερική εικόνα από {{host}} απέτυχε. Δοκιμάστε VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Η εξωτερική εικόνα απέτυχε. Δοκιμάστε VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Will 5chan Pass control directory governance?",
|
||||
"pass_answer_governance": "No. The current direction is that 5chan Pass holders can participate in directory voting, but final governance mechanics should include BSO-holder alignment and safeguards instead of pass-only final control."
|
||||
"pass_answer_governance": "No. The current direction is that 5chan Pass holders can participate in directory voting, but final governance mechanics should include BSO-holder alignment and safeguards instead of pass-only final control.",
|
||||
"media_failed_to_load": "External image failed",
|
||||
"media_failed_to_load_hint": "That site may block your network; VPN may help",
|
||||
"media_failed_to_load_source": "{{host}} (not 5chan)",
|
||||
"media_failed_to_load_source_unknown": "External host, not 5chan",
|
||||
"media_failed_to_load_open_source": "Open original file",
|
||||
"media_failed_to_load_inline": "External image from {{host}} failed. Try VPN.",
|
||||
"media_failed_to_load_inline_unknown": "External image failed. Try VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "¿Controlará 5chan Pass la gobernanza del directorio?",
|
||||
"pass_answer_governance": "No. La dirección actual es que los titulares de 5chan Pass puedan participar en la votación del directorio, pero los mecanismos finales de gobernanza deben incluir alineación con BSO-holder y salvaguardas en lugar de un control final exclusivo de los titulares del pass."
|
||||
"pass_answer_governance": "No. La dirección actual es que los titulares de 5chan Pass puedan participar en la votación del directorio, pero los mecanismos finales de gobernanza deben incluir alineación con BSO-holder y salvaguardas en lugar de un control final exclusivo de los titulares del pass.",
|
||||
"media_failed_to_load": "Falló la imagen externa",
|
||||
"media_failed_to_load_hint": "Ese sitio puede bloquear tu red; una VPN puede ayudar",
|
||||
"media_failed_to_load_source": "{{host}}, no 5chan",
|
||||
"media_failed_to_load_source_unknown": "Host externo, no 5chan",
|
||||
"media_failed_to_load_open_source": "Abrir archivo original",
|
||||
"media_failed_to_load_inline": "Falló la imagen externa de {{host}}. Prueba una VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Falló la imagen externa. Prueba una VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "آیا 5chan Pass کنترل حاکمیت دایرکتوری را در دست خواهد گرفت؟",
|
||||
"pass_answer_governance": "خیر. جهتگیری فعلی این است که دارندگان 5chan Pass بتوانند در رأیگیری دایرکتوری شرکت کنند، اما سازوکارهای نهایی حاکمیتی باید بهجای کنترل نهایی فقط توسط دارندگان pass، شامل همراستایی با BSO-holder و سازوکارهای حفاظتی باشند."
|
||||
"pass_answer_governance": "خیر. جهتگیری فعلی این است که دارندگان 5chan Pass بتوانند در رأیگیری دایرکتوری شرکت کنند، اما سازوکارهای نهایی حاکمیتی باید بهجای کنترل نهایی فقط توسط دارندگان pass، شامل همراستایی با BSO-holder و سازوکارهای حفاظتی باشند.",
|
||||
"media_failed_to_load": "تصویر خارجی بارگیری نشد",
|
||||
"media_failed_to_load_hint": "آن سایت ممکن است شبکهٔ شما را مسدود کند؛ VPN ممکن است کمک کند",
|
||||
"media_failed_to_load_source": "{{host}}، نه 5chan",
|
||||
"media_failed_to_load_source_unknown": "میزبان خارجی، نه 5chan",
|
||||
"media_failed_to_load_open_source": "باز کردن فایل اصلی",
|
||||
"media_failed_to_load_inline": "تصویر خارجی از {{host}} بارگیری نشد. VPN را امتحان کنید.",
|
||||
"media_failed_to_load_inline_unknown": "تصویر خارجی بارگیری نشد. VPN را امتحان کنید."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Hallitseeko 5chan Pass hakemiston hallintoa?",
|
||||
"pass_answer_governance": "Ei. Nykyinen suunta on, että 5chan Passin haltijat voivat osallistua hakemistoäänestykseen, mutta lopullisten hallintamekanismien tulisi sisältää BSO-holder-linjaus ja suojatoimet sen sijaan, että lopullinen valta olisi vain passin haltijoilla."
|
||||
"pass_answer_governance": "Ei. Nykyinen suunta on, että 5chan Passin haltijat voivat osallistua hakemistoäänestykseen, mutta lopullisten hallintamekanismien tulisi sisältää BSO-holder-linjaus ja suojatoimet sen sijaan, että lopullinen valta olisi vain passin haltijoilla.",
|
||||
"media_failed_to_load": "Ulkoinen kuva ei latautunut",
|
||||
"media_failed_to_load_hint": "Sivusto voi estää verkkosi; VPN voi auttaa",
|
||||
"media_failed_to_load_source": "{{host}}, ei 5chan",
|
||||
"media_failed_to_load_source_unknown": "Ulkoinen host, ei 5chan",
|
||||
"media_failed_to_load_open_source": "Avaa alkuperäinen tiedosto",
|
||||
"media_failed_to_load_inline": "Ulkoinen kuva sivustolta {{host}} epäonnistui. Kokeile VPN:ää.",
|
||||
"media_failed_to_load_inline_unknown": "Ulkoinen kuva epäonnistui. Kokeile VPN:ää."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Kokontrolin ba ng 5chan Pass ang pamamahala ng directory?",
|
||||
"pass_answer_governance": "Hindi. Ang kasalukuyang direksyon ay ang mga may hawak ng 5chan Pass ay maaaring lumahok sa pagboto sa directory, pero ang pinal na mekanika ng governance ay dapat may kasamang BSO-holder alignment at mga safeguard sa halip na pass-only na pinal na kontrol."
|
||||
"pass_answer_governance": "Hindi. Ang kasalukuyang direksyon ay ang mga may hawak ng 5chan Pass ay maaaring lumahok sa pagboto sa directory, pero ang pinal na mekanika ng governance ay dapat may kasamang BSO-holder alignment at mga safeguard sa halip na pass-only na pinal na kontrol.",
|
||||
"media_failed_to_load": "Nabigong i-load ang panlabas na larawan",
|
||||
"media_failed_to_load_hint": "Maaaring i-block ng site na iyon ang network mo; maaaring makatulong ang VPN",
|
||||
"media_failed_to_load_source": "{{host}}, hindi 5chan",
|
||||
"media_failed_to_load_source_unknown": "Panlabas na host, hindi 5chan",
|
||||
"media_failed_to_load_open_source": "Buksan ang orihinal na file",
|
||||
"media_failed_to_load_inline": "Nabigo ang panlabas na larawan mula sa {{host}}. Subukan ang VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Nabigo ang panlabas na larawan. Subukan ang VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass contrôlera-t-il la gouvernance de l'annuaire ?",
|
||||
"pass_answer_governance": "Non. L’orientation actuelle est que les détenteurs de 5chan Pass peuvent participer au vote du répertoire, mais les mécanismes finaux de gouvernance devraient inclure un alignement avec les BSO-holder et des garde-fous au lieu d’un contrôle final réservé aux seuls détenteurs du pass."
|
||||
"pass_answer_governance": "Non. L’orientation actuelle est que les détenteurs de 5chan Pass peuvent participer au vote du répertoire, mais les mécanismes finaux de gouvernance devraient inclure un alignement avec les BSO-holder et des garde-fous au lieu d’un contrôle final réservé aux seuls détenteurs du pass.",
|
||||
"media_failed_to_load": "L'image externe a échoué",
|
||||
"media_failed_to_load_hint": "Ce site peut bloquer votre réseau; un VPN peut aider",
|
||||
"media_failed_to_load_source": "{{host}}, pas 5chan",
|
||||
"media_failed_to_load_source_unknown": "Hôte externe, pas 5chan",
|
||||
"media_failed_to_load_open_source": "Ouvrir le fichier original",
|
||||
"media_failed_to_load_inline": "L'image externe de {{host}} a échoué. Essayez un VPN.",
|
||||
"media_failed_to_load_inline_unknown": "L'image externe a échoué. Essayez un VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "האם 5chan Pass ישלוט בניהול הספרייה?",
|
||||
"pass_answer_governance": "לא. הכיוון הנוכחי הוא שמחזיקי 5chan Pass יוכלו להשתתף בהצבעה על הספרייה, אבל מנגנוני הממשל הסופיים צריכים לכלול יישור עם BSO-holder ואמצעי הגנה במקום שליטה סופית של מחזיקי pass בלבד."
|
||||
"pass_answer_governance": "לא. הכיוון הנוכחי הוא שמחזיקי 5chan Pass יוכלו להשתתף בהצבעה על הספרייה, אבל מנגנוני הממשל הסופיים צריכים לכלול יישור עם BSO-holder ואמצעי הגנה במקום שליטה סופית של מחזיקי pass בלבד.",
|
||||
"media_failed_to_load": "התמונה החיצונית לא נטענה",
|
||||
"media_failed_to_load_hint": "האתר הזה עשוי לחסום את הרשת שלך; VPN עשוי לעזור",
|
||||
"media_failed_to_load_source": "{{host}}, לא 5chan",
|
||||
"media_failed_to_load_source_unknown": "מארח חיצוני, לא 5chan",
|
||||
"media_failed_to_load_open_source": "פתח את הקובץ המקורי",
|
||||
"media_failed_to_load_inline": "התמונה החיצונית מ-{{host}} נכשלה. נסה VPN.",
|
||||
"media_failed_to_load_inline_unknown": "התמונה החיצונית נכשלה. נסה VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "क्या 5chan Pass डायरेक्टरी गवर्नेंस को नियंत्रित करेगा?",
|
||||
"pass_answer_governance": "नहीं। वर्तमान दिशा यह है कि 5chan Pass धारक directory voting में भाग ले सकें, लेकिन अंतिम governance mechanisms में केवल pass धारकों के अंतिम नियंत्रण के बजाय BSO-holder alignment और safeguards शामिल होने चाहिए।"
|
||||
"pass_answer_governance": "नहीं। वर्तमान दिशा यह है कि 5chan Pass धारक directory voting में भाग ले सकें, लेकिन अंतिम governance mechanisms में केवल pass धारकों के अंतिम नियंत्रण के बजाय BSO-holder alignment और safeguards शामिल होने चाहिए।",
|
||||
"media_failed_to_load": "बाहरी छवि लोड नहीं हुई",
|
||||
"media_failed_to_load_hint": "वह साइट आपके नेटवर्क को ब्लॉक कर सकती है; VPN मदद कर सकता है",
|
||||
"media_failed_to_load_source": "{{host}}, 5chan नहीं",
|
||||
"media_failed_to_load_source_unknown": "बाहरी होस्ट, 5chan नहीं",
|
||||
"media_failed_to_load_open_source": "मूल फ़ाइल खोलें",
|
||||
"media_failed_to_load_inline": "{{host}} से बाहरी छवि लोड नहीं हुई। VPN आज़माएँ।",
|
||||
"media_failed_to_load_inline_unknown": "बाहरी छवि लोड नहीं हुई। VPN आज़माएँ।"
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "A 5chan Pass fogja irányítani a címtár felügyeletét?",
|
||||
"pass_answer_governance": "Nem. A jelenlegi irány az, hogy az 5chan Pass tulajdonosai részt vehetnek a könyvtárszavazásban, de a végleges irányítási mechanizmusoknak BSO-holder igazodást és védőkorlátokat kell tartalmazniuk a kizárólag pass-tulajdonosi végső kontroll helyett."
|
||||
"pass_answer_governance": "Nem. A jelenlegi irány az, hogy az 5chan Pass tulajdonosai részt vehetnek a könyvtárszavazásban, de a végleges irányítási mechanizmusoknak BSO-holder igazodást és védőkorlátokat kell tartalmazniuk a kizárólag pass-tulajdonosi végső kontroll helyett.",
|
||||
"media_failed_to_load": "A külső kép nem töltődött be",
|
||||
"media_failed_to_load_hint": "Az a webhely blokkolhatja a hálózatodat; VPN segíthet",
|
||||
"media_failed_to_load_source": "{{host}}, nem 5chan",
|
||||
"media_failed_to_load_source_unknown": "Külső host, nem 5chan",
|
||||
"media_failed_to_load_open_source": "Eredeti fájl megnyitása",
|
||||
"media_failed_to_load_inline": "A külső kép innen nem töltődött be: {{host}}. Próbálj VPN-t.",
|
||||
"media_failed_to_load_inline_unknown": "A külső kép nem töltődött be. Próbálj VPN-t."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Apakah 5chan Pass akan mengendalikan tata kelola direktori?",
|
||||
"pass_answer_governance": "Tidak. Arah saat ini adalah bahwa pemegang 5chan Pass dapat berpartisipasi dalam pemungutan suara direktori, tetapi mekanisme tata kelola final harus mencakup penyelarasan BSO-holder dan perlindungan, bukan kontrol final yang hanya dipegang pemilik pass."
|
||||
"pass_answer_governance": "Tidak. Arah saat ini adalah bahwa pemegang 5chan Pass dapat berpartisipasi dalam pemungutan suara direktori, tetapi mekanisme tata kelola final harus mencakup penyelarasan BSO-holder dan perlindungan, bukan kontrol final yang hanya dipegang pemilik pass.",
|
||||
"media_failed_to_load": "Gambar eksternal gagal dimuat",
|
||||
"media_failed_to_load_hint": "Situs itu mungkin memblokir jaringan Anda; VPN dapat membantu",
|
||||
"media_failed_to_load_source": "{{host}}, bukan 5chan",
|
||||
"media_failed_to_load_source_unknown": "Host eksternal, bukan 5chan",
|
||||
"media_failed_to_load_open_source": "Buka file asli",
|
||||
"media_failed_to_load_inline": "Gambar eksternal dari {{host}} gagal. Coba VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Gambar eksternal gagal. Coba VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass controllerà la governance della directory?",
|
||||
"pass_answer_governance": "No. L'attuale direzione è che i titolari di 5chan Pass possano partecipare al voto della directory, ma i meccanismi finali di governance dovrebbero includere allineamento con i BSO-holder e salvaguardie invece di un controllo finale riservato solo ai titolari del pass."
|
||||
"pass_answer_governance": "No. L'attuale direzione è che i titolari di 5chan Pass possano partecipare al voto della directory, ma i meccanismi finali di governance dovrebbero includere allineamento con i BSO-holder e salvaguardie invece di un controllo finale riservato solo ai titolari del pass.",
|
||||
"media_failed_to_load": "Immagine esterna non caricata",
|
||||
"media_failed_to_load_hint": "Quel sito può bloccare la tua rete; una VPN può aiutare",
|
||||
"media_failed_to_load_source": "{{host}}, non 5chan",
|
||||
"media_failed_to_load_source_unknown": "Host esterno, non 5chan",
|
||||
"media_failed_to_load_open_source": "Apri file originale",
|
||||
"media_failed_to_load_inline": "Immagine esterna da {{host}} non caricata. Prova una VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Immagine esterna non caricata. Prova una VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass はディレクトリのガバナンスを管理しますか?",
|
||||
"pass_answer_governance": "いいえ。現在の方針では、5chan Pass保有者はディレクトリ投票に参加できますが、最終的なガバナンスの仕組みには、pass保有者だけの最終支配ではなく、BSO-holderとの整合性とセーフガードを含めるべきです。"
|
||||
"pass_answer_governance": "いいえ。現在の方針では、5chan Pass保有者はディレクトリ投票に参加できますが、最終的なガバナンスの仕組みには、pass保有者だけの最終支配ではなく、BSO-holderとの整合性とセーフガードを含めるべきです。",
|
||||
"media_failed_to_load": "外部画像を読み込めませんでした",
|
||||
"media_failed_to_load_hint": "そのサイトがネットワークをブロックしている場合、VPN が役立つことがあります",
|
||||
"media_failed_to_load_source": "{{host}}、5chan ではありません",
|
||||
"media_failed_to_load_source_unknown": "外部ホスト、5chan ではありません",
|
||||
"media_failed_to_load_open_source": "元のファイルを開く",
|
||||
"media_failed_to_load_inline": "{{host}} の外部画像を読み込めませんでした。VPN を試してください。",
|
||||
"media_failed_to_load_inline_unknown": "外部画像を読み込めませんでした。VPN を試してください。"
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass가 디렉터리 거버넌스를 통제하나요?",
|
||||
"pass_answer_governance": "아니요. 현재 방향은 5chan Pass 보유자가 디렉터리 투표에 참여할 수 있도록 하는 것이지만, 최종 거버넌스 메커니즘에는 pass 보유자만의 최종 통제 대신 BSO-holder 정렬과 안전장치가 포함되어야 합니다."
|
||||
"pass_answer_governance": "아니요. 현재 방향은 5chan Pass 보유자가 디렉터리 투표에 참여할 수 있도록 하는 것이지만, 최종 거버넌스 메커니즘에는 pass 보유자만의 최종 통제 대신 BSO-holder 정렬과 안전장치가 포함되어야 합니다.",
|
||||
"media_failed_to_load": "외부 이미지를 불러오지 못했습니다",
|
||||
"media_failed_to_load_hint": "해당 사이트가 네트워크를 차단할 수 있습니다. VPN이 도움이 될 수 있습니다",
|
||||
"media_failed_to_load_source": "{{host}}, 5chan 아님",
|
||||
"media_failed_to_load_source_unknown": "외부 호스트, 5chan 아님",
|
||||
"media_failed_to_load_open_source": "원본 파일 열기",
|
||||
"media_failed_to_load_inline": "{{host}}의 외부 이미지를 불러오지 못했습니다. VPN을 시도하세요.",
|
||||
"media_failed_to_load_inline_unknown": "외부 이미지를 불러오지 못했습니다. VPN을 시도하세요."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass निर्देशिका प्रशासन नियंत्रित करेल का?",
|
||||
"pass_answer_governance": "नाही. सध्याची दिशा अशी आहे की 5chan Pass धारक directory voting मध्ये सहभागी होऊ शकतात, पण अंतिम governance mechanics मध्ये pass-only final control ऐवजी BSO-holder alignment आणि safeguards समाविष्ट असले पाहिजेत."
|
||||
"pass_answer_governance": "नाही. सध्याची दिशा अशी आहे की 5chan Pass धारक directory voting मध्ये सहभागी होऊ शकतात, पण अंतिम governance mechanics मध्ये pass-only final control ऐवजी BSO-holder alignment आणि safeguards समाविष्ट असले पाहिजेत.",
|
||||
"media_failed_to_load": "बाह्य प्रतिमा लोड झाली नाही",
|
||||
"media_failed_to_load_hint": "ती साइट तुमचे नेटवर्क ब्लॉक करू शकते; VPN मदत करू शकतो",
|
||||
"media_failed_to_load_source": "{{host}}, 5chan नाही",
|
||||
"media_failed_to_load_source_unknown": "बाह्य होस्ट, 5chan नाही",
|
||||
"media_failed_to_load_open_source": "मूळ फाइल उघडा",
|
||||
"media_failed_to_load_inline": "{{host}} वरील बाह्य प्रतिमा लोड झाली नाही. VPN वापरून पाहा.",
|
||||
"media_failed_to_load_inline_unknown": "बाह्य प्रतिमा लोड झाली नाही. VPN वापरून पाहा."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Zal 5chan Pass het beheer van de directory bepalen?",
|
||||
"pass_answer_governance": "Nee. De huidige richting is dat houders van 5chan Pass kunnen deelnemen aan directory voting, maar de uiteindelijke governance-mechanismen moeten BSO-holder-afstemming en waarborgen bevatten in plaats van pass-only definitieve controle."
|
||||
"pass_answer_governance": "Nee. De huidige richting is dat houders van 5chan Pass kunnen deelnemen aan directory voting, maar de uiteindelijke governance-mechanismen moeten BSO-holder-afstemming en waarborgen bevatten in plaats van pass-only definitieve controle.",
|
||||
"media_failed_to_load": "Externe afbeelding mislukt",
|
||||
"media_failed_to_load_hint": "Die site kan je netwerk blokkeren; VPN kan helpen",
|
||||
"media_failed_to_load_source": "{{host}}, niet 5chan",
|
||||
"media_failed_to_load_source_unknown": "Externe host, niet 5chan",
|
||||
"media_failed_to_load_open_source": "Origineel bestand openen",
|
||||
"media_failed_to_load_inline": "Externe afbeelding van {{host}} mislukt. Probeer VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Externe afbeelding mislukt. Probeer VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Vil 5chan Pass styre katalogstyringen?",
|
||||
"pass_answer_governance": "Nei. Den nåværende retningen er at innehavere av 5chan Pass kan delta i katalogavstemning, men de endelige styringsmekanismene bør inkludere BSO-holder-tilpasning og sikkerhetstiltak i stedet for at passinnehavere alene har endelig kontroll."
|
||||
"pass_answer_governance": "Nei. Den nåværende retningen er at innehavere av 5chan Pass kan delta i katalogavstemning, men de endelige styringsmekanismene bør inkludere BSO-holder-tilpasning og sikkerhetstiltak i stedet for at passinnehavere alene har endelig kontroll.",
|
||||
"media_failed_to_load": "Eksternt bilde kunne ikke lastes",
|
||||
"media_failed_to_load_hint": "Det nettstedet kan blokkere nettverket ditt; VPN kan hjelpe",
|
||||
"media_failed_to_load_source": "{{host}}, ikke 5chan",
|
||||
"media_failed_to_load_source_unknown": "Ekstern host, ikke 5chan",
|
||||
"media_failed_to_load_open_source": "Åpne originalfil",
|
||||
"media_failed_to_load_inline": "Eksternt bilde fra {{host}} kunne ikke lastes. Prøv VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Eksternt bilde kunne ikke lastes. Prøv VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Czy 5chan Pass będzie kontrolować zarządzanie katalogiem?",
|
||||
"pass_answer_governance": "Nie. Obecny kierunek jest taki, że posiadacze 5chan Pass mogą uczestniczyć w głosowaniu katalogowym, ale ostateczne mechanizmy zarządzania powinny obejmować zgodność z BSO-holder i zabezpieczenia zamiast wyłącznej ostatecznej kontroli posiadaczy passa."
|
||||
"pass_answer_governance": "Nie. Obecny kierunek jest taki, że posiadacze 5chan Pass mogą uczestniczyć w głosowaniu katalogowym, ale ostateczne mechanizmy zarządzania powinny obejmować zgodność z BSO-holder i zabezpieczenia zamiast wyłącznej ostatecznej kontroli posiadaczy passa.",
|
||||
"media_failed_to_load": "Obraz zewnętrzny nie załadował się",
|
||||
"media_failed_to_load_hint": "Ta strona może blokować twoją sieć; VPN może pomóc",
|
||||
"media_failed_to_load_source": "{{host}}, nie 5chan",
|
||||
"media_failed_to_load_source_unknown": "Zewnętrzny host, nie 5chan",
|
||||
"media_failed_to_load_open_source": "Otwórz oryginalny plik",
|
||||
"media_failed_to_load_inline": "Obraz zewnętrzny z {{host}} nie załadował się. Spróbuj VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Obraz zewnętrzny nie załadował się. Spróbuj VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "O 5chan Pass controlará a governança do diretório?",
|
||||
"pass_answer_governance": "Não. A direção atual é que os detentores de 5chan Pass possam participar da votação de diretório, mas os mecanismos finais de governança devem incluir alinhamento com BSO-holder e salvaguardas em vez de controle final apenas dos detentores do pass."
|
||||
"pass_answer_governance": "Não. A direção atual é que os detentores de 5chan Pass possam participar da votação de diretório, mas os mecanismos finais de governança devem incluir alinhamento com BSO-holder e salvaguardas em vez de controle final apenas dos detentores do pass.",
|
||||
"media_failed_to_load": "Falha na imagem externa",
|
||||
"media_failed_to_load_hint": "Esse site pode bloquear sua rede; uma VPN pode ajudar",
|
||||
"media_failed_to_load_source": "{{host}}, não 5chan",
|
||||
"media_failed_to_load_source_unknown": "Host externo, não 5chan",
|
||||
"media_failed_to_load_open_source": "Abrir arquivo original",
|
||||
"media_failed_to_load_inline": "Falha na imagem externa de {{host}}. Tente uma VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Falha na imagem externa. Tente uma VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Va controla 5chan Pass guvernanța directorului?",
|
||||
"pass_answer_governance": "Nu. Direcția actuală este ca deținătorii de 5chan Pass să poată participa la votul pentru director, dar mecanismele finale de guvernanță ar trebui să includă aliniere cu BSO-holder și măsuri de protecție în locul controlului final exclusiv al deținătorilor de pass."
|
||||
"pass_answer_governance": "Nu. Direcția actuală este ca deținătorii de 5chan Pass să poată participa la votul pentru director, dar mecanismele finale de guvernanță ar trebui să includă aliniere cu BSO-holder și măsuri de protecție în locul controlului final exclusiv al deținătorilor de pass.",
|
||||
"media_failed_to_load": "Imaginea externă nu s-a încărcat",
|
||||
"media_failed_to_load_hint": "Acel site îți poate bloca rețeaua; VPN-ul poate ajuta",
|
||||
"media_failed_to_load_source": "{{host}}, nu 5chan",
|
||||
"media_failed_to_load_source_unknown": "Host extern, nu 5chan",
|
||||
"media_failed_to_load_open_source": "Deschide fișierul original",
|
||||
"media_failed_to_load_inline": "Imaginea externă de la {{host}} a eșuat. Încearcă VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Imaginea externă a eșuat. Încearcă VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Будет ли 5chan Pass контролировать управление каталогом?",
|
||||
"pass_answer_governance": "Нет. Текущее направление таково: владельцы 5chan Pass могут участвовать в голосовании по каталогам, но итоговые механизмы управления должны включать согласование с BSO-holder и защитные меры вместо окончательного контроля только со стороны владельцев pass."
|
||||
"pass_answer_governance": "Нет. Текущее направление таково: владельцы 5chan Pass могут участвовать в голосовании по каталогам, но итоговые механизмы управления должны включать согласование с BSO-holder и защитные меры вместо окончательного контроля только со стороны владельцев pass.",
|
||||
"media_failed_to_load": "Внешнее изображение не загрузилось",
|
||||
"media_failed_to_load_hint": "Этот сайт может блокировать вашу сеть; VPN может помочь",
|
||||
"media_failed_to_load_source": "{{host}}, не 5chan",
|
||||
"media_failed_to_load_source_unknown": "Внешний хост, не 5chan",
|
||||
"media_failed_to_load_open_source": "Открыть исходный файл",
|
||||
"media_failed_to_load_inline": "Внешнее изображение с {{host}} не загрузилось. Попробуйте VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Внешнее изображение не загрузилось. Попробуйте VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "A do ta kontrollojë 5chan Pass qeverisjen e drejtorisë?",
|
||||
"pass_answer_governance": "Jo. Drejtimi aktual është që mbajtësit e 5chan Pass mund të marrin pjesë në votimin e drejtorisë, por mekanizmat përfundimtarë të qeverisjes duhet të përfshijnë përputhje me BSO-holder dhe masa mbrojtëse në vend të kontrollit përfundimtar vetëm nga mbajtësit e pass-it."
|
||||
"pass_answer_governance": "Jo. Drejtimi aktual është që mbajtësit e 5chan Pass mund të marrin pjesë në votimin e drejtorisë, por mekanizmat përfundimtarë të qeverisjes duhet të përfshijnë përputhje me BSO-holder dhe masa mbrojtëse në vend të kontrollit përfundimtar vetëm nga mbajtësit e pass-it.",
|
||||
"media_failed_to_load": "Imazhi i jashtëm nuk u ngarkua",
|
||||
"media_failed_to_load_hint": "Ai sajt mund të bllokojë rrjetin tuaj; VPN mund të ndihmojë",
|
||||
"media_failed_to_load_source": "{{host}}, jo 5chan",
|
||||
"media_failed_to_load_source_unknown": "Host i jashtëm, jo 5chan",
|
||||
"media_failed_to_load_open_source": "Hap skedarin origjinal",
|
||||
"media_failed_to_load_inline": "Imazhi i jashtëm nga {{host}} dështoi. Provoni VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Imazhi i jashtëm dështoi. Provoni VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Kommer 5chan Pass att kontrollera katalogets styrning?",
|
||||
"pass_answer_governance": "Nej. Den nuvarande inriktningen är att innehavare av 5chan Pass kan delta i katalogomröstning, men de slutliga styrningsmekanismerna bör inkludera BSO-holder-anpassning och skyddsåtgärder i stället för att passinnehavare ensamma har slutlig kontroll."
|
||||
"pass_answer_governance": "Nej. Den nuvarande inriktningen är att innehavare av 5chan Pass kan delta i katalogomröstning, men de slutliga styrningsmekanismerna bör inkludera BSO-holder-anpassning och skyddsåtgärder i stället för att passinnehavare ensamma har slutlig kontroll.",
|
||||
"media_failed_to_load": "Extern bild kunde inte läsas in",
|
||||
"media_failed_to_load_hint": "Den webbplatsen kan blockera ditt nätverk; VPN kan hjälpa",
|
||||
"media_failed_to_load_source": "{{host}}, inte 5chan",
|
||||
"media_failed_to_load_source_unknown": "Extern host, inte 5chan",
|
||||
"media_failed_to_load_open_source": "Öppna originalfil",
|
||||
"media_failed_to_load_inline": "Extern bild från {{host}} kunde inte läsas in. Prova VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Extern bild kunde inte läsas in. Prova VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass డైరెక్టరీ పాలనను నియంత్రిస్తుందా?",
|
||||
"pass_answer_governance": "కాదు. ప్రస్తుత దిశ ఏమిటంటే 5chan Pass హోల్డర్లు directory voting లో పాల్గొనగలరు, కానీ తుది governance mechanics లో pass-only final control కి బదులుగా BSO-holder alignment మరియు safeguards ఉండాలి."
|
||||
"pass_answer_governance": "కాదు. ప్రస్తుత దిశ ఏమిటంటే 5chan Pass హోల్డర్లు directory voting లో పాల్గొనగలరు, కానీ తుది governance mechanics లో pass-only final control కి బదులుగా BSO-holder alignment మరియు safeguards ఉండాలి.",
|
||||
"media_failed_to_load": "బాహ్య చిత్రం లోడ్ కాలేదు",
|
||||
"media_failed_to_load_hint": "ఆ సైట్ మీ నెట్వర్క్ను బ్లాక్ చేయవచ్చు; VPN సహాయపడవచ్చు",
|
||||
"media_failed_to_load_source": "{{host}}, 5chan కాదు",
|
||||
"media_failed_to_load_source_unknown": "బాహ్య హోస్ట్, 5chan కాదు",
|
||||
"media_failed_to_load_open_source": "అసలు ఫైల్ను తెరవండి",
|
||||
"media_failed_to_load_inline": "{{host}} నుండి బాహ్య చిత్రం లోడ్ కాలేదు. VPN ప్రయత్నించండి.",
|
||||
"media_failed_to_load_inline_unknown": "బాహ్య చిత్రం లోడ్ కాలేదు. VPN ప్రయత్నించండి."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass จะควบคุมการกำกับดูแลไดเรกทอรีหรือไม่?",
|
||||
"pass_answer_governance": "ไม่ใช่ ทิศทางปัจจุบันคือผู้ถือ 5chan Pass สามารถมีส่วนร่วมในการโหวตไดเรกทอรีได้ แต่กลไกการกำกับดูแลขั้นสุดท้ายควรมีทั้งความสอดคล้องกับ BSO-holder และมาตรการป้องกัน แทนที่จะให้ผู้ถือ pass เป็นผู้ควบคุมขั้นสุดท้ายเพียงฝ่ายเดียว"
|
||||
"pass_answer_governance": "ไม่ใช่ ทิศทางปัจจุบันคือผู้ถือ 5chan Pass สามารถมีส่วนร่วมในการโหวตไดเรกทอรีได้ แต่กลไกการกำกับดูแลขั้นสุดท้ายควรมีทั้งความสอดคล้องกับ BSO-holder และมาตรการป้องกัน แทนที่จะให้ผู้ถือ pass เป็นผู้ควบคุมขั้นสุดท้ายเพียงฝ่ายเดียว",
|
||||
"media_failed_to_load": "โหลดรูปภาพภายนอกไม่สำเร็จ",
|
||||
"media_failed_to_load_hint": "ไซต์นั้นอาจบล็อกเครือข่ายของคุณ; VPN อาจช่วยได้",
|
||||
"media_failed_to_load_source": "{{host}} ไม่ใช่ 5chan",
|
||||
"media_failed_to_load_source_unknown": "โฮสต์ภายนอก ไม่ใช่ 5chan",
|
||||
"media_failed_to_load_open_source": "เปิดไฟล์ต้นฉบับ",
|
||||
"media_failed_to_load_inline": "โหลดรูปภาพภายนอกจาก {{host}} ไม่สำเร็จ ลอง VPN",
|
||||
"media_failed_to_load_inline_unknown": "โหลดรูปภาพภายนอกไม่สำเร็จ ลอง VPN"
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass dizin yönetişimini kontrol edecek mi?",
|
||||
"pass_answer_governance": "Hayır. Mevcut yön, 5chan Pass sahiplerinin dizin oylamasına katılabilmesi yönünde, ancak nihai yönetişim mekanizmaları, yalnızca pass sahiplerine nihai kontrol vermek yerine BSO-holder uyumu ve güvenceler içermelidir."
|
||||
"pass_answer_governance": "Hayır. Mevcut yön, 5chan Pass sahiplerinin dizin oylamasına katılabilmesi yönünde, ancak nihai yönetişim mekanizmaları, yalnızca pass sahiplerine nihai kontrol vermek yerine BSO-holder uyumu ve güvenceler içermelidir.",
|
||||
"media_failed_to_load": "Harici görsel yüklenemedi",
|
||||
"media_failed_to_load_hint": "Bu site ağınızı engelleyebilir; VPN yardımcı olabilir",
|
||||
"media_failed_to_load_source": "{{host}}, 5chan değil",
|
||||
"media_failed_to_load_source_unknown": "Harici host, 5chan değil",
|
||||
"media_failed_to_load_open_source": "Orijinal dosyayı aç",
|
||||
"media_failed_to_load_inline": "{{host}} harici görseli yüklenemedi. VPN deneyin.",
|
||||
"media_failed_to_load_inline_unknown": "Harici görsel yüklenemedi. VPN deneyin."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "Чи контролюватиме 5chan Pass управління каталогом?",
|
||||
"pass_answer_governance": "Ні. Поточний напрям полягає в тому, що власники 5chan Pass можуть брати участь у голосуванні за каталоги, але фінальні механіки врядування мають включати узгодження з BSO-holder і запобіжники замість остаточного контролю лише з боку власників pass."
|
||||
"pass_answer_governance": "Ні. Поточний напрям полягає в тому, що власники 5chan Pass можуть брати участь у голосуванні за каталоги, але фінальні механіки врядування мають включати узгодження з BSO-holder і запобіжники замість остаточного контролю лише з боку власників pass.",
|
||||
"media_failed_to_load": "Зовнішнє зображення не завантажилося",
|
||||
"media_failed_to_load_hint": "Цей сайт може блокувати вашу мережу; VPN може допомогти",
|
||||
"media_failed_to_load_source": "{{host}}, не 5chan",
|
||||
"media_failed_to_load_source_unknown": "Зовнішній хост, не 5chan",
|
||||
"media_failed_to_load_open_source": "Відкрити оригінальний файл",
|
||||
"media_failed_to_load_inline": "Зовнішнє зображення з {{host}} не завантажилося. Спробуйте VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Зовнішнє зображення не завантажилося. Спробуйте VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "کیا 5chan Pass ڈائریکٹری گورننس کو کنٹرول کرے گا؟",
|
||||
"pass_answer_governance": "نہیں۔ موجودہ سمت یہ ہے کہ 5chan Pass رکھنے والے directory voting میں حصہ لے سکیں، لیکن حتمی governance mechanics میں صرف pass holders کے final control کے بجائے BSO-holder alignment اور safeguards شامل ہونے چاہئیں۔"
|
||||
"pass_answer_governance": "نہیں۔ موجودہ سمت یہ ہے کہ 5chan Pass رکھنے والے directory voting میں حصہ لے سکیں، لیکن حتمی governance mechanics میں صرف pass holders کے final control کے بجائے BSO-holder alignment اور safeguards شامل ہونے چاہئیں۔",
|
||||
"media_failed_to_load": "بیرونی تصویر لوڈ نہیں ہوئی",
|
||||
"media_failed_to_load_hint": "وہ سائٹ آپ کے نیٹ ورک کو بلاک کر سکتی ہے؛ VPN مدد کر سکتا ہے",
|
||||
"media_failed_to_load_source": "{{host}}، 5chan نہیں",
|
||||
"media_failed_to_load_source_unknown": "بیرونی ہوسٹ، 5chan نہیں",
|
||||
"media_failed_to_load_open_source": "اصل فائل کھولیں",
|
||||
"media_failed_to_load_inline": "{{host}} سے بیرونی تصویر لوڈ نہیں ہوئی۔ VPN آزمائیں۔",
|
||||
"media_failed_to_load_inline_unknown": "بیرونی تصویر لوڈ نہیں ہوئی۔ VPN آزمائیں۔"
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass có kiểm soát việc quản trị thư mục không?",
|
||||
"pass_answer_governance": "Không. Định hướng hiện tại là người nắm giữ 5chan Pass có thể tham gia bỏ phiếu thư mục, nhưng cơ chế quản trị cuối cùng nên bao gồm sự đồng bộ với BSO-holder và các biện pháp bảo vệ thay vì quyền kiểm soát cuối cùng chỉ dành cho người giữ pass."
|
||||
"pass_answer_governance": "Không. Định hướng hiện tại là người nắm giữ 5chan Pass có thể tham gia bỏ phiếu thư mục, nhưng cơ chế quản trị cuối cùng nên bao gồm sự đồng bộ với BSO-holder và các biện pháp bảo vệ thay vì quyền kiểm soát cuối cùng chỉ dành cho người giữ pass.",
|
||||
"media_failed_to_load": "Không tải được ảnh bên ngoài",
|
||||
"media_failed_to_load_hint": "Trang đó có thể chặn mạng của bạn; VPN có thể giúp",
|
||||
"media_failed_to_load_source": "{{host}}, không phải 5chan",
|
||||
"media_failed_to_load_source_unknown": "Máy chủ ngoài, không phải 5chan",
|
||||
"media_failed_to_load_open_source": "Mở tệp gốc",
|
||||
"media_failed_to_load_inline": "Không tải được ảnh bên ngoài từ {{host}}. Thử VPN.",
|
||||
"media_failed_to_load_inline_unknown": "Không tải được ảnh bên ngoài. Thử VPN."
|
||||
}
|
||||
|
||||
@@ -379,5 +379,12 @@
|
||||
"p2p_stats_updated": "Updated",
|
||||
"p2p_stats_starting": "P2P stats appear after the P2P client starts.",
|
||||
"pass_question_governance": "5chan Pass 会控制目录治理吗?",
|
||||
"pass_answer_governance": "不是。当前方向是 5chan Pass 持有者可以参与目录投票,但最终治理机制应包含与 BSO-holder 的一致性和保障措施,而不是仅由 pass 持有者拥有最终控制权。"
|
||||
"pass_answer_governance": "不是。当前方向是 5chan Pass 持有者可以参与目录投票,但最终治理机制应包含与 BSO-holder 的一致性和保障措施,而不是仅由 pass 持有者拥有最终控制权。",
|
||||
"media_failed_to_load": "外部图片加载失败",
|
||||
"media_failed_to_load_hint": "该网站可能会屏蔽你的网络;VPN 可能有帮助",
|
||||
"media_failed_to_load_source": "{{host}},不是 5chan",
|
||||
"media_failed_to_load_source_unknown": "外部主机,不是 5chan",
|
||||
"media_failed_to_load_open_source": "打开原始文件",
|
||||
"media_failed_to_load_inline": "来自 {{host}} 的外部图片加载失败。试试 VPN。",
|
||||
"media_failed_to_load_inline_unknown": "外部图片加载失败。试试 VPN。"
|
||||
}
|
||||
|
||||
@@ -185,7 +185,7 @@ const renderContent = async (comment: TestComment) => {
|
||||
});
|
||||
};
|
||||
|
||||
const renderContentWithProps = async (props: { comment: TestComment; prependContent?: React.ReactNode }) => {
|
||||
const renderContentWithProps = async (props: { appendContent?: React.ReactNode; comment: TestComment; prependContent?: React.ReactNode }) => {
|
||||
await act(async () => {
|
||||
root.render(createElement(CommentContent, props as any));
|
||||
});
|
||||
@@ -268,6 +268,26 @@ describe('CommentContent', () => {
|
||||
expect(blockquote?.querySelectorAll('br')).toHaveLength(1);
|
||||
});
|
||||
|
||||
it('renders appended content after markdown with a two-line break separator', async () => {
|
||||
await renderContentWithProps({
|
||||
appendContent: createElement('span', { 'data-testid': 'append' }, 'media failed'),
|
||||
comment: {
|
||||
cid: 'post-1',
|
||||
content: 'body',
|
||||
postCid: 'post-1',
|
||||
},
|
||||
});
|
||||
|
||||
const blockquote = container.querySelector('blockquote');
|
||||
const markdown = container.querySelector('[data-testid="markdown"]');
|
||||
const append = container.querySelector('[data-testid="append"]');
|
||||
|
||||
expect(markdown?.textContent).toBe('body');
|
||||
expect(append?.textContent).toBe('media failed');
|
||||
expect(blockquote?.lastChild).toBe(append);
|
||||
expect(blockquote?.querySelectorAll('br')).toHaveLength(2);
|
||||
});
|
||||
|
||||
it('truncates long comments outside the post view and expands them on demand', async () => {
|
||||
const longComment = 'x'.repeat(1105);
|
||||
|
||||
|
||||
@@ -70,7 +70,7 @@ const getFailedCommentError = (comment: Comment | undefined): unknown => {
|
||||
return Array.isArray(comment.errors) ? comment.errors.find(Boolean) : undefined;
|
||||
};
|
||||
|
||||
const CommentContent = ({ comment: post, prependContent }: { comment: Comment; prependContent?: ReactNode }) => {
|
||||
const CommentContent = ({ appendContent, comment: post, prependContent }: { appendContent?: ReactNode; comment: Comment; prependContent?: ReactNode }) => {
|
||||
const { t } = useTranslation();
|
||||
const params = useParams();
|
||||
const location = useLocation();
|
||||
@@ -306,6 +306,13 @@ const CommentContent = ({ comment: post, prependContent }: { comment: Comment; p
|
||||
{loadingString}
|
||||
</>
|
||||
)}
|
||||
{appendContent && (
|
||||
<>
|
||||
<br />
|
||||
<br />
|
||||
{appendContent}
|
||||
</>
|
||||
)}
|
||||
</blockquote>
|
||||
);
|
||||
};
|
||||
|
||||
@@ -20,7 +20,7 @@ const testState = vi.hoisted(() => ({
|
||||
|
||||
vi.mock('react-i18next', () => ({
|
||||
useTranslation: () => ({
|
||||
t: (key: string) => key,
|
||||
t: (key: string, options?: { host?: string }) => (options?.host ? `${key}:${options.host}` : key),
|
||||
}),
|
||||
}));
|
||||
|
||||
@@ -151,24 +151,73 @@ describe('CommentMedia', () => {
|
||||
expect(container.querySelector('[data-expanded-media="true"]')).toBeTruthy();
|
||||
});
|
||||
|
||||
it('falls back to the deleted-file placeholder when an image fails to load', async () => {
|
||||
it('shows a media-load warning when an image fails to load', async () => {
|
||||
testState.hostname = 'files.catbox.moe';
|
||||
const onMediaLoadFailureChange = vi.fn();
|
||||
|
||||
await renderMedia({
|
||||
commentMediaInfo: {
|
||||
type: 'image',
|
||||
url: 'https://cdn.example.com/missing.jpg',
|
||||
url: 'https://files.catbox.moe/missing.jpg',
|
||||
},
|
||||
onMediaLoadFailureChange,
|
||||
setShowThumbnail: setShowThumbnailMock,
|
||||
showThumbnail: true,
|
||||
});
|
||||
|
||||
const image = container.querySelector('img[src="https://cdn.example.com/missing.jpg"]');
|
||||
const image = container.querySelector('img[src="https://files.catbox.moe/missing.jpg"]');
|
||||
expect(image).toBeTruthy();
|
||||
|
||||
await act(async () => {
|
||||
image?.dispatchEvent(new Event('error', { bubbles: true }));
|
||||
});
|
||||
|
||||
expect(container.querySelector('img[alt="File deleted"]')).toBeTruthy();
|
||||
expect(container.querySelector('img[src="assets/filedeleted-res.gif"]')).toBeTruthy();
|
||||
expect(onMediaLoadFailureChange).toHaveBeenCalledWith('https://files.catbox.moe/missing.jpg');
|
||||
const status = container.querySelector('[role="status"]');
|
||||
expect(status?.textContent).toContain('media_failed_to_load_inline:files.catbox.moe');
|
||||
expect(status?.textContent).toContain('media_failed_to_load_open_source');
|
||||
expect(status?.textContent).not.toContain('media_failed_to_load_hint');
|
||||
expect(status?.getAttribute('aria-label')).toBe(
|
||||
'media_failed_to_load. media_failed_to_load_source:files.catbox.moe. media_failed_to_load_hint. media_failed_to_load_open_source.',
|
||||
);
|
||||
expect(status?.getAttribute('title')).toBe(
|
||||
'media_failed_to_load. media_failed_to_load_source:files.catbox.moe. media_failed_to_load_hint. media_failed_to_load_open_source.',
|
||||
);
|
||||
expect(container.querySelector<HTMLAnchorElement>('a[href="https://files.catbox.moe/missing.jpg"]')?.textContent).toBe('media_failed_to_load_open_source');
|
||||
});
|
||||
|
||||
it('moves media-load guidance below failed image thumbnails on mobile', async () => {
|
||||
testState.hostname = 'files.catbox.moe';
|
||||
testState.isMobile = true;
|
||||
const onMediaLoadFailureChange = vi.fn();
|
||||
|
||||
await renderMedia({
|
||||
commentMediaInfo: {
|
||||
type: 'image',
|
||||
url: 'https://files.catbox.moe/missing.jpg',
|
||||
},
|
||||
onMediaLoadFailureChange,
|
||||
setShowThumbnail: setShowThumbnailMock,
|
||||
showThumbnail: true,
|
||||
});
|
||||
|
||||
const image = container.querySelector('img[src="https://files.catbox.moe/missing.jpg"]');
|
||||
expect(image).toBeTruthy();
|
||||
|
||||
await act(async () => {
|
||||
image?.dispatchEvent(new Event('error', { bubbles: true }));
|
||||
});
|
||||
|
||||
const status = container.querySelector('[role="status"]');
|
||||
expect(status?.textContent).toBe('');
|
||||
expect(status?.getAttribute('aria-label')).toBe(
|
||||
'media_failed_to_load. media_failed_to_load_source:files.catbox.moe. media_failed_to_load_hint. media_failed_to_load_open_source.',
|
||||
);
|
||||
expect(onMediaLoadFailureChange).toHaveBeenCalledWith('https://files.catbox.moe/missing.jpg');
|
||||
expect(container.textContent).not.toContain('media_failed_to_load_inline:files.catbox.moe');
|
||||
expect(container.textContent).not.toContain('media_failed_to_load_open_source');
|
||||
expect(container.textContent).toContain('image');
|
||||
});
|
||||
|
||||
it('renders GIF thumbnail states and toggles the media view from the placeholder', async () => {
|
||||
|
||||
@@ -169,6 +169,69 @@
|
||||
image-rendering: pixelated;
|
||||
}
|
||||
|
||||
.mediaLoadFailure {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
gap: 4px;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
min-width: 0;
|
||||
padding: 8px;
|
||||
box-sizing: border-box;
|
||||
line-height: 1.2;
|
||||
font-size: 10pt;
|
||||
text-align: center;
|
||||
overflow-wrap: anywhere;
|
||||
}
|
||||
|
||||
.mediaLoadFailureSource {
|
||||
max-width: 30ch;
|
||||
font-size: 8pt;
|
||||
}
|
||||
|
||||
.mediaLoadFailureStatus {
|
||||
position: absolute;
|
||||
width: 1px;
|
||||
height: 1px;
|
||||
padding: 0;
|
||||
margin: -1px;
|
||||
overflow: hidden;
|
||||
clip: rect(0 0 0 0);
|
||||
white-space: nowrap;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.mediaLoadFailureLink {
|
||||
color: var(--post-link-text-color);
|
||||
text-decoration: var(--post-link-text-decoration);
|
||||
font-size: 9pt;
|
||||
}
|
||||
|
||||
.mediaLoadFailureLink:hover {
|
||||
color: var(--post-link-text-color-hover);
|
||||
text-decoration: var(--post-link-text-decoration-hover);
|
||||
}
|
||||
|
||||
.mediaLoadFailureInfo {
|
||||
display: block;
|
||||
clear: both;
|
||||
color: var(--post-mobile-file-info-text-color);
|
||||
font-size: 9pt;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.mediaLoadFailureInfo a {
|
||||
color: var(--post-link-text-color);
|
||||
text-decoration: var(--post-link-text-decoration);
|
||||
}
|
||||
|
||||
.mediaLoadFailureInfo a:hover {
|
||||
color: var(--post-link-text-color-hover);
|
||||
text-decoration: var(--post-link-text-decoration-hover);
|
||||
}
|
||||
|
||||
@media (min-width: 640px) {
|
||||
.thumbnail,
|
||||
.content {
|
||||
|
||||
@@ -25,10 +25,68 @@ interface MediaProps {
|
||||
spoiler?: boolean;
|
||||
showThumbnail?: boolean;
|
||||
setShowThumbnail: (showThumbnail: boolean) => void;
|
||||
onMediaLoadFailureChange?: (url: string | undefined) => void;
|
||||
}
|
||||
|
||||
type GifFrameState = ReturnType<typeof useFetchGifFirstFrame>;
|
||||
|
||||
const getMediaLoadFailureLabels = (url: string | undefined, t: ReturnType<typeof useTranslation>['t']) => {
|
||||
const hostname = url ? getHostname(url) : undefined;
|
||||
const label = t('media_failed_to_load');
|
||||
const source = hostname ? t('media_failed_to_load_source', { host: hostname }) : t('media_failed_to_load_source_unknown');
|
||||
const hint = t('media_failed_to_load_hint');
|
||||
const openSourceLabel = t('media_failed_to_load_open_source');
|
||||
const inline = hostname ? t('media_failed_to_load_inline', { host: hostname }) : t('media_failed_to_load_inline_unknown');
|
||||
const statusLabel = url ? `${label}. ${source}. ${hint}. ${openSourceLabel}.` : `${label}. ${source}. ${hint}.`;
|
||||
|
||||
return { inline, openSourceLabel, statusLabel };
|
||||
};
|
||||
|
||||
const MediaLoadFailure = ({ compact = false, url }: { compact?: boolean; url?: string }) => {
|
||||
const { t } = useTranslation();
|
||||
const { inline, openSourceLabel, statusLabel } = getMediaLoadFailureLabels(url, t);
|
||||
|
||||
if (compact) {
|
||||
return (
|
||||
<>
|
||||
<img className={styles.fileDeleted} src='assets/filedeleted-res.gif' alt='' aria-hidden='true' />
|
||||
<span className={styles.mediaLoadFailureStatus} role='status' aria-label={statusLabel} title={statusLabel} />
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
return (
|
||||
<span className={styles.mediaLoadFailure} role='status' aria-label={statusLabel} title={statusLabel}>
|
||||
<img className={styles.fileDeleted} src='assets/filedeleted-res.gif' alt='' aria-hidden='true' />
|
||||
<span className={styles.mediaLoadFailureSource}>{inline}</span>
|
||||
{url && (
|
||||
<a className={styles.mediaLoadFailureLink} href={url} target='_blank' rel='noopener noreferrer'>
|
||||
{openSourceLabel}
|
||||
</a>
|
||||
)}
|
||||
</span>
|
||||
);
|
||||
};
|
||||
|
||||
export const MediaLoadFailureInfo = ({ url }: { url?: string }) => {
|
||||
const { t } = useTranslation();
|
||||
const { inline, openSourceLabel, statusLabel } = getMediaLoadFailureLabels(url, t);
|
||||
|
||||
return (
|
||||
<div className={styles.mediaLoadFailureInfo} title={statusLabel}>
|
||||
{inline}
|
||||
{url && (
|
||||
<>
|
||||
{' '}
|
||||
<a href={url} target='_blank' rel='noopener noreferrer'>
|
||||
{openSourceLabel}
|
||||
</a>
|
||||
</>
|
||||
)}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
const Thumbnail = ({
|
||||
commentMediaInfo,
|
||||
deleted,
|
||||
@@ -290,11 +348,22 @@ interface ImageProps {
|
||||
displayWidth: string;
|
||||
initialExpanded?: boolean;
|
||||
isOutOfFeed: boolean;
|
||||
onMediaLoadFailureChange?: (url: string | undefined) => void;
|
||||
parentCid?: string;
|
||||
spoiler?: boolean;
|
||||
}
|
||||
|
||||
const Image = ({ commentMediaInfo, disableToggle = false, displayHeight, displayWidth, initialExpanded = false, isOutOfFeed, parentCid, spoiler }: ImageProps) => {
|
||||
const Image = ({
|
||||
commentMediaInfo,
|
||||
disableToggle = false,
|
||||
displayHeight,
|
||||
displayWidth,
|
||||
initialExpanded = false,
|
||||
isOutOfFeed,
|
||||
onMediaLoadFailureChange,
|
||||
parentCid,
|
||||
spoiler,
|
||||
}: ImageProps) => {
|
||||
const { t } = useTranslation();
|
||||
const { type, url } = commentMediaInfo || {};
|
||||
const isReply = parentCid;
|
||||
@@ -310,8 +379,16 @@ const Image = ({ commentMediaInfo, disableToggle = false, displayHeight, display
|
||||
const expandedMediaAttribute = isImageExpanded ? 'true' : undefined;
|
||||
const imageMediaStyle = isImageExpanded ? undefined : thumbnailDimensions;
|
||||
|
||||
const [hasError, setHasError] = useState(false);
|
||||
const handleError = () => setHasError(true);
|
||||
const [failedUrl, setFailedUrl] = useState<string | undefined>();
|
||||
const hasError = failedUrl === url;
|
||||
const handleError = () => {
|
||||
setFailedUrl(url);
|
||||
onMediaLoadFailureChange?.(url);
|
||||
};
|
||||
const handleLoad = () => {
|
||||
setFailedUrl((currentFailedUrl) => (currentFailedUrl === url ? undefined : currentFailedUrl));
|
||||
onMediaLoadFailureChange?.(undefined);
|
||||
};
|
||||
|
||||
if (spoiler && !isImageExpanded) {
|
||||
const spoilerDimensions = { '--width': '150px', '--height': '150px' } as React.CSSProperties;
|
||||
@@ -346,11 +423,12 @@ const Image = ({ commentMediaInfo, disableToggle = false, displayHeight, display
|
||||
style={imageMediaStyle}
|
||||
>
|
||||
{hasError ? (
|
||||
<img src='assets/filedeleted-res.gif' alt='File deleted' />
|
||||
<MediaLoadFailure compact url={url} />
|
||||
) : (
|
||||
<img
|
||||
src={url}
|
||||
onError={handleError}
|
||||
onLoad={handleLoad}
|
||||
alt=''
|
||||
role={disableToggle ? undefined : 'button'}
|
||||
tabIndex={disableToggle ? undefined : 0}
|
||||
@@ -386,11 +464,12 @@ const Image = ({ commentMediaInfo, disableToggle = false, displayHeight, display
|
||||
style={imageMediaStyle}
|
||||
>
|
||||
{hasError ? (
|
||||
<img src='assets/filedeleted-res.gif' alt='File deleted' />
|
||||
<MediaLoadFailure url={url} />
|
||||
) : (
|
||||
<img
|
||||
src={url}
|
||||
onError={handleError}
|
||||
onLoad={handleLoad}
|
||||
alt=''
|
||||
role='button'
|
||||
tabIndex={0}
|
||||
@@ -424,6 +503,7 @@ const CommentMedia = ({
|
||||
showThumbnail,
|
||||
setShowThumbnail,
|
||||
spoiler,
|
||||
onMediaLoadFailureChange,
|
||||
}: MediaProps) => {
|
||||
const isReply = parentCid;
|
||||
const { t } = useTranslation();
|
||||
@@ -476,6 +556,7 @@ const CommentMedia = ({
|
||||
displayWidth={displayWidth}
|
||||
initialExpanded={showThumbnail === false}
|
||||
isOutOfFeed={isOutOfFeed}
|
||||
onMediaLoadFailureChange={onMediaLoadFailureChange}
|
||||
parentCid={parentCid}
|
||||
spoiler={spoiler}
|
||||
/>
|
||||
@@ -516,6 +597,7 @@ export default memo(CommentMedia, (prev, next) => {
|
||||
prev.isReply === next.isReply &&
|
||||
prev.linkHeight === next.linkHeight &&
|
||||
prev.linkWidth === next.linkWidth &&
|
||||
prev.onMediaLoadFailureChange === next.onMediaLoadFailureChange &&
|
||||
prev.parentCid === next.parentCid &&
|
||||
prev.purged === next.purged &&
|
||||
prev.removed === next.removed &&
|
||||
|
||||
@@ -1 +1 @@
|
||||
export { default } from './comment-media';
|
||||
export { default, MediaLoadFailureInfo } from './comment-media';
|
||||
|
||||
@@ -25,7 +25,7 @@ import useSafeAccountComment from '../../hooks/use-safe-account-comment';
|
||||
import { useCurrentTime } from '../../hooks/use-current-time';
|
||||
import { useBoardPseudonymityMode } from '../../hooks/use-board-pseudonymity-mode';
|
||||
import CommentContent from '../comment-content';
|
||||
import CommentMedia from '../comment-media';
|
||||
import CommentMedia, { MediaLoadFailureInfo } from '../comment-media';
|
||||
import FailedPublishNotice from '../failed-publish-notice';
|
||||
import LoadingEllipsis from '../loading-ellipsis';
|
||||
import PostMenuMobile from './post-menu-mobile';
|
||||
@@ -70,7 +70,14 @@ const RepliesFooter = ({ hasMore, loadingString }: { hasMore: boolean; loadingSt
|
||||
// Store scroll position for replies virtuoso across navigations
|
||||
const lastVirtuosoStates: { [key: string]: StateSnapshot } = {};
|
||||
|
||||
const PostInfoAndMedia = ({ post, postReplyCount = 0, roles, threadNumber, postsByAuthorInThread }: PostProps & { postsByAuthorInThread?: Map<string, number> }) => {
|
||||
const PostInfoAndMedia = ({
|
||||
onMediaLoadFailureChange,
|
||||
post,
|
||||
postReplyCount = 0,
|
||||
roles,
|
||||
threadNumber,
|
||||
postsByAuthorInThread,
|
||||
}: PostProps & { onMediaLoadFailureChange?: (url: string | undefined) => void; postsByAuthorInThread?: Map<string, number> }) => {
|
||||
const { t } = useTranslation();
|
||||
const directories = useDirectories();
|
||||
const resolvedPost = withResolvedCommentCommunityAddress(post);
|
||||
@@ -441,12 +448,22 @@ const PostInfoAndMedia = ({ post, postReplyCount = 0, roles, threadNumber, posts
|
||||
</span>
|
||||
</span>
|
||||
</div>
|
||||
{(hasThumbnail || link) && !(deleted || removed || purged) && <PostMediaContent key={cid} post={resolvedPost} link={link} />}
|
||||
{(hasThumbnail || link) && !(deleted || removed || purged) && (
|
||||
<PostMediaContent key={cid} onMediaLoadFailureChange={onMediaLoadFailureChange} post={resolvedPost} link={link} />
|
||||
)}
|
||||
</>
|
||||
);
|
||||
};
|
||||
|
||||
const PostMediaContent = ({ post, link }: { post: Comment | undefined; link: string }) => {
|
||||
const PostMediaContent = ({
|
||||
onMediaLoadFailureChange,
|
||||
post,
|
||||
link,
|
||||
}: {
|
||||
onMediaLoadFailureChange?: (url: string | undefined) => void;
|
||||
post: Comment | undefined;
|
||||
link: string;
|
||||
}) => {
|
||||
const [showThumbnail, setShowThumbnail] = useState(true);
|
||||
const { thumbnailUrl, linkWidth, linkHeight, spoiler, deleted, removed, parentCid } = post || {};
|
||||
const purged = post?.commentModeration?.purged;
|
||||
@@ -465,6 +482,7 @@ const PostMediaContent = ({ post, link }: { post: Comment | undefined; link: str
|
||||
setShowThumbnail={setShowThumbnail}
|
||||
parentCid={parentCid}
|
||||
spoiler={spoiler}
|
||||
onMediaLoadFailureChange={onMediaLoadFailureChange}
|
||||
/>
|
||||
)
|
||||
);
|
||||
@@ -536,6 +554,8 @@ const Reply = ({
|
||||
onRetry={canRetryFailedPost ? onRetryFailedPost : undefined}
|
||||
/>
|
||||
) : undefined;
|
||||
const [failedMediaUrl, setFailedMediaUrl] = useState<string | undefined>();
|
||||
const mediaLoadFailureInfo = failedMediaUrl && failedMediaUrl === post?.link ? <MediaLoadFailureInfo url={failedMediaUrl} /> : undefined;
|
||||
|
||||
return (
|
||||
<div className={`${styles.replyMobile} ${disableDeferredLayout ? styles.pretextVirtualizedReply : ''}`}>
|
||||
@@ -546,9 +566,16 @@ const Reply = ({
|
||||
data-author-address={author?.shortAddress}
|
||||
data-post-cid={postCid}
|
||||
>
|
||||
<PostInfoAndMedia post={post} postReplyCount={postReplyCount} postsByAuthorInThread={postsByAuthorInThread} roles={roles} threadNumber={threadNumber} />
|
||||
<PostInfoAndMedia
|
||||
onMediaLoadFailureChange={setFailedMediaUrl}
|
||||
post={post}
|
||||
postReplyCount={postReplyCount}
|
||||
postsByAuthorInThread={postsByAuthorInThread}
|
||||
roles={roles}
|
||||
threadNumber={threadNumber}
|
||||
/>
|
||||
{post && !hidden && (!(removed || deleted || purged) || ((removed || deleted) && reason) || purged) && (
|
||||
<CommentContent comment={post} prependContent={failedPublishNotice} />
|
||||
<CommentContent appendContent={mediaLoadFailureInfo} comment={post} prependContent={failedPublishNotice} />
|
||||
)}
|
||||
{post && <ReplyBacklinks post={post} quotedByMap={quotedByMap} directRepliesByParentCid={directRepliesByParentCid} />}
|
||||
</div>
|
||||
@@ -681,6 +708,8 @@ const PostMobile = ({
|
||||
onRetry={canRetryFailedPost ? onRetryFailedPost : undefined}
|
||||
/>
|
||||
) : undefined;
|
||||
const [failedMediaUrl, setFailedMediaUrl] = useState<string | undefined>();
|
||||
const mediaLoadFailureInfo = failedMediaUrl && failedMediaUrl === resolvedPost?.link ? <MediaLoadFailureInfo url={failedMediaUrl} /> : undefined;
|
||||
|
||||
// Author-deleted replies are hidden from thread replies; moderator removals still render their placeholder.
|
||||
const filteredReplies = useMemo(() => filterRepliesForDisplay(freshRepliesForRender), [freshRepliesForRender]);
|
||||
@@ -837,13 +866,14 @@ const PostMobile = ({
|
||||
>
|
||||
{shouldShowSnow() && <img src='assets/xmashat.gif' className={styles.xmasHat} alt='' />}
|
||||
<PostInfoAndMedia
|
||||
onMediaLoadFailureChange={setFailedMediaUrl}
|
||||
post={resolvedPost}
|
||||
postReplyCount={replyCount}
|
||||
postsByAuthorInThread={postsByAuthorInThread}
|
||||
roles={roles}
|
||||
threadNumber={resolvedPost?.number}
|
||||
/>
|
||||
{resolvedPost && <CommentContent comment={resolvedPost} prependContent={failedPublishNotice} />}
|
||||
{resolvedPost && <CommentContent appendContent={mediaLoadFailureInfo} comment={resolvedPost} prependContent={failedPublishNotice} />}
|
||||
{resolvedPost && <ReplyBacklinks post={resolvedPost} quotedByMap={quotedByMap} directRepliesByParentCid={directRepliesByParentCid} />}
|
||||
</div>
|
||||
{!isInPostView && !isInPendingPostView && (showReplies || isModQueue) && (
|
||||
|
||||
Reference in New Issue
Block a user