From 1639600d7cf26ec30e40abc0886bb3e9318d6ea0 Mon Sep 17 00:00:00 2001 From: "Tom (plebeius.eth)" Date: Mon, 24 Feb 2025 12:18:02 +0100 Subject: [PATCH 01/16] add banner --- public/assets/banners/banner-62.jpg | Bin 0 -> 91129 bytes src/components/board-header/board-header.tsx | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 public/assets/banners/banner-62.jpg diff --git a/public/assets/banners/banner-62.jpg b/public/assets/banners/banner-62.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8816e111e94fa571fd4118d5a7f62341f25cc74f GIT binary patch literal 91129 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 z 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

`b>}67-Blh0kYuUaNSlT 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 { const [imagePath] = useState(() => { From 2df9a964e65cf7d8968ba28d470dcf7aba58b979 Mon Sep 17 00:00:00 2001 From: "Tom (plebeius.eth)" Date: Mon, 24 Feb 2025 12:21:59 +0100 Subject: [PATCH 02/16] fix(board header): banner could change while subplebbit is loading --- src/components/board-header/board-header.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/components/board-header/board-header.tsx b/src/components/board-header/board-header.tsx index 7d94c350..fd03d097 100644 --- a/src/components/board-header/board-header.tsx +++ b/src/components/board-header/board-header.tsx @@ -42,7 +42,7 @@ const BoardHeader = () => {

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