feat: add copy user ID menu item and rename copy link to copy direct link

Add 'Copy user ID' button to both desktop and mobile post menus, allowing users to copy the full author address. This provides a way to verify authenticity against the 8-char display ID. Also rename 'Copy link' to 'Copy direct link' for clarity. Update security comments to reflect the new approach and add translations for all 35 languages.
This commit is contained in:
plebeius
2026-02-10 13:45:55 +08:00
parent 24d329a329
commit 4a96f88efd
39 changed files with 149 additions and 74 deletions
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "واجهة", "interface": "واجهة",
"invalid_url": "رابط غير صالح", "invalid_url": "رابط غير صالح",
"image_search": "البحث عن صورة", "image_search": "البحث عن صورة",
"copy_link": "نسخ الرابط",
"hide_post": "إخفاء المنشور", "hide_post": "إخفاء المنشور",
"hide_thread": "إخفاء الموضوع", "hide_thread": "إخفاء الموضوع",
"unhide_post": "إظهار المنشور", "unhide_post": "إظهار المنشور",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "نسخ معرف المستخدم",
"copy_direct_link": "نسخ الرابط المباشر"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "ইন্টারফেস", "interface": "ইন্টারফেস",
"invalid_url": "অবৈধ ইউআরএল", "invalid_url": "অবৈধ ইউআরএল",
"image_search": "চিত্র অনুসন্ধান", "image_search": "চিত্র অনুসন্ধান",
"copy_link": "লিংক অনুলিপি করুন",
"hide_post": "পোস্ট লুকাও", "hide_post": "পোস্ট লুকাও",
"hide_thread": "থ্রেড লুকাও", "hide_thread": "থ্রেড লুকাও",
"unhide_post": "পোস্ট প্রদর্শন করুন", "unhide_post": "পোস্ট প্রদর্শন করুন",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "ইউজার আইডি কপি করুন",
"copy_direct_link": "সরাসরি লিংক অনুলিপি করুন"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "rozhraní", "interface": "rozhraní",
"invalid_url": "Neplatná adresa URL", "invalid_url": "Neplatná adresa URL",
"image_search": "hledání obrázku", "image_search": "hledání obrázku",
"copy_link": "kopírovat odkaz",
"hide_post": "skrýt příspěvek", "hide_post": "skrýt příspěvek",
"hide_thread": "skrýt vlákno", "hide_thread": "skrýt vlákno",
"unhide_post": "zobrazit příspěvek", "unhide_post": "zobrazit příspěvek",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "kopírovat ID uživatele",
"copy_direct_link": "kopírovat přímý odkaz"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interface", "interface": "interface",
"invalid_url": "Ugyldig webadresse", "invalid_url": "Ugyldig webadresse",
"image_search": "billedsøgning", "image_search": "billedsøgning",
"copy_link": "kopier link",
"hide_post": "skjul post", "hide_post": "skjul post",
"hide_thread": "skjul tråd", "hide_thread": "skjul tråd",
"unhide_post": "vis indlæg", "unhide_post": "vis indlæg",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "kopier bruger-ID",
"copy_direct_link": "kopier direkte link"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "Schnittstelle", "interface": "Schnittstelle",
"invalid_url": "Ungültige URL", "invalid_url": "Ungültige URL",
"image_search": "Bildersuche", "image_search": "Bildersuche",
"copy_link": "Link kopieren",
"hide_post": "Beitrag ausblenden", "hide_post": "Beitrag ausblenden",
"hide_thread": "Thread ausblenden", "hide_thread": "Thread ausblenden",
"unhide_post": "Beitrag anzeigen", "unhide_post": "Beitrag anzeigen",
@@ -276,5 +275,7 @@
"type": "Typ", "type": "Typ",
"yes": "Ja", "yes": "Ja",
"no": "Nein", "no": "Nein",
"pending_mod_approval": "Ausstehende Moderatorgenehmigung, für Benutzer nicht sichtbar" "pending_mod_approval": "Ausstehende Moderatorgenehmigung, für Benutzer nicht sichtbar",
"copy_user_id": "Benutzer-ID kopieren",
"copy_direct_link": "Direktlink kopieren"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "διεπαφή", "interface": "διεπαφή",
"invalid_url": "Μη έγκυρη διεύθυνση URL", "invalid_url": "Μη έγκυρη διεύθυνση URL",
"image_search": "αναζήτηση εικόνων", "image_search": "αναζήτηση εικόνων",
"copy_link": "αντιγραφή συνδέσμου",
"hide_post": "απόκρυψη ανάρτησης", "hide_post": "απόκρυψη ανάρτησης",
"hide_thread": "απόκρυψη νήματος", "hide_thread": "απόκρυψη νήματος",
"unhide_post": "εμφάνιση ανάρτησης", "unhide_post": "εμφάνιση ανάρτησης",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "αντιγραφή ID χρήστη",
"copy_direct_link": "αντιγραφή άμεσου συνδέσμου"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interface", "interface": "interface",
"invalid_url": "Invalid URL", "invalid_url": "Invalid URL",
"image_search": "image search", "image_search": "image search",
"copy_link": "Copy link",
"hide_post": "Hide post", "hide_post": "Hide post",
"hide_thread": "Hide thread", "hide_thread": "Hide thread",
"unhide_post": "Unhide post", "unhide_post": "Unhide post",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "Copy user ID",
"copy_direct_link": "Copy direct link"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interfaz", "interface": "interfaz",
"invalid_url": "URL no válida", "invalid_url": "URL no válida",
"image_search": "búsqueda de imágenes", "image_search": "búsqueda de imágenes",
"copy_link": "Copiar enlace",
"hide_post": "Ocultar publicación", "hide_post": "Ocultar publicación",
"hide_thread": "Ocultar hilo", "hide_thread": "Ocultar hilo",
"unhide_post": "Mostrar publicación", "unhide_post": "Mostrar publicación",
@@ -276,5 +275,7 @@
"type": "Tipo", "type": "Tipo",
"yes": "Sí", "yes": "Sí",
"no": "No", "no": "No",
"pending_mod_approval": "Pendiente de aprobación del moderador, no visible para los usuarios" "pending_mod_approval": "Pendiente de aprobación del moderador, no visible para los usuarios",
"copy_user_id": "Copiar ID de usuario",
"copy_direct_link": "Copiar enlace directo"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "رابط", "interface": "رابط",
"invalid_url": "آدرس اینترنتی نامعتبر است", "invalid_url": "آدرس اینترنتی نامعتبر است",
"image_search": "جستجوی تصویر", "image_search": "جستجوی تصویر",
"copy_link": "رونوشت لینک",
"hide_post": "پنهان کردن پست", "hide_post": "پنهان کردن پست",
"hide_thread": "پنهان کردن موضوع", "hide_thread": "پنهان کردن موضوع",
"unhide_post": "نمایش پست", "unhide_post": "نمایش پست",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "کپی شناسه کاربر",
"copy_direct_link": "رونوشت لینک مستقیم"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "liitäntä", "interface": "liitäntä",
"invalid_url": "Virheellinen URL-osoite", "invalid_url": "Virheellinen URL-osoite",
"image_search": "kuvahaku", "image_search": "kuvahaku",
"copy_link": "kopioi linkki",
"hide_post": "piilota viesti", "hide_post": "piilota viesti",
"hide_thread": "piilota keskustelu", "hide_thread": "piilota keskustelu",
"unhide_post": "näytä viesti", "unhide_post": "näytä viesti",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "kopioi käyttäjätunnus",
"copy_direct_link": "kopioi suora linkki"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interface", "interface": "interface",
"invalid_url": "Hindi wastong URL", "invalid_url": "Hindi wastong URL",
"image_search": "paghahanap ng larawan", "image_search": "paghahanap ng larawan",
"copy_link": "kopyahin ang link",
"hide_post": "itago ang post", "hide_post": "itago ang post",
"hide_thread": "itago ang thread", "hide_thread": "itago ang thread",
"unhide_post": "ipakita ang post", "unhide_post": "ipakita ang post",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "kopyahin ang user ID",
"copy_direct_link": "kopyahin ang direct link"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interface", "interface": "interface",
"invalid_url": "URL non valide", "invalid_url": "URL non valide",
"image_search": "recherche d'images", "image_search": "recherche d'images",
"copy_link": "Copier le lien",
"hide_post": "Masquer la publication", "hide_post": "Masquer la publication",
"hide_thread": "Masquer le fil", "hide_thread": "Masquer le fil",
"unhide_post": "Afficher la publication", "unhide_post": "Afficher la publication",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Oui", "yes": "Oui",
"no": "Non", "no": "Non",
"pending_mod_approval": "En attente d'approbation du modérateur, non visible pour les utilisateurs" "pending_mod_approval": "En attente d'approbation du modérateur, non visible pour les utilisateurs",
"copy_user_id": "Copier l'ID utilisateur",
"copy_direct_link": "Copier le lien direct"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "ממשק", "interface": "ממשק",
"invalid_url": "כתובת אינטרנט לא תקינה", "invalid_url": "כתובת אינטרנט לא תקינה",
"image_search": "חיפוש תמונות", "image_search": "חיפוש תמונות",
"copy_link": "העתק קישור",
"hide_post": "הסתר פוסט", "hide_post": "הסתר פוסט",
"hide_thread": "הסתר ת’רד", "hide_thread": "הסתר ת’רד",
"unhide_post": "הצג פוסט", "unhide_post": "הצג פוסט",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "העתק מזהה משתמש",
"copy_direct_link": "העתק קישור ישיר"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "इंटरफेस", "interface": "इंटरफेस",
"invalid_url": "अमान्य URL", "invalid_url": "अमान्य URL",
"image_search": "चित्र खोज", "image_search": "चित्र खोज",
"copy_link": "लिंक कॉपी करें",
"hide_post": "पोस्ट छुपाएं", "hide_post": "पोस्ट छुपाएं",
"hide_thread": "धागा छुपाएं", "hide_thread": "धागा छुपाएं",
"unhide_post": "पोस्ट प्रदर्शित करें", "unhide_post": "पोस्ट प्रदर्शित करें",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "यूज़र ID कॉपी करें",
"copy_direct_link": "डायरेक्ट लिंक कॉपी करें"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "felület", "interface": "felület",
"invalid_url": "Érvénytelen URL-cím", "invalid_url": "Érvénytelen URL-cím",
"image_search": "képkeresés", "image_search": "képkeresés",
"copy_link": "link másolása",
"hide_post": "bejegyzés elrejtése", "hide_post": "bejegyzés elrejtése",
"hide_thread": "szál elrejtése", "hide_thread": "szál elrejtése",
"unhide_post": "bejegyzés megjelenítése", "unhide_post": "bejegyzés megjelenítése",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "felhasználói ID másolása",
"copy_direct_link": "közvetlen link másolása"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "antarmuka", "interface": "antarmuka",
"invalid_url": "URL tidak valid", "invalid_url": "URL tidak valid",
"image_search": "pencarian gambar", "image_search": "pencarian gambar",
"copy_link": "salin tautan",
"hide_post": "sembunyikan pos", "hide_post": "sembunyikan pos",
"hide_thread": "sembunyikan utas", "hide_thread": "sembunyikan utas",
"unhide_post": "tampilkan pos", "unhide_post": "tampilkan pos",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "salin ID pengguna",
"copy_direct_link": "salin tautan langsung"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interfaccia", "interface": "interfaccia",
"invalid_url": "URL non valido", "invalid_url": "URL non valido",
"image_search": "ricerca immagini", "image_search": "ricerca immagini",
"copy_link": "Copia link",
"hide_post": "Nascondi post", "hide_post": "Nascondi post",
"hide_thread": "Nascondi thread", "hide_thread": "Nascondi thread",
"unhide_post": "Mostra post", "unhide_post": "Mostra post",
@@ -276,5 +275,7 @@
"type": "Tipo", "type": "Tipo",
"yes": "Sì", "yes": "Sì",
"no": "No", "no": "No",
"pending_mod_approval": "In attesa di approvazione del moderatore, non visibile agli utenti" "pending_mod_approval": "In attesa di approvazione del moderatore, non visibile agli utenti",
"copy_user_id": "Copia ID utente",
"copy_direct_link": "Copia link diretto"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "インターフェース", "interface": "インターフェース",
"invalid_url": "無効なURL", "invalid_url": "無効なURL",
"image_search": "画像検索", "image_search": "画像検索",
"copy_link": "リンクをコピー",
"hide_post": "投稿を非表示", "hide_post": "投稿を非表示",
"hide_thread": "スレッドを非表示", "hide_thread": "スレッドを非表示",
"unhide_post": "投稿を表示", "unhide_post": "投稿を表示",
@@ -276,5 +275,7 @@
"type": "タイプ", "type": "タイプ",
"yes": "はい", "yes": "はい",
"no": "いいえ", "no": "いいえ",
"pending_mod_approval": "モデレーターの承認待ち、ユーザーには表示されません" "pending_mod_approval": "モデレーターの承認待ち、ユーザーには表示されません",
"copy_user_id": "ユーザーIDをコピー",
"copy_direct_link": "直接リンクをコピー"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "인터페이스", "interface": "인터페이스",
"invalid_url": "잘못된 URL", "invalid_url": "잘못된 URL",
"image_search": "이미지 검색", "image_search": "이미지 검색",
"copy_link": "링크 복사",
"hide_post": "게시물 숨기기", "hide_post": "게시물 숨기기",
"hide_thread": "스레드 숨기기", "hide_thread": "스레드 숨기기",
"unhide_post": "게시물 숨기기 해제", "unhide_post": "게시물 숨기기 해제",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "사용자 ID 복사",
"copy_direct_link": "직접 링크 복사"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "इंटरफेस", "interface": "इंटरफेस",
"invalid_url": "अवैध URL", "invalid_url": "अवैध URL",
"image_search": "प्रतिमा शोध", "image_search": "प्रतिमा शोध",
"copy_link": "लिंक कॉपी करा",
"hide_post": "पोस्ट लपवा", "hide_post": "पोस्ट लपवा",
"hide_thread": "थ्रेड लपवा", "hide_thread": "थ्रेड लपवा",
"unhide_post": "पोस्ट दाखवा", "unhide_post": "पोस्ट दाखवा",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "यूजर ID कॉपी करा",
"copy_direct_link": "डायरेक्ट लिंक कॉपी करा"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interface", "interface": "interface",
"invalid_url": "Ongeldige URL", "invalid_url": "Ongeldige URL",
"image_search": "afbeeldingen zoeken", "image_search": "afbeeldingen zoeken",
"copy_link": "link kopiëren",
"hide_post": "bericht verbergen", "hide_post": "bericht verbergen",
"hide_thread": "thread verbergen", "hide_thread": "thread verbergen",
"unhide_post": "bericht weergeven", "unhide_post": "bericht weergeven",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "gebruikers-ID kopiëren",
"copy_direct_link": "directe link kopiëren"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "grensesnitt", "interface": "grensesnitt",
"invalid_url": "Ugyldig URL", "invalid_url": "Ugyldig URL",
"image_search": "bilde søk", "image_search": "bilde søk",
"copy_link": "kopier lenke",
"hide_post": "skjul innlegg", "hide_post": "skjul innlegg",
"hide_thread": "skjul tråd", "hide_thread": "skjul tråd",
"unhide_post": "vis innlegg", "unhide_post": "vis innlegg",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "kopier bruker-ID",
"copy_direct_link": "kopier direkte lenke"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interfejs", "interface": "interfejs",
"invalid_url": "Nieprawidłowy adres URL", "invalid_url": "Nieprawidłowy adres URL",
"image_search": "wyszukiwanie obrazów", "image_search": "wyszukiwanie obrazów",
"copy_link": "skopiuj link",
"hide_post": "ukryj post", "hide_post": "ukryj post",
"hide_thread": "ukryj wątek", "hide_thread": "ukryj wątek",
"unhide_post": "pokaż post", "unhide_post": "pokaż post",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "skopiuj ID użytkownika",
"copy_direct_link": "skopiuj bezpośredni link"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interface", "interface": "interface",
"invalid_url": "URL inválida", "invalid_url": "URL inválida",
"image_search": "pesquisa de imagens", "image_search": "pesquisa de imagens",
"copy_link": "Copiar link",
"hide_post": "Ocultar postagem", "hide_post": "Ocultar postagem",
"hide_thread": "Ocultar tópico", "hide_thread": "Ocultar tópico",
"unhide_post": "Mostrar postagem", "unhide_post": "Mostrar postagem",
@@ -276,5 +275,7 @@
"type": "Tipo", "type": "Tipo",
"yes": "Sim", "yes": "Sim",
"no": "Não", "no": "Não",
"pending_mod_approval": "Aguardando aprovação do moderador, não visível para os usuários" "pending_mod_approval": "Aguardando aprovação do moderador, não visível para os usuários",
"copy_user_id": "Copiar ID do usuário",
"copy_direct_link": "Copiar link direto"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "interfață", "interface": "interfață",
"invalid_url": "URL invalid", "invalid_url": "URL invalid",
"image_search": "căutare de imagini", "image_search": "căutare de imagini",
"copy_link": "copiați linkul",
"hide_post": "ascundeți postarea", "hide_post": "ascundeți postarea",
"hide_thread": "ascundeți firul", "hide_thread": "ascundeți firul",
"unhide_post": "afișează postarea", "unhide_post": "afișează postarea",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "copiați ID-ul utilizatorului",
"copy_direct_link": "copiați linkul direct"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "интерфейс", "interface": "интерфейс",
"invalid_url": "Недействительный URL", "invalid_url": "Недействительный URL",
"image_search": "поиск изображений", "image_search": "поиск изображений",
"copy_link": "копировать ссылку",
"hide_post": "скрыть пост", "hide_post": "скрыть пост",
"hide_thread": "скрыть ветку", "hide_thread": "скрыть ветку",
"unhide_post": "показать пост", "unhide_post": "показать пост",
@@ -276,5 +275,7 @@
"type": "Тип", "type": "Тип",
"yes": "Да", "yes": "Да",
"no": "Нет", "no": "Нет",
"pending_mod_approval": "Ожидает одобрения модератора, не видно пользователям" "pending_mod_approval": "Ожидает одобрения модератора, не видно пользователям",
"copy_user_id": "копировать ID пользователя",
"copy_direct_link": "копировать прямую ссылку"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "ndërfaqe", "interface": "ndërfaqe",
"invalid_url": "URL jo e vlefshëm", "invalid_url": "URL jo e vlefshëm",
"image_search": "kërkim imazhesh", "image_search": "kërkim imazhesh",
"copy_link": "kopjo linkun",
"hide_post": "fsheh postën", "hide_post": "fsheh postën",
"hide_thread": "fsheh fijen", "hide_thread": "fsheh fijen",
"unhide_post": "shfaq postën", "unhide_post": "shfaq postën",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "kopjo ID e përdoruesit",
"copy_direct_link": "kopjo lidhjen e drejtpërdrejtë"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "gränssnitt", "interface": "gränssnitt",
"invalid_url": "Ogiltig URL", "invalid_url": "Ogiltig URL",
"image_search": "bildsökning", "image_search": "bildsökning",
"copy_link": "kopiera länk",
"hide_post": "dölj inlägg", "hide_post": "dölj inlägg",
"hide_thread": "dölj tråd", "hide_thread": "dölj tråd",
"unhide_post": "visa inlägg", "unhide_post": "visa inlägg",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "kopiera användar-ID",
"copy_direct_link": "kopiera direktlänk"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "అంతరాఫ్సు", "interface": "అంతరాఫ్సు",
"invalid_url": "చెల్లని URL", "invalid_url": "చెల్లని URL",
"image_search": "చిత్రాల శోధన", "image_search": "చిత్రాల శోధన",
"copy_link": "లింక్ ను కాపీ చేయండి",
"hide_post": "పోస్ట్ దాచు", "hide_post": "పోస్ట్ దాచు",
"hide_thread": "థ్రెడ్ దాచు", "hide_thread": "థ్రెడ్ దాచు",
"unhide_post": "పోస్ట్ చూపించు", "unhide_post": "పోస్ట్ చూపించు",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "యూజర్ ID కాపీ చేయండి",
"copy_direct_link": "డైరెక్ట్ లింక్ కాపీ చేయండి"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "อินเทอร์เฟซ", "interface": "อินเทอร์เฟซ",
"invalid_url": "URL ไม่ถูกต้อง", "invalid_url": "URL ไม่ถูกต้อง",
"image_search": "ค้นหารูปภาพ", "image_search": "ค้นหารูปภาพ",
"copy_link": "คัดลอกลิงก์",
"hide_post": "ซ่อนโพสต์", "hide_post": "ซ่อนโพสต์",
"hide_thread": "ซ่อนเธรด", "hide_thread": "ซ่อนเธรด",
"unhide_post": "แสดงโพสต์", "unhide_post": "แสดงโพสต์",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "คัดลอก ID ผู้ใช้",
"copy_direct_link": "คัดลอกลิงก์โดยตรง"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "arayüz", "interface": "arayüz",
"invalid_url": "Geçersiz URL", "invalid_url": "Geçersiz URL",
"image_search": "resim arama", "image_search": "resim arama",
"copy_link": "bağlantıyı kopyala",
"hide_post": "gönderiyi gizle", "hide_post": "gönderiyi gizle",
"hide_thread": "konuyu gizle", "hide_thread": "konuyu gizle",
"unhide_post": "gönderiyi göster", "unhide_post": "gönderiyi göster",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "kullanıcı ID'sini kopyala",
"copy_direct_link": "doğrudan bağlantıyı kopyala"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "інтерфейс", "interface": "інтерфейс",
"invalid_url": "Недійсний URL", "invalid_url": "Недійсний URL",
"image_search": "пошук зображень", "image_search": "пошук зображень",
"copy_link": "копіювати посилання",
"hide_post": "сховати допис", "hide_post": "сховати допис",
"hide_thread": "сховати нитку", "hide_thread": "сховати нитку",
"unhide_post": "показати допис", "unhide_post": "показати допис",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "копіювати ID користувача",
"copy_direct_link": "копіювати пряме посилання"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "انٹرفیس", "interface": "انٹرفیس",
"invalid_url": "غیر درست یو آر ایل", "invalid_url": "غیر درست یو آر ایل",
"image_search": "تصویر کی تلاش", "image_search": "تصویر کی تلاش",
"copy_link": "لنک کاپی کریں",
"hide_post": "پوسٹ چھپائیں", "hide_post": "پوسٹ چھپائیں",
"hide_thread": "دھاگہ چھپائیں", "hide_thread": "دھاگہ چھپائیں",
"unhide_post": "پوسٹ دکھائیں", "unhide_post": "پوسٹ دکھائیں",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "صارف کی شناخت کاپی کریں",
"copy_direct_link": "براہ راست لنک کاپی کریں"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "giao diện", "interface": "giao diện",
"invalid_url": "URL không hợp lệ", "invalid_url": "URL không hợp lệ",
"image_search": "tìm kiếm hình ảnh", "image_search": "tìm kiếm hình ảnh",
"copy_link": "sao chép liên kết",
"hide_post": "Ẩn bài viết", "hide_post": "Ẩn bài viết",
"hide_thread": "Ẩn chủ đề", "hide_thread": "Ẩn chủ đề",
"unhide_post": "Hiện bài viết", "unhide_post": "Hiện bài viết",
@@ -276,5 +275,7 @@
"type": "Type", "type": "Type",
"yes": "Yes", "yes": "Yes",
"no": "No", "no": "No",
"pending_mod_approval": "Pending mod approval, not visible to users" "pending_mod_approval": "Pending mod approval, not visible to users",
"copy_user_id": "sao chép ID người dùng",
"copy_direct_link": "sao chép liên kết trực tiếp"
} }
+3 -2
View File
@@ -99,7 +99,6 @@
"interface": "界面", "interface": "界面",
"invalid_url": "无效的网址", "invalid_url": "无效的网址",
"image_search": "图像搜索", "image_search": "图像搜索",
"copy_link": "复制链接",
"hide_post": "隐藏帖子", "hide_post": "隐藏帖子",
"hide_thread": "隐藏主题", "hide_thread": "隐藏主题",
"unhide_post": "显示帖子", "unhide_post": "显示帖子",
@@ -276,5 +275,7 @@
"type": "类型", "type": "类型",
"yes": "是", "yes": "是",
"no": "否", "no": "否",
"pending_mod_approval": "等待版主批准,用户不可见" "pending_mod_approval": "等待版主批准,用户不可见",
"copy_user_id": "复制用户ID",
"copy_direct_link": "复制直接链接"
} }
+1 -1
View File
@@ -197,7 +197,7 @@ const PostInfo = ({
const alertThresholdSeconds = getAlertThresholdSeconds(); const alertThresholdSeconds = getAlertThresholdSeconds();
const isOverThreshold = isAwaitingApproval && timeWaiting > alertThresholdSeconds; const isOverThreshold = isAwaitingApproval && timeWaiting > alertThresholdSeconds;
const userID = address && Plebbit.getShortAddress({ address }); // should not be shortened to less than 12 characters, because users can create unlimited addresses/IDs before authenticating or passing challenges, so if the ID is short enough they can spoof it to troll users with the same ID const userID = address && Plebbit.getShortAddress({ address }); // shortened to 8 chars for display; users can verify the full user ID via "Copy user ID" in the post menu to guard against spoofing
const userIDBackgroundColor = hashStringToColor(userID); const userIDBackgroundColor = hashStringToColor(userID);
const userIDTextColor = getTextColorForBackground(userIDBackgroundColor); const userIDTextColor = getTextColorForBackground(userIDBackgroundColor);
@@ -39,7 +39,7 @@ const CopyLinkButton = ({ cid, subplebbitAddress, linkType, onClose }: CopyLinkB
} }
}} }}
> >
<div className={styles.postMenuItem}>{t('copy_link')}</div> <div className={styles.postMenuItem}>{t('copy_direct_link')}</div>
</div> </div>
); );
}; };
@@ -63,6 +63,25 @@ const CopyContentIdButton = ({ cid, onClose }: { cid: string; onClose: () => voi
); );
}; };
const CopyUserIdButton = ({ address, onClose }: { address: string; onClose: () => void }) => {
const { t } = useTranslation();
return (
<div
onClick={async () => {
try {
await copyToClipboard(address);
} catch (error) {
console.error('Failed to copy user id', error);
} finally {
onClose();
}
}}
>
<div className={styles.postMenuItem}>{t('copy_user_id')}</div>
</div>
);
};
const ImageSearchButton = ({ url, onClose }: { url: string; onClose: () => void }) => { const ImageSearchButton = ({ url, onClose }: { url: string; onClose: () => void }) => {
const { t } = useTranslation(); const { t } = useTranslation();
const [isImageSearchMenuOpen, setIsImageSearchMenuOpen] = useState(false); const [isImageSearchMenuOpen, setIsImageSearchMenuOpen] = useState(false);
@@ -178,6 +197,7 @@ const PostMenuDesktop = ({ postMenu }: PostMenuDesktopProps) => {
<div className={styles.postMenu} ref={refs.setFloating} style={floatingStyles} aria-labelledby={headingId} {...getFloatingProps()}> <div className={styles.postMenu} ref={refs.setFloating} style={floatingStyles} aria-labelledby={headingId} {...getFloatingProps()}>
{cid && subplebbitAddress && <CopyLinkButton cid={cid} subplebbitAddress={subplebbitAddress} linkType='thread' onClose={handleClose} />} {cid && subplebbitAddress && <CopyLinkButton cid={cid} subplebbitAddress={subplebbitAddress} linkType='thread' onClose={handleClose} />}
{cid && <CopyContentIdButton cid={cid} onClose={handleClose} />} {cid && <CopyContentIdButton cid={cid} onClose={handleClose} />}
{authorAddress && <CopyUserIdButton address={authorAddress} onClose={handleClose} />}
{!(isInPostPageView && postCid === cid) && ( {!(isInPostPageView && postCid === cid) && (
<div <div
className={styles.postMenuItem} className={styles.postMenuItem}
@@ -47,7 +47,7 @@ const CopyLinkButton = ({ cid, subplebbitAddress, linkType, onClose }: CopyLinkB
} }
}} }}
> >
<div className={styles.postMenuItem}>{t('copy_link')}</div> <div className={styles.postMenuItem}>{t('copy_direct_link')}</div>
</div> </div>
); );
}; };
@@ -71,6 +71,25 @@ const CopyContentIdButton = ({ cid, onClose }: { cid: string; onClose: () => voi
); );
}; };
const CopyUserIdButton = ({ address, onClose }: { address: string; onClose: () => void }) => {
const { t } = useTranslation();
return (
<div
onClick={async () => {
try {
await copyToClipboard(address);
} catch (error) {
console.error('Failed to copy user id', error);
} finally {
onClose();
}
}}
>
<div className={styles.postMenuItem}>{t('copy_user_id')}</div>
</div>
);
};
const ImageSearchButtons = ({ url, onClose }: { url: string; onClose: () => void }) => { const ImageSearchButtons = ({ url, onClose }: { url: string; onClose: () => void }) => {
const { t } = useTranslation(); const { t } = useTranslation();
return ( return (
@@ -180,6 +199,7 @@ const PostMenuMobile = ({ postMenu, editMenuPost }: PostMenuMobileProps) => {
<div className={styles.postMenu} ref={refs.setFloating} style={floatingStyles} aria-labelledby={headingId} {...getFloatingProps()}> <div className={styles.postMenu} ref={refs.setFloating} style={floatingStyles} aria-labelledby={headingId} {...getFloatingProps()}>
{cid && subplebbitAddress && <CopyLinkButton cid={cid} subplebbitAddress={subplebbitAddress} linkType='thread' onClose={handleClose} />} {cid && subplebbitAddress && <CopyLinkButton cid={cid} subplebbitAddress={subplebbitAddress} linkType='thread' onClose={handleClose} />}
{cid && <CopyContentIdButton cid={cid} onClose={handleClose} />} {cid && <CopyContentIdButton cid={cid} onClose={handleClose} />}
{authorAddress && <CopyUserIdButton address={authorAddress} onClose={handleClose} />}
{cid && subplebbitAddress && <HidePostButton cid={cid} isReply={!!parentCid} postCid={postCid} onClose={handleClose} />} {cid && subplebbitAddress && <HidePostButton cid={cid} isReply={!!parentCid} postCid={postCid} onClose={handleClose} />}
{cid && subplebbitAddress && authorAddress && <BlockUserButton address={authorAddress} />} {cid && subplebbitAddress && authorAddress && <BlockUserButton address={authorAddress} />}
{cid && subplebbitAddress && !isInBoardView && <BlockBoardButton address={subplebbitAddress} />} {cid && subplebbitAddress && !isInBoardView && <BlockBoardButton address={subplebbitAddress} />}
+1 -1
View File
@@ -173,7 +173,7 @@ const PostInfoAndMedia = ({ post, postReplyCount = 0, roles, threadNumber }: Pos
const pseudonymityMode = useSubplebbitField(subplebbitAddress, (sub) => sub?.features?.pseudonymityMode); const pseudonymityMode = useSubplebbitField(subplebbitAddress, (sub) => sub?.features?.pseudonymityMode);
const showUserID = pseudonymityMode !== 'per-reply'; const showUserID = pseudonymityMode !== 'per-reply';
const userID = address && Plebbit.getShortAddress({ address }); // should not be shortened to less than 12 characters, because users can create unlimited addresses/IDs before authenticating or passing challenges, so if the ID is short enough they can spoof it to troll users with the same ID const userID = address && Plebbit.getShortAddress({ address }); // shortened to 8 chars for display; users can verify the full user ID via "Copy user ID" in the post menu to guard against spoofing
const userIDBackgroundColor = hashStringToColor(userID); const userIDBackgroundColor = hashStringToColor(userID);
const userIDTextColor = getTextColorForBackground(userIDBackgroundColor); const userIDTextColor = getTextColorForBackground(userIDBackgroundColor);