From 01816b038963b900c9b3ab07e64eb169becc775f Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 2 Jul 2024 17:29:16 -0400 Subject: [PATCH 1/3] Adds a check to make sure the NIP-96 uploader is a url before adding to the list. Solves NPE on the model if they are not urls --- .../mediaServers/MediaServerEditField.kt | 21 +++--- .../mediaServers/MediaServersViewModel.kt | 18 +++-- .../quartz/encoders/HttpUrlFormatter.kt | 69 +++++++++++++++++++ 3 files changed, 91 insertions(+), 17 deletions(-) create mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/encoders/HttpUrlFormatter.kt diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/mediaServers/MediaServerEditField.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/mediaServers/MediaServerEditField.kt index 586719a14..ee853f4ac 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/mediaServers/MediaServerEditField.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/mediaServers/MediaServerEditField.kt @@ -23,11 +23,11 @@ package com.vitorpamplona.amethyst.ui.actions.mediaServers import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row import androidx.compose.material3.Button -import androidx.compose.material3.ButtonDefaults import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -40,6 +40,7 @@ import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.theme.ButtonBorder import com.vitorpamplona.amethyst.ui.theme.Size10dp import com.vitorpamplona.amethyst.ui.theme.placeholderText +import com.vitorpamplona.quartz.encoders.HttpUrlFormatter @Composable fun MediaServerEditField( @@ -47,6 +48,12 @@ fun MediaServerEditField( onAddServer: (String) -> Unit, ) { var url by remember { mutableStateOf("") } + val validUrl by + remember { + derivedStateOf { + url.isNotBlank() && HttpUrlFormatter.isValidUrl(url) + } + } Row( verticalAlignment = Alignment.CenterVertically, @@ -73,20 +80,12 @@ fun MediaServerEditField( Button( onClick = { if (url.isNotBlank() && url != "/") { - onAddServer(url) + onAddServer(HttpUrlFormatter.normalize(url)) url = "" } }, shape = ButtonBorder, - colors = - ButtonDefaults.buttonColors( - containerColor = - if (url.isNotBlank()) { - MaterialTheme.colorScheme.primary - } else { - MaterialTheme.colorScheme.placeholderText - }, - ), + enabled = validUrl, ) { Text(text = stringRes(id = R.string.add), color = Color.White) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/mediaServers/MediaServersViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/mediaServers/MediaServersViewModel.kt index 9805e0d79..90bcbbb4b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/mediaServers/MediaServersViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/mediaServers/MediaServersViewModel.kt @@ -20,6 +20,7 @@ */ package com.vitorpamplona.amethyst.ui.actions.mediaServers +import android.util.Log import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.model.Account @@ -47,12 +48,17 @@ class MediaServersViewModel : ViewModel() { isModified = false _fileServers.update { val obtainedFileServers = obtainFileServers() ?: emptyList() - obtainedFileServers.map { serverUrl -> - Nip96MediaServers - .ServerName( - URIReference.parse(serverUrl).host.value, - serverUrl, - ) + obtainedFileServers.mapNotNull { serverUrl -> + try { + Nip96MediaServers + .ServerName( + URIReference.parse(serverUrl).host.value, + serverUrl, + ) + } catch (e: Exception) { + Log.d("MediaServersViewModel", "Invalid URL in NIP-96 server list") + null + } } } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/encoders/HttpUrlFormatter.kt b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/HttpUrlFormatter.kt new file mode 100644 index 000000000..2e378683b --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/encoders/HttpUrlFormatter.kt @@ -0,0 +1,69 @@ +/** + * Copyright (c) 2024 Vitor Pamplona + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the "Software"), to deal in + * the Software without restriction, including without limitation the rights to use, + * copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the + * Software, and to permit persons to whom the Software is furnished to do so, + * subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS + * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR + * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN + * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + */ +package com.vitorpamplona.quartz.encoders + +import org.czeal.rfc3986.URIReference + +class HttpUrlFormatter { + companion object { + fun displayHost(url: String): String = + url + .trim() + .removePrefix("https://") + .removePrefix("http://") + .removeSuffix("/") + + fun displayUrl(url: String): String = + url + .trim() + .removePrefix("https://") + .removePrefix("http://") + .removeSuffix("/") + + fun addSchemeIfNeeded(url: String): String = + if (!url.startsWith("https://") && !url.startsWith("http://")) { + // TODO: How to identify relays on the local network? + val isLocalHost = url.contains("127.0.0.1") || url.contains("localhost") + if (url.endsWith(".onion") || url.endsWith(".onion/") || isLocalHost) { + "http://${url.trim()}" + } else { + "https://${url.trim()}" + } + } else { + url.trim() + } + + fun normalize(url: String): String { + val newUrl = addSchemeIfNeeded(url) + + return try { + URIReference.parse(newUrl).normalize().toString() + } catch (e: Exception) { + newUrl + } + } + + fun isValidUrl(url: String): Boolean = + runCatching { + URIReference.parse(addSchemeIfNeeded(url)) + }.isSuccess + } +} From 7519fc2f1067710b6dc8fa6a15e263ca487d4912 Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Tue, 2 Jul 2024 17:30:03 -0400 Subject: [PATCH 2/3] Adds Malware Report type --- .../com/vitorpamplona/amethyst/ui/note/types/Report.kt | 1 + .../amethyst/ui/screen/loggedIn/ProfileScreen.kt | 7 +++++++ .../amethyst/ui/screen/loggedIn/ReportNoteDialog.kt | 6 ++---- amethyst/src/main/res/values/strings.xml | 2 ++ .../java/com/vitorpamplona/quartz/events/ReportEvent.kt | 8 ++++++-- 5 files changed, 18 insertions(+), 6 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Report.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Report.kt index 01b0f1beb..9ff23be26 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Report.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/Report.kt @@ -58,6 +58,7 @@ fun RenderReport( ReportEvent.ReportType.SPAM -> stringRes(R.string.spam) ReportEvent.ReportType.IMPERSONATION -> stringRes(R.string.impersonation) ReportEvent.ReportType.ILLEGAL -> stringRes(R.string.illegal_behavior) + ReportEvent.ReportType.MALWARE -> stringRes(R.string.report_malware) ReportEvent.ReportType.OTHER -> stringRes(R.string.other) } }.toSet() diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index a7d3e1aca..dd231bbdb 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -1953,6 +1953,13 @@ fun UserProfileDropDownMenu( onDismiss() }, ) + DropdownMenuItem( + text = { Text(stringRes(id = R.string.report_malware)) }, + onClick = { + accountViewModel.report(user, ReportEvent.ReportType.MALWARE) + onDismiss() + }, + ) } } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ReportNoteDialog.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ReportNoteDialog.kt index 03121a360..9cadd746e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ReportNoteDialog.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ReportNoteDialog.kt @@ -77,12 +77,10 @@ fun ReportNoteDialog( listOf( Pair(ReportEvent.ReportType.SPAM, stringRes(R.string.report_dialog_spam)), Pair(ReportEvent.ReportType.PROFANITY, stringRes(R.string.report_dialog_profanity)), - Pair( - ReportEvent.ReportType.IMPERSONATION, - stringRes(R.string.report_dialog_impersonation), - ), + Pair(ReportEvent.ReportType.IMPERSONATION, stringRes(R.string.report_dialog_impersonation)), Pair(ReportEvent.ReportType.NUDITY, stringRes(R.string.report_dialog_nudity)), Pair(ReportEvent.ReportType.ILLEGAL, stringRes(R.string.report_dialog_illegal)), + Pair(ReportEvent.ReportType.MALWARE, stringRes(R.string.report_malware)), ) val reasonOptions = remember { reportTypes.map { TitleExplainer(it.second) }.toImmutableList() } diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index 3e9cac723..11610d162 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -37,6 +37,7 @@ Report Impersonation Report Explicit Content Report Illegal Behaviour + Report Malware You are using a public key and public keys are read-only. Login with a Private key to be able to reply You are using a public key and public keys are read-only. Login with a Private key to be able to boost posts You are using a public key and public keys are read-only. Login with a Private key to like posts @@ -283,6 +284,7 @@ Malicious impersonation Nudity or graphic content Illegal Behavior + Malware Blocking a user will hide their content in your app. Your notes are still publicly viewable, including to people you block. Blocked users are listed on the Security Filters screen. Report Abuse diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/events/ReportEvent.kt b/quartz/src/main/java/com/vitorpamplona/quartz/events/ReportEvent.kt index 0535c639d..ad2654ab3 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/events/ReportEvent.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/events/ReportEvent.kt @@ -25,7 +25,10 @@ import com.vitorpamplona.quartz.encoders.HexKey import com.vitorpamplona.quartz.signers.NostrSigner import com.vitorpamplona.quartz.utils.TimeUtils -@Immutable data class ReportedKey(val key: String, val reportType: ReportEvent.ReportType) +@Immutable data class ReportedKey( + val key: String, + val reportType: ReportEvent.ReportType, +) // NIP 56 event. @Immutable @@ -119,13 +122,14 @@ class ReportEvent( } } - enum class ReportType() { + enum class ReportType { EXPLICIT, // Not used anymore. ILLEGAL, SPAM, IMPERSONATION, NUDITY, PROFANITY, + MALWARE, OTHER, } } From 464beccd9543e2ec0ed7b78d999cd9f1511f3122 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Tue, 2 Jul 2024 21:32:31 +0000 Subject: [PATCH 3/3] New Crowdin translations by GitHub Action --- amethyst/src/main/res/values-ar/strings.xml | 1 + .../src/main/res/values-bn-rBD/strings.xml | 1 + .../src/main/res/values-en-rGB/strings.xml | 3 + .../src/main/res/values-hi-rIN/strings.xml | 8 +-- amethyst/src/main/res/values-th/strings.xml | 69 +++++++++++++++++++ .../src/main/res/values-zh-rCN/strings.xml | 9 +++ 6 files changed, 87 insertions(+), 4 deletions(-) diff --git a/amethyst/src/main/res/values-ar/strings.xml b/amethyst/src/main/res/values-ar/strings.xml index 48dc59382..408ebcd08 100644 --- a/amethyst/src/main/res/values-ar/strings.xml +++ b/amethyst/src/main/res/values-ar/strings.xml @@ -502,4 +502,5 @@ إغلاق جميع ردود الفعل على هذا المنشور الرد مسح رمز ال QR + البحث عن تطبيق diff --git a/amethyst/src/main/res/values-bn-rBD/strings.xml b/amethyst/src/main/res/values-bn-rBD/strings.xml index 8be25d74f..345cc7e80 100644 --- a/amethyst/src/main/res/values-bn-rBD/strings.xml +++ b/amethyst/src/main/res/values-bn-rBD/strings.xml @@ -504,6 +504,7 @@ পোষা প্রাণী খেলাধুলা ফিটনেস + নীড় দপ্তর খাদ্য নিরাপত্তা-ফিল্টার diff --git a/amethyst/src/main/res/values-en-rGB/strings.xml b/amethyst/src/main/res/values-en-rGB/strings.xml index ca94254a9..c3b6d6414 100644 --- a/amethyst/src/main/res/values-en-rGB/strings.xml +++ b/amethyst/src/main/res/values-en-rGB/strings.xml @@ -1,4 +1,7 @@ + Point to the QR Code + Show QR Profile Image + Scan QR diff --git a/amethyst/src/main/res/values-hi-rIN/strings.xml b/amethyst/src/main/res/values-hi-rIN/strings.xml index 16d3e61c8..ce81c45a7 100644 --- a/amethyst/src/main/res/values-hi-rIN/strings.xml +++ b/amethyst/src/main/res/values-hi-rIN/strings.xml @@ -705,9 +705,9 @@ सार्वजनिक आगतपेटिका पुनःप्रसारक यह पुनःप्रसारक प्रकार आपके प्रकाशित पत्रों को भेजे गये सभी प्रतिवचन, टिप्पणियाँ, इष्टसूचक तथा ज्सापों को प्राप्त करता है। १ - ३ पुनःप्रसारकों को जोडें तथा सुनिश्चित करें कि वे किसी से भी पत्र स्वीकारते हैं। सी॰सं॰ आगतपेटिका पुनःप्रसारक - आपके निजी आगतपेटिका के रूप में १ - ३ पुनःप्रसारकों को जोडें। अन्य लोग इनका उपयोग करेंगे आपको सी॰सं॰ भेजने के लिए। सी॰सं॰ आगतपेटिका पुनःप्रसारकों को किसी से भी सन्देश स्वीकारना चाहिए पर उनका अवरोहण अनुमति केवल आपको देना चाहिए। ये अच्छे विकल्प हैं :\n - inbox.nostr.wine (सशुल्क)\n - you.nostr1.com (व्यक्तिगत पुनःप्रसारक - सशुल्क) + आपके निजी आगतपेटिका के रूप में १ - ३ पुनःप्रसारकों को जोडें। अन्य लोग इनका उपयोग करेंगे आपको सी॰सं॰ भेजने के लिए। सी॰सं॰ आगतपेटिका पुनःप्रसारकों को किसी से भी सन्देश स्वीकारना चाहिए पर उनका अवरोहण अनुमति केवल आपको देना चाहिए। ये अच्छे विकल्प हैं :\n - inbox.nostr.wine (सशुल्क)\n - auth.nostr1.com (शुल्करहित)\n - you.nostr1.com (व्यक्तिगत पुनःप्रसारक - सशुल्क) निजी पुनःप्रसारक - १ - ३ पुनःप्रसारकों को जोडें उन घटनाओं को रखने के लिए जो कोई अन्य नहीं देख सकता जैसे कि पाण्डुलिपियाँ अथवा क्रमक के स्थापना विकल्प। आदर्शतः ये पुनःप्रसारक स्थानीय होने चाहिए अथवा प्रत्येक उपयोगकर्ता के विषयवस्तु अवरोहण के पूर्व परिचय प्रमाणिकरण अनिवार्य होना चाहिए। + १ - ३ पुनःप्रसारकों को जोडें उन घटनाओं को रखने के लिए जो कोई अन्य नहीं देख सकता जैसे कि पाण्डुलिपियाँ अथवा क्रमक के स्थापना विकल्प। आदर्शतः ये पुनःप्रसारक स्थानीय होने चाहिए अथवा प्रत्येक उपयोगकर्ता के विषयवस्तु अवरोहण के पूर्व परिचय प्रमाणीकरण अनिवार्य होना चाहिए। सामान्य पुनःप्रसारक अमेथिस्ट इन पुनःप्रसारकों का प्रयोग करता है आपके पत्रों का अवरोहण करने के लिए। खोज पुनःप्रसारक @@ -761,8 +761,8 @@ भुगतान अनिवार्य - अनुरोध पूरा करने के लिए सेवासंगणक को भुगतान की आवश्यकता है वर्जित - उपयोगकर्ता को यह अनुरोध करने का अधिकार नहीं अप्राप्त - याचित पता ढूँढने में सेवासंगणक असफल - कार्य की अनुमति नहीं - सेवासंगणक याचित कार्य का आलम्बन करता है पर लक्ष्यांकित संसाधन को नहीं - अस्वीकृत - सेवासंगणक कोई विषयवस्तु नहीं ढूँढ सका जिससे अनुरोध की पूर्ति हो सके। + कार्यविधि की अनुमति नहीं - सेवासंगणक याचित कार्यविधि का आलम्बन करता है पर लक्ष्यांकित संसाधन को नहीं + अस्वीकार्य - सेवासंगणक कोई विषयवस्तु नहीं ढूँढ सका जिससे अनुरोध की पूर्ति हो सके। प्रतिनिधि प्रमाणिकरण आवश्यक - उपयोगकर्ता के पास प्रमाणिकरण हेतु वैध परिचयपत्र उपलब्ध नहीं अनुरोध समयसीमा समाप्त - सेवासंगणक समयसीमा पार किया किसी अन्य की प्रतीक्षा में। संघर्ष - सेवासंगणक अनुरोध की पूर्ति नहीं कर सकता क्योंकि संसाधन के साथ संघर्ष है diff --git a/amethyst/src/main/res/values-th/strings.xml b/amethyst/src/main/res/values-th/strings.xml index 70085ba05..ff59429bd 100644 --- a/amethyst/src/main/res/values-th/strings.xml +++ b/amethyst/src/main/res/values-th/strings.xml @@ -45,6 +45,7 @@ เข้าสู่ระบบด้วย private key เพื่อเลิกติดตาม เข้าสู่ระบบด้วย private key เพื่อเพิ่มการซ่อนข้อความ เข้าสู่ระบบด้วย private key เพื่อแก้ไขการซ่อนข้อความ + Zaps ยอดเข้าชม แชร์ แชร์ @@ -150,6 +151,7 @@ "npub, ชื่อผู้ใช้, ข้อความ" เคลียร์ โลโก้ + nsec.. or npub.. รหัสสำหรับเปิดใช้ nsec แสดงรหัสผ่าน ซ่อนรหัสผ่าน @@ -285,8 +287,11 @@ ลบออกจากบุ๊คมาร์คสาธรณะ บริการเชื่อมต่อ wallet อนุญาตให้ Nostr Secret จ่าย zaps โดยไม่ต้องออกจากแอป เพื่อรักษาความลับให้ปลอดภัยและใช้รีเลย์ส่วนตัวหากเป็นไปได้ + Wallet Connect Pubkey บริการเชื่อมต่อ wallet + Wallet Connect Secret แสดง secret key + nsec/ private key ในฐาน16 จำนวนเงินที่นำเข้าในหน่วย sat สร้างโพลล์ ส่วนที่จำเป็น: @@ -298,6 +303,7 @@ Zap ขั้นต่ำ Zap สูงสุด ฉันทามติ + (0–100)% ปิดหลังจาก วัน ไม่สามารถโหวต @@ -332,6 +338,14 @@ ไม่มีการบันทึกบน Nostr, มีแค่ในระบบ Lightning เซิร์ฟเวอร์เก็บข้อมูล LnAddress หรือ @ชื่อผู้ใช้ + Media Servers + ตั้งค่า media server ที่คุณต้องการ + คุณยังไม่ได้ตั้งค่า media servers คุณสามารถใช้รายการของ Amethyst หรือตั้งค่าใหม่ด้านล่าง ↓ + Built-in Media Servers + รายการค่าเริ่มต้นของ Amethyst คุณสามารถเพิ่มทีละรายการหรือเพิ่มทั้งรายการก็ได้ + ใช้รายการค่าเริ่มต้น + เพิ่ม media server + ลบ media server รีเลย์ของคุณ (NIP-95) ไฟล์อยู่บนรีเลย์ของคุณ New NIP: โปรดตรวจสอบว่ามีการรองรับหรือไม่ ตั้งค่า Tor/Orbot @@ -360,6 +374,7 @@ แจ้งเตือนฉันเมื่อข้อความส่วนตัวมาถึง ได้รับ Zaps แจ้งเตือนเมื่อมีคน zaps + %1$s sats จาก %1$s ถึง %1$s การแจ้งเตือน: @@ -440,8 +455,11 @@ การตั้งค่า ตลอดเวลา Wifi เท่านั้น + Unmetered WiFi ไม่ต้องแสดง เสร็จสมบูรณ์ + Simplified + Performance ระบบ(ค่าพื้นฐาน) สว่าง มืด @@ -453,6 +471,7 @@ การแสดงตัวอย่าง URL การไถฟีดแบบลื่นไหล ซ่อนแถบเมนูขณะเลื่อนฟีด + UI Mode เลือกรูปแบบการโพสต์ โหลดรูปภาพ แสปม @@ -505,6 +524,10 @@ ส่งข้อความ ตกลง ไม่สามารถเชื่อมถึง %1$s: %2$s + การประกอบ URL NIP-11 สำหรับ %1$s ล้มเหลว: %2$s + การเชื่อมต่อกับ %1$s ล้มเหลว: %2$s + การแปลผลตอบกลับจาก %1$s ล้มเหลว: %2$s + รีเลย์ปฏิเสธคำขอ %1$s: %2$s ไม่สามารถเชื่อมถึง %1$s: %2$s เกิดข้อผิดพลาด %1$s: %2$s %1$s เกิดข้อผิดพลาด %2$s @@ -521,6 +544,7 @@ ไม่พบการตั้งค่า Lightning ผู้ใช้ %1$s ไม่ได้ตั้งค่า lightning address เพื่อรับ sats เปอร์เซ็นต์ + 25 แบ่ง Zaps กับ ส่งต่อ Zaps ไปยัง ไม่พบกระเป๋า Lightning @@ -585,9 +609,11 @@ สวัสดี! สิ่งนี้ยังมีอยู่ไหม? ขายบางอย่าง ชื่อ + iPhone 13 สภาพ หมวดหมู่ ราคา (หน่วย Sats) + 1000 ตำแหน่ง เมือง, รัฐ, ประเทศ ใหม่ @@ -621,6 +647,8 @@ เซอเวอร์ไม่ตอบสนองหลังจากอัพโหลดแล้ว ไม่สามารถโหลดข้อมูลสื่อได้ ไม่สามารถเตรียมข้อมูลสำหรับอัพโหลด : %1$s + การอัปโหลดล้มเหลว: %1$s + การลบล้มเหลว: %1$s แก้ไขฉบับร่าง เข้าสู่ระบบด้วย qr code เส้นทาง @@ -630,6 +658,7 @@ ข้อความ การแจ้งเตือน ทั่วโลก + Shorts ตัวกรองความปลอดภัย โพสต์ใหม่ สร้าง Shorts: รูปภาพ/วิดีโอ @@ -639,6 +668,8 @@ ตอบกลับ แชร์/โควท ไลค์ + Zap + เปลี่ยน reactions เริ่มต้น รูปโปร์ไฟล์ของ %1$s รีเลย์ %1$s แสดงรายการรีเลย์ @@ -646,12 +677,14 @@ ตัวเลือกรายการรีเลย์ โพลล์ ยกเลิกโพลล์ + Bitcoin Invoice ยกเลิก Bitcoin Invoice ยกเลิกการขายสิ่งนี้ ระดมทุน ยกเลิกการระดมทุน ตำแหน่ง ลบตำแหน่งออก + แบ่งปัน zap ยกเลิก Zap split เพิ่มคําเตือนเนื้อหา ลบคําเตือนเนื้อหา @@ -693,11 +726,14 @@ เวอร์ชันนี้นำเสนอโดย: เวอร์ชัน %1$s ขอบคุณ! + Max Limit การเขียนที่ถูกจำกัด คัดลอกมาจาก คัดลอก + Git Repository: %1$s เว็บไซน์ สำเนา: + OTS: %1$s Timestamp ถูกยืนยัน มีหลักฐานว่าโพสต์นี้มีการลงนามก่อน %1$s หลักฐานถูกประทับตราใน Bitcoin blockchain ณ วันและเวลาดังกล่าว แก้ไขโพสต์ @@ -706,6 +742,8 @@ แก้ไขด่วน ยอมรับการแนะนำนี้ ดาวน์โหลด + เปิด Lyrics + ปิด Lyrics ปิดผนึกข้อความแล้ว คลิกเพื่อเปิดข้อความ เปิดผนึกข้อความไว้ คลิกเพื่อปิด ส่ง @@ -717,9 +755,40 @@ ไม่สามารถกดรีแอคโน้ตฉบับร่างได้ ไม่สามารถ zap โน้ตฉบับร่างได้ โน๊ตฉบับร่าง + From Msg กำลังค้นหาแอพพลิเคชั่น Dvm ส่งคำขอเรียบร้อย และกำลังรอการตอบกลับ กำลังรองานจาก DVM คำขอชำระเงินถูกส่งแล้ว รอการยืนยันจาก wallet ของคุณ รอการยืนยันการชำระเงินหรือผลลัพธ์จาก DVM + คำขอไม่ถูกต้อง - เซิร์ฟเวอร์ไม่สามารถหรือไม่ยอมดำเนินการตามคำขอ + ไม่ได้รับอนุญาต - ผู้ใช้ไม่มีข้อมูลประจำตัวการตรวจสอบที่ถูกต้อง + ต้องชำระเงิน - เซิร์ฟเวอร์ต้องการการชำระเงินเพื่อดำเนินการตามคำขอ + ไม่สามารถเข้าถึงได้ - ผู้ใช้ไม่มีสิทธิ์การเข้าถึงในการทำคำขอ + ไม่พบที่อยู่ - เซิร์ฟเวอร์ไม่สามารถหาที่อยู่ที่ขอได้ + วิธีการไม่อนุญาต - เซิร์ฟเวอร์รองรับวิธีการขอ แต่ไม่รองรับทรัพยากรเป้าหมาย + ไม่ยอมรับ - เซิร์ฟเวอร์ไม่พบเนื้อหาใดที่ตรงตามคำขอ + ต้องการการตรวจสอบพร็อกซี - ผู้ใช้ไม่มีข้อมูลประจำตัวการตรวจสอบที่ถูกต้อง + คำขอหมดเวลา - เซิร์ฟเวอร์หมดเวลารอคำตอบจากบุคคลอื่น + ความขัดแย้ง - เซิร์ฟเวอร์ไม่สามารถดำเนินการตามคำขอได้เนื่องจากมีความขัดแย้งกับทรัพยากร + ไม่พบ - เนื้อหาที่ร้องขอได้ถูกลบถาวรจากเซิร์ฟเวอร์และจะไม่ถูกกู้คืน + ต้องการความยาว - เซิร์ฟเวอร์ปฏิเสธคำขอเพราะต้องการความยาวที่กำหนดไว้ + ข้อกำหนดเบื้องต้นล้มเหลว - ข้อกำหนดเบื้องต้นของคำขอในฟิลด์หัวเรื่องที่เซิร์ฟเวอร์ไม่สามารถตอบสนองได้ + ข้อมูลขนาดใหญ่เกินไป - คำขอมีขนาดใหญ่กว่าขีดจำกัดที่เซิร์ฟเวอร์กำหนด และเซิร์ฟเวอร์ปฏิเสธที่จะดำเนินการ + URI ยาวเกินไป - URL ที่ร้องขอโดยไคลเอนต์ยาวเกินกว่าที่เซิร์ฟเวอร์จะดำเนินการได้ + ประเภทสื่อไม่รองรับ - คำขอใช้รูปแบบสื่อที่เซิร์ฟเวอร์ไม่รองรับ + จำนวนข้อมูลไม่เหมาะสม - เซิร์ฟเวอร์ไม่สามารถตอบสนองค่าที่ระบุในฟิลด์หัวเรื่องช่วงของคำขอได้ + การคาดหวังล้มเหลว - เซิร์ฟเวอร์ไม่สามารถตอบสนองข้อกำหนดที่ระบุในฟิลด์หัวเรื่องของคำขอ Expect + ต้องการการอัปเกรด - เซิร์ฟเวอร์ปฏิเสธที่จะดำเนินการตามคำขอโดยใช้โปรโตคอลปัจจุบัน เว้นแต่ไคลเอนต์จะอัปเกรดเป็นโปรโตคอลที่แตกต่าง + ข้อผิดพลาดภายในเซิร์ฟเวอร์ - เซิร์ฟเวอร์พบข้อผิดพลาดที่ไม่คาดคิดและไม่สามารถดำเนินการตามคำขอได้ + ไม่ไสามารถดำเนินการได้ - เซิร์ฟเวอร์ไม่สามารถตอบสนองคำขอหรือไม่รู้จักวิธีการขอ + Bad Gateway - เซิร์ฟเวอร์ทำหน้าที่เป็นเกตเวย์และได้รับการตอบกลับที่ไม่ถูกต้องจากโฮสต์ + บริการไม่พร้อมใช้งาน - มักเกิดขึ้นเมื่อเซิร์ฟเวอร์มีการใช้งานมากเกินไปหรือหยุดทำงานเพื่อบำรุงรักษา + Gateway หมดเวลา - เซิร์ฟเวอร์ทำหน้าที่เป็นเกตเวย์หรือพร็อกซีและหมดเวลารอการตอบกลับ + ไม่รองรับเวอร์ชัน HTTP - เซิร์ฟเวอร์ไม่รองรับเวอร์ชัน HTTP ที่อยู่ในคำขอ + เซิร์ฟเวอร์มีข้อผิดพลาดในการกำหนดค่าภายใน + พื้นที่จัดเก็บไม่เพียงพอ - เซิร์ฟเวอร์มีพื้นที่จัดเก็บไม่เพียงพอที่จะดำเนินการตามคำขอได้สำเร็จ + พบลูป - เซิร์ฟเวอร์ตรวจพบการวนลูปไม่สิ้นสุดขณะประมวลผลคำขอ + ต้องการการตรวจสอบเครือข่าย - ไคลเอนต์ต้องได้รับการตรวจสอบเพื่อเข้าถึงเครือข่าย + เพิ่ม เซิร์ฟเวอร์ NIP-96 diff --git a/amethyst/src/main/res/values-zh-rCN/strings.xml b/amethyst/src/main/res/values-zh-rCN/strings.xml index 0a925d1cb..8f99227cb 100644 --- a/amethyst/src/main/res/values-zh-rCN/strings.xml +++ b/amethyst/src/main/res/values-zh-rCN/strings.xml @@ -339,6 +339,14 @@ Nostr 上没有痕迹,仅在闪电上 文件服务器 闪电地址或 @User + 媒体服务器 + 设置首选媒体上传服务器。 + 尚未设置自定义媒体服务器。可以使用默认的内置服务器列表或自行添加 ↓ + 内置媒体服务器 + Amethyst 的默认列表。可单独添加或添加整个列表。 + 使用默认列表 + 添加媒体服务器 + 删除媒体服务器 你的中继器 (NIP-95) 文件由你的中继器托管。新的 NIP:检查它们是否支持 Tor/Orbot 设置 @@ -785,4 +793,5 @@ Insufficient Storage - 服务器没有足够的存储空间用于处理该请求。 Loop Detected - 服务器处理该请求时检测到死循环。 Network Authentication Required - 客户端必须通过认证才能访问该网络。 + 添加 NIP-96 服务器