mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2026-10-05 19:28:25 +00:00
Merge branch 'main' into perf/content-regex-scans
This commit is contained in:
@@ -56,12 +56,16 @@ object MediaAspectRatioCache : MutableMediaAspectRatioCache {
|
||||
|
||||
override fun get(url: String): Float? = entry(url).value
|
||||
|
||||
// Both sides are checked, not just the divisor: a zero width divides cleanly to 0f, and 0f is
|
||||
// just as unusable downstream as a division by zero — `Modifier.aspectRatio` throws on it. A
|
||||
// reported size that cannot be laid out is stored as no size at all, leaving the entry empty
|
||||
// for a later, better report to fill.
|
||||
override fun add(
|
||||
url: String,
|
||||
width: Int,
|
||||
height: Int,
|
||||
) {
|
||||
if (height > 1) {
|
||||
if (width > 0 && height > 1) {
|
||||
entry(url).value = width.toFloat() / height.toFloat()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -66,11 +66,11 @@ fun GifVideoView(
|
||||
accountViewModel: AccountViewModel,
|
||||
thumbhash: String? = null,
|
||||
) {
|
||||
// Pure read path — DimensionTag.aspectRatio() is a one-line int division and
|
||||
// Pure read path — DimensionTag.aspectRatioOrNull() is a one-line int division and
|
||||
// MediaAspectRatioCache.get() is a synchronized LruCache lookup. Wrapping this in
|
||||
// remember() to avoid the recompute would cost more (slot read + N equality checks)
|
||||
// than the work it saves; that's why this stays as a plain expression.
|
||||
val ratio = dimensions?.aspectRatio() ?: MediaAspectRatioCache.get(videoUri)
|
||||
val ratio = dimensions?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(videoUri)
|
||||
val autoPlay = accountViewModel.settings.autoPlayVideos()
|
||||
val borderModifier = if (roundedCorner) MaterialTheme.colorScheme.imageModifier else Modifier
|
||||
val context = LocalContext.current
|
||||
|
||||
@@ -62,11 +62,7 @@ private data class FirstImageOrientation(
|
||||
val isLandscape: Boolean,
|
||||
)
|
||||
|
||||
private fun MediaUrlImage.resolvedAspectRatio(): Float? =
|
||||
dim
|
||||
?.takeIf { it.hasSize() }
|
||||
?.aspectRatio()
|
||||
?: MediaAspectRatioCache.get(url)
|
||||
private fun MediaUrlImage.resolvedAspectRatio(): Float? = dim?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(url)
|
||||
|
||||
private fun MediaUrlImage?.resolveOrientation(
|
||||
landscapeDefaultAspectRatio: Float,
|
||||
|
||||
+11
-1
@@ -240,13 +240,23 @@ fun BlurhashGridBackdrop(media: List<MediaUrlImage>) {
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Sizes a media container from a reported width/height ratio, falling back to width-only when
|
||||
* there is no usable one.
|
||||
*
|
||||
* A ratio that is not finite and positive counts as no ratio: `Modifier.aspectRatio` throws
|
||||
* `IllegalArgumentException` on `0f` and on `NaN`, which would take down the composition around
|
||||
* the media rather than just mis-sizing it. Callers are expected to hand over a clean value
|
||||
* (`DimensionTag.aspectRatioOrNull`, `MediaAspectRatioCache`), so this is the backstop for the one
|
||||
* that forgets, not the primary guard.
|
||||
*/
|
||||
fun mediaSizingModifier(
|
||||
ratio: Float?,
|
||||
contentScale: ContentScale,
|
||||
): Modifier =
|
||||
when {
|
||||
contentScale == ContentScale.Crop -> Modifier.fillMaxSize()
|
||||
ratio != null -> Modifier.fillMaxWidth().aspectRatio(ratio)
|
||||
ratio != null && ratio > 0f && ratio.isFinite() -> Modifier.fillMaxWidth().aspectRatio(ratio)
|
||||
else -> Modifier.fillMaxWidth()
|
||||
}
|
||||
|
||||
|
||||
+2
-2
@@ -628,7 +628,7 @@ private fun RenderImageOrVideo(
|
||||
Modifier.fillMaxWidth()
|
||||
}
|
||||
|
||||
val ratio = content.dim?.aspectRatio() ?: MediaAspectRatioCache.get(content.url)
|
||||
val ratio = content.dim?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(content.url)
|
||||
val useLocalBlossomBridge by accountViewModel.useLocalBlossomBridge.collectAsStateWithLifecycle()
|
||||
val bridgedUrl =
|
||||
remember(content.url, useLocalBlossomBridge) {
|
||||
@@ -694,7 +694,7 @@ private fun RenderImageOrVideo(
|
||||
}
|
||||
|
||||
content.localFile?.let {
|
||||
val ratio = content.dim?.aspectRatio() ?: MediaAspectRatioCache.get(it.toUri().toString())
|
||||
val ratio = content.dim?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(it.toUri().toString())
|
||||
|
||||
val modifier =
|
||||
if (ratio != null) {
|
||||
|
||||
+4
-4
@@ -181,7 +181,7 @@ fun ZoomableContentView(
|
||||
|
||||
when (content) {
|
||||
is MediaUrlImage -> {
|
||||
val ratio = content.dim?.aspectRatio() ?: MediaAspectRatioCache.get(content.url)
|
||||
val ratio = content.dim?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(content.url)
|
||||
val bridgedUrl =
|
||||
remember(content.url, useLocalBlossomBridge) {
|
||||
content.toCoilModel(useLocalBlossomBridge)
|
||||
@@ -228,7 +228,7 @@ fun ZoomableContentView(
|
||||
unknownMediaAspectRatio(content.mimeType, content.url)
|
||||
}
|
||||
val ratio =
|
||||
content.dim?.aspectRatio()
|
||||
content.dim?.aspectRatioOrNull()
|
||||
?: MediaAspectRatioCache.get(content.url)
|
||||
?: fallbackRatio
|
||||
val bridgedUrl =
|
||||
@@ -386,7 +386,7 @@ fun LocalImageView(
|
||||
)
|
||||
}
|
||||
|
||||
val ratio = remember(content) { content.dim?.aspectRatio() ?: MediaAspectRatioCache.get(content.localFile.toString()) }
|
||||
val ratio = remember(content) { content.dim?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(content.localFile.toString()) }
|
||||
val context = LocalContext.current
|
||||
val imageModel =
|
||||
if (fullResolution) {
|
||||
@@ -510,7 +510,7 @@ fun UrlImageView(
|
||||
alwayShowImage: Boolean = false,
|
||||
fullResolution: Boolean = false,
|
||||
) {
|
||||
val ratio = content.dim?.aspectRatio() ?: MediaAspectRatioCache.get(content.url)
|
||||
val ratio = content.dim?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(content.url)
|
||||
|
||||
val showImage =
|
||||
remember {
|
||||
|
||||
@@ -41,11 +41,16 @@ object PdfFetcher {
|
||||
suspend fun fetchSnapshot(
|
||||
url: String,
|
||||
okHttpClient: (String) -> OkHttpClient,
|
||||
): DiskCache.Snapshot {
|
||||
val diskCache = Amethyst.instance.diskCache
|
||||
diskCache.openSnapshot(url)?.let { return it }
|
||||
): DiskCache.Snapshot =
|
||||
withContext(Dispatchers.IO) {
|
||||
val diskCache = Amethyst.instance.diskCache
|
||||
// Covers the cache-hit fast path too, not just the download below it. openSnapshot()
|
||||
// contends on the global DiskLruCache lock, which Coil's cleanup pass holds across a
|
||||
// burst of unlink syscalls (see DeferredDeleteFileSystem) — calling it from a caller
|
||||
// that happens to be on the main thread stalls the frame for that whole burst, and the
|
||||
// hit path is exactly the one a feed takes when a PDF card scrolls back into view.
|
||||
diskCache.openSnapshot(url)?.let { return@withContext it }
|
||||
|
||||
return withContext(Dispatchers.IO) {
|
||||
val editor = diskCache.openEditor(url) ?: throw IOException("Unable to open cache editor for $url")
|
||||
try {
|
||||
val request =
|
||||
@@ -71,5 +76,4 @@ object PdfFetcher {
|
||||
throw t
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+84
-7
@@ -26,6 +26,7 @@ import android.os.ParcelFileDescriptor
|
||||
import androidx.compose.foundation.ExperimentalFoundationApi
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.combinedClickable
|
||||
import androidx.compose.foundation.layout.Box
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.aspectRatio
|
||||
@@ -36,6 +37,7 @@ import androidx.compose.runtime.getValue
|
||||
import androidx.compose.runtime.mutableStateOf
|
||||
import androidx.compose.runtime.produceState
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.graphics.FilterQuality
|
||||
import androidx.compose.ui.graphics.asImageBitmap
|
||||
@@ -44,11 +46,15 @@ import androidx.compose.ui.platform.LocalWindowInfo
|
||||
import androidx.core.graphics.createBitmap
|
||||
import com.vitorpamplona.amethyst.commons.icons.symbols.MaterialSymbols
|
||||
import com.vitorpamplona.amethyst.commons.richtext.MediaUrlPdf
|
||||
import com.vitorpamplona.amethyst.commons.ui.components.LoadingAnimation
|
||||
import com.vitorpamplona.amethyst.model.MediaAspectRatioCache
|
||||
import com.vitorpamplona.amethyst.ui.components.ClickableUrl
|
||||
import com.vitorpamplona.amethyst.ui.components.FileAttachmentRow
|
||||
import com.vitorpamplona.amethyst.ui.components.ShareMediaAction
|
||||
import com.vitorpamplona.amethyst.ui.screen.loggedIn.AccountViewModel
|
||||
import com.vitorpamplona.amethyst.ui.theme.DoubleVertSpacer
|
||||
import com.vitorpamplona.amethyst.ui.theme.Size40dp
|
||||
import com.vitorpamplona.amethyst.ui.theme.Size6dp
|
||||
import com.vitorpamplona.amethyst.ui.theme.innerPostModifier
|
||||
import com.vitorpamplona.quartz.utils.Log
|
||||
import kotlinx.coroutines.CancellationException
|
||||
@@ -58,11 +64,43 @@ import kotlinx.coroutines.withContext
|
||||
// Hard ceiling on the inline thumbnail bitmap, in pixels. Prevents OOM on very tall/large pages.
|
||||
private const val THUMBNAIL_MAX_DIM_PX = 1600
|
||||
|
||||
// Floor for the width/height ratio the card lays out with. A pathologically tall page (a receipt,
|
||||
// a single-column banner) would otherwise reserve a screenful of height for a sliver of content.
|
||||
private const val MIN_PREVIEW_ASPECT_RATIO = 0.2f
|
||||
|
||||
// Shape to assume when the page reports no usable size at all. US Letter portrait — the
|
||||
// overwhelmingly common page shape, and the least surprising box to hold open for an unknown one.
|
||||
private const val DEFAULT_PAGE_ASPECT_RATIO = 612f / 792f
|
||||
|
||||
/**
|
||||
* The ratio the card actually lays out with, given a page's natural width/height. The placeholder
|
||||
* and the loaded thumbnail both go through here so the box reserved while loading is the exact box
|
||||
* the rendered page lands in — the clamp has to be applied on both sides or the reservation is
|
||||
* wrong for the very pages it exists to protect.
|
||||
*
|
||||
* This is also the one place that guarantees `Modifier.aspectRatio` is handed a finite, positive
|
||||
* number. It throws `IllegalArgumentException` on `0f` and on `NaN`, and the clamp below does not
|
||||
* catch either: `NaN.coerceAtLeast(x)` is `NaN`, because every comparison against `NaN` is false.
|
||||
* Both are reachable from real input — a malformed PDF whose first page measures 0x0, or an imeta
|
||||
* `dim` that survives DimensionTag.parse's only-rejects-literal-"0x0" check as 0x0 anyway
|
||||
* (`"0.4x0.4"` truncates to it). Without this guard either one takes down the whole feed's
|
||||
* composition, from a tag any relay can carry.
|
||||
*/
|
||||
internal fun previewAspectRatio(pageAspectRatio: Float): Float =
|
||||
if (!pageAspectRatio.isFinite() || pageAspectRatio <= 0f) {
|
||||
DEFAULT_PAGE_ASPECT_RATIO
|
||||
} else {
|
||||
pageAspectRatio.coerceAtLeast(MIN_PREVIEW_ASPECT_RATIO)
|
||||
}
|
||||
|
||||
data class PdfPreview(
|
||||
val thumbnail: Bitmap,
|
||||
val pageCount: Int,
|
||||
val aspectRatio: Float,
|
||||
)
|
||||
val pageWidth: Int,
|
||||
val pageHeight: Int,
|
||||
) {
|
||||
val aspectRatio: Float = pageWidth.toFloat() / pageHeight.toFloat()
|
||||
}
|
||||
|
||||
private sealed class PdfLoadState {
|
||||
data object Loading : PdfLoadState()
|
||||
@@ -104,6 +142,14 @@ private fun LoadedPdfPreviewCard(
|
||||
containerWidthPx.coerceAtMost(THUMBNAIL_MAX_DIM_PX).coerceAtLeast(1)
|
||||
}
|
||||
|
||||
// Read in composition — never inside a remember — so this recomposes the moment the render
|
||||
// below fills the entry in. On a revisit the entry is already there and the placeholder can
|
||||
// reserve the right box from the first frame, which is the whole point of caching it.
|
||||
// The cache is consulted ahead of the imeta `dim` because it holds the page size this card
|
||||
// measured itself: an author-supplied `dim` that disagrees would guarantee the jump on every
|
||||
// single visit, which is exactly what this is here to stop.
|
||||
val knownAspectRatio = MediaAspectRatioCache.get(content.url) ?: content.dim?.aspectRatioOrNull()
|
||||
|
||||
@Suppress("ProduceStateDoesNotAssignValue")
|
||||
val state by produceState<PdfLoadState>(initialValue = PdfLoadState.Loading, key1 = content.url, key2 = targetWidthPx) {
|
||||
value =
|
||||
@@ -115,6 +161,13 @@ private fun LoadedPdfPreviewCard(
|
||||
withContext(Dispatchers.IO) {
|
||||
renderFirstPage(snapshot.data.toFile(), targetWidthPx)
|
||||
}
|
||||
}.also { result ->
|
||||
// Same cache the image and video paths use, so a PDF that has been rendered
|
||||
// once lays out at its real shape on every later visit instead of growing
|
||||
// from a bare filename row into a full page.
|
||||
if (result is PdfLoadState.Ready) {
|
||||
MediaAspectRatioCache.add(content.url, result.preview.pageWidth, result.preview.pageHeight)
|
||||
}
|
||||
}
|
||||
} catch (e: Exception) {
|
||||
if (e is CancellationException) throw e
|
||||
@@ -134,7 +187,7 @@ private fun LoadedPdfPreviewCard(
|
||||
|
||||
when (val current = state) {
|
||||
is PdfLoadState.Loading -> {
|
||||
PdfSkeletonCard(filename)
|
||||
PdfSkeletonCard(filename, knownAspectRatio)
|
||||
}
|
||||
|
||||
is PdfLoadState.Failed -> {
|
||||
@@ -150,15 +203,20 @@ private fun LoadedPdfPreviewCard(
|
||||
onLongClick = { sharePopupExpanded.value = true },
|
||||
),
|
||||
) {
|
||||
// asImageBitmap() allocates a fresh wrapper on every call and the wrapper compares
|
||||
// by identity, so calling it inline would defeat the remember(bitmap) that Image
|
||||
// uses to hold its BitmapPainter — every recomposition would rebuild the painter.
|
||||
val thumbnail = remember(current.preview.thumbnail) { current.preview.thumbnail.asImageBitmap() }
|
||||
|
||||
Image(
|
||||
bitmap = current.preview.thumbnail.asImageBitmap(),
|
||||
bitmap = thumbnail,
|
||||
contentDescription = content.description ?: filename,
|
||||
contentScale = ContentScale.FillWidth,
|
||||
filterQuality = FilterQuality.High,
|
||||
modifier =
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.aspectRatio(current.preview.aspectRatio.coerceAtLeast(0.2f)),
|
||||
.aspectRatio(previewAspectRatio(current.preview.aspectRatio)),
|
||||
)
|
||||
|
||||
FilenameRow(filename = filename, subtitle = pageCountLabel(current.preview.pageCount))
|
||||
@@ -187,8 +245,26 @@ private fun PlaceholderPdfCard(
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun PdfSkeletonCard(filename: String) {
|
||||
private fun PdfSkeletonCard(
|
||||
filename: String,
|
||||
aspectRatio: Float?,
|
||||
) {
|
||||
Column(modifier = MaterialTheme.colorScheme.innerPostModifier.fillMaxWidth()) {
|
||||
// Only known on a revisit — the first render is what fills the cache — so the first sight of
|
||||
// a PDF still grows into place. From then on the page's box is held open while it renders
|
||||
// and the feed stays put.
|
||||
if (aspectRatio != null) {
|
||||
Box(
|
||||
modifier =
|
||||
Modifier
|
||||
.fillMaxWidth()
|
||||
.aspectRatio(previewAspectRatio(aspectRatio)),
|
||||
contentAlignment = Alignment.Center,
|
||||
) {
|
||||
LoadingAnimation(Size40dp, Size6dp)
|
||||
}
|
||||
}
|
||||
|
||||
FilenameRow(filename = filename, subtitle = "Loading…")
|
||||
Spacer(modifier = DoubleVertSpacer)
|
||||
}
|
||||
@@ -223,7 +299,8 @@ private fun renderFirstPage(
|
||||
PdfPreview(
|
||||
thumbnail = bitmap,
|
||||
pageCount = pageCount,
|
||||
aspectRatio = page.width.toFloat() / page.height.toFloat(),
|
||||
pageWidth = page.width,
|
||||
pageHeight = page.height,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
@@ -107,7 +107,7 @@ fun PictureDisplay(
|
||||
}
|
||||
|
||||
if (images.size == 1) {
|
||||
val ratio = first.dim?.aspectRatio() ?: MediaAspectRatioCache.get(first.url)
|
||||
val ratio = first.dim?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(first.url)
|
||||
ContentWarningGate(
|
||||
isSensitive = isSensitive,
|
||||
reasons = reasons,
|
||||
|
||||
@@ -92,7 +92,7 @@ fun JustVideoDisplay(
|
||||
)
|
||||
}
|
||||
|
||||
val ratio = imeta.dimension?.aspectRatio() ?: MediaAspectRatioCache.get(imeta.url)
|
||||
val ratio = imeta.dimension?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(imeta.url)
|
||||
|
||||
ContentWarningGate(
|
||||
isSensitive = isSensitive,
|
||||
|
||||
+1
-1
@@ -125,7 +125,7 @@ private fun PictureCardImage(
|
||||
|
||||
if (images.size == 1) {
|
||||
val single = images.first()
|
||||
val ratio = single.dim?.aspectRatio() ?: MediaAspectRatioCache.get(single.url)
|
||||
val ratio = single.dim?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(single.url)
|
||||
ContentWarningGate(
|
||||
isSensitive = isSensitive,
|
||||
reasons = reasons,
|
||||
|
||||
+1
-1
@@ -141,7 +141,7 @@ private fun VideoCardImage(
|
||||
)
|
||||
}
|
||||
|
||||
val ratio = imeta.dimension?.aspectRatio() ?: MediaAspectRatioCache.get(imeta.url)
|
||||
val ratio = imeta.dimension?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(imeta.url)
|
||||
|
||||
ContentWarningGate(
|
||||
isSensitive = isSensitive,
|
||||
|
||||
+1
-1
@@ -125,7 +125,7 @@ private fun FileHeaderCardImage(
|
||||
}
|
||||
|
||||
val isImage = content is MediaUrlImage
|
||||
val ratio = dimensions?.aspectRatio() ?: MediaAspectRatioCache.get(fullUrl)
|
||||
val ratio = dimensions?.aspectRatioOrNull() ?: MediaAspectRatioCache.get(fullUrl)
|
||||
|
||||
ContentWarningGate(
|
||||
isSensitive = isSensitive,
|
||||
|
||||
@@ -54,6 +54,8 @@
|
||||
<string name="violence">Násilí</string>
|
||||
<string name="unknown_author">Neznámý autor</string>
|
||||
<string name="copy_text">Kopírovat text</string>
|
||||
<string name="copy_text_original">Kopírovat originál</string>
|
||||
<string name="copy_text_translated">Kopírovat překlad</string>
|
||||
<string name="copy_user_pubkey">Kopírovat ID autora</string>
|
||||
<string name="copy_note_id">Kopírovat ID poznámky</string>
|
||||
<string name="copy_raw_json">Kopírovat surový JSON</string>
|
||||
@@ -318,6 +320,18 @@
|
||||
<string name="concord_invite_failed_invalid">Tento zvací odkaz je neplatný nebo jej nelze otevřít tímto účtem.</string>
|
||||
<string name="concord_invite_failed_incompatible">Tento zvací odkaz nelze otevřít. Může být zastaralý nebo již nahrazený novějším, případně vytvořený novější verzí aplikace. Vyžádejte si nový zvací odkaz.</string>
|
||||
<string name="concord_invite_failed_revoked">Tento zvací odkaz byl zrušen a již jej nelze použít. Vyžádejte si nový.</string>
|
||||
<string name="concord_invite_failed_banned">Tato komunita vás odebrala. Odkaz stále funguje, ale její seznam členů vás nevpustí.</string>
|
||||
<string name="concord_invite_links_title">Odkazy pro pozvání</string>
|
||||
<string name="concord_invite_links_action">Odkazy pro pozvání…</string>
|
||||
<string name="concord_invite_links_created">Vytvořeno %1$s</string>
|
||||
<string name="concord_invite_links_empty">Pro tuto komunitu jste zatím nevytvořil žádné odkazy pro pozvání. Odkazy vytvořené jinými správci se spravují na jejich vlastních zařízeních.</string>
|
||||
<string name="concord_invite_links_unreadable">Vaše odkazy pro pozvání se nepodařilo načíst, takže žádný z nich nyní nelze zrušit. Zkontrolujte připojení a zkuste to znovu.</string>
|
||||
<string name="concord_invite_revoke_action">Zrušit odkaz</string>
|
||||
<string name="concord_invite_revoke_title">Zrušit tento odkaz?</string>
|
||||
<string name="concord_invite_revoke_explainer">Kdokoli, kdo tento odkaz stále má, se už nebude moci připojit. Lidé, kteří se přes něj již připojili, v komunitě zůstávají. Tuto akci nelze vzít zpět.</string>
|
||||
<string name="concord_invite_revoke_confirm">Zrušit</string>
|
||||
<string name="concord_invite_revoked_ok">Odkaz pro pozvání byl zrušen.</string>
|
||||
<string name="concord_invite_revoked_failed">Odkaz se nepodařilo zrušit. Zkontrolujte připojení a zkuste to znovu.</string>
|
||||
<string name="concord_invite_failed_expired">Platnost tohoto pozvánkového odkazu vypršela a nelze jej již použít. Vyžádejte si nový odkaz.</string>
|
||||
<string name="concord_invite_preview_unknown_name">Název komunity se zobrazí až po připojení</string>
|
||||
<string name="concord_invite_preview_explainer">Připojením se spojíte s relayi této pozvánky, zveřejníte oznámení o připojení podepsané vaším účtem a přidáte komunitu do svého seznamu. Dokud nestisknete Připojit se, nic se neodešle.</string>
|
||||
@@ -515,6 +529,11 @@
|
||||
\n- **Udržujte** bezpečnou zálohu vašeho tajného klíče pro obnovení účtu. Doporučujeme použití správce hesel.</string>
|
||||
<string name="account_backup_tips3_md" tools:ignore="Typos"> Pro další zabezpečení můžete svůj klíč zašifrovat heslem. Tento klíč začíná s **ncryptsec1** a nelze ho použít bez vašeho hesla.
|
||||
\n\nPokud zapomenete heslo, nebudete moci obnovit svůj klíč.</string>
|
||||
<string name="backup_keys_nudge_title">Zálohujte si klíče</string>
|
||||
<string name="backup_keys_nudge_body">Váš tajný klíč je jediný způsob, jak se k tomuto účtu dostat. Pokud ho ztratíte, nelze ho už nikdy obnovit. Uložte si ho někam do bezpečí.</string>
|
||||
<string name="backup_keys_nudge_backup_now">Zálohovat nyní</string>
|
||||
<string name="backup_keys_nudge_already_saved">Uložil jsem si je</string>
|
||||
<string name="backup_keys_nudge_dismiss">Zavřít</string>
|
||||
<string name="failed_to_encrypt_key">Nepodařilo se zašifrovat váš privátní klíč</string>
|
||||
<string name="secret_key_copied_to_clipboard">Tajný klíč (nsec) zkopírován do schránky</string>
|
||||
<string name="copy_my_secret_key">Zkopírovat můj tajný klíč</string>
|
||||
@@ -1150,12 +1169,71 @@
|
||||
<!-- The group header carries the grammar; each toggle is a completion of the sentence, so these
|
||||
keys are new rather than reused - a stale translation of the old standalone titles would
|
||||
read as a non-sequitur under this header. -->
|
||||
<string name="relay_auth_auto_login_when">Přihlásit se bez ptaní, když…</string>
|
||||
<string name="relay_auth_auto_my_relays">…jde o mé relé nebo o místnost, do které jsem vstoupil</string>
|
||||
<string name="relay_auth_auto_read_follows">…čtu někoho, koho sleduji</string>
|
||||
<string name="relay_auth_auto_message_follows">…píšu někomu, koho sleduji</string>
|
||||
<string name="relay_auth_auto_message_strangers">…píšu komukoli jinému</string>
|
||||
<!-- The AUTH prompt. The title is constant and names the account whose npub would be revealed;
|
||||
exactly one "why" line varies, and it states the consequence of declining too, which is why
|
||||
there is no separate "if you don\'t" line. New keys throughout: these replaced a set of
|
||||
labels ("Notify:", "Post to this room") whose translations would otherwise still bind. -->
|
||||
<string name="relay_auth_login_as">Přihlásit se jako %1$s?</string>
|
||||
<string name="relay_auth_relay_asks">se ptá, kdo jste</string>
|
||||
<string name="relay_auth_why_send_dm">Dokud se nepřihlásíte, nepřijme vaši zprávu pro %1$s.</string>
|
||||
<string name="relay_auth_why_notify_inbox">%1$s se o vaší odpovědi nedozví, dokud se nepřihlásíte.</string>
|
||||
<string name="relay_auth_why_read_outbox">Dokud se nepřihlásíte, nebude vydávat příspěvky od %1$s.</string>
|
||||
<string name="relay_auth_why_post_venue">Dokud se nepřihlásíte, nepřijme váš příspěvek v %1$s.</string>
|
||||
<string name="relay_auth_why_read_venue">Dokud se nepřihlásíte, nebude vydávat %1$s.</string>
|
||||
<string name="relay_auth_why_my_inbox">Dokud se nepřihlásíte, nebude vydávat odpovědi, zapy ani zprávy poslané vám.</string>
|
||||
<string name="relay_auth_why_thread">Dokud se nepřihlásíte, nebude vydávat zbytek této konverzace.</string>
|
||||
<string name="relay_auth_why_thread_with">Dokud se nepřihlásíte, nebude vydávat zbytek vaší konverzace s %1$s.</string>
|
||||
<string name="relay_auth_why_my_own_relay">Toto je jedno z vašich vlastních relé a žádá o přihlášení každého.</string>
|
||||
<string name="relay_auth_why_other">Žádá o přihlášení každého. Amethyst nedokáže zjistit, co zadržuje.</string>
|
||||
<string name="relay_auth_someone_unloaded">někdo, koho jste ještě nenačetl</string>
|
||||
<plurals name="relay_auth_name_and_n_others">
|
||||
<item quantity="one">%1$s a %2$d další</item>
|
||||
<item quantity="few">%1$s a %2$d další</item>
|
||||
<item quantity="many">%1$s a %2$d dalšího</item>
|
||||
<item quantity="other">%1$s a %2$d dalších</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_also_holding_back">
|
||||
<item quantity="one">Zadržuje také %1$d další věc.</item>
|
||||
<item quantity="few">Zadržuje také %1$d další věci.</item>
|
||||
<item quantity="many">Zadržuje také %1$d další věci.</item>
|
||||
<item quantity="other">Zadržuje také %1$d dalších věcí.</item>
|
||||
</plurals>
|
||||
<string name="relay_auth_remember_relay">Zapamatovat pro toto relé</string>
|
||||
<string name="relay_auth_log_in">Přihlásit se</string>
|
||||
<string name="relay_auth_not_now">Teď ne</string>
|
||||
<string name="relay_auth_never_allow">Nikdy nepovolovat</string>
|
||||
<string name="relay_auth_how_we_decide">Jak se Amethyst rozhoduje</string>
|
||||
<!-- Settings: three lists that each hold what their header says. -->
|
||||
<string name="relay_auth_exceptions">Výjimky</string>
|
||||
<string name="relay_auth_no_exceptions">Zatím žádné výjimky. Všechna relé se řídí pravidly výše.</string>
|
||||
<string name="relay_auth_exception_always">Vždy, nastaveno vámi</string>
|
||||
<string name="relay_auth_exception_never">Nikdy, nastaveno vámi</string>
|
||||
<string name="relay_auth_segment_always">Vždy</string>
|
||||
<string name="relay_auth_segment_never">Nikdy</string>
|
||||
<string name="relay_auth_remove_exception">Odebrat výjimku</string>
|
||||
<string name="relay_auth_exception_removed_undo">Výjimka odebrána. %1$s se opět řídí vašimi pravidly.</string>
|
||||
<string name="relay_auth_undo">Zpět</string>
|
||||
<string name="relay_auth_blocked_section">Blokováno vaším seznamem blokovaných</string>
|
||||
<string name="relay_auth_blocked_row_desc">Amethyst se k blokovaným relé nikdy nepřihlašuje.</string>
|
||||
<string name="relay_auth_no_blocked">Nic není blokováno. K relé, která zablokujete, se Amethyst nikdy nepřihlásí, ať zde nastavíte cokoli.</string>
|
||||
<string name="relay_auth_recent_section">Nedávná přihlášení</string>
|
||||
<string name="relay_auth_no_recent">Zatím vás o přihlášení nepožádalo žádné relé.</string>
|
||||
<string name="relay_auth_ago">před %1$s</string>
|
||||
<!-- Short labels for the purpose chips on a "recent logins" row. -->
|
||||
<string name="relay_auth_purpose_send_dm">vaše zprávy</string>
|
||||
<string name="relay_auth_purpose_notify_inbox">vaše odpovědi</string>
|
||||
<string name="relay_auth_purpose_read_outbox">lidé, které čtete</string>
|
||||
<string name="relay_auth_purpose_post_venue">místnost, do které přispíváte</string>
|
||||
<string name="relay_auth_purpose_read_venue">místnost, kterou čtete</string>
|
||||
<string name="relay_auth_purpose_my_inbox">vaše doručená pošta</string>
|
||||
<string name="relay_auth_purpose_thread">konverzace</string>
|
||||
<string name="relay_auth_purpose_my_own_relay">vaše vlastní relé</string>
|
||||
<string name="relay_auth_purpose_other">toto relé</string>
|
||||
<string name="nip82_repository_label">Zdroj: %1$s</string>
|
||||
<string name="nip82_version_label">v%1$s</string>
|
||||
<string name="nip82_download">Stáhnout</string>
|
||||
@@ -1534,6 +1612,58 @@
|
||||
<string name="private_note_visible_to">Viditelné pro</string>
|
||||
<string name="private_note_no_receivers">Zatím žádní příjemci: tuto poznámku uvidíš jen ty. Přidej lidi, se kterými ji chceš sdílet.</string>
|
||||
<!-- Composer audience control (Notify / "Visible to") -->
|
||||
<string name="audience_manage">Spravovat, kdo to uvidí</string>
|
||||
<string name="audience_empty_private">Jen vy — vyberte, kdo další to uvidí</string>
|
||||
<string name="audience_empty_public">Přidejte lidi, kterým přijde upozornění</string>
|
||||
<string name="audience_summary_two">%1$s a %2$s</string>
|
||||
<string name="audience_group_chip">%1$s · %2$s</string>
|
||||
<string name="audience_group_remove">Odebrat všechny přidané ze seznamu %1$s</string>
|
||||
<string name="audience_send_privately">Poslat soukromě</string>
|
||||
<string name="audience_sheet_title">Přidat lidi</string>
|
||||
<string name="audience_sheet_search">Hledat lidi a seznamy</string>
|
||||
<string name="audience_sheet_no_lists">Zatím nemáte žádné seznamy lidí ani balíčky sledování. Vyhledáváním výše můžete někoho přidat přímo.</string>
|
||||
<string name="audience_count_with_private">%1$d · %2$d soukromě</string>
|
||||
<string name="audience_over_limit">Překročen limit</string>
|
||||
<string name="audience_badge_already_added">Již přidáno</string>
|
||||
<string name="audience_badge_muted">Ztlumeno</string>
|
||||
<string name="audience_badge_private_member">Soukromý člen</string>
|
||||
<string name="audience_recipients_are_visible">Každý, kdo je v této poznámce, vidí celý seznam příjemců.</string>
|
||||
<plurals name="audience_summary_others">
|
||||
<item quantity="one">%1$s, %2$s a %3$d další</item>
|
||||
<item quantity="few">%1$s, %2$s a %3$d další</item>
|
||||
<item quantity="many">%1$s, %2$s a %3$d dalšího</item>
|
||||
<item quantity="other">%1$s, %2$s a %3$d dalších</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_private">
|
||||
<item quantity="one">Tato poznámka bude zašifrována a doručena jako %1$d samostatná zpráva, jedna pro každou osobu. S externím podepisovačem to znamená jedno schválení za každou.</item>
|
||||
<item quantity="few">Tato poznámka bude zašifrována a doručena jako %1$d samostatné zprávy, jedna pro každou osobu. S externím podepisovačem to znamená jedno schválení za každou.</item>
|
||||
<item quantity="many">Tato poznámka bude zašifrována a doručena jako %1$d samostatné zprávy, jedna pro každou osobu. S externím podepisovačem to znamená jedno schválení za každou.</item>
|
||||
<item quantity="other">Tato poznámka bude zašifrována a doručena jako %1$d samostatných zpráv, jedna pro každou osobu. S externím podepisovačem to znamená jedno schválení za každou.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_public">
|
||||
<item quantity="one">Upozornění na tento příspěvek dostane %1$d osoba.</item>
|
||||
<item quantity="few">Upozornění na tento příspěvek dostanou %1$d osoby.</item>
|
||||
<item quantity="many">Upozornění na tento příspěvek dostane %1$d osoby.</item>
|
||||
<item quantity="other">Upozornění na tento příspěvek dostane %1$d osob.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_hard_cap">
|
||||
<item quantity="one">To by byla %1$d osoba. Amethyst přidá najednou nejvýše %2$d — několik jich odznačte.</item>
|
||||
<item quantity="few">To by byly %1$d osoby. Amethyst přidá najednou nejvýše %2$d — několik jich odznačte.</item>
|
||||
<item quantity="many">To by bylo %1$d osoby. Amethyst přidá najednou nejvýše %2$d — několik jich odznačte.</item>
|
||||
<item quantity="other">To by bylo %1$d osob. Amethyst přidá najednou nejvýše %2$d — několik jich odznačte.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_people">
|
||||
<item quantity="one">Přidat %1$d osobu</item>
|
||||
<item quantity="few">Přidat %1$d osoby</item>
|
||||
<item quantity="many">Přidat %1$d osoby</item>
|
||||
<item quantity="other">Přidat %1$d osob</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_anyway">
|
||||
<item quantity="one">Přesto přidat %1$d osobu</item>
|
||||
<item quantity="few">Přesto přidat %1$d osoby</item>
|
||||
<item quantity="many">Přesto přidat %1$d osoby</item>
|
||||
<item quantity="other">Přesto přidat %1$d osob</item>
|
||||
</plurals>
|
||||
<string name="notify_add_user">Přidat</string>
|
||||
<string name="notify_remove_user">Odebrat uživatele z oznámení</string>
|
||||
<string name="notify_mute_user">Upozorňování zapnuto. Klepnutím ztlumíte upozornění pro tohoto uživatele</string>
|
||||
@@ -4028,6 +4158,65 @@
|
||||
<string name="social_proof">Sociální důkaz</string>
|
||||
<string name="poll_submit">Odeslat</string>
|
||||
<string name="poll_view_results">Zobrazit výsledky</string>
|
||||
<string name="poll_results_title">Výsledky ankety</string>
|
||||
<string name="poll_results_loading">Načítá se anketa…</string>
|
||||
<string name="poll_results_open">Otevřená</string>
|
||||
<string name="poll_results_closes_in">Končí za %1$s</string>
|
||||
<string name="poll_results_ended">Skončila před %1$s</string>
|
||||
<string name="poll_results_all_options">Všechny možnosti</string>
|
||||
<string name="poll_results_your_pick">Váš hlas</string>
|
||||
<plurals name="poll_results_selections">
|
||||
<item quantity="one">· %1$d výběr</item>
|
||||
<item quantity="few">· %1$d výběry</item>
|
||||
<item quantity="many">· %1$d výběru</item>
|
||||
<item quantity="other">· %1$d výběrů</item>
|
||||
</plurals>
|
||||
<string name="poll_results_no_votes">Zatím žádné hlasy</string>
|
||||
<string name="poll_results_checking_completeness">Zjišťuje se, kolik hlasů existuje…</string>
|
||||
<string name="poll_results_partial">Načteno %1$d z %2$d odpovědí z %3$d relé.</string>
|
||||
<string name="poll_results_partial_approx">Načteno %1$d z přibližně %2$d odpovědí z %3$d relé.</string>
|
||||
<plurals name="poll_results_voters">
|
||||
<item quantity="one">hlasující</item>
|
||||
<item quantity="few">hlasující</item>
|
||||
<item quantity="many">hlasujícího</item>
|
||||
<item quantity="other">hlasujících</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_vote_count_link">
|
||||
<item quantity="one">%1$d hlas ›</item>
|
||||
<item quantity="few">%1$d hlasy ›</item>
|
||||
<item quantity="many">%1$d hlasu ›</item>
|
||||
<item quantity="other">%1$d hlasů ›</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_option_count">
|
||||
<item quantity="one">%1$d hlasující</item>
|
||||
<item quantity="few">%1$d hlasující</item>
|
||||
<item quantity="many">%1$d hlasujícího</item>
|
||||
<item quantity="other">%1$d hlasujících</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_late_votes">
|
||||
<item quantity="one">%1$d hlas dorazil po uzavření ankety a je vyloučen.</item>
|
||||
<item quantity="few">%1$d hlasy dorazily po uzavření ankety a jsou vyloučeny.</item>
|
||||
<item quantity="many">%1$d hlasu dorazilo po uzavření ankety a je vyloučeno.</item>
|
||||
<item quantity="other">%1$d hlasů dorazilo po uzavření ankety a je vyloučeno.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_backdated_votes">
|
||||
<item quantity="one">%1$d hlas má datum před zveřejněním ankety a je vyloučen.</item>
|
||||
<item quantity="few">%1$d hlasy mají datum před zveřejněním ankety a jsou vyloučeny.</item>
|
||||
<item quantity="many">%1$d hlasu má datum před zveřejněním ankety a je vyloučeno.</item>
|
||||
<item quantity="other">%1$d hlasů má datum před zveřejněním ankety a je vyloučeno.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_ignored_votes">
|
||||
<item quantity="one">%1$d odpověď nevybrala platnou možnost a je vyloučena.</item>
|
||||
<item quantity="few">%1$d odpovědi nevybraly platnou možnost a jsou vyloučeny.</item>
|
||||
<item quantity="many">%1$d odpovědi nevybralo platnou možnost a je vyloučeno.</item>
|
||||
<item quantity="other">%1$d odpovědí nevybralo platnou možnost a je vyloučeno.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_hidden_voters">
|
||||
<item quantity="one">%1$d hlasující je skryt vaším seznamem ztlumených.</item>
|
||||
<item quantity="few">%1$d hlasující jsou skryti vaším seznamem ztlumených.</item>
|
||||
<item quantity="many">%1$d hlasujícího je skryto vaším seznamem ztlumených.</item>
|
||||
<item quantity="other">%1$d hlasujících je skryto vaším seznamem ztlumených.</item>
|
||||
</plurals>
|
||||
<string name="restart">Restartovat</string>
|
||||
<string name="chess_accept">Přijmout</string>
|
||||
<string name="chess_decline">Odmítnout</string>
|
||||
@@ -4895,193 +5084,4 @@
|
||||
<string name="buzz_persona_avatar">URL avataru (volitelné)</string>
|
||||
<string name="buzz_persona_publishing">Publikování…</string>
|
||||
<string name="buzz_persona_publish">Publikovat personu</string>
|
||||
<string name="audience_badge_already_added">Již přidáno</string>
|
||||
<string name="audience_badge_muted">Ztlumeno</string>
|
||||
<string name="audience_badge_private_member">Soukromý člen</string>
|
||||
<string name="audience_count_with_private">%1$d · %2$d soukromě</string>
|
||||
<string name="audience_empty_private">Jen vy — vyberte, kdo další to uvidí</string>
|
||||
<string name="audience_empty_public">Přidejte lidi, kterým přijde upozornění</string>
|
||||
<string name="audience_group_chip">%1$s · %2$s</string>
|
||||
<string name="audience_group_remove">Odebrat všechny přidané ze seznamu %1$s</string>
|
||||
<string name="audience_manage">Spravovat, kdo to uvidí</string>
|
||||
<string name="audience_over_limit">Překročen limit</string>
|
||||
<string name="audience_recipients_are_visible">Každý, kdo je v této poznámce, vidí celý seznam příjemců.</string>
|
||||
<string name="audience_send_privately">Poslat soukromě</string>
|
||||
<string name="audience_sheet_no_lists">Zatím nemáte žádné seznamy lidí ani balíčky sledování. Vyhledáváním výše můžete někoho přidat přímo.</string>
|
||||
<string name="audience_sheet_search">Hledat lidi a seznamy</string>
|
||||
<string name="audience_sheet_title">Přidat lidi</string>
|
||||
<string name="audience_summary_two">%1$s a %2$s</string>
|
||||
<string name="backup_keys_nudge_already_saved">Uložil jsem si je</string>
|
||||
<string name="backup_keys_nudge_backup_now">Zálohovat nyní</string>
|
||||
<string name="backup_keys_nudge_body">Váš tajný klíč je jediný způsob, jak se k tomuto účtu dostat. Pokud ho ztratíte, nelze ho už nikdy obnovit. Uložte si ho někam do bezpečí.</string>
|
||||
<string name="backup_keys_nudge_dismiss">Zavřít</string>
|
||||
<string name="backup_keys_nudge_title">Zálohujte si klíče</string>
|
||||
<string name="concord_invite_failed_banned">Tato komunita vás odebrala. Odkaz stále funguje, ale její seznam členů vás nevpustí.</string>
|
||||
<string name="concord_invite_links_action">Odkazy pro pozvání…</string>
|
||||
<string name="concord_invite_links_created">Vytvořeno %1$s</string>
|
||||
<string name="concord_invite_links_empty">Pro tuto komunitu jste zatím nevytvořil žádné odkazy pro pozvání. Odkazy vytvořené jinými správci se spravují na jejich vlastních zařízeních.</string>
|
||||
<string name="concord_invite_links_title">Odkazy pro pozvání</string>
|
||||
<string name="concord_invite_links_unreadable">Vaše odkazy pro pozvání se nepodařilo načíst, takže žádný z nich nyní nelze zrušit. Zkontrolujte připojení a zkuste to znovu.</string>
|
||||
<string name="concord_invite_revoke_action">Zrušit odkaz</string>
|
||||
<string name="concord_invite_revoke_confirm">Zrušit</string>
|
||||
<string name="concord_invite_revoke_explainer">Kdokoli, kdo tento odkaz stále má, se už nebude moci připojit. Lidé, kteří se přes něj již připojili, v komunitě zůstávají. Tuto akci nelze vzít zpět.</string>
|
||||
<string name="concord_invite_revoke_title">Zrušit tento odkaz?</string>
|
||||
<string name="concord_invite_revoked_failed">Odkaz se nepodařilo zrušit. Zkontrolujte připojení a zkuste to znovu.</string>
|
||||
<string name="concord_invite_revoked_ok">Odkaz pro pozvání byl zrušen.</string>
|
||||
<string name="copy_text_original">Kopírovat originál</string>
|
||||
<string name="copy_text_translated">Kopírovat překlad</string>
|
||||
<string name="poll_results_all_options">Všechny možnosti</string>
|
||||
<string name="poll_results_checking_completeness">Zjišťuje se, kolik hlasů existuje…</string>
|
||||
<string name="poll_results_closes_in">Končí za %1$s</string>
|
||||
<string name="poll_results_ended">Skončila před %1$s</string>
|
||||
<string name="poll_results_loading">Načítá se anketa…</string>
|
||||
<string name="poll_results_no_votes">Zatím žádné hlasy</string>
|
||||
<string name="poll_results_open">Otevřená</string>
|
||||
<string name="poll_results_partial">Načteno %1$d z %2$d odpovědí z %3$d relé.</string>
|
||||
<string name="poll_results_partial_approx">Načteno %1$d z přibližně %2$d odpovědí z %3$d relé.</string>
|
||||
<string name="poll_results_title">Výsledky ankety</string>
|
||||
<string name="poll_results_your_pick">Váš hlas</string>
|
||||
<string name="relay_auth_ago">před %1$s</string>
|
||||
<string name="relay_auth_auto_login_when">Přihlásit se bez ptaní, když…</string>
|
||||
<string name="relay_auth_auto_message_follows">…píšu někomu, koho sleduji</string>
|
||||
<string name="relay_auth_auto_message_strangers">…píšu komukoli jinému</string>
|
||||
<string name="relay_auth_auto_my_relays">…jde o mé relé nebo o místnost, do které jsem vstoupil</string>
|
||||
<string name="relay_auth_auto_read_follows">…čtu někoho, koho sleduji</string>
|
||||
<string name="relay_auth_blocked_row_desc">Amethyst se k blokovaným relé nikdy nepřihlašuje.</string>
|
||||
<string name="relay_auth_blocked_section">Blokováno vaším seznamem blokovaných</string>
|
||||
<string name="relay_auth_exception_always">Vždy, nastaveno vámi</string>
|
||||
<string name="relay_auth_exception_never">Nikdy, nastaveno vámi</string>
|
||||
<string name="relay_auth_exception_removed_undo">Výjimka odebrána. %1$s se opět řídí vašimi pravidly.</string>
|
||||
<string name="relay_auth_exceptions">Výjimky</string>
|
||||
<string name="relay_auth_how_we_decide">Jak se Amethyst rozhoduje</string>
|
||||
<string name="relay_auth_log_in">Přihlásit se</string>
|
||||
<string name="relay_auth_login_as">Přihlásit se jako %1$s?</string>
|
||||
<string name="relay_auth_never_allow">Nikdy nepovolovat</string>
|
||||
<string name="relay_auth_no_blocked">Nic není blokováno. K relé, která zablokujete, se Amethyst nikdy nepřihlásí, ať zde nastavíte cokoli.</string>
|
||||
<string name="relay_auth_no_exceptions">Zatím žádné výjimky. Všechna relé se řídí pravidly výše.</string>
|
||||
<string name="relay_auth_no_recent">Zatím vás o přihlášení nepožádalo žádné relé.</string>
|
||||
<string name="relay_auth_not_now">Teď ne</string>
|
||||
<string name="relay_auth_purpose_my_inbox">vaše doručená pošta</string>
|
||||
<string name="relay_auth_purpose_my_own_relay">vaše vlastní relé</string>
|
||||
<string name="relay_auth_purpose_notify_inbox">vaše odpovědi</string>
|
||||
<string name="relay_auth_purpose_other">toto relé</string>
|
||||
<string name="relay_auth_purpose_post_venue">místnost, do které přispíváte</string>
|
||||
<string name="relay_auth_purpose_read_outbox">lidé, které čtete</string>
|
||||
<string name="relay_auth_purpose_read_venue">místnost, kterou čtete</string>
|
||||
<string name="relay_auth_purpose_send_dm">vaše zprávy</string>
|
||||
<string name="relay_auth_purpose_thread">konverzace</string>
|
||||
<string name="relay_auth_recent_section">Nedávná přihlášení</string>
|
||||
<string name="relay_auth_relay_asks">se ptá, kdo jste</string>
|
||||
<string name="relay_auth_remember_relay">Zapamatovat pro toto relé</string>
|
||||
<string name="relay_auth_remove_exception">Odebrat výjimku</string>
|
||||
<string name="relay_auth_segment_always">Vždy</string>
|
||||
<string name="relay_auth_segment_never">Nikdy</string>
|
||||
<string name="relay_auth_someone_unloaded">někdo, koho jste ještě nenačetl</string>
|
||||
<string name="relay_auth_undo">Zpět</string>
|
||||
<string name="relay_auth_why_my_inbox">Dokud se nepřihlásíte, nebude vydávat odpovědi, zapy ani zprávy poslané vám.</string>
|
||||
<string name="relay_auth_why_my_own_relay">Toto je jedno z vašich vlastních relé a žádá o přihlášení každého.</string>
|
||||
<string name="relay_auth_why_notify_inbox">%1$s se o vaší odpovědi nedozví, dokud se nepřihlásíte.</string>
|
||||
<string name="relay_auth_why_other">Žádá o přihlášení každého. Amethyst nedokáže zjistit, co zadržuje.</string>
|
||||
<string name="relay_auth_why_post_venue">Dokud se nepřihlásíte, nepřijme váš příspěvek v %1$s.</string>
|
||||
<string name="relay_auth_why_read_outbox">Dokud se nepřihlásíte, nebude vydávat příspěvky od %1$s.</string>
|
||||
<string name="relay_auth_why_read_venue">Dokud se nepřihlásíte, nebude vydávat %1$s.</string>
|
||||
<string name="relay_auth_why_send_dm">Dokud se nepřihlásíte, nepřijme vaši zprávu pro %1$s.</string>
|
||||
<string name="relay_auth_why_thread">Dokud se nepřihlásíte, nebude vydávat zbytek této konverzace.</string>
|
||||
<string name="relay_auth_why_thread_with">Dokud se nepřihlásíte, nebude vydávat zbytek vaší konverzace s %1$s.</string>
|
||||
<plurals name="audience_add_anyway">
|
||||
<item quantity="one">Přesto přidat %1$d osobu</item>
|
||||
<item quantity="few">Přesto přidat %1$d osoby</item>
|
||||
<item quantity="many">Přesto přidat %1$d osoby</item>
|
||||
<item quantity="other">Přesto přidat %1$d osob</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_people">
|
||||
<item quantity="one">Přidat %1$d osobu</item>
|
||||
<item quantity="few">Přidat %1$d osoby</item>
|
||||
<item quantity="many">Přidat %1$d osoby</item>
|
||||
<item quantity="other">Přidat %1$d osob</item>
|
||||
</plurals>
|
||||
<plurals name="audience_hard_cap">
|
||||
<item quantity="one">To by byla %1$d osoba. Amethyst přidá najednou nejvýše %2$d — několik jich odznačte.</item>
|
||||
<item quantity="few">To by byly %1$d osoby. Amethyst přidá najednou nejvýše %2$d — několik jich odznačte.</item>
|
||||
<item quantity="many">To by bylo %1$d osoby. Amethyst přidá najednou nejvýše %2$d — několik jich odznačte.</item>
|
||||
<item quantity="other">To by bylo %1$d osob. Amethyst přidá najednou nejvýše %2$d — několik jich odznačte.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_private">
|
||||
<item quantity="one">Tato poznámka bude zašifrována a doručena jako %1$d samostatná zpráva, jedna pro každou osobu. S externím podepisovačem to znamená jedno schválení za každou.</item>
|
||||
<item quantity="few">Tato poznámka bude zašifrována a doručena jako %1$d samostatné zprávy, jedna pro každou osobu. S externím podepisovačem to znamená jedno schválení za každou.</item>
|
||||
<item quantity="many">Tato poznámka bude zašifrována a doručena jako %1$d samostatné zprávy, jedna pro každou osobu. S externím podepisovačem to znamená jedno schválení za každou.</item>
|
||||
<item quantity="other">Tato poznámka bude zašifrována a doručena jako %1$d samostatných zpráv, jedna pro každou osobu. S externím podepisovačem to znamená jedno schválení za každou.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_public">
|
||||
<item quantity="one">Upozornění na tento příspěvek dostane %1$d osoba.</item>
|
||||
<item quantity="few">Upozornění na tento příspěvek dostanou %1$d osoby.</item>
|
||||
<item quantity="many">Upozornění na tento příspěvek dostane %1$d osoby.</item>
|
||||
<item quantity="other">Upozornění na tento příspěvek dostane %1$d osob.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_summary_others">
|
||||
<item quantity="one">%1$s, %2$s a %3$d další</item>
|
||||
<item quantity="few">%1$s, %2$s a %3$d další</item>
|
||||
<item quantity="many">%1$s, %2$s a %3$d dalšího</item>
|
||||
<item quantity="other">%1$s, %2$s a %3$d dalších</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_backdated_votes">
|
||||
<item quantity="one">%1$d hlas má datum před zveřejněním ankety a je vyloučen.</item>
|
||||
<item quantity="few">%1$d hlasy mají datum před zveřejněním ankety a jsou vyloučeny.</item>
|
||||
<item quantity="many">%1$d hlasu má datum před zveřejněním ankety a je vyloučeno.</item>
|
||||
<item quantity="other">%1$d hlasů má datum před zveřejněním ankety a je vyloučeno.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_hidden_voters">
|
||||
<item quantity="one">%1$d hlasující je skryt vaším seznamem ztlumených.</item>
|
||||
<item quantity="few">%1$d hlasující jsou skryti vaším seznamem ztlumených.</item>
|
||||
<item quantity="many">%1$d hlasujícího je skryto vaším seznamem ztlumených.</item>
|
||||
<item quantity="other">%1$d hlasujících je skryto vaším seznamem ztlumených.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_ignored_votes">
|
||||
<item quantity="one">%1$d odpověď nevybrala platnou možnost a je vyloučena.</item>
|
||||
<item quantity="few">%1$d odpovědi nevybraly platnou možnost a jsou vyloučeny.</item>
|
||||
<item quantity="many">%1$d odpovědi nevybralo platnou možnost a je vyloučeno.</item>
|
||||
<item quantity="other">%1$d odpovědí nevybralo platnou možnost a je vyloučeno.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_late_votes">
|
||||
<item quantity="one">%1$d hlas dorazil po uzavření ankety a je vyloučen.</item>
|
||||
<item quantity="few">%1$d hlasy dorazily po uzavření ankety a jsou vyloučeny.</item>
|
||||
<item quantity="many">%1$d hlasu dorazilo po uzavření ankety a je vyloučeno.</item>
|
||||
<item quantity="other">%1$d hlasů dorazilo po uzavření ankety a je vyloučeno.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_option_count">
|
||||
<item quantity="one">%1$d hlasující</item>
|
||||
<item quantity="few">%1$d hlasující</item>
|
||||
<item quantity="many">%1$d hlasujícího</item>
|
||||
<item quantity="other">%1$d hlasujících</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_selections">
|
||||
<item quantity="one">· %1$d výběr</item>
|
||||
<item quantity="few">· %1$d výběry</item>
|
||||
<item quantity="many">· %1$d výběru</item>
|
||||
<item quantity="other">· %1$d výběrů</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_vote_count_link">
|
||||
<item quantity="one">%1$d hlas ›</item>
|
||||
<item quantity="few">%1$d hlasy ›</item>
|
||||
<item quantity="many">%1$d hlasu ›</item>
|
||||
<item quantity="other">%1$d hlasů ›</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_voters">
|
||||
<item quantity="one">hlasující</item>
|
||||
<item quantity="few">hlasující</item>
|
||||
<item quantity="many">hlasujícího</item>
|
||||
<item quantity="other">hlasujících</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_also_holding_back">
|
||||
<item quantity="one">Zadržuje také %1$d další věc.</item>
|
||||
<item quantity="few">Zadržuje také %1$d další věci.</item>
|
||||
<item quantity="many">Zadržuje také %1$d další věci.</item>
|
||||
<item quantity="other">Zadržuje také %1$d dalších věcí.</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_name_and_n_others">
|
||||
<item quantity="one">%1$s a %2$d další</item>
|
||||
<item quantity="few">%1$s a %2$d další</item>
|
||||
<item quantity="many">%1$s a %2$d dalšího</item>
|
||||
<item quantity="other">%1$s a %2$d dalších</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
<string name="violence">Gewalt</string>
|
||||
<string name="unknown_author">Unbekannter Autor</string>
|
||||
<string name="copy_text">Text kopieren</string>
|
||||
<string name="copy_text_original">Original kopieren</string>
|
||||
<string name="copy_text_translated">Übersetzung kopieren</string>
|
||||
<string name="copy_user_pubkey">Autor-ID kopieren</string>
|
||||
<string name="copy_note_id">Beitrags-ID kopieren</string>
|
||||
<string name="copy_raw_json">JSON kopieren</string>
|
||||
@@ -310,6 +312,18 @@
|
||||
<string name="concord_invite_failed_invalid">Dieser Einladungslink ist ungültig oder kann mit diesem Konto nicht geöffnet werden.</string>
|
||||
<string name="concord_invite_failed_incompatible">Dieser Einladungslink kann nicht geöffnet werden. Er ist möglicherweise veraltet, wurde bereits durch einen neueren ersetzt oder mit einer neueren Version der App erstellt. Bitte um einen neuen Einladungslink.</string>
|
||||
<string name="concord_invite_failed_revoked">Dieser Einladungslink wurde widerrufen und kann nicht mehr verwendet werden. Bitte um einen neuen.</string>
|
||||
<string name="concord_invite_failed_banned">Diese Community hat dich entfernt. Der Link funktioniert noch, aber ihre Mitgliederliste lässt dich nicht zu.</string>
|
||||
<string name="concord_invite_links_title">Einladungslinks</string>
|
||||
<string name="concord_invite_links_action">Einladungslinks…</string>
|
||||
<string name="concord_invite_links_created">Erstellt %1$s</string>
|
||||
<string name="concord_invite_links_empty">Du hast für diese Community noch keine Einladungslinks erstellt. Links, die andere Admins erstellt haben, werden auf deren eigenen Geräten verwaltet.</string>
|
||||
<string name="concord_invite_links_unreadable">Deine Einladungslinks konnten nicht geladen werden, daher lässt sich gerade keiner widerrufen. Prüfe deine Verbindung und versuche es erneut.</string>
|
||||
<string name="concord_invite_revoke_action">Link widerrufen</string>
|
||||
<string name="concord_invite_revoke_title">Diesen Link widerrufen?</string>
|
||||
<string name="concord_invite_revoke_explainer">Wer diesen Link noch hat, kann damit nicht mehr beitreten. Personen, die bereits damit beigetreten sind, bleiben in der Community. Das lässt sich nicht rückgängig machen.</string>
|
||||
<string name="concord_invite_revoke_confirm">Widerrufen</string>
|
||||
<string name="concord_invite_revoked_ok">Einladungslink widerrufen.</string>
|
||||
<string name="concord_invite_revoked_failed">Der Link konnte nicht widerrufen werden. Prüfe deine Verbindung und versuche es erneut.</string>
|
||||
<string name="concord_invite_failed_expired">Dieser Einladungslink ist abgelaufen und kann nicht mehr verwendet werden. Bitte um einen neuen Link.</string>
|
||||
<string name="concord_invite_preview_unknown_name">Der Name der Community wird erst nach dem Beitritt angezeigt</string>
|
||||
<string name="concord_invite_preview_explainer">Beim Beitreten verbindest du dich mit den Relays dieser Einladung, veröffentlichst eine mit deinem Konto signierte Beitrittsankündigung und fügst die Community deiner Liste hinzu. Es wird nichts gesendet, bis du auf Beitreten tippst.</string>
|
||||
@@ -495,6 +509,11 @@
|
||||
\n- **Bewahre** eine sichere Kopie deines privaten Schlüssels zur Kontowiederherstellung auf. Wir empfehlen die Verwendung eines Passwort-Managers.</string>
|
||||
<string name="account_backup_tips3_md" tools:ignore="Typos"> Für zusätzliche Sicherheit kannst du deinen Schlüssel mit einem Passwort verschlüsseln. Dieser Schlüssel beginnt mit **ncryptsec1** und kann ohne dein Passwort nicht verwendet werden.
|
||||
\n\nWenn du dein Passwort verlierst, kannst du deinen Schlüssel nicht wiederherstellen.</string>
|
||||
<string name="backup_keys_nudge_title">Sichere deine Schlüssel</string>
|
||||
<string name="backup_keys_nudge_body">Dein geheimer Schlüssel ist der einzige Weg zu diesem Konto. Wenn du ihn verlierst, kann er nie wiederhergestellt werden. Speichere ihn jetzt an einem sicheren Ort.</string>
|
||||
<string name="backup_keys_nudge_backup_now">Jetzt sichern</string>
|
||||
<string name="backup_keys_nudge_already_saved">Habe ich gespeichert</string>
|
||||
<string name="backup_keys_nudge_dismiss">Schließen</string>
|
||||
<string name="failed_to_encrypt_key">Fehler beim Verschlüsseln Ihres privaten Schlüssels</string>
|
||||
<string name="secret_key_copied_to_clipboard">Geheimer Schlüssel (nsec) in die Zwischenablage kopiert</string>
|
||||
<string name="copy_my_secret_key">Meinen geheimen Schlüssel kopieren</string>
|
||||
@@ -1090,12 +1109,67 @@
|
||||
<!-- The group header carries the grammar; each toggle is a completion of the sentence, so these
|
||||
keys are new rather than reused - a stale translation of the old standalone titles would
|
||||
read as a non-sequitur under this header. -->
|
||||
<string name="relay_auth_auto_login_when">Ohne Nachfrage anmelden, wenn…</string>
|
||||
<string name="relay_auth_auto_my_relays">…es mein Relay ist oder ein Raum, dem ich beigetreten bin</string>
|
||||
<string name="relay_auth_auto_read_follows">…ich jemanden lese, dem ich folge</string>
|
||||
<string name="relay_auth_auto_message_follows">…ich jemandem schreibe, dem ich folge</string>
|
||||
<string name="relay_auth_auto_message_strangers">…ich jemand anderem schreibe</string>
|
||||
<!-- The AUTH prompt. The title is constant and names the account whose npub would be revealed;
|
||||
exactly one "why" line varies, and it states the consequence of declining too, which is why
|
||||
there is no separate "if you don\'t" line. New keys throughout: these replaced a set of
|
||||
labels ("Notify:", "Post to this room") whose translations would otherwise still bind. -->
|
||||
<string name="relay_auth_login_as">Als %1$s anmelden?</string>
|
||||
<string name="relay_auth_relay_asks">fragt, wer du bist</string>
|
||||
<string name="relay_auth_why_send_dm">Es nimmt deine Nachricht an %1$s nicht an, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_notify_inbox">%1$s erfährt nichts von deiner Antwort, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_read_outbox">Es liefert keine Beiträge von %1$s, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_post_venue">Es nimmt deinen Beitrag in %1$s nicht an, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_read_venue">Es liefert %1$s nicht, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_my_inbox">Es liefert dir keine Antworten, Zaps und Nachrichten, die an dich gesendet wurden, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_thread">Es liefert den Rest dieser Unterhaltung nicht, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_thread_with">Es liefert den Rest deiner Unterhaltung mit %1$s nicht, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_my_own_relay">Das ist eines deiner eigenen Relays, und es fordert alle zur Anmeldung auf.</string>
|
||||
<string name="relay_auth_why_other">Es fordert alle zur Anmeldung auf. Amethyst kann nicht erkennen, was es zurückhält.</string>
|
||||
<string name="relay_auth_someone_unloaded">jemand, den du noch nicht geladen hast</string>
|
||||
<plurals name="relay_auth_name_and_n_others">
|
||||
<item quantity="one">%1$s und %2$d weitere Person</item>
|
||||
<item quantity="other">%1$s und %2$d weitere Personen</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_also_holding_back">
|
||||
<item quantity="one">Es hält außerdem %1$d weitere Sache zurück.</item>
|
||||
<item quantity="other">Es hält außerdem %1$d weitere Dinge zurück.</item>
|
||||
</plurals>
|
||||
<string name="relay_auth_remember_relay">Für dieses Relay merken</string>
|
||||
<string name="relay_auth_log_in">Anmelden</string>
|
||||
<string name="relay_auth_not_now">Jetzt nicht</string>
|
||||
<string name="relay_auth_never_allow">Nie erlauben</string>
|
||||
<string name="relay_auth_how_we_decide">Wie Amethyst entscheidet</string>
|
||||
<!-- Settings: three lists that each hold what their header says. -->
|
||||
<string name="relay_auth_exceptions">Ausnahmen</string>
|
||||
<string name="relay_auth_no_exceptions">Noch keine Ausnahmen. Jedes Relay folgt den Regeln oben.</string>
|
||||
<string name="relay_auth_exception_always">Immer, von dir festgelegt</string>
|
||||
<string name="relay_auth_exception_never">Nie, von dir festgelegt</string>
|
||||
<string name="relay_auth_segment_always">Immer</string>
|
||||
<string name="relay_auth_segment_never">Nie</string>
|
||||
<string name="relay_auth_remove_exception">Ausnahme entfernen</string>
|
||||
<string name="relay_auth_exception_removed_undo">Ausnahme entfernt. %1$s folgt wieder deinen Regeln.</string>
|
||||
<string name="relay_auth_undo">Rückgängig</string>
|
||||
<string name="relay_auth_blocked_section">Von deiner Blockliste blockiert</string>
|
||||
<string name="relay_auth_blocked_row_desc">Amethyst meldet sich nie bei blockierten Relays an.</string>
|
||||
<string name="relay_auth_no_blocked">Nichts blockiert. Bei Relays, die du blockierst, meldet sich Amethyst nie an — egal, was du hier einstellst.</string>
|
||||
<string name="relay_auth_recent_section">Letzte Anmeldungen</string>
|
||||
<string name="relay_auth_no_recent">Noch hat dich kein Relay zur Anmeldung aufgefordert.</string>
|
||||
<string name="relay_auth_ago">vor %1$s</string>
|
||||
<!-- Short labels for the purpose chips on a "recent logins" row. -->
|
||||
<string name="relay_auth_purpose_send_dm">deine Nachrichten</string>
|
||||
<string name="relay_auth_purpose_notify_inbox">deine Antworten</string>
|
||||
<string name="relay_auth_purpose_read_outbox">Personen, die du liest</string>
|
||||
<string name="relay_auth_purpose_post_venue">ein Raum, in dem du postest</string>
|
||||
<string name="relay_auth_purpose_read_venue">ein Raum, den du liest</string>
|
||||
<string name="relay_auth_purpose_my_inbox">dein Posteingang</string>
|
||||
<string name="relay_auth_purpose_thread">eine Unterhaltung</string>
|
||||
<string name="relay_auth_purpose_my_own_relay">dein eigenes Relay</string>
|
||||
<string name="relay_auth_purpose_other">dieses Relay</string>
|
||||
<string name="nip82_repository_label">Quelle: %1$s</string>
|
||||
<string name="nip82_version_label">v%1$s</string>
|
||||
<string name="nip82_download">Herunterladen</string>
|
||||
@@ -1464,6 +1538,46 @@
|
||||
<string name="private_note_visible_to">Sichtbar für</string>
|
||||
<string name="private_note_no_receivers">Noch keine Empfänger: Nur du kannst diese Notiz sehen. Füge Personen hinzu, um sie zu teilen.</string>
|
||||
<!-- Composer audience control (Notify / "Visible to") -->
|
||||
<string name="audience_manage">Verwalten, wer das sieht</string>
|
||||
<string name="audience_empty_private">Nur du — wähle, wer das sonst noch sehen darf</string>
|
||||
<string name="audience_empty_public">Personen hinzufügen, die benachrichtigt werden</string>
|
||||
<string name="audience_summary_two">%1$s und %2$s</string>
|
||||
<string name="audience_group_chip">%1$s · %2$s</string>
|
||||
<string name="audience_group_remove">Alle aus %1$s hinzugefügten Personen entfernen</string>
|
||||
<string name="audience_send_privately">Privat senden</string>
|
||||
<string name="audience_sheet_title">Personen hinzufügen</string>
|
||||
<string name="audience_sheet_search">Personen und Listen suchen</string>
|
||||
<string name="audience_sheet_no_lists">Du hast noch keine Personenlisten oder Follow-Pakete. Suche oben, um jemanden direkt hinzuzufügen.</string>
|
||||
<string name="audience_count_with_private">%1$d · %2$d privat</string>
|
||||
<string name="audience_over_limit">Über dem Limit</string>
|
||||
<string name="audience_badge_already_added">Bereits hinzugefügt</string>
|
||||
<string name="audience_badge_muted">Stummgeschaltet</string>
|
||||
<string name="audience_badge_private_member">Privates Mitglied</string>
|
||||
<string name="audience_recipients_are_visible">Alle in dieser Notiz können die vollständige Empfängerliste sehen.</string>
|
||||
<plurals name="audience_summary_others">
|
||||
<item quantity="one">%1$s, %2$s und %3$d weitere Person</item>
|
||||
<item quantity="other">%1$s, %2$s und %3$d weitere Personen</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_private">
|
||||
<item quantity="one">Diese Notiz wird verschlüsselt und %1$d Mal einzeln zugestellt, einmal pro Person. Mit einem externen Signierer ist das je eine Freigabe.</item>
|
||||
<item quantity="other">Diese Notiz wird verschlüsselt und %1$d Mal einzeln zugestellt, einmal pro Person. Mit einem externen Signierer ist das je eine Freigabe.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_public">
|
||||
<item quantity="one">%1$d Person erhält eine Benachrichtigung zu diesem Beitrag.</item>
|
||||
<item quantity="other">%1$d Personen erhalten eine Benachrichtigung zu diesem Beitrag.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_hard_cap">
|
||||
<item quantity="one">Das wäre %1$d Person. Amethyst fügt höchstens %2$d auf einmal hinzu — wähle ein paar ab.</item>
|
||||
<item quantity="other">Das wären %1$d Personen. Amethyst fügt höchstens %2$d auf einmal hinzu — wähle ein paar ab.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_people">
|
||||
<item quantity="one">%1$d Person hinzufügen</item>
|
||||
<item quantity="other">%1$d Personen hinzufügen</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_anyway">
|
||||
<item quantity="one">Trotzdem %1$d Person hinzufügen</item>
|
||||
<item quantity="other">Trotzdem %1$d Personen hinzufügen</item>
|
||||
</plurals>
|
||||
<string name="notify_add_user">Hinzufügen</string>
|
||||
<string name="notify_remove_user">Nutzer aus Benachrichtigungen entfernen</string>
|
||||
<string name="notify_mute_user">Benachrichtigungen aktiv. Tippen, um Benachrichtigungen für diesen Nutzer stummzuschalten</string>
|
||||
@@ -3888,6 +4002,49 @@
|
||||
<string name="social_proof">Sozialer Nachweis</string>
|
||||
<string name="poll_submit">Absenden</string>
|
||||
<string name="poll_view_results">Ergebnisse anzeigen</string>
|
||||
<string name="poll_results_title">Umfrageergebnisse</string>
|
||||
<string name="poll_results_loading">Umfrage wird geladen…</string>
|
||||
<string name="poll_results_open">Offen</string>
|
||||
<string name="poll_results_closes_in">Endet in %1$s</string>
|
||||
<string name="poll_results_ended">Vor %1$s beendet</string>
|
||||
<string name="poll_results_all_options">Alle Optionen</string>
|
||||
<string name="poll_results_your_pick">Deine Stimme</string>
|
||||
<plurals name="poll_results_selections">
|
||||
<item quantity="one">· %1$d Auswahl</item>
|
||||
<item quantity="other">· %1$d Auswahlen</item>
|
||||
</plurals>
|
||||
<string name="poll_results_no_votes">Noch keine Stimmen</string>
|
||||
<string name="poll_results_checking_completeness">Es wird geprüft, wie viele Stimmen existieren…</string>
|
||||
<string name="poll_results_partial">%1$d von %2$d Antworten von %3$d Relays geladen.</string>
|
||||
<string name="poll_results_partial_approx">%1$d von etwa %2$d Antworten von %3$d Relays geladen.</string>
|
||||
<plurals name="poll_results_voters">
|
||||
<item quantity="one">abstimmende Person</item>
|
||||
<item quantity="other">abstimmende Personen</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_vote_count_link">
|
||||
<item quantity="one">%1$d Stimme ›</item>
|
||||
<item quantity="other">%1$d Stimmen ›</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_option_count">
|
||||
<item quantity="one">%1$d abstimmende Person</item>
|
||||
<item quantity="other">%1$d abstimmende Personen</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_late_votes">
|
||||
<item quantity="one">%1$d Stimme ist nach dem Ende der Umfrage eingegangen und wird ausgeschlossen.</item>
|
||||
<item quantity="other">%1$d Stimmen sind nach dem Ende der Umfrage eingegangen und werden ausgeschlossen.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_backdated_votes">
|
||||
<item quantity="one">%1$d Stimme ist auf einen Zeitpunkt vor der Veröffentlichung der Umfrage datiert und wird ausgeschlossen.</item>
|
||||
<item quantity="other">%1$d Stimmen sind auf einen Zeitpunkt vor der Veröffentlichung der Umfrage datiert und werden ausgeschlossen.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_ignored_votes">
|
||||
<item quantity="one">%1$d Antwort hat keine gültige Option gewählt und wird ausgeschlossen.</item>
|
||||
<item quantity="other">%1$d Antworten haben keine gültige Option gewählt und werden ausgeschlossen.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_hidden_voters">
|
||||
<item quantity="one">%1$d abstimmende Person wird durch deine Stummschaltliste ausgeblendet.</item>
|
||||
<item quantity="other">%1$d abstimmende Personen werden durch deine Stummschaltliste ausgeblendet.</item>
|
||||
</plurals>
|
||||
<string name="restart">Neu starten</string>
|
||||
<string name="chess_accept">Annehmen</string>
|
||||
<string name="chess_decline">Ablehnen</string>
|
||||
@@ -4715,161 +4872,4 @@
|
||||
<string name="buzz_persona_avatar">Avatar-URL (optional)</string>
|
||||
<string name="buzz_persona_publishing">Wird veröffentlicht…</string>
|
||||
<string name="buzz_persona_publish">Persona veröffentlichen</string>
|
||||
<string name="audience_badge_already_added">Bereits hinzugefügt</string>
|
||||
<string name="audience_badge_muted">Stummgeschaltet</string>
|
||||
<string name="audience_badge_private_member">Privates Mitglied</string>
|
||||
<string name="audience_count_with_private">%1$d · %2$d privat</string>
|
||||
<string name="audience_empty_private">Nur du — wähle, wer das sonst noch sehen darf</string>
|
||||
<string name="audience_empty_public">Personen hinzufügen, die benachrichtigt werden</string>
|
||||
<string name="audience_group_chip">%1$s · %2$s</string>
|
||||
<string name="audience_group_remove">Alle aus %1$s hinzugefügten Personen entfernen</string>
|
||||
<string name="audience_manage">Verwalten, wer das sieht</string>
|
||||
<string name="audience_over_limit">Über dem Limit</string>
|
||||
<string name="audience_recipients_are_visible">Alle in dieser Notiz können die vollständige Empfängerliste sehen.</string>
|
||||
<string name="audience_send_privately">Privat senden</string>
|
||||
<string name="audience_sheet_no_lists">Du hast noch keine Personenlisten oder Follow-Pakete. Suche oben, um jemanden direkt hinzuzufügen.</string>
|
||||
<string name="audience_sheet_search">Personen und Listen suchen</string>
|
||||
<string name="audience_sheet_title">Personen hinzufügen</string>
|
||||
<string name="audience_summary_two">%1$s und %2$s</string>
|
||||
<string name="backup_keys_nudge_already_saved">Habe ich gespeichert</string>
|
||||
<string name="backup_keys_nudge_backup_now">Jetzt sichern</string>
|
||||
<string name="backup_keys_nudge_body">Dein geheimer Schlüssel ist der einzige Weg zu diesem Konto. Wenn du ihn verlierst, kann er nie wiederhergestellt werden. Speichere ihn jetzt an einem sicheren Ort.</string>
|
||||
<string name="backup_keys_nudge_dismiss">Schließen</string>
|
||||
<string name="backup_keys_nudge_title">Sichere deine Schlüssel</string>
|
||||
<string name="concord_invite_failed_banned">Diese Community hat dich entfernt. Der Link funktioniert noch, aber ihre Mitgliederliste lässt dich nicht zu.</string>
|
||||
<string name="concord_invite_links_action">Einladungslinks…</string>
|
||||
<string name="concord_invite_links_created">Erstellt %1$s</string>
|
||||
<string name="concord_invite_links_empty">Du hast für diese Community noch keine Einladungslinks erstellt. Links, die andere Admins erstellt haben, werden auf deren eigenen Geräten verwaltet.</string>
|
||||
<string name="concord_invite_links_title">Einladungslinks</string>
|
||||
<string name="concord_invite_links_unreadable">Deine Einladungslinks konnten nicht geladen werden, daher lässt sich gerade keiner widerrufen. Prüfe deine Verbindung und versuche es erneut.</string>
|
||||
<string name="concord_invite_revoke_action">Link widerrufen</string>
|
||||
<string name="concord_invite_revoke_confirm">Widerrufen</string>
|
||||
<string name="concord_invite_revoke_explainer">Wer diesen Link noch hat, kann damit nicht mehr beitreten. Personen, die bereits damit beigetreten sind, bleiben in der Community. Das lässt sich nicht rückgängig machen.</string>
|
||||
<string name="concord_invite_revoke_title">Diesen Link widerrufen?</string>
|
||||
<string name="concord_invite_revoked_failed">Der Link konnte nicht widerrufen werden. Prüfe deine Verbindung und versuche es erneut.</string>
|
||||
<string name="concord_invite_revoked_ok">Einladungslink widerrufen.</string>
|
||||
<string name="copy_text_original">Original kopieren</string>
|
||||
<string name="copy_text_translated">Übersetzung kopieren</string>
|
||||
<string name="poll_results_all_options">Alle Optionen</string>
|
||||
<string name="poll_results_checking_completeness">Es wird geprüft, wie viele Stimmen existieren…</string>
|
||||
<string name="poll_results_closes_in">Endet in %1$s</string>
|
||||
<string name="poll_results_ended">Vor %1$s beendet</string>
|
||||
<string name="poll_results_loading">Umfrage wird geladen…</string>
|
||||
<string name="poll_results_no_votes">Noch keine Stimmen</string>
|
||||
<string name="poll_results_open">Offen</string>
|
||||
<string name="poll_results_partial">%1$d von %2$d Antworten von %3$d Relays geladen.</string>
|
||||
<string name="poll_results_partial_approx">%1$d von etwa %2$d Antworten von %3$d Relays geladen.</string>
|
||||
<string name="poll_results_title">Umfrageergebnisse</string>
|
||||
<string name="poll_results_your_pick">Deine Stimme</string>
|
||||
<string name="relay_auth_ago">vor %1$s</string>
|
||||
<string name="relay_auth_auto_login_when">Ohne Nachfrage anmelden, wenn…</string>
|
||||
<string name="relay_auth_auto_message_follows">…ich jemandem schreibe, dem ich folge</string>
|
||||
<string name="relay_auth_auto_message_strangers">…ich jemand anderem schreibe</string>
|
||||
<string name="relay_auth_auto_my_relays">…es mein Relay ist oder ein Raum, dem ich beigetreten bin</string>
|
||||
<string name="relay_auth_auto_read_follows">…ich jemanden lese, dem ich folge</string>
|
||||
<string name="relay_auth_blocked_row_desc">Amethyst meldet sich nie bei blockierten Relays an.</string>
|
||||
<string name="relay_auth_blocked_section">Von deiner Blockliste blockiert</string>
|
||||
<string name="relay_auth_exception_always">Immer, von dir festgelegt</string>
|
||||
<string name="relay_auth_exception_never">Nie, von dir festgelegt</string>
|
||||
<string name="relay_auth_exception_removed_undo">Ausnahme entfernt. %1$s folgt wieder deinen Regeln.</string>
|
||||
<string name="relay_auth_exceptions">Ausnahmen</string>
|
||||
<string name="relay_auth_how_we_decide">Wie Amethyst entscheidet</string>
|
||||
<string name="relay_auth_log_in">Anmelden</string>
|
||||
<string name="relay_auth_login_as">Als %1$s anmelden?</string>
|
||||
<string name="relay_auth_never_allow">Nie erlauben</string>
|
||||
<string name="relay_auth_no_blocked">Nichts blockiert. Bei Relays, die du blockierst, meldet sich Amethyst nie an — egal, was du hier einstellst.</string>
|
||||
<string name="relay_auth_no_exceptions">Noch keine Ausnahmen. Jedes Relay folgt den Regeln oben.</string>
|
||||
<string name="relay_auth_no_recent">Noch hat dich kein Relay zur Anmeldung aufgefordert.</string>
|
||||
<string name="relay_auth_not_now">Jetzt nicht</string>
|
||||
<string name="relay_auth_purpose_my_inbox">dein Posteingang</string>
|
||||
<string name="relay_auth_purpose_my_own_relay">dein eigenes Relay</string>
|
||||
<string name="relay_auth_purpose_notify_inbox">deine Antworten</string>
|
||||
<string name="relay_auth_purpose_other">dieses Relay</string>
|
||||
<string name="relay_auth_purpose_post_venue">ein Raum, in dem du postest</string>
|
||||
<string name="relay_auth_purpose_read_outbox">Personen, die du liest</string>
|
||||
<string name="relay_auth_purpose_read_venue">ein Raum, den du liest</string>
|
||||
<string name="relay_auth_purpose_send_dm">deine Nachrichten</string>
|
||||
<string name="relay_auth_purpose_thread">eine Unterhaltung</string>
|
||||
<string name="relay_auth_recent_section">Letzte Anmeldungen</string>
|
||||
<string name="relay_auth_relay_asks">fragt, wer du bist</string>
|
||||
<string name="relay_auth_remember_relay">Für dieses Relay merken</string>
|
||||
<string name="relay_auth_remove_exception">Ausnahme entfernen</string>
|
||||
<string name="relay_auth_segment_always">Immer</string>
|
||||
<string name="relay_auth_segment_never">Nie</string>
|
||||
<string name="relay_auth_someone_unloaded">jemand, den du noch nicht geladen hast</string>
|
||||
<string name="relay_auth_undo">Rückgängig</string>
|
||||
<string name="relay_auth_why_my_inbox">Es liefert dir keine Antworten, Zaps und Nachrichten, die an dich gesendet wurden, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_my_own_relay">Das ist eines deiner eigenen Relays, und es fordert alle zur Anmeldung auf.</string>
|
||||
<string name="relay_auth_why_notify_inbox">%1$s erfährt nichts von deiner Antwort, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_other">Es fordert alle zur Anmeldung auf. Amethyst kann nicht erkennen, was es zurückhält.</string>
|
||||
<string name="relay_auth_why_post_venue">Es nimmt deinen Beitrag in %1$s nicht an, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_read_outbox">Es liefert keine Beiträge von %1$s, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_read_venue">Es liefert %1$s nicht, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_send_dm">Es nimmt deine Nachricht an %1$s nicht an, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_thread">Es liefert den Rest dieser Unterhaltung nicht, solange du dich nicht anmeldest.</string>
|
||||
<string name="relay_auth_why_thread_with">Es liefert den Rest deiner Unterhaltung mit %1$s nicht, solange du dich nicht anmeldest.</string>
|
||||
<plurals name="audience_add_anyway">
|
||||
<item quantity="one">Trotzdem %1$d Person hinzufügen</item>
|
||||
<item quantity="other">Trotzdem %1$d Personen hinzufügen</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_people">
|
||||
<item quantity="one">%1$d Person hinzufügen</item>
|
||||
<item quantity="other">%1$d Personen hinzufügen</item>
|
||||
</plurals>
|
||||
<plurals name="audience_hard_cap">
|
||||
<item quantity="one">Das wäre %1$d Person. Amethyst fügt höchstens %2$d auf einmal hinzu — wähle ein paar ab.</item>
|
||||
<item quantity="other">Das wären %1$d Personen. Amethyst fügt höchstens %2$d auf einmal hinzu — wähle ein paar ab.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_private">
|
||||
<item quantity="one">Diese Notiz wird verschlüsselt und %1$d Mal einzeln zugestellt, einmal pro Person. Mit einem externen Signierer ist das je eine Freigabe.</item>
|
||||
<item quantity="other">Diese Notiz wird verschlüsselt und %1$d Mal einzeln zugestellt, einmal pro Person. Mit einem externen Signierer ist das je eine Freigabe.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_public">
|
||||
<item quantity="one">%1$d Person erhält eine Benachrichtigung zu diesem Beitrag.</item>
|
||||
<item quantity="other">%1$d Personen erhalten eine Benachrichtigung zu diesem Beitrag.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_summary_others">
|
||||
<item quantity="one">%1$s, %2$s und %3$d weitere Person</item>
|
||||
<item quantity="other">%1$s, %2$s und %3$d weitere Personen</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_backdated_votes">
|
||||
<item quantity="one">%1$d Stimme ist auf einen Zeitpunkt vor der Veröffentlichung der Umfrage datiert und wird ausgeschlossen.</item>
|
||||
<item quantity="other">%1$d Stimmen sind auf einen Zeitpunkt vor der Veröffentlichung der Umfrage datiert und werden ausgeschlossen.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_hidden_voters">
|
||||
<item quantity="one">%1$d abstimmende Person wird durch deine Stummschaltliste ausgeblendet.</item>
|
||||
<item quantity="other">%1$d abstimmende Personen werden durch deine Stummschaltliste ausgeblendet.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_ignored_votes">
|
||||
<item quantity="one">%1$d Antwort hat keine gültige Option gewählt und wird ausgeschlossen.</item>
|
||||
<item quantity="other">%1$d Antworten haben keine gültige Option gewählt und werden ausgeschlossen.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_late_votes">
|
||||
<item quantity="one">%1$d Stimme ist nach dem Ende der Umfrage eingegangen und wird ausgeschlossen.</item>
|
||||
<item quantity="other">%1$d Stimmen sind nach dem Ende der Umfrage eingegangen und werden ausgeschlossen.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_option_count">
|
||||
<item quantity="one">%1$d abstimmende Person</item>
|
||||
<item quantity="other">%1$d abstimmende Personen</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_selections">
|
||||
<item quantity="one">· %1$d Auswahl</item>
|
||||
<item quantity="other">· %1$d Auswahlen</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_vote_count_link">
|
||||
<item quantity="one">%1$d Stimme ›</item>
|
||||
<item quantity="other">%1$d Stimmen ›</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_voters">
|
||||
<item quantity="one">abstimmende Person</item>
|
||||
<item quantity="other">abstimmende Personen</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_also_holding_back">
|
||||
<item quantity="one">Es hält außerdem %1$d weitere Sache zurück.</item>
|
||||
<item quantity="other">Es hält außerdem %1$d weitere Dinge zurück.</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_name_and_n_others">
|
||||
<item quantity="one">%1$s und %2$d weitere Person</item>
|
||||
<item quantity="other">%1$s und %2$d weitere Personen</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
<string name="violence">Violência</string>
|
||||
<string name="unknown_author">Autor desconhecido</string>
|
||||
<string name="copy_text">Copiar texto</string>
|
||||
<string name="copy_text_original">Copiar original</string>
|
||||
<string name="copy_text_translated">Copiar tradução</string>
|
||||
<string name="copy_user_pubkey">Copiar PubKey do usuário</string>
|
||||
<string name="copy_note_id">Copiar ID da Nota</string>
|
||||
<string name="copy_raw_json">Copiar JSON bruto</string>
|
||||
@@ -310,6 +312,18 @@
|
||||
<string name="concord_invite_failed_invalid">Este link de convite é inválido ou não pode ser aberto com esta conta.</string>
|
||||
<string name="concord_invite_failed_incompatible">Não é possível abrir este link de convite. Ele pode estar desatualizado ou já ter sido substituído por um mais recente, ou ter sido criado com uma versão mais nova do app. Peça um novo link de convite.</string>
|
||||
<string name="concord_invite_failed_revoked">Este link de convite foi revogado e não pode mais ser usado. Peça um novo.</string>
|
||||
<string name="concord_invite_failed_banned">Esta comunidade removeu você. O link ainda funciona, mas a lista de membros dela não permite sua entrada.</string>
|
||||
<string name="concord_invite_links_title">Links de convite</string>
|
||||
<string name="concord_invite_links_action">Links de convite…</string>
|
||||
<string name="concord_invite_links_created">Criado %1$s</string>
|
||||
<string name="concord_invite_links_empty">Você ainda não criou nenhum link de convite para esta comunidade. Os links criados por outros administradores são gerenciados nos dispositivos deles.</string>
|
||||
<string name="concord_invite_links_unreadable">Não foi possível carregar seus links de convite, então nenhum pode ser revogado agora. Verifique sua conexão e tente novamente.</string>
|
||||
<string name="concord_invite_revoke_action">Revogar link</string>
|
||||
<string name="concord_invite_revoke_title">Revogar este link?</string>
|
||||
<string name="concord_invite_revoke_explainer">Quem ainda tiver este link não conseguirá mais entrar. As pessoas que já entraram com ele permanecem na comunidade. Isso não pode ser desfeito.</string>
|
||||
<string name="concord_invite_revoke_confirm">Revogar</string>
|
||||
<string name="concord_invite_revoked_ok">Link de convite revogado.</string>
|
||||
<string name="concord_invite_revoked_failed">Não foi possível revogar o link. Verifique sua conexão e tente novamente.</string>
|
||||
<string name="concord_invite_failed_expired">Este link de convite expirou e não pode mais ser usado. Peça um link novo.</string>
|
||||
<string name="concord_invite_preview_unknown_name">O nome da comunidade só é revelado depois que você entra</string>
|
||||
<string name="concord_invite_preview_explainer">Entrar conecta aos relays deste convite, publica um anúncio de entrada assinado pela sua conta e adiciona a comunidade à sua lista. Nada é enviado até você tocar em Entrar.</string>
|
||||
@@ -495,6 +509,11 @@
|
||||
\n- **Mantenha** uma cópia de segurança segura de sua chave secreta para recuperação da conta. Recomendamos o uso de um gerenciador de senhas.</string>
|
||||
<string name="account_backup_tips3_md" tools:ignore="Typos"> Para segurança adicional, você pode criptografar sua chave com uma senha. Esta chave começa com **ncryptsec1** e não pode ser usada sem sua senha.
|
||||
\n\nSe você perder sua senha, não será possível recuperar sua chave.</string>
|
||||
<string name="backup_keys_nudge_title">Faça backup das suas chaves</string>
|
||||
<string name="backup_keys_nudge_body">Sua chave secreta é a única forma de acessar esta conta. Se você perdê-la, ela nunca poderá ser recuperada. Guarde-a em um lugar seguro agora.</string>
|
||||
<string name="backup_keys_nudge_backup_now">Fazer backup agora</string>
|
||||
<string name="backup_keys_nudge_already_saved">Já salvei</string>
|
||||
<string name="backup_keys_nudge_dismiss">Dispensar</string>
|
||||
<string name="failed_to_encrypt_key">Falha ao criptografar sua chave privada</string>
|
||||
<string name="secret_key_copied_to_clipboard">Chave secreta (nsec) copiada</string>
|
||||
<string name="copy_my_secret_key">Copiar minha chave secreta</string>
|
||||
@@ -1088,12 +1107,67 @@
|
||||
<!-- The group header carries the grammar; each toggle is a completion of the sentence, so these
|
||||
keys are new rather than reused - a stale translation of the old standalone titles would
|
||||
read as a non-sequitur under this header. -->
|
||||
<string name="relay_auth_auto_login_when">Entrar sem perguntar quando…</string>
|
||||
<string name="relay_auth_auto_my_relays">…for o meu relay, ou uma sala em que entrei</string>
|
||||
<string name="relay_auth_auto_read_follows">…eu estiver lendo alguém que sigo</string>
|
||||
<string name="relay_auth_auto_message_follows">…eu estiver enviando mensagem para alguém que sigo</string>
|
||||
<string name="relay_auth_auto_message_strangers">…eu estiver enviando mensagem para qualquer outra pessoa</string>
|
||||
<!-- The AUTH prompt. The title is constant and names the account whose npub would be revealed;
|
||||
exactly one "why" line varies, and it states the consequence of declining too, which is why
|
||||
there is no separate "if you don\'t" line. New keys throughout: these replaced a set of
|
||||
labels ("Notify:", "Post to this room") whose translations would otherwise still bind. -->
|
||||
<string name="relay_auth_login_as">Entrar como %1$s?</string>
|
||||
<string name="relay_auth_relay_asks">pergunta quem é você</string>
|
||||
<string name="relay_auth_why_send_dm">Ele não aceitará sua mensagem para %1$s a menos que você entre.</string>
|
||||
<string name="relay_auth_why_notify_inbox">%1$s não ficará sabendo da sua resposta a menos que você entre.</string>
|
||||
<string name="relay_auth_why_read_outbox">Ele não entregará publicações de %1$s a menos que você entre.</string>
|
||||
<string name="relay_auth_why_post_venue">Ele não aceitará sua publicação em %1$s a menos que você entre.</string>
|
||||
<string name="relay_auth_why_read_venue">Ele não entregará %1$s a menos que você entre.</string>
|
||||
<string name="relay_auth_why_my_inbox">Ele não entregará respostas, zaps e mensagens enviadas a você a menos que você entre.</string>
|
||||
<string name="relay_auth_why_thread">Ele não entregará o restante desta conversa a menos que você entre.</string>
|
||||
<string name="relay_auth_why_thread_with">Ele não entregará o restante da sua conversa com %1$s a menos que você entre.</string>
|
||||
<string name="relay_auth_why_my_own_relay">Este é um dos seus próprios relays, e ele pede que todos entrem.</string>
|
||||
<string name="relay_auth_why_other">Ele pede que todos entrem. O Amethyst não consegue saber o que ele está retendo.</string>
|
||||
<string name="relay_auth_someone_unloaded">alguém que você ainda não carregou</string>
|
||||
<plurals name="relay_auth_name_and_n_others">
|
||||
<item quantity="one">%1$s e mais %2$d</item>
|
||||
<item quantity="other">%1$s e mais %2$d</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_also_holding_back">
|
||||
<item quantity="one">Ele também está retendo mais %1$d coisa.</item>
|
||||
<item quantity="other">Ele também está retendo mais %1$d coisas.</item>
|
||||
</plurals>
|
||||
<string name="relay_auth_remember_relay">Lembrar para este relay</string>
|
||||
<string name="relay_auth_log_in">Entrar</string>
|
||||
<string name="relay_auth_not_now">Agora não</string>
|
||||
<string name="relay_auth_never_allow">Nunca permitir</string>
|
||||
<string name="relay_auth_how_we_decide">Como o Amethyst decide</string>
|
||||
<!-- Settings: three lists that each hold what their header says. -->
|
||||
<string name="relay_auth_exceptions">Exceções</string>
|
||||
<string name="relay_auth_no_exceptions">Nenhuma exceção ainda. Todo relay segue as regras acima.</string>
|
||||
<string name="relay_auth_exception_always">Sempre, definido por você</string>
|
||||
<string name="relay_auth_exception_never">Nunca, definido por você</string>
|
||||
<string name="relay_auth_segment_always">Sempre</string>
|
||||
<string name="relay_auth_segment_never">Nunca</string>
|
||||
<string name="relay_auth_remove_exception">Remover exceção</string>
|
||||
<string name="relay_auth_exception_removed_undo">Exceção removida. %1$s volta a seguir suas regras.</string>
|
||||
<string name="relay_auth_undo">Desfazer</string>
|
||||
<string name="relay_auth_blocked_section">Bloqueado pela sua lista de bloqueios</string>
|
||||
<string name="relay_auth_blocked_row_desc">O Amethyst nunca entra em relays bloqueados.</string>
|
||||
<string name="relay_auth_no_blocked">Nada bloqueado. O Amethyst nunca entrará em relays que você bloquear, seja qual for a configuração aqui.</string>
|
||||
<string name="relay_auth_recent_section">Entradas recentes</string>
|
||||
<string name="relay_auth_no_recent">Nenhum relay pediu que você entrasse ainda.</string>
|
||||
<string name="relay_auth_ago">há %1$s</string>
|
||||
<!-- Short labels for the purpose chips on a "recent logins" row. -->
|
||||
<string name="relay_auth_purpose_send_dm">suas mensagens</string>
|
||||
<string name="relay_auth_purpose_notify_inbox">suas respostas</string>
|
||||
<string name="relay_auth_purpose_read_outbox">pessoas que você lê</string>
|
||||
<string name="relay_auth_purpose_post_venue">uma sala em que você publica</string>
|
||||
<string name="relay_auth_purpose_read_venue">uma sala que você lê</string>
|
||||
<string name="relay_auth_purpose_my_inbox">sua caixa de entrada</string>
|
||||
<string name="relay_auth_purpose_thread">uma conversa</string>
|
||||
<string name="relay_auth_purpose_my_own_relay">seu próprio relay</string>
|
||||
<string name="relay_auth_purpose_other">este relay</string>
|
||||
<string name="nip82_repository_label">Fonte: %1$s</string>
|
||||
<string name="nip82_version_label">v%1$s</string>
|
||||
<string name="nip82_download">Baixar</string>
|
||||
@@ -1462,6 +1536,46 @@
|
||||
<string name="private_note_visible_to">Visível para</string>
|
||||
<string name="private_note_no_receivers">Nenhum destinatário ainda: apenas você poderá ver esta nota. Adicione pessoas para compartilhá-la.</string>
|
||||
<!-- Composer audience control (Notify / "Visible to") -->
|
||||
<string name="audience_manage">Gerenciar quem vê isto</string>
|
||||
<string name="audience_empty_private">Somente você — escolha quem mais pode ver isto</string>
|
||||
<string name="audience_empty_public">Adicione pessoas para notificar</string>
|
||||
<string name="audience_summary_two">%1$s e %2$s</string>
|
||||
<string name="audience_group_chip">%1$s · %2$s</string>
|
||||
<string name="audience_group_remove">Remover todos que foram adicionados de %1$s</string>
|
||||
<string name="audience_send_privately">Enviar de forma privada</string>
|
||||
<string name="audience_sheet_title">Adicionar pessoas</string>
|
||||
<string name="audience_sheet_search">Buscar pessoas e listas</string>
|
||||
<string name="audience_sheet_no_lists">Você ainda não tem listas de pessoas nem pacotes de seguidos. Use a busca acima para adicionar alguém diretamente.</string>
|
||||
<string name="audience_count_with_private">%1$d · %2$d privados</string>
|
||||
<string name="audience_over_limit">Acima do limite</string>
|
||||
<string name="audience_badge_already_added">Já adicionado</string>
|
||||
<string name="audience_badge_muted">Silenciado</string>
|
||||
<string name="audience_badge_private_member">Membro privado</string>
|
||||
<string name="audience_recipients_are_visible">Todos nesta nota podem ver a lista completa de destinatários.</string>
|
||||
<plurals name="audience_summary_others">
|
||||
<item quantity="one">%1$s, %2$s e mais %3$d</item>
|
||||
<item quantity="other">%1$s, %2$s e mais %3$d</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_private">
|
||||
<item quantity="one">Esta nota será criptografada e entregue %1$d vez separada, uma por pessoa. Com um assinador externo, isso significa uma aprovação para cada.</item>
|
||||
<item quantity="other">Esta nota será criptografada e entregue %1$d vezes separadas, uma por pessoa. Com um assinador externo, isso significa uma aprovação para cada.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_public">
|
||||
<item quantity="one">%1$d pessoa receberá uma notificação sobre esta publicação.</item>
|
||||
<item quantity="other">%1$d pessoas receberão uma notificação sobre esta publicação.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_hard_cap">
|
||||
<item quantity="one">Isso daria %1$d pessoa. O Amethyst adiciona no máximo %2$d por vez — desmarque algumas.</item>
|
||||
<item quantity="other">Isso daria %1$d pessoas. O Amethyst adiciona no máximo %2$d por vez — desmarque algumas.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_people">
|
||||
<item quantity="one">Adicionar %1$d pessoa</item>
|
||||
<item quantity="other">Adicionar %1$d pessoas</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_anyway">
|
||||
<item quantity="one">Adicionar %1$d pessoa mesmo assim</item>
|
||||
<item quantity="other">Adicionar %1$d pessoas mesmo assim</item>
|
||||
</plurals>
|
||||
<string name="notify_add_user">Adicionar</string>
|
||||
<string name="notify_remove_user">Remover usuário das notificações</string>
|
||||
<string name="notify_mute_user">Notificando. Toque para silenciar a notificação deste usuário</string>
|
||||
@@ -3886,6 +4000,49 @@
|
||||
<string name="social_proof">Prova social</string>
|
||||
<string name="poll_submit">Enviar</string>
|
||||
<string name="poll_view_results">Ver resultados</string>
|
||||
<string name="poll_results_title">Resultados da enquete</string>
|
||||
<string name="poll_results_loading">Carregando enquete…</string>
|
||||
<string name="poll_results_open">Aberta</string>
|
||||
<string name="poll_results_closes_in">Encerra em %1$s</string>
|
||||
<string name="poll_results_ended">Encerrada há %1$s</string>
|
||||
<string name="poll_results_all_options">Todas as opções</string>
|
||||
<string name="poll_results_your_pick">Seu voto</string>
|
||||
<plurals name="poll_results_selections">
|
||||
<item quantity="one">· %1$d seleção</item>
|
||||
<item quantity="other">· %1$d seleções</item>
|
||||
</plurals>
|
||||
<string name="poll_results_no_votes">Nenhum voto ainda</string>
|
||||
<string name="poll_results_checking_completeness">Verificando quantos votos existem…</string>
|
||||
<string name="poll_results_partial">%1$d de %2$d respostas carregadas de %3$d relays.</string>
|
||||
<string name="poll_results_partial_approx">%1$d de cerca de %2$d respostas carregadas de %3$d relays.</string>
|
||||
<plurals name="poll_results_voters">
|
||||
<item quantity="one">votante</item>
|
||||
<item quantity="other">votantes</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_vote_count_link">
|
||||
<item quantity="one">%1$d voto ›</item>
|
||||
<item quantity="other">%1$d votos ›</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_option_count">
|
||||
<item quantity="one">%1$d votante</item>
|
||||
<item quantity="other">%1$d votantes</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_late_votes">
|
||||
<item quantity="one">%1$d voto chegou depois do encerramento da enquete e foi excluído.</item>
|
||||
<item quantity="other">%1$d votos chegaram depois do encerramento da enquete e foram excluídos.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_backdated_votes">
|
||||
<item quantity="one">%1$d voto tem data anterior à publicação da enquete e foi excluído.</item>
|
||||
<item quantity="other">%1$d votos têm data anterior à publicação da enquete e foram excluídos.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_ignored_votes">
|
||||
<item quantity="one">%1$d resposta não escolheu uma opção válida e foi excluída.</item>
|
||||
<item quantity="other">%1$d respostas não escolheram uma opção válida e foram excluídas.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_hidden_voters">
|
||||
<item quantity="one">%1$d votante está oculto pela sua lista de silenciados.</item>
|
||||
<item quantity="other">%1$d votantes estão ocultos pela sua lista de silenciados.</item>
|
||||
</plurals>
|
||||
<string name="restart">Reiniciar</string>
|
||||
<string name="chess_accept">Aceitar</string>
|
||||
<string name="chess_decline">Recusar</string>
|
||||
@@ -4713,161 +4870,4 @@
|
||||
<string name="buzz_persona_avatar">URL do avatar (opcional)</string>
|
||||
<string name="buzz_persona_publishing">Publicando…</string>
|
||||
<string name="buzz_persona_publish">Publicar persona</string>
|
||||
<string name="audience_badge_already_added">Já adicionado</string>
|
||||
<string name="audience_badge_muted">Silenciado</string>
|
||||
<string name="audience_badge_private_member">Membro privado</string>
|
||||
<string name="audience_count_with_private">%1$d · %2$d privados</string>
|
||||
<string name="audience_empty_private">Somente você — escolha quem mais pode ver isto</string>
|
||||
<string name="audience_empty_public">Adicione pessoas para notificar</string>
|
||||
<string name="audience_group_chip">%1$s · %2$s</string>
|
||||
<string name="audience_group_remove">Remover todos que foram adicionados de %1$s</string>
|
||||
<string name="audience_manage">Gerenciar quem vê isto</string>
|
||||
<string name="audience_over_limit">Acima do limite</string>
|
||||
<string name="audience_recipients_are_visible">Todos nesta nota podem ver a lista completa de destinatários.</string>
|
||||
<string name="audience_send_privately">Enviar de forma privada</string>
|
||||
<string name="audience_sheet_no_lists">Você ainda não tem listas de pessoas nem pacotes de seguidos. Use a busca acima para adicionar alguém diretamente.</string>
|
||||
<string name="audience_sheet_search">Buscar pessoas e listas</string>
|
||||
<string name="audience_sheet_title">Adicionar pessoas</string>
|
||||
<string name="audience_summary_two">%1$s e %2$s</string>
|
||||
<string name="backup_keys_nudge_already_saved">Já salvei</string>
|
||||
<string name="backup_keys_nudge_backup_now">Fazer backup agora</string>
|
||||
<string name="backup_keys_nudge_body">Sua chave secreta é a única forma de acessar esta conta. Se você perdê-la, ela nunca poderá ser recuperada. Guarde-a em um lugar seguro agora.</string>
|
||||
<string name="backup_keys_nudge_dismiss">Dispensar</string>
|
||||
<string name="backup_keys_nudge_title">Faça backup das suas chaves</string>
|
||||
<string name="concord_invite_failed_banned">Esta comunidade removeu você. O link ainda funciona, mas a lista de membros dela não permite sua entrada.</string>
|
||||
<string name="concord_invite_links_action">Links de convite…</string>
|
||||
<string name="concord_invite_links_created">Criado %1$s</string>
|
||||
<string name="concord_invite_links_empty">Você ainda não criou nenhum link de convite para esta comunidade. Os links criados por outros administradores são gerenciados nos dispositivos deles.</string>
|
||||
<string name="concord_invite_links_title">Links de convite</string>
|
||||
<string name="concord_invite_links_unreadable">Não foi possível carregar seus links de convite, então nenhum pode ser revogado agora. Verifique sua conexão e tente novamente.</string>
|
||||
<string name="concord_invite_revoke_action">Revogar link</string>
|
||||
<string name="concord_invite_revoke_confirm">Revogar</string>
|
||||
<string name="concord_invite_revoke_explainer">Quem ainda tiver este link não conseguirá mais entrar. As pessoas que já entraram com ele permanecem na comunidade. Isso não pode ser desfeito.</string>
|
||||
<string name="concord_invite_revoke_title">Revogar este link?</string>
|
||||
<string name="concord_invite_revoked_failed">Não foi possível revogar o link. Verifique sua conexão e tente novamente.</string>
|
||||
<string name="concord_invite_revoked_ok">Link de convite revogado.</string>
|
||||
<string name="copy_text_original">Copiar original</string>
|
||||
<string name="copy_text_translated">Copiar tradução</string>
|
||||
<string name="poll_results_all_options">Todas as opções</string>
|
||||
<string name="poll_results_checking_completeness">Verificando quantos votos existem…</string>
|
||||
<string name="poll_results_closes_in">Encerra em %1$s</string>
|
||||
<string name="poll_results_ended">Encerrada há %1$s</string>
|
||||
<string name="poll_results_loading">Carregando enquete…</string>
|
||||
<string name="poll_results_no_votes">Nenhum voto ainda</string>
|
||||
<string name="poll_results_open">Aberta</string>
|
||||
<string name="poll_results_partial">%1$d de %2$d respostas carregadas de %3$d relays.</string>
|
||||
<string name="poll_results_partial_approx">%1$d de cerca de %2$d respostas carregadas de %3$d relays.</string>
|
||||
<string name="poll_results_title">Resultados da enquete</string>
|
||||
<string name="poll_results_your_pick">Seu voto</string>
|
||||
<string name="relay_auth_ago">há %1$s</string>
|
||||
<string name="relay_auth_auto_login_when">Entrar sem perguntar quando…</string>
|
||||
<string name="relay_auth_auto_message_follows">…eu estiver enviando mensagem para alguém que sigo</string>
|
||||
<string name="relay_auth_auto_message_strangers">…eu estiver enviando mensagem para qualquer outra pessoa</string>
|
||||
<string name="relay_auth_auto_my_relays">…for o meu relay, ou uma sala em que entrei</string>
|
||||
<string name="relay_auth_auto_read_follows">…eu estiver lendo alguém que sigo</string>
|
||||
<string name="relay_auth_blocked_row_desc">O Amethyst nunca entra em relays bloqueados.</string>
|
||||
<string name="relay_auth_blocked_section">Bloqueado pela sua lista de bloqueios</string>
|
||||
<string name="relay_auth_exception_always">Sempre, definido por você</string>
|
||||
<string name="relay_auth_exception_never">Nunca, definido por você</string>
|
||||
<string name="relay_auth_exception_removed_undo">Exceção removida. %1$s volta a seguir suas regras.</string>
|
||||
<string name="relay_auth_exceptions">Exceções</string>
|
||||
<string name="relay_auth_how_we_decide">Como o Amethyst decide</string>
|
||||
<string name="relay_auth_log_in">Entrar</string>
|
||||
<string name="relay_auth_login_as">Entrar como %1$s?</string>
|
||||
<string name="relay_auth_never_allow">Nunca permitir</string>
|
||||
<string name="relay_auth_no_blocked">Nada bloqueado. O Amethyst nunca entrará em relays que você bloquear, seja qual for a configuração aqui.</string>
|
||||
<string name="relay_auth_no_exceptions">Nenhuma exceção ainda. Todo relay segue as regras acima.</string>
|
||||
<string name="relay_auth_no_recent">Nenhum relay pediu que você entrasse ainda.</string>
|
||||
<string name="relay_auth_not_now">Agora não</string>
|
||||
<string name="relay_auth_purpose_my_inbox">sua caixa de entrada</string>
|
||||
<string name="relay_auth_purpose_my_own_relay">seu próprio relay</string>
|
||||
<string name="relay_auth_purpose_notify_inbox">suas respostas</string>
|
||||
<string name="relay_auth_purpose_other">este relay</string>
|
||||
<string name="relay_auth_purpose_post_venue">uma sala em que você publica</string>
|
||||
<string name="relay_auth_purpose_read_outbox">pessoas que você lê</string>
|
||||
<string name="relay_auth_purpose_read_venue">uma sala que você lê</string>
|
||||
<string name="relay_auth_purpose_send_dm">suas mensagens</string>
|
||||
<string name="relay_auth_purpose_thread">uma conversa</string>
|
||||
<string name="relay_auth_recent_section">Entradas recentes</string>
|
||||
<string name="relay_auth_relay_asks">pergunta quem é você</string>
|
||||
<string name="relay_auth_remember_relay">Lembrar para este relay</string>
|
||||
<string name="relay_auth_remove_exception">Remover exceção</string>
|
||||
<string name="relay_auth_segment_always">Sempre</string>
|
||||
<string name="relay_auth_segment_never">Nunca</string>
|
||||
<string name="relay_auth_someone_unloaded">alguém que você ainda não carregou</string>
|
||||
<string name="relay_auth_undo">Desfazer</string>
|
||||
<string name="relay_auth_why_my_inbox">Ele não entregará respostas, zaps e mensagens enviadas a você a menos que você entre.</string>
|
||||
<string name="relay_auth_why_my_own_relay">Este é um dos seus próprios relays, e ele pede que todos entrem.</string>
|
||||
<string name="relay_auth_why_notify_inbox">%1$s não ficará sabendo da sua resposta a menos que você entre.</string>
|
||||
<string name="relay_auth_why_other">Ele pede que todos entrem. O Amethyst não consegue saber o que ele está retendo.</string>
|
||||
<string name="relay_auth_why_post_venue">Ele não aceitará sua publicação em %1$s a menos que você entre.</string>
|
||||
<string name="relay_auth_why_read_outbox">Ele não entregará publicações de %1$s a menos que você entre.</string>
|
||||
<string name="relay_auth_why_read_venue">Ele não entregará %1$s a menos que você entre.</string>
|
||||
<string name="relay_auth_why_send_dm">Ele não aceitará sua mensagem para %1$s a menos que você entre.</string>
|
||||
<string name="relay_auth_why_thread">Ele não entregará o restante desta conversa a menos que você entre.</string>
|
||||
<string name="relay_auth_why_thread_with">Ele não entregará o restante da sua conversa com %1$s a menos que você entre.</string>
|
||||
<plurals name="audience_add_anyway">
|
||||
<item quantity="one">Adicionar %1$d pessoa mesmo assim</item>
|
||||
<item quantity="other">Adicionar %1$d pessoas mesmo assim</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_people">
|
||||
<item quantity="one">Adicionar %1$d pessoa</item>
|
||||
<item quantity="other">Adicionar %1$d pessoas</item>
|
||||
</plurals>
|
||||
<plurals name="audience_hard_cap">
|
||||
<item quantity="one">Isso daria %1$d pessoa. O Amethyst adiciona no máximo %2$d por vez — desmarque algumas.</item>
|
||||
<item quantity="other">Isso daria %1$d pessoas. O Amethyst adiciona no máximo %2$d por vez — desmarque algumas.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_private">
|
||||
<item quantity="one">Esta nota será criptografada e entregue %1$d vez separada, uma por pessoa. Com um assinador externo, isso significa uma aprovação para cada.</item>
|
||||
<item quantity="other">Esta nota será criptografada e entregue %1$d vezes separadas, uma por pessoa. Com um assinador externo, isso significa uma aprovação para cada.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_public">
|
||||
<item quantity="one">%1$d pessoa receberá uma notificação sobre esta publicação.</item>
|
||||
<item quantity="other">%1$d pessoas receberão uma notificação sobre esta publicação.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_summary_others">
|
||||
<item quantity="one">%1$s, %2$s e mais %3$d</item>
|
||||
<item quantity="other">%1$s, %2$s e mais %3$d</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_backdated_votes">
|
||||
<item quantity="one">%1$d voto tem data anterior à publicação da enquete e foi excluído.</item>
|
||||
<item quantity="other">%1$d votos têm data anterior à publicação da enquete e foram excluídos.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_hidden_voters">
|
||||
<item quantity="one">%1$d votante está oculto pela sua lista de silenciados.</item>
|
||||
<item quantity="other">%1$d votantes estão ocultos pela sua lista de silenciados.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_ignored_votes">
|
||||
<item quantity="one">%1$d resposta não escolheu uma opção válida e foi excluída.</item>
|
||||
<item quantity="other">%1$d respostas não escolheram uma opção válida e foram excluídas.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_late_votes">
|
||||
<item quantity="one">%1$d voto chegou depois do encerramento da enquete e foi excluído.</item>
|
||||
<item quantity="other">%1$d votos chegaram depois do encerramento da enquete e foram excluídos.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_option_count">
|
||||
<item quantity="one">%1$d votante</item>
|
||||
<item quantity="other">%1$d votantes</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_selections">
|
||||
<item quantity="one">· %1$d seleção</item>
|
||||
<item quantity="other">· %1$d seleções</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_vote_count_link">
|
||||
<item quantity="one">%1$d voto ›</item>
|
||||
<item quantity="other">%1$d votos ›</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_voters" tools:ignore="ImpliedQuantity">
|
||||
<item quantity="one">votante</item>
|
||||
<item quantity="other">votantes</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_also_holding_back">
|
||||
<item quantity="one">Ele também está retendo mais %1$d coisa.</item>
|
||||
<item quantity="other">Ele também está retendo mais %1$d coisas.</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_name_and_n_others">
|
||||
<item quantity="one">%1$s e mais %2$d</item>
|
||||
<item quantity="other">%1$s e mais %2$d</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
||||
@@ -46,6 +46,8 @@
|
||||
<string name="violence">Våld</string>
|
||||
<string name="unknown_author">Okänd användare</string>
|
||||
<string name="copy_text">Kopiera Text</string>
|
||||
<string name="copy_text_original">Kopiera originalet</string>
|
||||
<string name="copy_text_translated">Kopiera översättningen</string>
|
||||
<string name="copy_user_pubkey">Kopiera användarens ID</string>
|
||||
<string name="copy_note_id">Kopiera anteckningens ID</string>
|
||||
<string name="copy_raw_json">Kopiera rå JSON</string>
|
||||
@@ -310,6 +312,18 @@
|
||||
<string name="concord_invite_failed_invalid">Den här inbjudningslänken är ogiltig eller kan inte öppnas med det här kontot.</string>
|
||||
<string name="concord_invite_failed_incompatible">Den här inbjudningslänken kan inte öppnas. Den kan vara föråldrad eller redan ersatt av en nyare, eller skapad med en nyare version av appen. Be om en ny inbjudningslänk.</string>
|
||||
<string name="concord_invite_failed_revoked">Den här inbjudningslänken har återkallats och kan inte längre användas. Be om en ny.</string>
|
||||
<string name="concord_invite_failed_banned">Den här gemenskapen har tagit bort dig. Länken fungerar fortfarande, men dess medlemslista släpper inte in dig.</string>
|
||||
<string name="concord_invite_links_title">Inbjudningslänkar</string>
|
||||
<string name="concord_invite_links_action">Inbjudningslänkar…</string>
|
||||
<string name="concord_invite_links_created">Skapad %1$s</string>
|
||||
<string name="concord_invite_links_empty">Du har inte skapat några inbjudningslänkar för den här gemenskapen än. Länkar som andra administratörer skapat hanteras på deras egna enheter.</string>
|
||||
<string name="concord_invite_links_unreadable">Dina inbjudningslänkar kunde inte läsas in, så ingen kan återkallas just nu. Kontrollera din anslutning och försök igen.</string>
|
||||
<string name="concord_invite_revoke_action">Återkalla länk</string>
|
||||
<string name="concord_invite_revoke_title">Återkalla den här länken?</string>
|
||||
<string name="concord_invite_revoke_explainer">Den som fortfarande har den här länken kommer inte längre att kunna gå med. Personer som redan gått med via den stannar kvar i gemenskapen. Detta kan inte ångras.</string>
|
||||
<string name="concord_invite_revoke_confirm">Återkalla</string>
|
||||
<string name="concord_invite_revoked_ok">Inbjudningslänken har återkallats.</string>
|
||||
<string name="concord_invite_revoked_failed">Länken kunde inte återkallas. Kontrollera din anslutning och försök igen.</string>
|
||||
<string name="concord_invite_failed_expired">Den här inbjudningslänken har upphört att gälla och kan inte längre användas. Be om en ny länk.</string>
|
||||
<string name="concord_invite_preview_unknown_name">Gemenskapens namn visas först efter att du gått med</string>
|
||||
<string name="concord_invite_preview_explainer">Att gå med ansluter till inbjudningens reläer, publicerar ett anslutningsmeddelande signerat av ditt konto och lägger till gemenskapen i din lista. Inget skickas förrän du trycker på Gå med.</string>
|
||||
@@ -495,6 +509,11 @@
|
||||
\n- **Spara** en säkerhetskopia av din hemliga nyckel för återställning av kontot. Vi rekommenderar att du använder en lösenordshanterare.</string>
|
||||
<string name="account_backup_tips3_md" tools:ignore="Typos"> För extra säkerhet kan du kryptera din nyckel med ett lösenord. Denna nyckel börjar med **ncryptsec1** och kan inte användas utan ditt lösenord.
|
||||
\n\nOm du tappar bort ditt lösenord kommer du inte att kunna återställa din nyckel.</string>
|
||||
<string name="backup_keys_nudge_title">Säkerhetskopiera dina nycklar</string>
|
||||
<string name="backup_keys_nudge_body">Din hemliga nyckel är enda sättet att komma åt det här kontot. Om du förlorar den kan den aldrig återskapas. Spara den på ett säkert ställe nu.</string>
|
||||
<string name="backup_keys_nudge_backup_now">Säkerhetskopiera nu</string>
|
||||
<string name="backup_keys_nudge_already_saved">Jag har sparat dem</string>
|
||||
<string name="backup_keys_nudge_dismiss">Avfärda</string>
|
||||
<string name="failed_to_encrypt_key">Misslyckades med att kryptera din privata nyckel</string>
|
||||
<string name="secret_key_copied_to_clipboard">Hemlig nyckel (nsec) kopierad till urklipp</string>
|
||||
<string name="copy_my_secret_key">Kopiera min hemliga nyckel</string>
|
||||
@@ -1088,12 +1107,67 @@
|
||||
<!-- The group header carries the grammar; each toggle is a completion of the sentence, so these
|
||||
keys are new rather than reused - a stale translation of the old standalone titles would
|
||||
read as a non-sequitur under this header. -->
|
||||
<string name="relay_auth_auto_login_when">Logga in utan att fråga när…</string>
|
||||
<string name="relay_auth_auto_my_relays">…det är mitt relä, eller ett rum jag gått med i</string>
|
||||
<string name="relay_auth_auto_read_follows">…jag läser någon jag följer</string>
|
||||
<string name="relay_auth_auto_message_follows">…jag skriver till någon jag följer</string>
|
||||
<string name="relay_auth_auto_message_strangers">…jag skriver till någon annan</string>
|
||||
<!-- The AUTH prompt. The title is constant and names the account whose npub would be revealed;
|
||||
exactly one "why" line varies, and it states the consequence of declining too, which is why
|
||||
there is no separate "if you don\'t" line. New keys throughout: these replaced a set of
|
||||
labels ("Notify:", "Post to this room") whose translations would otherwise still bind. -->
|
||||
<string name="relay_auth_login_as">Logga in som %1$s?</string>
|
||||
<string name="relay_auth_relay_asks">frågar vem du är</string>
|
||||
<string name="relay_auth_why_send_dm">Det tar inte emot ditt meddelande till %1$s om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_notify_inbox">%1$s får inte veta om ditt svar om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_read_outbox">Det levererar inte inlägg från %1$s om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_post_venue">Det tar inte emot ditt inlägg i %1$s om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_read_venue">Det levererar inte %1$s om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_my_inbox">Det levererar inte svar, zaps och meddelanden som skickats till dig om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_thread">Det levererar inte resten av den här konversationen om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_thread_with">Det levererar inte resten av din konversation med %1$s om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_my_own_relay">Det här är ett av dina egna reläer, och det ber alla att logga in.</string>
|
||||
<string name="relay_auth_why_other">Det ber alla att logga in. Amethyst kan inte avgöra vad det håller inne med.</string>
|
||||
<string name="relay_auth_someone_unloaded">någon du inte laddat in än</string>
|
||||
<plurals name="relay_auth_name_and_n_others">
|
||||
<item quantity="one">%1$s och %2$d till</item>
|
||||
<item quantity="other">%1$s och %2$d till</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_also_holding_back">
|
||||
<item quantity="one">Det håller också inne med %1$d annan sak.</item>
|
||||
<item quantity="other">Det håller också inne med %1$d andra saker.</item>
|
||||
</plurals>
|
||||
<string name="relay_auth_remember_relay">Kom ihåg för det här reläet</string>
|
||||
<string name="relay_auth_log_in">Logga in</string>
|
||||
<string name="relay_auth_not_now">Inte nu</string>
|
||||
<string name="relay_auth_never_allow">Tillåt aldrig</string>
|
||||
<string name="relay_auth_how_we_decide">Så avgör Amethyst</string>
|
||||
<!-- Settings: three lists that each hold what their header says. -->
|
||||
<string name="relay_auth_exceptions">Undantag</string>
|
||||
<string name="relay_auth_no_exceptions">Inga undantag än. Varje relä följer reglerna ovan.</string>
|
||||
<string name="relay_auth_exception_always">Alltid, inställt av dig</string>
|
||||
<string name="relay_auth_exception_never">Aldrig, inställt av dig</string>
|
||||
<string name="relay_auth_segment_always">Alltid</string>
|
||||
<string name="relay_auth_segment_never">Aldrig</string>
|
||||
<string name="relay_auth_remove_exception">Ta bort undantag</string>
|
||||
<string name="relay_auth_exception_removed_undo">Undantaget togs bort. %1$s följer dina regler igen.</string>
|
||||
<string name="relay_auth_undo">Ångra</string>
|
||||
<string name="relay_auth_blocked_section">Blockerat av din blockeringslista</string>
|
||||
<string name="relay_auth_blocked_row_desc">Amethyst loggar aldrig in på blockerade reläer.</string>
|
||||
<string name="relay_auth_no_blocked">Inget blockerat. Reläer du blockerar loggas aldrig in på, oavsett vad du ställer in här.</string>
|
||||
<string name="relay_auth_recent_section">Senaste inloggningar</string>
|
||||
<string name="relay_auth_no_recent">Inget relä har bett dig logga in än.</string>
|
||||
<string name="relay_auth_ago">för %1$s sedan</string>
|
||||
<!-- Short labels for the purpose chips on a "recent logins" row. -->
|
||||
<string name="relay_auth_purpose_send_dm">dina meddelanden</string>
|
||||
<string name="relay_auth_purpose_notify_inbox">dina svar</string>
|
||||
<string name="relay_auth_purpose_read_outbox">personer du läser</string>
|
||||
<string name="relay_auth_purpose_post_venue">ett rum du postar i</string>
|
||||
<string name="relay_auth_purpose_read_venue">ett rum du läser</string>
|
||||
<string name="relay_auth_purpose_my_inbox">din inkorg</string>
|
||||
<string name="relay_auth_purpose_thread">en konversation</string>
|
||||
<string name="relay_auth_purpose_my_own_relay">ditt eget relä</string>
|
||||
<string name="relay_auth_purpose_other">det här reläet</string>
|
||||
<string name="nip82_repository_label">Källa: %1$s</string>
|
||||
<string name="nip82_version_label">v%1$s</string>
|
||||
<string name="nip82_download">Ladda ner</string>
|
||||
@@ -1462,6 +1536,46 @@
|
||||
<string name="private_note_visible_to">Synlig för</string>
|
||||
<string name="private_note_no_receivers">Inga mottagare ännu: bara du kommer att kunna se den här anteckningen. Lägg till personer att dela den med.</string>
|
||||
<!-- Composer audience control (Notify / "Visible to") -->
|
||||
<string name="audience_manage">Hantera vem som ser detta</string>
|
||||
<string name="audience_empty_private">Bara du — välj vem mer som får se detta</string>
|
||||
<string name="audience_empty_public">Lägg till personer att avisera</string>
|
||||
<string name="audience_summary_two">%1$s och %2$s</string>
|
||||
<string name="audience_group_chip">%1$s · %2$s</string>
|
||||
<string name="audience_group_remove">Ta bort alla som lagts till från %1$s</string>
|
||||
<string name="audience_send_privately">Skicka privat</string>
|
||||
<string name="audience_sheet_title">Lägg till personer</string>
|
||||
<string name="audience_sheet_search">Sök personer och listor</string>
|
||||
<string name="audience_sheet_no_lists">Du har inga personlistor eller följpaket än. Sök ovan för att lägga till någon direkt.</string>
|
||||
<string name="audience_count_with_private">%1$d · %2$d privata</string>
|
||||
<string name="audience_over_limit">Över gränsen</string>
|
||||
<string name="audience_badge_already_added">Redan tillagd</string>
|
||||
<string name="audience_badge_muted">Tystad</string>
|
||||
<string name="audience_badge_private_member">Privat medlem</string>
|
||||
<string name="audience_recipients_are_visible">Alla i den här anteckningen kan se hela mottagarlistan.</string>
|
||||
<plurals name="audience_summary_others">
|
||||
<item quantity="one">%1$s, %2$s och %3$d till</item>
|
||||
<item quantity="other">%1$s, %2$s och %3$d till</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_private">
|
||||
<item quantity="one">Den här anteckningen krypteras och levereras %1$d separat gång, en gång per person. Med en extern signerare innebär det ett godkännande var.</item>
|
||||
<item quantity="other">Den här anteckningen krypteras och levereras %1$d separata gånger, en gång per person. Med en extern signerare innebär det ett godkännande var.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_public">
|
||||
<item quantity="one">%1$d person får en avisering om det här inlägget.</item>
|
||||
<item quantity="other">%1$d personer får en avisering om det här inlägget.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_hard_cap">
|
||||
<item quantity="one">Det skulle bli %1$d person. Amethyst lägger till högst %2$d åt gången — avmarkera några.</item>
|
||||
<item quantity="other">Det skulle bli %1$d personer. Amethyst lägger till högst %2$d åt gången — avmarkera några.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_people">
|
||||
<item quantity="one">Lägg till %1$d person</item>
|
||||
<item quantity="other">Lägg till %1$d personer</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_anyway">
|
||||
<item quantity="one">Lägg till %1$d person ändå</item>
|
||||
<item quantity="other">Lägg till %1$d personer ändå</item>
|
||||
</plurals>
|
||||
<string name="notify_add_user">Lägg till</string>
|
||||
<string name="notify_remove_user">Ta bort användare från aviseringar</string>
|
||||
<string name="notify_mute_user">Aviserar. Tryck för att tysta aviseringen för den här användaren</string>
|
||||
@@ -3886,6 +4000,49 @@
|
||||
<string name="social_proof">Socialt bevis</string>
|
||||
<string name="poll_submit">Skicka</string>
|
||||
<string name="poll_view_results">Visa resultat</string>
|
||||
<string name="poll_results_title">Omröstningsresultat</string>
|
||||
<string name="poll_results_loading">Läser in omröstning…</string>
|
||||
<string name="poll_results_open">Öppen</string>
|
||||
<string name="poll_results_closes_in">Stänger om %1$s</string>
|
||||
<string name="poll_results_ended">Avslutades för %1$s sedan</string>
|
||||
<string name="poll_results_all_options">Alla alternativ</string>
|
||||
<string name="poll_results_your_pick">Din röst</string>
|
||||
<plurals name="poll_results_selections">
|
||||
<item quantity="one">· %1$d val</item>
|
||||
<item quantity="other">· %1$d val</item>
|
||||
</plurals>
|
||||
<string name="poll_results_no_votes">Inga röster än</string>
|
||||
<string name="poll_results_checking_completeness">Kontrollerar hur många röster som finns…</string>
|
||||
<string name="poll_results_partial">%1$d av %2$d svar inlästa från %3$d reläer.</string>
|
||||
<string name="poll_results_partial_approx">%1$d av ungefär %2$d svar inlästa från %3$d reläer.</string>
|
||||
<plurals name="poll_results_voters">
|
||||
<item quantity="one">röstande</item>
|
||||
<item quantity="other">röstande</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_vote_count_link">
|
||||
<item quantity="one">%1$d röst ›</item>
|
||||
<item quantity="other">%1$d röster ›</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_option_count">
|
||||
<item quantity="one">%1$d röstande</item>
|
||||
<item quantity="other">%1$d röstande</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_late_votes">
|
||||
<item quantity="one">%1$d röst kom in efter att omröstningen stängde och utesluts.</item>
|
||||
<item quantity="other">%1$d röster kom in efter att omröstningen stängde och utesluts.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_backdated_votes">
|
||||
<item quantity="one">%1$d röst är daterad före omröstningen publicerades och utesluts.</item>
|
||||
<item quantity="other">%1$d röster är daterade före omröstningen publicerades och utesluts.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_ignored_votes">
|
||||
<item quantity="one">%1$d svar valde inget giltigt alternativ och utesluts.</item>
|
||||
<item quantity="other">%1$d svar valde inget giltigt alternativ och utesluts.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_hidden_voters">
|
||||
<item quantity="one">%1$d röstande döljs av din tystningslista.</item>
|
||||
<item quantity="other">%1$d röstande döljs av din tystningslista.</item>
|
||||
</plurals>
|
||||
<string name="restart">Starta om</string>
|
||||
<string name="chess_accept">Acceptera</string>
|
||||
<string name="chess_decline">Avböj</string>
|
||||
@@ -4713,161 +4870,4 @@
|
||||
<string name="buzz_persona_avatar">Avatar-URL (valfritt)</string>
|
||||
<string name="buzz_persona_publishing">Publicerar…</string>
|
||||
<string name="buzz_persona_publish">Publicera persona</string>
|
||||
<string name="audience_badge_already_added">Redan tillagd</string>
|
||||
<string name="audience_badge_muted">Tystad</string>
|
||||
<string name="audience_badge_private_member">Privat medlem</string>
|
||||
<string name="audience_count_with_private">%1$d · %2$d privata</string>
|
||||
<string name="audience_empty_private">Bara du — välj vem mer som får se detta</string>
|
||||
<string name="audience_empty_public">Lägg till personer att avisera</string>
|
||||
<string name="audience_group_chip">%1$s · %2$s</string>
|
||||
<string name="audience_group_remove">Ta bort alla som lagts till från %1$s</string>
|
||||
<string name="audience_manage">Hantera vem som ser detta</string>
|
||||
<string name="audience_over_limit">Över gränsen</string>
|
||||
<string name="audience_recipients_are_visible">Alla i den här anteckningen kan se hela mottagarlistan.</string>
|
||||
<string name="audience_send_privately">Skicka privat</string>
|
||||
<string name="audience_sheet_no_lists">Du har inga personlistor eller följpaket än. Sök ovan för att lägga till någon direkt.</string>
|
||||
<string name="audience_sheet_search">Sök personer och listor</string>
|
||||
<string name="audience_sheet_title">Lägg till personer</string>
|
||||
<string name="audience_summary_two">%1$s och %2$s</string>
|
||||
<string name="backup_keys_nudge_already_saved">Jag har sparat dem</string>
|
||||
<string name="backup_keys_nudge_backup_now">Säkerhetskopiera nu</string>
|
||||
<string name="backup_keys_nudge_body">Din hemliga nyckel är enda sättet att komma åt det här kontot. Om du förlorar den kan den aldrig återskapas. Spara den på ett säkert ställe nu.</string>
|
||||
<string name="backup_keys_nudge_dismiss">Avfärda</string>
|
||||
<string name="backup_keys_nudge_title">Säkerhetskopiera dina nycklar</string>
|
||||
<string name="concord_invite_failed_banned">Den här gemenskapen har tagit bort dig. Länken fungerar fortfarande, men dess medlemslista släpper inte in dig.</string>
|
||||
<string name="concord_invite_links_action">Inbjudningslänkar…</string>
|
||||
<string name="concord_invite_links_created">Skapad %1$s</string>
|
||||
<string name="concord_invite_links_empty">Du har inte skapat några inbjudningslänkar för den här gemenskapen än. Länkar som andra administratörer skapat hanteras på deras egna enheter.</string>
|
||||
<string name="concord_invite_links_title">Inbjudningslänkar</string>
|
||||
<string name="concord_invite_links_unreadable">Dina inbjudningslänkar kunde inte läsas in, så ingen kan återkallas just nu. Kontrollera din anslutning och försök igen.</string>
|
||||
<string name="concord_invite_revoke_action">Återkalla länk</string>
|
||||
<string name="concord_invite_revoke_confirm">Återkalla</string>
|
||||
<string name="concord_invite_revoke_explainer">Den som fortfarande har den här länken kommer inte längre att kunna gå med. Personer som redan gått med via den stannar kvar i gemenskapen. Detta kan inte ångras.</string>
|
||||
<string name="concord_invite_revoke_title">Återkalla den här länken?</string>
|
||||
<string name="concord_invite_revoked_failed">Länken kunde inte återkallas. Kontrollera din anslutning och försök igen.</string>
|
||||
<string name="concord_invite_revoked_ok">Inbjudningslänken har återkallats.</string>
|
||||
<string name="copy_text_original">Kopiera originalet</string>
|
||||
<string name="copy_text_translated">Kopiera översättningen</string>
|
||||
<string name="poll_results_all_options">Alla alternativ</string>
|
||||
<string name="poll_results_checking_completeness">Kontrollerar hur många röster som finns…</string>
|
||||
<string name="poll_results_closes_in">Stänger om %1$s</string>
|
||||
<string name="poll_results_ended">Avslutades för %1$s sedan</string>
|
||||
<string name="poll_results_loading">Läser in omröstning…</string>
|
||||
<string name="poll_results_no_votes">Inga röster än</string>
|
||||
<string name="poll_results_open">Öppen</string>
|
||||
<string name="poll_results_partial">%1$d av %2$d svar inlästa från %3$d reläer.</string>
|
||||
<string name="poll_results_partial_approx">%1$d av ungefär %2$d svar inlästa från %3$d reläer.</string>
|
||||
<string name="poll_results_title">Omröstningsresultat</string>
|
||||
<string name="poll_results_your_pick">Din röst</string>
|
||||
<string name="relay_auth_ago">för %1$s sedan</string>
|
||||
<string name="relay_auth_auto_login_when">Logga in utan att fråga när…</string>
|
||||
<string name="relay_auth_auto_message_follows">…jag skriver till någon jag följer</string>
|
||||
<string name="relay_auth_auto_message_strangers">…jag skriver till någon annan</string>
|
||||
<string name="relay_auth_auto_my_relays">…det är mitt relä, eller ett rum jag gått med i</string>
|
||||
<string name="relay_auth_auto_read_follows">…jag läser någon jag följer</string>
|
||||
<string name="relay_auth_blocked_row_desc">Amethyst loggar aldrig in på blockerade reläer.</string>
|
||||
<string name="relay_auth_blocked_section">Blockerat av din blockeringslista</string>
|
||||
<string name="relay_auth_exception_always">Alltid, inställt av dig</string>
|
||||
<string name="relay_auth_exception_never">Aldrig, inställt av dig</string>
|
||||
<string name="relay_auth_exception_removed_undo">Undantaget togs bort. %1$s följer dina regler igen.</string>
|
||||
<string name="relay_auth_exceptions">Undantag</string>
|
||||
<string name="relay_auth_how_we_decide">Så avgör Amethyst</string>
|
||||
<string name="relay_auth_log_in">Logga in</string>
|
||||
<string name="relay_auth_login_as">Logga in som %1$s?</string>
|
||||
<string name="relay_auth_never_allow">Tillåt aldrig</string>
|
||||
<string name="relay_auth_no_blocked">Inget blockerat. Reläer du blockerar loggas aldrig in på, oavsett vad du ställer in här.</string>
|
||||
<string name="relay_auth_no_exceptions">Inga undantag än. Varje relä följer reglerna ovan.</string>
|
||||
<string name="relay_auth_no_recent">Inget relä har bett dig logga in än.</string>
|
||||
<string name="relay_auth_not_now">Inte nu</string>
|
||||
<string name="relay_auth_purpose_my_inbox">din inkorg</string>
|
||||
<string name="relay_auth_purpose_my_own_relay">ditt eget relä</string>
|
||||
<string name="relay_auth_purpose_notify_inbox">dina svar</string>
|
||||
<string name="relay_auth_purpose_other">det här reläet</string>
|
||||
<string name="relay_auth_purpose_post_venue">ett rum du postar i</string>
|
||||
<string name="relay_auth_purpose_read_outbox">personer du läser</string>
|
||||
<string name="relay_auth_purpose_read_venue">ett rum du läser</string>
|
||||
<string name="relay_auth_purpose_send_dm">dina meddelanden</string>
|
||||
<string name="relay_auth_purpose_thread">en konversation</string>
|
||||
<string name="relay_auth_recent_section">Senaste inloggningar</string>
|
||||
<string name="relay_auth_relay_asks">frågar vem du är</string>
|
||||
<string name="relay_auth_remember_relay">Kom ihåg för det här reläet</string>
|
||||
<string name="relay_auth_remove_exception">Ta bort undantag</string>
|
||||
<string name="relay_auth_segment_always">Alltid</string>
|
||||
<string name="relay_auth_segment_never">Aldrig</string>
|
||||
<string name="relay_auth_someone_unloaded">någon du inte laddat in än</string>
|
||||
<string name="relay_auth_undo">Ångra</string>
|
||||
<string name="relay_auth_why_my_inbox">Det levererar inte svar, zaps och meddelanden som skickats till dig om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_my_own_relay">Det här är ett av dina egna reläer, och det ber alla att logga in.</string>
|
||||
<string name="relay_auth_why_notify_inbox">%1$s får inte veta om ditt svar om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_other">Det ber alla att logga in. Amethyst kan inte avgöra vad det håller inne med.</string>
|
||||
<string name="relay_auth_why_post_venue">Det tar inte emot ditt inlägg i %1$s om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_read_outbox">Det levererar inte inlägg från %1$s om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_read_venue">Det levererar inte %1$s om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_send_dm">Det tar inte emot ditt meddelande till %1$s om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_thread">Det levererar inte resten av den här konversationen om du inte loggar in.</string>
|
||||
<string name="relay_auth_why_thread_with">Det levererar inte resten av din konversation med %1$s om du inte loggar in.</string>
|
||||
<plurals name="audience_add_anyway">
|
||||
<item quantity="one">Lägg till %1$d person ändå</item>
|
||||
<item quantity="other">Lägg till %1$d personer ändå</item>
|
||||
</plurals>
|
||||
<plurals name="audience_add_people">
|
||||
<item quantity="one">Lägg till %1$d person</item>
|
||||
<item quantity="other">Lägg till %1$d personer</item>
|
||||
</plurals>
|
||||
<plurals name="audience_hard_cap">
|
||||
<item quantity="one">Det skulle bli %1$d person. Amethyst lägger till högst %2$d åt gången — avmarkera några.</item>
|
||||
<item quantity="other">Det skulle bli %1$d personer. Amethyst lägger till högst %2$d åt gången — avmarkera några.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_private">
|
||||
<item quantity="one">Den här anteckningen krypteras och levereras %1$d separat gång, en gång per person. Med en extern signerare innebär det ett godkännande var.</item>
|
||||
<item quantity="other">Den här anteckningen krypteras och levereras %1$d separata gånger, en gång per person. Med en extern signerare innebär det ett godkännande var.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_soft_cap_public">
|
||||
<item quantity="one">%1$d person får en avisering om det här inlägget.</item>
|
||||
<item quantity="other">%1$d personer får en avisering om det här inlägget.</item>
|
||||
</plurals>
|
||||
<plurals name="audience_summary_others">
|
||||
<item quantity="one">%1$s, %2$s och %3$d till</item>
|
||||
<item quantity="other">%1$s, %2$s och %3$d till</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_backdated_votes">
|
||||
<item quantity="one">%1$d röst är daterad före omröstningen publicerades och utesluts.</item>
|
||||
<item quantity="other">%1$d röster är daterade före omröstningen publicerades och utesluts.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_hidden_voters">
|
||||
<item quantity="one">%1$d röstande döljs av din tystningslista.</item>
|
||||
<item quantity="other">%1$d röstande döljs av din tystningslista.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_ignored_votes">
|
||||
<item quantity="one">%1$d svar valde inget giltigt alternativ och utesluts.</item>
|
||||
<item quantity="other">%1$d svar valde inget giltigt alternativ och utesluts.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_late_votes">
|
||||
<item quantity="one">%1$d röst kom in efter att omröstningen stängde och utesluts.</item>
|
||||
<item quantity="other">%1$d röster kom in efter att omröstningen stängde och utesluts.</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_option_count">
|
||||
<item quantity="one">%1$d röstande</item>
|
||||
<item quantity="other">%1$d röstande</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_selections">
|
||||
<item quantity="one">· %1$d val</item>
|
||||
<item quantity="other">· %1$d val</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_vote_count_link">
|
||||
<item quantity="one">%1$d röst ›</item>
|
||||
<item quantity="other">%1$d röster ›</item>
|
||||
</plurals>
|
||||
<plurals name="poll_results_voters">
|
||||
<item quantity="one">röstande</item>
|
||||
<item quantity="other">röstande</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_also_holding_back">
|
||||
<item quantity="one">Det håller också inne med %1$d annan sak.</item>
|
||||
<item quantity="other">Det håller också inne med %1$d andra saker.</item>
|
||||
</plurals>
|
||||
<plurals name="relay_auth_name_and_n_others">
|
||||
<item quantity="one">%1$s och %2$d till</item>
|
||||
<item quantity="other">%1$s och %2$d till</item>
|
||||
</plurals>
|
||||
</resources>
|
||||
|
||||
+100
@@ -0,0 +1,100 @@
|
||||
/*
|
||||
* Copyright (c) 2025 Vitor Pamplona
|
||||
*
|
||||
* Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||
* this software and associated documentation files (the "Software"), to deal in
|
||||
* the Software without restriction, including without limitation the rights to use,
|
||||
* copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
|
||||
* Software, and to permit persons to whom the Software is furnished to do so,
|
||||
* subject to the following conditions:
|
||||
*
|
||||
* The above copyright notice and this permission notice shall be included in all
|
||||
* copies or substantial portions of the Software.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
||||
* AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
||||
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
*/
|
||||
package com.vitorpamplona.amethyst.ui.components.pdf
|
||||
|
||||
import org.junit.Assert.assertEquals
|
||||
import org.junit.Assert.assertTrue
|
||||
import org.junit.Test
|
||||
|
||||
/**
|
||||
* The placeholder shown while a previously-seen PDF re-renders reserves its box from the ratio
|
||||
* cached in `MediaAspectRatioCache`, and the loaded thumbnail sizes itself from the ratio the
|
||||
* renderer reports. Those are the same number, so both sides must clamp it identically — a
|
||||
* placeholder that skipped the clamp would reserve a different box than the page lands in, which is
|
||||
* the jump it exists to remove.
|
||||
*/
|
||||
class PdfPreviewAspectRatioTest {
|
||||
@Test
|
||||
fun ordinaryPortraitPageIsUnchanged() {
|
||||
// US Letter, in PostScript points.
|
||||
assertEquals(612f / 792f, previewAspectRatio(612f / 792f), 0.0001f)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun landscapePageIsUnchanged() {
|
||||
assertEquals(792f / 612f, previewAspectRatio(792f / 612f), 0.0001f)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun pathologicallyTallPageIsClamped() {
|
||||
// A 200x4000 receipt would otherwise reserve 20 screens of height for a sliver of content.
|
||||
assertEquals(0.2f, previewAspectRatio(200f / 4000f), 0.0001f)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun theClampIsTheSameNumberBothSidesUse() {
|
||||
val cachedOnRevisit = 200f / 4000f
|
||||
val reportedByTheRenderer = 200f / 4000f
|
||||
|
||||
assertEquals(previewAspectRatio(reportedByTheRenderer), previewAspectRatio(cachedOnRevisit), 0.0f)
|
||||
}
|
||||
|
||||
/**
|
||||
* `Modifier.aspectRatio` requires a finite ratio greater than zero and throws otherwise, so
|
||||
* every one of these would crash the composition of the whole feed if it reached the modifier.
|
||||
* A page measuring 0x0 and an imeta `dim` of `"0.4x0.4"` (which truncates to 0x0, slipping past
|
||||
* the parser's literal-`"0x0"` rejection) both arrive here as 0/0.
|
||||
*/
|
||||
@Test
|
||||
fun degenerateSizesNeverReachTheModifier() {
|
||||
assertUsable(previewAspectRatio(ratioOf(0, 0)))
|
||||
assertUsable(previewAspectRatio(ratioOf(100, 0)))
|
||||
assertUsable(previewAspectRatio(ratioOf(0, 100)))
|
||||
assertUsable(previewAspectRatio(-1f))
|
||||
}
|
||||
|
||||
/**
|
||||
* Pins the reason the guard above cannot just be the clamp: every comparison against NaN is
|
||||
* false, so `coerceAtLeast` returns NaN unchanged rather than lifting it to the floor.
|
||||
*/
|
||||
@Test
|
||||
fun clampingAloneDoesNotCatchNaN() {
|
||||
assertTrue(ratioOf(0, 0).coerceAtLeast(0.2f).isNaN())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun unknownSizedPagesFallBackToPortrait() {
|
||||
// Taller than wide, so an unknown page reserves a portrait box rather than a squat one.
|
||||
assertTrue(previewAspectRatio(ratioOf(0, 0)) < 1f)
|
||||
}
|
||||
|
||||
// Computed rather than written as a literal so the compiler doesn't fold it into a
|
||||
// division-by-zero warning — these degenerate sizes are the point of the test.
|
||||
private fun ratioOf(
|
||||
width: Int,
|
||||
height: Int,
|
||||
): Float = width.toFloat() / height.toFloat()
|
||||
|
||||
private fun assertUsable(ratio: Float) {
|
||||
assertTrue("$ratio is not finite", ratio.isFinite())
|
||||
assertTrue("$ratio is not > 0", ratio > 0f)
|
||||
}
|
||||
}
|
||||
@@ -21,7 +21,41 @@
|
||||
<string name="new_key_public_label">Veřejný klíč (lze sdílet):</string>
|
||||
<string name="new_key_secret_label">Tajný klíč (NIKDY jej nesdílejte!):</string>
|
||||
<string name="new_key_continue_button">Uložil jsem si klíče, pokračovat</string>
|
||||
<string name="new_key_saved_checkbox">Uložil jsem si klíče na bezpečné místo</string>
|
||||
<string name="new_key_copy_encrypted_button">Kopírovat zašifrovaně (doporučeno)</string>
|
||||
<string name="new_key_encrypt_password_label">Heslo pro zašifrovanou zálohu</string>
|
||||
<string name="new_key_step_indicator">Krok %1$d z %2$d</string>
|
||||
<string name="new_key_next">Další</string>
|
||||
<string name="new_key_back">Zpět</string>
|
||||
<string name="new_key_cancel">Zrušit</string>
|
||||
<string name="new_key_step_intro_title">Než budete pokračovat, uložte si klíče</string>
|
||||
<string name="new_key_step_intro_npub">Váš veřejný klíč (npub) je vaše sdílitelná adresa. Rozdávejte ho bez obav, aby vás lidé mohli najít a sledovat.</string>
|
||||
<string name="new_key_step_intro_nsec">Váš tajný klíč (nsec) je heslo, které NIKDY nelze změnit. Toto je jediný okamžik, kdy se zobrazí — uložte si ho hned, jinak přijdete o přístup k tomuto účtu navždy.</string>
|
||||
<string name="new_key_keys_title">Vaše klíče</string>
|
||||
<string name="new_key_confirm_title">Ještě jedna věc</string>
|
||||
<string name="new_key_confirm_recap">Uložte si tajný klíč do správce hesel. Pokud ho ztratíte, nikdo vám ho nedokáže obnovit.</string>
|
||||
<string name="new_key_readonly_info">Toto je účet jen pro čtení. Nebyl vygenerován žádný tajný klíč, takže není co zálohovat.</string>
|
||||
<!-- Key Backup (Desktop settings) -->
|
||||
<string name="backup_keys_title">Zálohovat klíče</string>
|
||||
<string name="backup_keys_public_label">Veřejný klíč (npub)</string>
|
||||
<string name="backup_keys_public_help">Váš veřejný klíč lze bez obav sdílet. Dejte ho lidem, aby vás mohli najít a sledovat.</string>
|
||||
<string name="backup_keys_show_qr">Zobrazit QR kód</string>
|
||||
<string name="backup_keys_hide_qr">Skrýt QR kód</string>
|
||||
<string name="backup_keys_secret_label">Tajný klíč (nsec)</string>
|
||||
<string name="backup_keys_secret_warning">Váš tajný klíč je jako heslo, které NIKDY nelze změnit ani obnovit. Kdokoli ho má, ovládá váš účet navždy. Nikdy ho nesdílejte; uložte si ho do správce hesel.</string>
|
||||
<string name="backup_keys_secret_hidden">Tajný klíč je skrytý</string>
|
||||
<string name="backup_keys_reveal">Zobrazit tajný klíč</string>
|
||||
<string name="backup_keys_hide">Skrýt tajný klíč</string>
|
||||
<string name="backup_keys_copy_plain">Kopírovat tajný klíč</string>
|
||||
<string name="backup_keys_copy_plain_warning">Zkopíruje nsec v čitelné podobě. Vkládejte ho pouze do důvěryhodného správce hesel.</string>
|
||||
<string name="backup_keys_copy_encrypted">Kopírovat zašifrovaně (doporučeno)</string>
|
||||
<string name="backup_keys_encrypt_password_label">Heslo pro zašifrovanou zálohu</string>
|
||||
<string name="backup_keys_encrypt_failed">Klíč se nepodařilo zašifrovat. Zkuste to prosím znovu.</string>
|
||||
<string name="backup_keys_external_signer">Tento účet používá externí podepisovač — žádný tajný klíč zde není uložen.</string>
|
||||
<string name="backup_keys_copied">Zkopírováno!</string>
|
||||
<string name="backup_keys_copy">Kopírovat</string>
|
||||
<string name="backup_keys_unlock_title">Zobrazit tajný klíč</string>
|
||||
<string name="backup_keys_unlock_subtitle">Pro zobrazení tajného klíče zadejte heslo zámku soukromí.</string>
|
||||
<!-- Common Actions -->
|
||||
<string name="action_copy">Kopírovat</string>
|
||||
<string name="action_paste">Vložit</string>
|
||||
@@ -161,38 +195,4 @@
|
||||
<item quantity="many">%1$d událostí</item>
|
||||
<item quantity="other">%1$d událostí</item>
|
||||
</plurals>
|
||||
<string name="backup_keys_copied">Zkopírováno!</string>
|
||||
<string name="backup_keys_copy">Kopírovat</string>
|
||||
<string name="backup_keys_copy_encrypted">Kopírovat zašifrovaně (doporučeno)</string>
|
||||
<string name="backup_keys_copy_plain">Kopírovat tajný klíč</string>
|
||||
<string name="backup_keys_copy_plain_warning">Zkopíruje nsec v čitelné podobě. Vkládejte ho pouze do důvěryhodného správce hesel.</string>
|
||||
<string name="backup_keys_encrypt_failed">Klíč se nepodařilo zašifrovat. Zkuste to prosím znovu.</string>
|
||||
<string name="backup_keys_encrypt_password_label">Heslo pro zašifrovanou zálohu</string>
|
||||
<string name="backup_keys_external_signer">Tento účet používá externí podepisovač — žádný tajný klíč zde není uložen.</string>
|
||||
<string name="backup_keys_hide">Skrýt tajný klíč</string>
|
||||
<string name="backup_keys_hide_qr">Skrýt QR kód</string>
|
||||
<string name="backup_keys_public_help">Váš veřejný klíč lze bez obav sdílet. Dejte ho lidem, aby vás mohli najít a sledovat.</string>
|
||||
<string name="backup_keys_public_label">Veřejný klíč (npub)</string>
|
||||
<string name="backup_keys_reveal">Zobrazit tajný klíč</string>
|
||||
<string name="backup_keys_secret_hidden">Tajný klíč je skrytý</string>
|
||||
<string name="backup_keys_secret_label">Tajný klíč (nsec)</string>
|
||||
<string name="backup_keys_secret_warning">Váš tajný klíč je jako heslo, které NIKDY nelze změnit ani obnovit. Kdokoli ho má, ovládá váš účet navždy. Nikdy ho nesdílejte; uložte si ho do správce hesel.</string>
|
||||
<string name="backup_keys_show_qr">Zobrazit QR kód</string>
|
||||
<string name="backup_keys_title">Zálohovat klíče</string>
|
||||
<string name="backup_keys_unlock_subtitle">Pro zobrazení tajného klíče zadejte heslo zámku soukromí.</string>
|
||||
<string name="backup_keys_unlock_title">Zobrazit tajný klíč</string>
|
||||
<string name="new_key_back">Zpět</string>
|
||||
<string name="new_key_cancel">Zrušit</string>
|
||||
<string name="new_key_confirm_recap">Uložte si tajný klíč do správce hesel. Pokud ho ztratíte, nikdo vám ho nedokáže obnovit.</string>
|
||||
<string name="new_key_confirm_title">Ještě jedna věc</string>
|
||||
<string name="new_key_copy_encrypted_button">Kopírovat zašifrovaně (doporučeno)</string>
|
||||
<string name="new_key_encrypt_password_label">Heslo pro zašifrovanou zálohu</string>
|
||||
<string name="new_key_keys_title">Vaše klíče</string>
|
||||
<string name="new_key_next">Další</string>
|
||||
<string name="new_key_readonly_info">Toto je účet jen pro čtení. Nebyl vygenerován žádný tajný klíč, takže není co zálohovat.</string>
|
||||
<string name="new_key_saved_checkbox">Uložil jsem si klíče na bezpečné místo</string>
|
||||
<string name="new_key_step_indicator">Krok %1$d z %2$d</string>
|
||||
<string name="new_key_step_intro_npub">Váš veřejný klíč (npub) je vaše sdílitelná adresa. Rozdávejte ho bez obav, aby vás lidé mohli najít a sledovat.</string>
|
||||
<string name="new_key_step_intro_nsec">Váš tajný klíč (nsec) je heslo, které NIKDY nelze změnit. Toto je jediný okamžik, kdy se zobrazí — uložte si ho hned, jinak přijdete o přístup k tomuto účtu navždy.</string>
|
||||
<string name="new_key_step_intro_title">Než budete pokračovat, uložte si klíče</string>
|
||||
</resources>
|
||||
|
||||
@@ -21,7 +21,41 @@
|
||||
<string name="new_key_public_label">Öffentlicher Schlüssel (teilbar):</string>
|
||||
<string name="new_key_secret_label">Geheimer Schlüssel (NIEMALS teilen!):</string>
|
||||
<string name="new_key_continue_button">Ich habe meine Schlüssel gespeichert, weiter</string>
|
||||
<string name="new_key_saved_checkbox">Ich habe meine Schlüssel an einem sicheren Ort gespeichert</string>
|
||||
<string name="new_key_copy_encrypted_button">Verschlüsselt kopieren (empfohlen)</string>
|
||||
<string name="new_key_encrypt_password_label">Passwort für die verschlüsselte Sicherung</string>
|
||||
<string name="new_key_step_indicator">Schritt %1$d von %2$d</string>
|
||||
<string name="new_key_next">Weiter</string>
|
||||
<string name="new_key_back">Zurück</string>
|
||||
<string name="new_key_cancel">Abbrechen</string>
|
||||
<string name="new_key_step_intro_title">Sichere deine Schlüssel, bevor du fortfährst</string>
|
||||
<string name="new_key_step_intro_npub">Dein öffentlicher Schlüssel (npub) ist deine teilbare Adresse. Gib ihn bedenkenlos weiter, damit Leute dich finden und dir folgen können.</string>
|
||||
<string name="new_key_step_intro_nsec">Dein geheimer Schlüssel (nsec) ist ein Passwort, das NIE zurückgesetzt werden kann. Dies ist das einzige Mal, dass er angezeigt wird — speichere ihn jetzt, sonst verlierst du den Zugang zu diesem Konto für immer.</string>
|
||||
<string name="new_key_keys_title">Deine Schlüssel</string>
|
||||
<string name="new_key_confirm_title">Noch eine Sache</string>
|
||||
<string name="new_key_confirm_recap">Bewahre deinen geheimen Schlüssel in einem Passwortmanager auf. Wenn du ihn verlierst, kann ihn niemand für dich wiederherstellen.</string>
|
||||
<string name="new_key_readonly_info">Dies ist ein Konto mit Nur-Lese-Zugriff. Es wurde kein geheimer Schlüssel erzeugt, also gibt es nichts zu sichern.</string>
|
||||
<!-- Key Backup (Desktop settings) -->
|
||||
<string name="backup_keys_title">Schlüssel sichern</string>
|
||||
<string name="backup_keys_public_label">Öffentlicher Schlüssel (npub)</string>
|
||||
<string name="backup_keys_public_help">Dein öffentlicher Schlüssel kann bedenkenlos geteilt werden. Gib ihn weiter, damit Leute dich finden und dir folgen können.</string>
|
||||
<string name="backup_keys_show_qr">QR-Code anzeigen</string>
|
||||
<string name="backup_keys_hide_qr">QR-Code ausblenden</string>
|
||||
<string name="backup_keys_secret_label">Geheimer Schlüssel (nsec)</string>
|
||||
<string name="backup_keys_secret_warning">Dein geheimer Schlüssel ist wie ein Passwort, das NIE zurückgesetzt oder wiederhergestellt werden kann. Wer ihn hat, kontrolliert dein Konto für immer. Teile ihn niemals; bewahre ihn in einem Passwortmanager auf.</string>
|
||||
<string name="backup_keys_secret_hidden">Der geheime Schlüssel ist ausgeblendet</string>
|
||||
<string name="backup_keys_reveal">Geheimen Schlüssel anzeigen</string>
|
||||
<string name="backup_keys_hide">Geheimen Schlüssel ausblenden</string>
|
||||
<string name="backup_keys_copy_plain">Geheimen Schlüssel kopieren</string>
|
||||
<string name="backup_keys_copy_plain_warning">Kopiert den nsec im Klartext. Füge ihn nur in einen vertrauenswürdigen Passwortmanager ein.</string>
|
||||
<string name="backup_keys_copy_encrypted">Verschlüsselt kopieren (empfohlen)</string>
|
||||
<string name="backup_keys_encrypt_password_label">Passwort für die verschlüsselte Sicherung</string>
|
||||
<string name="backup_keys_encrypt_failed">Der Schlüssel konnte nicht verschlüsselt werden. Bitte versuche es erneut.</string>
|
||||
<string name="backup_keys_external_signer">Dieses Konto verwendet einen externen Signierer — hier ist kein geheimer Schlüssel gespeichert.</string>
|
||||
<string name="backup_keys_copied">Kopiert!</string>
|
||||
<string name="backup_keys_copy">Kopieren</string>
|
||||
<string name="backup_keys_unlock_title">Geheimen Schlüssel anzeigen</string>
|
||||
<string name="backup_keys_unlock_subtitle">Gib dein Passwort der Privatsphäre-Sperre ein, um deinen geheimen Schlüssel anzuzeigen.</string>
|
||||
<!-- Common Actions -->
|
||||
<string name="action_copy">Kopieren</string>
|
||||
<string name="action_paste">Einfügen</string>
|
||||
@@ -151,38 +185,4 @@
|
||||
<item quantity="one">%1$d Termin</item>
|
||||
<item quantity="other">%1$d Termine</item>
|
||||
</plurals>
|
||||
<string name="backup_keys_copied">Kopiert!</string>
|
||||
<string name="backup_keys_copy">Kopieren</string>
|
||||
<string name="backup_keys_copy_encrypted">Verschlüsselt kopieren (empfohlen)</string>
|
||||
<string name="backup_keys_copy_plain">Geheimen Schlüssel kopieren</string>
|
||||
<string name="backup_keys_copy_plain_warning">Kopiert den nsec im Klartext. Füge ihn nur in einen vertrauenswürdigen Passwortmanager ein.</string>
|
||||
<string name="backup_keys_encrypt_failed">Der Schlüssel konnte nicht verschlüsselt werden. Bitte versuche es erneut.</string>
|
||||
<string name="backup_keys_encrypt_password_label">Passwort für die verschlüsselte Sicherung</string>
|
||||
<string name="backup_keys_external_signer">Dieses Konto verwendet einen externen Signierer — hier ist kein geheimer Schlüssel gespeichert.</string>
|
||||
<string name="backup_keys_hide">Geheimen Schlüssel ausblenden</string>
|
||||
<string name="backup_keys_hide_qr">QR-Code ausblenden</string>
|
||||
<string name="backup_keys_public_help">Dein öffentlicher Schlüssel kann bedenkenlos geteilt werden. Gib ihn weiter, damit Leute dich finden und dir folgen können.</string>
|
||||
<string name="backup_keys_public_label">Öffentlicher Schlüssel (npub)</string>
|
||||
<string name="backup_keys_reveal">Geheimen Schlüssel anzeigen</string>
|
||||
<string name="backup_keys_secret_hidden">Der geheime Schlüssel ist ausgeblendet</string>
|
||||
<string name="backup_keys_secret_label">Geheimer Schlüssel (nsec)</string>
|
||||
<string name="backup_keys_secret_warning">Dein geheimer Schlüssel ist wie ein Passwort, das NIE zurückgesetzt oder wiederhergestellt werden kann. Wer ihn hat, kontrolliert dein Konto für immer. Teile ihn niemals; bewahre ihn in einem Passwortmanager auf.</string>
|
||||
<string name="backup_keys_show_qr">QR-Code anzeigen</string>
|
||||
<string name="backup_keys_title">Schlüssel sichern</string>
|
||||
<string name="backup_keys_unlock_subtitle">Gib dein Passwort der Privatsphäre-Sperre ein, um deinen geheimen Schlüssel anzuzeigen.</string>
|
||||
<string name="backup_keys_unlock_title">Geheimen Schlüssel anzeigen</string>
|
||||
<string name="new_key_back">Zurück</string>
|
||||
<string name="new_key_cancel">Abbrechen</string>
|
||||
<string name="new_key_confirm_recap">Bewahre deinen geheimen Schlüssel in einem Passwortmanager auf. Wenn du ihn verlierst, kann ihn niemand für dich wiederherstellen.</string>
|
||||
<string name="new_key_confirm_title">Noch eine Sache</string>
|
||||
<string name="new_key_copy_encrypted_button">Verschlüsselt kopieren (empfohlen)</string>
|
||||
<string name="new_key_encrypt_password_label">Passwort für die verschlüsselte Sicherung</string>
|
||||
<string name="new_key_keys_title">Deine Schlüssel</string>
|
||||
<string name="new_key_next">Weiter</string>
|
||||
<string name="new_key_readonly_info">Dies ist ein Konto mit Nur-Lese-Zugriff. Es wurde kein geheimer Schlüssel erzeugt, also gibt es nichts zu sichern.</string>
|
||||
<string name="new_key_saved_checkbox">Ich habe meine Schlüssel an einem sicheren Ort gespeichert</string>
|
||||
<string name="new_key_step_indicator">Schritt %1$d von %2$d</string>
|
||||
<string name="new_key_step_intro_npub">Dein öffentlicher Schlüssel (npub) ist deine teilbare Adresse. Gib ihn bedenkenlos weiter, damit Leute dich finden und dir folgen können.</string>
|
||||
<string name="new_key_step_intro_nsec">Dein geheimer Schlüssel (nsec) ist ein Passwort, das NIE zurückgesetzt werden kann. Dies ist das einzige Mal, dass er angezeigt wird — speichere ihn jetzt, sonst verlierst du den Zugang zu diesem Konto für immer.</string>
|
||||
<string name="new_key_step_intro_title">Sichere deine Schlüssel, bevor du fortfährst</string>
|
||||
</resources>
|
||||
|
||||
@@ -21,7 +21,41 @@
|
||||
<string name="new_key_public_label">Chave pública (compartilhável):</string>
|
||||
<string name="new_key_secret_label">Chave secreta (NUNCA compartilhe isto!):</string>
|
||||
<string name="new_key_continue_button">Salvei minhas chaves, continuar</string>
|
||||
<string name="new_key_saved_checkbox">Guardei minhas chaves em um lugar seguro</string>
|
||||
<string name="new_key_copy_encrypted_button">Copiar criptografado (recomendado)</string>
|
||||
<string name="new_key_encrypt_password_label">Senha para o backup criptografado</string>
|
||||
<string name="new_key_step_indicator">Etapa %1$d de %2$d</string>
|
||||
<string name="new_key_next">Próximo</string>
|
||||
<string name="new_key_back">Voltar</string>
|
||||
<string name="new_key_cancel">Cancelar</string>
|
||||
<string name="new_key_step_intro_title">Salve suas chaves antes de continuar</string>
|
||||
<string name="new_key_step_intro_npub">Sua chave pública (npub) é seu endereço compartilhável. Distribua-a livremente para que as pessoas possam encontrar e seguir você.</string>
|
||||
<string name="new_key_step_intro_nsec">Sua chave secreta (nsec) é uma senha que NUNCA pode ser redefinida. Esta é a única vez em que ela é exibida — salve-a agora, ou você perderá o acesso a esta conta para sempre.</string>
|
||||
<string name="new_key_keys_title">Suas chaves</string>
|
||||
<string name="new_key_confirm_title">Uma última coisa</string>
|
||||
<string name="new_key_confirm_recap">Guarde sua chave secreta em um gerenciador de senhas. Se você perdê-la, ninguém poderá recuperá-la para você.</string>
|
||||
<string name="new_key_readonly_info">Esta é uma conta somente leitura. Nenhuma chave secreta foi gerada, então não há nada para fazer backup.</string>
|
||||
<!-- Key Backup (Desktop settings) -->
|
||||
<string name="backup_keys_title">Backup das chaves</string>
|
||||
<string name="backup_keys_public_label">Chave pública (npub)</string>
|
||||
<string name="backup_keys_public_help">Sua chave pública pode ser compartilhada sem risco. Passe-a para as pessoas para que possam encontrar e seguir você.</string>
|
||||
<string name="backup_keys_show_qr">Mostrar QR code</string>
|
||||
<string name="backup_keys_hide_qr">Ocultar QR code</string>
|
||||
<string name="backup_keys_secret_label">Chave secreta (nsec)</string>
|
||||
<string name="backup_keys_secret_warning">Sua chave secreta é como uma senha que NUNCA pode ser redefinida ou recuperada. Quem a tiver controla sua conta para sempre. Nunca a compartilhe; guarde-a em um gerenciador de senhas.</string>
|
||||
<string name="backup_keys_secret_hidden">A chave secreta está oculta</string>
|
||||
<string name="backup_keys_reveal">Revelar chave secreta</string>
|
||||
<string name="backup_keys_hide">Ocultar chave secreta</string>
|
||||
<string name="backup_keys_copy_plain">Copiar chave secreta</string>
|
||||
<string name="backup_keys_copy_plain_warning">Copia a nsec em texto puro. Cole somente em um gerenciador de senhas confiável.</string>
|
||||
<string name="backup_keys_copy_encrypted">Copiar criptografado (recomendado)</string>
|
||||
<string name="backup_keys_encrypt_password_label">Senha para o backup criptografado</string>
|
||||
<string name="backup_keys_encrypt_failed">Não foi possível criptografar a chave. Tente novamente.</string>
|
||||
<string name="backup_keys_external_signer">Esta conta usa um assinador externo — nenhuma chave secreta é armazenada aqui.</string>
|
||||
<string name="backup_keys_copied">Copiado!</string>
|
||||
<string name="backup_keys_copy">Copiar</string>
|
||||
<string name="backup_keys_unlock_title">Revelar chave secreta</string>
|
||||
<string name="backup_keys_unlock_subtitle">Digite a senha do bloqueio de privacidade para revelar sua chave secreta.</string>
|
||||
<!-- Common Actions -->
|
||||
<string name="action_copy">Copiar</string>
|
||||
<string name="action_paste">Colar</string>
|
||||
@@ -151,38 +185,4 @@
|
||||
<item quantity="one">%1$d evento</item>
|
||||
<item quantity="other">%1$d eventos</item>
|
||||
</plurals>
|
||||
<string name="backup_keys_copied">Copiado!</string>
|
||||
<string name="backup_keys_copy">Copiar</string>
|
||||
<string name="backup_keys_copy_encrypted">Copiar criptografado (recomendado)</string>
|
||||
<string name="backup_keys_copy_plain">Copiar chave secreta</string>
|
||||
<string name="backup_keys_copy_plain_warning">Copia a nsec em texto puro. Cole somente em um gerenciador de senhas confiável.</string>
|
||||
<string name="backup_keys_encrypt_failed">Não foi possível criptografar a chave. Tente novamente.</string>
|
||||
<string name="backup_keys_encrypt_password_label">Senha para o backup criptografado</string>
|
||||
<string name="backup_keys_external_signer">Esta conta usa um assinador externo — nenhuma chave secreta é armazenada aqui.</string>
|
||||
<string name="backup_keys_hide">Ocultar chave secreta</string>
|
||||
<string name="backup_keys_hide_qr">Ocultar QR code</string>
|
||||
<string name="backup_keys_public_help">Sua chave pública pode ser compartilhada sem risco. Passe-a para as pessoas para que possam encontrar e seguir você.</string>
|
||||
<string name="backup_keys_public_label">Chave pública (npub)</string>
|
||||
<string name="backup_keys_reveal">Revelar chave secreta</string>
|
||||
<string name="backup_keys_secret_hidden">A chave secreta está oculta</string>
|
||||
<string name="backup_keys_secret_label">Chave secreta (nsec)</string>
|
||||
<string name="backup_keys_secret_warning">Sua chave secreta é como uma senha que NUNCA pode ser redefinida ou recuperada. Quem a tiver controla sua conta para sempre. Nunca a compartilhe; guarde-a em um gerenciador de senhas.</string>
|
||||
<string name="backup_keys_show_qr">Mostrar QR code</string>
|
||||
<string name="backup_keys_title">Backup das chaves</string>
|
||||
<string name="backup_keys_unlock_subtitle">Digite a senha do bloqueio de privacidade para revelar sua chave secreta.</string>
|
||||
<string name="backup_keys_unlock_title">Revelar chave secreta</string>
|
||||
<string name="new_key_back">Voltar</string>
|
||||
<string name="new_key_cancel">Cancelar</string>
|
||||
<string name="new_key_confirm_recap">Guarde sua chave secreta em um gerenciador de senhas. Se você perdê-la, ninguém poderá recuperá-la para você.</string>
|
||||
<string name="new_key_confirm_title">Uma última coisa</string>
|
||||
<string name="new_key_copy_encrypted_button">Copiar criptografado (recomendado)</string>
|
||||
<string name="new_key_encrypt_password_label">Senha para o backup criptografado</string>
|
||||
<string name="new_key_keys_title">Suas chaves</string>
|
||||
<string name="new_key_next">Próximo</string>
|
||||
<string name="new_key_readonly_info">Esta é uma conta somente leitura. Nenhuma chave secreta foi gerada, então não há nada para fazer backup.</string>
|
||||
<string name="new_key_saved_checkbox">Guardei minhas chaves em um lugar seguro</string>
|
||||
<string name="new_key_step_indicator">Etapa %1$d de %2$d</string>
|
||||
<string name="new_key_step_intro_npub">Sua chave pública (npub) é seu endereço compartilhável. Distribua-a livremente para que as pessoas possam encontrar e seguir você.</string>
|
||||
<string name="new_key_step_intro_nsec">Sua chave secreta (nsec) é uma senha que NUNCA pode ser redefinida. Esta é a única vez em que ela é exibida — salve-a agora, ou você perderá o acesso a esta conta para sempre.</string>
|
||||
<string name="new_key_step_intro_title">Salve suas chaves antes de continuar</string>
|
||||
</resources>
|
||||
|
||||
@@ -21,7 +21,41 @@
|
||||
<string name="new_key_public_label">Publik nyckel (delbar):</string>
|
||||
<string name="new_key_secret_label">Hemlig nyckel (dela ALDRIG denna!):</string>
|
||||
<string name="new_key_continue_button">Jag har sparat mina nycklar, fortsätt</string>
|
||||
<string name="new_key_saved_checkbox">Jag har sparat mina nycklar på ett säkert ställe</string>
|
||||
<string name="new_key_copy_encrypted_button">Kopiera krypterat (rekommenderas)</string>
|
||||
<string name="new_key_encrypt_password_label">Lösenord för krypterad säkerhetskopia</string>
|
||||
<string name="new_key_step_indicator">Steg %1$d av %2$d</string>
|
||||
<string name="new_key_next">Nästa</string>
|
||||
<string name="new_key_back">Tillbaka</string>
|
||||
<string name="new_key_cancel">Avbryt</string>
|
||||
<string name="new_key_step_intro_title">Spara dina nycklar innan du fortsätter</string>
|
||||
<string name="new_key_step_intro_npub">Din offentliga nyckel (npub) är din delbara adress. Dela ut den fritt så att andra kan hitta och följa dig.</string>
|
||||
<string name="new_key_step_intro_nsec">Din hemliga nyckel (nsec) är ett lösenord som ALDRIG kan återställas. Det här är enda gången den visas — spara den nu, annars förlorar du åtkomsten till det här kontot för alltid.</string>
|
||||
<string name="new_key_keys_title">Dina nycklar</string>
|
||||
<string name="new_key_confirm_title">En sista sak</string>
|
||||
<string name="new_key_confirm_recap">Förvara din hemliga nyckel i en lösenordshanterare. Om du förlorar den kan ingen återskapa den åt dig.</string>
|
||||
<string name="new_key_readonly_info">Det här är ett skrivskyddat konto. Ingen hemlig nyckel skapades, så det finns inget att säkerhetskopiera.</string>
|
||||
<!-- Key Backup (Desktop settings) -->
|
||||
<string name="backup_keys_title">Säkerhetskopiera nycklar</string>
|
||||
<string name="backup_keys_public_label">Offentlig nyckel (npub)</string>
|
||||
<string name="backup_keys_public_help">Din offentliga nyckel är trygg att dela. Ge den till andra så att de kan hitta och följa dig.</string>
|
||||
<string name="backup_keys_show_qr">Visa QR-kod</string>
|
||||
<string name="backup_keys_hide_qr">Dölj QR-kod</string>
|
||||
<string name="backup_keys_secret_label">Hemlig nyckel (nsec)</string>
|
||||
<string name="backup_keys_secret_warning">Din hemliga nyckel är som ett lösenord som ALDRIG kan återställas eller återskapas. Den som har den kontrollerar ditt konto för alltid. Dela den aldrig; förvara den i en lösenordshanterare.</string>
|
||||
<string name="backup_keys_secret_hidden">Den hemliga nyckeln är dold</string>
|
||||
<string name="backup_keys_reveal">Visa hemlig nyckel</string>
|
||||
<string name="backup_keys_hide">Dölj hemlig nyckel</string>
|
||||
<string name="backup_keys_copy_plain">Kopiera hemlig nyckel</string>
|
||||
<string name="backup_keys_copy_plain_warning">Kopierar din nsec i klartext. Klistra bara in den i en betrodd lösenordshanterare.</string>
|
||||
<string name="backup_keys_copy_encrypted">Kopiera krypterat (rekommenderas)</string>
|
||||
<string name="backup_keys_encrypt_password_label">Lösenord för krypterad säkerhetskopia</string>
|
||||
<string name="backup_keys_encrypt_failed">Nyckeln kunde inte krypteras. Försök igen.</string>
|
||||
<string name="backup_keys_external_signer">Det här kontot använder en extern signerare — ingen hemlig nyckel lagras här.</string>
|
||||
<string name="backup_keys_copied">Kopierat!</string>
|
||||
<string name="backup_keys_copy">Kopiera</string>
|
||||
<string name="backup_keys_unlock_title">Visa hemlig nyckel</string>
|
||||
<string name="backup_keys_unlock_subtitle">Ange lösenordet för integritetslåset för att visa din hemliga nyckel.</string>
|
||||
<!-- Common Actions -->
|
||||
<string name="action_copy">Kopiera</string>
|
||||
<string name="action_paste">Klistra in</string>
|
||||
@@ -151,38 +185,4 @@
|
||||
<item quantity="one">%1$d händelse</item>
|
||||
<item quantity="other">%1$d händelser</item>
|
||||
</plurals>
|
||||
<string name="backup_keys_copied">Kopierat!</string>
|
||||
<string name="backup_keys_copy">Kopiera</string>
|
||||
<string name="backup_keys_copy_encrypted">Kopiera krypterat (rekommenderas)</string>
|
||||
<string name="backup_keys_copy_plain">Kopiera hemlig nyckel</string>
|
||||
<string name="backup_keys_copy_plain_warning">Kopierar din nsec i klartext. Klistra bara in den i en betrodd lösenordshanterare.</string>
|
||||
<string name="backup_keys_encrypt_failed">Nyckeln kunde inte krypteras. Försök igen.</string>
|
||||
<string name="backup_keys_encrypt_password_label">Lösenord för krypterad säkerhetskopia</string>
|
||||
<string name="backup_keys_external_signer">Det här kontot använder en extern signerare — ingen hemlig nyckel lagras här.</string>
|
||||
<string name="backup_keys_hide">Dölj hemlig nyckel</string>
|
||||
<string name="backup_keys_hide_qr">Dölj QR-kod</string>
|
||||
<string name="backup_keys_public_help">Din offentliga nyckel är trygg att dela. Ge den till andra så att de kan hitta och följa dig.</string>
|
||||
<string name="backup_keys_public_label">Offentlig nyckel (npub)</string>
|
||||
<string name="backup_keys_reveal">Visa hemlig nyckel</string>
|
||||
<string name="backup_keys_secret_hidden">Den hemliga nyckeln är dold</string>
|
||||
<string name="backup_keys_secret_label">Hemlig nyckel (nsec)</string>
|
||||
<string name="backup_keys_secret_warning">Din hemliga nyckel är som ett lösenord som ALDRIG kan återställas eller återskapas. Den som har den kontrollerar ditt konto för alltid. Dela den aldrig; förvara den i en lösenordshanterare.</string>
|
||||
<string name="backup_keys_show_qr">Visa QR-kod</string>
|
||||
<string name="backup_keys_title">Säkerhetskopiera nycklar</string>
|
||||
<string name="backup_keys_unlock_subtitle">Ange lösenordet för integritetslåset för att visa din hemliga nyckel.</string>
|
||||
<string name="backup_keys_unlock_title">Visa hemlig nyckel</string>
|
||||
<string name="new_key_back">Tillbaka</string>
|
||||
<string name="new_key_cancel">Avbryt</string>
|
||||
<string name="new_key_confirm_recap">Förvara din hemliga nyckel i en lösenordshanterare. Om du förlorar den kan ingen återskapa den åt dig.</string>
|
||||
<string name="new_key_confirm_title">En sista sak</string>
|
||||
<string name="new_key_copy_encrypted_button">Kopiera krypterat (rekommenderas)</string>
|
||||
<string name="new_key_encrypt_password_label">Lösenord för krypterad säkerhetskopia</string>
|
||||
<string name="new_key_keys_title">Dina nycklar</string>
|
||||
<string name="new_key_next">Nästa</string>
|
||||
<string name="new_key_readonly_info">Det här är ett skrivskyddat konto. Ingen hemlig nyckel skapades, så det finns inget att säkerhetskopiera.</string>
|
||||
<string name="new_key_saved_checkbox">Jag har sparat mina nycklar på ett säkert ställe</string>
|
||||
<string name="new_key_step_indicator">Steg %1$d av %2$d</string>
|
||||
<string name="new_key_step_intro_npub">Din offentliga nyckel (npub) är din delbara adress. Dela ut den fritt så att andra kan hitta och följa dig.</string>
|
||||
<string name="new_key_step_intro_nsec">Din hemliga nyckel (nsec) är ett lösenord som ALDRIG kan återställas. Det här är enda gången den visas — spara den nu, annars förlorar du åtkomsten till det här kontot för alltid.</string>
|
||||
<string name="new_key_step_intro_title">Spara dina nycklar innan du fortsätter</string>
|
||||
</resources>
|
||||
|
||||
@@ -78,18 +78,6 @@
|
||||
"tag": "v1.13.1",
|
||||
"since": "2026-07-28T23:17:02-04:00",
|
||||
"translators": [
|
||||
{
|
||||
"user": "Bardesss",
|
||||
"languages": [
|
||||
"Dutch"
|
||||
]
|
||||
},
|
||||
{
|
||||
"user": "summoner001",
|
||||
"languages": [
|
||||
"Hungarian"
|
||||
]
|
||||
},
|
||||
{
|
||||
"user": "vitorpamplona",
|
||||
"languages": [
|
||||
@@ -105,6 +93,18 @@
|
||||
"Swedish"
|
||||
]
|
||||
},
|
||||
{
|
||||
"user": "Bardesss",
|
||||
"languages": [
|
||||
"Dutch"
|
||||
]
|
||||
},
|
||||
{
|
||||
"user": "summoner001",
|
||||
"languages": [
|
||||
"Hungarian"
|
||||
]
|
||||
},
|
||||
{
|
||||
"user": "maxblake2015",
|
||||
"languages": [
|
||||
|
||||
+45
-3
@@ -24,15 +24,44 @@ import androidx.compose.runtime.Stable
|
||||
import com.vitorpamplona.quartz.nip01Core.core.has
|
||||
import com.vitorpamplona.quartz.utils.ensure
|
||||
import kotlinx.serialization.Serializable
|
||||
import kotlinx.serialization.Transient
|
||||
|
||||
@Serializable
|
||||
@Stable
|
||||
class DimensionTag(
|
||||
val width: Int,
|
||||
val height: Int,
|
||||
/**
|
||||
* The ratio exactly as the author declared it, kept because [width] and [height] are whole
|
||||
* pixels and truncating to them can lose it — entirely, for a dim below `1` on either axis.
|
||||
* Only [parse] supplies it, and it is deliberately [Transient]: it is derived from the tag
|
||||
* text, so a deserialized instance simply falls back to the pixel counts.
|
||||
*/
|
||||
@Transient private val declaredRatio: Float? = null,
|
||||
) {
|
||||
/**
|
||||
* The raw width/height ratio in whole pixels, which is only meaningful when [hasSize] is true.
|
||||
* Anywhere the result reaches a layout, use [aspectRatioOrNull] instead.
|
||||
*/
|
||||
fun aspectRatio() = width.toFloat() / height.toFloat()
|
||||
|
||||
/**
|
||||
* The ratio to lay out with, or null when the tag carries no usable shape.
|
||||
*
|
||||
* Prefers the declared ratio over the truncated pixel counts, so a fractional dim keeps the
|
||||
* shape its author meant: `"0.75x1"` is a legitimate 3:4 even though it rounds down to `0x1`,
|
||||
* and `"317.9x498.4"` is fractionally more accurate than `317x498`. For whole-number dims —
|
||||
* every well-formed tag — the two are the same number.
|
||||
*
|
||||
* Returning null matters as much as the value. [parse] only rejects the literal string
|
||||
* `"0x0"`, so a tag can still arrive with no usable shape at all, and [aspectRatio] then
|
||||
* returns `0/0`, which is `NaN`. Compose's `Modifier.aspectRatio` throws
|
||||
* `IllegalArgumentException` on `NaN` and on `0f`, and clamping does not rescue either: every
|
||||
* comparison against `NaN` is false, so `coerceAtLeast` returns it unchanged. A tag any relay
|
||||
* can carry would otherwise crash the composition around it.
|
||||
*/
|
||||
fun aspectRatioOrNull(): Float? = declaredRatio ?: if (hasSize()) aspectRatio() else null
|
||||
|
||||
fun hasSize() = width > 0 && height > 0
|
||||
|
||||
override fun toString() = "${width}x$height"
|
||||
@@ -59,15 +88,28 @@ class DimensionTag(
|
||||
// Some clients (e.g. Primal) emit floating-point dimensions like "317.0x498.0"
|
||||
// in NIP-92 imeta tags. Parse as Double and truncate to keep those tags usable
|
||||
// for pre-load layout reservation.
|
||||
val width = parts[0].toDouble().toInt()
|
||||
val height = parts[1].toDouble().toInt()
|
||||
val width = parts[0].toDouble()
|
||||
val height = parts[1].toDouble()
|
||||
|
||||
DimensionTag(width, height)
|
||||
DimensionTag(width.toInt(), height.toInt(), declaredRatio(width, height))
|
||||
} catch (e: Exception) {
|
||||
null
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The declared ratio, or null when the declared size cannot describe a shape at all.
|
||||
* Computed before the truncation to whole pixels, which is the whole point: a dim under
|
||||
* `1` on either axis truncates to `0` and takes its shape with it.
|
||||
*/
|
||||
private fun declaredRatio(
|
||||
width: Double,
|
||||
height: Double,
|
||||
): Float? {
|
||||
if (width <= 0.0 || height <= 0.0) return null
|
||||
return (width / height).toFloat().takeIf { it.isFinite() && it > 0f }
|
||||
}
|
||||
|
||||
fun assemble(dim: DimensionTag) = arrayOf(TAG_NAME, dim.toString())
|
||||
}
|
||||
}
|
||||
|
||||
+100
@@ -22,8 +22,10 @@ package com.vitorpamplona.quartz.nip94FileMetadata.tags
|
||||
|
||||
import kotlin.test.Test
|
||||
import kotlin.test.assertEquals
|
||||
import kotlin.test.assertFalse
|
||||
import kotlin.test.assertNotNull
|
||||
import kotlin.test.assertNull
|
||||
import kotlin.test.assertTrue
|
||||
|
||||
class DimensionTagTest {
|
||||
@Test
|
||||
@@ -72,4 +74,102 @@ class DimensionTagTest {
|
||||
assertNotNull(tag)
|
||||
assertEquals(317f / 498f, tag.aspectRatio())
|
||||
}
|
||||
|
||||
/**
|
||||
* [rejectsZeroByZero] passes by comparing the string, so the float path of the Primal
|
||||
* tolerance above reaches the same 0x0 pixel counts by truncation and is kept.
|
||||
*/
|
||||
@Test
|
||||
fun subPixelFloatsTruncateToNoPixels() {
|
||||
val tag = DimensionTag.parse("0.4x0.4")
|
||||
assertNotNull(tag)
|
||||
assertEquals(0, tag.width)
|
||||
assertEquals(0, tag.height)
|
||||
assertFalse(tag.hasSize())
|
||||
}
|
||||
|
||||
/**
|
||||
* ...but the shape the author declared survives that truncation. A square is a square whether
|
||||
* it was declared as "0.4x0.4" or "400x400"; only the pixel counts are unusable.
|
||||
*/
|
||||
@Test
|
||||
fun subPixelFloatsKeepTheDeclaredShape() {
|
||||
assertEquals(1f, DimensionTag.parse("0.4x0.4")?.aspectRatioOrNull())
|
||||
assertEquals(0.75f, DimensionTag.parse("0.75x1")?.aspectRatioOrNull())
|
||||
assertEquals(2f, DimensionTag.parse("0.5x0.25")?.aspectRatioOrNull())
|
||||
}
|
||||
|
||||
/**
|
||||
* The declared ratio wins over the truncated one wherever they differ, being the more faithful
|
||||
* of the two. They differ only for fractional dims — for whole numbers it is the same number.
|
||||
*/
|
||||
@Test
|
||||
fun declaredRatioBeatsTheTruncatedOne() {
|
||||
val tag = DimensionTag.parse("317.9x498.4")
|
||||
assertNotNull(tag)
|
||||
assertEquals((317.9 / 498.4).toFloat(), tag.aspectRatioOrNull())
|
||||
assertEquals(317f / 498f, tag.aspectRatio())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun wholeNumberDimsAreUnaffected() {
|
||||
val tag = DimensionTag.parse("1920x1080")
|
||||
assertNotNull(tag)
|
||||
assertEquals(tag.aspectRatio(), tag.aspectRatioOrNull())
|
||||
}
|
||||
|
||||
/**
|
||||
* The declared ratio is derived from the tag text, so it is not serialized — a tag rebuilt
|
||||
* from its width and height falls back to the pixel counts rather than carrying a stale one.
|
||||
*/
|
||||
@Test
|
||||
fun aDirectlyConstructedTagFallsBackToPixelCounts() {
|
||||
assertEquals(1920f / 1080f, DimensionTag(1920, 1080).aspectRatioOrNull())
|
||||
assertNull(DimensionTag(0, 0).aspectRatioOrNull())
|
||||
}
|
||||
|
||||
/**
|
||||
* Why [DimensionTag.aspectRatioOrNull] exists: `Modifier.aspectRatio` throws on both of these,
|
||||
* so a tag that reaches a layout through the raw accessor crashes the composition around it.
|
||||
*/
|
||||
@Test
|
||||
fun rawAspectRatioOfAZeroSizedTagIsNotLayoutSafe() {
|
||||
assertTrue(DimensionTag(0, 0).aspectRatio().isNaN())
|
||||
assertEquals(0f, DimensionTag(0, 100).aspectRatio())
|
||||
}
|
||||
|
||||
/**
|
||||
* A fractional dim keeps its shape (see [subPixelFloatsKeepTheDeclaredShape]); one that
|
||||
* declares no shape at all still has to come back null, since `Modifier.aspectRatio` throws on
|
||||
* everything this would otherwise produce.
|
||||
*/
|
||||
@Test
|
||||
fun aspectRatioOrNullRefusesEveryShapeALayoutCannotUse() {
|
||||
assertNull(DimensionTag.parse("0x5")?.aspectRatioOrNull())
|
||||
assertNull(DimensionTag.parse("-3x4")?.aspectRatioOrNull())
|
||||
assertNull(DimensionTag(0, 0).aspectRatioOrNull())
|
||||
assertNull(DimensionTag(100, 0).aspectRatioOrNull())
|
||||
assertNull(DimensionTag(0, 100).aspectRatioOrNull())
|
||||
assertNull(DimensionTag(-1, 10).aspectRatioOrNull())
|
||||
}
|
||||
|
||||
@Test
|
||||
fun aspectRatioOrNullKeepsUsableSizes() {
|
||||
assertEquals(317f / 498f, DimensionTag(317, 498).aspectRatioOrNull())
|
||||
}
|
||||
|
||||
/**
|
||||
* `"NaN"` and `"Infinity"` are legal input to Kotlin's `String.toDouble()` and a relay can
|
||||
* carry either, so both reach the ratio maths. The `<= 0.0` rejection cannot stop `NaN` —
|
||||
* every comparison against it is false — which is why the finite check is the one holding the
|
||||
* line. Whatever comes out, it is never a shape a layout would throw on.
|
||||
*/
|
||||
@Test
|
||||
fun nonNumericDoublesNeverProduceAnUnusableShape() {
|
||||
assertNull(DimensionTag.parse("NaNxNaN")?.aspectRatioOrNull())
|
||||
assertNull(DimensionTag.parse("0.4xNaN")?.aspectRatioOrNull())
|
||||
|
||||
// Infinity saturates to Int.MAX_VALUE on both axes: garbage in, square out, never a throw.
|
||||
assertEquals(1f, DimensionTag.parse("InfinityxInfinity")?.aspectRatioOrNull())
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user