diff --git a/.claude/skills/searchable-events/references/searchable-kinds.md b/.claude/skills/searchable-events/references/searchable-kinds.md index d9942a6530..532ecc3d68 100644 --- a/.claude/skills/searchable-events/references/searchable-kinds.md +++ b/.claude/skills/searchable-events/references/searchable-kinds.md @@ -140,7 +140,7 @@ Separator legend: **NL** = `joinToString("\n")`, **SP** = `joinToString(" ")`. | 39000 | GroupMetadataEvent | nip29RelayGroups/metadata | `listOfNotNull(name(), about())` NL | | 39089 | StarterPackEvent | nip51Lists/starterPack | `listOfNotNull(title(), description())` NL | | 39092 | MediaStarterPackEvent | nip51Lists/mediaStarterPack | `listOfNotNull(title(), description())` NL | -| 39307 | TextTrackEvent | nip71Video/textTrack | `content` (the WebVTT cue text) | +| 39307 | TextTrackEvent | nip71Video/textTrack | `WebVttText.cueText(content)` NL — each cue's payload lines with tags removed and character references decoded; no header, timings, cue settings, ids, `NOTE`/`STYLE`/`REGION` blocks. Content with no `-->` timing line is not a caption file and is indexed as written | | 39701 | WebBookmarkEvent | nipB0WebBookmarks | `listOfNotNull(title(), description())` NL | | 39998 | AddressableListHeaderEvent | experimental/decentralizedLists/header | same as 9998 | | 39999 | AddressableListItemEvent | experimental/decentralizedLists/item | same as 9998 | diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackDiag.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackDiag.kt index c6cd9c9085..ac5c018225 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackDiag.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/PlaybackDiag.kt @@ -22,9 +22,13 @@ package com.vitorpamplona.amethyst.service.playback /** * Shared logcat tag for the playback diagnostic trace (source routing, player lifecycle, error - * recovery, HLS liveness learning). Emitted with `Log.d`, so it appears only in a debug build - * (`Log.minLevel = DEBUG`) and is silent in benchmark/release (`ERROR`). To capture a playback - * investigation, install a debug build and run: + * recovery, HLS liveness learning). + * + * Emitted with `Log.d`, which fires only while `Log.minLevel <= DEBUG`. No shipped variant is + * there by default: [com.vitorpamplona.amethyst.Amethyst.DEFAULT_LOG_LEVEL] gives debug AND + * benchmark builds `INFO` (the `benchmark` build type counts as `isDebug`) and release `WARN`, so + * this trace is silent everywhere until `Amethyst.VERBOSE_LOGS` is flipped to true. To capture a + * playback investigation, set that flag, install a debug build and run: * * ``` * adb logcat -s PlaybackDiag diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/composable/controls/VideoQualityControls.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/composable/controls/VideoQualityControls.kt index dbc3491464..8acee68d0a 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/composable/controls/VideoQualityControls.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/composable/controls/VideoQualityControls.kt @@ -148,9 +148,11 @@ const val VIDEO_QUALITY_TAG = "VideoQuality" * Traces which rendition adaptive selection landed on, against the full ladder the manifest * offered. * - * The listener is registered only when the trace can actually be emitted — debug builds set - * `Log.minLevel = DEBUG` while benchmark/release set `ERROR` (see [PLAYBACK_DIAG_TAG]) — so the - * release path keeps the "no listener per player" property that dropping the old selector bought. + * The listener is registered only when the trace can actually be emitted. `Log.minLevel` is above + * `DEBUG` in every variant by default — `INFO` for debug and benchmark builds, `WARN` for release + * (see [PLAYBACK_DIAG_TAG]) — so this costs nothing until `Amethyst.VERBOSE_LOGS` is turned on, + * and every build keeps the "no listener per player" property that dropping the old selector + * bought. */ @Composable fun LogVideoQualitySelection(player: Player) { diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/playerPool/PcmTapRegistry.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/playerPool/PcmTapRegistry.kt index 62129db719..2fd9ce4a6d 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/playerPool/PcmTapRegistry.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/service/playback/playerPool/PcmTapRegistry.kt @@ -27,9 +27,11 @@ import androidx.media3.exoplayer.audio.TeeAudioProcessor import com.vitorpamplona.amethyst.commons.audio.AudioWindow import com.vitorpamplona.amethyst.commons.audio.Fft import com.vitorpamplona.amethyst.commons.audio.Spectrum +import com.vitorpamplona.amethyst.commons.audio.SpectrumTrail import com.vitorpamplona.amethyst.commons.audio.normalizeToPeakInPlace import com.vitorpamplona.amethyst.commons.audio.toLogBins import kotlinx.coroutines.ExperimentalCoroutinesApi +import kotlinx.coroutines.channels.BufferOverflow import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.MutableSharedFlow import java.nio.ByteBuffer @@ -65,6 +67,10 @@ class SpectrumAudioBufferSink( private var channels = 1 private var encoding = C.ENCODING_PCM_16BIT + // Audio time one fft frame covers: fftSize samples per channel at the stream's sample rate. + // Zero until the first flush reports a rate, which leaves the frame unpaced rather than wrong. + private var frameDurationNanos = 0L + @kotlin.OptIn(ExperimentalCoroutinesApi::class) override fun flush( sampleRateHz: Int, @@ -73,6 +79,7 @@ class SpectrumAudioBufferSink( ) { this.channels = channelCount.coerceAtLeast(1) this.encoding = encoding + this.frameDurationNanos = if (sampleRateHz > 0) fftSize * 1_000_000_000L / sampleRateHz else 0L filled = 0 output?.resetReplayCache() } @@ -98,7 +105,7 @@ class SpectrumAudioBufferSink( // Skip the DC bin (index 0): toLogBins ignores it, so letting a DC/offset component be the // peak would scale every audible bin toward zero and wash the spectrum out. mags.normalizeToPeakInPlace(fromIndex = 1) - output?.tryEmit(Spectrum(mags.toLogBins(binCount))) + output?.tryEmit(Spectrum(mags.toLogBins(binCount), frameDurationNanos)) } } @@ -167,7 +174,15 @@ object PcmTapRegistry { if (!fedByLiveSink && !stillCollected) iter.remove() } } - MutableSharedFlow(replay = 1, extraBufferCapacity = 1) + // Frames arrive in clusters (see SpectrumTrail) emitted within a few ms on the audio + // thread, while the collector sits on the main dispatcher and cannot run in between; + // a 2-slot buffer kept ~2 frames of each cluster and dropped the rest. Hold as much as + // the visualizer's own backlog, which is the real lag bound, dropping the stalest. + MutableSharedFlow( + replay = 1, + extraBufferCapacity = SpectrumTrail.MAX_BACKLOG_FRAMES, + onBufferOverflow = BufferOverflow.DROP_OLDEST, + ) } } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/CyberspaceBag.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/CyberspaceBag.kt index 6249d38fed..1490ae1cde 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/CyberspaceBag.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/note/types/CyberspaceBag.kt @@ -50,7 +50,6 @@ import com.vitorpamplona.amethyst.commons.resources.cyberspace_bag_cancel import com.vitorpamplona.amethyst.commons.resources.cyberspace_bag_damaged import com.vitorpamplona.amethyst.commons.resources.cyberspace_bag_destination import com.vitorpamplona.amethyst.commons.resources.cyberspace_bag_dropped -import com.vitorpamplona.amethyst.commons.resources.cyberspace_bag_dropped_many import com.vitorpamplona.amethyst.commons.resources.cyberspace_bag_empty import com.vitorpamplona.amethyst.commons.resources.cyberspace_bag_measuring import com.vitorpamplona.amethyst.commons.resources.cyberspace_bag_no_hint @@ -80,6 +79,7 @@ import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job import kotlinx.coroutines.flow.flowOn import kotlinx.coroutines.launch +import org.jetbrains.compose.resources.pluralStringResource import org.jetbrains.compose.resources.stringResource /** @@ -242,7 +242,7 @@ private fun Contents( null -> Footnote(stringResource(Res.string.cyberspace_bag_damaged)) is CyberspaceBagContents.Opaque -> - Footnote(asText(contents.bytes) ?: stringResource(Res.string.cyberspace_bag_opaque, contents.bytes.size)) + Footnote(asText(contents.bytes) ?: pluralStringResource(Res.plurals.cyberspace_bag_opaque, contents.bytes.size, contents.bytes.size)) is CyberspaceBagContents.Items -> { if (contents.items.isEmpty() && contents.dropped == 0) { @@ -256,13 +256,7 @@ private fun Contents( // still worth saying that something was thrown away. if (contents.dropped > 0) { Spacer(Modifier.height(6.dp)) - Footnote( - if (contents.dropped == 1) { - stringResource(Res.string.cyberspace_bag_dropped, contents.dropped) - } else { - stringResource(Res.string.cyberspace_bag_dropped_many, contents.dropped) - }, - ) + Footnote(pluralStringResource(Res.plurals.cyberspace_bag_dropped, contents.dropped, contents.dropped)) } } } @@ -322,9 +316,10 @@ private fun Footnote(text: String) { private fun outOfReach(estimateMillis: Long): String { val minutes = estimateMillis / 60_000L return if (minutes >= MINUTES_PER_HOUR) { - stringResource(Res.string.cyberspace_bag_too_slow_hours, (minutes / MINUTES_PER_HOUR).toInt()) + val hours = (minutes / MINUTES_PER_HOUR).toInt() + pluralStringResource(Res.plurals.cyberspace_bag_too_slow_hours, hours, hours) } else { - stringResource(Res.string.cyberspace_bag_too_slow_minutes, minutes.toInt()) + pluralStringResource(Res.plurals.cyberspace_bag_too_slow_minutes, minutes.toInt(), minutes.toInt()) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/backups/BackupConflictEventViews.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/backups/BackupConflictEventViews.kt index 1916f09286..b348bb27a9 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/backups/BackupConflictEventViews.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/backups/BackupConflictEventViews.kt @@ -144,6 +144,7 @@ import com.vitorpamplona.amethyst.ui.note.NoteCompose import com.vitorpamplona.amethyst.ui.note.UserPicture import com.vitorpamplona.amethyst.ui.note.UsernameDisplay import com.vitorpamplona.amethyst.ui.note.elements.BannerImage +import com.vitorpamplona.amethyst.ui.pluralStringRes import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.publicChannels.relayGroup.LoadRelayGroupChannel import com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.rooms.LoadUser @@ -420,7 +421,7 @@ private fun PeopleSearch( singleLine = true, shape = RoundedCornerShape(14.dp), leadingIcon = { Icon(symbol = MaterialSymbols.Search, contentDescription = null) }, - placeholder = { Text(stringRes(Res.string.backup_review_search_people, count.toString())) }, + placeholder = { Text(pluralStringRes(Res.plurals.backup_review_search_people, count, count.toString())) }, ) } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/backups/BackupConflictListViews.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/backups/BackupConflictListViews.kt index 19d694dd09..9be726a715 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/backups/BackupConflictListViews.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/backups/BackupConflictListViews.kt @@ -754,7 +754,7 @@ private fun LazyListScope.trustProviderItems( Icon(symbol = MaterialSymbols.Group, contentDescription = null, tint = tones.changed) } Column { - Text(stringRes(Res.string.backup_review_services_changed, affected.toString(), services.size.toString()), fontSize = 24.sp, lineHeight = 28.sp, fontWeight = FontWeight.Bold) + Text(pluralStringResource(Res.plurals.backup_review_services_changed, services.size, affected.toString(), services.size.toString()), fontSize = 24.sp, lineHeight = 28.sp, fontWeight = FontWeight.Bold) Text(stringRes(Res.string.backup_review_services_changed_explainer), style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.placeholderText) } } diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/cordnGroup/CordnCreateGroupScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/cordnGroup/CordnCreateGroupScreen.kt index 6479e51eb5..d1d0f28e89 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/cordnGroup/CordnCreateGroupScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/chats/cordnGroup/CordnCreateGroupScreen.kt @@ -387,7 +387,7 @@ fun CordnCreateGroupScreen( if (draft.showStale) { stringRes(Res.string.cordn_coordinators_hide_older) } else { - stringRes(Res.string.cordn_coordinators_show_older, stale.size) + pluralStringRes(Res.plurals.cordn_coordinators_show_older, stale.size, stale.size) }, ) } @@ -462,7 +462,7 @@ fun CordnCreateGroupScreen( // different answers and only one of them is final. // Reporting the first for the second sends someone // off to paste a pubkey by hand over a timeout. - stringRes(Res.string.cordn_coordinators_discover_unheard, result.unreachable.size) + pluralStringRes(Res.plurals.cordn_coordinators_discover_unheard, result.unreachable.size, result.unreachable.size) }, style = MaterialTheme.typography.bodySmall, color = MaterialTheme.colorScheme.onSurfaceVariant, @@ -927,7 +927,7 @@ private fun CoordinatorSummary( text = when { coverage == null || !coverage.answered -> stringRes(Res.string.cordn_create_coverage_unknown) - reached == rosterSize -> stringRes(Res.string.cordn_create_coverage_all, rosterSize) + reached == rosterSize -> pluralStringRes(Res.plurals.cordn_create_coverage_all, rosterSize, rosterSize) else -> stringRes(Res.string.cordn_create_coverage_partial, reached ?: 0, rosterSize) }, style = MaterialTheme.typography.labelSmall, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geocaches/GeocacheHuntRow.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geocaches/GeocacheHuntRow.kt index 0f1ff285f3..6bb8654ded 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geocaches/GeocacheHuntRow.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geocaches/GeocacheHuntRow.kt @@ -45,6 +45,7 @@ import com.vitorpamplona.amethyst.commons.resources.geocache_hunt_caches import com.vitorpamplona.amethyst.commons.resources.geocache_hunt_progress import com.vitorpamplona.amethyst.commons.ui.navigation.navs.INav import com.vitorpamplona.amethyst.commons.ui.note.rememberGeocachePalette +import com.vitorpamplona.amethyst.commons.ui.pluralStringRes import com.vitorpamplona.amethyst.commons.ui.stringRes import com.vitorpamplona.amethyst.ui.components.MyAsyncImage import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel @@ -119,7 +120,7 @@ fun GeocacheHuntRow( Text( text = stringRes(Res.string.geocache_hunt_progress, doneCount, caches.size) + - " · " + stringRes(Res.string.geocache_hunt_caches, caches.size), + " · " + pluralStringRes(Res.plurals.geocache_hunt_caches, caches.size, caches.size), style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geocaches/detail/GeocacheAddToHuntSheet.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geocaches/detail/GeocacheAddToHuntSheet.kt index fa89098694..7028c9f23f 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geocaches/detail/GeocacheAddToHuntSheet.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geocaches/detail/GeocacheAddToHuntSheet.kt @@ -56,6 +56,7 @@ import com.vitorpamplona.amethyst.commons.resources.geocache_hunt_already_on import com.vitorpamplona.amethyst.commons.resources.geocache_hunt_caches import com.vitorpamplona.amethyst.commons.resources.geocache_hunt_new import com.vitorpamplona.amethyst.commons.resources.geocache_hunt_none_yet +import com.vitorpamplona.amethyst.commons.ui.pluralStringRes import com.vitorpamplona.amethyst.commons.ui.stringRes import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.quartz.nip01Core.core.Address @@ -178,7 +179,8 @@ fun GeocacheAddToHuntSheet( if (already) { stringRes(Res.string.geocache_hunt_already_on) } else { - stringRes(Res.string.geocache_hunt_caches, hunt.geocaches().size) + val cacheCount = hunt.geocaches().size + pluralStringRes(Res.plurals.geocache_hunt_caches, cacheCount, cacheCount) }, style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/GeocachesHereChip.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/GeocachesHereChip.kt index 744cc2c59d..a279748574 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/GeocachesHereChip.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/geohash/GeocachesHereChip.kt @@ -48,7 +48,7 @@ import com.vitorpamplona.amethyst.commons.resources.geocache_caches_here import com.vitorpamplona.amethyst.commons.ui.feeds.WatchLifecycleAndUpdateModel import com.vitorpamplona.amethyst.commons.ui.navigation.navs.INav import com.vitorpamplona.amethyst.commons.ui.note.rememberGeocachePalette -import com.vitorpamplona.amethyst.commons.ui.stringRes +import com.vitorpamplona.amethyst.commons.ui.pluralStringRes import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.geocaches.dal.GeocachesHereFeedViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.geocaches.datasource.GeocachesFilterAssemblerSubscription @@ -121,7 +121,7 @@ private fun GeocachesHereCount( tint = palette.live, ) Text( - text = stringRes(Res.string.geocache_caches_here, count), + text = pluralStringRes(Res.plurals.geocache_caches_here, count, count), style = MaterialTheme.typography.labelMedium, fontWeight = FontWeight.SemiBold, color = MaterialTheme.colorScheme.onSurface, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/qrcode/scanner/QrScannerOverlay.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/qrcode/scanner/QrScannerOverlay.kt index 5de6999b6b..3a04b0a27e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/qrcode/scanner/QrScannerOverlay.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/qrcode/scanner/QrScannerOverlay.kt @@ -63,6 +63,7 @@ import com.vitorpamplona.amethyst.commons.resources.qr_scanner_sequence_progress import com.vitorpamplona.amethyst.commons.resources.qr_scanner_torch_off import com.vitorpamplona.amethyst.commons.resources.qr_scanner_torch_on import com.vitorpamplona.amethyst.commons.resources.qr_scanner_zoom_reset +import com.vitorpamplona.amethyst.commons.ui.pluralStringRes import com.vitorpamplona.amethyst.commons.ui.stringRes import kotlin.math.max @@ -255,7 +256,7 @@ private fun HintStack( val message = when { state.notice != null -> state.notice - progress != null -> stringRes(Res.string.qr_scanner_sequence_progress, progress.first, progress.second) + progress != null -> pluralStringRes(Res.plurals.qr_scanner_sequence_progress, progress.second, progress.first, progress.second) state.candidates.size > 1 -> stringRes(Res.string.qr_scanner_pick_one) state.isDark && !state.torchOn -> stringRes(Res.string.qr_scanner_dark_hint) else -> null diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/cordn/CordnCoordinatorsScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/cordn/CordnCoordinatorsScreen.kt index cdae46aa2a..d59da9ba7e 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/cordn/CordnCoordinatorsScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/cordn/CordnCoordinatorsScreen.kt @@ -114,6 +114,7 @@ import com.vitorpamplona.amethyst.commons.ui.note.timeAgoNoDot import com.vitorpamplona.amethyst.commons.ui.theme.DividerThickness import com.vitorpamplona.amethyst.model.cordn.CordnRuntime import com.vitorpamplona.amethyst.ui.note.UserPicture +import com.vitorpamplona.amethyst.ui.pluralStringRes import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.chats.cordnGroup.CopyableKeyRow import com.vitorpamplona.amethyst.ui.screen.loggedIn.settings.SettingsSection @@ -444,7 +445,7 @@ private fun HealthLine(state: CoordinatorHealth.State) { val text = when { state.isUnknown -> stringRes(Res.string.cordn_coordinators_health_unknown) - state.isDown -> stringRes(Res.string.cordn_coordinators_health_down, state.consecutiveFailures) + state.isDown -> pluralStringRes(Res.plurals.cordn_coordinators_health_down, state.consecutiveFailures, state.consecutiveFailures) state.consecutiveFailures > 0 -> stringRes(Res.string.cordn_coordinators_health_retrying) else -> stringRes(Res.string.cordn_coordinators_health_ok) } @@ -535,7 +536,7 @@ private fun DiscoverCoordinators( } else { // "Nobody is announcing" and "we were not told" are // different answers and only one of them is final. - stringRes(Res.string.cordn_coordinators_discover_unheard, found.unreachable.size) + pluralStringRes(Res.plurals.cordn_coordinators_discover_unheard, found.unreachable.size, found.unreachable.size) }, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, diff --git a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/cordn/CordnMigrateScreen.kt b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/cordn/CordnMigrateScreen.kt index 6c55c2bbb0..299e0c9c97 100644 --- a/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/cordn/CordnMigrateScreen.kt +++ b/amethyst/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/settings/cordn/CordnMigrateScreen.kt @@ -80,6 +80,7 @@ import com.vitorpamplona.amethyst.commons.ui.navigation.navs.INav import com.vitorpamplona.amethyst.commons.ui.navigation.topbars.TopBarWithBackButton import com.vitorpamplona.amethyst.model.cordn.AndroidCordnBlobStore import com.vitorpamplona.amethyst.model.cordn.CordnRuntime +import com.vitorpamplona.amethyst.ui.pluralStringRes import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel import com.vitorpamplona.amethyst.ui.screen.loggedIn.qrcode.QrCodeDrawer import com.vitorpamplona.amethyst.ui.screen.loggedIn.qrcode.SimpleQrCodeScanner @@ -351,7 +352,7 @@ private fun ReceiveSide( modifier = Modifier.fillMaxWidth(), ) - done?.let { Text(stringRes(Res.string.cordn_migrate_done, it), style = MaterialTheme.typography.bodyMedium) } + done?.let { Text(pluralStringRes(Res.plurals.cordn_migrate_done, it, it), style = MaterialTheme.typography.bodyMedium) } error?.let { Text(it, style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.error) } Button( diff --git a/amethyst/src/main/res/values-cs/strings.xml b/amethyst/src/main/res/values-cs/strings.xml index c56adcaead..0d68f74921 100644 --- a/amethyst/src/main/res/values-cs/strings.xml +++ b/amethyst/src/main/res/values-cs/strings.xml @@ -192,6 +192,9 @@ Nový obrázek Nové krátké video Nové video + Skenovat QR kód + Skenovat QR + Naskenovat QR kód Zvýrazněný text @@ -311,6 +314,7 @@ Těžení proof of work… (%1$d příspěvků ve frontě) Těžení proof of work + Odesílání na relé… Zrušit ≈ %1$s zbývá každou chvíli diff --git a/amethyst/src/main/res/values-de-rDE/strings.xml b/amethyst/src/main/res/values-de-rDE/strings.xml index c46ed3312d..5a488067cf 100644 --- a/amethyst/src/main/res/values-de-rDE/strings.xml +++ b/amethyst/src/main/res/values-de-rDE/strings.xml @@ -180,6 +180,9 @@ Neues Bild Neuer Kurzfilm Neues Video + QR-Code scannen + QR scannen + Einen QR-Code scannen Hervorgehobener Text @@ -291,6 +294,7 @@ Arbeitsnachweis wird geschürft… (%1$d Beiträge in der Warteschlange) Arbeitsnachweis wird geschürft + Wird an Relays gesendet… Abbrechen ≈ %1$s verbleibend jeden Moment diff --git a/amethyst/src/main/res/values-pt-rBR/strings.xml b/amethyst/src/main/res/values-pt-rBR/strings.xml index 53f568feea..0cc858952f 100644 --- a/amethyst/src/main/res/values-pt-rBR/strings.xml +++ b/amethyst/src/main/res/values-pt-rBR/strings.xml @@ -180,6 +180,9 @@ Nova Foto Novo Vídeo Curto Novo Vídeo + Escanear código QR + Ler QR + Escanear um código QR Texto destacado @@ -291,6 +294,7 @@ Minerando prova de trabalho… (%1$d publicações na fila) Minerando prova de trabalho + Enviando para relays… Cancelar ≈ %1$s restante a qualquer momento diff --git a/amethyst/src/main/res/values-sv-rSE/strings.xml b/amethyst/src/main/res/values-sv-rSE/strings.xml index 310c1657a6..4d6749fdb5 100644 --- a/amethyst/src/main/res/values-sv-rSE/strings.xml +++ b/amethyst/src/main/res/values-sv-rSE/strings.xml @@ -180,6 +180,9 @@ Ny bild Ny kortfilm Ny video + Skanna QR-kod + Skanna QR + Skanna en QR-kod Markerad text @@ -291,6 +294,7 @@ Minar bevis på arbete… (%1$d inlägg i kön) Minar bevis på arbete + Skickar till reläer… Avbryt ≈ %1$s kvar när som helst nu diff --git a/amethyst/src/test/java/com/vitorpamplona/amethyst/service/playback/playerPool/SpectrumAudioBufferSinkTest.kt b/amethyst/src/test/java/com/vitorpamplona/amethyst/service/playback/playerPool/SpectrumAudioBufferSinkTest.kt index 6e9ce2ea35..7cf470a967 100644 --- a/amethyst/src/test/java/com/vitorpamplona/amethyst/service/playback/playerPool/SpectrumAudioBufferSinkTest.kt +++ b/amethyst/src/test/java/com/vitorpamplona/amethyst/service/playback/playerPool/SpectrumAudioBufferSinkTest.kt @@ -24,7 +24,11 @@ import androidx.annotation.OptIn import androidx.media3.common.C import androidx.media3.common.util.UnstableApi import com.vitorpamplona.amethyst.commons.audio.Spectrum +import kotlinx.coroutines.ExperimentalCoroutinesApi import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.launch +import kotlinx.coroutines.test.advanceUntilIdle +import kotlinx.coroutines.test.runTest import org.junit.Assert.assertEquals import org.junit.Assert.assertTrue import org.junit.Test @@ -33,6 +37,7 @@ import java.nio.ByteOrder import kotlin.math.PI import kotlin.math.sin +@kotlin.OptIn(ExperimentalCoroutinesApi::class) @OptIn(UnstableApi::class) class SpectrumAudioBufferSinkTest { private val fftSize = 64 @@ -136,4 +141,62 @@ class SpectrumAudioBufferSinkTest { assertTrue("non-16-bit PCM must not emit a spectrum", out.replayCache.isEmpty()) } + + // Pacing draws each frame for the audio time it covers, so the sink has to say how long that is. + // It is fftSize samples PER CHANNEL: a stereo stream must not report half (or double) the time. + @Test + fun eachFrameCarriesTheAudioTimeItCovers() { + val sink = SpectrumAudioBufferSink(fftSize = fftSize, binCount = binCount) + val out = MutableSharedFlow(replay = 1, extraBufferCapacity = 1) + sink.output = out + sink.flush(48000, 1, C.ENCODING_PCM_16BIT) + sink.handleBuffer(monoPcm(sineShorts(k = 2, n = fftSize))) + + assertEquals(fftSize * 1_000_000_000L / 48000, out.replayCache.last().durationNanos) + } + + @Test + fun stereoFramesCoverTheSameTimeAsMono() { + val sink = SpectrumAudioBufferSink(fftSize = fftSize, binCount = binCount) + val out = MutableSharedFlow(replay = 1, extraBufferCapacity = 1) + sink.output = out + sink.flush(44100, 2, C.ENCODING_PCM_16BIT) + val tone = sineShorts(k = 2, n = fftSize) + sink.handleBuffer(interleavedStereoPcm(tone, tone)) + + assertEquals(fftSize * 1_000_000_000L / 44100, out.replayCache.last().durationNanos) + } + + /** + * The audio thread emits a cluster of fft frames within a few ms, with no suspension point in + * between, while the UI collector sits on the main dispatcher and cannot interleave. Anything the + * registry's flow cannot hold at that instant is dropped; a 2-slot buffer kept 2 of every cluster. + */ + private fun deliveredFromOneCluster(framesInCluster: Int): Int { + var count = -1 + runTest { + val mediaId = "test://cluster-$framesInCluster" + val sink = SpectrumAudioBufferSink(fftSize = fftSize, binCount = binCount) + PcmTapRegistry.bind(mediaId, sink) + sink.flush(48000, 1, C.ENCODING_PCM_16BIT) + + val received = mutableListOf() + val collector = launch { PcmTapRegistry.spectrumFor(mediaId).collect { received.add(it) } } + advanceUntilIdle() // let the collector subscribe + + sink.handleBuffer(monoPcm(sineShorts(k = 2, n = fftSize * framesInCluster))) + + advanceUntilIdle() // only now does the UI collector get to run + collector.cancel() + PcmTapRegistry.bind(null, sink) + count = received.size + } + return count + } + + @Test + fun everyFrameOfAClusterReachesTheVisualizer() { + assertEquals("cluster of 8", 8, deliveredFromOneCluster(8)) + assertEquals("cluster of 20", 20, deliveredFromOneCluster(20)) + } } diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/AudioSpectrum.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/AudioSpectrum.kt index 86eb82822c..c074eecc49 100644 --- a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/AudioSpectrum.kt +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/AudioSpectrum.kt @@ -26,9 +26,16 @@ import kotlin.math.exp import kotlin.math.ln import kotlin.math.log10 -/** One frame of frequency-domain magnitudes, ordered low→high Hz and normalized 0f..1f. */ +/** + * One frame of frequency-domain magnitudes, ordered low→high Hz and normalized 0f..1f. + * + * [durationNanos] is how much audio the frame describes (fft size / sample rate), which is how long + * it should stay on screen. Zero — the default — means the producer is not pacing to audio (the + * synthetic preview emits one per display frame), so the frame is shown as soon as it arrives. + */ class Spectrum( val bins: FloatArray, + val durationNanos: Long = 0L, ) /** diff --git a/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumTrail.kt b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumTrail.kt new file mode 100644 index 0000000000..08f2afd6be --- /dev/null +++ b/commons/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumTrail.kt @@ -0,0 +1,110 @@ +/* + * 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.commons.audio + +/** + * The per-displayed-frame step of the spectrum visualizer: queue incoming frames, release each as + * its audio time comes due, apply the decay trail against what is already on screen, and return a + * fresh array to draw. + * + * Why pacing is needed at all: the audio pipeline fills its output buffer in chunks, so frames reach + * the UI in clusters — ~15 frames roughly every 330 ms, measured on a Pixel 9a. Drawn on arrival a + * cluster collapses into one frame; released one per display refresh it plays out in ~110 ms at + * 120 Hz and then freezes (161 stalls averaging 211 ms over 52.8 s). Each frame instead stays up for + * the [Spectrum.durationNanos] of audio it describes, so a cluster spreads across the gap to the + * next. Time lost while starved is not owed back: after a gap, frames resume from the current frame + * time rather than being dumped at once to catch up. + * + * The backlog is capped at [capacity], evicting the stalest frame, so faster-than-real-time playback + * or a stalled UI cannot leave the picture drifting ever further behind the sound. + * + * The decay gives each bin an instant attack and a gradual release, so bars snap up to a transient + * and fall back smoothly instead of flickering. + * + * This lives here, rather than inline in the Compose collector, so the pacing, starvation and decay + * rules are unit-testable without a Compose harness; the composable is left as plumbing. + * + * Not thread-safe by design: both ends run on the UI dispatcher. + */ +class SpectrumTrail( + private val decay: Float, + private val capacity: Int = MAX_BACKLOG_FRAMES, +) { + private val queue = ArrayDeque(capacity) + private var drawn = FloatArray(0) + + // When the frame at the head of the queue may be drawn, in the caller's frame-clock nanos. + private var dueNanos = Long.MIN_VALUE + private var starved = true + + /** Queues a freshly decoded frame, evicting the stalest if the backlog is at [capacity]. */ + fun offer(frame: Spectrum) { + while (queue.size >= capacity) queue.removeFirst() + queue.addLast(frame) + } + + /** True when nothing is queued, so the caller can stop polling until the next [offer]. */ + fun isEmpty(): Boolean = queue.isEmpty() + + /** + * The array to draw at [frameTimeNanos], or null when nothing new is due and the current one + * should persist. + * + * A fresh array each time is intentional: `mutableStateOf` compares by reference, so a new + * instance is what signals Compose to redraw. Do NOT switch to in-place mutation. + */ + fun nextOrNull(frameTimeNanos: Long): FloatArray? { + if (queue.isEmpty()) { + starved = true + return null + } + if (starved) { + // Resume from now, but never earlier than the last drawn frame's audio time runs out. + dueNanos = maxOf(dueNanos, frameTimeNanos) + starved = false + } + + var result: FloatArray? = null + while (dueNanos <= frameTimeNanos) { + val frame = queue.removeFirstOrNull() ?: break + result = decayedFrom(frame) + dueNanos += frame.durationNanos + } + return result + } + + private fun decayedFrom(frame: Spectrum): FloatArray { + val prev = drawn + val next = + FloatArray(frame.bins.size) { i -> + val prior = if (i < prev.size) prev[i] * decay else 0f + if (frame.bins[i] > prior) frame.bins[i] else prior + } + drawn = next + return next + } + + companion object { + // A cluster is ~15 frames, so 24 (~0.5 s of audio) never trims ordinary playback, while + // bounding how far the picture can lag the sound (e.g. at 2x playback speed). + const val MAX_BACKLOG_FRAMES = 24 + } +} diff --git a/commons/src/commonTest/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumTrailTest.kt b/commons/src/commonTest/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumTrailTest.kt new file mode 100644 index 0000000000..8a6ffab71a --- /dev/null +++ b/commons/src/commonTest/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumTrailTest.kt @@ -0,0 +1,183 @@ +/* + * 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.commons.audio + +import kotlin.test.Test +import kotlin.test.assertContentEquals +import kotlin.test.assertFalse +import kotlin.test.assertNotSame +import kotlin.test.assertNull +import kotlin.test.assertTrue + +/** Pacing, starvation, backlog and decay rules of [SpectrumTrail]; see its KDoc for why each exists. */ +class SpectrumTrailTest { + private val ms = 1_000_000L + + private fun frame( + value: Float, + durationMs: Long = 20, + ) = Spectrum(floatArrayOf(value), durationNanos = durationMs * ms) + + @Test + fun yieldsNothingWhenStarvedSoTheDrawnFrameIsHeld() { + val trail = SpectrumTrail(decay = 0.5f) + assertNull(trail.nextOrNull(0)) + } + + @Test + fun theFirstFrameIsDrawnOnArrivalWithNothingToDecayFrom() { + val trail = SpectrumTrail(decay = 0.5f) + trail.offer(frame(1f)) + + assertContentEquals(floatArrayOf(1f), trail.nextOrNull(0)) + } + + @Test + fun aClusterIsSpreadOverTheAudioTimeItCoversNotTheScreenRefresh() { + val trail = SpectrumTrail(decay = 0f) + trail.offer(frame(1f)) + trail.offer(frame(2f)) + trail.offer(frame(3f)) + + // 120 Hz refreshes (~8 ms) must not drain a frame that covers 20 ms of audio. + assertContentEquals(floatArrayOf(1f), trail.nextOrNull(0)) + assertNull(trail.nextOrNull(8 * ms)) + assertNull(trail.nextOrNull(16 * ms)) + assertContentEquals(floatArrayOf(2f), trail.nextOrNull(20 * ms)) + assertNull(trail.nextOrNull(33 * ms)) + assertContentEquals(floatArrayOf(3f), trail.nextOrNull(40 * ms)) + assertNull(trail.nextOrNull(48 * ms)) + } + + @Test + fun afterStarvingTheNextClusterStartsWhenItArrivesInsteadOfBeingDumpedToCatchUp() { + val trail = SpectrumTrail(decay = 0f) + trail.offer(frame(1f)) + assertContentEquals(floatArrayOf(1f), trail.nextOrNull(0)) + assertNull(trail.nextOrNull(100 * ms)) // starved for a while + + trail.offer(frame(2f)) + trail.offer(frame(3f)) + + // The idle time is not owed: frame 2 shows now and frame 3 a full frame later. + assertContentEquals(floatArrayOf(2f), trail.nextOrNull(300 * ms)) + assertNull(trail.nextOrNull(308 * ms)) + assertContentEquals(floatArrayOf(3f), trail.nextOrNull(320 * ms)) + } + + @Test + fun aFrameArrivingBeforeThePreviousOneElapsedStillWaitsItsTurn() { + val trail = SpectrumTrail(decay = 0f) + trail.offer(frame(1f)) + assertContentEquals(floatArrayOf(1f), trail.nextOrNull(0)) + assertNull(trail.nextOrNull(8 * ms)) // queue momentarily empty + + trail.offer(frame(2f)) + + assertNull(trail.nextOrNull(16 * ms)) // frame 1 still covers until 20 ms + assertContentEquals(floatArrayOf(2f), trail.nextOrNull(24 * ms)) + } + + @Test + fun aSlowFrameClockJumpsToTheLatestDueFrame() { + val trail = SpectrumTrail(decay = 0f) + trail.offer(frame(1f)) + trail.offer(frame(2f)) + trail.offer(frame(3f)) + + assertContentEquals(floatArrayOf(1f), trail.nextOrNull(0)) + // A janky 45 ms frame: frames 2 (due 20) and 3 (due 40) are both due; show the newest. + assertContentEquals(floatArrayOf(3f), trail.nextOrNull(45 * ms)) + } + + @Test + fun aFrameWithNoDurationIsShownOnArrival() { + // Producers that do not declare a duration (the synthetic preview emits one per display + // frame) keep the old behaviour: whatever is queued is current. + val trail = SpectrumTrail(decay = 0f) + trail.offer(Spectrum(floatArrayOf(1f))) + trail.offer(Spectrum(floatArrayOf(2f))) + + assertContentEquals(floatArrayOf(2f), trail.nextOrNull(0)) + } + + @Test + fun aBacklogIsCappedByDroppingTheStalestFrame() { + // Faster-than-real-time playback (2x speed) produces frames faster than they come due; + // the cap bounds how far the picture can lag the sound. + val trail = SpectrumTrail(decay = 0f, capacity = 2) + trail.offer(frame(1f)) + trail.offer(frame(2f)) + trail.offer(frame(3f)) // evicts frame 1 + + assertContentEquals(floatArrayOf(2f), trail.nextOrNull(0)) + assertContentEquals(floatArrayOf(3f), trail.nextOrNull(20 * ms)) + assertNull(trail.nextOrNull(40 * ms)) + } + + @Test + fun aRisingBinTakesItsNewValueImmediately() { + val trail = SpectrumTrail(decay = 0.5f) + trail.offer(frame(0.2f)) + trail.nextOrNull(0) + trail.offer(frame(0.9f)) + + assertContentEquals(floatArrayOf(0.9f), trail.nextOrNull(20 * ms)) + } + + @Test + fun aFallingBinDecaysFromWhatWasDrawnRatherThanSnapping() { + val trail = SpectrumTrail(decay = 0.5f) + trail.offer(frame(1f)) + trail.nextOrNull(0) + trail.offer(frame(0f)) + + assertContentEquals(floatArrayOf(0.5f), trail.nextOrNull(20 * ms)) + } + + @Test + fun eachDrawGetsAFreshArraySoComposeSeesTheChange() { + val trail = SpectrumTrail(decay = 0.5f) + trail.offer(frame(1f)) + trail.offer(frame(1f)) + + val first = trail.nextOrNull(0) + val second = trail.nextOrNull(20 * ms) + + // mutableStateOf compares by reference; reusing one array would never trigger a redraw. + assertNotSame(first, second) + } + + @Test + fun reportsEmptyOnlyOnceEveryQueuedFrameIsReleasedSoTheCallerKnowsWhenToPark() { + val trail = SpectrumTrail(decay = 0f) + assertTrue(trail.isEmpty()) + + trail.offer(frame(1f)) + trail.offer(frame(2f)) + assertFalse(trail.isEmpty()) + + trail.nextOrNull(0) + assertFalse(trail.isEmpty()) // frame 2 is queued but not yet due + trail.nextOrNull(20 * ms) + assertTrue(trail.isEmpty()) + } +} diff --git a/commonsUI/src/commonMain/composeResources/values-ar-rSA/strings.xml b/commonsUI/src/commonMain/composeResources/values-ar-rSA/strings.xml index 9358128229..eb8f051c0d 100644 --- a/commonsUI/src/commonMain/composeResources/values-ar-rSA/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-ar-rSA/strings.xml @@ -3074,4 +3074,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-bn-rBD/strings.xml b/commonsUI/src/commonMain/composeResources/values-bn-rBD/strings.xml index 63dad307de..a3394863e6 100644 --- a/commonsUI/src/commonMain/composeResources/values-bn-rBD/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-bn-rBD/strings.xml @@ -2949,4 +2949,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-cs/strings.xml b/commonsUI/src/commonMain/composeResources/values-cs/strings.xml index e75568d12e..a59a25da1f 100644 --- a/commonsUI/src/commonMain/composeResources/values-cs/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-cs/strings.xml @@ -174,6 +174,156 @@ Dopravní zácpa Silniční událost + Keš + Tradiční + Multi-keš + Mystery + Mikro + Malá + Normální + Velká + Jiná velikost + D%1$d + T%1$d + První nálezce + Umělecké dílo + Key Quest + Ověřené nálezy + Obsazeno + Archivováno + Nevíte si rady? Klepnutím zobrazíte nápovědu + Nečitelné? Klepnutím zobrazíte druhé čtení + Poblíž + Nalezeno! + Ověřený nález + Důkaz nesouhlasí + Načítání keše… + Ukryl %1$s + Navigovat + Kopírovat souřadnice + Souřadnice zkopírovány + Fotky + Mise Key Quest + Logy + Tuto keš zatím nikdo nezalogoval. Buďte první. + Nalezeno + Nenalezeno + Přidat poznámku + Nahlásit potřebu údržby + Přidat do výpravy + Nová výprava… + Zatím jste nevytvořili žádnou výpravu. + Už je v této výpravě + + %1$d keš zde + %1$d keše zde + %1$d keše zde + %1$d keší zde + + Odebrat tuto fotku + Tato keš byla archivována. Už není ve hře. + Prvním nálezcem se stal %1$s + Místo prvního nálezce je stále volné + Vlastník + Upravit tuto keš + Archivovat tuto keš + Archivovat. Nálezci uvidí, že už není ve hře, a listing zůstane čitelný. + Potvrdit prvního nálezce + Zveřejní tag F se jménem %1$s. Je to trvalé. + Zatím žádné ověřené nálezy, takže není koho potvrdit. + Zobrazit ověřovací kód + Vytiskněte ho a vložte do keše. Amethyst ho neukládá — pokud ho ztratíte, nálezci už nebudou moci prokázat, že tam byli. + Nenalezeno + Poznámka + Potřebuje údržbu + Zapsat nález + Keš + Váš log + Jak to šlo? + Přidat fotku + Vaše odpověď Key Quest + Důkaz přítomnosti + Naskenujte kód v keši + Naskenovat jiný kód + Ověřeno — byli jste u keše + Jednou podepsáno kódem z krabičky. Klíč se nikdy neukládá a nikdy neopustí tuto obrazovku. + To není ověřovací kód. + Tento kód patří jiné keši. + Tato keš nevyžaduje důkaz, takže ji můžete rovnou zalogovat. + K tomuto logu není připojena vaše vlastní poloha. + Odeslat + Přidat log + Poblíž + Mapa + Výpravy + Nálezy + Moje + Nenalezené + D ≤ %1$d + T ≤ %1$d + S cenou + Vyžaduje důkaz + Použít mou polohu + Seřazeno podle vzdálenosti + Nejnovější první + Ukrýt keš + Zatím tu nejsou žádné keše. Zkuste širší seznam sledovaných, nebo ukryjte první. + Zatím jste nezapsali žádný nález. + Zatím jste neukryli žádnou keš. + Zatím žádné výpravy. + Nálezy + První nálezy + Ověřené + Ukryté + Vycentrovat na mě + Dlouhým stiskem na mapě tam ukryjete keš + Otevřít + Kde + Co + Doplňky + Důkaz + Relaye + Tímto zveřejníte veřejnou polohu s přesností asi na 5 metrů. Uvidí ji kdokoli na Nostru a zveřejněnou událost nelze vzít zpět. + Vyberte místo + Zveřejní %1$s a k tomu hrubší buňky až po 3 znaky pro vyhledávání v okolí. + Název + Popis + Typ + Velikost + Obtížnost + Terén + Nápověda + Nálezci uvidí + Zašifrovat nápovědu (ROT13) + Mise Key Quest + Modifikátory + Vyžadovat důkaz přítomnosti + Pro tuto keš byl vygenerován ověřovací klíč. + Kam mají nálezci logovat + Zveřejnit + Pojmenujte keš. + Vyberte, kde je keš ukrytá. + Nalezeno %1$d z %2$d + Zahájit výpravu + + %1$d keš + %1$d keše + %1$d keše + %1$d keší + + Název + Popis + Obrázek banneru + Keše v pořadí + Přidat keš + Posunout nahoru + Posunout dolů + Odebrat + Motiv stránky + Styl mapy + Pojmenujte výpravu. + Přidejte alespoň jednu keš. + Zveřejnění se nezdařilo. Zkontrolujte připojení k relayům a zkuste to znovu. Zapy na toto se rozdělují mezi: %1$d%% Value-for-Value @@ -198,6 +348,53 @@ Banner profilu Nasměrujte na QR kód + Amethyst potřebuje fotoaparát ke skenování QR kódů. Nic se nenahrává ani neodesílá — snímky se dekódují v zařízení a poté se zahodí. + Povolit fotoaparát + Přístup k fotoaparátu je pro Amethyst vypnutý. Znovu ho můžete zapnout v nastavení Androidu. + Otevřít nastavení + Dekodér QR kódů se v tomto zařízení nepodařilo spustit. Kód můžete stále vložit jako text. + Zapnout světlo + Vypnout světlo + Je tma — zkuste světlo + Naskenovat obrázek + Vložit + V obrázku nebyl nalezen žádný QR kód + Ve schránce není nic ke skenování + Klepněte na požadovaný kód + + Načteno %1$s z %2$s části — pokračujte + Načteno %1$s z %2$s částí — pokračujte + Načteno %1$s z %2$s části — pokračujte + Načteno %1$s z %2$s částí — pokračujte + + Obnovit přiblížení + Amethyst tento kód nedokáže otevřít + Tento kód obsahuje soukromý klíč nebo tajemství pro spárování, proto se jeho obsah zde nezobrazuje. Použijte obrazovku, která ho očekává. + Toto je soukromý klíč. Vložte ho raději na přihlašovací obrazovce. + Toto je připojení peněženky. Přidejte ho v nastavení peněženky. + Toto je adresa vzdáleného podepisovatele. Amethyst je rozdává, aby ho ostatní aplikace mohly žádat o podpis — přihlásit se s ní nedokáže. + Toto je aplikace, která se chce připojit k vašemu podepisovateli. Otevřete ji z obrazovky podepisovatele NIP-46. + Toto je Lightning faktura. + Toto je Cashu token. + Toto je webový odkaz. + Toto je prostý text, ne kód Nostr. + Toto je kód Nostr, ale tato obrazovka ho nedokáže otevřít. + Profil + Poznámka + Kód Nostr + Relé + Soukromý klíč + Připojení peněženky + Adresa vzdáleného podepisovatele + Žádost o připojení k podepisovateli + Lightning faktura + Cashu token + Webový odkaz + Prostý text + Otevřít odkaz + Kopírovat + Zkopírováno + Skenovat znovu Zobrazit QR kód Profilový obrázek Váš profilový obrázek @@ -644,17 +841,70 @@ Hodiny Minuty Sekundy + Využijte tréninky, které už máte zaznamenané + Připojte Health Connect (Samsung Health, Google Fit, Fitbit, Garmin…) — získáte Moji kondici, vlastní přehled tréninků, a tento trénink vyplníte podle záznamu z hodinek místo ručního psaní každého čísla. Připojit %1$s km Z Health Connect Co Amethyst čte Health Connect a Amethyst + Amethyst používá Health Connect pro funkci Moje kondice — váš vlastní přehled tréninků přímo v telefonu. + Moje kondice (menu → Vy → Moje kondice) ukazuje, jak trénujete: kolik jste toho udělali tento týden oproti minulému, jak se váš čas dělí mezi běh, cyklistiku, chůzi, plavání a posilovnu, vaše nejlepší výkony, kolik dní jste trénovali a vaši aktuální sérii. Amethyst tento obraz sestaví z tréninků, které vaše hodinky nebo fitness aplikace už uložily do Health Connect, spolu s tréninky, které jste zaznamenali přímo v Amethystu. Vše se vypočítá ve vašem telefonu a zobrazí jen vám. Co Amethyst čte a proč + Cvičení · jakou aktivitu jste dělali, kdy začala a jak dlouho trvala. To je samotný trénink: určuje počet tréninků, dobu tréninku, rozpis podle aktivit, aktivní dny a vaši sérii. + Vzdálenost · jak daleko jste se dostali; zobrazuje se jako vzdálenost tento týden oproti minulému, týdenní průměr, vzdálenost podle aktivity a nejdelší vzdálenost. + Aktivní a celkové kalorie · energie spálená při tréninku; zobrazuje se jako energie tento týden a její srovnání s minulým týdnem. Aktivní kalorie se použijí, pokud je váš zdroj zaznamenává; celkové kalorie slouží jako náhrada u zdrojů, které zaznamenávají jen celkovou energii. + Tepová frekvence · průměr a maximum během každého tréninku, sloučené do průměrné a nejvyšší tepové frekvence za období. Podle ní poznáte lehký týden od náročného při stejné vzdálenosti. + Kroky · počet kroků při běhu, chůzi nebo túře; zobrazuje se jako týdenní průměr kroků a nejvyšší počet kroků. + Nastoupané převýšení · kolik jste nastoupali; zobrazuje se jako týdenní průměr stoupání a největší stoupání. Právě to odlišuje rovinatý týden od kopcovitého. Co Amethyst nedělá + Čte jen tréninky z posledních 4 týdnů, a to jen když je otevřená Moje kondice nebo editor tréninku. Nikdy nečte na pozadí. Nikdy nic nezapisuje do Health Connect a nikdy nežádá o trasu vašeho cvičení, polohu ani jiný typ zdravotních údajů. + Vaše zdravotní údaje nikdy nikam neposílá. Moje kondice se počítá ve vašem telefonu a zůstává v něm. Pokud později budete chtít zveřejnit jeden trénink, klepnete u něj na Sdílet, přečtete si příspěvek, který Amethyst vyplnil, a zveřejníte ho sami — vždy jen jeden trénink, nikdy automaticky. + Celá funkce je volitelná. Oprávnění můžete kdykoli odvolat v Health Connect — Moje kondice se pak vrátí k úvodní výzvě — nebo vypnout návrhy v editoru v Nastavení → Nastavení editoru. Zbytek Amethystu funguje dál. Přečíst si celé zásady ochrany soukromí + Moje kondice + Poslední 4 týdny + Načítám vzdálenost, kalorie a tepovou frekvenci… + Poslední čtyři celé týdny vašeho tréninku: tréninky, které jste zveřejnili, a vše, co Health Connect zaznamenává v tomto telefonu. Amethyst přehled počítá v zařízení a nic z něj nezveřejňuje. + Tento týden + oproti minulému týdnu + Týdenní průměr + Tréninky + Aktivní dny + Série dní + Čas + %1$d h %2$d min + %1$d min + %1$d s + Vzdálenost + Kalorie + Kroky + Stoupání + Prům. TF + Max. TF + Podle aktivity + Nejlepší výkony + Nejdelší vzdálenost + Nejdelší trénink + Největší stoupání + Nejvíce kroků + Nejvyšší tepová frekvence + Nedávné tréninky + Za poslední 4 týdny nic zaznamenáno. Zobrazí se zde tréninky, které zveřejníte, i ty, které zaznamenají vaše hodinky. + Sledujte svůj trénink + Připojte Health Connect a uvidíte týdenní součty, vývoj oproti minulému týdnu, nejlepší výkony a tréninkovou sérii. Vše zůstává ve vašem telefonu. + Připojte Health Connect a přidejte tréninky zaznamenané hodinkami, včetně tepové frekvence, kroků a stoupání. + Připojit + Sdílet tento trénink + tep/min + kcal + km + mi + m + ft Zatím nenalezeny žádné nSites. Obnovit Integrovaný prohlížeč vyžaduje Android 11 nebo novější. @@ -1090,6 +1340,8 @@ Datum a čas ukončení ankety Anketa končí za %1$s Hledá se událost %1$s + Načítání + Čekám na načtení vašich soukromých zpráv… Odeslat Zap Přidat veřejnou zprávu Přidat soukromou zprávu @@ -1229,6 +1481,8 @@ + %1$02d:%2$02d + %1$d:%2$02d:%3$02d Zavřít Přepnout kameru Hlasový hovor @@ -1363,6 +1617,14 @@ Uživatelské nastavení Hledat nastavení Pro „%1$s“ nebyla nalezena žádná nastavení + Skupina aktualizována + Příloha + Zpráva + %1$s: %2$s + Vytvořit skupinu + Pozvánky Marmot chodí na jiné zařízení a zde je nelze otevřít. + Zavřít + Zveřejnit z tohoto zařízení Resetovat stav Marmot? Tímto trvale odstraníte všechny skupinové chaty Marmot, historii zpráv a MLS klíče v tomto zařízení pro aktuální účet. Ostatní uživatelé nebudou upozorněni a stále vás mohou vidět ve skupinách až do jejich dalšího potvrzení. Tuto akci nelze vrátit zpět. Nový KeyPackage bude publikován při příští synchronizaci aplikace. Resetovat @@ -1637,6 +1899,7 @@ Žádné transakce neodpovídají tomuto filtru Načítání… Přijato + Otevřít poznámku se zapem Odesláno Obnovit Vše @@ -1953,6 +2216,8 @@ Přehrávat video v plovoucím okně (skryto, pokud není podporováno) Odeslat do zařízení Odeslat video do přijímače Chromecast ve vaší Wi-Fi (skryto pro místní soubory) + Titulky + Zapnout nebo vypnout titulky (skryto, pokud je video nemá) Vyberte animaci zobrazenou při přehrávání zvukových poznámek. Vypnuto Spektrální pruhy @@ -2640,6 +2905,7 @@ Nesplňuješ požadavky sítě důvěry této komunity. Nejnovější dokument s pravidly komunity byl odmítnut jako zastaralý. Skupiny Marmot + Skupiny Cordn Vytvořit skupinu Vytvořit skupinu Marmot Bude vytvořena nová MLS skupina. Členy můžete přidat poté. @@ -2939,13 +3205,18 @@ Upozorní vás, když někdo odpoví na váš příspěvek Odpovědi Nové odpovědi + Neodesláno Odpovědět + Zkusit znovu + Odesílání… + Stále se odesílá… Upozorní vás, když někdo přepošle váš příspěvek %1$s přeposlal váš příspěvek Přeposlání Nová přeposlání Oznámení, když je naplánovaný příspěvek publikován nebo selže při publikaci. Naplánované příspěvky + Tento účet byl z Amethystu odebrán. Upozorní vás, když vás někdo zapsne %1$s satů pro %1$s @@ -3176,6 +3447,10 @@ Zrušit ztlumení Adresa URL zpětného volání nebyla nalezena v odpovědi %1$s Zrušit + Vypnuto + Vypnout titulky + Zapnout titulky + Titulky Cashu Token Kontroluji mint… Nepodařilo se použít Cashu @@ -3688,10 +3963,12 @@ Prolog dobrodružství Čtení dobrodružství Scéna dobrodružství + Seznam aplikací Doporučení aplikací Schůzka Aplikace RSVP na schůzku + Seznam článků Audio hlavička Audio stopa Vytvořené podcasty @@ -3704,6 +3981,7 @@ Blossom ověření Blossom servery Seznam záložek + Sada záložek Broadcast relaye Kalendář Definice kanálu @@ -3741,6 +4019,7 @@ Balíčky emoji Dočasný chat Dočasné chatovací místnosti + Oblíbené kanály Oblíbené podcasty Oblíbené relaye Hlavičky souborů @@ -3749,28 +4028,36 @@ Balíčky sledování Sledování geohashe Dárkové balíčky + Git autoři Git problém Git záplata Pull request Aktualizace PR Git odpověď Git repozitář + Git repozitáře Git stav: Aplikováno Git stav: Uzavřeno Git stav: Koncept Git stav: Otevřeno + Důvěryhodní autoři wiki + Důvěryhodná wiki relé Sledované hashtagy Zvýraznění HTTP ověření Seznam indexovacích relayů + Zájmy Živé chaty Živé přenosy + Sledování médií + Startovní balíček médií Lékařská data Místnost schůzky Prostor schůzky Hudební playlist Hudební stopa Seznam ztlumených + Ztlumeno pro druh %1$s Pojmenované záložky Servery Nests NIP @@ -3785,6 +4072,7 @@ Outbox relaye Platba na Seznamy lidí + Seznam obrázků Obrázky Připnuté Epizoda podcastu @@ -3811,6 +4099,7 @@ Vyhledávací relaye Krátká videa Krátká videa (odpověď) + Skupiny Komentáře k torrentu Torrenty Důvěryhodní poskytovatelé @@ -3819,7 +4108,10 @@ Uživatelská nastavení Stav uživatele Video + Spolupráce na videu + Seznam videí Video (odpověď) + Titulky videa Hlasová zpráva Hlasová odpověď Probuzení @@ -3860,6 +4152,8 @@ Změnit místo na mapě Kanály podle polohy Vyberte místo na mapě + Amethyst pro Android se nemůže přihlásit pomocí adresy bunker://. Tyto adresy rozdává, aby ho ostatní aplikace mohly žádat o podpis, ale přihlásit se s nimi nedokáže. Použijte externí podepisovací aplikaci nebo Amethyst Desktop. + Toto je aplikace, která se chce připojit k vašemu podepisovateli, ne způsob přihlášení. Nejprve se přihlaste a pak ji otevřete z obrazovky podepisovatele NIP-46. Pro zvýšení příspěvků se přihlaste s privátním klíčem Přihlaste se pomocí soukromého klíče, abyste mohli následovat Používáte veřejný klíč a veřejné klíče jsou pouze pro čtení. Přihlaste se pomocí soukromého klíče, abyste mohli skrýt slovo nebo větu @@ -3960,6 +4254,7 @@ Ztlumit oznámení Ztlumené. Klikněte pro odztlumení Mé soubory Blossom + Moje kondice Moje seznamy Jméno je povinné %1$dms @@ -4253,6 +4548,7 @@ Aplikace vzdáleného podepisovatele Vzdálený podepisovatel + Tento seznam má soukromé členy, které vidí jen jeho autor %1$d majetek je zbalený %1$d majetky jsou zbalený @@ -4851,12 +5147,21 @@ Kalendáře Šachy Objevit + Upravit keš + Upravit výpravu + Keš + Výprava + Výpravy + Keše Domů Importovat sledované + Zapsat nález Média Zprávy Playlisty Hudba + Ukrýt keš + Nová výprava Upozornění Epizody Podcasty @@ -5056,6 +5361,20 @@ Žádost o zmizení odeslána Lepší kvalita při menší velikosti souboru, ale ne všechna zařízení podporují přehrávání H.265. Použít kodek H.265/HEVC + Přijal uvedení jako spolupracovník + Odmítl uvedení jako spolupracovník + Uvedení přijato + Zvuk od + Účinkuje + Inspirováno + Odkazuje na + Soukromý seznam + + %1$d video + %1$d videa + %1$d videa + %1$d videí + Stahování videa bylo zahájeno… Tlačítka přehrávače videa Video uloženo do video galerie telefonu @@ -5121,15 +5440,983 @@ Služba blesku příjemce v %1$s není k dispozici. Byla vypočtena z adresy blesku "%2$s". Chyba: %3$s. Zkontrolujte, zda je server aktivní a zda je adresa blesku správná Nelze vytvořit bleskovou fakturu z %1$s: Prvek pr nebyl nalezen ve výsledném JSON. Nelze vytvořit bleskovou fakturu. Zpráva od %1$s: %2$s + Toto zařízení nyní přijímá vaše pozvánky Marmot. + Zveřejnění KeyPackage selhalo: %1$s + Žádné relé KeyPackage nepřijalo. Zkontrolujte nastavení relé a zkuste to znovu. + Odesílání… + Nepodařilo se odeslat. Klepnutím to zkusíte znovu. + + %1$d nová zpráva + %1$d nové zprávy + %1$d nové zprávy + %1$d nových zpráv + + Skupina s koordinátorem + Doručováno koordinátorem, ne relayi + Co tento koordinátor vidí + Koordinátor je jediný server, který přenáší všechny zprávy této skupiny, a to v pořadí. Je to jiný kompromis než u relayů — dobré to vědět, než s tím začnete zacházet jako s jakýmkoli jiným chatem. + Obsah zpráv + Kdo je ve skupině + Kdo co posílá + Nečitelné + Pod jednorázovým klíčem + Spojeno s vaším skutečným účtem + Podrobnosti + Koordinátor %1$s + Nejde o stejnou míru odhalení jako u skupiny Marmot, kde žádný jednotlivý provozovatel nedrží celou konverzaci. + Připojení uvádí skutečné účty na obou stranách, takže koordinátor ví, kdo je v této skupině. + Jeden jednorázový klíč odesílá a stahuje za všechny vaše skupiny zde, takže koordinátor pozná, že patří vám. + Jediný provozovatel drží úplnou, seřazenou historii každé skupiny, kterou přenáší. + Balíček klíčů, který jste zveřejnili, je podepsaný záznam o tom, že tento účet používá cordn, a koordinátor ho může předat komukoli. + Zprávy nejsou doplňovány na jednotnou délku, takže koordinátor vidí, jak dlouhá je každá z nich. + Tento klient nešifruje komunikaci s koordinátorem. Je to chyba — nahlaste ji prosím. + Zatím nekontaktován + Odpovídá + Neodpovídá + + %1$d neúspěšný pokus za sebou + %1$d neúspěšné pokusy za sebou + %1$d neúspěšného pokusu za sebou + %1$d neúspěšných pokusů za sebou + + Vložte odkaz cordn1…, který vám někdo poslal, a zjistěte, který koordinátor tuto skupinu přenáší a co by se o vás jeho provozovatel dozvěděl, kdybyste se připojili. + cordn1… + Prohlédnout + Vložit + Vymazat + To není odkaz na skupinu cordn: %1$s + ID skupiny + Koordinátor + Dostupné přes + Tento odkaz neuvádí žádného koordinátora, takže ho samotný nelze použít. Zeptejte se odesílatele, který koordinátor skupinu přenáší. + Prohlédnutím odkazu se k ničemu nepřipojíte a to, že ho máte, z vás nedělá člena. + Odkaz na skupinu Cordn + cordn koordinátor skupina odkaz pozvánka mls chat metadata soukromí odhalení coordinator group link invite privacy exposure + Koordinátoři Cordn + cordn koordinátor přidat odebrat vymazat stav server mls chat pořadí coordinator add remove purge health ordering + Balíčky klíčů Cordn + cordn balíček klíčů zveřejnit pozvánka záložní koordinátor mls key package publish invite last resort coordinator + Záloha Cordn + cordn záloha obnovení export import heslo skupiny obnova backup restore passphrase groups recovery + Skupiny Cordn + End-to-end šifrované skupiny, jejichž pořadí zpráv určuje vámi zvolený koordinátor, nikoli relé. + Skupina %1$s + Zatím žádné zprávy + Skupina Cordn přenášená přes %1$s + Zpráva smazána + Hlasová zpráva + Fotka + Video + Soubor + Skupina Cordn + Šifrovaný skupinový chat řazený koordinátorem, kterého si vyberete. + Koordinovaná + Nejlepší pro týmy, které chtějí jedno spolehlivé pořadí konverzace. + Vytvořit skupinu Cordn + End-to-end šifrování pomocí MLS — koordinátor nikdy nepřečte žádnou zprávu. + Jedno dohodnuté pořadí pro všechny, takže historii nemohou přeházet špatně nastavené hodiny. + Koordinátor zjistí, kdo je ve skupině a kdy spolu mluvíte, i když nemůže číst, co píšete. + Máte pozvánku do skupiny cordn? + Zobrazit pozvánky + Cordn + Skupiny doručované koordinátorem, kterého si sami zvolíte, místo relayů. + Prohlédnout odkaz na skupinu + Zjistěte, kam odkaz cordn1… vede, dřív než s ním něco uděláte + Přesunout z tohoto telefonu + Převzít z jiného telefonu + Zveřejněné balíčky klíčů + Odkaz + Koordinátoři, které používáte + Ohlašující se koordinátoři + Přidat ručně + Heslo + Vytvořit zálohu + Obnovit ze zálohy + Koordinátor + Toto zařízení + Koordinátoři + Servery, které přenášejí vaše skupiny + Balíčky klíčů + Díky nim vás lidé mohou přidat do skupiny + Záloha a obnovení + Soubor zašifrovaný heslem, který si uschováte + Přesun na nový telefon + Předejte své skupiny zařízení, na které přecházíte + Přesun na nový telefon + Vaše skupiny cordn žijí na tomto zařízení. K jejich přesunu stačí jeden kód: tento telefon je zveřejní, nový telefon je načte a tento telefon s nimi přestane pracovat. + Nejprve se na novém telefonu přihlaste stejným účtem. Přesouvají se jen vaše skupiny, nikdy váš klíč. + Zahájit předání + Zveřejňování… + Naskenujte tento kód na novém telefonu + Kód je jen ukazatel. Kdo ho vyfotí, nic se nedozví — obsah, na který ukazuje, je zašifrovaný pro vás. + Toto zařízení předalo své skupiny + Přestalo odesílat a přijímat, protože dva telefony odesílající do jedné skupiny by ji rozbily pro všechny její členy. Vaše skupiny na tomto zařízení zůstávají a nic nebylo smazáno. + Vzít toto zařízení zpět + Použijte, pokud se přesun nedokončil. Udělejte to jen tehdy, když nový telefon ještě nezačal odesílat. + Přijmout z jiného telefonu + Naskenovat kód + nebo ho vložte + Přenést skupiny sem + Stahování… + Tímto nahradíte všechny skupiny cordn, které už na tomto telefonu jsou. Sloučit je nelze. + + Přesunuta %1$d skupina + Přesunuty %1$d skupiny + Přesunuto %1$d skupiny + Přesunuto %1$d skupin + + Na tomto zařízení nejsou žádné skupiny cordn k přesunu. + Nejprve nastavte mediální server — zašifrované dokumenty musí někde počkat, než si je druhý telefon stáhne. + Co opouští toto zařízení + Stav vašich skupin se zašifruje a nahraje na váš mediální server, aby si ho druhý telefon mohl stáhnout. Server ho nedokáže přečíst, vidí jen velikost a čas. Pokud nechcete nic zanechat, soubory potom smažte. + 3D objekt + %1$d vrcholů · %2$d stěn + Tento 3D objekt nelze přečíst (pravidlo %1$s) + Avatar Cyberspace + Tento avatar nezaplatil za svou velikost, proto se nevykresluje + Osvětleno; klepnutím vykreslíte objekt plošně + Plošně; klepnutím objekt osvětlíte + 1 jednotka = %1$s + Ukryto v dataspace · %1$s + Ukryto v ideaspace · %1$s + Výchozí avatar + Není zveřejněn žádný tvar, takže všichni vidí tento + Ukryto na místě + Ukryto v bloku %1$s regionů + Ukryto v jednom regionu, který nápověda přesně určuje + Bez nápovědy, takže to může být kdekoli v kyberprostoru + Mimo dosah: nápověda určuje 2^%1$d regionů k prohledání + Hledat + Zastavit + Odhaduji náročnost hledání v tomto zařízení… + Prohledáno %1$s z %2$s regionů + + Mimo dosah: zhruba %1$d minuta hledání v tomto zařízení + Mimo dosah: zhruba %1$d minuty hledání v tomto zařízení + Mimo dosah: zhruba %1$d minuty hledání v tomto zařízení + Mimo dosah: zhruba %1$d minut hledání v tomto zařízení + + + Mimo dosah: zhruba %1$d hodina hledání v tomto zařízení + Mimo dosah: zhruba %1$d hodiny hledání v tomto zařízení + Mimo dosah: zhruba %1$d hodiny hledání v tomto zařízení + Mimo dosah: zhruba %1$d hodin hledání v tomto zařízení + + Není v bloku, který nápověda určila + Region nalezen, ale obsah nelze přečíst + + %1$d položka ukrytá zde neodpovídala svému podpisu a byla zahozena + %1$d položky ukryté zde neodpovídaly svým podpisům a byly zahozeny + %1$d položky ukryté zde neodpovídalo svým podpisům a bylo zahozeno + %1$d položek ukrytých zde neodpovídalo svým podpisům a bylo zahozeno + + Otevřeno, ale uvnitř nic nebylo + Nepodepsáno, takže autorství je jen tvrzení + Položka druhu %1$d, kterou tento klient nevykresluje + + %1$d bajt něčeho, co tento klient neumí přečíst + %1$d bajty něčeho, co tento klient neumí přečíst + %1$d bajtu něčeho, co tento klient neumí přečíst + %1$d bajtů něčeho, co tento klient neumí přečíst + + + Zavřít + Kopírovat odkaz + Najít + Velikost textu + Počítačová verze + Na plochu + Jiný prohlížeč + Celá obrazovka + Upravit adresu + Zpět + Vpřed + Obnovit + Zastavit načítání + Přidat do oblíbených + Odebrat z oblíbených + Sdílet + Kopírovat odkaz + Najít na stránce + Velikost textu + Přidat na plochu + Verze pro počítač + Otevřít v prohlížeči + Otevřít v aplikaci %1$s + Celá obrazovka + Opustili jste %1$s + Zpět do aplikace + Menší text + Větší text + Obnovit + %1$d% + Soukromí + Onion routing + Web nevidí vaši IP adresu + Web vidí vaši IP adresu + Nastavení webu + Zatím nic nepovoleno + K čemu má přístup + Vaše klíče nikdy neopustí Amethyst + Každé podepsání, zveřejnění, nahrání nebo platba vyžaduje vaše schválení + Žádný zvláštní přístup + Běží v izolovaném prostředí a nemůže jednat za váš účet + Spravovat oprávnění + nSite · izolovaný + nApplet · izolovaný + Konzole + Zabezpečené připojení + Nezabezpečeno + Přes onion routing + Izolovaná aplikace + Fotoaparát + Mikrofon + Poloha + Zeptat se + Povolit + Blokovat + %1$s: %2$s + povoleno + blokováno + Hledejte nebo zadejte adresu + Přejít + Vymazat + Vložit a přejít + Použít tuto adresu + Najít na stránce + %1$d / %2$d + Žádné shody + Předchozí shoda + Další shoda + Zavřít hledání na stránce + Vše + Chyby + Varování + Kopírovat + Vymazat + Zatím nic nezaznamenáno + Tento web chce použít + Vidět, co vidí váš fotoaparát + Slyšet, co slyší váš mikrofon + Znát vaši přibližnou polohu + Hovory mohou odhalit vaši IP adresu i přes Tor. + Povolit během návštěvy + Jen tentokrát + Nepovolit + %1$s sděluje + Tato stránka sděluje + Nedovolit této stránce zobrazovat další dialogy + Vaše odpověď + Opustit web? + Provedené změny se nemusí uložit. + Opustit + OK + Zrušit + Připojení + Připojení je šifrované + Informace, které odešlete, nelze cestou přečíst. + Připojení není šifrované + Nezadávejte hesla ani platební údaje. + Přes onion routing sítí Tor + Otevřený web + Certifikát + Vydáno pro %1$s, vydavatel %2$s · platí do %3$s + Oprávnění + Soubory cookie a data webu + Přihlášení a předvolby, které tento web uložil pro tento účet + Vymazat data webu + Odhlásit se z tohoto webu a smazat jeho data? + Znovu blokovat %1$s + Ponechat %1$s + Znovu vstoupit (%1$s) + Znovu ztlumit %1$s + Obnovit %1$s + Obnovit kanály + Obnovit místa + Obnovit profil + Obnovit poskytovatele + Obnovit relé + Obnovit témata + Obnovit peněženku + Přijmout + + %1$s a přidali %2$d + %1$s a přidali %2$d + %1$s a přidali %2$d + %1$s a přidali %2$d + + + %1$s a zablokovali %2$d + %1$s a zablokovali %2$d + %1$s a zablokovali %2$d + %1$s a zablokovali %2$d + + + %1$s a začali sledovat %2$d + %1$s a začali sledovat %2$d + %1$s a začali sledovat %2$d + %1$s a začali sledovat %2$d + + + %1$s a připojili se k %2$d + %1$s a připojili se k %2$d + %1$s a připojili se k %2$d + %1$s a připojili se k %2$d + + + %1$s a ztlumili %2$d + %1$s a ztlumili %2$d + %1$s a ztlumili %2$d + %1$s a ztlumili %2$d + + Vaše synchronizovaná nastavení Amethystu byla změněna v jiné aplikaci, která není Amethyst. To může způsobit problémy. + Vyprázdnili jste svůj seznam Concord + Změnili jste svůj seznam Concord + + Odebrali jste %1$d DM relé + Odebrali jste %1$d DM relé + Odebrali jste %1$d DM relé + Odebrali jste %1$d DM relé + + + Odebrali jste %1$d oblíbený kanál + Odebrali jste %1$d oblíbené kanály + Odebrali jste %1$d oblíbeného kanálu + Odebrali jste %1$d oblíbených kanálů + + + Přestali jste sledovat %1$d osobu + Přestali jste sledovat %1$d osoby + Přestali jste sledovat %1$d osoby + Přestali jste sledovat %1$d osob + + + Přestali jste sledovat %1$d hashtag + Přestali jste sledovat %1$d hashtagy + Přestali jste sledovat %1$d hashtagu + Přestali jste sledovat %1$d hashtagů + + + Odebrali jste %1$d indexační relé + Odebrali jste %1$d indexační relé + Odebrali jste %1$d indexačního relé + Odebrali jste %1$d indexačních relé + + + Odebrali jste %1$d relé pro klíče skupinových chatů + Odebrali jste %1$d relé pro klíče skupinových chatů + Odebrali jste %1$d relé pro klíče skupinových chatů + Odebrali jste %1$d relé pro klíče skupinových chatů + + + Opustili jste %1$d veřejný chat + Opustili jste %1$d veřejné chaty + Opustili jste %1$d veřejného chatu + Opustili jste %1$d veřejných chatů + + + Opustili jste %1$d komunitu + Opustili jste %1$d komunity + Opustili jste %1$d komunity + Opustili jste %1$d komunit + + + Opustili jste %1$d skupinu + Opustili jste %1$d skupiny + Opustili jste %1$d skupiny + Opustili jste %1$d skupin + + + Opustili jste %1$d chatovací místnost + Opustili jste %1$d chatovací místnosti + Opustili jste %1$d chatovací místnosti + Opustili jste %1$d chatovacích místností + + + Zrušili jste ztlumení %1$d položky + Zrušili jste ztlumení %1$d položek + Zrušili jste ztlumení %1$d položky + Zrušili jste ztlumení %1$d položek + + + Odebrali jste %1$d veřejné relé + Odebrali jste %1$d veřejná relé + Odebrali jste %1$d veřejného relé + Odebrali jste %1$d veřejných relé + + Odebrali jste svůj klíč pro nutzapy + Nahradili jste svůj klíč pro nutzapy + + Odebrali jste %1$d mint pro nutzapy + Odebrali jste %1$d minty pro nutzapy + Odebrali jste %1$d mintu pro nutzapy + Odebrali jste %1$d mintů pro nutzapy + + + Odebrali jste %1$d nabídku BOLT12 + Odebrali jste %1$d nabídky BOLT12 + Odebrali jste %1$d nabídky BOLT12 + Odebrali jste %1$d nabídek BOLT12 + + + Odebrali jste %1$d způsob, jak vám zaplatit + Odebrali jste %1$d způsoby, jak vám zaplatit + Odebrali jste %1$d způsobu, jak vám zaplatit + Odebrali jste %1$d způsobů, jak vám zaplatit + + + Přestali jste sledovat %1$d místo + Přestali jste sledovat %1$d místa + Přestali jste sledovat %1$d místa + Přestali jste sledovat %1$d míst + + + Odebrali jste %1$d soukromé relé + Odebrali jste %1$d soukromá relé + Odebrali jste %1$d soukromého relé + Odebrali jste %1$d soukromých relé + + + Odebrali jste %1$d pole profilu + Odebrali jste %1$d pole profilu + Odebrali jste %1$d pole profilu + Odebrali jste %1$d polí profilu + + + Odebrali jste %1$d kanál relé + Odebrali jste %1$d kanály relé + Odebrali jste %1$d kanálu relé + Odebrali jste %1$d kanálů relé + + + Odebrali jste %1$d vyhledávací relé + Odebrali jste %1$d vyhledávací relé + Odebrali jste %1$d vyhledávacího relé + Odebrali jste %1$d vyhledávacích relé + + + Změnili jste poskytovatele u %1$d služby důvěry + Změnili jste poskytovatele u %1$d služeb důvěry + Změnili jste poskytovatele u %1$d služby důvěry + Změnili jste poskytovatele u %1$d služeb důvěry + + + Přestali jste důvěřovat %1$d relé + Přestali jste důvěřovat %1$d relé + Přestali jste důvěřovat %1$d relé + Přestali jste důvěřovat %1$d relé + + + Odblokovali jste %1$d relé + Odblokovali jste %1$d relé + Odblokovali jste %1$d relé + Odblokovali jste %1$d relé + + Vyprázdnili jste svou peněženku Cashu + Změnili jste svou peněženku Cashu + Přidáno (%1$s) + Změněno (%1$s) + %1$s přidáno + %1$s změněno + %1$s odebráno + Použít novou verzi + Přidali jste soukromé (šifrované) položky. + Změnili jste také soukromé (šifrované) položky. Zde je nelze porovnat. + Odebrali jste všechny soukromé (šifrované) položky. + jen čtení + čtení i zápis + jen zápis + Odebráno (%1$s) + Obnovit uloženou verzi + V jiné aplikaci jste změnili: %1$s + Kanály + Chatovací místnosti + Komunity + Hashtagy + Propojené identity + Místa + Minty + Klíče pro nutzapy + Nabídky + Ostatní položky + Platební adresy + Lidé + Pole profilu + Veřejné chaty + Relé + Skupiny + Vlákna + Poskytovatelé důvěry + Slova + O mně + Banner + Narozeniny + Příznak bota + Nabídka CLINK + Zobrazované jméno + LNURL + Lightning adresa + Uživatelské jméno + Nostr adresa + Obrázek + Zájmena + Webová stránka + Povoleno + Změněno v jiné aplikaci · %1$s + Vaše komunity Concord jsou šifrované pro vás, takže je zde nelze porovnat. Obnovení vrátí přesně to, co uložilo toto zařízení. + Přesunuto + Vypuštěno: %1$s + Vypuštěno + Vytvořeno vámi + Změněno vámi + Vyprázdněno vámi + Kanál + Odstraněno + Hashtagy, které sledujete + Inbox + kde vás ostatní zastihnou + připojeno + zachováno + Zachováno: %1$s + Přijímací klíč odebrán + Přijímací klíč nahrazen + Nutzapy budou uzamčeny tímto novým klíčem. Pokud ho toto zařízení nemá, možná je zde nebudete moci uplatnit. + opuštěno + Opuštěno + Uvedeno + Přesunuto + %1$s a další (%2$s) + Nová verze + Nové: %1$s + nové + Nové + Nově blokováno + Nově ztlumeno: %1$s + Již neblokováno + Nenastaveno + Nic tu není + Nabídka BOLT12 + + %1$d nabídka odebrána + %1$d nabídky odebrány + %1$d nabídky odebráno + %1$d nabídek odebráno + + Outbox + kam publikujete + + Odebrán %1$d způsob, jak vám zaplatit + Odebrány %1$d způsoby, jak vám zaplatit + Odebráno %1$d způsobu, jak vám zaplatit + Odebráno %1$d způsobů, jak vám zaplatit + + Lidé, kteří vám platí, vidí jen to, co je v tomto seznamu. + odebraná místa + Místa, která sledujete + Nyní jsou šifrované — nejspíš právě sem se přesunuly veřejné položky výše. + Převedli jste položky na soukromé + Jsou šifrované, takže je zde nelze porovnat. + Změnili jste soukromé položky + Jsou šifrované, takže jen vy můžete vidět, co obsahovaly. Obnovení je všechny vrátí. + Odebrali jste všechny soukromé položky + Přijímá + přejmenováno + Přejmenováno + V tomto zařízení + + Prohledat %1$s osobu + Prohledat %1$s osoby + Prohledat %1$s osoby + Prohledat %1$s osob + + Vyhledávání + Služba + Sledující + Hodnocení + Témata + + Změněno %1$s z %2$s služby + Změněno %1$s z %2$s služeb + Změněno %1$s z %2$s služby + Změněno %1$s z %2$s služeb + + Nyní je poskytuje někdo jiný, nebo nikdo + Stále blokováno + Ukládá + Vypuštěno · %1$s + Upraveno · %1$s + Nové · %1$s + %1$s – vymazáno + %1$s – aktualizováno + odebraná témata + Hodnocení, počty sledujících a filtrování spamu, které vidíte, pocházejí od těchto poskytovatelů. + Důvěryhodné + %1$s odblokováno + Amethyst se k nim znovu připojí + Jednotky + %1$s odztlumeno + Tyto položky se opět mohou objevit ve vašich kanálech + Nedůvěryhodné + Minty a klíče vaší peněženky jsou šifrované pro vás, takže je zde nelze porovnat položku po položce. Obnovení vrátí přesně to, co uložilo toto zařízení. + dříve „%1$s“ + Slova a hashtagy + synchronizovaná nastavení aplikace + Nastavení Amethystu synchronizovaná mezi vašimi zařízeními. Jsou šifrovaná, takže lze porovnat jen to, zda existují. + seznam blokovaných relé + Relé, ke kterým se tato aplikace nikdy nepřipojí. + nabídky BOLT12 + Lightning nabídky, pomocí kterých vám ostatní platí. + peněženka Cashu + Nastavení a minty vaší ecash peněženky. Jsou šifrované, takže lze porovnat jen to, zda existují. + seznam komunit + Komunity, ke kterým jste se připojili. + seznam komunit Concord + Komunity Concord, ke kterým jste se připojili. Jsou šifrované, takže lze porovnat jen to, zda existují. + seznam DM relé + Kam vám ostatní doručují soukromé zprávy. + seznam dočasných chatů + Dočasné chatovací místnosti, ke kterým jste se připojili. + seznam oblíbených kanálů + Algoritmické kanály, které jste si uložili. + seznam sledovaných + Určuje, čí příspěvky se zobrazí ve vašem domovském kanálu. + sledovaná místa + Místa, jejichž příspěvky se zobrazují ve vašich kanálech. + sledované hashtagy + Hashtagy, jejichž příspěvky se zobrazují ve vašich kanálech. + seznam indexačních relé + Relé používaná k hledání profilů a seznamů relé ostatních lidí. + relé pro klíče skupinových chatů + Kde ostatní najdou klíče, aby vás mohli přidat do šifrovaných skupinových chatů. + seznam ztlumených + Skrývá lidi, slova, hashtagy a vlákna ze všeho, co vidíte. + nastavení příjmu nutzapů + Minty a klíč, které ostatní používají k posílání nutzapů vám. + seznam + Seznam uložený v tomto zařízení. + seznam veřejných relé + Říká všem, kde najdou vaše příspěvky a kam vám posílat odpovědi a zmínky. + platební adresy + Způsoby, jak vám ostatní mohou zaplatit. + seznam soukromých relé + Kde jsou uloženy vaše koncepty a soukromá data. + profil + Vaše jméno, obrázek, bio a platební adresy tak, jak je vidí všichni. + seznam veřejných chatů + Veřejné chaty, ke kterým jste se připojili. + oblíbené kanály relé + Relé, která procházíte jako kanály. + seznam skupin + Skupiny na relé, ke kterým jste se připojili. + seznam vyhledávacích relé + Relé používaná při vyhledávání. + seznam poskytovatelů důvěry + Služby, kterým důvěřujete, že pro vás hodnotí a ověřují lidi. + seznam důvěryhodných relé + Relé, ke kterým se připojujete bez dotazu. + Smazat + Upravit + Úprava vaší zprávy + Přejít na zprávu + Připnout + Odpovědět + Odepnout + Tuto změnu nebylo možné provést. + Koordinátor neodpověděl, takže se nic nezměnilo. Zkuste to za chvíli znovu. + %1$s na tomto koordinátoru nezveřejnil balíček klíčů, takže ho zatím nelze přidat. Požádejte ho, aby na tomto koordinátoru nejprve otevřel cordn. + Ze skupiny cordn nemůžete odebrat sami sebe. + Pro %1$s se nepodařilo zajistit přístup do skupiny, takže přidání bylo zrušeno. + %1$s není v této skupině. + Tato osoba + Tento koordinátor poskytl balíček klíčů, který patří někomu jinému, takže %1$s nebyl přidán. Nic se nezměnilo. + Šifrovací klíče vašich skupin, vaše balíčky klíčů a všechny zprávy v těchto skupinách. Kdokoli soubor otevře, může konverzace číst. Jakmile soubor opustí Amethyst, chrání ho jen heslo. + Co soubor obsahuje + Váš nsec skupiny cordn neobnoví. Skupina cordn existuje jako šifrovací stav na tomto zařízení a jako seřazený proud zpráv na koordinátoru, který ho nedokáže přečíst — přijdete-li o zařízení bez zálohy, skupina je pryč, včetně všeho, co v ní už zaznělo. + Exportovat + Záloha uložena. + Nepovedlo se. Zkontrolujte heslo a soubor. + Heslo + Obnovit + Obnovení nahradí skupiny cordn na tomto zařízení těmi ze souboru. Je určeno pro telefon, který převzal roli jiného — ne k používání stejných skupin na dvou zařízeních zároveň. + Všechny skupiny cordn, které jsou nyní na tomto zařízení, budou odebrány a nahrazeny těmi ze souboru.\n\nNeobnovujte zálohu na druhý telefon, dokud se ten první stále používá. Oba by měly stejné klíče skupin, a jakmile oba odešlou zprávu, skupina se rozbije pro všechny — potichu a nevratně. + Nahradit skupiny cordn na tomto zařízení? + Obnovit + Obnoveno. + Vše, co sem pošlete, je zašifrováno pro tuto skupinu. Koordinátor to předává dál, aniž by to mohl přečíst. + Zatím žádné zprávy + Nové zprávy + Včera + Zpráva + Přidat + Tohoto koordinátora se nepodařilo otevřít. + Kopírovat npub koordinátora + Hledat koordinátory + Přidat + Čte oznámení, která už vaše relaye přenášejí. Žádný koordinátor není kontaktován, takže se žádný z nich nedozví, že jste hledali. + Oznámení se nepodařilo načíst + Na vašich relayích se nikdo neohlašuje. + Ohlášeno před %1$s + Naposledy ohlášeno %1$s + + Nic nenalezeno a %1$d z vašich relayů neodpověděl. + Nic nenalezeno a %1$d z vašich relayů neodpověděly. + Nic nenalezeno a %1$d z vašich relayů neodpovědělo. + Nic nenalezeno a %1$d z vašich relayů neodpovědělo. + + Koordinátor určuje pořadí zpráv jedné skupiny a nic jiného to dělat nemůže. Jeho ztrátou se ztratí i pořadí a druhý koordinátor ten první nezrcadlí — proto jde o konkrétní servery, které si zvolíte, ne o zaměnitelné relaye. + + Neodpovídá — %1$d požadavek za sebou selhal. Skupiny na něm se nesynchronizují. + Neodpovídá — %1$d požadavky za sebou selhaly. Skupiny na něm se nesynchronizují. + Neodpovídá — %1$d požadavku za sebou selhalo. Skupiny na něm se nesynchronizují. + Neodpovídá — %1$d požadavků za sebou selhalo. Skupiny na něm se nesynchronizují. + + Odpovídá. + Požadavek selhal, zkouší se znovu. + Zatím nebyl o nic požádán. + Skrýt ty, které se přestaly ohlašovat + Zjistit, kdo to je + Klíč koordinátora + Název (váš vlastní, volitelný) + Tento název je váš a zůstává na tomto zařízení. Koordinátor nemůže název prokázat, proto se ho na něj nikdy neptáme. + Další akce + Zatím žádní koordinátoři. + Vymazat + Odebráním zůstanou skupiny na tomto zařízení, takže po opětovném přidání koordinátora se vrátí s ním. Vymazáním se smažou: klíče skupin, pozice čtení i vaše balíčky klíčů zmizí a do těchto skupin se lze vrátit jen s novou pozvánkou.\n\nKoordinátor se o tom nedozví a ponechá si vše, co už měl. + Vymazat tohoto koordinátora? + %1$s + Odpovídá na + %1$s +%2$d další + Odebrat + Přejmenovat + Tvrdí, že je: %1$s + Název a verzi si koordinátor zvolil sám. Identifikuje ho jen jeho veřejný klíč. + Odpověděl, ale nic neuvedl. + Zobrazit vše (%1$d) + Zobrazit méně + + Zobrazit %1$d, který se přestal ohlašovat + Zobrazit %1$d, které se přestaly ohlašovat + Zobrazit %1$d, které se přestaly ohlašovat + Zobrazit %1$d, které se přestaly ohlašovat + + Tito koordinátoři se neohlásili déle než měsíc. Vytvoření skupiny na takovém, který už zanikl, selže. + Vytvořit skupinu + + Vytvořit a pozvat %1$d osobu + Vytvořit a pozvat %1$d osoby + Vytvořit a pozvat %1$d osoby + Vytvořit a pozvat %1$d osob + + Přidat někoho + Administrátor + + %1$d osoba může přidávat a odebírat + %1$d osoby mohou přidávat a odebírat + %1$d osoby může přidávat a odebírat + %1$d osob může přidávat a odebírat + + Tuto skupinu spravuji jen já + Jen vy můžete zvát, odebírat členy nebo měnit údaje skupiny. Později to můžete předat někomu jinému. + Koordinátor + Změnit + Najít koordinátory + Hotovo + Jiný koordinátor + Veřejný klíč koordinátora (hex nebo npub) + Relaye, na kterých odpovídá, jeden na řádek + + Zastihne vaši %1$d osobu + Zastihne všechny %1$d vaše osoby + Zastihne %1$d vaší osoby + Zastihne všech %1$d vašich osob + + Zastihne %1$d z %2$d — ostatní by zůstali mimo + Neověřeno — výběrem se to zjistí + Popis (volitelné) + Všichni mohou přidávat a odebírat + Každý ve skupině může zvát, odebírat členy a měnit její údaje. Kterýkoli člen může později jmenovat administrátory, čímž tento režim skončí. + Pořadí zpráv ve skupině cordn určuje jeden koordinátor, kterého si zvolíte. Skupina se vytváří na tomto zařízení — koordinátor se o její existenci dozví, až někoho pozvete nebo pošlete zprávu. + Skupinu se nepodařilo vytvořit. + Název skupiny + Není zvolen žádný koordinátor + Každá pozvánka je zpráva Welcome ponechaná na koordinátoru, takže mohou selhat i jednotlivě. Nikdo nedostal oznámení: pozvánku uvidí, až příště otevřou svou aplikaci. + Koordinátor pozvánku odmítl + Poslat odkaz + Přidán do skupiny, ale pozvánka ho nezastihla — zkuste to znovu z obrazovky skupiny + Otevřít chat + Zde není žádný klíč, takže nešlo ponechat zprávu Welcome + Skupina existuje + Čeká se na ně + Hotovo + Zatím nikdo nepřidán. Skupinu lze vytvořit prázdnou a pozvánky poslat později, ale právě uvedením lidí teď zjistíte, který koordinátor je zastihne. + Zatím nikdo — klepnutím přidáte lidi + Uvedením lidí teď zjistíme, který koordinátor je zastihne. Každý z nich dostane zprávu Welcome ponechanou na tomto koordinátoru a vyzvedne si ji, až příště otevře svou aplikaci. + + Dostupný na %1$d koordinátoru + Dostupný na %1$d koordinátorech + Dostupný na %1$d koordinátoru + Dostupný na %1$d koordinátorech + + Žádný klíč na žádném z vašich koordinátorů + Zatím neověřeno + Kdo může přidávat a odebírat + Pojmenování + Kdo v ní bude + Kde poběží + Nová skupina Cordn + + %1$d osobu nezastihne žádný z vašich koordinátorů + %1$d osoby nezastihne žádný z vašich koordinátorů + %1$d osoby nezastihne žádný z vašich koordinátorů + %1$d osob nezastihne žádný z vašich koordinátorů + + Vy, vždy administrátor + Všichni ve skupině uvidí tuto zprávu jako staženou a Amethyst přestane zobrazovat její text. Koordinátor si stále uchovává zašifrovanou kopii, v jaké byla odeslána, a kdo ji už četl, ten ji už četl. + Stáhnout zprávu + Přijato koordinátorem + Rozumím + Co tento koordinátor vidí + Informace o skupině + Tato skupina není dostupná. Její koordinátor mohl být odebrán. + Přidejte koordinátora v Nastavení, abyste mohli začít používat skupiny cordn. + + %1$d skupina + %1$d skupiny + %1$d skupiny + %1$d skupin + + Z těchto skupin nic nepřichází. Amethyst to stále zkouší znovu. + Koordinátoři + Zatím žádné skupiny cordn + Skupina cordn žije na jednom koordinátoru, který spravuje její členství a předává zprávy, aniž by kdy viděl, co kdo píše. + Založit skupinu + Přidat někoho + Pod tímto jménem nikdo nenalezen. + Přidat lze jen ty, kdo na tomto koordinátoru zveřejnili balíček klíčů. + Jméno, npub nebo jmeno@domena + Admin + + %1$d administrátor skupiny zůstává beze změny. + %1$d administrátoři skupiny zůstávají beze změny. + %1$d administrátora skupiny zůstává beze změny. + %1$d administrátorů skupiny zůstává beze změny. + + Koordinátor + Klíč koordinátora + Odkaz na koordinátora + Kopírovat nprofile koordinátora + Upravit údaje + Tato skupina nemá administrátory: každý může přidávat, odebírat a přejmenovávat, a to natrvalo. + Epocha + ID skupiny + Lze přidat na tomto koordinátoru + Členové + %1$s odsud přestane dostávat zprávy. Co už přečetl, mu zůstane, a nelze to vrátit zpět — musel by být pozván znovu. + Odebrat ze skupiny? + Odebrat + Uložit + Technické podrobnosti + Připojit se + Odmítnout + Odmítnutí je trvalé. Pro návrat budete potřebovat novou pozvánku. + Kontroluje se jen při otevření této obrazovky a nikdy jindy — dotaz na koordinátora, zda vás někdo pozval, mu prozradí, že jste tady, a proto to Amethyst nedělá na pozadí. + Pozvánky se nepodařilo načíst. + + %1$d osoba už je v této skupině + %1$d osoby už jsou v této skupině + %1$d osoby už je v této skupině + %1$d osob už je v této skupině + + +%1$d další + Nemáte otevřeného žádného koordinátora. Pozvánky cordn přicházejí přes koordinátora, takže zatím není kde hledat. + Žádné čekající pozvánky. + Zkontrolovat znovu + Pozvánka byla ponechána pro jiné zařízení + Pozvánky Cordn + %1$s neodpověděl + Přes %1$s + Zveřejněním podepíšete záznam vlastním klíčem svého účtu. Daný koordinátor se pak dozví, že tento účet existuje a lze ho pozvat — natrvalo, a bez ohledu na to, zda vás někdo pozve. + Ostatní vás mohou přidat do skupiny cordn jen pomocí balíčku klíčů, který jste zveřejnili na daném koordinátoru. Cordn ho nemá kde jinde uchovat, takže bez zveřejněného balíčku vás nikdo nemůže pozvat — a nic mu neřekne proč. + Balíčky klíčů se nepodařilo načíst. + Žádný záložní balíček. Jakmile dojdou jednorázové, pozvánky budou selhávat. + Záložní balíček je zveřejněn, takže pozvánku lze vytvořit i poté, co dojdou jednorázové. + + %1$d balíček, který toto zařízení nedokáže otevřít + %1$d balíčky, které toto zařízení nedokáže otevřít + %1$d balíčku, které toto zařízení nedokáže otevřít + %1$d balíčků, které toto zařízení nedokáže otevřít + + Koordinátor je předá každému, kdo vás zve, ale soukromá část není na tomto zařízení — patří jiné instalaci. Pokud tato instalace už neexistuje, pozvánka s jedním z nich vytvoří zprávu Welcome, kterou nikdo nikdy neotevře. + Zveřejnit jeden + Zveřejnit záložní + + K dispozici je %1$d jednorázový balíček. + K dispozici jsou %1$d jednorázové balíčky. + K dispozici je %1$d jednorázového balíčku. + K dispozici je %1$d jednorázových balíčků. + + Jakmile zde poprvé něco zveřejníte, Amethyst bude spotřebované balíčky potichu nahrazovat. Ten první ale nikdy nezveřejní za vás. + Stáhnout vše + Stáhnout tyto + Požádat o připojení k této skupině + Tímto zveřejníte balíček klíčů pod vlastním klíčem svého účtu a sdělíte koordinátorovi, že se chcete připojit k této skupině — bez ohledu na to, zda někdo odpoví. + O připojení se nepodařilo požádat. + Požádáno. Některý člen skupiny vás musí přidat; pozvánka se pak objeví mezi pozvánkami cordn. + Skenovat + Tento soubor se nepodařilo otevřít. + Pro tento účet není nastaven žádný mediální server, takže soubor nemá kam uložit. Vyberte ho v Nastavení. + Tento soubor nelze přečíst. + Tento soubor se nepodařilo odeslat. + + %1$d člen + %1$d členové + %1$d člena + %1$d členů + + Zpráva smazána + Koordinátor + Kurzor + Odesláno + Podrobnosti zprávy + upraveno + Připnul %1$s + + %1$d připnutá zpráva v této skupině + %1$d připnuté zprávy v této skupině + %1$d připnuté zprávy v této skupině + %1$d připnutých zpráv v této skupině + + Další připnutá zpráva + Předchozí připnutá zpráva + Zobrazit všechny připnuté zprávy + Připnuté zprávy + Reakce + Přidat + Přijmout může jen administrátor. Ve skupině bez administrátorů to je kdokoli. + Zkontrolovat žádosti + Zamítnout + Žádosti se nepodařilo načíst. + Nikdo nečeká na připojení. + Žádosti o připojení + Odeslat + Odeslání se nezdařilo. + Koordinátor této skupiny není otevřen, takže zatím nelze nic odeslat. + Zkopírováno + Kopírovat odkaz + Kdokoli s tímto odkazem může požádat o připojení. Pustit ho dovnitř ale musí administrátor. + Sdílet tuto skupinu + Přehrát hlasovou zprávu + Nahrát hlasovou zprávu + Zastavit a odeslat diff --git a/commonsUI/src/commonMain/composeResources/values-de-rDE/strings.xml b/commonsUI/src/commonMain/composeResources/values-de-rDE/strings.xml index 430670818d..df7de8f834 100644 --- a/commonsUI/src/commonMain/composeResources/values-de-rDE/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-de-rDE/strings.xml @@ -166,6 +166,152 @@ Stau Straßenereignis + Geocache + Traditional + Multi-Cache + Mystery + Mikro + Klein + Normal + Groß + Andere Größe + D%1$d + T%1$d + FTF + Kunstwerk + Key Quest + Verifizierte Funde + FTF vergeben + Archiviert + Nicht weiter? Tippen, um den Hinweis anzuzeigen + Nicht lesbar? Für die andere Lesart tippen + In der Nähe + Gefunden! + Verifizierter Fund + Nachweis ist ungültig + Cache wird geladen… + Versteckt von %1$s + Navigieren + Koordinaten kopieren + Koordinaten kopiert + Fotos + Key-Quest-Mission + Logs + Diesen Cache hat noch niemand geloggt. Sei der Erste. + Ich habe ihn gefunden + Nicht gefunden + Notiz hinzufügen + Wartungsbedarf melden + Zu einer Tour hinzufügen + Neue Tour… + Du hast noch keine Tour erstellt. + Bereits in dieser Tour + + %1$d Cache hier + %1$d Caches hier + + Dieses Foto entfernen + Dieser Cache wurde archiviert. Er ist nicht mehr im Spiel. + FTF geht an %1$s + Der FTF ist noch zu haben + Owner + Diesen Cache bearbeiten + Diesen Cache archivieren + Archivieren. Finder sehen, dass er nicht mehr im Spiel ist, und das Listing bleibt lesbar. + Erstfinder festschreiben + Veröffentlicht einen F-Tag mit %1$s. Das ist endgültig. + Noch keine verifizierten Funde, also gibt es niemanden zum Festschreiben. + Verifizierungscode anzeigen + Drucke ihn aus und lege ihn in den Cache. Amethyst speichert ihn nicht — wenn du ihn verlierst, können Finder nicht mehr beweisen, dass sie dort waren. + Nicht gefunden + Notiz + Wartung erforderlich + Fund loggen + Cache + Dein Log + Wie lief es? + Foto hinzufügen + Deine Key-Quest-Antwort + Anwesenheitsnachweis + Code im Cache scannen + Anderen Code scannen + Verifiziert — du warst am Cache + Einmalig mit dem Code aus der Dose signiert. Der Schlüssel wird nie gespeichert und verlässt diesen Bildschirm nie. + Das ist kein Verifizierungscode. + Dieser Code gehört zu einem anderen Cache. + Dieser Cache verlangt keinen Nachweis, du kannst ihn also einfach loggen. + Dein eigener Standort wird diesem Log nicht angehängt. + Senden + Log hinzufügen + In der Nähe + Karte + Touren + Funde + Meine + Nicht gefunden + D ≤ %1$d + T ≤ %1$d + Mit Preis + Nachweis erforderlich + Meinen Standort verwenden + Nach Entfernung sortiert + Neueste zuerst + Cache verstecken + Hier gibt es noch keine Caches. Probiere eine größere Folgeliste oder verstecke den ersten. + Du hast noch keinen Fund geloggt. + Du hast noch keinen Cache versteckt. + Noch keine Touren. + Funde + FTFs + Verifiziert + Versteckt + Auf mich zentrieren + Lange auf die Karte drücken, um dort einen Cache zu verstecken + Öffnen + Wo + Was + Extras + Nachweis + Relays + Dies veröffentlicht einen öffentlichen Standort mit einer Genauigkeit von etwa 5 Metern. Jeder auf Nostr kann ihn sehen, und ein veröffentlichtes Event kann nicht zurückgeholt werden. + Ort auswählen + Veröffentlicht %1$s sowie gröbere Zellen bis hinunter zu 3 Zeichen für die Umkreissuche. + Name + Beschreibung + Typ + Größe + Schwierigkeit + Gelände + Hinweis + Finder sehen + Hinweis verschlüsseln (ROT13) + Key-Quest-Mission + Zusätze + Anwesenheitsnachweis verlangen + Für diesen Cache wurde ein Verifizierungsschlüssel erzeugt. + Wo Finder loggen sollen + Veröffentlichen + Gib dem Cache einen Namen. + Wähle aus, wo der Cache versteckt ist. + %1$d von %2$d gefunden + Tour starten + + %1$d Cache + %1$d Caches + + Titel + Beschreibung + Bannerbild + Caches, in Reihenfolge + Cache hinzufügen + Nach oben + Nach unten + Entfernen + Seitendesign + Kartenstil + Gib der Tour einen Titel. + Füge mindestens einen Cache hinzu. + Veröffentlichen fehlgeschlagen. Prüfe deine Relay-Verbindung und versuche es erneut. Zaps hierauf werden aufgeteilt zwischen: %1$d%% Value-for-Value @@ -188,6 +334,51 @@ Profilbanner Auf den QR-Code verweisen + Amethyst braucht die Kamera, um QR-Codes zu scannen. Es wird nichts aufgezeichnet oder hochgeladen — die Bilder werden auf dem Gerät ausgewertet und verworfen. + Kamera erlauben + Der Kamerazugriff ist für Amethyst deaktiviert. Du kannst ihn in den Android-Einstellungen wieder aktivieren. + Einstellungen öffnen + Der QR-Decoder konnte auf diesem Gerät nicht starten. Du kannst den Code trotzdem als Text einfügen. + Licht einschalten + Licht ausschalten + Es ist dunkel — probier das Licht + Bild scannen + Einfügen + Kein QR-Code in diesem Bild gefunden + Nichts zum Scannen in der Zwischenablage + Tippe auf den gewünschten Code + + %1$s von %2$s Teil erfasst — weiter so + %1$s von %2$s Teilen erfasst — weiter so + + Zoom zurücksetzen + Amethyst kann diesen Code nicht öffnen + Dieser Code enthält einen privaten Schlüssel oder ein Kopplungsgeheimnis, daher wird sein Inhalt hier nicht angezeigt. Verwende den Bildschirm, der ihn erwartet. + Das ist ein privater Schlüssel. Füge ihn stattdessen auf dem Anmeldebildschirm ein. + Das ist eine Wallet-Verbindung. Füge sie in den Wallet-Einstellungen hinzu. + Das ist eine Remote-Signer-Adresse. Amethyst gibt solche Adressen heraus, damit andere Apps es um Signaturen bitten können — anmelden kann es sich damit nicht. + Das ist eine App, die sich mit deinem Signierer verbinden möchte. Öffne sie über den NIP-46-Signierer-Bildschirm. + Das ist eine Lightning-Rechnung. + Das ist ein Cashu-Token. + Das ist ein Weblink. + Das ist einfacher Text, kein Nostr-Code. + Das ist ein Nostr-Code, aber keiner, den dieser Bildschirm öffnen kann. + Profil + Beitrag + Nostr-Code + Relay + Privater Schlüssel + Wallet-Verbindung + Remote-Signer-Adresse + Verbindungsanfrage an Signierer + Lightning-Rechnung + Cashu-Token + Weblink + Einfacher Text + Link öffnen + Kopieren + Kopiert + Erneut scannen QR-Code anzeigen Profilbild Dein Profilbild @@ -634,17 +825,70 @@ Stunden Minuten Sekunden + Nutze die Trainings, die du schon aufgezeichnet hast + Verbinde Health Connect (Samsung Health, Google Fit, Fitbit, Garmin…), um „Meine Fitness“ aufzubauen, deine persönliche Trainingsübersicht, und um dieses Training aus einem zu übernehmen, das deine Uhr bereits aufgezeichnet hat, statt jede Zahl von Hand einzutippen. Verbinden %1$s km Aus Health Connect Was Amethyst liest Health Connect und Amethyst + Amethyst nutzt Health Connect, um „Meine Fitness“ aufzubauen — deine persönliche Trainingsübersicht, auf deinem Telefon. + „Meine Fitness“ (Menü → Du → Meine Fitness) zeigt dir, wie du trainiert hast: wie viel du diese Woche im Vergleich zur letzten gemacht hast, wie sich deine Zeit auf Laufen, Radfahren, Gehen, Schwimmen und Fitnessstudio verteilt, deine Bestleistungen, an wie vielen Tagen du trainiert hast und deine aktuelle Serie. Amethyst erstellt dieses Bild aus den Trainings, die deine Uhr oder Fitness-App bereits in Health Connect gespeichert hat, zusammen mit allen Trainings, die du in Amethyst selbst erfasst hast. Es wird auf deinem Telefon berechnet und nur dir angezeigt. Was Amethyst liest und warum + Training · welche Aktivität du gemacht hast, wann sie begann und wie lange sie dauerte. Das ist das Training selbst: Daraus ergeben sich deine Anzahl an Trainings, deine Trainingszeit, die Aufschlüsselung nach Aktivität, deine aktiven Tage und deine Serie. + Distanz · wie weit du gekommen bist, angezeigt als deine Distanz dieser Woche im Vergleich zur letzten, dein Wochendurchschnitt, deine Distanz pro Aktivität und deine längste Distanz. + Aktive und Gesamtkalorien · die Energie, die ein Training verbrannt hat, angezeigt als deine Energie dieser Woche und im Vergleich zur letzten Woche. Aktive Kalorien werden verwendet, wenn deine Quelle sie erfasst; Gesamtkalorien dienen als Ersatz für Quellen, die nur den Gesamtenergieverbrauch erfassen. + Herzfrequenz · Durchschnitt und Maximum jedes Trainings, zusammengefasst zu deiner durchschnittlichen und höchsten Herzfrequenz im Zeitraum. So unterscheidest du eine lockere Woche von einer harten bei gleicher Distanz. + Schritte · die Schrittzahl eines Laufs, Spaziergangs oder einer Wanderung, angezeigt als dein wöchentlicher Schrittdurchschnitt und deine höchste Schrittzahl. + Höhenmeter · wie viel du aufgestiegen bist, angezeigt als dein wöchentlicher Durchschnitt an Höhenmetern und dein größter Anstieg. Daran erkennst du eine flache Woche von einer hügeligen. Was Amethyst nicht tut + Liest nur Trainings der letzten 4 Wochen, und nur solange „Meine Fitness“ oder der Trainings-Editor geöffnet ist. Liest nie im Hintergrund. Schreibt nie etwas in Health Connect und fragt nie nach deiner Trainingsroute, deinem Standort oder anderen Gesundheitsdaten. + Sendet deine Gesundheitsdaten nirgendwohin. „Meine Fitness“ wird auf deinem Telefon berechnet und bleibt dort. Wenn du später ein Training posten möchtest, tippst du bei diesem Training auf Teilen, liest den Beitrag, den Amethyst ausgefüllt hat, und veröffentlichst ihn selbst — ein Training nach dem anderen, nie automatisch. + Die gesamte Funktion ist optional. Widerrufe die Berechtigungen jederzeit in Health Connect — „Meine Fitness“ zeigt dann wieder die Aufforderung — oder schalte die Editor-Vorschläge unter Einstellungen → Editor-Einstellungen aus. Der Rest von Amethyst funktioniert weiter. Vollständige Datenschutzerklärung lesen + Meine Fitness + Letzte 4 Wochen + Distanz, Kalorien und Herzfrequenz werden geladen… + Die letzten vier vollen Wochen deines Trainings: die Trainings, die du veröffentlicht hast, plus alles, was Health Connect auf diesem Telefon erfasst. Amethyst berechnet die Übersicht auf dem Gerät und veröffentlicht nichts davon. + Diese Woche + ggü. letzter Woche + Wochendurchschnitt + Trainings + Aktive Tage + Tage in Folge + Zeit + %1$d Std. %2$d Min. + %1$d Min. + %1$d Sek. + Distanz + Kalorien + Schritte + Höhenmeter + Ø HF + Max. HF + Nach Aktivität + Bestleistungen + Längste Distanz + Längstes Training + Größter Anstieg + Meiste Schritte + Höchste Herzfrequenz + Letzte Trainings + In den letzten 4 Wochen wurde nichts erfasst. Trainings, die du postest, und alle, die deine Uhr aufzeichnet, erscheinen hier. + Verfolge dein Training + Verbinde Health Connect, um deine Wochensummen, den Trend im Wochenvergleich, deine Bestleistungen und deine Trainingsserie zu sehen. Alles bleibt auf deinem Telefon. + Verbinde Health Connect, um die Trainings deiner Uhr mit Herzfrequenz, Schritten und Höhenmetern hinzuzufügen. + Verbinden + Dieses Training teilen + S/min + kcal + km + mi + m + ft Noch keine nSites gefunden. Neu laden Der In-App-Browser benötigt Android 11 oder neuer. @@ -1080,6 +1324,8 @@ Schließdatum und -zeit Umfrage endet in %1$s Veranstaltung suchen %1$s + Wird geladen + Warte, bis deine privaten Nachrichten geladen sind… Zap senden Füge eine öffentliche Nachricht hinzu Füge eine private Nachricht hinzu @@ -1219,6 +1465,8 @@ + %1$02d:%2$02d + %1$d:%2$02d:%3$02d Verwerfen Kamera wechseln Sprachanruf @@ -1353,6 +1601,14 @@ Benutzereinstellungen Einstellungen durchsuchen Keine Einstellungen für „%1$s“ gefunden + Gruppe aktualisiert + Anhang + Nachricht + %1$s: %2$s + Gruppe erstellen + Marmot-Einladungen gehen an ein anderes Gerät und können hier nicht geöffnet werden. + Schließen + Von diesem Gerät veröffentlichen Marmot-Status zurücksetzen? Dadurch werden alle Marmot-Gruppenchats, der Nachrichtenverlauf und alle MLS-Schlüssel auf diesem Gerät für das aktuelle Konto dauerhaft gelöscht. Andere Teilnehmer werden nicht benachrichtigt und können dich bis zu ihrem nächsten Commit weiterhin in Gruppen sehen. Dies kann nicht rückgängig gemacht werden. Beim nächsten Synchronisieren der App wird ein neues KeyPackage veröffentlicht. Zurücksetzen @@ -1623,6 +1879,7 @@ Keine Transaktionen entsprechen diesem Filter Wird geladen… Empfangen + Gezappten Beitrag öffnen Gesendet Aktualisieren Alle @@ -1939,6 +2196,8 @@ Video in einem schwebenden Fenster abspielen (ausgeblendet, wenn nicht unterstützt) An Gerät streamen Sendet das Video an einen Chromecast-Empfänger in deinem WLAN (für lokale Dateien ausgeblendet) + Untertitel + Untertitel ein- oder ausschalten (ausgeblendet, wenn das Video keine hat) Wähle die Animation, die beim Abspielen von Audios angezeigt wird. Aus Spektrum-Balken @@ -2626,6 +2885,7 @@ Du erfüllst die Web-of-Trust-Anforderungen dieser Community nicht. Das aktuelle Community-Regeldokument wurde als veraltet abgelehnt. Marmot-Gruppen + Cordn-Gruppen Gruppe erstellen Marmot-Gruppe erstellen Eine neue MLS-Gruppe wird erstellt. Sie können danach Mitglieder hinzufügen. @@ -2917,13 +3177,18 @@ Benachrichtigt dich, wenn jemand auf deinen Beitrag antwortet Antworten Neue Antworten + Nicht gesendet Antworten + Erneut versuchen + Wird gesendet… + Wird noch gesendet… Benachrichtigt dich, wenn jemand deinen Beitrag repostet %1$s hat deinen Beitrag repostet Reposts Neue Reposts Benachrichtigungen, wenn ein geplanter Beitrag veröffentlicht wird oder die Veröffentlichung fehlschlägt. Geplante Beiträge + Dieses Konto wurde aus Amethyst entfernt. Benachrichtigt dich, wenn dich jemand zappt %1$s Sats für %1$s @@ -3124,6 +3389,10 @@ Stummschaltung aufheben Callback-URL aus %1$s Antwort nicht gefunden Abbrechen + Aus + Untertitel ausschalten + Untertitel einschalten + Untertitel Cashu-Token Mint wird geprüft… Cashu konnte nicht eingelöst werden @@ -3600,10 +3869,12 @@ Abenteuer-Prolog Abenteuer-Lesung Abenteuer-Szene + App-Liste App-Empfehlungen Termin Apps RSVP für Termin + Artikelliste Audio-Header Audiospur Erstellte Podcasts @@ -3616,6 +3887,7 @@ Blossom-Authentifizierung Blossom-Server Lesezeichenliste + Lesezeichen-Set Broadcast-Relays Kalender Kanaldefinition @@ -3653,6 +3925,7 @@ Emoji-Pakete Ephemerer Chat Ephemere Chaträume + Lieblings-Feeds Lieblings-Podcasts Bevorzugte Relays Datei-Header @@ -3661,28 +3934,36 @@ Follow-Pakete Geohash-Follows Geschenkverpackungen + Git-Autoren Git-Issue Git-Patch Pull Request PR Update Git-Antwort Git-Repository + Git-Repositories Git-Status: Angewendet Git-Status: Geschlossen Git-Status: Entwurf Git-Status: Offen + Vertrauenswürdige Wiki-Autoren + Vertrauenswürdige Wiki-Relays Gefolgte Hashtags Highlights HTTP-Authentifizierung Index-Relay-Liste + Interessen Live-Chats Live-Streams + Medien-Follows + Medien-Starterpaket Medizinische Daten Besprechungsraum Besprechungsbereich Musik-Playlist Musiktitel Stummschaltliste + Stummgeschaltet für Typ %1$s Benannte Lesezeichen Nests-Server NIP @@ -3697,6 +3978,7 @@ Outbox-Relays Zahlen an Personenlisten + Bilderliste Bilder Angepinnt Podcast-Folge @@ -3723,6 +4005,7 @@ Such-Relays Shorts Shorts (Antwort) + Gruppen Torrent-Kommentare Torrents Vertrauenswürdige Anbieter @@ -3731,7 +4014,10 @@ Benutzereinstellungen Benutzerstatus Video + Video-Zusammenarbeit + Videoliste Video (Antwort) + Video-Untertitel Sprachnachricht Sprachantwort Aufwachen @@ -3768,6 +4054,8 @@ Ort auf der Karte ändern Standort-Kanäle Wähle einen Ort auf der Karte + Amethyst für Android kann sich nicht mit einer bunker://-Adresse anmelden. Es gibt solche Adressen heraus, damit andere Apps es um Signaturen bitten können, aber anmelden kann es sich damit nicht. Verwende eine externe Signierer-App oder Amethyst Desktop. + Das ist eine App, die sich mit deinem Signierer verbinden möchte, keine Anmeldemöglichkeit. Melde dich zuerst an und öffne sie dann über den NIP-46-Signierer-Bildschirm. Du verwendest einen öffentlichen Schlüssel und öffentliche Schlüssel sind schreibgeschützt. Mit einem privaten Schlüssel anmelden, um Beiträge boosten zu können Du verwendest einen öffentlichen Schlüssel und öffentliche Schlüssel sind schreibgeschützt. Mit einem privaten Schlüssel anmelden, um folgen zu können Du verwendest einen öffentlichen Schlüssel, und öffentliche Schlüssel sind nur lesbar. Melden Sie sich mit einem privaten Schlüssel an, um ein Wort oder einen Satz auszublenden @@ -3858,6 +4146,7 @@ Benachrichtigungen stummschalten Stummgeschaltet. Drücken, um Ton einzuschalten Meine Blossom-Dateien + Meine Fitness Meine Listen Ein Name wird benötigt %1$dms @@ -4121,6 +4410,7 @@ Remote-Signer-App Remote-Signer + Diese Liste hat private Mitglieder, die nur ihr Autor sehen kann %1$d Asset gebündelt %1$d Assets bündelt @@ -4653,12 +4943,21 @@ Kalender Schach Entdecken + Cache bearbeiten + Tour bearbeiten + Cache + Tour + Cache-Touren + Geocaches Startseite Folgeliste importieren + Fund loggen Medien Nachrichten Wiedergabelisten Musik + Cache verstecken + Neue Tour Benachrichtigungen Folgen Podcasts @@ -4846,6 +5145,18 @@ Löschanfrage gesendet Bessere Qualität bei kleinerer Dateigröße, aber nicht alle Geräte unterstützen die H.265-Wiedergabe. H.265/HEVC-Codec verwenden + Hat eine Mitwirkungsnennung angenommen + Hat eine Mitwirkungsnennung abgelehnt + Nennung angenommen + Audio von + Mit + Inspiriert von + Verweise + Private Liste + + %1$d Video + %1$d Videos + Der Videodownload wurde gestartet… Videoplayer-Schaltflächen Video in der Galerie des Smartphones gespeichert @@ -4905,15 +5216,875 @@ Der Lightning-Service des Empfängers unter %1$s ist nicht verfügbar. Er wurde aus der Lightning-Adresse "%2$s" berechnet. Fehler: %3$s. Überprüfen Sie, ob der Server online ist und ob die Lightning-Adresse korrekt ist Kann keine Blitzrechnung von %1$s erstellen: Element pr nicht im resultierenden JSON gefunden. Blitzrechnung konnte nicht erstellt werden. Nachricht von %1$s: %2$s + Dieses Gerät empfängt jetzt deine Marmot-Einladungen. + KeyPackage konnte nicht veröffentlicht werden: %1$s + Kein Relay hat das KeyPackage angenommen. Prüfe deine Relay-Einstellungen und versuche es erneut. + Wird gesendet… + Konnte nicht gesendet werden. Tippe, um es erneut zu versuchen. + + %1$d neue Nachricht + %1$d neue Nachrichten + + Koordinator-Gruppe + Zugestellt von einem Koordinator, nicht von Relays + Was dieser Koordinator sehen kann + Ein Koordinator ist ein einzelner Server, der jede Nachricht dieser Gruppe in Reihenfolge überträgt. Das ist ein anderer Kompromiss als bei Relays — gut zu wissen, bevor du dies wie jeden anderen Chat behandelst. + Nachrichteninhalte + Wer in der Gruppe ist + Wer was sendet + Nicht lesbar + Unter einem Wegwerfschlüssel + Mit deinem echten Konto verknüpft + Details + Koordinator %1$s + Das ist nicht dieselbe Offenlegung wie bei einer Marmot-Gruppe, bei der kein einzelner Betreiber die gesamte Unterhaltung besitzt. + Beim Beitritt werden auf beiden Seiten echte Konten genannt, daher weiß der Koordinator, wer in dieser Gruppe ist. + Ein einziger Wegwerfschlüssel sendet und ruft für jede deiner Gruppen hier ab, daher kann der Koordinator erkennen, dass sie alle zu dir gehören. + Ein einzelner Betreiber besitzt den vollständigen, geordneten Verlauf jeder Gruppe, die er überträgt. + Das von dir veröffentlichte KeyPackage ist ein signierter Nachweis, dass dieses Konto cordn nutzt, und der Koordinator kann es an jeden weitergeben. + Nachrichten werden nicht aufgefüllt, daher sieht der Koordinator, wie lang jede einzelne ist. + Dieser Client verschlüsselt nicht für den Koordinator. Das ist ein Fehler — bitte melde ihn. + Noch nicht kontaktiert + Antwortet + Antwortet nicht + + %1$d fehlgeschlagener Versuch in Folge + %1$d fehlgeschlagene Versuche in Folge + + Füge einen cordn1…-Link ein, den dir jemand geschickt hat, um zu sehen, welcher Koordinator diese Gruppe überträgt und was dieser Betreiber über dich erfahren würde, wenn du beitrittst. + cordn1… + Prüfen + Einfügen + Leeren + Das ist kein cordn-Gruppenlink: %1$s + Gruppen-ID + Koordinator + Erreichbar über + Dieser Link nennt keinen Koordinator und kann daher nicht allein verwendet werden. Frag die Person, die ihn geschickt hat, welcher Koordinator die Gruppe überträgt. + Durch das Prüfen eines Links trittst du nichts bei, und ein Link allein macht dich nicht zum Mitglied. + Cordn-Gruppenlink + cordn koordinator coordinator gruppe link einladung invite mls chat metadaten privatsphäre offenlegung + Cordn-Koordinatoren + cordn koordinator coordinator hinzufügen entfernen löschen purge status server mls chat reihenfolge + Cordn-KeyPackages + cordn keypackage schlüsselpaket veröffentlichen einladen einladung last resort koordinator mls + Cordn-Backup + cordn backup sicherung wiederherstellen export import passphrase gruppen wiederherstellung + Cordn-Gruppen + Ende-zu-Ende-verschlüsselte Gruppen, die von einem Koordinator deiner Wahl statt von Relays geordnet werden. + Gruppe %1$s + Noch keine Nachrichten + Cordn-Gruppe, übertragen von %1$s + Nachricht gelöscht + Sprachnachricht + Foto + Video + Datei + Cordn-Gruppe + Verschlüsselter Gruppenchat, geordnet von einem Koordinator deiner Wahl. + Koordiniert + Ideal für Teams, die eine verlässliche Reihenfolge der Unterhaltung wollen. + Cordn-Gruppe erstellen + Ende-zu-Ende-verschlüsselt mit MLS — der Koordinator kann nie eine Nachricht lesen. + Eine gemeinsame Reihenfolge für alle, sodass der Verlauf nicht durch eine falsch gehende Uhr durcheinandergeraten kann. + Der Koordinator erfährt, wer in der Gruppe ist und wann ihr schreibt, auch wenn er nicht lesen kann, was ihr sagt. + In eine cordn-Gruppe eingeladen? + Einladungen ansehen + Cordn + Gruppen, die von einem Koordinator deiner Wahl statt von Relays zugestellt werden. + Gruppenlink prüfen + Sieh nach, worauf ein cordn1…-Link verweist, bevor du darauf reagierst + Von diesem Smartphone umziehen + Von einem anderen Smartphone übernehmen + Veröffentlichte KeyPackages + Der Link + Deine Koordinatoren + Selbst angekündigt + Manuell hinzufügen + Passphrase + Backup erstellen + Aus Backup wiederherstellen + Der Koordinator + Dieses Gerät + Koordinatoren + Die Server, die deine Gruppen übertragen + KeyPackages + Damit können andere dich zu einer Gruppe hinzufügen + Backup und Wiederherstellung + Eine mit Passphrase verschlüsselte Datei, die du aufbewahrst + Auf ein neues Smartphone umziehen + Übergib deine Gruppen an ein Gerät, auf das du wechselst + Auf ein neues Smartphone umziehen + Deine cordn-Gruppen liegen auf diesem Gerät. Für den Umzug braucht es einen Code: Dieses Smartphone veröffentlicht sie, das neue Smartphone liest sie ein, und dieses Smartphone hört auf. + Melde dich zuerst auf dem neuen Smartphone mit demselben Konto an. Umgezogen werden deine Gruppen, niemals dein Schlüssel. + Übergabe starten + Wird veröffentlicht… + Scanne dies auf dem neuen Smartphone + Der Code ist nur ein Verweis. Wer ihn fotografiert, erfährt nichts — das, worauf er verweist, ist für dich verschlüsselt. + Dieses Gerät hat seine Gruppen übergeben + Es sendet und empfängt nicht mehr, denn wenn zwei Smartphones aus derselben Gruppe senden, geht sie für alle darin kaputt. Deine Gruppen sind noch auf diesem Gerät, und nichts wurde gelöscht. + Dieses Gerät zurückholen + Verwende dies, wenn der Umzug nicht abgeschlossen wurde. Nur, wenn das neue Smartphone noch nicht mit dem Senden begonnen hat. + Von einem anderen Smartphone empfangen + Code scannen + oder einfügen + Gruppen hierher holen + Wird abgerufen… + Dies ersetzt alle cordn-Gruppen, die bereits auf diesem Smartphone sind. Sie können nicht zusammengeführt werden. + + %1$d Gruppe umgezogen + %1$d Gruppen umgezogen + + Auf diesem Gerät gibt es keine cordn-Gruppen zum Umziehen. + Lege zuerst einen Medienserver fest — die verschlüsselten Dokumente brauchen einen Ablageort, während das andere Smartphone sie abruft. + Was dieses Gerät verlässt + Dein Gruppenzustand wird verschlüsselt und auf deinen Medienserver hochgeladen, damit das andere Smartphone ihn abrufen kann. Für diesen Server ist er nicht lesbar, er sieht nur eine Größe und einen Zeitpunkt. Lösche die Blobs danach, wenn nichts zurückbleiben soll. + 3D-Objekt + %1$d Eckpunkte · %2$d Flächen + Dieses 3D-Objekt konnte nicht gelesen werden (Regel %1$s) + Cyberspace-Avatar + Dieser Avatar hat nicht für seine Größe bezahlt und wird daher nicht gezeichnet + Beleuchtet; tippen, um das Objekt flach zu zeichnen + Flach; tippen, um das Objekt zu beleuchten + 1 Einheit = %1$s + Versteckt im Dataspace · %1$s + Versteckt im Ideaspace · %1$s + Standard-Avatar + Keine Form veröffentlicht, daher sehen alle diesen hier + An einem Ort versteckt + Versteckt in einem Bereich von %1$s Regionen + Versteckt in einer Region, die der Hinweis genau benennt + Kein Hinweis, das könnte also überall im Cyberspace sein + Außer Reichweite: Der Hinweis nennt 2^%1$d zu durchsuchende Regionen + Danach suchen + Stopp + Suchaufwand auf diesem Gerät wird ermittelt… + %1$s von %2$s Regionen durchsucht + + Außer Reichweite: etwa %1$d Minute Suche auf diesem Gerät + Außer Reichweite: etwa %1$d Minuten Suche auf diesem Gerät + + + Außer Reichweite: etwa %1$d Stunde Suche auf diesem Gerät + Außer Reichweite: etwa %1$d Stunden Suche auf diesem Gerät + + Nicht in dem Bereich, den der Hinweis nennt + Region gefunden, aber der Inhalt konnte nicht gelesen werden + + %1$d hier verstecktes Objekt passte nicht zu seiner Signatur und wurde verworfen + %1$d hier versteckte Objekte passten nicht zu ihren Signaturen und wurden verworfen + + Geöffnet, aber es war nichts drin + Unsigniert, dieser Autor ist also nur eine Behauptung + Ein Objekt vom Typ %1$d, den dieser Client nicht darstellt + + %1$d Byte an Daten, die dieser Client nicht lesen kann + %1$d Bytes an Daten, die dieser Client nicht lesen kann + + + Schließen + Link kopieren + Suchen + Textgröße + Desktop + Zum Startbildschirm + Anderer Browser + Vollbild + Adresse bearbeiten + Zurück + Vorwärts + Neu laden + Laden stoppen + Zu Favoriten hinzufügen + Aus Favoriten entfernen + Teilen + Link kopieren + Auf Seite suchen + Textgröße + Zum Startbildschirm hinzufügen + Desktop-Version + Im Browser öffnen + In %1$s öffnen + Vollbild + Du hast %1$s verlassen + Zurück zur App + Kleinerer Text + Größerer Text + Zurücksetzen + %1$d% + Privatsphäre + Onion-Routing + Die Website kann deine IP-Adresse nicht sehen + Die Website kann deine IP-Adresse sehen + Website-Einstellungen + Noch nichts erlaubt + Worauf sie zugreifen kann + Deine Schlüssel verlassen Amethyst nie + Jedes Signieren, Veröffentlichen, Hochladen oder Bezahlen braucht deine Zustimmung + Kein besonderer Zugriff + Sie läuft in einer Sandbox und kann nicht in deinem Konto handeln + Berechtigungen verwalten + nSite · Sandbox + nApplet · Sandbox + Konsole + Sichere Verbindung + Nicht sicher + Über Onion-Routing + App in Sandbox + Kamera + Mikrofon + Standort + Fragen + Erlauben + Blockieren + %1$s %2$s + erlaubt + blockiert + Suchen oder Adresse eingeben + Öffnen + Löschen + Einfügen und öffnen + Diese Adresse verwenden + Auf Seite suchen + %1$d / %2$d + Keine Treffer + Vorheriger Treffer + Nächster Treffer + Suche auf Seite schließen + Alle + Fehler + Warnungen + Kopieren + Löschen + Noch nichts protokolliert + Diese Website möchte Folgendes verwenden + Sehen, was deine Kamera sieht + Hören, was dein Mikrofon hört + Ungefähr wissen, wo du bist + Anrufe können deine IP-Adresse auch über Tor preisgeben. + Während des Besuchs erlauben + Nur dieses Mal + Nicht erlauben + %1$s meldet + Diese Seite meldet + Diese Seite keine weiteren Dialoge anzeigen lassen + Deine Antwort + Website verlassen? + Vorgenommene Änderungen werden möglicherweise nicht gespeichert. + Verlassen + OK + Abbrechen + Verbindung + Verbindung ist verschlüsselt + Was du sendest, kann unterwegs nicht mitgelesen werden. + Verbindung ist nicht verschlüsselt + Gib keine Passwörter oder Zahlungsdaten ein. + Über Tor per Onion-Routing + Offenes Web + Zertifikat + Ausgestellt für %1$s von %2$s · gültig bis %3$s + Berechtigungen + Cookies und Websitedaten + Anmeldungen und Einstellungen, die diese Website für dieses Konto gespeichert hat + Websitedaten löschen + Von dieser Website abmelden und ihre Daten löschen? + %1$s erneut blockieren + %1$s behalten + %1$s erneut beitreten + %1$s erneut stummschalten + %1$s wiederherstellen + Feeds wiederherstellen + Orte wiederherstellen + Profil wiederherstellen + Anbieter wiederherstellen + Relays wiederherstellen + Themen wiederherstellen + Wallet wiederherstellen + Übernehmen + + %1$s und %2$d hinzugefügt + %1$s und %2$d hinzugefügt + + + %1$s und %2$d neu blockiert + %1$s und %2$d neu blockiert + + + %1$s und folgst %2$d neuen Person + %1$s und folgst %2$d neuen Personen + + + %1$s und bist %2$d neuen beigetreten + %1$s und bist %2$d neuen beigetreten + + + %1$s und %2$d neu stummgeschaltet + %1$s und %2$d neu stummgeschaltet + + Deine synchronisierten Amethyst-Einstellungen wurden in einer anderen App als Amethyst geändert. Das kann Probleme verursachen. + Du hast deine Concord-Liste geleert + Du hast deine Concord-Liste geändert + + Du hast %1$d DM-Relay entfernt + Du hast %1$d DM-Relays entfernt + + + Du hast %1$d Lieblings-Feed entfernt + Du hast %1$d Lieblings-Feeds entfernt + + + Du folgst %1$d Person nicht mehr + Du folgst %1$d Personen nicht mehr + + + Du hast %1$d gefolgten Hashtag entfernt + Du hast %1$d gefolgte Hashtags entfernt + + + Du hast %1$d Indexer-Relay entfernt + Du hast %1$d Indexer-Relays entfernt + + + Du hast %1$d Relay für Gruppenchat-Schlüssel entfernt + Du hast %1$d Relays für Gruppenchat-Schlüssel entfernt + + + Du hast %1$d öffentlichen Chat verlassen + Du hast %1$d öffentliche Chats verlassen + + + Du hast %1$d Community verlassen + Du hast %1$d Communities verlassen + + + Du hast %1$d Gruppe verlassen + Du hast %1$d Gruppen verlassen + + + Du hast %1$d Chatraum verlassen + Du hast %1$d Chaträume verlassen + + + Du hast die Stummschaltung für %1$d Eintrag aufgehoben + Du hast die Stummschaltung für %1$d Einträge aufgehoben + + + Du hast %1$d öffentliches Relay entfernt + Du hast %1$d öffentliche Relays entfernt + + Du hast deinen Nutzap-Schlüssel entfernt + Du hast deinen Nutzap-Schlüssel ersetzt + + Du hast %1$d Nutzap-Mint entfernt + Du hast %1$d Nutzap-Mints entfernt + + + Du hast %1$d BOLT12-Angebot entfernt + Du hast %1$d BOLT12-Angebote entfernt + + + Du hast %1$d Zahlungsweg entfernt + Du hast %1$d Zahlungswege entfernt + + + Du hast %1$d gefolgten Ort entfernt + Du hast %1$d gefolgte Orte entfernt + + + Du hast %1$d privates Relay entfernt + Du hast %1$d private Relays entfernt + + + Du hast %1$d Profilfeld entfernt + Du hast %1$d Profilfelder entfernt + + + Du hast %1$d Relay-Feed entfernt + Du hast %1$d Relay-Feeds entfernt + + + Du hast %1$d Such-Relay entfernt + Du hast %1$d Such-Relays entfernt + + + Du hast den Anbieter von %1$d Vertrauensdienst geändert + Du hast den Anbieter von %1$d Vertrauensdiensten geändert + + + Du hast %1$d vertrauenswürdiges Relay entfernt + Du hast %1$d vertrauenswürdige Relays entfernt + + + Du hast %1$d Relay entsperrt + Du hast %1$d Relays entsperrt + + Du hast deine Cashu-Wallet geleert + Du hast deine Cashu-Wallet geändert + Hinzugefügt (%1$s) + Geändert (%1$s) + %1$s hinzugefügt + %1$s geändert + %1$s entfernt + Neue Version verwenden + Du hast private (verschlüsselte) Einträge hinzugefügt. + Du hast auch private (verschlüsselte) Einträge geändert. Sie können hier nicht verglichen werden. + Du hast alle privaten (verschlüsselten) Einträge entfernt. + nur lesen + lesen und schreiben + nur schreiben + Entfernt (%1$s) + Gespeicherte Version wiederherstellen + %1$s in einer anderen App geändert + Feeds + Chaträume + Communities + Hashtags + Verknüpfte Identitäten + Orte + Mints + Nutzap-Schlüssel + Angebote + Andere Einträge + Zahlungsadressen + Personen + Profilfelder + Öffentliche Chats + Relays + Gruppen + Threads + Vertrauensanbieter + Wörter + Über mich + Banner + Geburtstag + Bot-Kennzeichnung + CLINK-Angebot + Anzeigename + LNURL + Lightning-Adresse + Benutzername + Nostr-Adresse + Bild + Pronomen + Website + Erlaubt + In einer anderen App geändert · %1$s + Deine Concord-Communities sind für dich verschlüsselt und können daher hier nicht verglichen werden. Beim Wiederherstellen wird genau das zurückgesetzt, was dieses Gerät gespeichert hat. + Verschoben + %1$s entfernt + Entfernt + Von dir erstellt + Von dir geändert + Von dir geleert + Feed + Weg + Hashtags, denen du folgst + Inbox + wo andere dich erreichen + beigetreten + behalten + %1$s behalten + Empfangsschlüssel entfernt + Empfangsschlüssel ersetzt + Nutzaps werden an diesen neuen Schlüssel gebunden. Wenn dieses Gerät ihn nicht hat, kannst du sie hier möglicherweise nicht einlösen. + verlassen + Verlassen + Gelistet + Verschoben + %1$s und %2$s weitere + Neue Version + %1$s neu + neu + Neu + Neu blockiert + %1$s neu stummgeschaltet + Nicht mehr blockiert + Nicht festgelegt + Hier ist nichts + BOLT12-Angebot + + %1$d Angebot entfernt + %1$d Angebote entfernt + + Outbox + wo du veröffentlichst + + %1$d Weg, dich zu bezahlen, entfernt + %1$d Wege, dich zu bezahlen, entfernt + + Wer dich bezahlt, sieht nur, was in dieser Liste steht. + Orte entfernt + Orte, denen du folgst + Sie sind jetzt verschlüsselt — vermutlich sind die öffentlichen Einträge oben dorthin gewandert. + Du hast Einträge privat gemacht + Sie sind verschlüsselt und können daher hier nicht verglichen werden. + Du hast private Einträge geändert + Sie sind verschlüsselt, daher kannst nur du sehen, was sie waren. Beim Wiederherstellen kommen alle zurück. + Du hast alle privaten Einträge entfernt + Empfang + umbenannt + Umbenannt + Auf diesem Gerät + + %1$s Person durchsuchen + %1$s Personen durchsuchen + + Suche + Dienst + Follower + Rang + Themen + + %1$s von %2$s Dienst geändert + %1$s von %2$s Diensten geändert + + Sie kommen jetzt von jemand anderem oder von niemandem + Weiterhin blockiert + Speicherung + Entfernt · %1$s + Bearbeitet · %1$s + Neu · %1$s + %1$s geleert + %1$s aktualisiert + Themen entfernt + Ränge, Follower-Zahlen und Spamfilter, die du siehst, stammen von diesen Anbietern. + Vertrauenswürdig + %1$s entsperrt + Amethyst verbindet sich wieder mit ihnen + Einheiten + %1$s nicht mehr stummgeschaltet + Diese können wieder in deinen Feeds erscheinen + Nicht vertrauenswürdig + Die Mints und Schlüssel deiner Wallet sind für dich verschlüsselt und können daher hier nicht einzeln verglichen werden. Beim Wiederherstellen wird genau das zurückgesetzt, was dieses Gerät gespeichert hat. + hieß „%1$s“ + Wörter & Hashtags + Synchronisierte App-Einstellungen + Amethyst-Einstellungen, die zwischen deinen Geräten synchronisiert werden. Sie sind verschlüsselt, daher kann nur ihr Vorhandensein verglichen werden. + Liste blockierter Relays + Relays, mit denen sich diese App nie verbindet. + BOLT12-Angebote + Die Lightning-Angebote, mit denen andere dich bezahlen. + Cashu-Wallet + Deine Ecash-Wallet-Einstellungen und Mints. Sie sind verschlüsselt, daher kann nur ihr Vorhandensein verglichen werden. + Community-Liste + Die Communities, denen du beigetreten bist. + Concord-Community-Liste + Die Concord-Communities, denen du beigetreten bist. Sie sind verschlüsselt, daher kann nur ihr Vorhandensein verglichen werden. + DM-Relay-Liste + Wohin andere deine privaten Nachrichten zustellen. + Liste flüchtiger Chats + Die flüchtigen Chaträume, denen du beigetreten bist. + Liste der Lieblings-Feeds + Die algorithmischen Feeds, die du gespeichert hast. + Folgeliste + Bestimmt, wessen Beiträge in deinem Home-Feed erscheinen. + Gefolgte Orte + Orte, deren Beiträge in deinen Feeds erscheinen. + Gefolgte Hashtags + Hashtags, deren Beiträge in deinen Feeds erscheinen. + Indexer-Relay-Liste + Die Relays, über die Profile und Relay-Listen anderer Personen gefunden werden. + Relays für Gruppenchat-Schlüssel + Wo andere die Schlüssel finden, um dich zu verschlüsselten Gruppenchats hinzuzufügen. + Stummschaltliste + Blendet Personen, Wörter, Hashtags und Threads überall aus, wo du etwas siehst. + Nutzap-Empfangseinstellungen + Die Mints und der Schlüssel, mit denen andere dir Nutzaps senden. + Liste + Eine auf diesem Gerät gespeicherte Liste. + Öffentliche Relay-Liste + Teilt allen mit, wo deine Beiträge zu finden sind und wohin Antworten und Erwähnungen an dich gesendet werden sollen. + Zahlungsadressen + Die Wege, auf denen andere dich bezahlen können. + Private Relay-Liste + Wo deine Entwürfe und privaten Daten gespeichert werden. + Profil + Dein Name, Bild, Bio und deine Zahlungsadressen, so wie alle sie sehen. + Liste öffentlicher Chats + Die öffentlichen Chats, denen du beigetreten bist. + Lieblings-Relay-Feeds + Die Relays, die du als Feeds durchstöberst. + Gruppenliste + Die Relay-basierten Gruppen, denen du beigetreten bist. + Such-Relay-Liste + Die Relays, die bei deiner Suche verwendet werden. + Liste der Vertrauensanbieter + Die Dienste, denen du vertraust, Personen für dich zu bewerten und zu verifizieren. + Liste vertrauenswürdiger Relays + Relays, denen du vertraust, sodass ohne Nachfrage eine Verbindung aufgebaut wird. + Löschen + Bearbeiten + Deine Nachricht wird bearbeitet + Zur Nachricht + Anheften + Antworten + Loslösen + Diese Änderung konnte nicht vorgenommen werden. + Der Koordinator hat nicht geantwortet, daher wurde nichts geändert. Versuche es gleich noch einmal. + %1$s hat kein KeyPackage bei diesem Koordinator veröffentlicht und kann daher noch nicht hinzugefügt werden. Bitte die Person, cordn zuerst auf diesem Koordinator zu öffnen. + Du kannst dich nicht selbst aus einer cordn-Gruppe entfernen. + %1$s konnte kein Zugang zur Gruppe gegeben werden, daher wurde das Hinzufügen abgebrochen. + %1$s ist nicht in dieser Gruppe. + Diese Person + Dieser Koordinator hat ein KeyPackage geliefert, das jemand anderem gehört, daher wurde %1$s nicht hinzugefügt. Es wurde nichts geändert. + Deine Gruppen-Verschlüsselungsschlüssel, deine KeyPackages und jede Nachricht in diesen Gruppen. Wer die Datei öffnet, kann die Unterhaltungen lesen. Sobald sie Amethyst verlässt, schützt sie nur noch die Passphrase. + Was in der Datei steckt + Dein nsec kann cordn-Gruppen nicht zurückholen. Eine cordn-Gruppe existiert als Verschlüsselungszustand auf diesem Gerät und als geordneter Datenstrom auf einem Koordinator, der ihn nicht lesen kann — verlierst du das Gerät ohne Backup, ist die Gruppe weg, samt allem, was darin schon gesagt wurde. + Exportieren + Backup gespeichert. + Das hat nicht funktioniert. Prüfe die Passphrase und die Datei. + Passphrase + Wiederherstellen + Beim Wiederherstellen werden die cordn-Gruppen auf diesem Gerät durch die aus der Datei ersetzt. Das ist für ein Smartphone gedacht, das ein anderes abgelöst hat — nicht, um dieselben Gruppen gleichzeitig auf zwei Geräten zu nutzen. + Jede cordn-Gruppe, die jetzt auf diesem Gerät ist, wird entfernt und durch die aus der Datei ersetzt.\n\nStelle nicht auf einem zweiten Smartphone wieder her, während das erste noch genutzt wird. Beide hätten dieselben Gruppenschlüssel, und sobald beide eine Nachricht gesendet haben, geht die Gruppe für alle kaputt — unbemerkt und ohne Weg zurück. + Die cordn-Gruppen dieses Geräts ersetzen? + Wiederherstellen + Wiederhergestellt. + Alles, was hier gesendet wird, ist für diese Gruppe verschlüsselt. Der Koordinator leitet es weiter, ohne es lesen zu können. + Noch keine Nachrichten + Neue Nachrichten + Gestern + Nachricht + Hinzufügen + Dieser Koordinator konnte nicht geöffnet werden. + npub des Koordinators kopieren + Nach Koordinatoren suchen + Hinzufügen + Liest Ankündigungen, die deine Relays ohnehin führen. Kein Koordinator wird kontaktiert, daher erfährt keiner, dass du gesucht hast. + Ankündigungen konnten nicht gelesen werden + Auf deinen Relays kündigt sich niemand an. + Vor %1$s angekündigt + Zuletzt angekündigt %1$s + + Nichts gefunden, und %1$d deiner Relays hat nicht geantwortet. + Nichts gefunden, und %1$d deiner Relays haben nicht geantwortet. + + Ein Koordinator legt die Reihenfolge der Nachrichten einer Gruppe fest und ist der Einzige, der das kann. Geht er verloren, ist die Reihenfolge verloren, und ein zweiter spiegelt den ersten nicht — daher sind das benannte Dienste, die du auswählst, keine austauschbaren Relays. + + Antwortet nicht — %1$d Anfrage in Folge ist fehlgeschlagen. Gruppen darauf werden nicht synchronisiert. + Antwortet nicht — %1$d Anfragen in Folge sind fehlgeschlagen. Gruppen darauf werden nicht synchronisiert. + + Antwortet. + Eine Anfrage ist fehlgeschlagen; neuer Versuch läuft. + Noch nichts angefragt. + Die ausblenden, die sich nicht mehr ankündigen + Fragen, wer er ist + Koordinator-Schlüssel + Ein Name dafür (deiner, optional) + Dieser Name gehört dir und bleibt auf diesem Gerät. Ein Koordinator kann keinen Namen beweisen, daher wird er nie nach einem gefragt. + Weitere Aktionen + Noch keine Koordinatoren. + Löschen + Beim Entfernen bleiben die Gruppen auf diesem Gerät, sodass sie zurückkommen, wenn du den Koordinator wieder hinzufügst. Beim Löschen werden sie vernichtet: Die Gruppenschlüssel, die Lesepositionen und deine KeyPackages verschwinden, und diese Gruppen können nur über eine neue Einladung wieder betreten werden.\n\nDer Koordinator wird nicht benachrichtigt und behält alles, was er bereits hatte. + Diesen Koordinator löschen? + %1$s + Antwortet auf + %1$s +%2$d weitere + Entfernen + Umbenennen + Gibt an: %1$s + Name und Version eines Koordinators sind selbst gewählte Angaben. Nur sein öffentlicher Schlüssel identifiziert ihn. + Hat geantwortet, aber nichts angegeben. + Alle %1$d anzeigen + Weniger anzeigen + + %1$d anzeigen, der sich nicht mehr ankündigt + %1$d anzeigen, die sich nicht mehr ankündigen + + Diese haben sich seit über einem Monat nicht angekündigt. Eine Gruppe auf einem verschwundenen Koordinator zu erstellen, schlägt fehl. + Gruppe erstellen + + Erstellen und %1$d Person einladen + Erstellen und %1$d Personen einladen + + Jemanden hinzufügen + Admin + + %1$d Person kann hinzufügen und entfernen + %1$d Personen können hinzufügen und entfernen + + Nur ich verwalte diese Gruppe + Nur du kannst einladen, Mitglieder entfernen oder die Gruppendetails ändern. Du kannst das später an jemand anderen übergeben. + Koordinator + Ändern + Koordinatoren finden + Fertig + Anderer Koordinator + Öffentlicher Schlüssel des Koordinators (hex oder npub) + Relays, auf denen er antwortet, eines pro Zeile + + Erreicht deine %1$d Person + Erreicht alle %1$d deiner Personen + + Erreicht %1$d von %2$d — die übrigen blieben außen vor + Nicht geprüft — bei Auswahl wird nachgefragt + Beschreibung (optional) + Alle können hinzufügen und entfernen + Alle in der Gruppe können einladen, Mitglieder entfernen und die Details ändern. Jedes Mitglied kann später Admins ernennen, womit das endet. + Eine cordn-Gruppe wird von einem Koordinator deiner Wahl geordnet. Die Gruppe wird auf diesem Gerät erstellt — der Koordinator erfährt erst von ihr, wenn du jemanden einlädst oder eine Nachricht sendest. + Die Gruppe konnte nicht erstellt werden. + Gruppenname + Kein Koordinator ausgewählt + Jede Einladung ist eine Welcome-Nachricht, die beim Koordinator hinterlegt wird, daher können sie einzeln fehlschlagen. Niemand wurde benachrichtigt: Die Eingeladenen sehen sie, wenn sie ihre App das nächste Mal öffnen. + Der Koordinator hat die Einladung abgelehnt + Link senden + Zur Gruppe hinzugefügt, aber die Einladung hat die Person nicht erreicht — versuche es auf dem Gruppenbildschirm erneut + Chat öffnen + Kein Schlüssel hier, daher konnte keine Welcome-Nachricht hinterlegt werden + Die Gruppe existiert + Warte auf die Person + Fertig + Noch niemand hinzugefügt. Eine Gruppe kann leer erstellt und Einladungen später gesendet werden, aber wenn du jetzt Personen nennst, zeigt sich, welcher Koordinator sie erreichen kann. + Noch niemand — tippen, um Personen hinzuzufügen + Wenn du jetzt Personen nennst, erfahren wir, welcher Koordinator sie erreichen kann. Jede erhält eine Welcome-Nachricht auf diesem Koordinator, die sie abholt, wenn sie ihre App das nächste Mal öffnet. + + Erreichbar über %1$d Koordinator + Erreichbar über %1$d Koordinatoren + + Kein Schlüssel auf einem deiner Koordinatoren + Noch nicht geprüft + Wer hinzufügen und entfernen kann + Name + Wer dabei ist + Wo sie liegt + Neue Cordn-Gruppe + + %1$d Person ist über keinen deiner Koordinatoren erreichbar + %1$d Personen sind über keinen deiner Koordinatoren erreichbar + + Du, immer Admin + Alle in der Gruppe sehen diese Nachricht als zurückgezogen, und Amethyst zeigt ihren Text nicht mehr an. Der Koordinator behält die verschlüsselte Kopie, als die sie gesendet wurde, und wer sie schon gelesen hat, hat sie gelesen. + Nachricht zurückziehen + Vom Koordinator angenommen + Verstanden + Was dieser Koordinator sehen kann + Gruppeninfo + Diese Gruppe ist nicht verfügbar. Ihr Koordinator wurde möglicherweise entfernt. + Füge in den Einstellungen einen Koordinator hinzu, um cordn-Gruppen zu nutzen. + + %1$d Gruppe + %1$d Gruppen + + Aus diesen Gruppen kommt nichts an. Amethyst versucht es weiter. + Koordinatoren + Noch keine cordn-Gruppen + Eine cordn-Gruppe liegt auf einem Koordinator, der ihre Mitgliedschaft verwaltet und Nachrichten weitergibt, ohne je zu sehen, was jemand schreibt. + Eine starten + Jemanden hinzufügen + Niemand mit diesem Namen gefunden. + Personen können nur hinzugefügt werden, wenn sie ein KeyPackage bei diesem Koordinator veröffentlicht haben. + Name, npub oder name@domain + Admin + + Der %1$d Admin der Gruppe bleibt unverändert. + Die %1$d Admins der Gruppe bleiben unverändert. + + Koordinator + Koordinator-Schlüssel + Koordinator-Link + nprofile des Koordinators kopieren + Details bearbeiten + Diese Gruppe hat keine Admins: Alle können dauerhaft hinzufügen, entfernen und umbenennen. + Epoche + Gruppen-ID + Kann über diesen Koordinator hinzugefügt werden + Mitglieder + %1$s erhält von hier keine Nachrichten mehr. Bereits Gelesenes bleibt erhalten, und das lässt sich nicht rückgängig machen — die Person müsste erneut eingeladen werden. + Aus der Gruppe entfernen? + Entfernen + Speichern + Technische Details + Beitreten + Ablehnen + Ablehnen ist endgültig. Um wieder hineinzukommen, musst du erneut eingeladen werden. + Wird nur geprüft, wenn du diesen Bildschirm öffnest, und sonst nie — einen Koordinator zu fragen, ob dich jemand eingeladen hat, verrät ihm, dass du da bist, daher tut Amethyst das nicht im Hintergrund. + Einladungen konnten nicht gelesen werden. + + %1$d Person ist bereits in dieser Gruppe + %1$d Personen sind bereits in dieser Gruppe + + +%1$d weitere + Du hast keinen Koordinator geöffnet. cordn-Einladungen kommen über einen Koordinator an, daher gibt es noch nirgends etwas nachzusehen. + Keine wartenden Einladungen. + Erneut prüfen + Eine Einladung wurde für ein anderes Gerät hinterlegt + Cordn-Einladungen + %1$s hat nicht geantwortet + Über %1$s + Beim Veröffentlichen wird ein Eintrag mit deinem eigenen Kontoschlüssel signiert. Dieser Koordinator weiß dann, dass dieses Konto existiert und eingeladen werden kann — dauerhaft, und unabhängig davon, ob dich jemand einlädt. + Andere können dich nur zu einer cordn-Gruppe hinzufügen, indem sie ein KeyPackage verwenden, das du bei diesem Koordinator veröffentlicht hast. cordn hat keinen anderen Ort dafür, also kann dich ohne veröffentlichtes KeyPackage niemand einladen — und nichts sagt ihnen, warum. + Die KeyPackages konnten nicht gelesen werden. + Kein Last-Resort-Paket. Sobald die Einmal-Pakete aufgebraucht sind, schlagen Einladungen fehl. + Ein Last-Resort-Paket ist veröffentlicht, daher sind Einladungen auch dann noch möglich, wenn die Einmal-Pakete aufgebraucht sind. + + %1$d Paket, das dieses Gerät nicht öffnen kann + %1$d Pakete, die dieses Gerät nicht öffnen kann + + Der Koordinator gibt diese an jeden weiter, der dich einlädt, aber die private Hälfte ist nicht auf diesem Gerät — sie gehört zu einer anderen Installation. Gibt es diese Installation nicht mehr, erzeugt eine Einladung mit einem dieser Pakete eine Welcome-Nachricht, die niemand je öffnen kann. + Eines veröffentlichen + Last-Resort veröffentlichen + + %1$d Einmal-Paket verfügbar. + %1$d Einmal-Pakete verfügbar. + + Sobald du hier veröffentlicht hast, ersetzt Amethyst verbrauchte Pakete unauffällig. Das erste veröffentlicht es nie für dich. + Alle zurückziehen + Diese zurückziehen + Beitritt zu dieser Gruppe anfragen + Dies veröffentlicht ein KeyPackage unter deinem eigenen Kontoschlüssel und teilt dem Koordinator mit, dass du in diese Gruppe möchtest — unabhängig davon, ob jemand antwortet. + Beitrittsanfrage fehlgeschlagen. + Angefragt. Ein Mitglied der Gruppe muss dich hinzufügen; die Einladung erscheint unter cordn-Einladungen. + Scannen + Diese Datei konnte nicht geöffnet werden. + Für dieses Konto ist kein Medienserver festgelegt, daher gibt es keinen Ablageort für die Datei. Wähle einen in den Einstellungen. + Diese Datei konnte nicht gelesen werden. + Diese Datei konnte nicht gesendet werden. + + %1$d Mitglied + %1$d Mitglieder + + Nachricht gelöscht + Koordinator + Cursor + Gesendet + Nachrichtendetails + bearbeitet + Angeheftet von %1$s + + %1$d angeheftete Nachricht in dieser Gruppe + %1$d angeheftete Nachrichten in dieser Gruppe + + Nächste angeheftete Nachricht + Vorherige angeheftete Nachricht + Alle angehefteten Nachrichten anzeigen + Angeheftete Nachrichten + Reaktionen + Hinzufügen + Nur ein Admin kann annehmen. In einer Gruppe ohne Admins sind das alle. + Nach Anfragen suchen + Verwerfen + Die Anfragen konnten nicht gelesen werden. + Niemand wartet auf den Beitritt. + Beitrittsanfragen + Senden + Das wurde nicht gesendet. + Der Koordinator dieser Gruppe ist nicht geöffnet, daher kann noch nichts gesendet werden. + Kopiert + Link kopieren + Jeder mit diesem Link kann den Beitritt anfragen. Ein Admin muss ihn trotzdem noch hereinlassen. + Diese Gruppe teilen + Sprachnachricht abspielen + Sprachnachricht aufnehmen + Stoppen und senden diff --git a/commonsUI/src/commonMain/composeResources/values-el-rGR/strings.xml b/commonsUI/src/commonMain/composeResources/values-el-rGR/strings.xml index da00ce35f8..16c37e259b 100644 --- a/commonsUI/src/commonMain/composeResources/values-el-rGR/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-el-rGR/strings.xml @@ -2897,4 +2897,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-en-rGB/strings.xml b/commonsUI/src/commonMain/composeResources/values-en-rGB/strings.xml index 44a5f2359e..fa8183a377 100644 --- a/commonsUI/src/commonMain/composeResources/values-en-rGB/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-en-rGB/strings.xml @@ -34,4 +34,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-eo-rUY/strings.xml b/commonsUI/src/commonMain/composeResources/values-eo-rUY/strings.xml index 2821f7477d..41f7ad82ec 100644 --- a/commonsUI/src/commonMain/composeResources/values-eo-rUY/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-eo-rUY/strings.xml @@ -2953,4 +2953,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-es-rES/strings.xml b/commonsUI/src/commonMain/composeResources/values-es-rES/strings.xml index 5920e982b2..22de7cb7f9 100644 --- a/commonsUI/src/commonMain/composeResources/values-es-rES/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-es-rES/strings.xml @@ -2969,4 +2969,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-es-rMX/strings.xml b/commonsUI/src/commonMain/composeResources/values-es-rMX/strings.xml index 99abf701a4..72e983759b 100644 --- a/commonsUI/src/commonMain/composeResources/values-es-rMX/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-es-rMX/strings.xml @@ -2962,4 +2962,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-es-rUS/strings.xml b/commonsUI/src/commonMain/composeResources/values-es-rUS/strings.xml index 0164f64833..324e61dcb2 100644 --- a/commonsUI/src/commonMain/composeResources/values-es-rUS/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-es-rUS/strings.xml @@ -2962,4 +2962,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-fa-rIR/strings.xml b/commonsUI/src/commonMain/composeResources/values-fa-rIR/strings.xml index 6e91f77cb2..3077ca6903 100644 --- a/commonsUI/src/commonMain/composeResources/values-fa-rIR/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-fa-rIR/strings.xml @@ -2963,4 +2963,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-fi-rFI/strings.xml b/commonsUI/src/commonMain/composeResources/values-fi-rFI/strings.xml index 8fa0159e06..f7927b5a97 100644 --- a/commonsUI/src/commonMain/composeResources/values-fi-rFI/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-fi-rFI/strings.xml @@ -2929,4 +2929,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-fr-rCA/strings.xml b/commonsUI/src/commonMain/composeResources/values-fr-rCA/strings.xml index 24f89c5730..8feba34b61 100644 --- a/commonsUI/src/commonMain/composeResources/values-fr-rCA/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-fr-rCA/strings.xml @@ -2853,4 +2853,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-fr-rFR/strings.xml b/commonsUI/src/commonMain/composeResources/values-fr-rFR/strings.xml index a30d5ff798..7ffcdad0ac 100644 --- a/commonsUI/src/commonMain/composeResources/values-fr-rFR/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-fr-rFR/strings.xml @@ -3146,4 +3146,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-hi-rIN/strings.xml b/commonsUI/src/commonMain/composeResources/values-hi-rIN/strings.xml index f93d207d1e..fec318ad99 100644 --- a/commonsUI/src/commonMain/composeResources/values-hi-rIN/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-hi-rIN/strings.xml @@ -206,7 +206,10 @@ नई खोज… आपने कोई खोज नहीं की अब तक। पहले से इस खोज में लगे - %1$d कोष यहाँ + + %1$d कोष यहाँ + %1$d कोष यहाँ + इस चित्र को हटाएँ इस कोष को संगृहीत कर दिया गया। यह अब खेल में नहीं है। सर्वप्रथम खोज का कथन %1$s द्वारा @@ -265,7 +268,6 @@ मुझ पर मध्यीकरण मानचित्र पर दीर्घ दबाएँ वहाँ एक कोष छिपाने के लिए खोलें - %1$d कोष कहाँ क्या अतिरिक्त @@ -293,7 +295,10 @@ कोष कहाँ छिपाया जाए चयन करें। %2$d में से %1$d प्राप्त खोज आरम्भ करें - %1$d कोष + + %1$d कोष + %1$d कोष + शीर्षक विवरण ध्वज चित्र @@ -342,7 +347,10 @@ उस चित्र में से कोई क्यूआर॰ चित्र अक्षरराशि प्राप्त नहीं टाँकाफलक में कुछ भी नहीं परखने के लिए अक्षरराशि का चयन करें - %2$s में से %1$s भाग प्राप्त। आगे बढें + + %2$s में से %1$s भाग प्राप्त। आगे बढें + %2$s में से %1$s भाग प्राप्त। आगे बढें + विस्तारण पुनःस्थापना अमेथिस्ट इस अक्षरराशि को नहीं खोल सकता इस अक्षरराशि में एक निजी कुंचिका अथवा जोडनेवाला रहस्य है। इसलिए इसकी विषयवस्तु यहाँ दिखाया नहीं जाता। अनुकूल पटल का उपयोग करें। @@ -1850,7 +1858,7 @@ मध्यम उच्च असंकुचित - यह अभिलेख प्रारूप परितथ्य हटाने का अवलम्बन नहीं करता। निजी जानकारी जैसे स्थान तथा यन्त्र विवरण समाविष्ट हो सकते हैं। क्या तो भी आरोहण करें। + यह अभिलेख प्रारूप उपतथ्य हटाने का अवलम्बन नहीं करता। निजी जानकारी जैसे स्थान तथा यन्त्र विवरण समाविष्ट हो सकते हैं। क्या तो भी आरोहण करें। तो भी आरोहण करें पाण्डुलिपि सम्पादन क्यूआर॰ चित्र अक्षरराशि के साथ प्रवेशांकन करें @@ -2877,6 +2885,7 @@ आप इस समुदाय के विश्वासजाल आवश्यकताओं को पार नहीं कर सके। समुदाय का नवीनतम नियम अभिलेख पुराना होने के कारण अस्वीकृत। मार्मोट॰ समूह + कोर्डन समूह समूह बनाएँ मार्मोट॰ समूह बनाएँ एक नया एमएलएस॰ समूह बनेगा। आप सदस्य जोड सकते हैं तत्पश्चात। @@ -3236,7 +3245,7 @@ जालपता के पूर्वीक्षण दिखाएँ स्वतःचालन चलचित्र स्वतः चालू करें चलचित्रों को जब पटल पर दिखाई दें - एविफ॰ से परितथ्य नहीं मिटा सके : %1$s + एविफ॰ से उपतथ्य नहीं मिटा सके। %1$s पदक पुरस्कार पीछे चलें कुंचिकाएँ सुरक्षित रखें @@ -4106,8 +4115,8 @@ आरोहण असफल विषय सन्देश - परितथ्य हटाने में असफल - श्रव्यदृश्याभिलेख से निजी परितथ्य हटाने में असफल। आरोहण निरस्त। + उपतथ्य हटाने में असफल + श्रव्यदृश्याभिलेख से निजी उपतथ्य हटाने में असफल। आरोहण निरस्त। स्मर्त्तव्यचिह्न सफलतापूर्वक स्थानान्तरित किए गए लैटनिंग स्थापना अनुपलब्ध अधिक विकल्प @@ -5041,8 +5050,8 @@ कचरालेख प्रेषक दो सूचना पृष्ठसूचक दिखाएँ। अनुचरित (लोग जिनका आप अनुचरण करते हैं) तथा सभी। अपठित संकेतक चमकता है केवल आपके द्वारा अनुचरित लोगों के गतिविधियों के लिए। सूचनाएँ विभाजित करें अनुचरित के अनुसार - निजी परितथ्य हटाने का प्रयास करता है आलम्बित श्रव्यदृश्याभिलेखों से आरोहण पूर्व - निजी परितथ्य हटाएँ + निजी उपतथ्य हटाने का प्रयास करता है आलम्बित श्रव्यदृश्याभिलेखों से आरोहण पूर्व + निजी उपतथ्य हटाएँ सम्पन्न व्यायाम पढता है स्वास्थ्य संयोजन से (सामसंग स्वास्थ्य तथा गूगिल फिट तथा फिटबिट तथा गार्मिन इत्यादि) तथा पत्र के रूप में बाँटने का सुझाव देता है। अनुमति अनुरोध केवल संयोजन करने पर। व्यायामों का सुझाव बाँटनें के लिए यन्त्रव्यवस्था @@ -5217,9 +5226,36 @@ + समायोजक समूह + समायोजक द्वारा भेजा गया। पुनःप्रसारकों द्वारा नहीं + यह समायोजक क्या देख सकता है + सन्देश विषयवस्तु + समूह में कौन हैं + कौन क्या भेजता है + पठन असाध्य + एक अस्थायी कुंचिका द्वारा + आपकी वास्तविक लेखा से सम्बद्ध + विवरण + समायोजक %1$s + सम्पर्क अब तक किया नहीं + प्रतिवचनमध्य + कोई प्रतिवचन नहीं + cordn1… + निरीक्षण + चिपकाएँ + रिक्त + वह एक कोर्डन समूह योजक नहीं। %1$s + समूह परिचायक + समायोजक + अभिगम्य इनके द्वारा + कोर्डन समूह योजक + कोर्डन समायोजक समूह योजक आमन्त्रण एमएलएस॰ चर्चा उपतथ्य गोपनीयता अनावरण + कोर्डन समायोजक + कोर्डन समायोजक जोडें हटाएँ मिटाएँ स्वास्थ्य सेवासंगणक एमएलएस॰ चर्चा अनुक्रमण + कोर्डन कुंचिका पोटलियाँ पुनःबाधित करें %1$s को रखें %1$s पुनःजुडें %1$s @@ -5493,13 +5541,19 @@ पुनःनामकृत पुनःनामकृत इस यन्त्र पर - %1$s लोग खोजें + + %1$s लोग खोजें + %1$s लोग खोजें + खोज मध्य सेवा अनुचर श्रेणी विषयसूची - %2$s में से %1$s सेवाएँ परिवर्तित + + %2$s में से %1$s सेवाएँ परिवर्तित + %2$s में से %1$s सेवाएँ परिवर्तित + वे अब अन्य व्यक्ति से आते है। अथवा किसी से नहीं अभी भी बाधित अभिलेखन मध्य diff --git a/commonsUI/src/commonMain/composeResources/values-hu-rHU/strings.xml b/commonsUI/src/commonMain/composeResources/values-hu-rHU/strings.xml index bd84deab64..c33e43e167 100644 --- a/commonsUI/src/commonMain/composeResources/values-hu-rHU/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-hu-rHU/strings.xml @@ -17,7 +17,7 @@ Kulcs elrejtése FONTOS: Mentse el a kulcsait! - A titkos kulcs (nsec) olyan, mint egy jelszó, amelyet SOHA nem lehet visszaállítani vagy helyreállítani. Ez az EGYETLEN módja a fiókhoz való hozzáférésnek, és aki birtokolja, az örökre irányítja ezt a fiókot. Ha elveszíti, a fiókja végleg elvész. Soha ne adja tovább és tárolja egy jelszókezelőben. + A titkos kulcs (nsec) olyan, mint egy jelszó, amelyet SOHA nem lehet visszaállítani vagy helyrehozni. Ez az EGYETLEN módja a fiókhoz való hozzáférésnek, és aki birtokolja, az örökre irányítja ezt a fiókot. Ha elveszíti, a fiókja végleg elvész. Soha ne adja tovább és tárolja egy jelszókezelőben. Nyilvános kulcs (megosztható): Titkos kulcs (SOHA ne ossza meg!): Elmentettem a kulcsaimat, folytatás @@ -33,7 +33,7 @@ A titkos kulcs (nsec) egy jelszó, amelyet SOHA nem lehet visszaállítani. Ez az egyetlen alkalom, amikor megjelenik — mentse el most, különben örökre elveszíti a hozzáférését ehhez a fiókhoz. Saját kulcsok Még valami - Tárolja a titkos kulcsát egy jelszókezelőben. Ha elveszíti, akkor senki sem tudja helyreállítani Önnek. + Tárolja a titkos kulcsát egy jelszókezelőben. Ha elveszíti, akkor senki sem tudja helyrehozni Önnek. Ez csak egy olvasásra jogosult fiók. Nem jött létre titkos kulcs, így nincs miről biztonsági mentést készíteni. Kulcsok biztonsági mentése @@ -42,7 +42,7 @@ QR-kód megjelenítése QR-kód elrejtése Titkos kulcs (nsec) - A titkos kulcs egy jelszó, amelyet SOHA nem lehet visszaállítani vagy helyreállítani. Aki ismeri, az örökre irányíthatja ezt a fiókot. Soha ne adja meg senkinek és tárolja egy biztonságos jelszókezelőben. + A titkos kulcs egy jelszó, amelyet SOHA nem lehet visszaállítani vagy helyrehozni. Aki ismeri, az örökre irányíthatja ezt a fiókot. Soha ne adja meg senkinek és tárolja egy biztonságos jelszókezelőben. A titkos kulcs rejtve van Titkos kulcs megjelenítése Titkos kulcs elrejtése @@ -206,7 +206,10 @@ Új vadászat… Még nem hozott létre vadászatot. Már szerepel ebben a vadászatban - %1$d láda van itt + + %1$d láda van itt + %1$d láda van itt + Fénykép eltávolítása Ezt a ládát archiválták. Már nem játszik. Az első megtalálást %1$s szerezte meg @@ -265,7 +268,6 @@ Középre Egy láda elrejtéséhez nyomja meg hossza a térképet Megnyitás - %1$d láda Hol Mi Extrák @@ -293,7 +295,10 @@ Válassza ki, hogy hol van elrejtve a láda. %2$d / %1$d megtalálva Vadászat indítása - %1$d láda + + %1$d láda + %1$d láda + Cím Leírás Borítókép @@ -342,7 +347,10 @@ Nem található QR-kód a képen A vágólapon nincs semmi a beolvasáshoz Érintse meg a beolvasandó kódot - %1$s darabot sikerült beolvasni a(z) %2$s darab közül, folytatás + + %1$s darabot sikerült beolvasni a(z) %2$s darab közül, folytatás + %1$s darabot sikerült beolvasni a(z) %2$s darab közül, folytatás + Nagyítás visszaállítása Az Amethyst nem tudja megnyitni ezt a kódot Ez a kód egy titkos kulcsot vagy párosítási titkot tartalmaz, ezért a tartalma itt nem jelenik meg. Használja azt a képernyőt, ahol meg kell adni. @@ -646,7 +654,7 @@ Az összes új üzenet megjelölése olvasottként Összes megjelölése olvasottként Biztonsági mentés készítése a kulcsokról - A titkos kulcs megadása az egyetlen módja a fiók elérésének. Ha elveszíti, akkor soha nem tudja visszaszerezni. Mentse el biztonságos helyre most. + A titkos kulcs megadása az egyetlen módja a fiók elérésének. Ha elveszíti, akkor soha nem tudja helyrehozni. Mentse el biztonságos helyre most. Biztonsági mentés most Elmentettem a kulcsokat Eltüntetés @@ -1009,7 +1017,7 @@ Bejelentkezve maradás az Amethyst újraindításáig Bejelentkezés elfelejtése Ha szükség lesz rá, a(z) %1$s ismét rákérdez. - Nincs visszaállítva. A „Soha ne jelentkezzen be” be van kapcsolva, ezért az Amethyst nem fog bejelentkezni ide: %1$s. + Nincs helyreállítva. A „Soha ne jelentkezzen be” be van kapcsolva, ezért az Amethyst nem fog bejelentkezni ide: %1$s. Letiltva az Ön tiltólistája alapján Az Amethyst soha nem jelentkezik be a letiltott átjátszókra. Semmi sincs letiltva. Az Ön által blokkolt átjátszókra soha nem fog bejelentkezni, függetlenül attól, hogy mit állít be itt. @@ -1915,8 +1923,8 @@ Beállítás fő pénztárcaként Összegek átmentése a fő pénztárcába %1$s satoshi menthető át - Sikeres átvitel: %1$s satoshi - Nincsenek átvihető összegek + Átmentve: %1$s satoshi + Nincsenek átmenthető összegek Nem sikerült beolvasni ezt a pénztárcát Először állítsa be a fő pénztárcáját, majd mentse át az összegeket a régebbiekből. Saját pénztárca beállítása… @@ -1959,10 +1967,10 @@ Ajánlás törlése Visszavonja az ajánlást? Egy pénzverde ajánlása - Visszaállítás seed-ből + Helyrehozás seed-ből Minden korábbi titok újralevezetése, és minden mint megkérdezése, hogy visszaadja-e a még nyilvántartásban lévő vak aláírásokat. Hasznos eszközvesztés vagy egy megbízhatatlan átjátszó általi token-esemény törlése esetén. Pénzverdék vizsgálata… - Nem található visszaállítható bizonyíték. + Nem található helyreállítható bizonyíték. Nutzapok fogadásának leállítása Vonja vissza a kind:10019 eseményét, hogy mások ne küldhessenek Önnek több nutzapot. Az Ön pénztárcája és egyenlege változatlan marad. Leállítja a nutzapok fogadását? @@ -1970,18 +1978,18 @@ Nutzap-kulcs újraelőállítása Egy teljesen új kulcs előállítása a nutzapok fogadásához. Ritkán van rá szükség - általában csak akkor, ha a jelenlegi kulcsa kiszivárgott. A régi kulcsára már elküldött, de még be nem váltott nutzapok elvesznek. Újraelőállítja a nutzap-kulcsot? - Egy új P2PK kulcs kerül előállításra és közzétételre a kind:10019 és kind:17375 eseményeiben, megtartva a jelenlegi pénzverdéit. A küldők elkezdenek nutzapokat zárolni az új kulcshoz. A régi kulcsára már elküldött, de még be nem váltott nutzapok helyreállíthatatlanná válnak. Erre ritkán van szükség. + Egy új P2PK kulcs kerül előállításra és közzétételre a kind:10019 és kind:17375 eseményeiben, megtartva a jelenlegi pénzverdéit. A küldők elkezdenek nutzapokat zárolni az új kulcshoz. A régi kulcsára már elküldött, de még be nem váltott nutzapok helyrehozhatatlanná válnak. Erre ritkán van szükség. Kulcs újraelőállítása Nutzap-kulcs importálása - Cserélje le a nutzap-kulcsát egy beillesztett kulcsra - például a pénztárca biztonsági mentésből történő visszaállításához. Ritkán van rá szükség. A régi kulcsához zárolt nutzapek a továbbiakban nem lesznek beválthatók. + Cserélje le a nutzap-kulcsát egy beillesztett kulcsra, például a pénztárca biztonsági mentésből történő helyreállításához. Ritkán van rá szükség. A régi kulcsához zárolt nutzapek a továbbiakban nem lesznek beválthatók. Importálja a nutzap-kulcsot? Illessze be a nutzapok fogadásához használandó P2PK privát kulcsot (hex). A kind:10019 és kind:17375 eseményei újra közzé lesznek téve ezzel a kulccsal, megtartva a jelenlegi pénzverdéit. A jelenlegi kulcsához zárolt nutzapok többé nem lesznek beválthatók, kivéve, ha a kulcs megegyezik. Erre ritkán van szükség. P2PK privát kulcs (hex) Kulcs importálása Pénztárca törlése - Távolítsa el a pénztárcát és állítsa le a nutzapokat. A fennmaradó egyenleg helyreállíthatatlanná válhat. + Távolítsa el a pénztárcát és állítsa le a nutzapokat. A fennmaradó egyenleg helyrehozhatatlanná válhat. Törli ezt a pénztárcát? - Ez a művelet a kind:17375 pénztárca és a kind:10019 nutzap-információ törlését kéri. Az ecash-igazolások nem törlődnek a pénzverdékből, de a pénztárca kulcsának eltűnésével a megmaradt egyenleg és a be nem váltott nutzapok helyreállíthatatlanná válhatnak. Győződjön meg arról, hogy először elköltötte vagy áthelyezte a pénzét. Ez a művelet nem vonható vissza. + Ez a művelet a kind:17375 pénztárca és a kind:10019 nutzap-információ törlését kéri. Az ecash-igazolások nem törlődnek a pénzverdékből, de a pénztárca kulcsának eltűnésével a megmaradt egyenleg és a be nem váltott nutzapok helyrehozhatatlanná válhatnak. Győződjön meg arról, hogy először elköltötte vagy áthelyezte a pénzét. Ez a művelet nem vonható vissza. Számla kifizetése Árajánlat kérése Árajánlat kérése a pénzverdétől… @@ -2147,7 +2155,7 @@ Beállítások megjelenítése Húzza a rendezéshez, koppintson az ✕ gombra az eltávolításhoz Eltávolítás - Alapértelmezés visszaállítása + Alapértelmezés helyreállítása Saját oldalsó menü Nyisson meg egy szakaszt, és kapcsolja ki azokat a sorokat, amelyeket soha nem használ. A beállítások mindig láthatók maradnak, így bármikor visszatérhet ide. A szakaszok sorrendje rögzített. Szakaszok @@ -2232,7 +2240,7 @@ %1$s beállította, hogy az üzenetek %2$s után tűnjenek el %1$s kikapcsolta az eltűnő üzeneteket %1$s archiválta ezt a csatornát - %1$s visszaállította ezt a csatornát + %1$s helyreállította ezt a csatornát %1$s létrehozta ezt a csatornát %1$s törölte ezt a csatornát %1$s törölt egy üzenetet @@ -2877,6 +2885,7 @@ Ön nem felel meg a közösség bizalmi hálóra (Web-of-Trust) vonatkozó követelményeinek. A legfrissebb közösségi szabálydokumentum elavultként el lett utasítva. Marmot csoportok + Cordn csoportok Csoport létrehozása Marmot csoport létrehozása Egy új MLS-csoport jön létre. A tagokat később adhatja hozzá. @@ -3408,7 +3417,7 @@ Kifizetsz %1$s satot + legfeljebb %2$s sat díjat? Törlési kérés közzététele a(z) %1$s pénzverdéről szóló kind:38000 ajánlásához. Azok az átjátszók, amelyek tiszteletben tartják a NIP-09-et, el fogják távolítani. - %1$s visszaállíttva %2$s bizonyítékon keresztül. + %1$s helyrehozva %2$s bizonyítékon keresztül. Cashu megkapva %1$s satoshi érkezett a pénztárcájába. (Költség: %2$s satoshi) Nem biztonságos Cashu pénzverde-cím @@ -3517,7 +3526,7 @@ Meghívási hivatkozás visszavonva. Meghívóhivatkozás Közösség elhagyása - Elhagyja a következőt: %1$s? Eltávolításra kerül ezen fiók listájáról, és leáll a szinkronizálása az Ön eszközein. A közösség nem kap értesítést, és Ön nem kerül le a tagok listájáról. Azok az üzenetek, amelyeket már nem tud visszafejteni, helyreállíthatatlanná válhatnak, és csak új meghívóval térhet vissza. + Elhagyja a következőt: %1$s? Eltávolításra kerül ezen fiók listájáról, és leáll a szinkronizálása az Ön eszközein. A közösség nem kap értesítést, és Ön nem kerül le a tagok listájáról. Azok az üzenetek, amelyeket már nem tud visszafejteni, helyrehozhatatlanná válhatnak, és csak új meghívóval térhet vissza. Ön hozta létre ezt a közösséget. A kilépés nem törli, és nem is adja át másnak, de eldobja a listáján tárolt tulajdonosi kulcsot — a jövőben nem fogja tudni kezelni. Elhagyja a közösséget? Kinevezés adminisztrátornak @@ -4237,7 +4246,7 @@ nKisalkalmazások Nem sikerült elküldeni az üzenetet Előadó elnémítása - Ezen előadó visszaállítása + Ezen előadó helyreállítása Elhagyás Nem sikerült a szobát zártként megjelölni. Távozás ettől függetlenül — a szoba automatikusan bezár. @@ -5217,14 +5226,120 @@ + Koordinátor-csoport + Koordinátor kézbesíti, nem az átjátszók + Mit lát ez a koordinátor + A koordinátor egyetlen kiszolgáló, amely ennek a csoportnak minden üzenetét sorrendben továbbítja. Ez másfajta kompromisszum, mint az átjátszóké; érdemes utánaolvasnia, mielőtt úgy kezelné ezt, mint bármely más csevegést. + Üzenetek tartalma + Ki van a csoportban + Ki mit küld + Olvashatatlan + Eldobható kulcs alatt + A valódi fiókjához van kötve + Részletek + %1$s koordinátor + Ez nem ugyanaz a kitettség, mint egy Marmot csoportnál, ahol egyetlen üzemeltető sem birtokolja a teljes beszélgetést. + A csatlakozás mindkét végén valódi fiókokat nevez meg, így a koordinátor tudja, ki van ebben a csoportban. + Egyetlen eldobható kulcs küld és kér le minden üzenetet az itteni csoportjához, így a koordinátor megállapíthatja, hogy mindegyik Ön. + Egyetlen üzemeltető birtokolja minden általa továbbított csoport teljes, sorrendbe rendezett előzményét. + A közzétett kulcscsomag egy aláírt nyilvántartás arról, hogy ez a fiók koordinátort használ, és a koordinátor bárkinek átadhatja. + Az üzenetek nincsenek kitöltve, így a koordinátor mindegyiket látja, hogy milyen hosszúak. + Ez a kliens nem titkosít a koordinátor felé. Ez egy hiba, jelentse minél hamarabb. + Még nem jött létra a kapcsolat + Válaszol + Nem válaszol + Illesszen be egy Önnel megosztott cordn1… hivatkozást, hogy lássa, melyik koordinátor továbbítja azt a csoportot, és mit tudna meg az az üzemeltető Önről, ha csatlakozna. + cordn1… + Vizsgálat + Beillesztés + Törlés + Ez nem egy Cordn csoporthivatkozás: %1$s + Csoportazonosító + Koordinátor + Elérhető ezeken keresztül + Ez a hivatkozás nem nevez meg koordinátort, így önmagában nem követhető. Kérdezze meg a küldőt, melyik koordinátor továbbítja a csoportot. + A hivatkozás vizsgálata nem csatlakozik semmihez, és a birtoklása nem tesz taggá. + Cordn csoporthivatkozás + cordn koordinátor csoporthivatkozás meghívó mls csevegés metaadat adatvédelem kitettség + Cordn koordinátorok + cordn koordinátor hozzáadás eltávolítás tisztítás állapot kiszolgáló mls csevegés sorbarendezés + Cordn kulcscsomagok + cordn kulcscsomag közzététel meghívó végsőmegoldás koordinátor mls + Cordn biztonsági mentés + cordn biztonsági mentés helyreállítás exportálás importálás jelmondat csoportok helyrehozás + Cordn csoportok + Végpontok között titkosított csoportok, amelyeket az Ön által választott koordinátor rendez, nem pedig átjátszók. + %1$s csoport + Még nincsenek üzenetek + Cordn csoport, továbbítja: %1$s + Üzenet törölve + Hangfelvétel + Fénykép + Videó + Fájl + Cordn csoport + Titkosított csoportos csevegés, amelyet az Ön által választott koordinátor rendez. + Koordinált + Azoknak a csapatoknak a legjobb, amelyek a beszélgetés egyetlen megbízható sorrendjét szeretnék. + Cordn csoport létrehozása + Végponttól végpontig titkosított MLS-sel – a koordinátor soha nem olvashat el egyetlen üzenetet sem. + Egy mindenki által elfogadott sorrend, így az előzményeket egy hibás óra sem keverheti össze. + A koordinátor tudja, ki van a csoportban és mikor beszélnek, még ha nem is tudja elolvasni, mit mondanak. + Meghívták egy cordn csoportba? + Meghívók áttekintése + Cordn + Csoportok, amelyeket az Ön által választott koordinátor kézbesít, nem pedig átjátszók. + Csoporthivatkozás vizsgálata + Nézze meg, mire mutat egy cordn1… hivatkozás, mielőtt bármit tenne + Átköltöztetés erről a telefonról + Átköltöztetés egy másik telefonról + Közzétett kulcscsomagok + A hivatkozás + Az Ön által használt koordinátorok + Bemutatkozottak + Hozzáadás kézzel + Jelmondat + Biztonsági mentés készítése + Helyreállítás biztonsági mentésből + A koordinátor + Ez az eszköz + Koordinátorok + A kiszolgálók, amelyek a csoportjait továbbítják + Kulcscsomagok + Ez teszi lehetővé, hogy mások csoportokhoz adhassák Önt + Biztonsági mentés és helyreállítás + Egy jelmondattal titkosított fájl, amelyet Ön őriz + Átköltöztetés másik telefonra + Költöztesse át a csoportjait arra az eszközre, amelyre vált + Átköltöztetés egy másik eszközre + A cordn csoportjai ezen az eszközön élnek. Az átköltöztetéshez egyetlen kód kell: ez az eszköz közzéteszi őket, és a másik eszközön beolvashatja őket, majd ez az eszköz nem tárolja tovább. + Először jelentkezzen be ugyanazzal a fiókkal a másik eszközön. Ez a csoportjait költözteti át, és nem a kulcsát. + Átköltöztetés indítása + Közzététel… + Olvassa be ezt a másik eszközön + A kód csak egy mutató. Aki lefényképezi, semmit sem tud meg, amire mutat, az az Ön fiókjához van titkosítva. + Ez az eszköz átköltöztette a csoportjait + Leállította az átköltöztetést, mert a két eszköz, amely ugyanabból a csoportból küld, mindenki számára tönkretenné az üzenetek fogadását. A csoportjai még mindig ezen az eszközön vannak, és semmi sem törlődött. + Eszköz visszavétele + Ezt akkor használja, ha az átköltöztetés nem fejeződött be. Csak akkor tegye, ha a másik eszközön még nem kezdett el üzeneteket küldeni. + Fogadás egy másik eszközről + Kód beolvasása + vagy illessze be + Csoportok átköltöztetése ide + Lekérés… + Ez lecseréli az eszközön már meglévő cordn csoportokat. Ezek nem olvaszthatók egybe. + Nincsenek átköltöztethető cordn csoportok ezen az eszközön. + Először állítson be médiakiszolgálót, a titkosított dokumentumoknak valahol lenniük kell, amíg a másik telefon le nem kéri őket. + Mi hagyja el ezt az eszközt + A csoport állapota titkosítva van, és fel lesz töltve a médiakiszolgálójára, hogy a másik eszköz le tudja kérni. Az a kiszolgáló számára olvashatatlan, csak egy méretet és egy időpontot lát. Ha nem szeretne semmit hátrahagyni, utána törölje a blobokat. 3D-objektum %1$d csúcs · %2$d lap Ezt a 3D-objektumot nem sikerült beolvasni (%1$s szabály) @@ -5246,28 +5361,146 @@ Leállítás A keresés árazása ezen az eszközön… %2$s régióból %1$s átkutatva - Elérhetetlen: körülbelül %1$d perc keresés ezen az eszközön - Elérhetetlen: körülbelül %1$d óra keresés ezen az eszközön + + Elérhetetlen: körülbelül %1$d perc keresés ezen az eszközön + Elérhetetlen: körülbelül %1$d perc keresés ezen az eszközön + + + Elérhetetlen: körülbelül %1$d óra keresés ezen az eszközön + Elérhetetlen: körülbelül %1$d óra keresés ezen az eszközön + Nincs abban a dobozban, amelyet a nyom megnevezett A régió megvan, de a tartalmát nem sikerült beolvasni - Az itt elrejtett %1$d elem nem egyezett az aláírásával, ezért el lett vetve - Az itt elrejtett %1$d elem nem egyezett az aláírásával, ezért el lettek vetve + + Az itt elrejtett %1$d elem nem egyezett az aláírásával, ezért el lett vetve + Az itt elrejtett %1$d elem nem egyezett az aláírásával, ezért el lettek vetve + Kinyitva, és nem volt benne semmi Aláírás nélküli, így ez a szerző csak állítás Egy %1$d típusú elem, amelyet ez a kliens nem jelenít meg - %1$d bájt valamiből, amit ez a kliens nem olvas + + %1$d bájt valamiből, amit ez a kliens nem olvas + %1$d bájt valamiből, amit ez a kliens nem olvas + + + Bezárás + Hivatkozás másolása + Keresés + Szövegméret + Asztali + Hozzáadás a kezdőképernyőhöz + Másik böngésző + Teljes képernyő + Cím szerkesztése + Vissza + Előre + Újratöltés + Betöltés leállítása + Hozzáadás a kedvencekhez + Eltávolítás a kedvencekből + Megosztás + Hivatkozás másolása + Keresés az oldalon + Szövegméret + Hozzáadás a kezdőképernyőhöz + Asztali oldal + Megnyitás böngészőben + Megnyitás a(z) %1$s alkalmazásban + Teljes képernyő + Elhagyta a(z) %1$s oldalt + Vissza az alkalmazásba + Kisebb szöveg + Nagyobb szöveg + Visszaállítás + %1$d% + Adatvédelem + Onion-útválasztás + Az oldal nem látja az Ön IP-címét + Az oldal látja az Ön IP-címét + Oldalbeállítások + Még semmi sincs engedélyezve + Mihez férhet hozzá + A kulcsai soha nem hagyják el az Amethystet + Minden aláírás, közzététel, feltöltés vagy fizetés az Ön jóváhagyását követeli meg + Nincs különleges hozzáférés + Homokozóban fut, és nem tud cselekedni a fiókjában + Engedélyek kezelése + nOldal · homokozóban + nKisalkalmazás · homokozóban + Konzol + Biztonságos kapcsolat + Nem biztonságos + Onion-útvonalon + Homokozóban futó alkalmazás + Kamera + Mikrofon + Helyzet + Rákérdezés + Engedélyezés + Blokkolás + %1$s %2$s + engedélyezve + blokkolva + Keresés vagy cím megadása + Ugrás + Törlés + Beillesztés és ugrás + Cím használata + Keresés az oldalon + %1$d / %2$d + Nincs találat + Előző találat + Következő találat + Keresés bezárása az oldalon + Összes + Hibák + Figyelmeztetések + Másolás + Törlés + Még semmi sincs naplózva + Ez az oldal használni akarja + Nézze meg, amit a kamerája lát + Hallgassa meg, amit a mikrofonja hall + Nagyjából tudja, hol van + A hívások Tor-on keresztül is felfedhetik az IP-címét. + Engedélyezés a látogatás idejére + Csak most az egyszer + Ne engedélyezze + %1$s üzeni + Ez az oldal üzeni + Oldal megakadályozása a még több párbeszédablak megjelenítésében + Az Ön válasza + Elhagyja az oldalt? + Lehet, hogy a módosításai nem lettek mentve. + Elhagyás + OK + Mégse + Kapcsolódás + A kapcsolat titkosított + Az Ön által küldött információ útközben nem olvasható. + A kapcsolat nincs titkosítva + Ne adjon meg jelszavakat vagy fizetési adatokat. + Onion-útvonalon Tor-on keresztül + Nyílt web + Tanúsítvány + %2$s állította ki %1$s részére · érvényes eddig: %3$s + Engedélyek + Sütik és oldaladatok + Bejelentkezések és beállítások, amelyeket ez az oldal ehhez a fiókhoz mentett + Oldaladatok törlése + Kijelentkezik erről az oldalról és törli az adatait? %1$s újbóli letiltása %1$s megtartása Újbóli csatlakozás ehhez: %1$s %1$s újbóli némítása - %1$s visszaállítása - Hírfolyamok visszaállítása - Helyek visszaállítása - Profil visszaállítása - Szolgáltatók visszaállítása - Átjátszók visszaállítása - Témák visszaállítása - Pénztárca visszaállítása + %1$s helyreállítása + Hírfolyamok helyreállítása + Helyek helyreállítása + Profil helyreállítása + Szolgáltatók helyreállítása + Átjátszók helyreállítása + Témák helyreállítása + Pénztárca helyreállítása Elfogadás %1$s és %2$d hozzáadva @@ -5401,7 +5634,7 @@ olvasás és írás csak írható Eltávolítva (%1$s) - Mentett verzió visszaállítása + Mentett verzió helyreállítása Ön módosította a következőt: %1$s, egy másik alkalmazásban Hírfolyamok Csevegőszobák @@ -5493,13 +5726,19 @@ átnevezte Átnevezve Ezen az eszközön - %1$s személy keresése + + %1$s személy keresése + %1$s személy keresése + Keresés Szolgáltatás Követők Rang Témák - %2$s szolgáltatásból %1$s módosult + + %2$s szolgáltatásból %1$s módosult + %2$s szolgáltatásból %1$s módosult + Most már valaki mástól vagy senkitől sem származnak Továbbra is le van tiltva Tárolás @@ -5574,4 +5813,252 @@ A szolgáltatások, amelyekben megbízik, hogy rangsorolják és ellenőrizzék Önnek az embereket. megbízható átjátszólista Átjátszók, amelyekhez kérdezés nélkül kapcsolódhat. + Törlés + Szerkesztés + Üzenet szerkesztése + Ugrás az üzenetre + Kitűzés + Válasz + Kitűzés megszüntetése + Nem sikerült végrehajtani a módosítás. + A koordinátor nem válaszolt, így semmi sem változott. Próbálja újra. + %1$s nem tett közzé kulcscsomagot ehhez a koordinátorhoz, így még nem adható hozzá. Kérje meg, hogy először nyissa meg a cordnt ezen a koordinátoron. + Nem távolíthatja el saját magát egy cordn csoportból. + %1$s számára nem sikerült utat biztosítani a csoportba, így a hozzáadása megszakadt. + %1$s nincs ebben a csoportban. + Az a személy + Ez a koordinátor egy máshoz tartozó kulcscsomagot szolgáltatott, így %1$s nem lett hozzáadva. Semmi sem változott. + A csoport titkosítási kulcsai, a kulcscsomagjai és azokban a csoportokban lévő minden üzenet. Aki megnyitja, elolvashatja a beszélgetéseket. A jelmondat az egyetlen dolog, ami védi, miután elhagyja az Amethystet. + Mi van a fájlban + Az nsec nem tudja visszahozni a cordn csoportokat. Egy cordn csoport titkosítási állapotként él ezen az eszközön, és sorrendbe rendezett adatfolyamként egy koordinátoron, amely nem tudja elolvasni; ha biztonsági mentés nélkül elveszíti az eszközt, a csoport eltűnik, beleértve mindazt, ami már elhangzott benne. + Exportálás + Biztonsági mentés kész. + Ez nem működött. Ellenőrizze a jelmondatot és a fájlt. + Jelmondat + Helyreállítás + A helyreállítás lecseréli az ezen az eszközön lévő cordn csoportokat a fájlban lévőkre. Ez egy olyan eszköznek szól, amely átvett egy másikat; nem arra való, hogy ugyanazokat a csoportokat egyszerre két eszközön használja. + Minden most ezen az eszközön lévő cordn csoport eltávolításra és a fájlban lévőkkel lesz helyettesítve.\n\nNe állítsa helyre egy második eszközre, amíg az elsőt még használja. Mindkettő ugyanazokat a csoportkulcsokat birtokolná, és miután mindkettő küldött egy üzenetet, a csoport mindenki számára végleg használhatatlanná válna. + Lecseréli az eszköz cordn csoportjait? + Helyreállítás + Helyreállítva. + Minden ide küldött üzenet titkosítva van ehhez a csoporthoz. A koordinátor továbbítja anélkül, hogy el tudná olvasni. + Még nincsenek üzenetek + Új üzenetek + Tegnap + Üzenet + Hozzáadás + Nem sikerült megnyitni azt a koordinátort. + A koordinátor npub-jának másolása + Koordinátorok keresése + Hozzáadás + Az átjátszói által már továbbított bejelentéseket olvassa. Egyetlen koordinátorral sem lép kapcsolatba, így egyik sem tudja meg, hogy Ön keresett. + Nem sikerült beolvasni a bejelentéseket + Senki sem jelentkezik be az átjátszóin. + Bejelentve ennyi ideje: %1$s + Utoljára bejelentve: %1$s + Egy koordinátor egy csoport üzeneteit rendezi sorba, és ez az egyetlen, ami ezt megteheti. Ha elvész, a sorrend is elvész, és egy második nem tükrözi az elsőt; így ezek névvel ellátott dolgok, amelyeket Ön választ, nem pedig felcserélhető átjátszók. + Válaszol. + Egy hívás sikertelen volt; újrapróbálkozás. + Még semmit sem kérdeztek tőle. + A bejelentést abbahagyók elrejtése + Kérdezze meg, ki az + Koordinátorkulcs + Egy név kell neki (az Öné, nem kötelező) + Ez a név az Öné, és ezen az eszközön marad. Egy koordinátor nem tudja bizonyítani a nevét, ezért soha nem kérdeznek tőle ilyet. + További műveletek + Még nincsenek koordinátorok. + Tisztítás + Az eltávolítás megtartja a csoportokat ezen az eszközön, így a koordinátor újbóli hozzáadása visszahozza őket. A tisztítás törli őket: a csoportkulcsok, az olvasási pozíciók és a kulcscsomagjai mind eltűnnek, és ezekbe a csoportokba csak friss meghívással lehet újra belépni.\n\nA koordinátort nem értesítik, és megtartja mindazt, amije már volt. + Tisztítja ezt a koordinátort? + %1$s + Válaszol ezeken + %1$s és további %2$d + Eltávolítás + Átnevezés + Azt mondja, ő: %1$s + Egy koordinátor neve és verziója az általa választott szöveg. Az egyetlen dolog, ami azonosítja, a nyilvános kulcsa. + Válaszolt, de semmit sem nevezett meg. + Mind a(z) %1$d megjelenítése + Kevesebb megjelenítése + Ezek több mint egy hónapja nem jelentkeztek be. A csoport létrehozása egy eltűnt koordinátoron sikertelen lesz. + Csoport létrehozása + + Létrehozás és %1$d személy meghívása + Létrehozás és %1$d személy meghívása + + Valaki hozzáadása + Adminisztrátor + + %1$d személy adhat hozzá és távolíthat el + %1$d személy adhat hozzá és távolíthat el + + Csak én kezelem ezt a csoportot + Csak Ön hívhat meg, távolíthat el tagokat vagy változtathatja meg a csoport adatait. Ezt később átadhatja valaki másnak. + Koordinátor + Módosítás + Koordinátorok keresése + Kész + Egy másik koordinátor + Koordinátor nyilvános kulcsa (hex vagy npub) + Átjátszók, amelyeken válaszol, soronként egy + %2$d / %1$d embert érne el, a többi kimaradna + Nincs ellenőrizve; a rendszer rá fog kérdezni a kiválasztására + Leírás (nem kötelező) + Mindenki hozzáadhat és eltávolíthat + A csoport minden tagja meghívhat, eltávolíthat tagokat és megváltoztathatja a csoport adatait. Bármely tag később kinevezhet adminisztrátorokat, ami ezt megszünteti. + Egy cordn csoportot egy Ön által választott koordinátor rendez. A csoport létrehozása ezen az eszközön történik – a koordinátor csak akkor szerez tudomást a csoport létezéséről, amikor meghív valakit vagy üzenetet küld. + Nem sikerült létrehozni a csoportot. + Csoportnév + Nincs koordinátor kiválasztva + Minden meghívó egy Üdvözlés is, amelyet a koordinátoron hagynak, így egyenként sikertelenek lehetnek. Senkit sincs értesítve: az emberek legközelebb akkor látják, amikor megnyitják az alkalmazást. + A koordinátor elutasította a meghívót + Hivatkozás küldése + Hozzáadva a csoporthoz, de a meghívó nem érte el, próbálja újra a csoport képernyőjéről + Csevegés megnyitása + Itt nincs kulcs, így nem lehetett Üdvözlést hagyni + A csoport létezik + Várakozás rájuk + Kész + Még senki sincs hozzáadva. Egy csoport létrehozható üresen, és a meghívók később küldhetők, de ha most megnevezi az embereket, az mutatja meg, melyik koordinátor tudja elérni őket. + Még senki – koppintson az emberek hozzáadásához + Ha most megnevezi az embereket, akkor mondja meg, melyik koordinátor tudja őket elérni. Mindegyikük kap egy Üdvözlést azon a koordinátoron, amelyet legközelebb akkor választanak ki, amikor megnyitják az alkalmazást. + + Elérhető %1$d koordinátoron + Elérhető %1$d koordinátoron + + Nincs kulcs egyetlen Ön által használt koordinátoron sem + Még nincs ellenőrizve + Ki adhat hozzá és távolíthat el + Nevezze el + Ki van benne + Hol él + Új Cordn csoport + + %1$d személyt egyetlen Ön által használt koordinátor sem tud elérni + %1$d személyt egyetlen Ön által használt koordinátor sem tud elérni + + Ön, mindig adminisztrátor + A csoport minden tagja visszavontként fogja látni ezt az üzenetet, és az Amethyst nem fogja többé megjeleníteni a szövegét. A koordinátor továbbra is birtokolja a titkosított másolatot, amelyként elküldték, és aki már elolvasta, az már elolvasta. + Üzenet visszavonása + A koordinátor elfogadta + Értem + Mit lát ez a koordinátor + Csoportadatok + Ez a csoport nem érhető el. Lehet, hogy a koordinátorát eltávolították. + Adjon hozzá egy koordinátort a Beállításokban, hogy elkezdje használni a cordn csoportokat. + + %1$d csoport + %1$d csoport + + Ezekből a csoportokból semmi sem érkezik. Az Amethyst folyamatosan újrapróbálkozik. + Koordinátorok + Még nincsenek cordn csoportok + Egy cordn csoport egyetlen koordinátoron él, amely nyilvántartja a tagságát és továbbítja az üzeneteket, anélkül, hogy valaha is látná, mit írnak. + Indítson egyet + Valaki hozzáadása + Senkit sem találtunk azon a néven. + Csak akkor adhatók hozzá, ha közzétettek egy kulcscsomagot ehhez a koordinátorhoz. + Név, npub vagy nev@domain + Adminisztrátor + + A csoport %1$d adminisztrátora marad, ahogy van. + A csoport %1$d adminisztrátora marad, ahogy van. + + Koordinátor + Koordinátorkulcs + Koordinátorhivatkozás + A koordinátor nprofile-jának másolása + Adatok szerkesztése + Ennek a csoportnak nincsenek adminisztrátorai: mindenki hozzáadhat, eltávolíthat és átnevezhet, véglegesen. + Korszak + Csoportazonosító + Hozzáadható ezen a koordinátoron + Tagok + %1$s nem fog többé üzeneteket fogadni innen. Megtartja, amit már elolvasott, és ez nem vonható vissza – újra meg kellene hívni. + Eltávolítja a csoportból? + Eltávolítás + Mentés + Technikai részletek + Csatlakozás + Elutasítás + Az elutasítás végleges. A visszakerüléshez újra meg kell hívni. + Akkor ellenőrzi, amikor megnyitja ezt a képernyőt, és máskor soha, ha megkérdez egy koordinátort, hogy meghívta-e valaki, az elárulja neki, hogy Ön itt van, ezért az Amethyst nem teszi ezt a háttérben. + Nem sikerült beolvasni a meghívókat. + + %1$d személy már tagja ennek a csoportnak + %1$d személy már tagja ennek a csoportnak + + +%1$d további + Nincs nyitott koordinátora. A cordn meghívók egy koordinátoron keresztül érkeznek, így még nincs hol keresni. + Nincs várakozó meghívó. + Újraellenőrzés + Egy meghívó egy másik eszköznek maradt + Cordn meghívók + %1$s nem válaszolt + %1$s által + A közzététel egy bejegyzést ír alá a saját fiókkulcsával. Az a koordinátor ezután tudja, hogy ez a fiók létezik és meghívható, véglegesen, függetlenül attól, hogy meghívja-e valaki. + Mások csak úgy adhatják hozzá egy cordn csoporthoz, ha elvesznek egy kulcscsomagot, amelyet Ön közzétett annál a koordinátornál. A cordnnak nincs más helye, ahol tárolhatna egyet, így ha egy sincs közzétéve, senki sem tudja meghívni – és semmi sem mondja meg nekik, miért. + Nem sikerült beolvasni a kulcscsomagokat. + Nincsenek tartalékcsomagok. Amint az egyszer használatosak elfogynak, a meghívók sikertelenek lesznek. + Egy végső megoldás csomag közzé van téve, így a meghívó akkor is elkészíthető, ha az egyszer használatosak elfogytak. + + %1$d csomag, amelyet ez az eszköz nem tud megnyitni + %1$d csomag, amelyet ez az eszköz nem tud megnyitni + + A koordinátor odaadja ezeket bárkinek, aki meghívja Önt, de a privát fele nincs ezen az eszközön – egy másik telepítéshez tartozik. Ha az a telepítés eltűnt, egy ilyen használatával készült meghívó olyan welcome-ot hoz létre, amelyet soha senki sem tud megnyitni. + Egy közzététele + Végső megoldás közzététele + + %1$d egyszer használatos csomag elérhető. + %1$d egyszer használatos csomag elérhető. + + Miután itt közzétett, az Amethyst csendben pótolja a csomagokat, ahogy elfogynak. Az elsőt soha nem teszi közzé Ön helyett. + Összes visszavonása + Azok visszavonása + Csatlakozási kérelem ehhez a csoporthoz + Ez közzétesz egy kulcscsomagot a saját fiókkulcsa alatt, és megmondja a koordinátornak, hogy be szeretne kerülni ebbe a csoportba – függetlenül attól, hogy válaszol-e valaki. + Nem sikerült csatlakozási kérelmet küldeni. + Elküldve. A csoport egyik tagjának hozzá kell adnia Önt; a meghívó a cordn meghívók alatt fog megjelenni. + Beolvasás + Nem sikerült megnyitni azt a fájlt. + Nincs médiakiszolgáló beállítva ehhez a fiókhoz, így nincs hová tenni a fájlt. Válasszon egyet a Beállításokban. + Azt a fájlt nem sikerült beolvasni. + Nem sikerült elküldeni azt a fájlt. + + %1$d tag + %1$d tag + + Üzenet törölve + Koordinátor + Kurzor + Elküldve + Üzenet részletei + szerkesztve + %1$s rögzítette + + %1$d rögzített üzenet ebben a csoportban + %1$d rögzített üzenet ebben a csoportban + + Következő rögzített üzenet + Előző rögzített üzenet + Összes rögzített üzenet megjelenítése + Rögzített üzenetek + Reakciók + Hozzáadás + Csak az adminisztrátor fogadhat el. Egy adminisztrátorok nélküli csoportban ez mindenki. + Kérelmek ellenőrzése + Elvetés + Nem sikerült beolvasni a kérelmeket. + Senki sem vár a csatlakozásra. + Csatlakozási kérelmek + Küldés + Ez nem került elküldésre. + Ennek a csoportnak a koordinátora nincs nyitva, így még semmit sem lehet küldeni. + Másolva + Hivatkozás másolása + Bárki, aki rendelkezik ezzel a hivatkozással, kérheti a csatlakozást. Egy adminisztrátornak még mindig be kell engednie. + Csoport megosztása + Hangfelvétel lejátszása + Hangfelvétel készítése + Leállítás és küldés diff --git a/commonsUI/src/commonMain/composeResources/values-in-rID/strings.xml b/commonsUI/src/commonMain/composeResources/values-in-rID/strings.xml index 2d3796e5c6..ce34156cf5 100644 --- a/commonsUI/src/commonMain/composeResources/values-in-rID/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-in-rID/strings.xml @@ -2855,4 +2855,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-it-rIT/strings.xml b/commonsUI/src/commonMain/composeResources/values-it-rIT/strings.xml index ad2cf8ce4a..46a70f4033 100644 --- a/commonsUI/src/commonMain/composeResources/values-it-rIT/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-it-rIT/strings.xml @@ -2893,4 +2893,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-ja-rJP/strings.xml b/commonsUI/src/commonMain/composeResources/values-ja-rJP/strings.xml index 55ec746b2c..d05cf2e3ba 100644 --- a/commonsUI/src/commonMain/composeResources/values-ja-rJP/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-ja-rJP/strings.xml @@ -2913,4 +2913,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-ko-rKR/strings.xml b/commonsUI/src/commonMain/composeResources/values-ko-rKR/strings.xml index accb186576..b5f94f364a 100644 --- a/commonsUI/src/commonMain/composeResources/values-ko-rKR/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-ko-rKR/strings.xml @@ -2897,4 +2897,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-lv-rLV/strings.xml b/commonsUI/src/commonMain/composeResources/values-lv-rLV/strings.xml index ddbaf51560..159c676759 100644 --- a/commonsUI/src/commonMain/composeResources/values-lv-rLV/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-lv-rLV/strings.xml @@ -2981,4 +2981,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-nl-rNL/strings.xml b/commonsUI/src/commonMain/composeResources/values-nl-rNL/strings.xml index 7e475098d0..cc49452a22 100644 --- a/commonsUI/src/commonMain/composeResources/values-nl-rNL/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-nl-rNL/strings.xml @@ -4625,4 +4625,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-pl-rPL/strings.xml b/commonsUI/src/commonMain/composeResources/values-pl-rPL/strings.xml index d66edbbd01..8b1f5cd7f1 100644 --- a/commonsUI/src/commonMain/composeResources/values-pl-rPL/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-pl-rPL/strings.xml @@ -214,7 +214,12 @@ Nowe polowanie… Nie dokonałeś jeszcze polowania. Już podczas tego polowania - %1$d skrzynek tutaj + + %1$d skrzynka tutaj + %1$d skrzynki tutaj + %1$d skrzynek tutaj + %1$d skrzynki tutaj + Usuń to zdjęcie Ta skrzynka została zarchiwizowana. Nie jest już w grze. Pierwszy, który znalazł – zgłoszone przez %1$s @@ -273,7 +278,6 @@ Wyśrodkuj na mnie Naciśnij i przytrzymaj mapę, aby ukryć skrzynkę Otwórz - %1$d skrzynek Gdzie Co Dodatki @@ -301,7 +305,12 @@ Wybierz gdzie skrzynka jest ukryta. Znaleziono %1$d z %2$d Rozpocznij polowanie - %1$d skrzynek + + %1$d skrzynka + %1$d skrzynki + %1$d skrzynek + %1$d skrzynki + Tytuł Opis Obraz banera @@ -352,7 +361,12 @@ Nie znaleziono kodu QR na tym obrazku Nic w schowku do skanowania Wybierz żądany kod - Zdobyto %1$s z %2$s części — kontynuuj + + Zdobyto %1$s z %2$s części — kontynuuj + Zdobyto %1$s z %2$s części — kontynuuj + Zdobyto %1$s z %2$s części — kontynuuj + Zdobyto %1$s z %2$s części — kontynuuj + Zresetuj zoom Ametyst nie może otworzyć tego kodu Ten kod zawiera klucz prywatny lub hasło parowania, dlatego jego treść nie jest tutaj wyświetlana. Należy skorzystać z odpowiedniego ekranu, na którym należy go wprowadzić. @@ -2891,6 +2905,7 @@ Nie spełniasz wymogów dotyczących rankingu zaufania tej społeczności. Najnowszy dokument zawierający zasady społeczności został odrzucony jako nieaktualny. Grupy Marmot + Grupy Cordn Utwórz Grupę Utwórz Grupę Marmot Zostanie utworzona nowa grupa MLS. Następnie możesz dodać członków. @@ -5439,14 +5454,120 @@ + Grupa koordynatora + Dostarczone przez koordynatora, nie przez transmitery + Co ten koordynator może zobaczyć + Koordynator to serwer, który przekazuje wszystkie wiadomości w tej grupie w kolejności. Różni się to od działania transmiterów — warto o tym wiedzieć, zanim potraktujesz to, jak zwykły czat. + Treść wiadomości + Kto jest w grupie + Kto co wysyła + Nieczytelne + Z użyciem klucza jednorazowego + Powiązane z Twoim prawdziwym kontem + Szczegóły + Koordynator %1$s + Nie jest to taka sama forma interakcji jak w grupie Marmot, gdzie żadna z osób prowadzących nie dominuje całej rozmowy. + Łączy nazwy rzeczywistych kont po obu stronach, dzięki czemu koordynator wie, kto należy do tej grupy. + Pojedynczy klucz jednorazowego użytku służy do wysyłania i pobierania danych dla każdej z grup, które tu masz, dzięki czemu koordynator może stwierdzić, że wszystkie one należą do ciebie. + Każdy operator przechowuje kompletną, uporządkowaną historię wszystkich grup, które obsługuje. + Opublikowany przez Ciebie pakiet kluczy to podpisany zapis potwierdzający, że to konto korzysta z usługi cordn, a koordynator może go przekazać dowolnej osobie. + Komunikaty nie są uzupełniane, więc koordynator widzi, jak długi jest każdy z nich. + Ten klient nie szyfruje danych przesyłanych do koordynatora. To błąd — prosimy o zgłoszenie tego. + Jeszcze się nie skontaktowano + Odpowiedź + Brak odpowiedzi + Wklej link „cordn1…” udostępniony przez inną osobę, aby sprawdzić, który koordynator prowadzi tę grupę oraz jakie informacje o tobie uzyskałby ten operator, gdybyś do niej dołączył. + cordn1… + Zbadaj + Wklej + Wyczyść + To nie jest link do grupy Cordn: %1$s + ID grupy + Koordynator + Osiągalne przez + W tym linku nie podano nazwiska koordynatora, więc nie można z niego skorzystać samodzielnie. Zapytaj osobę, która go przesłała, który koordynator prowadzi tę grupę. + Sprawdzenie linku nie powoduje dołączenia do niczego, a samo kliknięcie go nie czyni cię członkiem. + Link do grupy Cordn + cordn koordynator grupa link zaproszenie mls czat metadane prywatność ujawnienie + Koordynatorzy Cordn + cordn koordynator dodawanie usuwanie czyszczenie stan serwera mls czat sortowanie + Pakiety kluczy Cordn + cordn klucz pakiet publikacja zaproszenie ostatni resort koordynator mls + Kopia zapasowa Cordn + cordn kopia zapasowa przywracanie eksport import hasło odzyskiwanie grup + Grupy Cordn + Grupy z szyfrowaniem typu end-to-end, zarządzane przez wybranego przez Ciebie koordynatora, a nie przez transmitery. + Grupa %1$s + Brak wiadomości + Grupa Cordn, obsługiwana przez %1$s + Wiadomość usunięta + Wiadomość głosowa + Zdjęcie + Wideo + Plik + Grupa Cordn + Szyfrowany czat grupowy zorganizowany przez wybranego przez Ciebie koordynatora. + Skoordynowane + Najlepsze rozwiązanie dla zespołów, które chcą mieć jeden spójny porządek dyskusji. + Utwórz grupę Cordn + Szyfrowanie typu „end-to-end” z wykorzystaniem MLS — koordynator nigdy nie ma możliwości odczytania wiadomości. + Jedno uzgodnione postanowienie dla wszystkich, aby historia nie mogła zostać zmieniona przez błędny zegar. + Koordynator wie, kto należy do grupy i kiedy ktoś zabiera głos, mimo że nie potrafi odczytać treści wypowiedzi. + Zostałeś zaproszony do grupy „cordn”? + Przejrzyj zaproszenia + Cordn + Grupy prowadzone przez wybranego przez Ciebie koordynatora, a nie przez transmitery. + Sprawdź link do grupy + Zanim klikniesz w link typu „cordn1…”, sprawdź, dokąd prowadzi + Zmień ten telefon + Przeniesienie danych z innego telefonu + Opublikowane pakiety kluczy + Link + Koordynatorzy, z których korzystasz + Przedstawianie się + Dodaj jedną ręcznie + Hasło + Utwórz kopię zapasową + Przywróć z kopii zapasowej + Koordynator + Urządzenie + Koordynatorzy + Serwery z Twoimi grupami + Pakiety kluczy + Co pozwala innym osobom dodać cię do grupy + Kopia zapasowa i przywracanie + Przechowywany plik zaszyfrowany hasłem + Przenieś na nowy telefon + Przekaż swoje grupy na urządzenie, na które się przełączasz + Przenieś na nowy telefon + Twoje grupy Cordn są przechowywane na tym urządzeniu. Przeniesienie ich wymaga jednego kodu: ten telefon je publikuje, nowy telefon je odczytuje, a ten telefon przestaje je wyświetlać. + Najpierw zaloguj się na nowym telefonie przy użyciu tego samego konta. Spowoduje to przeniesienie twoich grup, ale w żadnym wypadku nie twojego klucza. + Rozpocznij transfer + Publikowanie… + Zeskanuj to na nowym telefonie + Kod to tylko wskazówka. Ktokolwiek go sfotografuje, nic się nie dowie — to, na co wskazuje, jest dla ciebie zastrzeżone. + To urządzenie przeniosło swoje grupy + Aplikacja przestała wysyłać i odbierać wiadomości, ponieważ wysyłanie wiadomości przez dwa telefony z tej samej grupy spowodowałoby zakłócenia dla wszystkich jej członków. Twoje grupy nadal znajdują się na tym urządzeniu i nic nie zostało usunięte. + Przywróć to urządzenie + Skorzystaj z tej opcji, jeśli przenoszenie nie zostało zakończone. Zrób to tylko wtedy, gdy nowy telefon jeszcze nie rozpoczął wysyłania danych. + Odbierz z innego telefonu + Zeskanuj kod + lub wklej + Przynieś grupy tutaj + Pobieranie… + Powyższe dane zastępują wszelkie grupy „cordn” już istniejące w tym telefonie. Nie można ich połączyć. + Na tym urządzeniu nie ma żadnych grup cordn, które można by przenieść. + Najpierw skonfiguruj serwer multimediów — zaszyfrowane dokumenty muszą gdzieś się znaleźć, dopóki drugi telefon je pobierze. + Co opuszcza to urządzenie + Stan Twojej grupy jest szyfrowany i przesyłany na serwer multimediów, aby drugi telefon mógł go pobrać. Serwer ten nie jest w stanie odczytać tych danych – widzi jedynie rozmiar i czas. Jeśli chcesz, aby nic nie pozostało, usuń te pliki po zakończeniu. Obiekt 3D %1$d wierzchołków · %2$d ścian Nie udało się odczytać tego obiektu 3D (reguła %1$s) @@ -5468,16 +5589,141 @@ Stop Wycena wyszukiwania na tym urządzeniu… Przeszukano %1$s z %2$s regionów - Poza zasięgiem: około %1$d minut wyszukiwania na tym urządzeniu - Poza zasięgiem: około %1$d godzin wyszukiwania na tym urządzeniu + + Poza zasięgiem: około %1$d minuty wyszukiwania na tym urządzeniu + Poza zasięgiem: około %1$d minut wyszukiwania na tym urządzeniu + Poza zasięgiem: około %1$d minut wyszukiwania na tym urządzeniu + Poza zasięgiem: około %1$d minuty wyszukiwania na tym urządzeniu + + + Poza zasięgiem: około %1$d godziny wyszukiwania na tym urządzeniu + Poza zasięgiem: około %1$d godzin wyszukiwania na tym urządzeniu + Poza zasięgiem: około %1$d godzin wyszukiwania na tym urządzeniu + Poza zasięgiem: około %1$d godziny wyszukiwania na tym urządzeniu + W pudełku nie ma podpowiedzi o nazwie Znaleziono region, ale nie udało się odczytać jego zawartości - %1$d element ukryty w tym miejscu nie pasował do swojej sygnatury podpisu i został usunięty - %1$d ukrytych tutaj elementów nie pasowało do swoich sygnatur i zostało usuniętych + + %1$d element ukryty w tym miejscu nie pasował do swojej sygnatury podpisu i został usunięty + %1$d elementy ukryte tutaj nie pasowały do swoich sygnatur i zostały usunięte + %1$d ukrytych tutaj elementów nie pasowało do swoich sygnatur i zostało usuniętych + %1$d ukrytego tutaj elementu nie pasowało do swoich sygnatur i zostało usuniętych + Otworzyłem, a w środku nic nie było Brak podpisu, więc autor to tylko domysł Element typu %1$d, którego ten klient nie wyświetla - %1$d bajtów danych, których ten klient nie odczytuje + + %1$d bajt danych, których ten klient nie odczytuje + %1$d bajty danych, których ten klient nie odczytuje + %1$d bajtów danych, których ten klient nie odczytuje + %1$d bajta danych, których ten klient nie odczytuje + + + Zamknij + Kopiuj link + Znajdź + Rozmiar tekstu + Pulpit + Dodaj do strony głównej + Inna przeglądarka + Pełny ekran + Edytuj adres + Wróć + Przekaż + Odśwież + Zatrzymaj wczytywanie + Dodaj do ulubionych + Usuń z ulubionych + Udostępnij + Kopiuj link + Znajdź na stronie + Rozmiar tekstu + Dodaj do strony głównej + Witryna stacjonarna + Otwórz w przeglądarce + Otwórz w %1$s + Pełny ekran + Opuściłeś %1$s + Powrót do aplikacji + Mniejszy tekst + Większy tekst + Zresetuj + %1$d% + Prywatność + Przekierowanie Onion + Witryna nie widzi Twojego adresu IP + Witryna może wykryć Twój adres IP + Ustawienia witryny + Na razie nic nie jest dozwolone + Do czego ma dostęp + Twoje klucze nigdy nie opuszczają Amethystu + Każdy wpis, publikacja, przesłanie treści lub płatność wymaga Twojej zgody + Brak specjalnego dostępu + Działa w środowisku izolowanym i nie ma dostępu do Twojego konta + Zarządzaj uprawnieniami + nSite · w środowisku izolowanym + nApplet · w środowisku izolowanym + Konsola + Bezpieczne połączenie + Niezabezpieczone + Przekierowanie przez Onion + Aplikacja w środowisku izolowanym + Aparat + Mikrofon + Lokalizacja + Zapytaj + Zezwól + Zablokuj + %1$s %2$s + dozwolone + zablokowane + Szukaj lub wprowadź adres + Przejdź + Wyczyść + Wklej i przejdź + Użyj tego adresu + Znajdź na stronie + %1$d x %2$d + Brak wyników + Poprzedni wynik + Następne wynik + Zamknij wyszukiwanie na stronie + Wszytko + Błędy + Ostrzeżenia + Kopiuj + Wyczyść + Nic nie zalogowano + Ta strona chce użyć + Zobacz, co widzi Twoja kamera + Usłysz, co słyszy Twój mikrofon + Wiedz mniej więcej, gdzie się znajdujesz + Połączenia mogą ujawnić Twój adres IP nawet przy korzystaniu z sieci Tor. + Zezwól podczas odwiedzin + Tylko tym razem + Nie zezwalaj + Na tej stronie napisano + Nie pozwól tej stronie wyświetlać więcej dialogów + Twoja odpowiedź + Opuścić witrynę? + Wprowadzone zmiany mogą nie zostać zapisane. + Wyjdź + OK + Anuluj + Połączenie + Połączenie jest zaszyfrowane + Przesyłane przez Ciebie informacje nie mogą zostać odczytane podczas przesyłania. + Połączenie nie jest zaszyfrowane + Nie wpisuj haseł ani danych płatności. + Przekierowanie typu Onion przez sieć Tor + Otwarta sieć + Certyfikat + Wydany dla %1$s przez %2$s · ważny do %3$s + Uprawnienia + Pliki cookie i dane witryny + Loginy i preferencje tej witryny zapisane dla tego konta + Wyczyść dane witryny + Wylogować się z tej witryny i usunąć dane? Zablokuj %1$s ponownie Zachowaj %1$s Ponów %1$s @@ -5775,13 +6021,23 @@ zmieniono nazwę Zmieniono nazwę Na tym urządzeniu - Szukaj %1$s osób + + Szukaj %1$s osoby + Szukaj %1$s osób + Szukaj %1$s osób + Szukaj %1$s osoby + Szukam Serwis Obserwujący Ranking Tematy - Zmieniono %1$s z %2$s serwisów + + Zmieniono %1$s z %2$s serwisu + Zmieniono %1$s z %2$s serwisów + Zmieniono %1$s z %2$s serwisów + Zmieniono %1$s z %2$s serwisu + Teraz pochodzą od kogoś innego albo od nikogo Nadal zablokowana Przechowywanie @@ -5856,4 +6112,24 @@ Serwisy, którym ufasz, a które zajmują się klasyfikowaniem i weryfikacją osób w Twoim imieniu. lista zaufanych transmiterów Zaufane transmitery, z którymi bez wahania nawiązujesz połączenie. + Usuń + Edytuj + Edycja wiadomości + Przejdź do wiadomości + Przypnij + Odpowiedz + Odepnij + Czy zamienić grupy cordn tego urządzenia? + Przywróć + Przywrócono. + Wszystkie wiadomości wysyłane tutaj są szyfrowane dla tej grupy. Koordynator przekazuje je dalej, nie mając możliwości ich odczytania. + Brak wiadomości + Nowe wiadomości + Wczoraj + Wiadomość + Dodaj + Nie można otworzyć tego koordynatora. + Skopiuj npub koordynatora + Szukaj koordynatorów + Dodaj diff --git a/commonsUI/src/commonMain/composeResources/values-pt-rBR/strings.xml b/commonsUI/src/commonMain/composeResources/values-pt-rBR/strings.xml index dcfb5f3659..7fa393e1b3 100644 --- a/commonsUI/src/commonMain/composeResources/values-pt-rBR/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-pt-rBR/strings.xml @@ -166,6 +166,152 @@ Congestionamento Evento na via + Geocache + Tradicional + Multi-cache + Mistério + Micro + Pequeno + Regular + Grande + Outro tamanho + D%1$d + T%1$d + Primeiro a encontrar + Arte + Key Quest + Encontros verificados + Reivindicado + Arquivado + Travou? Toque para revelar a dica + Ilegível? Toque para ver a outra leitura + Por perto + Encontrei! + Encontro verificado + A prova não confere + Carregando cache… + Escondido por %1$s + Navegar + Copiar coordenadas + Coordenadas copiadas + Fotos + Missão Key Quest + Logs + Ninguém registrou este cache ainda. Seja o primeiro. + Encontrei + Não encontrei + Adicionar uma nota + Informar que precisa de manutenção + Adicionar a uma caçada + Nova caçada… + Você ainda não criou uma caçada. + Já está nesta caçada + + %1$d cache aqui + %1$d caches aqui + + Remover esta foto + Este cache foi arquivado. Ele não está mais em jogo. + Primeiro a encontrar: %1$s + O primeiro a encontrar ainda está em aberto + Dono + Editar este cache + Arquivar este cache + Arquivar. Quem procurar verá que ele está fora de jogo, e a listagem continua legível. + Confirmar o primeiro a encontrar + Publica uma tag F indicando %1$s. Isso é permanente. + Ainda não há encontros verificados, então não há ninguém para confirmar. + Mostrar o código de verificação + Imprima isto e coloque dentro do cache. O Amethyst não o armazena — se você perdê-lo, quem encontrar o cache não poderá mais provar que esteve lá. + Não encontrei + Nota + Precisa de manutenção + Registrar um encontro + Cache + Seu log + Como foi? + Adicionar uma foto + Sua resposta da Key Quest + Prova de presença + Escaneie o código dentro do cache + Escanear outro código + Verificado — você esteve no cache + Assinado uma única vez com o código da caixa. A chave nunca é salva e nunca sai desta tela. + Isso não é um código de verificação. + Esse código pertence a outro cache. + Este cache não exige prova, então você pode simplesmente registrá-lo. + Sua própria localização não é anexada a este log. + Publicar + Adicionar um log + Por perto + Mapa + Caçadas + Encontrados + Meus + Não encontrados + D ≤ %1$d + T ≤ %1$d + Tem prêmio + Exige prova + Usar minha localização + Ordenado por distância + Mais recentes primeiro + Esconder um cache + Ainda não há caches aqui. Tente uma lista de seguidos mais ampla ou esconda o primeiro. + Você ainda não registrou nenhum encontro. + Você ainda não escondeu nenhum cache. + Nenhuma caçada ainda. + Encontros + Primeiros a encontrar + Verificados + Escondidos + Centralizar em mim + Toque e segure no mapa para esconder um cache ali + Abrir + Onde + O quê + Extras + Prova + Relays + Isto publica uma localização pública com precisão de cerca de 5 metros. Qualquer pessoa no Nostr pode vê-la, e um evento publicado não pode ser retirado. + Escolha o local + Publica %1$s, além de células mais amplas de até 3 caracteres para a busca por proximidade. + Nome + Descrição + Tipo + Tamanho + Dificuldade + Terreno + Dica + Quem procurar verá + Embaralhar a dica (ROT13) + Missão Key Quest + Modificadores + Exigir prova de presença + Uma chave de verificação foi gerada para este cache. + Onde os encontros devem ser registrados + Publicar + Dê um nome ao cache. + Escolha onde o cache está escondido. + %1$d de %2$d encontrados + Começar a caçada + + %1$d cache + %1$d caches + + Título + Descrição + Imagem de capa + Caches, em ordem + Adicionar um cache + Mover para cima + Mover para baixo + Remover + Tema da página + Estilo do mapa + Dê um título à caçada. + Adicione pelo menos um cache. + Não foi possível publicar. Verifique sua conexão com os relays e tente novamente. Os zaps para isto são divididos entre: %1$d%% Valor-para-Valor @@ -188,6 +334,51 @@ Banner do perfil Aponte para o código QR + O Amethyst precisa da câmera para ler códigos QR. Nada é gravado nem enviado — os quadros são decodificados no dispositivo e descartados. + Permitir câmera + O acesso à câmera está desativado para o Amethyst. Você pode reativá-lo nas configurações do Android. + Abrir configurações + O leitor de QR não pôde ser iniciado neste dispositivo. Você ainda pode colar o código como texto. + Acender a lanterna + Apagar a lanterna + Está escuro — experimente a lanterna + Ler de uma imagem + Colar + Nenhum código QR encontrado nessa imagem + Nada na área de transferência para ler + Toque no código que você quer + + %1$s de %2$s parte capturada — continue + %1$s de %2$s partes capturadas — continue + + Redefinir zoom + O Amethyst não consegue abrir este código + Este código contém uma chave privada ou um segredo de pareamento, por isso o conteúdo não é exibido aqui. Use a tela que espera por ele. + Isto é uma chave privada. Cole-a na tela de login. + Isto é uma conexão de carteira. Adicione-a nas configurações da Carteira. + Isto é um endereço de assinador remoto. O Amethyst fornece esses endereços para que outros apps possam pedir que ele assine — não é possível entrar com um deles. + Isto é um app pedindo para se conectar ao seu assinador. Abra-o pela tela do assinador NIP-46. + Isto é uma fatura Lightning. + Isto é um token Cashu. + Isto é um link da web. + Isto é texto simples, não um código Nostr. + Isto é um código Nostr, mas não um que esta tela consiga abrir. + Perfil + Nota + Código Nostr + Relay + Chave privada + Conexão de carteira + Endereço de assinador remoto + Pedido de conexão ao assinador + Fatura Lightning + Token Cashu + Link da web + Texto simples + Abrir link + Copiar + Copiado + Ler novamente Mostrar QR Imagem de perfil Sua Foto de Perfil @@ -634,17 +825,70 @@ Horas Minutos Segundos + Use os treinos que você já registrou + Conecte o Health Connect (Samsung Health, Google Fit, Fitbit, Garmin…) para montar a Minha Forma Física, seu próprio resumo de treinos, e para preencher este treino a partir de um que seu relógio já registrou, em vez de digitar cada número à mão. Conectar %1$s km Do Health Connect O que o Amethyst lê Health Connect e Amethyst + O Amethyst usa o Health Connect para montar a Minha Forma Física — seu próprio resumo de treinos, no seu celular. + A Minha Forma Física (menu → Você → Minha Forma Física) mostra como você tem treinado: quanto fez nesta semana em comparação com a anterior, como seu tempo se divide entre corrida, ciclismo, caminhada, natação e academia, seus melhores desempenhos, quantos dias você treinou e sua sequência atual. O Amethyst monta esse panorama a partir dos treinos que seu relógio ou app de fitness já salvou no Health Connect, junto com os treinos que você registrou no próprio Amethyst. Tudo é calculado no seu celular e mostrado a você. O que o Amethyst lê e por quê + Exercício · qual atividade você fez, quando começou e quanto durou. É o treino em si: define sua contagem de treinos, seu tempo de treino, a divisão por atividade, seus dias ativos e sua sequência. + Distância · até onde você foi, mostrada como sua distância nesta semana em comparação com a anterior, sua média semanal, sua distância por atividade e sua maior distância. + Calorias ativas e totais · a energia gasta em um treino, mostrada como sua energia nesta semana e como ela se compara com a semana anterior. As calorias ativas são usadas quando sua fonte as registra; as calorias totais são a alternativa para fontes que só registram a energia total. + Frequência cardíaca · a média e o máximo de cada treino, combinados na sua frequência cardíaca média e mais alta do período. É o que diferencia uma semana leve de uma pesada com a mesma distância. + Passos · a contagem de passos de uma corrida, caminhada ou trilha, mostrada como sua média semanal de passos e sua maior contagem de passos. + Ganho de elevação · quanto você subiu, mostrado como sua média semanal de subida e sua maior subida. É o que separa uma semana plana de uma com morros. O que o Amethyst não faz + Só lê treinos das últimas 4 semanas, e só enquanto a Minha Forma Física ou o editor de treinos estiver aberto. Nunca lê em segundo plano. Nunca grava nada no Health Connect e nunca solicita seu trajeto de exercício, localização ou qualquer outro tipo de dado de saúde. + Nunca envia seus dados de saúde para lugar nenhum. A Minha Forma Física é calculada no seu celular e fica nele. Se depois você quiser publicar um treino, toque em Compartilhar nesse treino, leia a publicação que o Amethyst preencheu e publique você mesmo — um treino por vez, nunca automaticamente. + O recurso inteiro é opcional. Revogue as permissões no Health Connect a qualquer momento — a Minha Forma Física volta a exibir o convite para conectar — ou desative as sugestões do editor em Configurações → Configurações de composição. O resto do Amethyst continua funcionando. Ler a política de privacidade completa + Minha Forma Física + Últimas 4 semanas + Carregando distância, calorias e frequência cardíaca… + As últimas quatro semanas completas do seu treino: os treinos que você publicou, mais tudo o que o Health Connect registra neste celular. O Amethyst calcula o resumo no dispositivo e não publica nada dele. + Esta semana + vs. semana passada + Média semanal + Treinos + Dias ativos + Dias seguidos + Tempo + %1$d h %2$d min + %1$d min + %1$d s + Distância + Calorias + Passos + Subida + FC média + FC máx. + Por atividade + Melhores desempenhos + Maior distância + Treino mais longo + Maior subida + Mais passos + Maior frequência cardíaca + Treinos recentes + Nada registrado nas últimas 4 semanas. Os treinos que você publicar, e os que seu relógio registrar, aparecem aqui. + Acompanhe seu treino + Conecte o Health Connect para ver seus totais semanais, a tendência semana a semana, seus melhores desempenhos e sua sequência de treinos. Tudo fica no seu celular. + Conecte o Health Connect para adicionar os treinos que seu relógio registra, com frequência cardíaca, passos e subida. + Conectar + Compartilhar este treino + bpm + kcal + km + mi + m + pés Nenhum nSite encontrado ainda. Recarregar O navegador integrado requer Android 11 ou superior. @@ -1080,6 +1324,8 @@ Data e hora de encerramento da enquete Enquete encerra em %1$s Procurando o evento %1$s + Carregando + Aguardando suas mensagens privadas carregarem… Enviar Zap Adicionar uma mensagem pública Adicionar uma mensagem privada @@ -1219,6 +1465,8 @@ + %1$02d:%2$02d + %1$d:%2$02d:%3$02d Dispensar Trocar câmera Chamada de voz @@ -1353,6 +1601,14 @@ Preferências do Usuário Pesquisar configurações Nenhuma configuração encontrada para "%1$s" + Grupo atualizado + Anexo + Mensagem + %1$s: %2$s + Criar um grupo + Os convites do Marmot estão indo para outro dispositivo e não podem ser abertos aqui. + Dispensar + Publicar a partir deste dispositivo Redefinir estado do Marmot? Isto excluirá permanentemente todos os chats em grupo Marmot, histórico de mensagens e chaves MLS deste dispositivo para a conta atual. Os participantes não serão notificados e ainda poderão ver você nos grupos até a próxima confirmação deles. Esta ação não pode ser desfeita. Um novo KeyPackage será publicado na próxima sincronização do aplicativo. Redefinir @@ -1623,6 +1879,7 @@ Nenhuma transação corresponde a este filtro Carregando… Recebido + Abrir nota que recebeu o zap Enviado Atualizar Todos @@ -1939,6 +2196,8 @@ Reproduzir o vídeo em uma janela flutuante (oculto se não suportado) Transmitir para dispositivo Envia o vídeo para um receptor Chromecast na sua Wi-Fi (oculto para arquivos locais) + Legendas + Ativar ou desativar as legendas (oculto quando o vídeo não tem nenhuma) Escolha a animação exibida enquanto as notas de áudio são reproduzidas. Desligado Barras de espectro @@ -2626,6 +2885,7 @@ Você não atende aos requisitos da rede de confiança desta comunidade. O documento mais recente de regras da comunidade foi rejeitado por estar desatualizado. Grupos Marmot + Grupos Cordn Criar grupo Criar grupo Marmot Um novo grupo MLS será criado. Você pode adicionar membros depois. @@ -2917,13 +3177,18 @@ Notifica você quando alguém responde à sua publicação Respostas Novas respostas + Não enviada Responder + Tentar novamente + Enviando… + Ainda enviando… Notifica você quando alguém reposta sua publicação %1$s repostou sua publicação Repostagens Novos reposts Notificações quando um post agendado é publicado ou falha ao publicar. Posts agendados + Esta conta foi removida do Amethyst. Notifica quando alguém te manda um zap %1$s sats por %1$s @@ -3124,6 +3389,10 @@ Ativar som URL de retorno de chamada não encontrado da resposta %1$s Cancelar + Desativadas + Desativar legendas + Ativar legendas + Legendas Token Cashu Verificando o mint… Não foi possível resgatar o Cashu @@ -3600,10 +3869,12 @@ Prólogo da aventura Leitura da aventura Cena da aventura + Lista de apps Recomendações de Apps Compromisso Aplicativos RSVP do Compromisso + Lista de artigos Cabeçalho de Áudio Faixa de Áudio Podcasts criados @@ -3616,6 +3887,7 @@ Autenticação Blossom Servidores Blossom Lista de Favoritos + Conjunto de favoritos Relays de Broadcast Calendário Definição de Canal @@ -3653,6 +3925,7 @@ Pacotes de Emoji Chat Efêmero Salas de Chat Efêmeras + Feeds favoritos Podcasts favoritos Relays Favoritos Cabeçalhos de Arquivo @@ -3661,28 +3934,36 @@ Pacotes de Seguir Seguindo Geohash Embrulhos de presente + Autores Git Issue do Git Patch do Git Pull request Atualização de PR Resposta do Git Repositório Git + Repositórios Git Status do Git: Aplicado Status do Git: Fechado Status do Git: Rascunho Status do Git: Aberto + Autores de wiki confiáveis + Relays de wiki confiáveis Hashtags seguidas Destaques Autenticação HTTP Lista de relays de índice + Interesses Chats ao vivo Transmissões ao vivo + Seguidos de mídia + Pacote inicial de mídia Dados Médicos Sala de reunião Espaço de reunião Playlist de música Faixa de música Lista de silenciados + Silenciado para o kind %1$s Favoritos nomeados Servidores Nests CNPJ @@ -3697,6 +3978,7 @@ Relays de Saída Pagar para Listas de pessoas + Lista de imagens Imagens Fixados Episódio de podcast @@ -3723,6 +4005,7 @@ Relays de busca Shorts Shorts (resposta) + Grupos Comentários de torrent Torrents Provedores confiáveis @@ -3731,7 +4014,10 @@ Configurações do Usuário Status do usuário Vídeo + Colaboração em vídeo + Lista de vídeos Vídeo (resposta) + Legendas de vídeo Mensagem de voz Resposta de voz Despertar @@ -3768,6 +4054,8 @@ Alterar lugar no mapa Canais de localização Escolher um lugar no mapa + O Amethyst para Android não consegue entrar com um endereço bunker://. Ele fornece esses endereços para que outros apps possam pedir que ele assine, mas não é possível entrar com um deles. Use um app assinador externo ou o Amethyst Desktop. + Isso é um app pedindo para se conectar ao seu assinador, não uma forma de entrar. Entre primeiro e depois abra-o pela tela do assinador NIP-46. Faça login com uma chave privada para poder impulsionar postagens Faça login com uma chave privada para poder seguir Você está usando uma chave pública e as chaves públicas são somente de leitura. Faça login com uma chave privada para poder ocultar uma palavra ou frase. @@ -3858,6 +4146,7 @@ Silenciar notificações Silenciado. Clique para ativar o som Meus arquivos Blossom + Minha Forma Física Minhas listas Um nome é necessário %1$dms @@ -4121,6 +4410,7 @@ Aplicativo de assinador remoto Assinador Remoto + Esta lista tem membros privados que só o autor pode ver %1$d recurso incluído %1$d recursos incluídos @@ -4651,12 +4941,21 @@ Calendários Xadrez Descobrir + Editar cache + Editar caçada + Cache + Caçada + Caçadas de caches + Geocaches Início Importar Seguidos + Registrar um achado Mídia Mensagens Listas de reprodução Música + Esconder um cache + Nova caçada Notificações Episódios Podcasts @@ -4844,6 +5143,18 @@ Pedido para desaparecer enviado Melhor qualidade em arquivos menores, mas nem todos os dispositivos suportam reprodução em H.265. Usar codec H.265/HEVC + Aceitou um crédito de colaboração + Recusou um crédito de colaboração + Crédito aceito + Áudio de + Participação de + Inspirado em + Referências + Lista privada + + %1$d vídeo + %1$d vídeos + O download do vídeo foi iniciado… Botões do reprodutor de vídeo Vídeo salvo na galeria de vídeos do telefone @@ -4903,15 +5214,875 @@ O serviço Lightning do destinatário em %1$s não está disponível. Foi calculado a partir do endereço Lightning "%2$s". Erro: %3$s. Verifique se o servidor está funcionando e se o endereço Lightning está correto Não foi possível criar uma fatura lightning a partir de %1$s: Elemento pr não encontrado no JSON resultante. Não foi possível criar uma fatura com raios. Mensagem do %1$s: %2$s + Este dispositivo agora recebe seus convites do Marmot. + Falha ao publicar o KeyPackage: %1$s + Nenhum relay aceitou o KeyPackage. Verifique suas configurações de relays e tente novamente. + Enviando… + Não foi possível enviar. Toque para tentar novamente. + + %1$d nova mensagem + %1$d novas mensagens + + Grupo com coordenador + Entregue por um coordenador, não por relays + O que este coordenador pode ver + Um coordenador é um único servidor que transporta todas as mensagens deste grupo, em ordem. É uma troca diferente da dos relays — vale saber disso antes de tratar isto como qualquer outro chat. + Conteúdo das mensagens + Quem está no grupo + Quem envia o quê + Ilegível + Sob uma chave descartável + Vinculado à sua conta real + Detalhes + Coordenador %1$s + Esta não é a mesma exposição de um grupo Marmot, em que nenhum operador sozinho detém a conversa inteira. + Entrar identifica contas reais nas duas pontas, então o coordenador sabe quem está neste grupo. + Uma única chave descartável envia e busca para todos os seus grupos aqui, então o coordenador consegue perceber que todos são seus. + Um único operador detém o histórico completo e ordenado de todos os grupos que transporta. + O pacote de chaves que você publicou é um registro assinado de que esta conta usa cordn, e o coordenador pode entregá-lo a qualquer pessoa. + As mensagens não recebem preenchimento, então o coordenador vê o tamanho de cada uma. + Este cliente não está criptografando para o coordenador. Isso é um bug — por favor, reporte. + Ainda não contatado + Respondendo + Sem resposta + + %1$d tentativa seguida com falha + %1$d tentativas seguidas com falha + + Cole um link cordn1… que alguém compartilhou com você para ver qual coordenador transporta esse grupo e o que esse operador saberia sobre você se você entrasse. + cordn1… + Inspecionar + Colar + Limpar + Isso não é um link de grupo cordn: %1$s + ID do grupo + Coordenador + Acessível por + Este link não indica nenhum coordenador, então não pode ser seguido sozinho. Pergunte a quem o enviou qual coordenador transporta o grupo. + Inspecionar um link não entra em nada, e ter um link não torna você membro. + Link de grupo Cordn + cordn coordenador grupo link convite mls chat metadados privacidade exposição + Coordenadores Cordn + cordn coordenador adicionar remover expurgar saúde servidor mls chat ordenação + Pacotes de chaves Cordn + cordn pacote de chaves publicar convite último recurso coordenador mls + Backup do Cordn + cordn backup restaurar exportar importar senha grupos recuperação + Grupos Cordn + Grupos com criptografia de ponta a ponta, ordenados por um coordenador que você escolhe, em vez de por relays. + Grupo %1$s + Nenhuma mensagem ainda + Grupo Cordn, transportado por %1$s + Mensagem excluída + Mensagem de voz + Foto + Vídeo + Arquivo + Grupo Cordn + Chat em grupo criptografado, ordenado por um coordenador que você escolhe. + Coordenado + Ideal para equipes que querem uma ordem confiável única para a conversa. + Criar grupo Cordn + Criptografia de ponta a ponta com MLS — o coordenador nunca consegue ler uma mensagem. + Uma única ordem acordada para todos, então o histórico não pode ser embaralhado por um relógio errado. + O coordenador fica sabendo quem está no grupo e quando vocês conversam, mesmo sem conseguir ler o que é dito. + Convidado para um grupo cordn? + Ver convites + Cordn + Grupos entregues por um coordenador que você escolhe, em vez de por relays. + Inspecionar um link de grupo + Veja para onde um link cordn1… aponta antes de agir + Sair deste celular + Assumir a partir de outro celular + Pacotes de chaves publicados + O link + Coordenadores que você usa + Anunciando-se + Adicionar manualmente + Senha + Fazer um backup + Restaurar de um backup + O coordenador + Este dispositivo + Coordenadores + Os servidores que transportam seus grupos + Pacotes de chaves + O que permite que as pessoas adicionem você a um grupo + Backup e restauração + Um arquivo criptografado com senha que fica com você + Mudar para um novo celular + Passe seus grupos para o dispositivo que vai substituir este + Mudar para um novo celular + Seus grupos cordn ficam neste dispositivo. Movê-los exige um código: este celular os publica, o novo celular os lê e este celular para. + Primeiro entre com a mesma conta no novo celular. Isto move seus grupos, nunca sua chave. + Iniciar a transferência + Publicando… + Escaneie isto no novo celular + O código é apenas um ponteiro. Quem fotografá-lo não descobre nada — aquilo para que ele aponta está criptografado para você. + Este dispositivo transferiu seus grupos + Ele parou de enviar e receber, porque dois celulares enviando no mesmo grupo o quebrariam para todos nele. Seus grupos continuam neste dispositivo e nada foi excluído. + Retomar este dispositivo + Use isto se a mudança não terminou. Só faça isso se o novo celular ainda não começou a enviar. + Receber de outro celular + Escanear o código + ou cole-o + Trazer os grupos para cá + Buscando… + Isto substitui todos os grupos cordn que já estão neste celular. Eles não podem ser mesclados. + + %1$d grupo movido + %1$d grupos movidos + + Não há grupos cordn neste dispositivo para mover. + Defina primeiro um servidor de mídia — os documentos criptografados precisam de um lugar para ficar enquanto o outro celular os busca. + O que sai deste dispositivo + O estado dos seus grupos é criptografado e enviado ao seu servidor de mídia para que o outro celular possa buscá-lo. Ele é ilegível para esse servidor, que vê apenas um tamanho e um horário. Exclua os blobs depois se não quiser deixar nada para trás. + Objeto 3D + %1$d vértices · %2$d faces + Não foi possível ler este objeto 3D (regra %1$s) + Avatar do Cyberspace + Este avatar não pagou pelo seu tamanho, por isso não é desenhado + Iluminado; toque para desenhar o objeto plano + Plano; toque para iluminar o objeto + 1 unidade = %1$s + Escondido no dataspace · %1$s + Escondido no ideaspace · %1$s + Avatar padrão + Nenhuma forma publicada, então todos veem este + Escondido em um lugar + Escondido em uma caixa de %1$s regiões + Escondido em uma região, que a dica indica exatamente + Sem dica, então pode estar em qualquer lugar do ciberespaço + Fora de alcance: a dica indica 2^%1$d regiões para buscar + Procurar + Parar + Estimando o custo da busca neste dispositivo… + %1$s de %2$s regiões verificadas + + Fora de alcance: cerca de %1$d minuto de busca neste dispositivo + Fora de alcance: cerca de %1$d minutos de busca neste dispositivo + + + Fora de alcance: cerca de %1$d hora de busca neste dispositivo + Fora de alcance: cerca de %1$d horas de busca neste dispositivo + + Não está na caixa que a dica indicou + A região foi encontrada, mas o conteúdo não pôde ser lido + + %1$d item escondido aqui não correspondia à sua assinatura e foi descartado + %1$d itens escondidos aqui não correspondiam às suas assinaturas e foram descartados + + Aberto, e não havia nada dentro + Sem assinatura, então este autor é apenas uma alegação + Um item do kind %1$d, que este cliente não desenha + + %1$d byte de algo que este cliente não lê + %1$d bytes de algo que este cliente não lê + + + Fechar + Copiar link + Localizar + Tamanho do texto + Desktop + Tela inicial + Outro navegador + Tela cheia + Editar endereço + Voltar + Avançar + Recarregar + Parar de carregar + Adicionar aos favoritos + Remover dos favoritos + Compartilhar + Copiar link + Localizar na página + Tamanho do texto + Adicionar à tela inicial + Versão para desktop + Abrir no navegador + Abrir no %1$s + Tela cheia + Você saiu de %1$s + Voltar ao app + Texto menor + Texto maior + Redefinir + %1$d% + Privacidade + Roteamento onion + O site não consegue ver seu endereço IP + O site consegue ver seu endereço IP + Configurações do site + Nada permitido ainda + O que ele pode acessar + Suas chaves nunca saem do Amethyst + Toda assinatura, publicação, envio de arquivo ou pagamento passa pela sua aprovação + Nenhum acesso especial + Ele roda isolado e não pode agir na sua conta + Gerenciar permissões + nSite · isolado + nApplet · isolado + Console + Conexão segura + Não seguro + Roteado via onion + App isolado + Câmera + Microfone + Localização + Perguntar + Permitir + Bloquear + %1$s: %2$s + permitido + bloqueado + Pesquise ou digite um endereço + Ir + Limpar + Colar e ir + Usar este endereço + Localizar na página + %1$d / %2$d + Nenhuma correspondência + Correspondência anterior + Próxima correspondência + Fechar localizar na página + Todos + Erros + Avisos + Copiar + Limpar + Nada registrado ainda + Este site quer usar + Ver o que sua câmera vê + Ouvir o que seu microfone ouve + Saber aproximadamente onde você está + Chamadas podem revelar seu endereço IP mesmo pelo Tor. + Permitir durante a visita + Só desta vez + Não permitir + %1$s diz + Esta página diz + Impedir que esta página mostre mais diálogos + Sua resposta + Sair do site? + As alterações que você fez podem não ser salvas. + Sair + OK + Cancelar + Conexão + A conexão é criptografada + As informações que você envia não podem ser lidas no caminho. + A conexão não é criptografada + Não digite senhas nem dados de pagamento. + Roteado via onion pelo Tor + Web aberta + Certificado + Emitido para %1$s por %2$s · válido até %3$s + Permissões + Cookies e dados do site + Logins e preferências que este site salvou para esta conta + Limpar dados do site + Sair deste site e excluir os dados dele? + Bloquear %1$s de novo + Manter %1$s + Entrar de novo em %1$s + Silenciar %1$s de novo + Restaurar %1$s + Restaurar feeds + Restaurar lugares + Restaurar perfil + Restaurar provedores + Restaurar relays + Restaurar tópicos + Restaurar carteira + Aceitar + + %1$s e adicionou %2$d + %1$s e adicionou %2$d + + + %1$s e bloqueou %2$d + %1$s e bloqueou %2$d + + + %1$s e seguiu %2$d + %1$s e seguiu %2$d + + + %1$s e entrou em %2$d + %1$s e entrou em %2$d + + + %1$s e silenciou %2$d + %1$s e silenciou %2$d + + Suas configurações sincronizadas do Amethyst foram alteradas em outro app que não é o Amethyst. Isso pode causar problemas. + Você esvaziou sua lista do Concord + Você alterou sua lista do Concord + + Você removeu %1$d relay de DM + Você removeu %1$d relays de DM + + + Você removeu %1$d feed favorito + Você removeu %1$d feeds favoritos + + + Você deixou de seguir %1$d pessoa + Você deixou de seguir %1$d pessoas + + + Você deixou de seguir %1$d hashtag + Você deixou de seguir %1$d hashtags + + + Você removeu %1$d relay de indexação + Você removeu %1$d relays de indexação + + + Você removeu %1$d relay de chaves de chat em grupo + Você removeu %1$d relays de chaves de chat em grupo + + + Você saiu de %1$d chat público + Você saiu de %1$d chats públicos + + + Você saiu de %1$d comunidade + Você saiu de %1$d comunidades + + + Você saiu de %1$d grupo + Você saiu de %1$d grupos + + + Você saiu de %1$d sala de chat + Você saiu de %1$d salas de chat + + + Você deixou de silenciar %1$d item + Você deixou de silenciar %1$d itens + + + Você removeu %1$d relay público + Você removeu %1$d relays públicos + + Você removeu sua chave de nutzap + Você substituiu sua chave de nutzap + + Você removeu %1$d mint de nutzap + Você removeu %1$d mints de nutzap + + + Você removeu %1$d oferta BOLT12 + Você removeu %1$d ofertas BOLT12 + + + Você removeu %1$d forma de receber pagamentos + Você removeu %1$d formas de receber pagamentos + + + Você deixou de seguir %1$d lugar + Você deixou de seguir %1$d lugares + + + Você removeu %1$d relay privado + Você removeu %1$d relays privados + + + Você removeu %1$d campo do perfil + Você removeu %1$d campos do perfil + + + Você removeu %1$d feed de relay + Você removeu %1$d feeds de relay + + + Você removeu %1$d relay de busca + Você removeu %1$d relays de busca + + + Você trocou o provedor de %1$d serviço de confiança + Você trocou o provedor de %1$d serviços de confiança + + + Você deixou de confiar em %1$d relay + Você deixou de confiar em %1$d relays + + + Você desbloqueou %1$d relay + Você desbloqueou %1$d relays + + Você esvaziou sua carteira Cashu + Você alterou sua carteira Cashu + Adicionados (%1$s) + Alterados (%1$s) + Adicionados: %1$s + Alterados: %1$s + Removidos: %1$s + Usar a nova versão + Você adicionou itens privados (criptografados). + Você também alterou itens privados (criptografados). Eles não podem ser comparados aqui. + Você removeu todos os itens privados (criptografados). + somente leitura + leitura e escrita + somente escrita + Removidos (%1$s) + Restaurar a versão salva + Alterado em outro app: %1$s + Feeds + Salas de chat + Comunidades + Hashtags + Identidades vinculadas + Localizações + Mints + Chaves de nutzap + Ofertas + Outras entradas + Endereços de pagamento + Pessoas + Campos do perfil + Chats públicos + Relays + Grupos + Threads + Provedores de confiança + Palavras + Sobre + Banner + Aniversário + Marcação de bot + Oferta CLINK + Nome de exibição + LNURL + Endereço Lightning + Nome de usuário + Endereço Nostr + Foto + Pronomes + Site + Permitido + Alterado em outro app · %1$s + Suas comunidades Concord são criptografadas para você, por isso não podem ser comparadas aqui. A restauração devolve exatamente o que este dispositivo salvou. + Movido + Removidos: %1$s + Removido + Você criou + Você alterou + Você esvaziou + Feed + Removido + Hashtags que você segue + Caixa de entrada + onde os outros encontram você + entradas + mantidos + Mantidos: %1$s + Chave de recebimento removida + Chave de recebimento substituída + Os nutzaps ficarão bloqueados para esta nova chave. Se este dispositivo não a tiver, talvez você não consiga resgatá-los aqui. + saídas + Saiu + Listado + Movido + %1$s e mais %2$s + Nova versão + Novos: %1$s + novos + Novo + Bloqueados agora + Silenciados agora: %1$s + Não mais bloqueados + Não definido + Nada aqui + Oferta BOLT12 + + %1$d oferta removida + %1$d ofertas removidas + + Caixa de saída + onde você publica + + %1$d forma de pagar você removida + %1$d formas de pagar você removidas + + Quem paga você só vê o que está nesta lista. + lugares removidos + Lugares que você segue + Agora eles estão criptografados, e provavelmente foi para lá que os itens públicos acima foram. + Você tornou itens privados + Eles são criptografados, por isso não podem ser comparados aqui. + Você alterou itens privados + Eles são criptografados, então só você pode ver o que eram. A restauração traz todos de volta. + Você removeu todos os itens privados + Recebimento + renomeados + Renomeado + Neste dispositivo + + Pesquisar %1$s pessoa + Pesquisar entre %1$s pessoas + + Busca + Serviço + Seguidores + Classificação + Tópicos + + %1$s de %2$s serviço alterado + %1$s de %2$s serviços alterados + + Agora eles vêm de outra pessoa, ou de ninguém + Ainda bloqueados + Armazenamento + Removidos · %1$s + Editados · %1$s + Novos · %1$s + %1$s: tudo removido + %1$s: atualização + tópicos removidos + As classificações, as contagens de seguidores e o filtro de spam que você vê vêm desses provedores. + Confiável + Desbloqueados: %1$s + O Amethyst vai se conectar a eles novamente + Unidades + Não silenciados: %1$s + Eles podem voltar a aparecer nos seus feeds + Não confiável + Os mints e as chaves da sua carteira são criptografados para você, por isso não podem ser comparados item a item aqui. A restauração devolve exatamente o que este dispositivo salvou. + antes: “%1$s” + Palavras e hashtags + configurações sincronizadas do app + Configurações do Amethyst sincronizadas entre seus dispositivos. Elas são criptografadas, então só é possível comparar se existem. + lista de relays bloqueados + Relays aos quais este app nunca se conecta. + ofertas BOLT12 + As ofertas Lightning que os outros usam para pagar você. + carteira Cashu + As configurações e os mints da sua carteira de ecash. Eles são criptografados, então só é possível comparar se existem. + lista de comunidades + As comunidades em que você entrou. + lista de comunidades Concord + As comunidades Concord em que você entrou. Elas são criptografadas, então só é possível comparar se existem. + lista de relays de DM + Onde os outros entregam suas mensagens privadas. + lista de chats efêmeros + As salas de chat efêmeras em que você entrou. + lista de feeds favoritos + Os feeds algorítmicos que você salvou. + lista de seguidos + Define de quem são as publicações que aparecem no seu feed inicial. + localizações seguidas + Localizações cujas publicações aparecem nos seus feeds. + hashtags seguidas + Hashtags cujas publicações aparecem nos seus feeds. + lista de relays de indexação + Os relays usados para encontrar perfis e listas de relays de outras pessoas. + relays de chaves de chat em grupo + Onde os outros encontram as chaves para adicionar você a chats em grupo criptografados. + lista de silenciados + Oculta pessoas, palavras, hashtags e threads de tudo o que você vê. + configurações de recebimento de nutzap + Os mints e a chave que os outros usam para enviar nutzaps para você. + lista + Uma lista salva neste dispositivo. + lista de relays públicos + Informa a todos onde encontrar suas publicações e para onde enviar respostas e menções a você. + endereços de pagamento + As formas pelas quais outras pessoas podem pagar você. + lista de relays privados + Onde seus rascunhos e dados privados são armazenados. + perfil + Seu nome, foto, bio e endereços de pagamento, como todos os veem. + lista de chats públicos + Os chats públicos em que você entrou. + feeds de relays favoritos + Os relays que você navega como feeds. + lista de grupos + Os grupos baseados em relays em que você entrou. + lista de relays de busca + Os relays usados quando você pesquisa. + lista de provedores de confiança + Os serviços em que você confia para classificar e verificar pessoas para você. + lista de relays confiáveis + Relays em que você confia para se conectar sem perguntar. + Excluir + Editar + Editando sua mensagem + Ir para a mensagem + Fixar + Responder + Desafixar + Não foi possível fazer essa alteração. + O coordenador não respondeu, então nada foi alterado. Tente novamente em instantes. + %1$s não publicou um pacote de chaves neste coordenador, então ainda não pode ser adicionado. Peça que abra o cordn neste coordenador primeiro. + Você não pode remover a si mesmo de um grupo cordn. + Não foi possível dar a %1$s um meio de entrar no grupo, então a adição foi cancelada. + %1$s não está neste grupo. + Essa pessoa + Este coordenador forneceu um pacote de chaves que pertence a outra pessoa, então %1$s não foi adicionado. Nada foi alterado. + As chaves de criptografia dos seus grupos, seus pacotes de chaves e todas as mensagens desses grupos. Qualquer pessoa que abrir o arquivo pode ler as conversas. A senha é a única coisa que o protege depois que ele sai do Amethyst. + O que há no arquivo + Sua nsec não recupera grupos cordn. Um grupo cordn existe como estado de criptografia neste dispositivo e como um fluxo ordenado em um coordenador que não consegue lê-lo — perca o dispositivo sem um backup e o grupo se vai, incluindo tudo o que já foi dito nele. + Exportar + Backup salvo. + Não funcionou. Verifique a senha e o arquivo. + Senha + Restaurar + Restaurar substitui os grupos cordn deste dispositivo pelos do arquivo. Serve para um celular que substituiu outro — não é uma forma de usar os mesmos grupos em dois dispositivos ao mesmo tempo. + Todos os grupos cordn atualmente neste dispositivo serão removidos e substituídos pelos do arquivo.\n\nNão restaure em um segundo celular enquanto o primeiro ainda estiver em uso. Ambos teriam as mesmas chaves de grupo e, assim que os dois enviarem uma mensagem, o grupo quebra para todos — silenciosamente e sem volta. + Substituir os grupos cordn deste dispositivo? + Restaurar + Restaurado. + Tudo o que for enviado aqui é criptografado para este grupo. O coordenador repassa as mensagens sem conseguir lê-las. + Nenhuma mensagem ainda + Novas mensagens + Ontem + Mensagem + Adicionar + Não foi possível abrir esse coordenador. + Copiar a npub do coordenador + Procurar coordenadores + Adicionar + Lê anúncios que seus relays já transportam. Nenhum coordenador é contatado, então nenhum deles fica sabendo que você procurou. + Não foi possível ler os anúncios + Ninguém está se anunciando nos seus relays. + Anunciado há %1$s + Último anúncio: %1$s + + Nada encontrado, e %1$d dos seus relays não respondeu. + Nada encontrado, e %1$d dos seus relays não responderam. + + Um coordenador ordena as mensagens de um grupo e é o único que pode fazer isso. Perdê-lo significa perder a ordenação, e um segundo coordenador não espelha o primeiro — por isso são escolhas nomeadas por você, não relays intercambiáveis. + + Sem resposta — %1$d chamada seguida falhou. Os grupos nele não estão sincronizando. + Sem resposta — %1$d chamadas seguidas falharam. Os grupos nele não estão sincronizando. + + Respondendo. + Uma chamada falhou; tentando novamente. + Nada foi solicitado a ele ainda. + Ocultar os que pararam de se anunciar + Perguntar quem é + Chave do coordenador + Um nome para ele (seu, opcional) + Este nome é seu e fica neste dispositivo. Um coordenador não pode comprovar um nome, então nunca é solicitado um. + Mais ações + Nenhum coordenador ainda. + Expurgar + Remover mantém os grupos neste dispositivo, então adicionar o coordenador de volta os traz junto. Expurgar os exclui: as chaves dos grupos, as posições de leitura e seus pacotes de chaves são apagados, e esses grupos só podem ser reabertos com um novo convite.\n\nO coordenador não é avisado e mantém tudo o que já tinha. + Expurgar este coordenador? + %1$s + Responde em + %1$s +%2$d mais + Remover + Renomear + Diz ser: %1$s + O nome e a versão de um coordenador são textos escolhidos por ele. A chave pública é a única coisa que o identifica. + Respondeu, mas não informou nenhum nome. + Mostrar todos os %1$d + Mostrar menos + + Mostrar %1$d que parou de se anunciar + Mostrar %1$d que pararam de se anunciar + + Estes não se anunciam há mais de um mês. Criar um grupo em um que tenha sumido vai falhar. + Criar grupo + + Criar e convidar %1$d pessoa + Criar e convidar %1$d pessoas + + Adicionar alguém + Admin + + %1$d pessoa pode adicionar e remover + %1$d pessoas podem adicionar e remover + + Só eu gerencio este grupo + Só você pode convidar, remover membros ou alterar os detalhes do grupo. Você pode passar isso para outra pessoa depois. + Coordenador + Alterar + Encontrar coordenadores + Concluído + Outro coordenador + Chave pública do coordenador (hex ou npub) + Relays em que ele responde, um por linha + + Alcança a %1$d pessoa escolhida + Alcança todas as %1$d pessoas escolhidas + + Alcança %1$d de %2$d — as demais ficariam de fora + Não verificado — escolhê-lo fará a consulta + Descrição (opcional) + Todos podem adicionar e remover + Todos no grupo podem convidar, remover membros e alterar os detalhes. Qualquer membro pode nomear admins depois, o que encerra esse modo. + Um grupo cordn é ordenado por um coordenador que você escolhe. A criação do grupo acontece neste dispositivo — o coordenador só fica sabendo que o grupo existe quando você convida alguém ou envia uma mensagem. + Não foi possível criar o grupo. + Nome do grupo + Nenhum coordenador escolhido + Cada convite é um Welcome deixado no coordenador, então eles podem falhar um a um. Ninguém foi notificado: as pessoas verão o convite na próxima vez que abrirem o app. + O coordenador recusou o convite + Enviar um link + Adicionado ao grupo, mas o convite não chegou — tente novamente pela tela do grupo + Abrir o chat + Sem chave aqui, então nenhum Welcome pôde ser deixado + O grupo foi criado + Aguardando a pessoa + Concluído + Ninguém adicionado ainda. Um grupo pode ser criado vazio e os convites enviados depois, mas indicar as pessoas agora é o que mostra qual coordenador consegue alcançá-las. + Ninguém ainda — toque para adicionar pessoas + Indicar as pessoas agora é o que nos diz qual coordenador consegue alcançá-las. Cada uma recebe um Welcome deixado nesse coordenador, que ela recebe na próxima vez que abrir o app. + + Alcançável em %1$d coordenador + Alcançável em %1$d coordenadores + + Sem chave em nenhum coordenador que você usa + Ainda não verificado + Quem pode adicionar e remover + Dê um nome + Quem participa + Onde ele fica + Novo grupo Cordn + + %1$d pessoa não pode ser alcançada por nenhum coordenador que você usa + %1$d pessoas não podem ser alcançadas por nenhum coordenador que você usa + + Você, sempre admin + Todos no grupo verão esta mensagem como retirada, e o Amethyst deixará de mostrar o texto. O coordenador ainda guarda a cópia criptografada que foi enviada, e quem já a leu, já leu. + Retirar mensagem + Aceita pelo coordenador + Entendi + O que este coordenador pode ver + Informações do grupo + Este grupo não está disponível. O coordenador dele pode ter sido removido. + Adicione um coordenador nas Configurações para começar a usar grupos cordn. + + %1$d grupo + %1$d grupos + + Nada está chegando destes grupos. O Amethyst continua tentando. + Coordenadores + Nenhum grupo cordn ainda + Um grupo cordn fica em um coordenador que guarda a lista de membros e repassa as mensagens, sem nunca ver o que alguém escreve. + Criar um + Adicionar alguém + Ninguém encontrado com esse nome. + Só é possível adicionar quem publicou um pacote de chaves neste coordenador. + Nome, npub ou nome@domínio + Admin + + O %1$d admin do grupo continua como está. + Os %1$d admins do grupo continuam como estão. + + Coordenador + Chave do coordenador + Link do coordenador + Copiar o nprofile do coordenador + Editar detalhes + Este grupo não tem admins: todos podem adicionar, remover e renomear, permanentemente. + Época + ID do grupo + Pode ser adicionado neste coordenador + Membros + %1$s deixa de receber as mensagens daqui. A pessoa mantém o que já leu, e isso não pode ser desfeito — ela teria de ser convidada novamente. + Remover do grupo? + Remover + Salvar + Detalhes técnicos + Entrar + Recusar + Recusar é permanente. Para voltar, será preciso ser convidado novamente. + Verificado quando você abre esta tela, e em nenhum outro momento — perguntar a um coordenador se alguém convidou você revela a ele que você está aqui, por isso o Amethyst não faz isso em segundo plano. + Não foi possível ler os convites. + + %1$d pessoa já está neste grupo + %1$d pessoas já estão neste grupo + + +%1$d mais + Você não tem nenhum coordenador aberto. Os convites do cordn chegam por um coordenador, então ainda não há onde procurar. + Nenhum convite pendente. + Verificar novamente + Um convite foi deixado para outro dispositivo + Convites Cordn + %1$s não respondeu + Por %1$s + Publicar assina um registro com a chave da sua própria conta. Esse coordenador passa a saber que esta conta existe e pode ser convidada — permanentemente, e quer alguém convide você ou não. + Outras pessoas só podem adicionar você a um grupo cordn usando um pacote de chaves que você publicou nesse coordenador. O cordn não tem outro lugar para guardá-lo, então sem nenhum publicado ninguém pode convidar você — e nada diz a elas o porquê. + Não foi possível ler os pacotes de chaves. + Nenhum pacote de último recurso. Quando os de uso único acabarem, os convites falharão. + Um pacote de último recurso está publicado, então ainda é possível convidar você quando os de uso único acabarem. + + %1$d pacote que este dispositivo não consegue abrir + %1$d pacotes que este dispositivo não consegue abrir + + O coordenador entregará estes pacotes a quem for convidar você, mas a metade privada não está neste dispositivo — ela pertence a outra instalação. Se essa instalação não existir mais, um convite que use um deles gera um Welcome que ninguém jamais conseguirá abrir. + Publicar um + Publicar de último recurso + + %1$d pacote de uso único disponível. + %1$d pacotes de uso único disponíveis. + + Depois que você publicar aqui, o Amethyst repõe discretamente os pacotes conforme forem usados. Ele nunca publica o primeiro por você. + Retirar todos + Retirar esses + Pedir para entrar neste grupo + Isto publica um pacote de chaves com a chave da sua própria conta e informa ao coordenador que você quer entrar neste grupo — quer alguém responda ou não. + Não foi possível pedir para entrar. + Pedido enviado. Um membro do grupo precisa adicionar você; o convite aparecerá em Convites Cordn. + Escanear + Não foi possível abrir esse arquivo. + Nenhum servidor de mídia está definido para esta conta, então não há onde colocar o arquivo. Escolha um nas Configurações. + Não foi possível ler esse arquivo. + Não foi possível enviar esse arquivo. + + %1$d membro + %1$d membros + + Mensagem excluída + Coordenador + Cursor + Enviada + Detalhes da mensagem + editada + Fixada por %1$s + + %1$d mensagem fixada neste grupo + %1$d mensagens fixadas neste grupo + + Próxima mensagem fixada + Mensagem fixada anterior + Mostrar todas as mensagens fixadas + Mensagens fixadas + Reações + Adicionar + Só um admin pode aceitar. Em um grupo sem admins, isso vale para todos. + Verificar pedidos + Dispensar + Não foi possível ler os pedidos. + Ninguém está esperando para entrar. + Pedidos para entrar + Enviar + Não foi enviada. + O coordenador deste grupo não está aberto, então ainda não é possível enviar nada. + Copiado + Copiar link + Qualquer pessoa com este link pode pedir para entrar. Um admin ainda precisa aceitá-la. + Compartilhar este grupo + Reproduzir mensagem de voz + Gravar uma mensagem de voz + Parar e enviar diff --git a/commonsUI/src/commonMain/composeResources/values-pt-rPT/strings.xml b/commonsUI/src/commonMain/composeResources/values-pt-rPT/strings.xml index 59160a86cc..5225a9ebf9 100644 --- a/commonsUI/src/commonMain/composeResources/values-pt-rPT/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-pt-rPT/strings.xml @@ -2913,4 +2913,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-ru-rRU/strings.xml b/commonsUI/src/commonMain/composeResources/values-ru-rRU/strings.xml index 96f76212ad..85e7e02487 100644 --- a/commonsUI/src/commonMain/composeResources/values-ru-rRU/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-ru-rRU/strings.xml @@ -3000,4 +3000,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-ru-rUA/strings.xml b/commonsUI/src/commonMain/composeResources/values-ru-rUA/strings.xml index 5967ec2f30..a9cb955bbe 100644 --- a/commonsUI/src/commonMain/composeResources/values-ru-rUA/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-ru-rUA/strings.xml @@ -2981,4 +2981,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-sl-rSI/strings.xml b/commonsUI/src/commonMain/composeResources/values-sl-rSI/strings.xml index 8a735323ae..9f7b4ef715 100644 --- a/commonsUI/src/commonMain/composeResources/values-sl-rSI/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-sl-rSI/strings.xml @@ -5000,4 +5000,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-sr-rSP/strings.xml b/commonsUI/src/commonMain/composeResources/values-sr-rSP/strings.xml index 4e4fa8e036..c7b1d4b59c 100644 --- a/commonsUI/src/commonMain/composeResources/values-sr-rSP/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-sr-rSP/strings.xml @@ -2958,4 +2958,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-sv-rSE/strings.xml b/commonsUI/src/commonMain/composeResources/values-sv-rSE/strings.xml index 12b03e46cc..05544e3d76 100644 --- a/commonsUI/src/commonMain/composeResources/values-sv-rSE/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-sv-rSE/strings.xml @@ -166,6 +166,152 @@ Trafikstockning Väghändelse + Geocache + Traditionell + Multicache + Mystery + Mikro + Liten + Normal + Stor + Annan storlek + D%1$d + T%1$d + Först att hitta (FTF) + Konstverk + Key Quest + Verifierade fynd + Tagen + Arkiverad + Kört fast? Tryck för att visa ledtråden + Går den inte att läsa? Tryck för den andra versionen + I närheten + Hittad! + Verifierat fynd + Beviset stämmer inte + Läser in cache… + Gömd av %1$s + Navigera + Kopiera koordinater + Koordinater kopierade + Foton + Key Quest-uppdrag + Loggar + Ingen har loggat den här cachen ännu. Bli först. + Jag hittade den + Hittade den inte + Lägg till en anteckning + Rapportera behov av underhåll + Lägg till i en jakt + Ny jakt… + Du har inte skapat någon jakt ännu. + Redan med i den här jakten + + %1$d cache här + %1$d cacher här + + Ta bort det här fotot + Den här cachen har arkiverats. Den är inte längre i spel. + FTF tagen av %1$s + FTF är fortfarande ledig + Ägare + Redigera den här cachen + Arkivera den här cachen + Arkivera den. Hittare ser att den är ur spel, och beskrivningen går fortfarande att läsa. + Lås den första hittaren + Publicerar en F-tagg som anger %1$s. Detta är permanent. + Inga verifierade fynd ännu, så det finns ingen att låsa. + Visa verifieringskoden + Skriv ut den och lägg den i cachen. Amethyst sparar den inte — om du tappar bort den kan hittare inte längre bevisa att de var där. + Hittade inte (DNF) + Anteckning + Behöver underhåll + Logga ett fynd + Cache + Din logg + Hur gick det? + Lägg till ett foto + Ditt Key Quest-svar + Bevis på närvaro + Skanna koden i cachen + Skanna en annan kod + Verifierat — du var vid cachen + Signeras en gång med koden i lådan. Nyckeln sparas aldrig och lämnar aldrig den här skärmen. + Det där är ingen verifieringskod. + Den koden hör till en annan cache. + Den här cachen kräver inget bevis, så du kan logga den direkt. + Din egen plats bifogas inte till den här loggen. + Publicera + Lägg till en logg + I närheten + Karta + Jakter + Fynd + Mina + Ej hittade + D ≤ %1$d + T ≤ %1$d + Har ett pris + Bevis krävs + Använd min plats + Sorterat efter avstånd + Nyaste först + Göm en cache + Inga cacher här ännu. Prova en bredare följlista, eller göm den första. + Du har inte loggat något fynd ännu. + Du har inte gömt någon cache ännu. + Inga jakter ännu. + Fynd + FTF + Verifierade + Gömda + Centrera på mig + Tryck länge på kartan för att gömma en cache där + Öppna + Var + Vad + Extra + Bevis + Reläer + Detta publicerar en offentlig plats med cirka 5 meters noggrannhet. Alla på Nostr kan se den, och en publicerad händelse kan inte återkallas. + Välj platsen + Publicerar %1$s, plus grövre celler ned till 3 tecken för närhetssökning. + Namn + Beskrivning + Typ + Storlek + Svårighetsgrad + Terräng + Ledtråd + Hittare kommer att se + Kryptera ledtråden (ROT13) + Key Quest-uppdrag + Tillägg + Kräv bevis på närvaro + En verifieringsnyckel har skapats för den här cachen. + Var hittare ska logga + Publicera + Ge cachen ett namn. + Välj var cachen är gömd. + %1$d av %2$d hittade + Starta jakten + + %1$d cache + %1$d cacher + + Titel + Beskrivning + Bannerbild + Cacher, i ordning + Lägg till en cache + Flytta upp + Flytta ned + Ta bort + Sidtema + Kartstil + Ge jakten en titel. + Lägg till minst en cache. + Kunde inte publicera. Kontrollera reläanslutningen och försök igen. Zaps till detta fördelas mellan: %1$d%% Värde -för-värde @@ -188,6 +334,51 @@ Profil Banner Peka mot QR-koden + Amethyst behöver kameran för att skanna QR-koder. Inget spelas in eller laddas upp — bilderna avkodas på enheten och kastas sedan. + Tillåt kamera + Kameraåtkomst är avstängd för Amethyst. Du kan slå på den igen i Androids inställningar. + Öppna inställningar + QR-avkodaren kunde inte starta på den här enheten. Du kan fortfarande klistra in koden som text. + Tänd lampan + Släck lampan + Det är mörkt — prova lampan + Skanna en bild + Klistra in + Ingen QR-kod hittades i bilden + Det finns inget i urklipp att skanna + Tryck på koden du vill ha + + Fångade %1$s av %2$s del — fortsätt + Fångade %1$s av %2$s delar — fortsätt + + Återställ zoom + Amethyst kan inte öppna den här koden + Den här koden innehåller en privat nyckel eller en parningshemlighet, så innehållet visas inte här. Använd skärmen som förväntar sig den. + Det här är en privat nyckel. Klistra in den på inloggningsskärmen i stället. + Det här är en plånboksanslutning. Lägg till den under Plånboksinställningar. + Det här är en fjärrsignatäradress. Amethyst delar ut sådana så att andra appar kan be den signera — den kan inte logga in med en. + Det här är en app som vill ansluta till din signatär. Öppna den från NIP-46-signatärskärmen. + Det här är en Lightning-faktura. + Det här är en Cashu-token. + Det här är en webblänk. + Det här är vanlig text, inte en Nostr-kod. + Det här är en Nostr-kod, men inte en som den här skärmen kan öppna. + Profil + Anteckning + Nostr-kod + Relä + Privat nyckel + Plånboksanslutning + Fjärrsignatäradress + Anslutningsbegäran till signatär + Lightning-faktura + Cashu-token + Webblänk + Vanlig text + Öppna länk + Kopiera + Kopierat + Skanna igen Visa QR Profilbild Din profilbild @@ -634,17 +825,70 @@ Timmar Minuter Sekunder + Använd träningspassen du redan har registrerat + Anslut Health Connect (Samsung Health, Google Fit, Fitbit, Garmin…) för att bygga Min träning, din egen träningssammanfattning, och för att fylla i det här passet från ett som din klocka redan har registrerat i stället för att skriva in varje siffra för hand. Anslut %1$s km Från Health Connect Vad Amethyst läser Health Connect och Amethyst + Amethyst använder Health Connect för att bygga Min träning — din egen träningssammanfattning, på din telefon. + Min träning (meny → Du → Min träning) visar hur du har tränat: hur mycket du gjorde den här veckan jämfört med förra, hur din tid fördelas mellan löpning, cykling, promenader, simning och gym, dina bästa prestationer, hur många dagar du tränade och din nuvarande svit. Amethyst bygger den bilden från träningspassen som din klocka eller träningsapp redan har sparat i Health Connect, tillsammans med pass du har loggat i Amethyst. Allt räknas ut på din telefon och visas för dig. Vad Amethyst läser och varför + Träning · vilken aktivitet du utförde, när den började och hur länge den varade. Det här är själva passet: det styr antalet pass, din träningstid, uppdelningen per aktivitet, dina aktiva dagar och din svit. + Distans · hur långt du tog dig, visat som din distans den här veckan jämfört med förra, ditt veckosnitt, din distans per aktivitet och din längsta distans. + Aktiva och totala kalorier · energin ett pass förbrände, visat som din energi den här veckan och hur den står sig mot förra veckan. Aktiva kalorier används när din källa registrerar dem; totala kalorier används som reserv för källor som bara registrerar total energi. + Puls · genomsnitt och maxvärde för varje pass, sammanslaget till din genomsnittliga och högsta puls för perioden. Det är så du skiljer en lätt vecka från en tuff med samma distans. + Steg · antalet steg under en löptur, promenad eller vandring, visat som ditt veckosnitt för steg och ditt högsta antal steg. + Höjdmeter · hur mycket du klättrade, visat som ditt veckosnitt för stigning och din största stigning. Det är det som skiljer en platt vecka från en kuperad. Vad Amethyst inte gör + Läser bara träningspass från de senaste 4 veckorna, och bara medan Min träning eller passredigeraren är öppen. Läser aldrig i bakgrunden. Skriver aldrig något till Health Connect och begär aldrig din träningsrutt, plats eller någon annan typ av hälsodata. + Skickar aldrig dina hälsodata någonstans. Min träning räknas ut på din telefon och stannar där. Om du senare vill publicera ett pass trycker du på Dela för det passet, läser inlägget som Amethyst fyllt i och publicerar det själv — ett pass i taget, aldrig automatiskt. + Hela funktionen är valfri. Återkalla behörigheterna i Health Connect när som helst — Min träning går då tillbaka till sin uppmaning — eller stäng av förslagen i redigeraren under Inställningar → Skrivinställningar. Resten av Amethyst fortsätter att fungera. Läs hela integritetspolicyn + Min träning + Senaste 4 veckorna + Läser in distans, kalorier och puls… + De senaste fyra hela veckorna av din träning: passen du har publicerat, plus allt Health Connect registrerar på den här telefonen. Amethyst räknar ut sammanfattningen på enheten och publicerar ingenting av den. + Den här veckan + jämfört med förra veckan + Veckosnitt + Pass + Aktiva dagar + Dagar i rad + Tid + %1$d h %2$d min + %1$d min + %1$d s + Distans + Kalorier + Steg + Stigning + Snittpuls + Maxpuls + Per aktivitet + Bästa prestationer + Längsta distans + Längsta pass + Största stigning + Flest steg + Högsta puls + Senaste passen + Inget loggat de senaste 4 veckorna. Pass du publicerar, och de som din klocka registrerar, visas här. + Följ din träning + Anslut Health Connect för att se dina veckosummor, utvecklingen vecka för vecka, bästa prestationer och träningssvit. Allt stannar på din telefon. + Anslut Health Connect för att lägga till passen din klocka registrerar, med puls, steg och stigning. + Anslut + Dela det här passet + bpm + kcal + km + mi + m + ft Inga nSites hittades ännu. Ladda om Den inbyggda webbläsaren kräver Android 11 eller senare. @@ -1080,6 +1324,8 @@ Stängningsdatum och tid Omröstningen stänger om %1$s Letar efter Event %1$s + Läser in + Väntar på att dina privata meddelanden ska läsas in… Skicka Zap Lägg till ett offentligt meddelande Lägg till ett privat meddelande @@ -1219,6 +1465,8 @@ + %1$02d:%2$02d + %1$d:%2$02d:%3$02d Avvisa Byt kamera Röstsamtal @@ -1353,6 +1601,14 @@ Användarinställningar Sök inställningar Inga inställningar hittades för ”%1$s” + Gruppen uppdaterad + Bilaga + Meddelande + %1$s: %2$s + Skapa en grupp + Marmot-inbjudningar går till en annan enhet och kan inte öppnas här. + Avfärda + Publicera från den här enheten Återställa Marmot-tillstånd? Detta tar permanent bort alla Marmot-gruppchattar, meddelandehistorik och MLS-nycklar på den här enheten för det aktuella kontot. Deltagare meddelas inte och kan fortfarande se dig i grupper tills de bekräftar nästa gång. Detta går inte att ångra. Ett nytt KeyPackage publiceras nästa gång appen synkroniseras. Återställ @@ -1623,6 +1879,7 @@ Inga transaktioner matchar detta filter Laddar… Mottagen + Öppna zappad anteckning Skickad Uppdatera Alla @@ -1939,6 +2196,8 @@ Spela upp videon i ett flytande fönster (dolt om det inte stöds) Casta till enhet Skicka videon till en Chromecast-mottagare på ditt Wi-Fi (dolt för lokala filer) + Undertexter + Slå på eller av undertexter (dolt när videon saknar sådana) Välj animeringen som visas när ljudanteckningar spelas upp. Av Spektrumstaplar @@ -2626,6 +2885,7 @@ Du uppfyller inte den här gemenskapens krav på förtroendenät. Det senaste dokumentet med gemenskapsregler avvisades som föråldrat. Marmot-grupper + Cordn-grupper Skapa grupp Skapa Marmot-grupp En ny MLS-grupp kommer att skapas. Du kan lägga till medlemmar efteråt. @@ -2917,13 +3177,18 @@ Meddelar dig när någon svarar på ditt inlägg Svar Nya svar + Inte skickat Svara + Försök igen + Skickar… + Skickar fortfarande… Meddelar dig när någon repostar ditt inlägg %1$s repostade ditt inlägg Reposter Nya reposter Aviseringar när ett schemalagt inlägg publiceras eller misslyckas att publicera. Schemalagda inlägg + Det här kontot har tagits bort från Amethyst. Meddela dig när någon zappar dig %1$s sats till %1$s @@ -3124,6 +3389,10 @@ Ljud på Callback URL hittades inte från %1$s's svar Avbryt + Av + Stäng av undertexter + Slå på undertexter + Undertexter Cashu Token Kontrollerar minten… Kunde inte lösa in Cashu @@ -3600,10 +3869,12 @@ Äventyrsprolog Äventyrsläsning Äventyrsscen + Applista Apprekommendationer Möte Appar OSA för möte + Artikellista Ljudhuvud Ljudspår Skapade poddar @@ -3616,6 +3887,7 @@ Blossom-autentisering Blossom-servrar Bokmärkeslista + Bokmärkessamling Broadcast-relayer Kalender Kanaldefinition @@ -3653,6 +3925,7 @@ Emoji-paket Tillfällig chatt Tillfälliga chattrum + Favoritflöden Favoritpoddar Favoritrelayer Filhuvuden @@ -3661,28 +3934,36 @@ Följ-paket Geohash-följer Presentinslagningar + Git-författare Git-ärende Git-patch Pull Request PR-uppdatering Git-svar Git-repository + Git-förråd Git-status: Tillämpad Git-status: Stängd Git-status: Utkast Git-status: Öppen + Betrodda wikiförfattare + Betrodda wikireläer Följda hashtaggar Höjdpunkter HTTP-autentisering Indexrelälista + Intressen Livechattar Livesändningar + Mediaföljningar + Startpaket för media Medicinska data Mötesrum Mötesutrymme Musikspellista Musikspår Tystnadslista + Tystat för typ %1$s Namngivna bokmärken Nests-servrar NIP @@ -3697,6 +3978,7 @@ Outbox relayer Betala till Personlistor + Bildlista Bilder Nålar Poddavsnitt @@ -3723,6 +4005,7 @@ Sökreläer Shorts Shorts (svar) + Grupper Torrentkommentarer Torrenter Betrodda leverantörer @@ -3731,7 +4014,10 @@ Användarinställningar Användarstatus Video + Videosamarbete + Videolista Video (svar) + Videoundertexter Röstmeddelande Röstsvar Väckning @@ -3768,6 +4054,8 @@ Ändra plats på kartan Platskanaler Välj en plats på kartan + Amethyst för Android kan inte logga in med en bunker://-adress. Den delar ut sådana så att andra appar kan be den signera, men den kan inte logga in med en. Använd en extern signatärapp eller Amethyst Desktop. + Det där är en app som vill ansluta till din signatär, inte ett sätt att logga in. Logga in först och öppna den sedan från NIP-46-signatärskärmen. Logga in med en privat nyckel för att kunna boosta inlägg Logga in med en privat nyckel för att kunna följa Du använder en offentlig nyckel, och offentliga nycklar är endast läsbara. Logga in med en privat nyckel för att kunna dölja ett ord eller en mening @@ -3858,6 +4146,7 @@ Tysta aviseringar Ljud avstängt. Klicka för att ta bort ljudlöst Mina Blossom-filer + Min träning Mina listor Namn är obligatoriskt %1$dms @@ -4121,6 +4410,7 @@ Fjärrsignatärapp Fjärrsignatär + Den här listan har privata medlemmar som bara dess skapare kan se %1$d tillgång paketerad %1$d tillgångar buntade @@ -4651,12 +4941,21 @@ Kalendrar Schack Upptäck + Redigera cache + Redigera jakt + Cache + Jakt + Cachejakter + Geocacher Hem Importera följare + Logga ett fynd Media Meddelanden Spellistor Musik + Göm en cache + Ny jakt Aviseringar Avsnitt Poddar @@ -4844,6 +5143,18 @@ Begäran om försvinnande skickad Bättre kvalitet med mindre filstorlek, men inte alla enheter stöder H.265-uppspelning. Använd H.265/HEVC-codec + Accepterade ett samarbetsomnämnande + Avböjde ett samarbetsomnämnande + Omnämnande accepterat + Ljud från + Med + Inspirerad av + Referenser + Privat lista + + %1$d video + %1$d videor + Nedladdning av video har startat… Videospelarens knappar Videon sparad i telefonens videogalleri @@ -4903,15 +5214,875 @@ Mottagarens Lightning-tjänst på %1$s är inte tillgänglig. Den beräknades från Lightning Address "%2$s". Fel: %3$s. Kontrollera om servern är uppe och om Lightning Addressen är korrekt Det gick inte att skapa en blixtfaktura från %1$s: Elementet pr hittades inte i den resulterande JSON. Det gick inte att skapa en blixt faktura. Meddelande från %1$s: %2$s + Den här enheten tar nu emot dina Marmot-inbjudningar. + Det gick inte att publicera KeyPackage: %1$s + Inget relä accepterade KeyPackage. Kontrollera dina reläinställningar och försök igen. + Skickar… + Kunde inte skickas. Tryck för att försöka igen. + + %1$d nytt meddelande + %1$d nya meddelanden + + Koordinatorgrupp + Levereras av en koordinator, inte av reläer + Vad den här koordinatorn kan se + En koordinator är en enda server som för vidare varje meddelande i den här gruppen, i ordning. Det är en annan avvägning än med reläer — värt att känna till innan du behandlar det här som vilken chatt som helst. + Meddelandeinnehåll + Vilka som är med i gruppen + Vem som skickar vad + Oläsligt + Under en engångsnyckel + Kopplat till ditt riktiga konto + Detaljer + Koordinator %1$s + Detta är inte samma exponering som i en Marmot-grupp, där ingen enskild operatör har hela konversationen. + När du går med namnges riktiga konton i båda ändar, så koordinatorn vet vilka som är med i gruppen. + En och samma engångsnyckel skickar och hämtar för alla dina grupper här, så koordinatorn kan se att allihop är du. + En enda operatör har den fullständiga, ordnade historiken för varje grupp den för vidare. + Nyckelpaketet du publicerade är ett signerat belägg för att det här kontot använder cordn, och koordinatorn kan lämna ut det till vem som helst. + Meddelanden utfylls inte, så koordinatorn ser hur långt varje meddelande är. + Den här klienten krypterar inte till koordinatorn. Det är en bugg — rapportera den gärna. + Inte kontaktad ännu + Svarar + Svarar inte + + %1$d misslyckat försök i rad + %1$d misslyckade försök i rad + + Klistra in en cordn1…-länk som någon delat med dig för att se vilken koordinator som för vidare gruppen, och vad den operatören skulle få veta om dig om du gick med. + cordn1… + Granska + Klistra in + Rensa + Det där är ingen cordn-grupplänk: %1$s + Grupp-id + Koordinator + Nås via + Den här länken anger ingen koordinator, så den kan inte följas på egen hand. Fråga den som skickade den vilken koordinator som för vidare gruppen. + Att granska en länk går inte med i något, och att ha en gör dig inte till medlem. + Cordn-grupplänk + cordn koordinator grupp länk inbjudan mls chatt metadata integritet exponering coordinator group link invite + Cordn-koordinatorer + cordn koordinator lägg till ta bort rensa hälsa server mls chatt ordning coordinator add remove purge health + Cordn-nyckelpaket + cordn nyckelpaket publicera inbjudan reserv koordinator mls key package last resort + Cordn-säkerhetskopia + cordn säkerhetskopia återställ exportera importera lösenfras grupper återställning backup restore + Cordn-grupper + End-to-end-krypterade grupper som ordnas av en koordinator du väljer, i stället för av reläer. + Grupp %1$s + Inga meddelanden ännu + Cordn-grupp, förs vidare av %1$s + Meddelandet raderat + Röstmeddelande + Foto + Video + Fil + Cordn-grupp + Krypterad gruppchatt som ordnas av en koordinator du väljer. + Koordinerad + Bäst för team som vill ha en pålitlig ordning i konversationen. + Skapa Cordn-grupp + End-to-end-krypterad med MLS — koordinatorn kan aldrig läsa ett meddelande. + En gemensam ordning för alla, så att historiken inte kan kastas om av en felaktig klocka. + Koordinatorn får veta vilka som är med i gruppen och när ni pratar, även om den inte kan läsa vad ni säger. + Inbjuden till en cordn-grupp? + Granska inbjudningar + Cordn + Grupper som levereras av en koordinator du väljer, i stället för av reläer. + Granska en grupplänk + Se vad en cordn1…-länk pekar på innan du agerar på den + Flytta från den här telefonen + Ta över från en annan telefon + Publicerade nyckelpaket + Länken + Koordinatorer du använder + Annonserar sig själva + Lägg till en manuellt + Lösenfras + Skapa en säkerhetskopia + Återställ från en säkerhetskopia + Koordinatorn + Den här enheten + Koordinatorer + Servrarna som för vidare dina grupper + Nyckelpaket + Det som gör att andra kan lägga till dig i en grupp + Säkerhetskopiera och återställ + En lösenfraskrypterad fil som du behåller + Flytta till en ny telefon + Lämna över dina grupper till en enhet du byter till + Flytta till en ny telefon + Dina cordn-grupper finns på den här enheten. Att flytta dem kräver en kod: den här telefonen publicerar dem, den nya telefonen läser dem, och den här telefonen slutar. + Logga först in med samma konto på den nya telefonen. Detta flyttar dina grupper, aldrig din nyckel. + Starta överlämningen + Publicerar… + Skanna den här på den nya telefonen + Koden är bara en pekare. Den som fotograferar den får inte veta något — det den pekar på är krypterat till dig. + Den här enheten har lämnat över sina grupper + Den har slutat skicka och ta emot, eftersom två telefoner som skickar från samma grupp skulle förstöra den för alla i den. Dina grupper finns kvar på den här enheten och inget har raderats. + Ta tillbaka den här enheten + Använd detta om flytten inte blev klar. Gör det bara om den nya telefonen inte har börjat skicka. + Ta emot från en annan telefon + Skanna koden + eller klistra in den + Hämta grupperna hit + Hämtar… + Detta ersätter alla cordn-grupper som redan finns på den här telefonen. De kan inte slås samman. + + %1$d grupp flyttad + %1$d grupper flyttade + + Det finns inga cordn-grupper på den här enheten att flytta. + Ställ in en mediaserver först — de krypterade dokumenten behöver någonstans att ligga medan den andra telefonen hämtar dem. + Vad som lämnar den här enheten + Ditt grupptillstånd krypteras och laddas upp till din mediaserver så att den andra telefonen kan hämta det. Det är oläsligt för servern, som bara ser en storlek och en tidpunkt. Radera blobbarna efteråt om du inte vill lämna något kvar. + 3D-objekt + %1$d hörn · %2$d ytor + Det här 3D-objektet kunde inte läsas (regel %1$s) + Cyberspace-avatar + Den här avataren har inte betalat för sin storlek, så den ritas inte + Belyst; tryck för att rita objektet platt + Platt; tryck för att belysa objektet + 1 enhet = %1$s + Gömd i dataspace · %1$s + Gömd i ideaspace · %1$s + Standardavatar + Ingen form publicerad, så alla ser den här + Gömd på en plats + Gömd i en låda med %1$s regioner + Gömd i en enda region, som ledtråden anger exakt + Ingen ledtråd, så den kan vara var som helst i cyberspace + Utom räckhåll: ledtråden anger 2^%1$d regioner att söka i + Sök efter den + Stoppa + Beräknar sökningens kostnad på den här enheten… + Sökt i %1$s av %2$s regioner + + Utom räckhåll: cirka %1$d minuts sökning på den här enheten + Utom räckhåll: cirka %1$d minuters sökning på den här enheten + + + Utom räckhåll: cirka %1$d timmes sökning på den här enheten + Utom räckhåll: cirka %1$d timmars sökning på den här enheten + + Inte i lådan som ledtråden angav + Regionen hittades, men innehållet kunde inte läsas + + %1$d föremål som gömts här matchade inte sin signatur och kastades + %1$d föremål som gömts här matchade inte sina signaturer och kastades + + Öppnad, och det fanns ingenting i den + Osignerad, så den här författaren är bara ett påstående + Ett föremål av typ %1$d, som den här klienten inte ritar + + %1$d byte av något som den här klienten inte läser + %1$d byte av något som den här klienten inte läser + + + Stäng + Kopiera länk + Sök + Textstorlek + Datorversion + Till startskärm + Annan webbläsare + Helskärm + Redigera adress + Bakåt + Framåt + Ladda om + Sluta läsa in + Lägg till i favoriter + Ta bort från favoriter + Dela + Kopiera länk + Sök på sidan + Textstorlek + Lägg till på startskärmen + Datorversion av webbplatsen + Öppna i webbläsare + Öppna i %1$s + Helskärm + Du lämnade %1$s + Tillbaka till appen + Mindre text + Större text + Återställ + %1$d% + Integritet + Onion-routing + Webbplatsen kan inte se din IP-adress + Webbplatsen kan se din IP-adress + Webbplatsinställningar + Inget tillåtet ännu + Vad den kan komma åt + Dina nycklar lämnar aldrig Amethyst + Varje signering, publicering, uppladdning eller betalning kräver ditt godkännande + Ingen särskild åtkomst + Den körs i sandlåda och kan inte agera på ditt konto + Hantera behörigheter + nSite · i sandlåda + nApplet · i sandlåda + Konsol + Säker anslutning + Inte säker + Onion-routad + App i sandlåda + Kamera + Mikrofon + Plats + Fråga + Tillåt + Blockera + %1$s %2$s + tillåten + blockerad + Sök eller ange adress + Gå + Rensa + Klistra in och gå + Använd den här adressen + Sök på sidan + %1$d / %2$d + Inga träffar + Föregående träff + Nästa träff + Stäng sökning på sidan + Alla + Fel + Varningar + Kopiera + Rensa + Inget loggat ännu + Den här webbplatsen vill använda + Se det din kamera ser + Höra det din mikrofon hör + Veta ungefär var du är + Samtal kan avslöja din IP-adress även via Tor. + Tillåt under besöket + Bara den här gången + Tillåt inte + %1$s säger + Den här sidan säger + Låt inte den här sidan visa fler dialogrutor + Ditt svar + Lämna webbplatsen? + Ändringar du har gjort kanske inte sparas. + Lämna + OK + Avbryt + Anslutning + Anslutningen är krypterad + Information du skickar kan inte läsas på vägen. + Anslutningen är inte krypterad + Ange inte lösenord eller betalningsuppgifter. + Onion-routad via Tor + Öppen webb + Certifikat + Utfärdat till %1$s av %2$s · giltigt till %3$s + Behörigheter + Cookies och webbplatsdata + Inloggningar och inställningar som den här webbplatsen sparat för det här kontot + Rensa webbplatsdata + Logga ut från den här webbplatsen och radera dess data? + Blockera %1$s igen + Behåll %1$s + Gå med i %1$s igen + Tysta %1$s igen + Återställ %1$s + Återställ flöden + Återställ platser + Återställ profil + Återställ leverantörer + Återställ reläer + Återställ ämnen + Återställ plånbok + Acceptera + + %1$s och lade till %2$d + %1$s och lade till %2$d + + + %1$s och blockerade %2$d + %1$s och blockerade %2$d + + + %1$s och följde %2$d + %1$s och följde %2$d + + + %1$s och gick med i %2$d + %1$s och gick med i %2$d + + + %1$s och tystade %2$d + %1$s och tystade %2$d + + Dina synkade Amethyst-appinställningar ändrades i en annan app som inte är Amethyst. Det kan orsaka problem. + Du tömde din Concord-lista + Du ändrade din Concord-lista + + Du tog bort %1$d DM-relä + Du tog bort %1$d DM-reläer + + + Du tog bort %1$d favoritflöde + Du tog bort %1$d favoritflöden + + + Du slutade följa %1$d person + Du slutade följa %1$d personer + + + Du slutade följa %1$d hashtagg + Du slutade följa %1$d hashtaggar + + + Du tog bort %1$d indexerande relä + Du tog bort %1$d indexerande reläer + + + Du tog bort %1$d nyckelrelä för gruppchattar + Du tog bort %1$d nyckelreläer för gruppchattar + + + Du lämnade %1$d offentlig chatt + Du lämnade %1$d offentliga chattar + + + Du lämnade %1$d gemenskap + Du lämnade %1$d gemenskaper + + + Du lämnade %1$d grupp + Du lämnade %1$d grupper + + + Du lämnade %1$d chattrum + Du lämnade %1$d chattrum + + + Du slutade tysta %1$d sak + Du slutade tysta %1$d saker + + + Du tog bort %1$d offentligt relä + Du tog bort %1$d offentliga reläer + + Du tog bort din nutzap-nyckel + Du bytte ut din nutzap-nyckel + + Du tog bort %1$d nutzap-mint + Du tog bort %1$d nutzap-mints + + + Du tog bort %1$d BOLT12-erbjudande + Du tog bort %1$d BOLT12-erbjudanden + + + Du tog bort %1$d sätt att få betalt + Du tog bort %1$d sätt att få betalt + + + Du slutade följa %1$d plats + Du slutade följa %1$d platser + + + Du tog bort %1$d privat relä + Du tog bort %1$d privata reläer + + + Du tog bort %1$d profilfält + Du tog bort %1$d profilfält + + + Du tog bort %1$d reläflöde + Du tog bort %1$d reläflöden + + + Du tog bort %1$d sökrelä + Du tog bort %1$d sökreläer + + + Du bytte leverantör för %1$d förtroendetjänst + Du bytte leverantör för %1$d förtroendetjänster + + + Du slutade lita på %1$d relä + Du slutade lita på %1$d reläer + + + Du slutade blockera %1$d relä + Du slutade blockera %1$d reläer + + Du tömde din Cashu-plånbok + Du ändrade din Cashu-plånbok + Tillagt (%1$s) + Ändrat (%1$s) + Tillagda: %1$s + Ändrade: %1$s + Borttagna: %1$s + Använd ny version + Du lade till privata (krypterade) objekt. + Du ändrade även privata (krypterade) objekt. De kan inte jämföras här. + Du tog bort alla privata (krypterade) objekt. + endast läsning + läsning och skrivning + endast skrivning + Borttaget (%1$s) + Återställ sparad version + Ändring i en annan app: %1$s + Flöden + Chattrum + Gemenskaper + Hashtaggar + Länkade identiteter + Platser + Mints + Nutzap-nycklar + Erbjudanden + Övriga poster + Betalningsadresser + Personer + Profilfält + Offentliga chattar + Reläer + Grupper + Trådar + Förtroendeleverantörer + Ord + Om + Banner + Födelsedag + Bot-markering + CLINK-erbjudande + Visningsnamn + LNURL + Lightning-adress + Användarnamn + Nostr-adress + Bild + Pronomen + Webbplats + Tillåten + Ändrad i en annan app · %1$s + Dina Concord-gemenskaper är krypterade till dig, så de kan inte jämföras här. En återställning lägger tillbaka exakt det som den här enheten sparade. + Flyttad + Borttagna: %1$s + Borttagen + Du skapade den + Du ändrade den + Du tömde den + Flöde + Borta + Hashtaggar du följer + Inkorg + där andra når dig + gick med + behållna + Behållna: %1$s + Mottagarnyckel borttagen + Mottagarnyckel utbytt + Nutzaps kommer att låsas till den här nya nyckeln. Om den här enheten inte har den kanske du inte kan lösa in dem här. + lämnade + Lämnad + Listad + Flyttad + %1$s och %2$s till + Ny version + Nya: %1$s + nya + Ny + Nyligen blockerade + Nyligen tystade: %1$s + Inte längre blockerade + Inte angivet + Inget här + BOLT12-erbjudande + + %1$d erbjudande borttaget + %1$d erbjudanden borttagna + + Utkorg + där du publicerar + + %1$d sätt att betala dig borttaget + %1$d sätt att betala dig borttagna + + De som betalar dig ser bara det som finns i den här listan. + platser borta + Platser du följer + De är krypterade nu, vilket troligen är vart de offentliga objekten ovan tog vägen. + Du gjorde objekt privata + De är krypterade, så de kan inte jämföras här. + Du ändrade privata objekt + De är krypterade, så bara du kan se vad de var. En återställning tar tillbaka alla. + Du tog bort alla privata objekt + Tar emot + omdöpt + Omdöpt + På den här enheten + + Sök bland %1$s person + Sök bland %1$s personer + + Söker + Tjänst + Följare + Rang + Ämnen + + %1$s av %2$s tjänst ändrad + %1$s av %2$s tjänster ändrade + + De kommer nu från någon annan, eller från ingen + Fortfarande blockerade + Lagrar + Borttagna · %1$s + Redigerade · %1$s + Nya · %1$s + %1$s har tömts + %1$s har uppdaterats + ämnen borta + Rang, antal följare och skräppostfiltrering som du ser kommer från de här leverantörerna. + Betrodd + Blockering hävd: %1$s + Amethyst ansluter till dem igen + Enheter + Tystnad hävd: %1$s + De här kan nå dina flöden igen + Ej betrodd + Din plånboks mints och nycklar är krypterade till dig, så de kan inte jämföras objekt för objekt här. En återställning lägger tillbaka exakt det som den här enheten sparade. + hette ”%1$s” + Ord & hashtaggar + synkade appinställningar + Amethyst-inställningar som synkas mellan dina enheter. De är krypterade, så bara att de finns kan jämföras. + lista över blockerade reläer + Reläer som den här appen aldrig ansluter till. + BOLT12-erbjudanden + Lightning-erbjudandena som andra använder för att betala dig. + Cashu-plånbok + Dina inställningar och mints för ecash-plånboken. De är krypterade, så bara att de finns kan jämföras. + gemenskapslista + Gemenskaperna du gått med i. + Concord-gemenskapslista + Concord-gemenskaperna du gått med i. De är krypterade, så bara att de finns kan jämföras. + DM-relälista + Dit andra levererar dina privata meddelanden. + lista över tillfälliga chattar + De tillfälliga chattrummen du gått med i. + lista över favoritflöden + De algoritmiska flödena du har sparat. + följlista + Avgör vems inlägg som visas i ditt hemflöde. + följda platser + Platser vars inlägg visas i dina flöden. + följda hashtaggar + Hashtaggar vars inlägg visas i dina flöden. + lista över indexerande reläer + Reläerna som används för att hitta andras profiler och relälistor. + nyckelreläer för gruppchattar + Där andra hittar nycklarna för att lägga till dig i krypterade gruppchattar. + tystnadslista + Döljer personer, ord, hashtaggar och trådar från allt du ser. + inställningar för nutzap-mottagning + Mints och nyckel som andra använder för att skicka nutzaps till dig. + lista + En lista som sparats på den här enheten. + offentlig relälista + Talar om för alla var dina inlägg finns och vart svar och omnämnanden till dig ska skickas. + betalningsadresser + Sätten som andra kan betala dig på. + privat relälista + Där dina utkast och privata data lagras. + profil + Ditt namn, din bild, din bio och dina betalningsadresser, så som alla ser dem. + lista över offentliga chattar + De offentliga chattarna du gått med i. + favoritreläflöden + Reläerna du bläddrar i som flöden. + grupplista + De relä-baserade grupperna du gått med i. + lista över sökreläer + Reläerna som används när du söker. + lista över förtroendeleverantörer + Tjänsterna du litar på för att rangordna och verifiera personer åt dig. + lista över betrodda reläer + Reläer du litar på att ansluta till utan att fråga. + Radera + Redigera + Redigerar ditt meddelande + Gå till meddelandet + Fäst + Svara + Lossa + Ändringen kunde inte genomföras. + Koordinatorn svarade inte, så inget ändrades. Försök igen om en stund. + %1$s har inte publicerat något nyckelpaket till den här koordinatorn, så de kan inte läggas till ännu. Be dem att först öppna cordn på den här koordinatorn. + Du kan inte ta bort dig själv från en cordn-grupp. + %1$s kunde inte ges någon väg in i gruppen, så tillägget avbröts. + %1$s är inte med i den här gruppen. + Den personen + Den här koordinatorn lämnade ut ett nyckelpaket som tillhör någon annan, så %1$s lades inte till. Inget ändrades. + Dina gruppkrypteringsnycklar, dina nyckelpaket och varje meddelande i de grupperna. Den som öppnar filen kan läsa konversationerna. Lösenfrasen är det enda som skyddar den när den väl lämnat Amethyst. + Vad filen innehåller + Din nsec kan inte återskapa cordn-grupper. En cordn-grupp lever som krypteringstillstånd på den här enheten och som en ordnad ström hos en koordinator som inte kan läsa den — förlorar du enheten utan säkerhetskopia är gruppen borta, inklusive allt som redan sagts i den. + Exportera + Säkerhetskopian sparad. + Det fungerade inte. Kontrollera lösenfrasen och filen. + Lösenfras + Återställ + Återställning ersätter cordn-grupperna på den här enheten med dem i filen. Den är till för en telefon som tagit över från en annan — inte ett sätt att använda samma grupper på två enheter samtidigt. + Alla cordn-grupper som nu finns på den här enheten tas bort och ersätts med dem i filen.\n\nÅterställ inte till en andra telefon medan den första fortfarande används. Båda skulle ha samma gruppnycklar, och så snart båda har skickat ett meddelande går gruppen sönder för alla — tyst, och utan väg tillbaka. + Ersätta den här enhetens cordn-grupper? + Återställ + Återställd. + Allt som skickas här krypteras för den här gruppen. Koordinatorn förmedlar det utan att kunna läsa det. + Inga meddelanden ännu + Nya meddelanden + I går + Meddelande + Lägg till + Kunde inte öppna den koordinatorn. + Kopiera koordinatorns npub + Leta efter koordinatorer + Lägg till + Läser annonser som dina reläer redan har. Ingen koordinator kontaktas, så ingen av dem får veta att du letade. + Kunde inte läsa annonser + Ingen annonserar på dina reläer. + Annonserade för %1$s sedan + Senast annonserad %1$s + + Inget hittades, och %1$d av dina reläer svarade inte. + Inget hittades, och %1$d av dina reläer svarade inte. + + En koordinator ordnar en grupps meddelanden och är det enda som kan göra det. Förlorar man den förloras ordningen, och en andra koordinator speglar inte den första — så det här är namngivna saker du väljer, inte utbytbara reläer. + + Svarar inte — %1$d anrop i rad har misslyckats. Grupper på den synkroniseras inte. + Svarar inte — %1$d anrop i rad har misslyckats. Grupper på den synkroniseras inte. + + Svarar. + Ett anrop misslyckades; försöker igen. + Inget har efterfrågats ännu. + Dölj dem som slutat annonsera + Fråga vem den är + Koordinatornyckel + Ett namn för den (ditt eget, valfritt) + Det här namnet är ditt och stannar på den här enheten. En koordinator kan inte bevisa ett namn, så den ombeds aldrig uppge något. + Fler åtgärder + Inga koordinatorer ännu. + Rensa bort + Att ta bort behåller grupperna på den här enheten, så om du lägger till koordinatorn igen kommer de tillbaka. Att rensa bort raderar dem: gruppnycklarna, lässtatusen och dina nyckelpaket försvinner, och de grupperna kan bara nås igen via en ny inbjudan.\n\nKoordinatorn meddelas inte och behåller allt den redan hade. + Rensa bort den här koordinatorn? + %1$s + Svarar på + %1$s +%2$d till + Ta bort + Byt namn + Säger sig vara: %1$s + En koordinators namn och version är strängar den själv valt. Dess publika nyckel är det enda som identifierar den. + Svarade, men angav inget namn. + Visa alla %1$d + Visa färre + + Visa %1$d som slutat annonsera + Visa %1$d som slutat annonsera + + Dessa har inte annonserat på över en månad. Att skapa en grupp på en som försvunnit kommer att misslyckas. + Skapa grupp + + Skapa och bjud in %1$d person + Skapa och bjud in %1$d personer + + Lägg till någon + Admin + + %1$d person kan lägga till och ta bort + %1$d personer kan lägga till och ta bort + + Bara jag hanterar den här gruppen + Bara du kan bjuda in, ta bort medlemmar eller ändra gruppens uppgifter. Du kan lämna över det till någon annan senare. + Koordinator + Ändra + Hitta koordinatorer + Klar + En annan koordinator + Koordinatorns publika nyckel (hex eller npub) + Reläer den svarar på, ett per rad + + Når %1$d person — alla du valt + Når alla dina %1$d personer + + Når %1$d av %2$d — resten skulle bli utanför + Inte kontrollerad — den tillfrågas om du väljer den + Beskrivning (valfritt) + Alla kan lägga till och ta bort + Alla i gruppen kan bjuda in, ta bort medlemmar och ändra gruppens uppgifter. Vilken medlem som helst kan utse admins senare, vilket upphäver detta. + En cordn-grupp ordnas av en koordinator du väljer. Gruppen skapas på den här enheten — koordinatorn får veta att gruppen finns först när du bjuder in någon eller skickar ett meddelande. + Gruppen kunde inte skapas. + Gruppnamn + Ingen koordinator vald + Varje inbjudan är ett Welcome-meddelande som lämnas hos koordinatorn, så de kan misslyckas en i taget. Ingen har meddelats: de ser det nästa gång de öppnar sin app. + Koordinatorn avvisade inbjudan + Skicka en länk + Tillagd i gruppen, men inbjudan nådde inte fram — försök igen från gruppskärmen + Öppna chatten + Ingen nyckel här, så inget Welcome-meddelande kunde lämnas + Gruppen är skapad + Väntar på dem + Klar + Ingen tillagd ännu. En grupp kan skapas tom och inbjudningar skickas senare, men att ange personer nu är det som visar vilken koordinator som kan nå dem. + Ingen ännu — tryck för att lägga till personer + Att ange personer nu är det som talar om för oss vilken koordinator som kan nå dem. Var och en får ett Welcome-meddelande som lämnas hos den koordinatorn, och som de hämtar nästa gång de öppnar sin app. + + Nåbar via %1$d koordinator + Nåbar via %1$d koordinatorer + + Ingen nyckel hos någon koordinator du använder + Inte kontrollerad ännu + Vem som kan lägga till och ta bort + Namnge den + Vilka som är med + Var den finns + Ny Cordn-grupp + + %1$d person kan inte nås av någon koordinator du använder + %1$d personer kan inte nås av någon koordinator du använder + + Du, alltid admin + Alla i gruppen kommer att se meddelandet som återkallat, och Amethyst slutar visa texten. Koordinatorn har fortfarande den krypterade kopia som skickades, och den som redan har läst det har redan läst det. + Återkalla meddelande + Accepterat av koordinatorn + Uppfattat + Vad den här koordinatorn kan se + Gruppinfo + Den här gruppen är inte tillgänglig. Dess koordinator kan ha tagits bort. + Lägg till en koordinator i Inställningar för att börja använda cordn-grupper. + + %1$d grupp + %1$d grupper + + Inget kommer fram från de här grupperna. Amethyst fortsätter att försöka. + Koordinatorer + Inga cordn-grupper ännu + En cordn-grupp finns hos en koordinator som håller reda på medlemskapet och skickar meddelanden vidare, utan att någonsin se vad någon skriver. + Starta en + Lägg till någon + Ingen hittades med det namnet. + De kan bara läggas till om de har publicerat ett nyckelpaket till den här koordinatorn. + Namn, npub eller namn@domän + Admin + + Gruppens %1$d admin förblir oförändrad. + Gruppens %1$d admins förblir oförändrade. + + Koordinator + Koordinatornyckel + Koordinatorlänk + Kopiera koordinatorns nprofile + Redigera uppgifter + Den här gruppen har inga admins: alla kan lägga till, ta bort och byta namn, permanent. + Epok + Grupp-id + Kan läggas till via den här koordinatorn + Medlemmar + %1$s slutar ta emot meddelanden härifrån. De behåller det de redan har läst, och detta kan inte ångras — de skulle behöva bjudas in igen. + Ta bort från gruppen? + Ta bort + Spara + Tekniska detaljer + Gå med + Avböj + Att avböja är permanent. För att komma in igen måste du bjudas in på nytt. + Kontrolleras när du öppnar den här skärmen, och aldrig annars — att fråga en koordinator om någon har bjudit in dig avslöjar att du finns här, så Amethyst gör det inte i bakgrunden. + Kunde inte läsa inbjudningar. + + %1$d person är redan med i den här gruppen + %1$d personer är redan med i den här gruppen + + +%1$d till + Du har ingen koordinator öppen. cordn-inbjudningar kommer via en koordinator, så det finns ingenstans att leta ännu. + Inga väntande inbjudningar. + Kontrollera igen + En inbjudan lämnades till en annan enhet + Cordn-inbjudningar + %1$s svarade inte + Via %1$s + Publicering signerar ett belägg med din egen kontonyckel. Den koordinatorn vet då att kontot finns och går att bjuda in — permanent, och oavsett om någon bjuder in dig. + Andra kan bara lägga till dig i en cordn-grupp genom att ta ett nyckelpaket du publicerat till den koordinatorn. cordn har ingen annan plats att förvara ett, så utan något publicerat kan ingen bjuda in dig — och inget talar om för dem varför. + Kunde inte läsa nyckelpaketen. + Inget reservpaket. När engångspaketen tar slut misslyckas inbjudningar. + Ett reservpaket är publicerat, så en inbjudan kan fortfarande göras när engångspaketen tagit slut. + + %1$d paket som den här enheten inte kan öppna + %1$d paket som den här enheten inte kan öppna + + Koordinatorn lämnar ut dessa till den som bjuder in dig, men den privata halvan finns inte på den här enheten — den tillhör en annan installation. Om den installationen är borta ger en inbjudan med något av dessa ett Welcome-meddelande som ingen någonsin kan öppna. + Publicera ett + Publicera reservpaket + + %1$d engångspaket tillgängligt. + %1$d engångspaket tillgängliga. + + När du väl har publicerat här ersätter Amethyst tyst paketen allteftersom de används. Det första publicerar den aldrig åt dig. + Återkalla alla + Återkalla dem + Be att få gå med i gruppen + Detta publicerar ett nyckelpaket med din egen kontonyckel och talar om för koordinatorn att du vill gå med i gruppen — oavsett om någon svarar. + Kunde inte be att få gå med. + Förfrågan skickad. En medlem i gruppen måste lägga till dig; inbjudan dyker upp under cordn-inbjudningar. + Skanna + Kunde inte öppna den filen. + Ingen mediaserver är inställd för det här kontot, så filen har ingenstans att ta vägen. Välj en i Inställningar. + Filen kunde inte läsas. + Kunde inte skicka den filen. + + %1$d medlem + %1$d medlemmar + + Meddelandet raderat + Koordinator + Markör + Skickat + Meddelandedetaljer + redigerat + Fäst av %1$s + + %1$d fäst meddelande i den här gruppen + %1$d fästa meddelanden i den här gruppen + + Nästa fästa meddelande + Föregående fästa meddelande + Visa alla fästa meddelanden + Fästa meddelanden + Reaktioner + Lägg till + Bara en admin kan godkänna. I en grupp utan admins är det alla. + Sök efter förfrågningar + Avfärda + Kunde inte läsa förfrågningarna. + Ingen väntar på att få gå med. + Förfrågningar om att gå med + Skicka + Det gick inte att skicka. + Den här gruppens koordinator är inte öppen, så inget kan skickas ännu. + Kopierad + Kopiera länk + Alla som har den här länken kan be att få gå med. En admin måste fortfarande släppa in dem. + Dela den här gruppen + Spela upp röstmeddelande + Spela in ett röstmeddelande + Stoppa och skicka diff --git a/commonsUI/src/commonMain/composeResources/values-sw/strings.xml b/commonsUI/src/commonMain/composeResources/values-sw/strings.xml index 7d3cc769d6..286d845f7c 100644 --- a/commonsUI/src/commonMain/composeResources/values-sw/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-sw/strings.xml @@ -2933,4 +2933,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-ta-rIN/strings.xml b/commonsUI/src/commonMain/composeResources/values-ta-rIN/strings.xml index 3010552279..1118006456 100644 --- a/commonsUI/src/commonMain/composeResources/values-ta-rIN/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-ta-rIN/strings.xml @@ -2922,4 +2922,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-th-rTH/strings.xml b/commonsUI/src/commonMain/composeResources/values-th-rTH/strings.xml index 3ff6d16399..cf2b33f695 100644 --- a/commonsUI/src/commonMain/composeResources/values-th-rTH/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-th-rTH/strings.xml @@ -2763,4 +2763,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-tr-rTR/strings.xml b/commonsUI/src/commonMain/composeResources/values-tr-rTR/strings.xml index 38296b0696..885e0cedad 100644 --- a/commonsUI/src/commonMain/composeResources/values-tr-rTR/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-tr-rTR/strings.xml @@ -2929,4 +2929,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-uk-rUA/strings.xml b/commonsUI/src/commonMain/composeResources/values-uk-rUA/strings.xml index 23ef0f9640..cdb6fd0b15 100644 --- a/commonsUI/src/commonMain/composeResources/values-uk-rUA/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-uk-rUA/strings.xml @@ -2987,4 +2987,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-uz-rUZ/strings.xml b/commonsUI/src/commonMain/composeResources/values-uz-rUZ/strings.xml index f034ff4161..349da89d24 100644 --- a/commonsUI/src/commonMain/composeResources/values-uz-rUZ/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-uz-rUZ/strings.xml @@ -2938,4 +2938,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-vi-rVN/strings.xml b/commonsUI/src/commonMain/composeResources/values-vi-rVN/strings.xml index 1d1872fec7..41d1564cbe 100644 --- a/commonsUI/src/commonMain/composeResources/values-vi-rVN/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-vi-rVN/strings.xml @@ -2883,4 +2883,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-zh-rCN/strings.xml b/commonsUI/src/commonMain/composeResources/values-zh-rCN/strings.xml index 7c75986465..068f70ecd9 100644 --- a/commonsUI/src/commonMain/composeResources/values-zh-rCN/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-zh-rCN/strings.xml @@ -3899,4 +3899,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-zh-rHK/strings.xml b/commonsUI/src/commonMain/composeResources/values-zh-rHK/strings.xml index 7b3e1d06b4..09ac836145 100644 --- a/commonsUI/src/commonMain/composeResources/values-zh-rHK/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-zh-rHK/strings.xml @@ -2948,4 +2948,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-zh-rSG/strings.xml b/commonsUI/src/commonMain/composeResources/values-zh-rSG/strings.xml index 27be29d6c6..d3164d768c 100644 --- a/commonsUI/src/commonMain/composeResources/values-zh-rSG/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-zh-rSG/strings.xml @@ -2948,4 +2948,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values-zh-rTW/strings.xml b/commonsUI/src/commonMain/composeResources/values-zh-rTW/strings.xml index 44907ad304..cdc0f88ed8 100644 --- a/commonsUI/src/commonMain/composeResources/values-zh-rTW/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values-zh-rTW/strings.xml @@ -2919,4 +2919,5 @@ + diff --git a/commonsUI/src/commonMain/composeResources/values/strings.xml b/commonsUI/src/commonMain/composeResources/values/strings.xml index 2243b4691f..873fdebe0b 100644 --- a/commonsUI/src/commonMain/composeResources/values/strings.xml +++ b/commonsUI/src/commonMain/composeResources/values/strings.xml @@ -219,7 +219,10 @@ New hunt… You have not made a hunt yet. Already on this hunt - %1$d caches here + + %1$d cache here + %1$d caches here + Remove this photo This cache has been archived. It is no longer in play. First to find claimed by %1$s @@ -278,7 +281,6 @@ Centre on me Long-press the map to hide a cache there Open - %1$d caches Where What Extras @@ -306,7 +308,10 @@ Pick where the cache is hidden. %1$d of %2$d found Start the hunt - %1$d caches + + %1$d cache + %1$d caches + Title Description Banner image @@ -355,7 +360,10 @@ No QR code found in that picture Nothing on the clipboard to scan Tap the code you want - Captured %1$s of %2$s parts — keep going + + Captured %1$s of %2$s part — keep going + Captured %1$s of %2$s parts — keep going + Reset zoom Amethyst can't open this code This code carries a private key or a pairing secret, so its contents are not shown here. Use the screen that expects it. @@ -5335,7 +5343,10 @@ Not contacted yet Responding Not responding - %1$d failed attempts in a row + + %1$d failed attempt in a row + %1$d failed attempts in a row + Paste a cordn1… link someone shared with you to see which coordinator carries that group, and what that operator would learn about you if you joined. cordn1… @@ -5431,7 +5442,10 @@ Bring the groups here Fetching… This replaces any cordn groups already on this phone. They cannot be merged. - %1$d groups moved + + %1$d group moved + %1$d groups moved + There are no cordn groups on this device to move. Set a media server first — the encrypted documents need somewhere to sit while the other phone fetches them. What leaves this device @@ -5457,16 +5471,27 @@ Stop Pricing the search on this device… Searched %1$s of %2$s regions - Out of reach: about %1$d minutes of searching on this device - Out of reach: about %1$d hours of searching on this device + + Out of reach: about %1$d minute of searching on this device + Out of reach: about %1$d minutes of searching on this device + + + Out of reach: about %1$d hour of searching on this device + Out of reach: about %1$d hours of searching on this device + Not in the box the hint named Found the region, but the contents could not be read - %1$d item hidden here did not match its signature and was dropped - %1$d items hidden here did not match their signatures and were dropped + + %1$d item hidden here did not match its signature and was dropped + %1$d items hidden here did not match their signatures and were dropped + Opened, and there was nothing inside Unsigned, so this author is a claim An item of kind %1$d, which this client does not draw - %1$d bytes of something this client does not read + + %1$d byte of something this client does not read + %1$d bytes of something this client does not read + Close Copy link @@ -5811,13 +5836,19 @@ renamed Renamed On this device - Search %1$s people + + Search %1$s person + Search %1$s people + Searching Service Followers Rank Topics - %1$s of %2$s services changed + + %1$s of %2$s service changed + %1$s of %2$s services changed + They now come from someone else, or no one Still blocked Storing @@ -5935,9 +5966,15 @@ Nobody is announcing on your relays. Announced %1$s ago Last announced %1$s - Nothing found, and %1$d of your relays did not answer. + + Nothing found, and %1$d of your relays did not answer. + Nothing found, and %1$d of your relays did not answer. + A coordinator orders one group's messages and is the only thing that can. Losing it loses the ordering, and a second one does not mirror the first — so these are named things you choose, not interchangeable relays. - Not answering — %1$d calls in a row have failed. Groups on it are not syncing. + + Not answering — %1$d call in a row has failed. Groups on it are not syncing. + Not answering — %1$d calls in a row have failed. Groups on it are not syncing. + Answering. A call failed; retrying. Nothing asked of it yet. @@ -5961,7 +5998,10 @@ Answered, but named nothing. Show all %1$d Show fewer - Show %1$d that stopped announcing + + Show %1$d that stopped announcing + Show %1$d that stopped announcing + These have not announced in over a month. Creating a group on one that has gone away will fail. Create group @@ -5983,7 +6023,10 @@ Another coordinator Coordinator public key (hex or npub) Relays it answers on, one per line - Reaches all %1$d of your people + + Reaches your %1$d person + Reaches all %1$d of your people + Reaches %1$d of %2$d — the rest would be left out Not checked — picking it will ask Description (optional) diff --git a/commonsUI/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumCanvas.kt b/commonsUI/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumCanvas.kt index a3c0b51eca..a89eade52f 100644 --- a/commonsUI/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumCanvas.kt +++ b/commonsUI/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/audio/SpectrumCanvas.kt @@ -26,15 +26,23 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.withFrameMillis +import androidx.compose.runtime.withFrameNanos import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.drawscope.DrawScope +import kotlinx.coroutines.channels.Channel import kotlinx.coroutines.flow.Flow /** * Collects [spectrum] into a decayed [FloatArray] and optionally runs a monotonic time clock, * then calls [draw] inside the Canvas draw lambda. The fast-changing state is read * ONLY in the draw lambda, so new frames trigger the draw phase, never recomposition. - * Pass [animated] = false for non-time-varying styles (bars, radial) to avoid 60fps redraws. + * + * Frames are released through [SpectrumTrail] as the audio they describe comes due. The pacing loop + * only writes state when a frame is due, and parks entirely while nothing is queued (paused, idle), + * so on its own it redraws at the ~43-47 Hz the fft produces and costs nothing when silent. + * + * Pass [animated] = false for non-time-varying styles (bars, radial): that drops the monotonic clock, + * whose whole purpose is to redraw every frame even when the spectrum has not moved. */ @Composable fun SpectrumCanvas( @@ -46,18 +54,27 @@ fun SpectrumCanvas( draw: DrawScope.(bins: FloatArray, timeSec: Float, palette: VisualizerPalette) -> Unit, ) { val smoothed = remember { mutableStateOf(FloatArray(0)) } - LaunchedEffect(spectrum, decay) { - var prev = FloatArray(0) - spectrum.collect { frame -> - // A fresh array each frame is intentional: mutableStateOf compares by reference, so a new - // instance is what signals Compose to redraw. Do NOT switch to in-place mutation. - val next = - FloatArray(frame.bins.size) { i -> - val prior = if (i < prev.size) prev[i] * decay else 0f - if (frame.bins[i] > prior) frame.bins[i] else prior - } - smoothed.value = next - prev = next + + val trail = remember(spectrum, decay) { SpectrumTrail(decay) } + val arrivals = remember(trail) { Channel(Channel.CONFLATED) } + LaunchedEffect(spectrum, trail) { + spectrum.collect { + trail.offer(it) + arrivals.trySend(Unit) + } + } + + LaunchedEffect(trail) { + while (true) { + val next = trail.nextOrNull(withFrameNanos { it }) + if (next != null) { + smoothed.value = next + } else if (trail.isEmpty()) { + // Park off the frame clock until the next offer. This must follow a nextOrNull that + // saw the empty queue: that call records the starvation which stops the next cluster + // from being dumped at once to "catch up". + arrivals.receive() + } } } diff --git a/commonsUI/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/cordn/ui/CoordinatorHealthRow.kt b/commonsUI/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/cordn/ui/CoordinatorHealthRow.kt index a6770124d3..bcd12f79c7 100644 --- a/commonsUI/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/cordn/ui/CoordinatorHealthRow.kt +++ b/commonsUI/src/commonMain/kotlin/com/vitorpamplona/amethyst/commons/cordn/ui/CoordinatorHealthRow.kt @@ -37,6 +37,7 @@ import com.vitorpamplona.amethyst.commons.resources.cordn_health_down import com.vitorpamplona.amethyst.commons.resources.cordn_health_failures import com.vitorpamplona.amethyst.commons.resources.cordn_health_ok import com.vitorpamplona.amethyst.commons.resources.cordn_health_unknown +import org.jetbrains.compose.resources.pluralStringResource import org.jetbrains.compose.resources.stringResource /** @@ -97,7 +98,7 @@ fun CoordinatorHealthRow( // deserves no words at all. if (state.isDown) { Text( - text = stringResource(Res.string.cordn_health_failures, state.consecutiveFailures), + text = pluralStringResource(Res.plurals.cordn_health_failures, state.consecutiveFailures, state.consecutiveFailures), style = MaterialTheme.typography.labelSmall, color = MaterialTheme.colorScheme.onSurfaceVariant, ) diff --git a/docs/changelog/translators.json b/docs/changelog/translators.json index 018e4cd32a..eb7c79c88a 100644 --- a/docs/changelog/translators.json +++ b/docs/changelog/translators.json @@ -124,9 +124,9 @@ ] }, { - "user": "rajs19420616", + "user": "summoner001", "languages": [ - "Hindi" + "Hungarian" ] }, { @@ -136,9 +136,9 @@ ] }, { - "user": "summoner001", + "user": "rajs19420616", "languages": [ - "Hungarian" + "Hindi" ] }, { @@ -147,6 +147,15 @@ "Russian" ] }, + { + "user": "davotoula", + "languages": [ + "Czech", + "German", + "Portuguese, Brazilian", + "Swedish" + ] + }, { "user": "greenart7c3", "languages": [] @@ -219,10 +228,6 @@ "user": "adhrasreoshiathoi", "languages": [] }, - { - "user": "davotoula", - "languages": [] - }, { "user": "crackadoo", "languages": [] diff --git a/nappletHost/src/main/kotlin/com/vitorpamplona/amethyst/napplethost/NappletBrowserActivity.kt b/nappletHost/src/main/kotlin/com/vitorpamplona/amethyst/napplethost/NappletBrowserActivity.kt index a32f8f27d1..4525300d1b 100644 --- a/nappletHost/src/main/kotlin/com/vitorpamplona/amethyst/napplethost/NappletBrowserActivity.kt +++ b/nappletHost/src/main/kotlin/com/vitorpamplona/amethyst/napplethost/NappletBrowserActivity.kt @@ -155,6 +155,9 @@ class NappletBrowserActivity : ComponentActivity() { // same address don't each trigger a round-trip. private var lastFavoriteQueryUrl: String? = null + /** The origin whose site permissions the pill is already showing. */ + private var lastSitePermissionOrigin: String? = null + // What Recents shows for this task: the page's title, favicon and theme colour. private var pageTitle: String? = null private var pageIcon: Bitmap? = null @@ -771,6 +774,20 @@ class NappletBrowserActivity : ComponentActivity() { copy(chrome = chrome.copy(url = url), title = if (newSite) BrowserChrome.displayHost(url) else title, isFavorite = false) } } + // The pill's "Site settings" line summarises this origin's camera/mic/location answers, and the + // registry that holds them lives in the main process. Until this was asked for on navigation, the + // only thing that ever filled it was opening page info — so a window said "Nothing allowed yet" + // about a site it had already been granted the camera on, and only stopped lying once you opened + // the sheet that made it ask. + BrowserChrome.originOf(url)?.let { origin -> + if (origin != lastSitePermissionOrigin) { + lastSitePermissionOrigin = origin + querySitePermissions(origin) { decisions -> + updateUi { copy(sitePermissions = decisions.filterValues { it != Decision.ASK }) } + } + } + } + if (url == lastFavoriteQueryUrl) return lastFavoriteQueryUrl = url val msg = @@ -1383,6 +1400,14 @@ class NappletBrowserActivity : ComponentActivity() { decision: Decision, ) { BrowserChrome.originOf(currentUrl())?.let { rememberSitePermission(it, permission, decision) } + // Keep the pill's summary in step with the sheet the change was made in. The registry + // is authoritative and lives in the other process, but it does not call back, so an + // edit made here would otherwise not show up until the next navigation. + updateUi { + val next = sitePermissions.toMutableMap() + if (decision == Decision.ASK) next.remove(permission) else next[permission] = decision + copy(sitePermissions = next) + } } override fun onClearSiteData() { diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/experimental/decentralizedLists/SearchExt.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/experimental/decentralizedLists/SearchExt.kt index e866f645b9..27557c2bbd 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/experimental/decentralizedLists/SearchExt.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/experimental/decentralizedLists/SearchExt.kt @@ -20,12 +20,17 @@ */ package com.vitorpamplona.quartz.experimental.decentralizedLists +import com.vitorpamplona.quartz.experimental.decentralizedLists.header.names import com.vitorpamplona.quartz.experimental.decentralizedLists.header.tags.NamesTag import com.vitorpamplona.quartz.experimental.decentralizedLists.header.tags.SingularPlural import com.vitorpamplona.quartz.experimental.decentralizedLists.header.tags.TitlesTag +import com.vitorpamplona.quartz.experimental.decentralizedLists.header.titles +import com.vitorpamplona.quartz.experimental.decentralizedLists.item.comments +import com.vitorpamplona.quartz.experimental.decentralizedLists.item.name import com.vitorpamplona.quartz.experimental.decentralizedLists.item.tags.CommentsTag import com.vitorpamplona.quartz.experimental.decentralizedLists.item.tags.NameTag import com.vitorpamplona.quartz.experimental.decentralizedLists.item.tags.TitleTag +import com.vitorpamplona.quartz.experimental.decentralizedLists.item.title import com.vitorpamplona.quartz.experimental.decentralizedLists.tags.DescriptionTag import com.vitorpamplona.quartz.nip01Core.core.TagArray import com.vitorpamplona.quartz.nip01Core.core.fastForEach @@ -84,6 +89,20 @@ fun TagArray.forEachSearchableListField(visitor: IndexableFieldVisitor): Boolean return true } +/** + * The TITLE role of [forEachSearchableListField], for search engines that weight fields: what the + * list or item is called — the header's `names` and `titles` (singular, then plural) and the + * item's `name` and `title`. Same first-well-formed-tag rule as the walk. + */ +fun TagArray.searchableListTitles(): List { + val names = names() + val titles = titles() + return listOf(names?.singular, names?.plural, titles?.singular, titles?.plural, name(), title()) +} + +/** The DESCRIPTION role of [forEachSearchableListField]: `description`, then `comments`. */ +fun TagArray.searchableListDescriptions(): List = listOf(description(), comments()) + /** The write-path join of [forEachSearchableListField]: one field per line. */ fun TagArray.searchableListContent() = buildString { diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip50Search/SearchFieldExtractor.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip50Search/SearchFieldExtractor.kt index 139530d089..b9a679d8b6 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip50Search/SearchFieldExtractor.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip50Search/SearchFieldExtractor.kt @@ -29,6 +29,9 @@ import com.vitorpamplona.quartz.experimental.agora.FundraiserEvent import com.vitorpamplona.quartz.experimental.audio.track.AudioTrackEvent import com.vitorpamplona.quartz.experimental.birdstar.BirdDetectionEvent import com.vitorpamplona.quartz.experimental.birdstar.BirdexEvent +import com.vitorpamplona.quartz.experimental.decentralizedLists.DecentralizedListEvent +import com.vitorpamplona.quartz.experimental.decentralizedLists.searchableListDescriptions +import com.vitorpamplona.quartz.experimental.decentralizedLists.searchableListTitles import com.vitorpamplona.quartz.experimental.edits.TextNoteModificationEvent import com.vitorpamplona.quartz.experimental.fitness.workout.ExerciseTemplateEvent import com.vitorpamplona.quartz.experimental.fitness.workout.WorkoutRecordEvent @@ -380,8 +383,11 @@ object SearchFieldExtractor { tiers(event, event.title(), event.description(), null) } + // kind 30063 -- the body is a NIP-82 release's notes, and nothing for a + // NIP-51 set (its content may be encrypted private items); the event + // owns that guard, so both search paths apply the same one. is ReleaseArtifactSetEvent -> { - tiers(event, event.title(), event.description(), null) + tiers(event, event.title(), event.description(), event.searchableReleaseNotes()) } is AppCurationSetEvent -> { @@ -617,6 +623,17 @@ object SearchFieldExtractor { tiers(event, null, null, event.content) } + // kinds 9998/39998/9999/39999 -- a list's or item's names and titles are + // what it is called, its description and comments what it is about. The + // `t` values indexableContent() appends are the funnel's hashtag role + // already, so -- as for 1111/1311/30382 -- they are not passed again, and + // content is not part of the spec. One branch for all four: an item may + // carry header tags (the spec's nonstandard method), and the tag helpers + // read whichever are present. + is DecentralizedListEvent -> { + tiers(event, event.tags.searchableListTitles(), event.tags.searchableListDescriptions(), null) + } + // kind 1 LAST among the explicit branches, defensively: a future // kind extending the text-note base must hit its own branch first. is TextNoteEvent -> { diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/releaseArtifactSet/ReleaseArtifactSetEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/releaseArtifactSet/ReleaseArtifactSetEvent.kt index 8926ed25cb..bd151437b0 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/releaseArtifactSet/ReleaseArtifactSetEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip51Lists/releaseArtifactSet/ReleaseArtifactSetEvent.kt @@ -81,10 +81,14 @@ class ReleaseArtifactSetEvent( visitor.visit(searchableReleaseNotes()) } - // Only NIP-82 releases carry release notes in `content`. A NIP-51 set may keep - // encrypted private items there, which must never reach the index. The blank - // check runs first so empty sets skip the two tag scans on every search. - private fun searchableReleaseNotes() = if (content.isNotBlank() && isNip82SoftwareRelease()) content else null + /** + * The release notes when they are safe to index, else null. Only NIP-82 releases carry + * release notes in `content`; a NIP-51 set may keep encrypted private items there, which + * must never reach the index. The blank check runs first so empty sets skip the two tag + * scans on every search. `SearchFieldExtractor` reads this too, so both search paths + * apply the same guard. + */ + fun searchableReleaseNotes() = if (content.isNotBlank() && isNip82SoftwareRelease()) content else null override fun eventHints() = tags.mapNotNull(EventBookmark::parseAsHint) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/TextTrackEvent.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/TextTrackEvent.kt index 91e0acab39..e9e31c9e13 100644 --- a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/TextTrackEvent.kt +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/TextTrackEvent.kt @@ -59,11 +59,15 @@ class TextTrackEvent( AddressHintProvider, SearchableEvent { // The cue text is the only searchable thing here: the `d` tag is a slug and the rest is - // plumbing. Indexing it makes a video findable by what is said in it. - override fun indexableContent() = content + // plumbing. Indexing it makes a video findable by what is said in it — the words only, + // not the timings, cue settings and markup around them (see WebVttText). Content with no + // cue at all is not a caption file and is indexed as written. + override fun indexableContent() = if (WebVttText.hasCues(content)) WebVttText.cueText(content) else content + // The read path: the same lines cueText() joins, one visit per line so a hit early in the + // track stops the walk before the rest is cleaned. override fun forEachIndexableField(visitor: IndexableFieldVisitor) { - visitor.visit(content) + if (WebVttText.hasCues(content)) WebVttText.forEachCueLine(content, visitor) else visitor.visit(content) } override fun addressHints() = tags.mapNotNull(ATag::parseAsHint) diff --git a/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/WebVttText.kt b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/WebVttText.kt new file mode 100644 index 0000000000..9fdf875374 --- /dev/null +++ b/quartz/src/commonMain/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/WebVttText.kt @@ -0,0 +1,219 @@ +/* + * 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.nip71Video.textTrack + +import com.vitorpamplona.quartz.nip50Search.IndexableFieldVisitor + +/** + * The words a WebVTT document says: every cue's payload lines with their markup removed, and + * nothing else. + * + * Search is the reason this exists. A text track's `content` is the whole document, so indexing + * it raw puts `WEBVTT`, every `00:01:02.500 --> 00:01:04.000` timing line, cue settings + * (`align:start`), cue ids, `NOTE` and `STYLE` blocks, and inline tags (``, ``, + * `<00:00:01.000>`) into the index beside the dialogue. A query for "00" or "align" then + * matches every caption ever published, and the terms that matter are diluted by markup. + * + * ## What counts as a cue line + * + * One pass over the lines, no model built. A line containing `-->` opens a cue (it is the + * timing line; the optional identifier line before it is skipped because nothing is open yet), + * and every non-blank line after it until the next blank line is payload. Everything outside a + * cue — the `WEBVTT` header, `NOTE`, `STYLE`, `REGION` — is skipped by the same rule, since none + * of it may contain `-->`. SRT happens to fit the same shape (a numeric id, a timing line, the + * text), so a publisher that wraps SRT instead of WebVTT is read correctly too. + * + * A document with no timing line at all is not a caption file, so it is indexed as written + * rather than discarded: [hasCues] is the switch, and callers pass such content through + * unchanged. + * + * ## Markup + * + * Inline tags are removed, not their contents: `really` is `really`. Voice spans lose the + * speaker name with the tag (`Hello` is `Hello`): the name is an annotation, not + * something said. The HTML character references WebVTT allows are decoded — the named ones the + * spec lists, plus numeric ones — so `Tom & Jerry` is indexed as `Tom & Jerry`. An unknown + * reference is kept as written. + */ +object WebVttText { + private const val TIMING_ARROW = "-->" + + /** Whether [document] has at least one cue. Without one it is not a caption file. */ + fun hasCues(document: String) = document.contains(TIMING_ARROW) + + /** + * The cue text of [document], one payload line per line. Callers should check [hasCues] + * first; a document without cues yields an empty string here. + */ + fun cueText(document: String): String { + val out = StringBuilder(document.length) + forEachCueLine(document) { line -> + if (out.isNotEmpty()) out.append('\n') + out.append(line) + true + } + return out.toString() + } + + /** + * Hands each cleaned, non-empty payload line of [document] to [visitor] in order. Joining + * them with `"\n"` gives exactly [cueText]. Returns false when the visitor stopped the walk. + * + * Lines without markup are passed as substrings; only a line carrying a tag or a character + * reference is rebuilt. + */ + fun forEachCueLine( + document: String, + visitor: IndexableFieldVisitor, + ): Boolean { + var inCue = false + var start = 0 + val length = document.length + while (start <= length) { + var end = start + while (end < length && document[end] != '\n' && document[end] != '\r') end++ + + if (isBlank(document, start, end)) { + inCue = false + } else if (!inCue) { + // Header, NOTE / STYLE / REGION blocks and cue identifiers all end up here and + // are skipped; only a timing line opens a cue. + if (hasArrow(document, start, end)) inCue = true + } else { + val line = clean(document, start, end) + if (line != null && !visitor.visit(line)) return false + } + + if (end >= length) break + // A CRLF pair is one line break. + start = if (document[end] == '\r' && end + 1 < length && document[end + 1] == '\n') end + 2 else end + 1 + } + return true + } + + /** Bounded to the line: an unbounded indexOf would rescan up to the next cue from every skipped line. */ + private fun hasArrow( + s: String, + start: Int, + end: Int, + ): Boolean { + for (i in start until end - 2) { + if (s[i] == '-' && s[i + 1] == '-' && s[i + 2] == '>') return true + } + return false + } + + private fun isBlank( + s: String, + start: Int, + end: Int, + ): Boolean { + for (i in start until end) if (!s[i].isWhitespace()) return false + return true + } + + /** The payload line in `[start, end)` without tags, references decoded and trimmed; null when nothing is left. */ + private fun clean( + s: String, + start: Int, + end: Int, + ): String? { + var markup = false + for (i in start until end) { + val c = s[i] + if (c == '<' || c == '&') { + markup = true + break + } + } + if (!markup) return s.substring(start, end).trim().ifEmpty { null } + + val out = StringBuilder(end - start) + var i = start + while (i < end) { + val c = s[i] + when (c) { + '<' -> { + val close = s.indexOf('>', i + 1) + // An unterminated tag runs to the end of the line, as the WebVTT parser reads it. + i = if (close < 0 || close >= end) end else close + 1 + } + + '&' -> { + val semi = s.indexOf(';', i + 1) + val decoded = if (semi in (i + 1) until end) decodeReference(s, i + 1, semi) else null + if (decoded == null) { + out.append(c) + i++ + } else { + appendCodePoint(out, decoded) + i = semi + 1 + } + } + + else -> { + out.append(c) + i++ + } + } + } + return out.toString().trim().ifEmpty { null } + } + + /** The code point named by the reference body in `[start, end)` (between `&` and `;`), or null. */ + private fun decodeReference( + s: String, + start: Int, + end: Int, + ): Int? { + if (end - start > 10) return null + if (s[start] == '#') { + val hex = start + 1 < end && (s[start + 1] == 'x' || s[start + 1] == 'X') + val digits = s.substring(if (hex) start + 2 else start + 1, end) + val code = digits.toIntOrNull(if (hex) 16 else 10) ?: return null + return if (code in 1..0x10FFFF && code !in 0xD800..0xDFFF) code else null + } + return when (s.substring(start, end)) { + "amp" -> '&'.code + "lt" -> '<'.code + "gt" -> '>'.code + "quot" -> '"'.code + "apos" -> '\''.code + "nbsp" -> 0x00A0 + "lrm" -> 0x200E + "rlm" -> 0x200F + else -> null + } + } + + private fun appendCodePoint( + out: StringBuilder, + code: Int, + ) { + if (code <= 0xFFFF) { + out.append(code.toChar()) + } else { + val v = code - 0x10000 + out.append((0xD800 + (v shr 10)).toChar()) + out.append((0xDC00 + (v and 0x3FF)).toChar()) + } + } +} diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip50Search/SearchFieldExtractorTest.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip50Search/SearchFieldExtractorTest.kt index 51b77ca13f..617a4fe607 100644 --- a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip50Search/SearchFieldExtractorTest.kt +++ b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip50Search/SearchFieldExtractorTest.kt @@ -23,6 +23,8 @@ package com.vitorpamplona.quartz.nip50Search import com.vitorpamplona.quartz.buzz.agentProfiles.AgentProfileEvent import com.vitorpamplona.quartz.experimental.birdstar.BirdDetectionEvent import com.vitorpamplona.quartz.experimental.birdstar.BirdexEvent +import com.vitorpamplona.quartz.experimental.decentralizedLists.header.ListHeaderEvent +import com.vitorpamplona.quartz.experimental.decentralizedLists.item.AddressableListItemEvent import com.vitorpamplona.quartz.experimental.nip95.header.FileStorageHeaderEvent import com.vitorpamplona.quartz.experimental.ps1saves.Ps1SaveEvent import com.vitorpamplona.quartz.experimental.trustedLists.users.UserTrustedListEvent @@ -38,9 +40,11 @@ import com.vitorpamplona.quartz.nip29RelayGroups.moderation.GroupEditMetadataEve import com.vitorpamplona.quartz.nip32Labeling.LabelEvent import com.vitorpamplona.quartz.nip34Git.repository.GitRepositoryEvent import com.vitorpamplona.quartz.nip35Torrents.TorrentEvent +import com.vitorpamplona.quartz.nip51Lists.releaseArtifactSet.ReleaseArtifactSetEvent import com.vitorpamplona.quartz.nip53LiveActivities.meetingSpaces.MeetingSpaceEvent import com.vitorpamplona.quartz.nip5aStaticWebsites.NamedSiteEvent import com.vitorpamplona.quartz.nip69P2pOrderEvents.P2POrderEvent +import com.vitorpamplona.quartz.nip71Video.textTrack.TextTrackEvent import com.vitorpamplona.quartz.nip85TrustedAssertions.users.UserAssertionEvent import com.vitorpamplona.quartz.nip88Polls.poll.PollEvent import com.vitorpamplona.quartz.nip89AppHandlers.definition.AppDefinitionEvent @@ -412,6 +416,73 @@ class SearchFieldExtractorTest { assertEquals(IndexableFields.Tiered(secondary = listOf("spam"), text = "obvious bot"), fields) } + @Test + fun nip82ReleaseNotesAreTheBodyOfARelease() { + // indexableContent() already carried the notes; the branch used to drop them, so an + // engine reading this extractor could not find a release by what changed in it. + val tags = arrayOf(arrayOf("d", "com.example.app@1.2.0"), arrayOf("i", "com.example.app"), arrayOf("version", "1.2.0"), arrayOf("title", "Example 1.2")) + val fields = SearchFieldExtractor.extract(ReleaseArtifactSetEvent("2e".repeat(32), alice, 1L, tags, "fixes the offline sync crash", "")) + assertEquals(IndexableFields.Tiered(primary = listOf("Example 1.2"), text = "fixes the offline sync crash"), fields) + } + + @Test + fun nip51ReleaseSetContentIsNeverTheBody() { + // A NIP-51 set (no `i` + `version`) may keep encrypted private items in content. + val tags = arrayOf(arrayOf("d", "release"), arrayOf("title", "Example"), arrayOf("description", "all builds")) + val fields = SearchFieldExtractor.extract(ReleaseArtifactSetEvent("2f".repeat(32), alice, 1L, tags, "AgJ0b3BzZWNyZXQ=", "")) + assertEquals(IndexableFields.Tiered(primary = listOf("Example"), secondary = listOf("all builds")), fields) + } + + @Test + fun decentralizedListHeadersSplitWhatTheyAreCalledFromWhatTheyAreAbout() { + val tags = + arrayOf( + arrayOf("names", "podcast", "podcasts"), + arrayOf("titles", "Podcast", "Podcasts"), + arrayOf("description", "shows worth a listen"), + arrayOf("t", "audio"), + ) + val fields = SearchFieldExtractor.extract(ListHeaderEvent("3a".repeat(32), alice, 1L, tags, "", "")) + assertEquals( + IndexableFields.Tiered( + primary = listOf("podcast", "podcasts", "Podcast", "Podcasts"), + secondary = listOf("shows worth a listen"), + hashtags = listOf("audio"), + ), + fields, + ) + } + + @Test + fun decentralizedListItemHashtagsAreNotIndexedTwice() { + // indexableContent() appends the `t` values; the funnel already carries them as + // hashtags, so the branch leaves them out of every tier (the 1111 reasoning). + val tags = + arrayOf( + arrayOf("z", "podcasts"), + arrayOf("title", "Bitcoin Audible"), + arrayOf("description", "long reads, read aloud"), + arrayOf("comments", "start with the classics"), + arrayOf("t", "bitcoin"), + ) + val fields = SearchFieldExtractor.extract(AddressableListItemEvent("3b".repeat(32), alice, 1L, tags + arrayOf(arrayOf("d", "ba")), "", "")) + assertEquals( + IndexableFields.Tiered( + primary = listOf("Bitcoin Audible"), + secondary = listOf("long reads, read aloud", "start with the classics"), + hashtags = listOf("bitcoin"), + ), + fields, + ) + } + + @Test + fun textTracksIndexWhatIsSaidNotTheTimings() { + val vtt = "WEBVTT\n\n1\n00:00:00.000 --> 00:00:02.000 align:start\nHello nostr\n" + val fields = SearchFieldExtractor.extract(TextTrackEvent("3c".repeat(32), alice, 1L, arrayOf(arrayOf("d", "subtitles:v1")), vtt, "")) + assertEquals(IndexableFields.Tiered(text = "Hello nostr"), fields) + } + @Test fun commentHashtagsAreNotIndexedTwice() { // indexableContent() concatenates the `t` tags INTO the body for kind diff --git a/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/WebVttTextTest.kt b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/WebVttTextTest.kt new file mode 100644 index 0000000000..e435eef505 --- /dev/null +++ b/quartz/src/commonTest/kotlin/com/vitorpamplona/quartz/nip71Video/textTrack/WebVttTextTest.kt @@ -0,0 +1,111 @@ +/* + * 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.nip71Video.textTrack + +import com.vitorpamplona.quartz.nip50Search.IndexableFieldVisitor +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertFalse +import kotlin.test.assertTrue + +class WebVttTextTest { + private val document = + """ + WEBVTT - the whole header line is skipped + Kind: captions + + STYLE + ::cue { color: yellow } + + NOTE this block is a comment + and so is this line + + intro + 00:00:00.000 --> 00:00:02.000 align:start position:10% + We are in New York City + + 00:00:02.500 --> 00:00:04.000 + Really? Tom & Jerry! + on <00:00:03.000>two lines + + 00:00:05.000 --> 00:00:06.000 + + """.trimIndent() + + @Test + fun keepsOnlyTheWordsOfEachCue() { + assertEquals("We are in New York City\nReally? Tom & Jerry!\non two lines", WebVttText.cueText(document)) + } + + @Test + fun theVisitedLinesRejoinToTheCueText() { + val lines = mutableListOf() + assertTrue(WebVttText.forEachCueLine(document, IndexableFieldVisitor { lines.add(it!!) })) + assertEquals(WebVttText.cueText(document), lines.joinToString("\n")) + } + + @Test + fun aVisitorCanStopTheWalk() { + val lines = mutableListOf() + assertFalse( + WebVttText.forEachCueLine(document, IndexableFieldVisitor { lines.add(it!!) && false }), + ) + assertEquals(listOf("We are in New York City"), lines) + } + + @Test + fun crlfAndSrtAreReadTheSameWay() { + val srt = "1\r\n00:00:01,000 --> 00:00:02,000\r\nHello\r\n\r\n2\r\n00:00:03,000 --> 00:00:04,000\r\nworld\r\n" + assertEquals("Hello\nworld", WebVttText.cueText(srt)) + } + + @Test + fun unknownReferencesAndStrayAmpersandsStayAsWritten() { + val vtt = "WEBVTT\n\n00:00.000 --> 00:01.000\nfish & chips &unknown; &#xZZ;" + assertEquals("fish & chips &unknown; &#xZZ;", WebVttText.cueText(vtt)) + } + + @Test + fun anUnterminatedTagRunsToTheEndOfTheLine() { + val vtt = "WEBVTT\n\n00:00.000 --> 00:01.000\nkept () + track.forEachIndexableField { visited.add(it) } + assertEquals(track.indexableContent(), visited.joinToString(track.indexableSeparator())) + + val plain = TextTrackEvent("2".repeat(64), "a1".repeat(32), 1L, tags, "no cues here", "") + assertEquals("no cues here", plain.indexableContent()) + } +}