From dac1c3717af4fa81edbe2cac9b27027973bf5bd3 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Tue, 27 May 2025 18:49:35 +0200 Subject: [PATCH 01/29] update string ids to force new translations --- .../ui/screen/loggedIn/discover/DiscoverScreen.kt | 6 +++--- .../screen/loggedIn/profile/gallery/QuickActionGallery.kt | 2 +- amethyst/src/main/res/values/strings.xml | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/DiscoverScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/DiscoverScreen.kt index 896e468a1..b037e6d3b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/DiscoverScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/discover/DiscoverScreen.kt @@ -142,21 +142,21 @@ fun DiscoverScreen( LongTextNoteEvent.KIND, ), TabItem( - R.string.discover_content, + R.string.discover_content_v2, discoveryContentNIP89FeedContentState, "DiscoverDiscoverContent", ScrollStateKeys.DISCOVER_CONTENT, AppDefinitionEvent.KIND, ), TabItem( - R.string.discover_live, + R.string.discover_live_v2, discoveryLiveFeedContentState, "DiscoverLive", ScrollStateKeys.DISCOVER_LIVE, LiveActivitiesEvent.KIND, ), TabItem( - R.string.discover_community, + R.string.discover_community_v2, discoveryCommunityFeedContentState, "DiscoverCommunity", ScrollStateKeys.DISCOVER_COMMUNITY, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/gallery/QuickActionGallery.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/gallery/QuickActionGallery.kt index ad1c969fa..d32bf9456 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/gallery/QuickActionGallery.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/profile/gallery/QuickActionGallery.kt @@ -60,7 +60,7 @@ fun DeleteFromGalleryDialog( ) { QuickActionAlertDialogOneButton( title = stringRes(R.string.quick_action_request_deletion_gallery_title), - textContent = stringRes(R.string.quick_action_request_deletion_gallery_alert_body), + textContent = stringRes(R.string.quick_action_request_deletion_gallery_alert_body_v2), buttonIcon = Icons.Default.Delete, buttonText = stringRes(R.string.quick_action_delete_dialog_btn), onClickDoOnce = { diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index 144044dec..cbcfc0fb4 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -326,7 +326,7 @@ Unfollow Follow Delete from Gallery - Remove this media from your Gallery. + Remove this media from your Gallery. Request Deletion Amethyst will request that your note be deleted from the relays you are currently connected to. There is no guarantee that your note will be permanently deleted from those relays, or from other relays where it may be stored. Block @@ -661,10 +661,10 @@ Follow Packs Reads - Feed Algorithms + Feed Algorithms Marketplace - Live Streams - Communities + Live Streams + Communities Chats Approved Posts From 293bd2557b267c44dcdcecbf9632c1ccdd2fb756 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 28 May 2025 07:42:20 +0200 Subject: [PATCH 02/29] remove unused imports amethyst --- .../src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt | 1 - .../amethyst/ui/screen/loggedIn/PrecacheNewNotesProcessor.kt | 1 - .../amethyst/ui/screen/loggedIn/geohash/GeoHashPostScreen.kt | 1 - .../amethyst/ui/screen/loggedIn/hashtag/HashtagPostScreen.kt | 1 - .../amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt | 1 - 5 files changed, 5 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt index 582502903..184e01dfb 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/LocalCache.kt @@ -20,7 +20,6 @@ */ package com.vitorpamplona.amethyst.model -import android.R.attr.version import android.util.Log import android.util.LruCache import androidx.compose.runtime.Stable diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/PrecacheNewNotesProcessor.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/PrecacheNewNotesProcessor.kt index b3a15cb0e..1418caa61 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/PrecacheNewNotesProcessor.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/PrecacheNewNotesProcessor.kt @@ -24,7 +24,6 @@ import android.util.Log import com.vitorpamplona.amethyst.Amethyst import com.vitorpamplona.amethyst.model.Account import com.vitorpamplona.amethyst.model.LocalCache -import com.vitorpamplona.amethyst.model.LocalCache.indexDraftAsRealEvent import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.quartz.experimental.edits.PrivateOutboxRelayListEvent import com.vitorpamplona.quartz.nip01Core.core.Event diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/GeoHashPostScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/GeoHashPostScreen.kt index 14bd8d82b..9d56277f2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/GeoHashPostScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/GeoHashPostScreen.kt @@ -23,7 +23,6 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.geohash import android.net.Uri import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.viewmodel.compose.viewModel diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/HashtagPostScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/HashtagPostScreen.kt index 0a828d70c..fd0934ac3 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/HashtagPostScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/hashtag/HashtagPostScreen.kt @@ -23,7 +23,6 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.hashtag import android.net.Uri import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.text.input.TextFieldValue import androidx.lifecycle.viewmodel.compose.viewModel diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt index b3909a8b6..36061b036 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/home/ShortNotePostScreen.kt @@ -50,7 +50,6 @@ import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment.Companion.CenterVertically From 173a27f085cf731998ede3b451218e5de6dcd40e Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Wed, 28 May 2025 06:20:54 +0000 Subject: [PATCH 03/29] New Crowdin translations by GitHub Action --- .../src/main/res/values-cs-rCZ/strings.xml | 8 +- .../src/main/res/values-de-rDE/strings.xml | 4 + .../src/main/res/values-hi-rIN/strings.xml | 4 + .../src/main/res/values-hu-rHU/strings.xml | 14 +++ .../src/main/res/values-lv-rLV/strings.xml | 118 ++++++++++++++++++ .../src/main/res/values-pl-rPL/strings.xml | 3 + .../src/main/res/values-pt-rBR/strings.xml | 4 + .../src/main/res/values-sv-rSE/strings.xml | 4 + .../src/main/res/values-zh-rCN/strings.xml | 4 + 9 files changed, 161 insertions(+), 2 deletions(-) create mode 100644 amethyst/src/main/res/values-lv-rLV/strings.xml diff --git a/amethyst/src/main/res/values-cs-rCZ/strings.xml b/amethyst/src/main/res/values-cs-rCZ/strings.xml index 80fa7a75d..19d90f07a 100644 --- a/amethyst/src/main/res/values-cs-rCZ/strings.xml +++ b/amethyst/src/main/res/values-cs-rCZ/strings.xml @@ -3,9 +3,9 @@ Nasměrujte na QR kód Zobrazit QR kód Profilový obrázek - Profilový obrázek + Váš profilový obrázek Skenovat QR kód - Zobrazit přesto + Přesto zobrazit Tento příspěvek byl skryt, protože zmiňuje vaše skryté uživatele nebo slova Příspěvek byl označen jako nevhodný uživatelem Příspěvek nenalezen @@ -614,6 +614,8 @@ Přidá Geohash vaší polohy do příspěvku. Veřejnost bude vědět, že se nacházíte do 5 km od aktuální polohy Lokace-Exkluzívní příspěvek Uvidí to pouze následovníci umístění. Tvoji obecní následovníci to neuvidí. + Hashtag-exkluzivní příspěvek + Uvidí to pouze následovníci hashtagu. Tvůj všeobecní následovníci to neuvidí. Načítání umístění Žádná lokace oprávnění Přidat varování o citlivém obsahu před zobrazením vašeho obsahu. Toto je ideální pro obsah NSFW (nebezpečné pro práci) nebo obsah, který někteří lidé mohou považovat za urážlivý nebo znepokojující @@ -816,6 +818,7 @@ Nové Shorts: obrázky nebo videa Nová poznámka komunity Nový produkt + Nový geoexkluzivní příspěvek Otevřít všechny reakce pro tento příspěvek Zavřít všechny reakce na tento příspěvek Odpověď @@ -968,4 +971,5 @@ Relé chatu Relé, ke kterému se všichni uživatelé tohoto chatu připojují Sdílet obrázek… + Vyhledávání hashtag: #%1$s diff --git a/amethyst/src/main/res/values-de-rDE/strings.xml b/amethyst/src/main/res/values-de-rDE/strings.xml index 3249a1b03..00193423a 100644 --- a/amethyst/src/main/res/values-de-rDE/strings.xml +++ b/amethyst/src/main/res/values-de-rDE/strings.xml @@ -619,6 +619,8 @@ anz der Bedingungen ist erforderlich Fügt dem Beitrag einen Geohash Ihres Standorts hinzu. Die Öffentlichkeit wird wissen, dass Sie sich innerhalb von 5 km (3 mi) vom aktuellen Standort befinden Standort-exklusiver Beitrag Nur Anhänger des Ortes werden es sehen. Deine allgemeinen Anhänger werden es nicht sehen. + Hashtag-exklusive Beitrag + Nur die Anhänger des Hashtags werden ihn sehen. Deine allgemeinen Follower werden ihn nicht sehen. Standort wird geladen Keine Standortberechtigungen Fügt eine Warnung für sensiblen Inhalt hinzu, bevor Ihr Inhalt angezeigt wird. Dies ist ideal für NSFW-Inhalte (nicht sicher für die Arbeit) oder Inhalte, die manche Menschen als anstößig oder verstörend empfinden könnten @@ -821,6 +823,7 @@ anz der Bedingungen ist erforderlich Neue Kurzfilme: Bilder oder Videos Neue Community-Notiz Neues Produkt + Neuer Geo-Exklusiver Beitrag Alle Reaktionen auf diesen Beitrag öffnen Alle Reaktionen auf diesen Beitrag schließen Antworten @@ -973,4 +976,5 @@ anz der Bedingungen ist erforderlich Chat-Relais Das Relais, mit dem sich alle Benutzer dieses Chats verbinden Bild teilen… + Suche Hashtag: #%1$s diff --git a/amethyst/src/main/res/values-hi-rIN/strings.xml b/amethyst/src/main/res/values-hi-rIN/strings.xml index ce10c57e4..1f3554b3a 100644 --- a/amethyst/src/main/res/values-hi-rIN/strings.xml +++ b/amethyst/src/main/res/values-hi-rIN/strings.xml @@ -616,6 +616,8 @@ आपका भूगोलिक स्थान विभेदक जोडता है पत्र में। जनता जान जाएगी कि आप वर्तमान स्थान से ५ कि॰मे॰ (३ मी॰) की दूरी के अन्दर हैं स्थल विशेष पत्र स्थल के अनुचर ही देखेंगे। आपके सामान्य अनुचर नहीं देखेंगे। + विषयसूचक विशेष पत्र + केवल विषयसूचक के अनुचर इसे देखेंगे। आपके सामान्य अनुचर नहीं देखेंगे। स्थान प्राप्त किया जा रहा है स्थान प्राप्त करने की अनुमति नहीं आपके विषयवस्तु दिखाने से पूर्व संवेदनशील विषयवस्तु चेतावनी जोडता है। यह आदर्श है किसी कार्यालय अनुचित विषयवस्तु के लिए अथवा जो कुछ लोगों के लिए आपत्तिजनक अथवा व्याकुल करनेवाला लग सकता है @@ -818,6 +820,7 @@ नये छोटे : चित्र अथवा चलचित्र नया सामुदायिक टीका नया उत्पाद + नया स्थान विशेष पत्र इस पत्र प्रकाशन के सभी प्रतिक्रियाओं को खोलें इस पत्र प्रकाशन के सभी प्रतिक्रियाओं को अवरोधित करें उत्तर @@ -970,4 +973,5 @@ चर्चा पुनःप्रसारक वह पुनःप्रसारक जिससे इस चर्चा के सभी उपयोगकर्ता जुडते हैं चित्र बाँटें… + विषयसूचक खोज : #%1$s diff --git a/amethyst/src/main/res/values-hu-rHU/strings.xml b/amethyst/src/main/res/values-hu-rHU/strings.xml index b7e533e7a..3bbf9e032 100644 --- a/amethyst/src/main/res/values-hu-rHU/strings.xml +++ b/amethyst/src/main/res/values-hu-rHU/strings.xml @@ -496,9 +496,18 @@ Az érzékeny tartalmat mindig rejtse el Az érzékeny tartalmat mindig jelenítse meg A tartalomra vonatkozó figyelmeztetéseket mindig jelenítse meg + Elrejtés + Megjelenítés + Figyelmeztetés Ajánlott alkalmazások: Az idegenektől érkező kéretlen tartalmak szűrése Figyelmeztessen amikor a bejegyzések jelentve vannak azok által akiket követek + Kéretlen tartalomszűrő + Elrejti az ismeretlen felhasználók hozzászólásait, amelyek pontosan ugyanazok voltak 5 vagy több alkalommal + Figyelmeztetés a jelentésekre + Figyelmeztető üzenet jelenik meg, ha a bejegyzéseket az Ön által követett felhasználók 5 vagy annál többször jelentették + Érzékeny tartalom megjelenítése + Figyelmeztető üzenet jelenik meg, ha a bejegyzés szerzője érzékenynek jelölte a hozzászólást Új reakció-szimbólum A felhasználó számára nincsenek előre kiválasztott reakciótípusok. Hosszan nyomja meg a szív gombot a módosításhoz Zap-gyűjtés @@ -607,6 +616,8 @@ Hozzáadja a helyének geohash-sét a bejegyzéséhez. A nyilvánosság tudni fogja, hogy a jelenlegi helytől 5 km-en (3 mi) belül tertózkodik Helyszín-alapú bejegyzés Csak a helyszín követői láthatják. Az általános követők nem fogják látni. + Hashtag-exkluzív bejegyzés + Csak a hashtag követői fogják látni, de az Ön általános követői viszont nem. Helyszín betöltése… A helyszín-meghatározás nincs engedélyezve Hozzáadja az érzékeny tartalomra vonatkozó figyelmeztetést a tartalom megjelenítése előtt. Ez ideális bármilyen NSFW tartalom vagy olyan tartalom esetén, amelyet egyesek sértőnek vagy zavarónak találhatnak @@ -809,6 +820,7 @@ Új rövidek: képek vagy videók Új közösségi bejegyzés Új termék + Új hely-exkluzív bejegyzés A bejegyzésre adott összes reakció kibontása A bejegyzésre adott összes reakció összecsukása Válasz @@ -960,4 +972,6 @@ Privát üzenet Csevegési átjátszó Az átjátszó, amelyhez a csevegés összes felhasználója csatlakozik + Kép megosztása… + Hashtag keresése: #%1$s diff --git a/amethyst/src/main/res/values-lv-rLV/strings.xml b/amethyst/src/main/res/values-lv-rLV/strings.xml new file mode 100644 index 000000000..107dafa9f --- /dev/null +++ b/amethyst/src/main/res/values-lv-rLV/strings.xml @@ -0,0 +1,118 @@ + + + Profila attēls + Jūsu profila attēls + 👀 + Kanāla attēls + Grupas attēls + Nezināms + Kopēt tekstu + Bloķēt / Sūdzēties + + Skatījumi + rediģēts + Pievienot + " un " + " Seko" + " Sekotāji" + "%1$s seko" + "%1$s sekotāji" + Profils + Maksāt + 😎 + Jauns kanāls + Kanāla nosaukums + Attēla URL + Apraksts + Saglabāt + Izveidot + Atcelt + Baiti + Kļūdas + Par mani + LN adrese + Augšupielādēt attēlu + Augšupielādē… + Bloķētie lietotāji + Piezīmes + Atbildes + Galerija + Sekot + Atbloķēt + Atbloķēt lietotāju + Lietotnes logo + Rādīt paroli + Slēpt paroli + Izveidot kontu + Izveidot jaunu kontu + Ģenerēt jaunu atslēgu + Atsvaidzināt + aprakstu uz + un attēlu uz + Kanāls izveidots + Noņemt + Automātiski + uz + Vienmēr tulkot %1$s + Nostr adrese + nekad + tagad + Kļūda + Pievienot jaunu kontu + Konti + Atlasīt kontu + Pievienot jaunu kontu + Kopēt tekstu + Dzēst + Sekot + @string/block_only + Dzēst + @string/block_only + Dzēst + + Iemesls + Bloķēt un sūdzēties + Bloķēt + Grāmatzīmes + Aizvērt pēc + dienām + Pievienot attēlu + Pievienot video + Pievienot dokumentu + Augšupielādē + Lejupielādē + Kļūda + Tor iestatījumi + + + Noklusējuma ports ir 9050 + Nederīgs porta numurs + Versija + Valstis + Valodas + Birkas + Valoda + Motīvs + Nevar augšupielādēt + Noteikumi + Labi + Meklēt + Profila attēls + Kategorija + Apģērbs + Elektronika + Grāmatas + Mājdzīvnieki + Sports + Māksla + Ēdiens + Augšupielādes kļūda: %1$s + Neizdevās augšupielādēt: %1$s + Meklēt + Paziņojumi + Paldies! + @string/torrent_download + Torrenta datne + Lejupielādēt + Nav uzstādītas torrent lietotnes, kas atvērtu un lejupielādētu datni. + diff --git a/amethyst/src/main/res/values-pl-rPL/strings.xml b/amethyst/src/main/res/values-pl-rPL/strings.xml index b49bdfadc..0e44441c1 100644 --- a/amethyst/src/main/res/values-pl-rPL/strings.xml +++ b/amethyst/src/main/res/values-pl-rPL/strings.xml @@ -611,6 +611,8 @@ Dodaje Geohash twojej lokalizacji do wpisu. Użytkownicy będą wiedzieli, że jesteś mniej niż 5 km od bieżącej lokalizacji Post ekskluzywny dla lokalizacji Tylko obserwatorzy z twojej lokalizacji zobaczą to. Twoi ogólni obserwatorzy tego nie zobaczą. + Wpis hashtagowy + Tylko obserwujący ten hashtag zobaczą go. Twoi ogólni obserwujący go nie zobaczą. Pobieranie lokalizacji Brak dostępu do lokalizacji Dodaje ostrzeżenie o wrażliwych treściach przed wyświetleniem treści. Jest to idealne dla dowolnych treści NSFW lub treści, które niektóre osoby mogą uznać za obraźliwe lub przeszkadzające @@ -964,4 +966,5 @@ Wiadomość prywatna Transmiter, z którym łączą się wszyscy użytkownicy tego czatu Udostępnij zdjęcie… + Szukaj tagu: #%1$s diff --git a/amethyst/src/main/res/values-pt-rBR/strings.xml b/amethyst/src/main/res/values-pt-rBR/strings.xml index 89cb77845..2fd8f75f3 100644 --- a/amethyst/src/main/res/values-pt-rBR/strings.xml +++ b/amethyst/src/main/res/values-pt-rBR/strings.xml @@ -614,6 +614,8 @@ Adicione um geohash da sua localização à postagem. O público saberá que você está a 5 km (3 milhas) do local atual Postagem exclusiva de localização Somente seguidores da localização verão isso. Seus seguidores gerais não verão isso. + Postagem exclusiva de Hashtag + Somente seguidores da hashtag verão isso. Seus seguidores gerais não verão isso. Carregando localização Sem permissões para localização Adiciona aviso de conteúdo sensível antes de mostrar seu conteúdo. Isso é ideal para qualquer conteúdo NSFW ou conteúdo que algumas pessoas possam considerar ofensivo ou perturbador @@ -816,6 +818,7 @@ Novos Vídeos Curtos: imagens ou vídeos Nova Nota da Comunidade Produto Novo + Nova Postagem Geo-Exclusiva Abrir todas as reações a esta postagem Fechar todas as reações a esta postagem Responder @@ -968,4 +971,5 @@ Relé de chat O relé a qual todos os usuários deste chat se conectam Compartilhar imagem… + Pesquisar hashtag: #%1$s diff --git a/amethyst/src/main/res/values-sv-rSE/strings.xml b/amethyst/src/main/res/values-sv-rSE/strings.xml index 4a4c85806..ff8d6b8c9 100644 --- a/amethyst/src/main/res/values-sv-rSE/strings.xml +++ b/amethyst/src/main/res/values-sv-rSE/strings.xml @@ -613,6 +613,8 @@ Lägger till en Geohash av din plats i inlägget. Allmänheten kommer att veta att du befinner dig inom 5 km från nuvarande plats Plats-exklusivt inlägg Endast anhängare av platsen kommer att se den. Dina allmänna anhängare kommer inte att se den. + Hashtag-exklusivt inlägg + Endast anhängare av hashtaggen kommer att se den. Dina generella följare kommer inte att se den. Laddar position Inga platsbehörigheter Lägger till en varning för känsligt innehåll innan ditt innehåll visas. Detta är idealiskt för NSFW-innehåll (inte säkert för arbete) eller innehåll som vissa personer kan uppleva som stötande eller störande @@ -815,6 +817,7 @@ Nya kort: bilder eller videor Nytt Community-meddelande Ny produkt + Nytt Geo-Exklusivt inlägg Öppna alla reaktioner på detta inlägg Stäng alla reaktioner på detta inlägg Svara @@ -967,4 +970,5 @@ Chatt Relä Reläet som alla användare av den här chatten ansluter till Dela bild… + Sök hashtag: #%1$s diff --git a/amethyst/src/main/res/values-zh-rCN/strings.xml b/amethyst/src/main/res/values-zh-rCN/strings.xml index 33dc34e17..c303fb32c 100644 --- a/amethyst/src/main/res/values-zh-rCN/strings.xml +++ b/amethyst/src/main/res/values-zh-rCN/strings.xml @@ -616,6 +616,8 @@ 将你所在位置的地理位置添加到帖子。公众会知道你在当前位置的5公里之内(3英里) 位置限定帖子 只有处于同一地理位置的关注者才能看到贴文。其他追随者无法看到。 + 话题标签专属帖子 + 只有话题标签的关注者才会看到它。您的一般关注者不会看到它。 加载位置中 没有位置信息权限 在显示你的内容之前添加敏感的内容警告。针对任何 NSFW 内容或一些人可能觉得有冒犯性或令人不安的内容。 @@ -818,6 +820,7 @@ 新短篇媒体:图像或视频 新社区笔记 新产品 + 新建地理位置专属帖子 展开对此帖子的所有回应 收起对此帖子的所有回应 回复 @@ -970,4 +973,5 @@ 聊天中继 此聊天所有用户都连接到的中继 分享图片… + 搜索话题标签:#%1$s From 6b1662da24891280a167d930020d942bc24286b1 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Fri, 30 May 2025 18:40:22 +0000 Subject: [PATCH 04/29] New Crowdin translations by GitHub Action --- amethyst/src/main/res/values-ar-rSA/strings.xml | 2 -- amethyst/src/main/res/values-bn-rBD/strings.xml | 2 -- amethyst/src/main/res/values-cs-rCZ/strings.xml | 4 ---- amethyst/src/main/res/values-de-rDE/strings.xml | 4 ---- amethyst/src/main/res/values-el-rGR/strings.xml | 2 -- amethyst/src/main/res/values-eo-rUY/strings.xml | 2 -- amethyst/src/main/res/values-es-rES/strings.xml | 4 ---- amethyst/src/main/res/values-es-rMX/strings.xml | 4 ---- amethyst/src/main/res/values-es-rUS/strings.xml | 4 ---- amethyst/src/main/res/values-fa-rIR/strings.xml | 4 ---- amethyst/src/main/res/values-fi-rFI/strings.xml | 1 - amethyst/src/main/res/values-fr-rFR/strings.xml | 4 ---- amethyst/src/main/res/values-hi-rIN/strings.xml | 4 ---- amethyst/src/main/res/values-hu-rHU/strings.xml | 4 ---- amethyst/src/main/res/values-in-rID/strings.xml | 2 -- amethyst/src/main/res/values-it-rIT/strings.xml | 2 -- amethyst/src/main/res/values-ja-rJP/strings.xml | 2 -- amethyst/src/main/res/values-nl-rNL/strings.xml | 4 ---- amethyst/src/main/res/values-pl-rPL/strings.xml | 4 ---- amethyst/src/main/res/values-pt-rBR/strings.xml | 4 ---- amethyst/src/main/res/values-ru-rRU/strings.xml | 2 -- amethyst/src/main/res/values-sl-rSI/strings.xml | 4 ---- amethyst/src/main/res/values-sv-rSE/strings.xml | 4 ---- amethyst/src/main/res/values-sw-rKE/strings.xml | 2 -- amethyst/src/main/res/values-ta-rIN/strings.xml | 2 -- amethyst/src/main/res/values-th-rTH/strings.xml | 4 ---- amethyst/src/main/res/values-uk-rUA/strings.xml | 2 -- amethyst/src/main/res/values-zh-rCN/strings.xml | 4 ---- amethyst/src/main/res/values-zh-rTW/strings.xml | 4 ---- 29 files changed, 91 deletions(-) diff --git a/amethyst/src/main/res/values-ar-rSA/strings.xml b/amethyst/src/main/res/values-ar-rSA/strings.xml index 6bbdc431d..20539cee1 100644 --- a/amethyst/src/main/res/values-ar-rSA/strings.xml +++ b/amethyst/src/main/res/values-ar-rSA/strings.xml @@ -274,7 +274,6 @@ الغاء المتابعة متابعة إزالته من المعرض - إزالة هذه الوسيطة من المعرض. طلب حذفها سيطلب Amethyst حذف ملاحظتك من المرحلات المتصل بها حاليا، لا يوجد ضمان لحذفها من هذه المرحلات أو من المرحلات الأخرى التي ربما حفظت فيها. حظر @@ -476,7 +475,6 @@ تسجيل الخروج سوف يحذف معلوماتك من على الجهاز. تأكد من نسخ مفتاحك الخاص لتجنب فقدان الحساب. هل تريد ألاستمرار؟ العلامات المُتابعة مرحلات - مجتمع االدردشات المنشورات الموافق عليها هذه المجموعة ليس لديها وصف أو قواعد. diff --git a/amethyst/src/main/res/values-bn-rBD/strings.xml b/amethyst/src/main/res/values-bn-rBD/strings.xml index 96b1f533e..267350401 100644 --- a/amethyst/src/main/res/values-bn-rBD/strings.xml +++ b/amethyst/src/main/res/values-bn-rBD/strings.xml @@ -417,8 +417,6 @@ লগ আউট করলে আপনার সমস্ত স্থানীয় তথ্য মুছে যাবে। অ্যাকাউন্ট সুরক্ষিত রাখতে আপনার ব্যক্তিগত চাবিটি নিরাপদে সংরক্ষিত আছে কিনা নিশ্চিত হোন। সামনে আগাতে চান? অনুসৃত ট্যাগগুলি রিলেগুলি - লাইভ - কম্যুনিটি বার্তালাপগুলি অনুমোদিত পোস্টগুলি এই দলটির কোনো বিবরণ কিংবা নীতিমালা নেই। এগুলো যুক্ত করতে দলনেতার সাথে কথা বলুন diff --git a/amethyst/src/main/res/values-cs-rCZ/strings.xml b/amethyst/src/main/res/values-cs-rCZ/strings.xml index 19d90f07a..0a8f25027 100644 --- a/amethyst/src/main/res/values-cs-rCZ/strings.xml +++ b/amethyst/src/main/res/values-cs-rCZ/strings.xml @@ -298,7 +298,6 @@ Přestat sledovat Sledovat Odstranit z galerie - Odstraňte tato média z vaší galerie, můžete je přidat později Požadavek na smazání Amethyst požádá o smazání vaší poznámky ze spojek, ke kterým jste v současnosti připojeni. Není zaručeno, že vaše poznámka bude trvale smazána z těchto spojek nebo z dalších spojek, kde může být uložena. Blokovat @@ -559,10 +558,7 @@ Rele Balíčky Sledování Přečtené - Algoritmy kanálu Trh - Živě - Komunita Chaty Schválené příspěvky Tato skupina nemá popis ani pravidla. Promluvte si s majitelem, aby je přidal/a. diff --git a/amethyst/src/main/res/values-de-rDE/strings.xml b/amethyst/src/main/res/values-de-rDE/strings.xml index 00193423a..439caa6f0 100644 --- a/amethyst/src/main/res/values-de-rDE/strings.xml +++ b/amethyst/src/main/res/values-de-rDE/strings.xml @@ -302,7 +302,6 @@ anz der Bedingungen ist erforderlich Entfolgen Folgen Aus Galerie löschen - Entferne diese Medien von deiner Galerie, du kannst sie später hinzufügen Löschung anfordern Amethyst wird beantragen, dass Ihre Notiz von den Relays gelöscht wird, mit denen Sie derzeit verbunden sind. Es gibt keine Garantie dafür, dass Ihre Notiz dauerhaft von diesen Relays oder anderen Relays, in denen sie gespeichert sein kann, gelöscht wird. Blockieren @@ -564,10 +563,7 @@ anz der Bedingungen ist erforderlich Relais Folge Paketen Lesungen - Notizen Entdeckung Marktplatz - Live - Gemeinschaft Plaudern Genehmigte Beiträge Diese Gruppe hat keine Beschreibung oder Regeln. Sprechen Sie mit dem Eigentümer, um eine hinzuzufügen. diff --git a/amethyst/src/main/res/values-el-rGR/strings.xml b/amethyst/src/main/res/values-el-rGR/strings.xml index 73b2a3e0c..9b6fa49fc 100644 --- a/amethyst/src/main/res/values-el-rGR/strings.xml +++ b/amethyst/src/main/res/values-el-rGR/strings.xml @@ -380,8 +380,6 @@ Η Αποσύνδεση διαγράφει όλες τις τοπικές πληροφορίες σας. Βεβαιωθείτε ότι έχετε Αντίγραφο Ασφαλείας από το \"Μυστικό Κλειδί\" σας για να αποφύγετε απώλεια του λογαριασμού σας. Θέλετε να συνεχίσετε? Ετικέτες που Ακολουθώ Διαμοιραστές - Ζωντανά - Κοινότητα Συνομιλίες Εγκεκριμένες Δημοσιεύσεις Αυτή η ομάδα δεν έχει περιγραφή ή κανόνες. Μιλήστε με τον ιδιοκτήτη για να προσθέσετε μία diff --git a/amethyst/src/main/res/values-eo-rUY/strings.xml b/amethyst/src/main/res/values-eo-rUY/strings.xml index e2050b9bf..3fce4d205 100644 --- a/amethyst/src/main/res/values-eo-rUY/strings.xml +++ b/amethyst/src/main/res/values-eo-rUY/strings.xml @@ -379,8 +379,6 @@ Elsaluti forigas ĉiujn viajn lokajn datumojn. Certigi ke vi sekurkopis vian privatan ŝlosilon por eviti perdi vian konton. Ĉu vi volas daŭrigi? Sekvitaj Etikedoj Plusendiloj - Vive - Komunumo Babilejoj Aprobitaj Afiŝoj Ĉi tiu grupo ne havas priskribon aŭ regulojn. Parolu kun la posedanto por aldoni diff --git a/amethyst/src/main/res/values-es-rES/strings.xml b/amethyst/src/main/res/values-es-rES/strings.xml index 583235fd7..c0f9ae00b 100644 --- a/amethyst/src/main/res/values-es-rES/strings.xml +++ b/amethyst/src/main/res/values-es-rES/strings.xml @@ -290,7 +290,6 @@ Dejar de seguir Seguir Eliminar de la galería - Elimina este contenido multimedia de la galería, aunque puedes volver a agregarlo luego. Solicitar eliminación Amethyst solicitará que se elimine su nota de los relays a los que está conectado actualmente. No hay garantía de que su nota se elimine permanentemente de esos relays, o de otros relays donde pueda almacenarse. Bloquear @@ -540,10 +539,7 @@ Al cerrar la sesión se borra toda tu información local. Asegúrate de tener una copia de seguridad de tus claves privadas para que no pierdas la cuenta. ¿Quieres continuar? Etiquetas seguidas Relés - Descubrimiento de notas Mercado - En vivo - Comunidad Chats Publicaciones aprobadas Este grupo no tiene descripción ni reglas. Habla con el propietario para agregar una. diff --git a/amethyst/src/main/res/values-es-rMX/strings.xml b/amethyst/src/main/res/values-es-rMX/strings.xml index badffaeeb..8498d3866 100644 --- a/amethyst/src/main/res/values-es-rMX/strings.xml +++ b/amethyst/src/main/res/values-es-rMX/strings.xml @@ -290,7 +290,6 @@ Dejar de seguir Seguir Eliminar de la galería - Elimina este contenido multimedia de la galería, aunque puedes volver a agregarlo luego. Solicitar eliminación Amethyst solicitará que se elimine la nota de los relés con los que tienes conexión actualmente. No hay garantía de que la nota se elimine permanentemente de esos relés o de otros donde pueda estar guardada. Bloquear @@ -540,10 +539,7 @@ Al cerrar la sesión se borra toda tu información local. Asegúrate de tener una copia de seguridad de tus claves privadas para que no pierdas la cuenta. ¿Quieres continuar? Etiquetas seguidas Relés - Descubrimiento de notas Mercado - En vivo - Comunidad Chats Publicaciones aprobadas Este grupo no tiene descripción ni reglas. Habla con el propietario para agregar una. diff --git a/amethyst/src/main/res/values-es-rUS/strings.xml b/amethyst/src/main/res/values-es-rUS/strings.xml index 4e111d4cb..e28620633 100644 --- a/amethyst/src/main/res/values-es-rUS/strings.xml +++ b/amethyst/src/main/res/values-es-rUS/strings.xml @@ -290,7 +290,6 @@ Dejar de seguir Seguir Eliminar de la galería - Elimina este contenido multimedia de la galería, aunque puedes volver a agregarlo luego. Solicitar eliminación Amethyst solicitará que se elimine la nota de los relés con los que tienes conexión actualmente. No hay garantía de que la nota se elimine permanentemente de esos relés o de otros donde pueda estar guardada. Bloquear @@ -540,10 +539,7 @@ Al cerrar la sesión se borra toda tu información local. Asegúrate de tener una copia de seguridad de tus claves privadas para que no pierdas la cuenta. ¿Quieres continuar? Etiquetas seguidas Relés - Descubrimiento de notas Mercado - En vivo - Comunidad Chats Publicaciones aprobadas Este grupo no tiene descripción ni reglas. Habla con el propietario para agregar una. diff --git a/amethyst/src/main/res/values-fa-rIR/strings.xml b/amethyst/src/main/res/values-fa-rIR/strings.xml index 0f4165d8c..7ee325eb6 100644 --- a/amethyst/src/main/res/values-fa-rIR/strings.xml +++ b/amethyst/src/main/res/values-fa-rIR/strings.xml @@ -288,7 +288,6 @@ دنبال نکردن دنبال کردن حذف از گالری - حذف این رسانه از گالری، بعدا می توانید آن را بخوانید درخواست حذف آماتیست درخواست می کند که یادداشت شما از رله هایی که درحال حاضر به آن متصل هستید حذف شود. هیچ تضمینی نیست که یادداشت شما برای همیشه از آن رله ها یا از رله های دیگری که ممکن است در آنها ذخیره شده باشد حذف خواهد شد.. بلاک @@ -538,10 +537,7 @@ خروج همه اطلاعات محلی شما را پاک می کند. مطمئن شوید که کلید خصوصی خود را بکاپ گرفته و ذخیره کرده اید تا حساب کاربری تان را از دست ندهید. می خواهید ادامه دهید؟ برچسب های دنبال شده رله ها - اکتشاف یادداشت بازار - زنده - انجمن گپ یادداشت های تایید شده این گروه هیچ توصیف و قوانینی ندارد. با مالک گروه برای افزودن آن صحبت کنید. diff --git a/amethyst/src/main/res/values-fi-rFI/strings.xml b/amethyst/src/main/res/values-fi-rFI/strings.xml index 5e3cde15c..72ed45827 100644 --- a/amethyst/src/main/res/values-fi-rFI/strings.xml +++ b/amethyst/src/main/res/values-fi-rFI/strings.xml @@ -391,7 +391,6 @@ Seuratut tagit Releet Markkinapaikka - Yhteisö Keskustelut Hyväksytyt viestit Tällä ryhmällä ei ole kuvausta tai sääntöjä. Keskustele omistajan kanssa sen lisäämiseksi diff --git a/amethyst/src/main/res/values-fr-rFR/strings.xml b/amethyst/src/main/res/values-fr-rFR/strings.xml index 56dcb375f..9487c1c91 100644 --- a/amethyst/src/main/res/values-fr-rFR/strings.xml +++ b/amethyst/src/main/res/values-fr-rFR/strings.xml @@ -290,7 +290,6 @@ Ne plus suivre Suivre Supprimer de la galerie - Retirer ce média de votre galerie, vous pourrez le réajouter plus tard Demande de Suppression Amethyst demandera que votre note soit supprimée des relais auxquels vous êtes actuellement connecté. Il n\'y a aucune garantie que votre note sera définitivement supprimée de ces relais, ou d\'autres relais où elle peut être stockée. Bloquer @@ -540,10 +539,7 @@ Se déconnecter supprime toutes vos informations locales. Assurez-vous d\'avoir vos clés privées sauvegardées pour éviter de perdre votre compte. Voulez-vous continuer ? Tags suivis Relais - Découverte de notes Place de Marché - Direct - Communauté Salons Messages approuvés Ce groupe n\'a pas de description ou de règles. Parlez au propriétaire pour en ajouter une diff --git a/amethyst/src/main/res/values-hi-rIN/strings.xml b/amethyst/src/main/res/values-hi-rIN/strings.xml index 1f3554b3a..609a6d7a0 100644 --- a/amethyst/src/main/res/values-hi-rIN/strings.xml +++ b/amethyst/src/main/res/values-hi-rIN/strings.xml @@ -300,7 +300,6 @@ अनुचरण ना करें अनुचरण करें चित्रालय से मिटाएँ - इस अभिलेख को चित्रालय से हटाएँ। तत्पश्चात कभी भी आप इसे पुनः जोड सकते हैं हटाने की याचना अमेथिस्ट अनुरोध करेगा कि आपका टीका मिटा दिया जाए उन पुनःप्रसारकों से जिनके साथ आप अब जुडे हुए हैं। कोई आश्वासन नहीं कि आपका टीका सर्वदा के लिए मिटा दिया जाएगा उन पुनःप्रसारकों से, अथवा अन्य पुनःप्रसारकों में से जहाँ यह रखा गया हो। बाधित करें @@ -561,10 +560,7 @@ पुनःप्रसारक अनुचरण पोटलियाँ पठितव्य - लेख आविष्करण पण्यक्षेत्र - तत्क्षणप्रसार - समुदाय चर्चाएँ अनुमति प्राप्त पत्र इस झुण्ड का कोई विवरण नहीं नियम नहीं। इसके अधिपति से बात करें इनहें जोडने के लिए diff --git a/amethyst/src/main/res/values-hu-rHU/strings.xml b/amethyst/src/main/res/values-hu-rHU/strings.xml index 3bbf9e032..1c820e109 100644 --- a/amethyst/src/main/res/values-hu-rHU/strings.xml +++ b/amethyst/src/main/res/values-hu-rHU/strings.xml @@ -300,7 +300,6 @@ Követés megszüntetése Követés Törlés a galériából - Távolítsa el ezt a médiát a galériából, később újra hozzáadhatja Törlés kérése Az Amethyst kérni fogja, hogy a bejegyzését töröljék azokról az átjátszókról, amelyekhez jelenleg csatlakozik. Nem garantálható, hogy a bejegyzése véglegesen törlődik ezekről az átjátszókról, vagy más átjátszókról, ahol esetleg tárolva van. Letiltás @@ -561,10 +560,7 @@ Átjátszók Követett csomagok Olvasmányok - Bejegyzések felfedezése Piac - Élő - Közösség Csevegések Elfogadott bejegyzések Ennek a csoportnak nincs leírása vagy szabályai. Kérje meg a tulajdonosát, hogy adjon hozzá egyet diff --git a/amethyst/src/main/res/values-in-rID/strings.xml b/amethyst/src/main/res/values-in-rID/strings.xml index 20b6d61bd..422033638 100644 --- a/amethyst/src/main/res/values-in-rID/strings.xml +++ b/amethyst/src/main/res/values-in-rID/strings.xml @@ -377,8 +377,6 @@ Keluar akan menghapus semua informasi yang disimpan secara lokal. Pastikan kunci pribadi Anda telah simpan untuk menghindari kehilangan akun Anda. Apakah Anda ingin melanjutkan? Tags yang Diikuti - Langsung - Komunitas Obrolan Post yang disetujui Grup ini tidak memiliki deskripsi atau peraturan. diff --git a/amethyst/src/main/res/values-it-rIT/strings.xml b/amethyst/src/main/res/values-it-rIT/strings.xml index 60391c7f7..b79e7df3c 100644 --- a/amethyst/src/main/res/values-it-rIT/strings.xml +++ b/amethyst/src/main/res/values-it-rIT/strings.xml @@ -361,8 +361,6 @@ La disconnessione elimina tutte le tue informazioni locali. Assicurati di avere le tue chiavi private salvate per evitare di perdere il tuo account. Vuoi continuare? Tag Seguiti Relè - In diretta - Comunità Chat Post approvati Questo gruppo non ha una descrizione o regole. Parla con il proprietario per aggiungerne una diff --git a/amethyst/src/main/res/values-ja-rJP/strings.xml b/amethyst/src/main/res/values-ja-rJP/strings.xml index ed0a8fe01..21a5107d2 100644 --- a/amethyst/src/main/res/values-ja-rJP/strings.xml +++ b/amethyst/src/main/res/values-ja-rJP/strings.xml @@ -370,8 +370,6 @@ ログアウトするとローカル情報はすべて削除されます。アカウントを紛失しないよう、秘密鍵のバックアップがあることを確認してください。続行しますか? フォロー済みタグ リレー - ライブ - コミュニティ チャット 承認済みの投稿 このグループには説明またはルールがありません。追加するには管理者に相談してください diff --git a/amethyst/src/main/res/values-nl-rNL/strings.xml b/amethyst/src/main/res/values-nl-rNL/strings.xml index af7f64e94..24b0d6576 100644 --- a/amethyst/src/main/res/values-nl-rNL/strings.xml +++ b/amethyst/src/main/res/values-nl-rNL/strings.xml @@ -290,7 +290,6 @@ Ontvolgen Volgen Verwijderen uit galerij - Verwijder deze media uit je galerij, je kunt het terug zien in je feed. Verzoek om te verwijderen Amethyst zal vragen om uw note te verwijderen van de relays waarmee u momenteel verbonden bent. Er is geen garantie dat uw note permanent wordt verwijderd van deze relays, of van andere relays waar het kan worden opgeslagen. Blokkeren @@ -540,10 +539,7 @@ Uitloggen verwijdert al je lokale informatie. Zorg ervoor dat je een back-up hebt van je geheime sleutels om te voorkomen dat je je account kwijtraakt. Wilt u doorgaan? Gevolgde tags Relays - Note ontdekking Marktplaats - Live - Community Chats Goedgekeurde berichten Deze groep heeft geen beschrijving of regels. Praat met de eigenaar om er een toe te voegen diff --git a/amethyst/src/main/res/values-pl-rPL/strings.xml b/amethyst/src/main/res/values-pl-rPL/strings.xml index 0e44441c1..32807c72f 100644 --- a/amethyst/src/main/res/values-pl-rPL/strings.xml +++ b/amethyst/src/main/res/values-pl-rPL/strings.xml @@ -297,7 +297,6 @@ Porzuć Śledź Usuń z Galerii - Usuń te media z galerii, możesz dodać je ponownie później Poproś o usunięcie Amethyst poprosi o usunięcie Twojego wpisu z aktualnie podłączonych transmiterów. Nie ma gwarancji, że Twój wpis zostanie trwale usunięty z tych lub z innych transmiterów, gdzie może być przechowywany. Zablokuj @@ -556,10 +555,7 @@ Wylogowanie usuwa wszystkie informacje lokalne. Upewnij się, że masz kopię zapasową kluczy prywatnych, aby uniknąć utraty konta. Czy chcesz kontynuować? Obserwowane tagi Transmitery - Kategorie Wpisów Market - Na żywo - Społeczności Czaty Zatwierdzone posty Ta grupa nie ma opisu ani reguł. Porozmawiaj z właścicielem, aby je dodać diff --git a/amethyst/src/main/res/values-pt-rBR/strings.xml b/amethyst/src/main/res/values-pt-rBR/strings.xml index 2fd8f75f3..269db908b 100644 --- a/amethyst/src/main/res/values-pt-rBR/strings.xml +++ b/amethyst/src/main/res/values-pt-rBR/strings.xml @@ -298,7 +298,6 @@ Remover seguidor Seguir Excluir da Galeria - Remover essa mídia de sua galeria, você pode adicionar mais tarde Pedir para excluir Amethyst solicitará que sua nota seja excluída dos relays aos quais você está conectado no momento. Não há garantia de que sua nota será excluída permanentemente desses relays ou de outros relays onde possa estar armazenada. Bloquear @@ -559,10 +558,7 @@ Relés Pacotes Seguir Leituras - Descoberta de Notas Mercado - Ao vivo - Comunidade Conversas Postagens Aprovadas Este grupo não tem uma descrição ou regras. Fale com o proprietário para adicionar diff --git a/amethyst/src/main/res/values-ru-rRU/strings.xml b/amethyst/src/main/res/values-ru-rRU/strings.xml index bfa9fda6d..2c8f56515 100644 --- a/amethyst/src/main/res/values-ru-rRU/strings.xml +++ b/amethyst/src/main/res/values-ru-rRU/strings.xml @@ -353,8 +353,6 @@ Трансляция выключена Трансляция закончена Рынок - Стримы - Сообщества Чаты У этой группы нет описания или правил. Поговорите с владельцем, чтобы добавить их У этого сообщества нет описания. Поговорите с владельцем, чтобы добавить diff --git a/amethyst/src/main/res/values-sl-rSI/strings.xml b/amethyst/src/main/res/values-sl-rSI/strings.xml index 39d027de1..115c30c60 100644 --- a/amethyst/src/main/res/values-sl-rSI/strings.xml +++ b/amethyst/src/main/res/values-sl-rSI/strings.xml @@ -308,7 +308,6 @@ Prijavi se s privatnim ključem, za prikaz skritih besed in stavkov Prenehaj slediti Sledi Izbris iz galerije - Odstrani ta medij iz tvoje galerije, lahko ga dodaš nazaj kasneje. Prošnja za izbris Amethyst bo poslal prošnjo za izbris zapiska vsem relejem na katere ste povezani. Nobenega jamstva ni, da bo vaš zapisek trajno izbrisan iz teh relejev ali iz drugih relejev, kjer je morda shranjen. Blokiraj @@ -569,10 +568,7 @@ Prijavi se s privatnim ključem, za prikaz skritih besed in stavkov Releji Sledi tropu Branje - Odkrivanje zapiskov Tržnica - V živo - Skupnosti Pogovori Odobrene objave Ta skupina nima opisa ali pravil. Obrnite se na lastnika, da jih doda diff --git a/amethyst/src/main/res/values-sv-rSE/strings.xml b/amethyst/src/main/res/values-sv-rSE/strings.xml index ff8d6b8c9..41c44d73a 100644 --- a/amethyst/src/main/res/values-sv-rSE/strings.xml +++ b/amethyst/src/main/res/values-sv-rSE/strings.xml @@ -298,7 +298,6 @@ Sluta följa Följ Ta bort från galleriet - Ta bort detta media från ditt galleri, kan du lägga till det senare Begär radering Amethyst kommer att begära att din anteckning tas bort från de reläer du för närvarande är ansluten till. Det finns ingen garanti för att din anteckning kommer att raderas permanent från dessa reläer eller från andra reläer där den kan lagras. Blockera @@ -558,10 +557,7 @@ Reläer Följpaket Läsningar - Upptäckt av anteckningar Marknadsplats - Live - Gemenskap Chattar Godkända Inlägg Denna grupp har ingen beskrivning eller regler. Prata med ägaren för att lägga till en. diff --git a/amethyst/src/main/res/values-sw-rKE/strings.xml b/amethyst/src/main/res/values-sw-rKE/strings.xml index 079c33fdf..eaae02bd9 100644 --- a/amethyst/src/main/res/values-sw-rKE/strings.xml +++ b/amethyst/src/main/res/values-sw-rKE/strings.xml @@ -371,8 +371,6 @@ Kutoka kunaondoa taarifa zako za eneo la kuhifadhia data. Hakikisha una nakala za funguo zako binafsi ili kuepuka kupoteza akaunti yako. Je, unataka kuendelea? Mada Zinazofuatwa Usanidi wa Relays - Moja kwa Moja - Jumuiya Mazungumzo Machapisho Yaliyoidhinishwa Kikundi hiki hakitumii maelezo au kanuni. Ongea na mmiliki ili aongeze. diff --git a/amethyst/src/main/res/values-ta-rIN/strings.xml b/amethyst/src/main/res/values-ta-rIN/strings.xml index 761ea3819..5471010d5 100644 --- a/amethyst/src/main/res/values-ta-rIN/strings.xml +++ b/amethyst/src/main/res/values-ta-rIN/strings.xml @@ -365,8 +365,6 @@ வெளியேறுவதல் உங்கள் அனைத்து விவரங்களையும் நீக்கிவிடும். வெளியேறும் முன் உங்கள் கணக்கைத் தொலையாமல் இருக்க ரகசியசாவியை பத்திரமாக பிரதி செய்து சேமிக்கப்பட்டுள்ளதா என்று சரிபார்க்கவும். வெளியேற வேண்டுமா? பின்பற்றப்படும் சிட்டைகள் ரிலேகள் - நேரலை - சமூகம் அரட்டை அங்கீகரிக்கப்பட்ட குறிப்பு இந்த அரட்டைக் குழுவின் விளக்கமும் விதிகளும் இன்னும் சேர்க்கபடவில்லை. உரிமையாளரை அணுகி அவற்றை சேர்க்க கோரவும் diff --git a/amethyst/src/main/res/values-th-rTH/strings.xml b/amethyst/src/main/res/values-th-rTH/strings.xml index 90f6d80cf..e03e05281 100644 --- a/amethyst/src/main/res/values-th-rTH/strings.xml +++ b/amethyst/src/main/res/values-th-rTH/strings.xml @@ -258,7 +258,6 @@ เลิกติดตาม ติดตาม ลบออกจากคลังภาพ - เอาออกจากคลังภาพ คุณสามารถเพิ่มใหม่ได้ภายหลัง ส่งคำขอให้ลบ Amethyst จะขอให้ลบโน้ตของคุณออกจากรีเลย์ที่คุณเชื่อมต่ออยู่ ไม่มีการรับประกันว่าโน้ตของคุณจะถูกลบออกอย่างถาวรจากรีเลย์เหล่านั้น หรือ จากรีเลย์อื่น ๆ ที่อาจเก็บไว้ บล๊อก @@ -455,10 +454,7 @@ การออกจากระบบจะลบข้อมูลทั้งหมดของคุณ ตรวจสอบให้แน่ใจว่าได้สํารองข้อมูล private key ไว้เพื่อหลีกเลี่ยงการสูญเสียบัญชีของคุณ คุณต้องการดําเนินการต่อหรือไม่? ติดตามแท็ก รีเลย์ - ค้นหาโน๊ตใหม่ ๆ ตลาด - ถ่ายทอดสด - ชุมชน ช่องสนทนา อนุมัติโพสต์ ชุมชนนี้ไม่มีคำอธิบายหรือกฏ พูดคุยกับเจ้าของเพื่อเพิ่มเติมสิ่งนี้ diff --git a/amethyst/src/main/res/values-uk-rUA/strings.xml b/amethyst/src/main/res/values-uk-rUA/strings.xml index b8943d743..3c028d448 100644 --- a/amethyst/src/main/res/values-uk-rUA/strings.xml +++ b/amethyst/src/main/res/values-uk-rUA/strings.xml @@ -381,8 +381,6 @@ Вихід з облікового запису видаляє всю вашу локальну інформацію. Переконайтеся, що ваші особисті ключі були збережені, щоб уникнути втрати вашого облікового запису. Ви хочете продовжити? Відстежувані теги Торгівельний майданчик - Наживо - Спільнота Чати Затверджені публікації Ця група не має опису або правил. Зверніться до автора, щоб додати один diff --git a/amethyst/src/main/res/values-zh-rCN/strings.xml b/amethyst/src/main/res/values-zh-rCN/strings.xml index c303fb32c..c5164ccc0 100644 --- a/amethyst/src/main/res/values-zh-rCN/strings.xml +++ b/amethyst/src/main/res/values-zh-rCN/strings.xml @@ -300,7 +300,6 @@ 取关 关注 从相册中删除 - 从相册中删除此媒体,但仍然可供浏览 请求删贴 Amethyst 将请求你的记录从当前连接的中继器中删除。不能保证你发布的笔记将被永久从那些中继器或其他存储笔记的中继器中删除。 阻止 @@ -561,10 +560,7 @@ 中继器 关注包 次浏览 - 笔记发现 市场 - 直播 - 社区 聊天 批准的帖子 此群组没有描述或规则。联系群主来添加 diff --git a/amethyst/src/main/res/values-zh-rTW/strings.xml b/amethyst/src/main/res/values-zh-rTW/strings.xml index e2025b372..dc1067744 100644 --- a/amethyst/src/main/res/values-zh-rTW/strings.xml +++ b/amethyst/src/main/res/values-zh-rTW/strings.xml @@ -256,7 +256,6 @@ 取關 關注 從相冊中刪除 - 從相冊中刪除此媒體,但仍然可供瀏覽 請求刪貼 Amethyst 將請求您的記錄從當前連接的中繼器中刪除。不能保證您發佈的筆記將被永久從那些中繼器或其他存儲筆記的中繼器中刪除。 屏蔽 @@ -446,10 +445,7 @@ 登出將刪除你的本地信息。請確保備份你的私鑰以避免失去你的帳戶。你想要繼續嗎? 以關注的標籤 中繼器 - 筆記發現 市場 - 直播 - 社群 聊天 批准的帖子 此群組沒有描述或規則。聯繫群主來添加 From ffeeebfe1ef78391b580796f6d5fb5c72b5282e0 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Mon, 2 Jun 2025 16:12:42 +0200 Subject: [PATCH 05/29] remove unused string ids from translations --- amethyst/src/main/res/values-cs/strings.xml | 4 ---- amethyst/src/main/res/values-de/strings.xml | 4 ---- amethyst/src/main/res/values-eo/strings.xml | 2 -- amethyst/src/main/res/values-fa/strings.xml | 4 ---- amethyst/src/main/res/values-fr/strings.xml | 4 ---- amethyst/src/main/res/values-hu/strings.xml | 4 ---- amethyst/src/main/res/values-in/strings.xml | 2 -- amethyst/src/main/res/values-ja/strings.xml | 2 -- amethyst/src/main/res/values-nl/strings.xml | 4 ---- amethyst/src/main/res/values-ru/strings.xml | 2 -- amethyst/src/main/res/values-ta/strings.xml | 2 -- amethyst/src/main/res/values-th/strings.xml | 4 ---- amethyst/src/main/res/values-uk/strings.xml | 2 -- 13 files changed, 40 deletions(-) diff --git a/amethyst/src/main/res/values-cs/strings.xml b/amethyst/src/main/res/values-cs/strings.xml index 02c89a154..fc85f6d27 100644 --- a/amethyst/src/main/res/values-cs/strings.xml +++ b/amethyst/src/main/res/values-cs/strings.xml @@ -286,7 +286,6 @@ Přestat sledovat Sledovat Odstranit z galerie - Odstraňte tato média z vaší galerie, můžete je přidat později Požadavek na smazání Amethyst požádá o smazání vaší poznámky ze spojek, ke kterým jste v současnosti připojeni. Není zaručeno, že vaše poznámka bude trvale smazána z těchto spojek nebo z dalších spojek, kde může být uložena. Blokovat @@ -535,10 +534,7 @@ Odhlášení vymaže všechny vaše místní informace. Ujistěte se, že máte zálohované své privátní klíče, abyste se vyhnuli ztrátě účtu. Chcete pokračovat? Sledované značky Rele - Objevování poznámek Trh - Živě - Komunita Chaty Schválené příspěvky Tato skupina nemá popis ani pravidla. Promluvte si s majitelem, aby je přidal/a. diff --git a/amethyst/src/main/res/values-de/strings.xml b/amethyst/src/main/res/values-de/strings.xml index 2c0c4ed3b..cabd2af74 100644 --- a/amethyst/src/main/res/values-de/strings.xml +++ b/amethyst/src/main/res/values-de/strings.xml @@ -290,7 +290,6 @@ anz der Bedingungen ist erforderlich Entfolgen Folgen Aus Galerie löschen - Entferne diese Medien von deiner Galerie, du kannst sie später hinzufügen Löschung anfordern Amethyst wird beantragen, dass Ihre Notiz von den Relays gelöscht wird, mit denen Sie derzeit verbunden sind. Es gibt keine Garantie dafür, dass Ihre Notiz dauerhaft von diesen Relays oder anderen Relays, in denen sie gespeichert sein kann, gelöscht wird. Blockieren @@ -540,10 +539,7 @@ anz der Bedingungen ist erforderlich Das Abmelden löscht alle Ihre lokalen Informationen. Stellen Sie sicher, dass Sie Ihre privaten Schlüssel gesichert haben, um einen Kontoverlust zu vermeiden. Möchten Sie fortfahren? Gefolgte Tags Relais - Notizen Entdeckung Marktplatz - Live - Gemeinschaft Plaudern Genehmigte Beiträge Diese Gruppe hat keine Beschreibung oder Regeln. Sprechen Sie mit dem Eigentümer, um eine hinzuzufügen. diff --git a/amethyst/src/main/res/values-eo/strings.xml b/amethyst/src/main/res/values-eo/strings.xml index 398deb462..eed86b997 100644 --- a/amethyst/src/main/res/values-eo/strings.xml +++ b/amethyst/src/main/res/values-eo/strings.xml @@ -379,8 +379,6 @@ Elsaluti forigas ĉiujn viajn lokajn datumojn. Certigi ke vi sekurkopis vian privatan ŝlosilon por eviti perdi vian konton. Ĉu vi volas daŭrigi? Sekvitaj Etikedoj Plusendiloj - Vive - Komunumo Babilejoj Aprobitaj Afiŝoj Ĉi tiu grupo ne havas priskribon aŭ regulojn. Parolu kun la posedanto por aldoni diff --git a/amethyst/src/main/res/values-fa/strings.xml b/amethyst/src/main/res/values-fa/strings.xml index db3004cc9..0c2e5174b 100644 --- a/amethyst/src/main/res/values-fa/strings.xml +++ b/amethyst/src/main/res/values-fa/strings.xml @@ -270,7 +270,6 @@ دنبال نکردن دنبال کردن حذف از گالری - حذف این رسانه از گالری، بعدا می توانید آن را بخوانید درخواست حذف آماتیست درخواست می کند که یادداشت شما از رله هایی که درحال حاضر به آن متصل هستید حذف شود. هیچ تضمینی نیست که یادداشت شما برای همیشه از آن رله ها یا از رله های دیگری که ممکن است در آنها ذخیره شده باشد حذف خواهد شد.. بلاک @@ -519,10 +518,7 @@ خروج همه اطلاعات محلی شما را پاک می کند. مطمئن شوید که کلید خصوصی خود را بکاپ گرفته و ذخیره کرده اید تا حساب کاربری تان را از دست ندهید. می خواهید ادامه دهید؟ برچسب های دنبال شده رله ها - اکتشاف یادداشت بازار - زنده - انجمن گپ یادداشت های تایید شده این گروه هیچ توصیف و قوانینی ندارد. با مالک گروه برای افزودن آن صحبت کنید. diff --git a/amethyst/src/main/res/values-fr/strings.xml b/amethyst/src/main/res/values-fr/strings.xml index b86bc0499..bb35fd681 100644 --- a/amethyst/src/main/res/values-fr/strings.xml +++ b/amethyst/src/main/res/values-fr/strings.xml @@ -282,7 +282,6 @@ Ne plus suivre Suivre Supprimer de la galerie - Retirer ce média de votre galerie, vous pourrez le réajouter plus tard Demande de Suppression Amethyst demandera que votre note soit supprimée des relais auxquels vous êtes actuellement connecté. Il n\'y a aucune garantie que votre note sera définitivement supprimée de ces relais, ou d\'autres relais où elle peut être stockée. Bloquer @@ -531,10 +530,7 @@ Se déconnecter supprime toutes vos informations locales. Assurez-vous d\'avoir vos clés privées sauvegardées pour éviter de perdre votre compte. Voulez-vous continuer ? Tags suivis Relais - Découverte de notes Place de Marché - Direct - Communauté Salons Messages approuvés Ce groupe n\'a pas de description ou de règles. Parlez au propriétaire pour en ajouter une diff --git a/amethyst/src/main/res/values-hu/strings.xml b/amethyst/src/main/res/values-hu/strings.xml index 30bfdcb4c..039cf9427 100644 --- a/amethyst/src/main/res/values-hu/strings.xml +++ b/amethyst/src/main/res/values-hu/strings.xml @@ -288,7 +288,6 @@ Követés megszüntetése Követés Törlés a galériából - Távolítsa el ezt a médiát a galériából, később újra hozzáadhatja Törlés kérése Az Amethyst kérni fogja, hogy a bejegyzését töröljék azokról az átjátszókról, amelyekhez jelenleg csatlakozik. Nem garantálható, hogy a bejegyzése véglegesen törlődik ezekről az átjátszókról, vagy más átjátszókról, ahol esetleg tárolva van. Letiltás @@ -537,10 +536,7 @@ A kijelentkezéssel törlődik az összes helyben tárolt adat. Győződjön meg arról, hogy a privát kulcsokról biztonsági mentést készített, hogy elkerülje fiókja elvesztését. Szeretné folytatni? Követett címke Átjátszók - Bejegyzések felfedezése Piac - Élő - Közösség Csevegések Elfogadott bejegyzések Ennek a csoportnak nincs leírása vagy szabályai. Kérje meg a tulajdonosát, hogy adjon hozzá egyet diff --git a/amethyst/src/main/res/values-in/strings.xml b/amethyst/src/main/res/values-in/strings.xml index 188b8672a..00447eb60 100644 --- a/amethyst/src/main/res/values-in/strings.xml +++ b/amethyst/src/main/res/values-in/strings.xml @@ -375,8 +375,6 @@ Keluar akan menghapus semua informasi lokal Anda. Pastikan kunci pribadi Anda dicadangkan untuk menghindari kehilangan akun Anda. Apakah Anda ingin melanjutkan? Tags yg diikuti Relai - Siaran Langsung - Komunitas Percakapan Kiriman yg disetujui Grup ini tidak memiliki deskripsi atau aturan. Bicaralah dengan pemiliknya untuk menambahkannya diff --git a/amethyst/src/main/res/values-ja/strings.xml b/amethyst/src/main/res/values-ja/strings.xml index ed0a8fe01..21a5107d2 100644 --- a/amethyst/src/main/res/values-ja/strings.xml +++ b/amethyst/src/main/res/values-ja/strings.xml @@ -370,8 +370,6 @@ ログアウトするとローカル情報はすべて削除されます。アカウントを紛失しないよう、秘密鍵のバックアップがあることを確認してください。続行しますか? フォロー済みタグ リレー - ライブ - コミュニティ チャット 承認済みの投稿 このグループには説明またはルールがありません。追加するには管理者に相談してください diff --git a/amethyst/src/main/res/values-nl/strings.xml b/amethyst/src/main/res/values-nl/strings.xml index 7e7b67332..e68d33635 100644 --- a/amethyst/src/main/res/values-nl/strings.xml +++ b/amethyst/src/main/res/values-nl/strings.xml @@ -281,7 +281,6 @@ Ontvolgen Volgen Verwijderen uit galerij - Verwijder deze media uit je galerij, je kunt het terug zien in je feed. Verzoek om te verwijderen Amethyst zal vragen om uw note te verwijderen van de relays waarmee u momenteel verbonden bent. Er is geen garantie dat uw note permanent wordt verwijderd van deze relays, of van andere relays waar het kan worden opgeslagen. Blokkeren @@ -530,10 +529,7 @@ Uitloggen verwijdert al je lokale informatie. Zorg ervoor dat je een back-up hebt van je geheime sleutels om te voorkomen dat je je account kwijtraakt. Wilt u doorgaan? Gevolgde tags Relays - Note ontdekking Marktplaats - Live - Community Chats Goedgekeurde berichten Deze groep heeft geen beschrijving of regels. Praat met de eigenaar om er een toe te voegen diff --git a/amethyst/src/main/res/values-ru/strings.xml b/amethyst/src/main/res/values-ru/strings.xml index bfa9fda6d..2c8f56515 100644 --- a/amethyst/src/main/res/values-ru/strings.xml +++ b/amethyst/src/main/res/values-ru/strings.xml @@ -353,8 +353,6 @@ Трансляция выключена Трансляция закончена Рынок - Стримы - Сообщества Чаты У этой группы нет описания или правил. Поговорите с владельцем, чтобы добавить их У этого сообщества нет описания. Поговорите с владельцем, чтобы добавить diff --git a/amethyst/src/main/res/values-ta/strings.xml b/amethyst/src/main/res/values-ta/strings.xml index 761ea3819..5471010d5 100644 --- a/amethyst/src/main/res/values-ta/strings.xml +++ b/amethyst/src/main/res/values-ta/strings.xml @@ -365,8 +365,6 @@ வெளியேறுவதல் உங்கள் அனைத்து விவரங்களையும் நீக்கிவிடும். வெளியேறும் முன் உங்கள் கணக்கைத் தொலையாமல் இருக்க ரகசியசாவியை பத்திரமாக பிரதி செய்து சேமிக்கப்பட்டுள்ளதா என்று சரிபார்க்கவும். வெளியேற வேண்டுமா? பின்பற்றப்படும் சிட்டைகள் ரிலேகள் - நேரலை - சமூகம் அரட்டை அங்கீகரிக்கப்பட்ட குறிப்பு இந்த அரட்டைக் குழுவின் விளக்கமும் விதிகளும் இன்னும் சேர்க்கபடவில்லை. உரிமையாளரை அணுகி அவற்றை சேர்க்க கோரவும் diff --git a/amethyst/src/main/res/values-th/strings.xml b/amethyst/src/main/res/values-th/strings.xml index 90f6d80cf..e03e05281 100644 --- a/amethyst/src/main/res/values-th/strings.xml +++ b/amethyst/src/main/res/values-th/strings.xml @@ -258,7 +258,6 @@ เลิกติดตาม ติดตาม ลบออกจากคลังภาพ - เอาออกจากคลังภาพ คุณสามารถเพิ่มใหม่ได้ภายหลัง ส่งคำขอให้ลบ Amethyst จะขอให้ลบโน้ตของคุณออกจากรีเลย์ที่คุณเชื่อมต่ออยู่ ไม่มีการรับประกันว่าโน้ตของคุณจะถูกลบออกอย่างถาวรจากรีเลย์เหล่านั้น หรือ จากรีเลย์อื่น ๆ ที่อาจเก็บไว้ บล๊อก @@ -455,10 +454,7 @@ การออกจากระบบจะลบข้อมูลทั้งหมดของคุณ ตรวจสอบให้แน่ใจว่าได้สํารองข้อมูล private key ไว้เพื่อหลีกเลี่ยงการสูญเสียบัญชีของคุณ คุณต้องการดําเนินการต่อหรือไม่? ติดตามแท็ก รีเลย์ - ค้นหาโน๊ตใหม่ ๆ ตลาด - ถ่ายทอดสด - ชุมชน ช่องสนทนา อนุมัติโพสต์ ชุมชนนี้ไม่มีคำอธิบายหรือกฏ พูดคุยกับเจ้าของเพื่อเพิ่มเติมสิ่งนี้ diff --git a/amethyst/src/main/res/values-uk/strings.xml b/amethyst/src/main/res/values-uk/strings.xml index b8943d743..3c028d448 100644 --- a/amethyst/src/main/res/values-uk/strings.xml +++ b/amethyst/src/main/res/values-uk/strings.xml @@ -381,8 +381,6 @@ Вихід з облікового запису видаляє всю вашу локальну інформацію. Переконайтеся, що ваші особисті ключі були збережені, щоб уникнути втрати вашого облікового запису. Ви хочете продовжити? Відстежувані теги Торгівельний майданчик - Наживо - Спільнота Чати Затверджені публікації Ця група не має опису або правил. Зверніться до автора, щоб додати один From ec1dd3cc6e02c4379e0da534bbd5eb6653594e7d Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Mon, 2 Jun 2025 15:28:22 +0000 Subject: [PATCH 06/29] New Crowdin translations by GitHub Action --- amethyst/src/main/res/values-cs-rCZ/strings.xml | 4 ++++ amethyst/src/main/res/values-de-rDE/strings.xml | 4 ++++ amethyst/src/main/res/values-pl-rPL/strings.xml | 3 +++ amethyst/src/main/res/values-pt-rBR/strings.xml | 4 ++++ amethyst/src/main/res/values-sv-rSE/strings.xml | 4 ++++ amethyst/src/main/res/values-zh-rCN/strings.xml | 4 ++++ 6 files changed, 23 insertions(+) diff --git a/amethyst/src/main/res/values-cs-rCZ/strings.xml b/amethyst/src/main/res/values-cs-rCZ/strings.xml index 0a8f25027..d7f16e7f3 100644 --- a/amethyst/src/main/res/values-cs-rCZ/strings.xml +++ b/amethyst/src/main/res/values-cs-rCZ/strings.xml @@ -298,6 +298,7 @@ Přestat sledovat Sledovat Odstranit z galerie + Odstranit toto médium z vaší galerie. Požadavek na smazání Amethyst požádá o smazání vaší poznámky ze spojek, ke kterým jste v současnosti připojeni. Není zaručeno, že vaše poznámka bude trvale smazána z těchto spojek nebo z dalších spojek, kde může být uložena. Blokovat @@ -558,7 +559,10 @@ Rele Balíčky Sledování Přečtené + Algoritmy kanálu Trh + Živé vysílání + Komunity Chaty Schválené příspěvky Tato skupina nemá popis ani pravidla. Promluvte si s majitelem, aby je přidal/a. diff --git a/amethyst/src/main/res/values-de-rDE/strings.xml b/amethyst/src/main/res/values-de-rDE/strings.xml index 439caa6f0..6d5baf2b4 100644 --- a/amethyst/src/main/res/values-de-rDE/strings.xml +++ b/amethyst/src/main/res/values-de-rDE/strings.xml @@ -302,6 +302,7 @@ anz der Bedingungen ist erforderlich Entfolgen Folgen Aus Galerie löschen + Entferne dieses Medium von deiner Galerie. Löschung anfordern Amethyst wird beantragen, dass Ihre Notiz von den Relays gelöscht wird, mit denen Sie derzeit verbunden sind. Es gibt keine Garantie dafür, dass Ihre Notiz dauerhaft von diesen Relays oder anderen Relays, in denen sie gespeichert sein kann, gelöscht wird. Blockieren @@ -563,7 +564,10 @@ anz der Bedingungen ist erforderlich Relais Folge Paketen Lesungen + Feedalgorithmen Marktplatz + Live-Streams + Gemeinschaften Plaudern Genehmigte Beiträge Diese Gruppe hat keine Beschreibung oder Regeln. Sprechen Sie mit dem Eigentümer, um eine hinzuzufügen. diff --git a/amethyst/src/main/res/values-pl-rPL/strings.xml b/amethyst/src/main/res/values-pl-rPL/strings.xml index 32807c72f..8fa3a7851 100644 --- a/amethyst/src/main/res/values-pl-rPL/strings.xml +++ b/amethyst/src/main/res/values-pl-rPL/strings.xml @@ -297,6 +297,7 @@ Porzuć Śledź Usuń z Galerii + Usuń ten plik z Galerii. Poproś o usunięcie Amethyst poprosi o usunięcie Twojego wpisu z aktualnie podłączonych transmiterów. Nie ma gwarancji, że Twój wpis zostanie trwale usunięty z tych lub z innych transmiterów, gdzie może być przechowywany. Zablokuj @@ -556,6 +557,8 @@ Obserwowane tagi Transmitery Market + Transmisja na żywo + Społeczności Czaty Zatwierdzone posty Ta grupa nie ma opisu ani reguł. Porozmawiaj z właścicielem, aby je dodać diff --git a/amethyst/src/main/res/values-pt-rBR/strings.xml b/amethyst/src/main/res/values-pt-rBR/strings.xml index 269db908b..96208a6d2 100644 --- a/amethyst/src/main/res/values-pt-rBR/strings.xml +++ b/amethyst/src/main/res/values-pt-rBR/strings.xml @@ -298,6 +298,7 @@ Remover seguidor Seguir Excluir da Galeria + Remover essa mídia de sua galeria. Pedir para excluir Amethyst solicitará que sua nota seja excluída dos relays aos quais você está conectado no momento. Não há garantia de que sua nota será excluída permanentemente desses relays ou de outros relays onde possa estar armazenada. Bloquear @@ -558,7 +559,10 @@ Relés Pacotes Seguir Leituras + Algoritmos de feed Mercado + Transmissões Ao Vivo + Comunidades Conversas Postagens Aprovadas Este grupo não tem uma descrição ou regras. Fale com o proprietário para adicionar diff --git a/amethyst/src/main/res/values-sv-rSE/strings.xml b/amethyst/src/main/res/values-sv-rSE/strings.xml index 41c44d73a..058c36104 100644 --- a/amethyst/src/main/res/values-sv-rSE/strings.xml +++ b/amethyst/src/main/res/values-sv-rSE/strings.xml @@ -298,6 +298,7 @@ Sluta följa Följ Ta bort från galleriet + Ta bort detta media från ditt galleri. Begär radering Amethyst kommer att begära att din anteckning tas bort från de reläer du för närvarande är ansluten till. Det finns ingen garanti för att din anteckning kommer att raderas permanent från dessa reläer eller från andra reläer där den kan lagras. Blockera @@ -557,7 +558,10 @@ Reläer Följpaket Läsningar + Feed algoritmer Marknadsplats + Live-streams + Grupper Chattar Godkända Inlägg Denna grupp har ingen beskrivning eller regler. Prata med ägaren för att lägga till en. diff --git a/amethyst/src/main/res/values-zh-rCN/strings.xml b/amethyst/src/main/res/values-zh-rCN/strings.xml index c5164ccc0..00c9c31e1 100644 --- a/amethyst/src/main/res/values-zh-rCN/strings.xml +++ b/amethyst/src/main/res/values-zh-rCN/strings.xml @@ -300,6 +300,7 @@ 取关 关注 从相册中删除 + 从媒体库中删除此媒体。 请求删贴 Amethyst 将请求你的记录从当前连接的中继器中删除。不能保证你发布的笔记将被永久从那些中继器或其他存储笔记的中继器中删除。 阻止 @@ -560,7 +561,10 @@ 中继器 关注包 次浏览 + Feed算法 市场 + 直播 + 社区 聊天 批准的帖子 此群组没有描述或规则。联系群主来添加 From 6a544340cb12baf1edf4f193e408bc2694c341ed Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Mon, 2 Jun 2025 15:12:49 +0200 Subject: [PATCH 07/29] Upgrade AGP to 8.10.1 --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 502b1926b..de6f34398 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] accompanistAdaptive = "0.37.3" activityCompose = "1.10.1" -agp = "8.10.0" +agp = "8.10.1" android-compileSdk = "35" android-minSdk = "26" android-targetSdk = "35" From 2889c5dae560678183bd04f4c9c1f9c9d4ac0770 Mon Sep 17 00:00:00 2001 From: alltheseas <64376233+alltheseas@users.noreply.github.com> Date: Mon, 9 Jun 2025 17:13:35 -0500 Subject: [PATCH 08/29] Update README.md with deepwiki link added link to amethyst deepwiki --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 97d6e99df..3ed3b45d9 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Join the social network you control. [![JitPack version](https://jitpack.io/v/vitorpamplona/amethyst.svg)](https://jitpack.io/#vitorpamplona/amethyst) [![CI](https://img.shields.io/github/actions/workflow/status/vitorpamplona/amethyst/build.yml?labelColor=27303D)](https://github.com/vitorpamplona/amethyst/actions/workflows/build.yml) [![License: Apache-2.0](https://img.shields.io/github/license/vitorpamplona/amethyst?labelColor=27303D&color=0877d2)](/LICENSE) +[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/vitorpamplona/amethyst) ## Download and Install From acf426ccdc4d8462cbee83b85c5e9fe21b329a73 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 18 Jun 2025 13:28:43 -0300 Subject: [PATCH 09/29] Add a UnsignedEventDeserializer --- .../quartz/nip01Core/jackson/EventMapper.kt | 3 +- .../jackson/UnsignedEventDeserializer.kt | 33 +++++++++++ .../UnsignedEventManualDeserializer.kt | 43 ++++++++++++++ .../jackson/EventDeserializerTest.kt | 56 +++++++++++++++++++ 4 files changed, 134 insertions(+), 1 deletion(-) create mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt create mode 100644 quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt create mode 100644 quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt index 9794d9bb9..f99a3e665 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt @@ -60,7 +60,8 @@ class EventMapper { .addSerializer(BunkerRequest::class.java, BunkerRequest.BunkerRequestSerializer()) .addDeserializer(BunkerRequest::class.java, BunkerRequest.BunkerRequestDeserializer()) .addSerializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseSerializer()) - .addDeserializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseDeserializer()), + .addDeserializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseDeserializer()) + .addDeserializer(Event::class.java, UnsignedEventDeserializer()), ) fun fromJson(json: String): Event = mapper.readValue(json, Event::class.java) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt new file mode 100644 index 000000000..af118db2d --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt @@ -0,0 +1,33 @@ +/** + * Copyright (c) 2025 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.nip01Core.jackson + +import com.fasterxml.jackson.core.JsonParser +import com.fasterxml.jackson.databind.DeserializationContext +import com.fasterxml.jackson.databind.deser.std.StdDeserializer +import com.vitorpamplona.quartz.nip01Core.core.Event + +class UnsignedEventDeserializer : StdDeserializer(Event::class.java) { + override fun deserialize( + jp: JsonParser, + ctxt: DeserializationContext, + ): Event = UnsignedEventManualDeserializer.fromJson(jp.codec.readTree(jp)) +} diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt new file mode 100644 index 000000000..8d3b4528c --- /dev/null +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt @@ -0,0 +1,43 @@ +/** + * Copyright (c) 2025 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.nip01Core.jackson + +import com.fasterxml.jackson.databind.JsonNode +import com.vitorpamplona.quartz.EventFactory +import com.vitorpamplona.quartz.nip01Core.core.Event + +class UnsignedEventManualDeserializer { + companion object { + fun fromJson(jsonObject: JsonNode): Event = + EventFactory.create( + id = jsonObject.get("id")?.asText()?.intern() ?: "", + pubKey = jsonObject.get("pubkey")?.asText()?.intern() ?: "", + createdAt = jsonObject.get("created_at").asLong(), + kind = jsonObject.get("kind").asInt(), + tags = + jsonObject.get("tags").toTypedArray { + it.toTypedArray { s -> if (s.isNull) "" else s.asText().intern() } + }, + content = jsonObject.get("content").asText(), + sig = jsonObject.get("sig")?.asText()?.intern() ?: "", + ) + } +} diff --git a/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt b/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt new file mode 100644 index 000000000..d591b4baa --- /dev/null +++ b/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt @@ -0,0 +1,56 @@ +/** + * Copyright (c) 2025 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.nip01Core.jackson + +import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair +import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal +import com.vitorpamplona.quartz.nip01Core.verify +import com.vitorpamplona.quartz.nip10Notes.TextNoteEvent +import org.junit.Test + +class EventDeserializerTest { + @Test + fun testUnsignedEvent() { + val unsignedEventJson = """{"kind":"1","content":"This is an unsigned event.","created_at":1234,"tags":[]}""" + val event = Event.fromJson(unsignedEventJson) + assert(event.id.isEmpty()) + assert(event.pubKey.isEmpty()) + assert(event.sig.isEmpty()) + assert(!event.verify()) + } + + @Test + fun testSignedEvent() { + val keyPair = KeyPair() + val signer = NostrSignerInternal(keyPair) + + val unsignedEvent = TextNoteEvent.build("test") + val signedEvent = signer.signerSync.sign(unsignedEvent)!! + val eventJson = signedEvent.toJson() + val event = Event.fromJson(eventJson) + + assert(event.id.isNotEmpty()) + assert(event.sig.isNotEmpty()) + assert(event.pubKey.isNotEmpty()) + assert(event.verify()) + } +} From 9e58c2d3b9b7181c9ffc5b60b4d94d00d05765b0 Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Wed, 18 Jun 2025 17:24:43 -0300 Subject: [PATCH 10/29] Use EventTemplate instead of Event in BunkerRequestSign --- .../quartz/nip01Core/jackson/EventMapper.kt | 3 +- .../quartz/nip01Core/signers/EventTemplate.kt | 11 ++++- .../EventTemplateDeserializer.kt} | 6 +-- .../EventTemplateManualDeserializer.kt} | 13 +++--- .../nip46RemoteSigner/BunkerRequestSign.kt | 5 ++- .../jackson/EventDeserializerTest.kt | 43 +++++++++++-------- .../nip46RemoteSigner/BunkerRequestTest.kt | 35 +++++++++++++++ 7 files changed, 83 insertions(+), 33 deletions(-) rename quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/{jackson/UnsignedEventDeserializer.kt => signers/EventTemplateDeserializer.kt} (85%) rename quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/{jackson/UnsignedEventManualDeserializer.kt => signers/EventTemplateManualDeserializer.kt} (78%) create mode 100644 quartz/src/test/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestTest.kt diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt index f99a3e665..9794d9bb9 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/EventMapper.kt @@ -60,8 +60,7 @@ class EventMapper { .addSerializer(BunkerRequest::class.java, BunkerRequest.BunkerRequestSerializer()) .addDeserializer(BunkerRequest::class.java, BunkerRequest.BunkerRequestDeserializer()) .addSerializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseSerializer()) - .addDeserializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseDeserializer()) - .addDeserializer(Event::class.java, UnsignedEventDeserializer()), + .addDeserializer(BunkerResponse::class.java, BunkerResponse.BunkerResponseDeserializer()), ) fun fromJson(json: String): Event = mapper.readValue(json, Event::class.java) diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplate.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplate.kt index 8617b1e61..6b7a0b978 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplate.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplate.kt @@ -20,19 +20,28 @@ */ package com.vitorpamplona.quartz.nip01Core.signers +import com.fasterxml.jackson.annotation.JsonProperty import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.core.TagArray import com.vitorpamplona.quartz.nip01Core.core.TagArrayBuilder import com.vitorpamplona.quartz.nip01Core.core.builder import com.vitorpamplona.quartz.nip01Core.core.tagArray +import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper import com.vitorpamplona.quartz.utils.TimeUtils class EventTemplate( + @JsonProperty("created_at") val createdAt: Long, val kind: Int, val tags: TagArray, val content: String, -) +) { + fun toJson(): String = EventMapper.mapper.writeValueAsString(this) + + companion object { + fun fromJson(json: String): EventTemplate = EventTemplateManualDeserializer.fromJson(EventMapper.mapper.readTree(json)) + } +} inline fun eventTemplate( kind: Int, diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateDeserializer.kt similarity index 85% rename from quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt rename to quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateDeserializer.kt index af118db2d..94e69cf39 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventDeserializer.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateDeserializer.kt @@ -18,16 +18,16 @@ * 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.nip01Core.jackson +package com.vitorpamplona.quartz.nip01Core.signers import com.fasterxml.jackson.core.JsonParser import com.fasterxml.jackson.databind.DeserializationContext import com.fasterxml.jackson.databind.deser.std.StdDeserializer import com.vitorpamplona.quartz.nip01Core.core.Event -class UnsignedEventDeserializer : StdDeserializer(Event::class.java) { +class EventTemplateDeserializer : StdDeserializer>(EventTemplate::class.java) { override fun deserialize( jp: JsonParser, ctxt: DeserializationContext, - ): Event = UnsignedEventManualDeserializer.fromJson(jp.codec.readTree(jp)) + ): EventTemplate = EventTemplateManualDeserializer.fromJson(jp.codec.readTree(jp)) } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateManualDeserializer.kt similarity index 78% rename from quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt rename to quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateManualDeserializer.kt index 8d3b4528c..abdded6bd 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/jackson/UnsignedEventManualDeserializer.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip01Core/signers/EventTemplateManualDeserializer.kt @@ -18,18 +18,16 @@ * 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.nip01Core.jackson +package com.vitorpamplona.quartz.nip01Core.signers import com.fasterxml.jackson.databind.JsonNode -import com.vitorpamplona.quartz.EventFactory import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.jackson.toTypedArray -class UnsignedEventManualDeserializer { +class EventTemplateManualDeserializer { companion object { - fun fromJson(jsonObject: JsonNode): Event = - EventFactory.create( - id = jsonObject.get("id")?.asText()?.intern() ?: "", - pubKey = jsonObject.get("pubkey")?.asText()?.intern() ?: "", + fun fromJson(jsonObject: JsonNode): EventTemplate = + EventTemplate( createdAt = jsonObject.get("created_at").asLong(), kind = jsonObject.get("kind").asInt(), tags = @@ -37,7 +35,6 @@ class UnsignedEventManualDeserializer { it.toTypedArray { s -> if (s.isNull) "" else s.asText().intern() } }, content = jsonObject.get("content").asText(), - sig = jsonObject.get("sig")?.asText()?.intern() ?: "", ) } } diff --git a/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestSign.kt b/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestSign.kt index 8c755f1d3..4629e489b 100644 --- a/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestSign.kt +++ b/quartz/src/main/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestSign.kt @@ -21,11 +21,12 @@ package com.vitorpamplona.quartz.nip46RemoteSigner import com.vitorpamplona.quartz.nip01Core.core.Event +import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate import java.util.UUID class BunkerRequestSign( id: String = UUID.randomUUID().toString(), - val event: Event, + val event: EventTemplate, ) : BunkerRequest(id, METHOD_NAME, arrayOf(event.toJson())) { companion object { val METHOD_NAME = "sign_event" @@ -33,6 +34,6 @@ class BunkerRequestSign( fun parse( id: String, params: Array, - ): BunkerRequestSign = BunkerRequestSign(id, Event.fromJson(params[0])) + ): BunkerRequestSign = BunkerRequestSign(id, EventTemplate.fromJson(params[0])) } } diff --git a/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt b/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt index d591b4baa..cb22c26ba 100644 --- a/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt +++ b/quartz/src/test/java/com/vitorpamplona/quartz/nip01Core/jackson/EventDeserializerTest.kt @@ -20,22 +20,31 @@ */ package com.vitorpamplona.quartz.nip01Core.jackson -import com.vitorpamplona.quartz.nip01Core.core.Event import com.vitorpamplona.quartz.nip01Core.crypto.KeyPair +import com.vitorpamplona.quartz.nip01Core.signers.EventTemplate import com.vitorpamplona.quartz.nip01Core.signers.NostrSignerInternal import com.vitorpamplona.quartz.nip01Core.verify -import com.vitorpamplona.quartz.nip10Notes.TextNoteEvent import org.junit.Test class EventDeserializerTest { @Test - fun testUnsignedEvent() { - val unsignedEventJson = """{"kind":"1","content":"This is an unsigned event.","created_at":1234,"tags":[]}""" - val event = Event.fromJson(unsignedEventJson) - assert(event.id.isEmpty()) - assert(event.pubKey.isEmpty()) - assert(event.sig.isEmpty()) - assert(!event.verify()) + fun testEventTemplateToJson() { + val templateJson = """{"created_at":1234,"kind":1,"tags":[],"content":"This is an unsigned event."}""" + val template = EventTemplate.fromJson(templateJson) + + val json = template.toJson() + + assert(json == templateJson) + } + + @Test + fun testEventTemplate() { + val templateJson = """{"kind":"1","content":"This is an unsigned event.","created_at":1234,"tags":[]}""" + val template = EventTemplate.fromJson(templateJson) + + assert(template.kind == 1) + assert(template.content == "This is an unsigned event.") + assert(template.tags.isEmpty()) } @Test @@ -43,14 +52,14 @@ class EventDeserializerTest { val keyPair = KeyPair() val signer = NostrSignerInternal(keyPair) - val unsignedEvent = TextNoteEvent.build("test") - val signedEvent = signer.signerSync.sign(unsignedEvent)!! - val eventJson = signedEvent.toJson() - val event = Event.fromJson(eventJson) + val templateJson = """{"kind":"1","content":"This is an unsigned event.","created_at":1234,"tags":[]}""" + val template = EventTemplate.fromJson(templateJson) - assert(event.id.isNotEmpty()) - assert(event.sig.isNotEmpty()) - assert(event.pubKey.isNotEmpty()) - assert(event.verify()) + val signedEvent = signer.signerSync.sign(template)!! + + assert(signedEvent.id.isNotEmpty()) + assert(signedEvent.sig.isNotEmpty()) + assert(signedEvent.pubKey.isNotEmpty()) + assert(signedEvent.verify()) } } diff --git a/quartz/src/test/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestTest.kt b/quartz/src/test/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestTest.kt new file mode 100644 index 000000000..3d94e0c4b --- /dev/null +++ b/quartz/src/test/java/com/vitorpamplona/quartz/nip46RemoteSigner/BunkerRequestTest.kt @@ -0,0 +1,35 @@ +/** + * Copyright (c) 2025 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.nip46RemoteSigner + +import com.vitorpamplona.quartz.nip01Core.jackson.EventMapper +import org.junit.Test + +class BunkerRequestTest { + @Test + fun testBunkerRequestDeSerialization() { + val requestJson = """{"id":"123","method":"sign_event","params":["{\"created_at\":1234,\"kind\":1,\"tags\":[],\"content\":\"This is an unsigned event.\"}"]}""" + val bunkerRequest = EventMapper.mapper.readValue(requestJson, BunkerRequest::class.java) + + assert(bunkerRequest is BunkerRequestSign) + assert((bunkerRequest as BunkerRequestSign).event.kind == 1) + } +} From 2d9348b640a5a4a4165c921e4669a0f1aabff0c6 Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Thu, 19 Jun 2025 13:46:40 +0000 Subject: [PATCH 11/29] New Crowdin translations by GitHub Action --- amethyst/src/main/res/values-hi-rIN/strings.xml | 4 ++++ amethyst/src/main/res/values-hu-rHU/strings.xml | 4 ++++ amethyst/src/main/res/values-pl-rPL/strings.xml | 4 ++++ 3 files changed, 12 insertions(+) diff --git a/amethyst/src/main/res/values-hi-rIN/strings.xml b/amethyst/src/main/res/values-hi-rIN/strings.xml index 609a6d7a0..06e0fa87e 100644 --- a/amethyst/src/main/res/values-hi-rIN/strings.xml +++ b/amethyst/src/main/res/values-hi-rIN/strings.xml @@ -300,6 +300,7 @@ अनुचरण ना करें अनुचरण करें चित्रालय से मिटाएँ + इस अभिलेख को आपके चित्रालय से हटाएँ। हटाने की याचना अमेथिस्ट अनुरोध करेगा कि आपका टीका मिटा दिया जाए उन पुनःप्रसारकों से जिनके साथ आप अब जुडे हुए हैं। कोई आश्वासन नहीं कि आपका टीका सर्वदा के लिए मिटा दिया जाएगा उन पुनःप्रसारकों से, अथवा अन्य पुनःप्रसारकों में से जहाँ यह रखा गया हो। बाधित करें @@ -560,7 +561,10 @@ पुनःप्रसारक अनुचरण पोटलियाँ पठितव्य + सूचनावली विधियाँ पण्यक्षेत्र + तत्क्षणप्रसार + समुदाय चर्चाएँ अनुमति प्राप्त पत्र इस झुण्ड का कोई विवरण नहीं नियम नहीं। इसके अधिपति से बात करें इनहें जोडने के लिए diff --git a/amethyst/src/main/res/values-hu-rHU/strings.xml b/amethyst/src/main/res/values-hu-rHU/strings.xml index 1c820e109..7b1a5d09a 100644 --- a/amethyst/src/main/res/values-hu-rHU/strings.xml +++ b/amethyst/src/main/res/values-hu-rHU/strings.xml @@ -300,6 +300,7 @@ Követés megszüntetése Követés Törlés a galériából + Távolítsa el ezt a médiát a galériából. Törlés kérése Az Amethyst kérni fogja, hogy a bejegyzését töröljék azokról az átjátszókról, amelyekhez jelenleg csatlakozik. Nem garantálható, hogy a bejegyzése véglegesen törlődik ezekről az átjátszókról, vagy más átjátszókról, ahol esetleg tárolva van. Letiltás @@ -560,7 +561,10 @@ Átjátszók Követett csomagok Olvasmányok + Hírforrás-algoritmus Piac + Élő közvetítések + Közösségek Csevegések Elfogadott bejegyzések Ennek a csoportnak nincs leírása vagy szabályai. Kérje meg a tulajdonosát, hogy adjon hozzá egyet diff --git a/amethyst/src/main/res/values-pl-rPL/strings.xml b/amethyst/src/main/res/values-pl-rPL/strings.xml index 8fa3a7851..bbff0adb6 100644 --- a/amethyst/src/main/res/values-pl-rPL/strings.xml +++ b/amethyst/src/main/res/values-pl-rPL/strings.xml @@ -556,6 +556,8 @@ Wylogowanie usuwa wszystkie informacje lokalne. Upewnij się, że masz kopię zapasową kluczy prywatnych, aby uniknąć utraty konta. Czy chcesz kontynuować? Obserwowane tagi Transmitery + Wyświetlenia + Algorytmy kanału Market Transmisja na żywo Społeczności @@ -814,6 +816,7 @@ Nowe Króciaki: zdjęcia lub filmiki Nowy wpis w społeczności Nowy produkt + Nowy GEO-ekskluzywny Wpis Otwórz wszystkie odzewy na ten post Zamknij wszystkie odzewy na ten post Odpowiedz @@ -963,6 +966,7 @@ Wybierz listę, aby filtrować kanał Wyloguj się przy blokowaniu urządzenia Wiadomość prywatna + Transmiter Czatu Transmiter, z którym łączą się wszyscy użytkownicy tego czatu Udostępnij zdjęcie… Szukaj tagu: #%1$s From 86bfca99e60504805b2bcd27b19ef34005a7e778 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 25 Jun 2025 11:41:28 +0200 Subject: [PATCH 12/29] change to version b481c6a64e of android-kotlin-geohash as 1.0 has disappeared from jitpack.io --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index de6f34398..76ce0b977 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -5,7 +5,7 @@ agp = "8.10.1" android-compileSdk = "35" android-minSdk = "26" android-targetSdk = "35" -androidKotlinGeohash = "1.0" +androidKotlinGeohash = "b481c6a64e" androidxJunit = "1.2.1" appcompat = "1.7.0" audiowaveform = "1.1.1" From bf7638eaa910d1369015b93a0cb78ca90839f6dd Mon Sep 17 00:00:00 2001 From: Crowdin Bot Date: Wed, 25 Jun 2025 12:02:19 +0000 Subject: [PATCH 13/29] New Crowdin translations by GitHub Action --- amethyst/src/main/res/values-pl-rPL/strings.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/amethyst/src/main/res/values-pl-rPL/strings.xml b/amethyst/src/main/res/values-pl-rPL/strings.xml index bbff0adb6..25aafefe8 100644 --- a/amethyst/src/main/res/values-pl-rPL/strings.xml +++ b/amethyst/src/main/res/values-pl-rPL/strings.xml @@ -556,6 +556,7 @@ Wylogowanie usuwa wszystkie informacje lokalne. Upewnij się, że masz kopię zapasową kluczy prywatnych, aby uniknąć utraty konta. Czy chcesz kontynuować? Obserwowane tagi Transmitery + Obserwowani Wyświetlenia Algorytmy kanału Market From dacc9f236b6afec8a7b02f0b4086ce209e42efa0 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 25 Jun 2025 16:33:28 +0200 Subject: [PATCH 14/29] strip anything after ";" in media-type before passing to ContentResolver --- .../com/vitorpamplona/amethyst/ui/actions/MediaSaverToDisk.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/MediaSaverToDisk.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/MediaSaverToDisk.kt index 00f35edb7..d3e3e3b8b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/MediaSaverToDisk.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/actions/MediaSaverToDisk.kt @@ -201,10 +201,11 @@ object MediaSaverToDisk { contentSource: BufferedSource, contentResolver: ContentResolver, ) { + val cleanMimeType = contentType.substringBefore(";").trim() val contentValues = ContentValues().apply { put(MediaStore.MediaColumns.DISPLAY_NAME, displayName) - put(MediaStore.MediaColumns.MIME_TYPE, contentType) + put(MediaStore.MediaColumns.MIME_TYPE, cleanMimeType) put( MediaStore.MediaColumns.RELATIVE_PATH, Environment.DIRECTORY_PICTURES + File.separatorChar + PICTURES_SUBDIRECTORY, From 0bae8adebc2b4f47da75472cf5b53081fb537e69 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 25 Jun 2025 17:18:05 +0200 Subject: [PATCH 15/29] Upgrade AGP to 8.11.0 Upgrade Gradle to 8.13 --- gradle/libs.versions.toml | 2 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 76ce0b977..ea8fbbb69 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -1,7 +1,7 @@ [versions] accompanistAdaptive = "0.37.3" activityCompose = "1.10.1" -agp = "8.10.1" +agp = "8.11.0" android-compileSdk = "35" android-minSdk = "26" android-targetSdk = "35" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 17098b30b..da1d086f4 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ #Wed Jan 04 09:23:50 EST 2023 distributionBase=GRADLE_USER_HOME -distributionUrl=https\://services.gradle.org/distributions/gradle-8.11.1-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-8.13-bin.zip distributionPath=wrapper/dists zipStorePath=wrapper/dists zipStoreBase=GRADLE_USER_HOME From 0495dc88fc6a030a73306fe0f1d76bb230070531 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Mon, 16 Jun 2025 15:52:46 +0200 Subject: [PATCH 16/29] Add dropdown with auto translate language excludes to app settings Persist changes to settings TODO: Load actually excluded languages Optimise code Improve UI --- .../vitorpamplona/amethyst/model/Settings.kt | 1 + .../ui/screen/SharedPreferencesViewModel.kt | 18 ++++ .../amethyst/ui/screen/SharedSettingsState.kt | 2 +- .../loggedIn/settings/AppSettingsScreen.kt | 89 +++++++++++++++++++ amethyst/src/main/res/values/strings.xml | 4 + 5 files changed, 113 insertions(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt index 356f79707..0487326ae 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt @@ -27,6 +27,7 @@ import com.vitorpamplona.amethyst.R data class Settings( val theme: ThemeType = ThemeType.SYSTEM, val preferredLanguage: String? = null, + val dontTranslateFrom: Set = emptySet(), val automaticallyShowImages: ConnectivityType = ConnectivityType.ALWAYS, val automaticallyStartPlayback: ConnectivityType = ConnectivityType.ALWAYS, val automaticallyShowUrlPreview: ConnectivityType = ConnectivityType.ALWAYS, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt index dffe10581..68063f479 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt @@ -52,6 +52,7 @@ class SharedPreferencesViewModel : ViewModel() { sharedPrefs.theme = savedSettings.theme sharedPrefs.language = savedSettings.preferredLanguage + sharedPrefs.dontTranslateFrom = savedSettings.dontTranslateFrom sharedPrefs.automaticallyShowImages = savedSettings.automaticallyShowImages sharedPrefs.automaticallyStartPlayback = savedSettings.automaticallyStartPlayback sharedPrefs.automaticallyShowUrlPreview = savedSettings.automaticallyShowUrlPreview @@ -82,6 +83,22 @@ class SharedPreferencesViewModel : ViewModel() { } } + fun addDontTranslateFrom(languageCode: String) { + val newSet = sharedPrefs.dontTranslateFrom.plus(languageCode) + if (newSet != sharedPrefs.dontTranslateFrom) { + sharedPrefs.dontTranslateFrom = newSet + saveSharedSettings() + } + } + + fun removeDontTranslateFrom(languageCode: String) { + val newSet = sharedPrefs.dontTranslateFrom.minus(languageCode) + if (newSet != sharedPrefs.dontTranslateFrom) { + sharedPrefs.dontTranslateFrom = newSet + saveSharedSettings() + } + } + fun updateLanguageInTheUI() { if (sharedPrefs.language != null) { viewModelScope.launch(Dispatchers.Main) { @@ -188,6 +205,7 @@ class SharedPreferencesViewModel : ViewModel() { Settings( sharedPrefs.theme, sharedPrefs.language, + sharedPrefs.dontTranslateFrom, sharedPrefs.automaticallyShowImages, sharedPrefs.automaticallyStartPlayback, sharedPrefs.automaticallyShowUrlPreview, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedSettingsState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedSettingsState.kt index cbdd75954..f70b385b2 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedSettingsState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedSettingsState.kt @@ -38,7 +38,7 @@ import com.vitorpamplona.amethyst.model.ThemeType class SharedSettingsState { var theme by mutableStateOf(ThemeType.SYSTEM) var language by mutableStateOf(null) - + var dontTranslateFrom by mutableStateOf>(emptySet()) var automaticallyShowImages by mutableStateOf(ConnectivityType.ALWAYS) var automaticallyStartPlayback by mutableStateOf(ConnectivityType.ALWAYS) var automaticallyShowUrlPreview by mutableStateOf(ConnectivityType.ALWAYS) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt index 131d971bd..27293b754 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt @@ -32,10 +32,22 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Clear +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -77,6 +89,7 @@ import kotlinx.collections.immutable.toImmutableMap import org.xmlpull.v1.XmlPullParser import org.xmlpull.v1.XmlPullParserException import java.io.IOException +import java.util.Locale as JavaLocale fun Context.getLocaleListFromXml(): LocaleListCompat { val tagsList = mutableListOf() @@ -233,6 +246,10 @@ fun SettingsScreen(sharedPreferencesViewModel: SharedPreferencesViewModel) { Spacer(modifier = HalfVertSpacer) + DontTranslateFromSetting(sharedPreferencesViewModel, languageEntries) + + Spacer(modifier = HalfVertSpacer) + SettingsRow( R.string.theme, R.string.theme_description, @@ -322,6 +339,78 @@ fun SettingsScreen(sharedPreferencesViewModel: SharedPreferencesViewModel) { } } +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DontTranslateFromSetting( + sharedPreferencesViewModel: SharedPreferencesViewModel, + languageEntries: ImmutableMap, +) { + var expanded by remember { mutableStateOf(false) } + val selectedLanguages = sharedPreferencesViewModel.sharedPrefs.dontTranslateFrom + + Column { + SettingsRow( + name = R.string.dont_translate_from, + description = R.string.dont_translate_from_description, + ) { + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = !expanded }, + ) { + OutlinedTextField( + value = stringRes(R.string.add_a_language), + onValueChange = {}, + readOnly = true, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor(), + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false }, + ) { + languageEntries.forEach { (displayName, languageCode) -> + if (!selectedLanguages.contains(languageCode)) { + DropdownMenuItem( + text = { Text(text = displayName) }, + onClick = { + sharedPreferencesViewModel.addDontTranslateFrom(languageCode) + expanded = false + }, + ) + } + } + } + } + } + + selectedLanguages.forEach { languageCode -> + val displayName = + languageEntries.entries.find { it.value == languageCode }?.key + ?: JavaLocale.forLanguageTag(languageCode).displayName + Row( + verticalAlignment = Alignment.CenterVertically, + modifier = + Modifier + .fillMaxWidth() + .padding(vertical = Size10dp), + ) { + Text( + text = displayName, + modifier = Modifier.weight(1f), + ) + IconButton(onClick = { sharedPreferencesViewModel.removeDontTranslateFrom(languageCode) }) { + Icon( + imageVector = Icons.Default.Clear, + contentDescription = stringRes(R.string.remove), + tint = MaterialTheme.colorScheme.onSurface, + ) + } + } + } + } +} + @Composable fun SettingsRow( name: Int, diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index cbcfc0fb4..67ce651af 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -1178,4 +1178,8 @@ Share image… Search hashtag: #%1$s + + Don\'t Translate From + Languages selected here will not be translated + Add a language From a5c370133c7d53a9bc8cda1c5d354b814ff6dbbf Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 25 Jun 2025 10:53:28 +0200 Subject: [PATCH 17/29] Change to show excluded languages in dropdown, no rows below TODO: Load actually excluded languages Optimise code Improve UI --- .../ui/screen/SharedPreferencesViewModel.kt | 8 --- .../loggedIn/settings/AppSettingsScreen.kt | 54 ++++--------------- amethyst/src/main/res/values/strings.xml | 4 +- 3 files changed, 12 insertions(+), 54 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt index 68063f479..e8c7e8d4f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt @@ -83,14 +83,6 @@ class SharedPreferencesViewModel : ViewModel() { } } - fun addDontTranslateFrom(languageCode: String) { - val newSet = sharedPrefs.dontTranslateFrom.plus(languageCode) - if (newSet != sharedPrefs.dontTranslateFrom) { - sharedPrefs.dontTranslateFrom = newSet - saveSharedSettings() - } - } - fun removeDontTranslateFrom(languageCode: String) { val newSet = sharedPrefs.dontTranslateFrom.minus(languageCode) if (newSet != sharedPrefs.dontTranslateFrom) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt index 27293b754..ef85341a5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt @@ -32,14 +32,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material.icons.Icons -import androidx.compose.material.icons.filled.Clear import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults -import androidx.compose.material3.Icon -import androidx.compose.material3.IconButton import androidx.compose.material3.MaterialTheme import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text @@ -246,7 +242,7 @@ fun SettingsScreen(sharedPreferencesViewModel: SharedPreferencesViewModel) { Spacer(modifier = HalfVertSpacer) - DontTranslateFromSetting(sharedPreferencesViewModel, languageEntries) + DontTranslateFromSetting(sharedPreferencesViewModel) Spacer(modifier = HalfVertSpacer) @@ -341,10 +337,7 @@ fun SettingsScreen(sharedPreferencesViewModel: SharedPreferencesViewModel) { @OptIn(ExperimentalMaterial3Api::class) @Composable -fun DontTranslateFromSetting( - sharedPreferencesViewModel: SharedPreferencesViewModel, - languageEntries: ImmutableMap, -) { +fun DontTranslateFromSetting(sharedPreferencesViewModel: SharedPreferencesViewModel) { var expanded by remember { mutableStateOf(false) } val selectedLanguages = sharedPreferencesViewModel.sharedPrefs.dontTranslateFrom @@ -369,45 +362,18 @@ fun DontTranslateFromSetting( expanded = expanded, onDismissRequest = { expanded = false }, ) { - languageEntries.forEach { (displayName, languageCode) -> - if (!selectedLanguages.contains(languageCode)) { - DropdownMenuItem( - text = { Text(text = displayName) }, - onClick = { - sharedPreferencesViewModel.addDontTranslateFrom(languageCode) - expanded = false - }, - ) - } + selectedLanguages.forEach { languageCode -> + DropdownMenuItem( + text = { Text(text = JavaLocale.forLanguageTag(languageCode).displayName) }, + onClick = { + sharedPreferencesViewModel.removeDontTranslateFrom(languageCode) + expanded = false + }, + ) } } } } - - selectedLanguages.forEach { languageCode -> - val displayName = - languageEntries.entries.find { it.value == languageCode }?.key - ?: JavaLocale.forLanguageTag(languageCode).displayName - Row( - verticalAlignment = Alignment.CenterVertically, - modifier = - Modifier - .fillMaxWidth() - .padding(vertical = Size10dp), - ) { - Text( - text = displayName, - modifier = Modifier.weight(1f), - ) - IconButton(onClick = { sharedPreferencesViewModel.removeDontTranslateFrom(languageCode) }) { - Icon( - imageVector = Icons.Default.Clear, - contentDescription = stringRes(R.string.remove), - tint = MaterialTheme.colorScheme.onSurface, - ) - } - } - } } } diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index 67ce651af..c1f4d8aad 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -1180,6 +1180,6 @@ Search hashtag: #%1$s Don\'t Translate From - Languages selected here will not be translated - Add a language + Languages shown here will not be translated. Select a language to remove it and have it translated again. + Select to remove From 2e2a9bb9177d02daecba0ab5dfd8c1d77403b8eb Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 25 Jun 2025 18:13:43 +0200 Subject: [PATCH 18/29] Added user preferences screen --- .../amethyst/ui/navigation/AppNavigation.kt | 2 + .../amethyst/ui/navigation/DrawerContent.kt | 8 +++ .../amethyst/ui/navigation/Routes.kt | 2 + .../loggedIn/settings/UserSettingsScreen.kt | 51 +++++++++++++++++++ amethyst/src/main/res/values/strings.xml | 1 + 5 files changed, 64 insertions(+) create mode 100644 amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt index aee8a9f70..f9fcbf096 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -84,6 +84,7 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.search.SearchScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.settings.NIP47SetupScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.settings.SecurityFiltersScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.settings.SettingsScreen +import com.vitorpamplona.amethyst.ui.screen.loggedIn.settings.UserSettingsScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.threadview.ThreadScreen import com.vitorpamplona.amethyst.ui.screen.loggedIn.video.VideoScreen import com.vitorpamplona.amethyst.ui.screen.loggedOff.AddAccountDialog @@ -123,6 +124,7 @@ fun AppNavigation( composableFromEnd { BookmarkListScreen(accountViewModel, nav) } composableFromEnd { DraftListScreen(accountViewModel, nav) } composableFromEnd { SettingsScreen(sharedPreferencesViewModel, accountViewModel, nav) } + composableFromEnd { UserSettingsScreen(accountViewModel, nav) } composableFromBottomArgs { NIP47SetupScreen(accountViewModel, nav, it.nip47) } composableFromEndArgs { AllRelayListScreen(it.toAdd, accountViewModel, nav) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt index 687b012bb..2aec48a00 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt @@ -508,6 +508,14 @@ fun ListContent( route = Route.Settings, ) + NavigationRow( + title = R.string.user_preferences, + icon = Icons.Outlined.Settings, + tint = MaterialTheme.colorScheme.onBackground, + nav = nav, + route = Route.UserSettings, + ) + Spacer(modifier = Modifier.weight(1f)) IconRow( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt index eced5ad9c..7be1576e3 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/Routes.kt @@ -62,6 +62,8 @@ sealed class Route { @Serializable object Settings : Route() + @Serializable object UserSettings : Route() + @Serializable object EditProfile : Route() @Serializable data class EditRelays( diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt new file mode 100644 index 000000000..f9f08427b --- /dev/null +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt @@ -0,0 +1,51 @@ +/** + * Copyright (c) 2025 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.amethyst.ui.screen.loggedIn.settings + +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.padding +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.vitorpamplona.amethyst.R +import com.vitorpamplona.amethyst.ui.layouts.DisappearingScaffold +import com.vitorpamplona.amethyst.ui.navigation.INav +import com.vitorpamplona.amethyst.ui.navigation.TopBarWithBackButton +import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.stringRes + +@Composable +fun UserSettingsScreen( + accountViewModel: AccountViewModel, + nav: INav, +) { + DisappearingScaffold( + isInvertedLayout = false, + topBar = { + TopBarWithBackButton(stringRes(id = R.string.user_preferences), nav::popBack) + }, + accountViewModel = accountViewModel, + ) { + Column(Modifier.padding(it)) { + Text("Hello World!") + } + } +} diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index c1f4d8aad..b57c94024 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -675,6 +675,7 @@ Adds sensitive content warning before showing this content App Preferences + User Preferences Settings Always From 3524f7e412f2d7fa774dcbc021b3bdf7b59a0205 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 25 Jun 2025 20:18:11 +0200 Subject: [PATCH 19/29] Added support for multiple icons for a single row (backwards compatible) --- .../amethyst/ui/navigation/DrawerContent.kt | 62 ++++++++++++++----- 1 file changed, 46 insertions(+), 16 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt index 2aec48a00..f52aaed5e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/DrawerContent.kt @@ -51,6 +51,7 @@ import androidx.compose.material.icons.outlined.CloudUpload import androidx.compose.material.icons.outlined.Drafts import androidx.compose.material.icons.outlined.GroupAdd import androidx.compose.material.icons.outlined.Key +import androidx.compose.material.icons.outlined.Person import androidx.compose.material.icons.outlined.Security import androidx.compose.material.icons.outlined.Settings import androidx.compose.material3.HorizontalDivider @@ -66,7 +67,6 @@ import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -74,7 +74,6 @@ import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.layout.ContentScale -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.platform.LocalFocusManager import androidx.compose.ui.text.LinkAnnotation import androidx.compose.ui.text.SpanStyle @@ -427,8 +426,6 @@ fun ListContent( var backupDialogOpen by remember { mutableStateOf(false) } - val context = LocalContext.current - Column(modifier) { NavigationRow( title = R.string.profile, @@ -510,7 +507,7 @@ fun ListContent( NavigationRow( title = R.string.user_preferences, - icon = Icons.Outlined.Settings, + icons = listOf(Icons.Outlined.Person, Icons.Outlined.Settings), tint = MaterialTheme.colorScheme.onBackground, nav = nav, route = Route.UserSettings, @@ -592,11 +589,28 @@ fun NavigationRow( tint: Color, nav: INav, route: Route, +) { + NavigationRow( + title = title, + icons = listOf(icon), + tint = tint, + nav = nav, + route = route, + ) +} + +@Composable +fun NavigationRow( + title: Int, + icons: List, + tint: Color, + nav: INav, + route: Route, ) { IconRow( - title, - icon, - tint, + title = title, + icons = icons, + tint = tint, onClick = { nav.closeDrawer() nav.nav(route) @@ -644,6 +658,21 @@ fun IconRow( icon: ImageVector, tint: Color, onClick: () -> Unit, +) { + IconRow( + title = title, + icons = listOf(icon), + tint = tint, + onClick = onClick, + ) +} + +@Composable +fun IconRow( + title: Int, + icons: List, + tint: Color, + onClick: () -> Unit, ) { Row( modifier = @@ -658,12 +687,15 @@ fun IconRow( modifier = IconRowModifier, verticalAlignment = Alignment.CenterVertically, ) { - Icon( - imageVector = icon, - contentDescription = stringRes(title), - modifier = Size22Modifier, - tint = tint, - ) + icons.forEach { icon -> + Icon( + imageVector = icon, + contentDescription = stringRes(title), + modifier = Size22Modifier.padding(end = 4.dp), + tint = tint, + ) + } + Text( modifier = IconRowTextModifier, text = stringRes(title), @@ -717,8 +749,6 @@ fun BottomContent( accountViewModel: AccountViewModel, nav: INav, ) { - val coroutineScope = rememberCoroutineScope() - // store the dialog open or close state var dialogOpen by remember { mutableStateOf(false) } From c59086068b664e0379f603cefcddbf9948b88b6c Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 25 Jun 2025 20:31:21 +0200 Subject: [PATCH 20/29] Move dont translate settings to the dedicated user settings page --- .../amethyst/ui/navigation/AppNavigation.kt | 3 - .../ui/screen/loggedIn/AccountViewModel.kt | 2 + .../loggedIn/settings/AppSettingsScreen.kt | 57 +--------------- .../loggedIn/settings/UserSettingsScreen.kt | 68 +++++++++++++++++++ 4 files changed, 71 insertions(+), 59 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt index f9fcbf096..48276a4c7 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/navigation/AppNavigation.kt @@ -253,9 +253,6 @@ private fun NavigateIfIntentRequested( } nav.newStack(Route.NewPost(message = message, attachment = media.toString())) - - media = null - message = null } else { var newAccount by remember { mutableStateOf(null) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index 6fc5e8653..2edbbd430 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -898,6 +898,8 @@ class AccountViewModel( fun dontTranslateFrom() = account.settings.syncedSettings.languages.dontTranslateFrom + fun toggleDontTranslateFrom(languageCode: String) = account.toggleDontTranslateFrom(languageCode) + fun translateTo() = account.settings.syncedSettings.languages.translateTo fun defaultZapType() = account.settings.syncedSettings.zaps.defaultZapType.value diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt index ef85341a5..f89306911 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt @@ -32,18 +32,10 @@ import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll -import androidx.compose.material3.DropdownMenuItem -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ExposedDropdownMenuBox -import androidx.compose.material3.ExposedDropdownMenuDefaults import androidx.compose.material3.MaterialTheme -import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.getValue -import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember -import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -85,7 +77,6 @@ import kotlinx.collections.immutable.toImmutableMap import org.xmlpull.v1.XmlPullParser import org.xmlpull.v1.XmlPullParserException import java.io.IOException -import java.util.Locale as JavaLocale fun Context.getLocaleListFromXml(): LocaleListCompat { val tagsList = mutableListOf() @@ -128,7 +119,7 @@ fun getLanguageIndex( sharedPreferencesViewModel: SharedPreferencesViewModel, ): Int { val language = sharedPreferencesViewModel.sharedPrefs.language - var languageIndex = -1 + var languageIndex: Int if (language != null) { languageIndex = languageEntries.values.toTypedArray().indexOf(language) } else { @@ -242,10 +233,6 @@ fun SettingsScreen(sharedPreferencesViewModel: SharedPreferencesViewModel) { Spacer(modifier = HalfVertSpacer) - DontTranslateFromSetting(sharedPreferencesViewModel) - - Spacer(modifier = HalfVertSpacer) - SettingsRow( R.string.theme, R.string.theme_description, @@ -335,48 +322,6 @@ fun SettingsScreen(sharedPreferencesViewModel: SharedPreferencesViewModel) { } } -@OptIn(ExperimentalMaterial3Api::class) -@Composable -fun DontTranslateFromSetting(sharedPreferencesViewModel: SharedPreferencesViewModel) { - var expanded by remember { mutableStateOf(false) } - val selectedLanguages = sharedPreferencesViewModel.sharedPrefs.dontTranslateFrom - - Column { - SettingsRow( - name = R.string.dont_translate_from, - description = R.string.dont_translate_from_description, - ) { - ExposedDropdownMenuBox( - expanded = expanded, - onExpandedChange = { expanded = !expanded }, - ) { - OutlinedTextField( - value = stringRes(R.string.add_a_language), - onValueChange = {}, - readOnly = true, - trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, - modifier = Modifier.menuAnchor(), - ) - - ExposedDropdownMenu( - expanded = expanded, - onDismissRequest = { expanded = false }, - ) { - selectedLanguages.forEach { languageCode -> - DropdownMenuItem( - text = { Text(text = JavaLocale.forLanguageTag(languageCode).displayName) }, - onClick = { - sharedPreferencesViewModel.removeDontTranslateFrom(languageCode) - expanded = false - }, - ) - } - } - } - } - } -} - @Composable fun SettingsRow( name: Int, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt index f9f08427b..4ae886b4b 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt @@ -21,9 +21,22 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.settings import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.DropdownMenuItem +import androidx.compose.material3.ExperimentalMaterial3Api +import androidx.compose.material3.ExposedDropdownMenuBox +import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.layouts.DisappearingScaffold @@ -31,6 +44,9 @@ import com.vitorpamplona.amethyst.ui.navigation.INav import com.vitorpamplona.amethyst.ui.navigation.TopBarWithBackButton import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.stringRes +import com.vitorpamplona.amethyst.ui.theme.Size10dp +import com.vitorpamplona.amethyst.ui.theme.Size20dp +import java.util.Locale as JavaLocale @Composable fun UserSettingsScreen( @@ -46,6 +62,58 @@ fun UserSettingsScreen( ) { Column(Modifier.padding(it)) { Text("Hello World!") + + Column( + Modifier + .fillMaxSize() + .padding(top = Size10dp, start = Size20dp, end = Size20dp) + .verticalScroll(rememberScrollState()), + horizontalAlignment = Alignment.CenterHorizontally, + ) { + DontTranslateFromSetting(accountViewModel) + } + } + } +} + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun DontTranslateFromSetting(accountViewModel: AccountViewModel) { + var expanded by remember { mutableStateOf(false) } + val selectedLanguages = accountViewModel.dontTranslateFrom() + + Column { + SettingsRow( + name = R.string.dont_translate_from, + description = R.string.dont_translate_from_description, + ) { + ExposedDropdownMenuBox( + expanded = expanded, + onExpandedChange = { expanded = !expanded }, + ) { + OutlinedTextField( + value = stringRes(R.string.add_a_language), + onValueChange = {}, + readOnly = true, + trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, + modifier = Modifier.menuAnchor(), + ) + + ExposedDropdownMenu( + expanded = expanded, + onDismissRequest = { expanded = false }, + ) { + selectedLanguages.forEach { languageCode -> + DropdownMenuItem( + text = { Text(text = JavaLocale.forLanguageTag(languageCode).displayName) }, + onClick = { + accountViewModel.toggleDontTranslateFrom(languageCode) + expanded = false + }, + ) + } + } + } } } } From f0670971ef8239b60406c555f1ca09a8a8bf59c7 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 25 Jun 2025 20:51:11 +0200 Subject: [PATCH 21/29] Wrap update call in IO scope TODO: Don't show users own languages Remove language from drop down Add explainer --- .../ui/screen/loggedIn/settings/UserSettingsScreen.kt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt index 4ae886b4b..1d30cfe38 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt @@ -38,6 +38,7 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.layouts.DisappearingScaffold import com.vitorpamplona.amethyst.ui.navigation.INav @@ -46,6 +47,8 @@ import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.theme.Size10dp import com.vitorpamplona.amethyst.ui.theme.Size20dp +import kotlinx.coroutines.Dispatchers +import kotlinx.coroutines.launch import java.util.Locale as JavaLocale @Composable @@ -61,8 +64,6 @@ fun UserSettingsScreen( accountViewModel = accountViewModel, ) { Column(Modifier.padding(it)) { - Text("Hello World!") - Column( Modifier .fillMaxSize() @@ -107,7 +108,11 @@ fun DontTranslateFromSetting(accountViewModel: AccountViewModel) { DropdownMenuItem( text = { Text(text = JavaLocale.forLanguageTag(languageCode).displayName) }, onClick = { - accountViewModel.toggleDontTranslateFrom(languageCode) + accountViewModel.viewModelScope.launch(Dispatchers.IO) { + accountViewModel.toggleDontTranslateFrom( + languageCode, + ) + } expanded = false }, ) From 759ef44440dcd2310889a8934e70005d79d88e4f Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Wed, 25 Jun 2025 20:54:19 +0200 Subject: [PATCH 22/29] Remove previous implementation TODO: Rename Settings to AppSettings (routes, classes) Don't show users own languages Remove language from drop down Add explainer Change to dropdown with Xs --- .../java/com/vitorpamplona/amethyst/model/Settings.kt | 1 - .../amethyst/ui/screen/SharedPreferencesViewModel.kt | 10 ---------- .../amethyst/ui/screen/SharedSettingsState.kt | 2 +- .../ui/screen/loggedIn/settings/AppSettingsScreen.kt | 11 ++++++----- 4 files changed, 7 insertions(+), 17 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt index 0487326ae..356f79707 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/Settings.kt @@ -27,7 +27,6 @@ import com.vitorpamplona.amethyst.R data class Settings( val theme: ThemeType = ThemeType.SYSTEM, val preferredLanguage: String? = null, - val dontTranslateFrom: Set = emptySet(), val automaticallyShowImages: ConnectivityType = ConnectivityType.ALWAYS, val automaticallyStartPlayback: ConnectivityType = ConnectivityType.ALWAYS, val automaticallyShowUrlPreview: ConnectivityType = ConnectivityType.ALWAYS, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt index e8c7e8d4f..dffe10581 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedPreferencesViewModel.kt @@ -52,7 +52,6 @@ class SharedPreferencesViewModel : ViewModel() { sharedPrefs.theme = savedSettings.theme sharedPrefs.language = savedSettings.preferredLanguage - sharedPrefs.dontTranslateFrom = savedSettings.dontTranslateFrom sharedPrefs.automaticallyShowImages = savedSettings.automaticallyShowImages sharedPrefs.automaticallyStartPlayback = savedSettings.automaticallyStartPlayback sharedPrefs.automaticallyShowUrlPreview = savedSettings.automaticallyShowUrlPreview @@ -83,14 +82,6 @@ class SharedPreferencesViewModel : ViewModel() { } } - fun removeDontTranslateFrom(languageCode: String) { - val newSet = sharedPrefs.dontTranslateFrom.minus(languageCode) - if (newSet != sharedPrefs.dontTranslateFrom) { - sharedPrefs.dontTranslateFrom = newSet - saveSharedSettings() - } - } - fun updateLanguageInTheUI() { if (sharedPrefs.language != null) { viewModelScope.launch(Dispatchers.Main) { @@ -197,7 +188,6 @@ class SharedPreferencesViewModel : ViewModel() { Settings( sharedPrefs.theme, sharedPrefs.language, - sharedPrefs.dontTranslateFrom, sharedPrefs.automaticallyShowImages, sharedPrefs.automaticallyStartPlayback, sharedPrefs.automaticallyShowUrlPreview, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedSettingsState.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedSettingsState.kt index f70b385b2..cbdd75954 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedSettingsState.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/SharedSettingsState.kt @@ -38,7 +38,7 @@ import com.vitorpamplona.amethyst.model.ThemeType class SharedSettingsState { var theme by mutableStateOf(ThemeType.SYSTEM) var language by mutableStateOf(null) - var dontTranslateFrom by mutableStateOf>(emptySet()) + var automaticallyShowImages by mutableStateOf(ConnectivityType.ALWAYS) var automaticallyStartPlayback by mutableStateOf(ConnectivityType.ALWAYS) var automaticallyShowUrlPreview by mutableStateOf(ConnectivityType.ALWAYS) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt index f89306911..ed6911b7a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt @@ -120,11 +120,12 @@ fun getLanguageIndex( ): Int { val language = sharedPreferencesViewModel.sharedPrefs.language var languageIndex: Int - if (language != null) { - languageIndex = languageEntries.values.toTypedArray().indexOf(language) - } else { - languageIndex = languageEntries.values.toTypedArray().indexOf(Locale.current.toLanguageTag()) - } + languageIndex = + if (language != null) { + languageEntries.values.toTypedArray().indexOf(language) + } else { + languageEntries.values.toTypedArray().indexOf(Locale.current.toLanguageTag()) + } if (languageIndex == -1) { languageIndex = languageEntries.values.toTypedArray().indexOf(Locale.current.language) } From 5620eb023b6d00ff614cec511099fdd0d89a5790 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 26 Jun 2025 08:56:23 +0200 Subject: [PATCH 23/29] added preview for UserSettingsScreen.kt TODO: Rename Settings to AppSettings (routes, classes) Don't show users own languages Remove language from drop down Add explainer --- .../loggedIn/settings/UserSettingsScreen.kt | 21 +++++++++++++++++-- amethyst/src/main/res/values/strings.xml | 1 - 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt index 1d30cfe38..dbdd51c58 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt @@ -21,8 +21,10 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.settings import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.DropdownMenuItem @@ -38,19 +40,34 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.layouts.DisappearingScaffold +import com.vitorpamplona.amethyst.ui.navigation.EmptyNav import com.vitorpamplona.amethyst.ui.navigation.INav import com.vitorpamplona.amethyst.ui.navigation.TopBarWithBackButton import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel +import com.vitorpamplona.amethyst.ui.screen.loggedIn.mockAccountViewModel import com.vitorpamplona.amethyst.ui.stringRes import com.vitorpamplona.amethyst.ui.theme.Size10dp import com.vitorpamplona.amethyst.ui.theme.Size20dp +import com.vitorpamplona.amethyst.ui.theme.ThemeComparisonRow import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.launch import java.util.Locale as JavaLocale +@Preview(device = "spec:width=2160px,height=2340px,dpi=440") +@Composable +fun UserSettingsScreenPreview() { + val accountViewModel = mockAccountViewModel() + val nav = EmptyNav + ThemeComparisonRow { + UserSettingsScreen(accountViewModel, nav) + } +} + @Composable fun UserSettingsScreen( accountViewModel: AccountViewModel, @@ -93,11 +110,11 @@ fun DontTranslateFromSetting(accountViewModel: AccountViewModel) { onExpandedChange = { expanded = !expanded }, ) { OutlinedTextField( - value = stringRes(R.string.add_a_language), + value = stringRes(R.string.quick_action_select), onValueChange = {}, readOnly = true, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, - modifier = Modifier.menuAnchor(), + modifier = Modifier.windowInsetsPadding(WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)), ) ExposedDropdownMenu( diff --git a/amethyst/src/main/res/values/strings.xml b/amethyst/src/main/res/values/strings.xml index b57c94024..2d9b6cdb2 100644 --- a/amethyst/src/main/res/values/strings.xml +++ b/amethyst/src/main/res/values/strings.xml @@ -1182,5 +1182,4 @@ Don\'t Translate From Languages shown here will not be translated. Select a language to remove it and have it translated again. - Select to remove From fdf11d3ca39c119a28d891bf7b5a2c3a3282eae3 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 26 Jun 2025 09:06:02 +0200 Subject: [PATCH 24/29] revert dropdown TODO: Rename Settings to AppSettings (routes, classes) Don't show users own languages Remove language from drop down Add explainer --- .../ui/screen/loggedIn/settings/UserSettingsScreen.kt | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt index dbdd51c58..ce61a37f8 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt @@ -21,16 +21,15 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.settings import androidx.compose.foundation.layout.Column -import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.MenuAnchorType import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -41,7 +40,6 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.tooling.preview.Preview -import androidx.compose.ui.unit.dp import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.layouts.DisappearingScaffold @@ -114,7 +112,7 @@ fun DontTranslateFromSetting(accountViewModel: AccountViewModel) { onValueChange = {}, readOnly = true, trailingIcon = { ExposedDropdownMenuDefaults.TrailingIcon(expanded = expanded) }, - modifier = Modifier.windowInsetsPadding(WindowInsets(0.dp, 0.dp, 0.dp, 0.dp)), + modifier = Modifier.menuAnchor(MenuAnchorType.PrimaryEditable), ) ExposedDropdownMenu( From 6015ea04cefbf70e1c4a7cc4ea15b1d123d0e400 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Thu, 26 Jun 2025 13:16:51 +0200 Subject: [PATCH 25/29] remove selected language from dropdown TODO: Rename Settings to AppSettings (routes, classes) Don't show users own languages Add explainer --- .../amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt index ce61a37f8..e95ca4664 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt @@ -96,7 +96,7 @@ fun UserSettingsScreen( @Composable fun DontTranslateFromSetting(accountViewModel: AccountViewModel) { var expanded by remember { mutableStateOf(false) } - val selectedLanguages = accountViewModel.dontTranslateFrom() + val selectedLanguages = accountViewModel.dontTranslateFrom().toMutableSet() Column { SettingsRow( @@ -128,6 +128,7 @@ fun DontTranslateFromSetting(accountViewModel: AccountViewModel) { languageCode, ) } + selectedLanguages.remove(languageCode) expanded = false }, ) From 65cca8aa3483bb1fbcbbcf81ecc6ffe913f7092f Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sun, 29 Jun 2025 17:29:20 +0100 Subject: [PATCH 26/29] Don't show users own languages TODO: Add red x to items Rename Settings to AppSettings (routes, classes) Add explainer --- .../com/vitorpamplona/amethyst/model/AccountSyncedSettings.kt | 4 ++++ .../amethyst/ui/screen/loggedIn/AccountViewModel.kt | 2 ++ .../ui/screen/loggedIn/settings/UserSettingsScreen.kt | 2 +- 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSyncedSettings.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSyncedSettings.kt index c6a6bb951..8ee4e293f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSyncedSettings.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/model/AccountSyncedSettings.kt @@ -113,6 +113,10 @@ class AccountSyncedSettings( security.warnAboutPostsWithReports = syncedSettingsInternal.security.warnAboutPostsWithReports } } + + fun dontTranslateFromFilteredBySpokenLanguages(): Set { + return languages.dontTranslateFrom - getLanguagesSpokenByUser() + } } @Stable diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index 2edbbd430..f4d592aac 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -898,6 +898,8 @@ class AccountViewModel( fun dontTranslateFrom() = account.settings.syncedSettings.languages.dontTranslateFrom + fun dontTranslateFromFilteredBySpokenLanguages() = account.settings.syncedSettings.dontTranslateFromFilteredBySpokenLanguages() + fun toggleDontTranslateFrom(languageCode: String) = account.toggleDontTranslateFrom(languageCode) fun translateTo() = account.settings.syncedSettings.languages.translateTo diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt index e95ca4664..4c025091e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt @@ -96,7 +96,7 @@ fun UserSettingsScreen( @Composable fun DontTranslateFromSetting(accountViewModel: AccountViewModel) { var expanded by remember { mutableStateOf(false) } - val selectedLanguages = accountViewModel.dontTranslateFrom().toMutableSet() + val selectedLanguages = accountViewModel.dontTranslateFromFilteredBySpokenLanguages().toMutableSet() Column { SettingsRow( From 285603cc0fa095cbe8d3ff2d987397c6ffc87806 Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sun, 29 Jun 2025 17:37:50 +0100 Subject: [PATCH 27/29] added trailing x icon to menu items to clarify removal --- .../screen/loggedIn/settings/UserSettingsScreen.kt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt index 4c025091e..9f57b1af5 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/UserSettingsScreen.kt @@ -23,12 +23,16 @@ package com.vitorpamplona.amethyst.ui.screen.loggedIn.settings import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.verticalScroll +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Close import androidx.compose.material3.DropdownMenuItem import androidx.compose.material3.ExperimentalMaterial3Api import androidx.compose.material3.ExposedDropdownMenuBox import androidx.compose.material3.ExposedDropdownMenuDefaults +import androidx.compose.material3.Icon import androidx.compose.material3.MenuAnchorType import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text @@ -39,7 +43,9 @@ import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import androidx.lifecycle.viewModelScope import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.ui.layouts.DisappearingScaffold @@ -131,6 +137,14 @@ fun DontTranslateFromSetting(accountViewModel: AccountViewModel) { selectedLanguages.remove(languageCode) expanded = false }, + trailingIcon = { + Icon( + imageVector = Icons.Default.Close, + contentDescription = "Remove $languageCode", + tint = Color.Red, + modifier = Modifier.size(16.dp), + ) + }, ) } } From fb9c070ee60226ed4c0e5d34629ebeb9523b26eb Mon Sep 17 00:00:00 2001 From: David Kaspar Date: Sun, 29 Jun 2025 18:33:30 +0100 Subject: [PATCH 28/29] One more line for description --- .../amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt index ed6911b7a..5eb38c0aa 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/AppSettingsScreen.kt @@ -366,7 +366,7 @@ fun SettingsRow( text = stringRes(description), style = MaterialTheme.typography.bodySmall, color = Color.Gray, - maxLines = 2, + maxLines = 3, overflow = TextOverflow.Ellipsis, ) } From bfe5fcf0b14f4b6ae1f7d5c4a2e21f36b1468a0e Mon Sep 17 00:00:00 2001 From: greenart7c3 Date: Mon, 30 Jun 2025 08:11:10 -0300 Subject: [PATCH 29/29] - Propagate Auth event to `sendAndWaitForResponse` - Pass feed types to `sendSingle` when sending signed event --- .../vitorpamplona/ammolite/relays/NostrClient.kt | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrClient.kt b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrClient.kt index 9fb98f556..14b05d3ed 100644 --- a/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrClient.kt +++ b/ammolite/src/main/java/com/vitorpamplona/ammolite/relays/NostrClient.kt @@ -152,6 +152,7 @@ class NostrClient( onDone: (() -> Unit)? = null, additionalListener: Listener? = null, timeoutInSeconds: Long = 15, + onAuth: ((Relay, String) -> Unit)? = null, ): Boolean { checkNotInMainThread() @@ -164,6 +165,16 @@ class NostrClient( val subscription = object : Listener { + override fun onAuth( + relay: Relay, + challenge: String, + ) { + onAuth?.let { + it(relay, challenge) + } + Log.d("sendAndWaitForResponse", "onAuth Auth from relay ${relay.url} count: ${latch.count} challenge: $challenge") + } + override fun onError( error: Error, subscriptionId: String, @@ -225,7 +236,7 @@ class NostrClient( } else if (relay == null) { send(signedEvent) } else { - sendSingle(signedEvent, RelaySetupInfoToConnect(relay, forceProxy, true, true, emptySet()), onDone ?: {}) + sendSingle(signedEvent, RelaySetupInfoToConnect(relay, forceProxy, true, true, feedTypes ?: emptySet()), onDone ?: {}) } } job.join()