mirror of
https://github.com/signalapp/Signal-Android.git
synced 2026-09-19 16:24:41 +01:00
Add signal login manual confirmation flow during account creation.
This commit is contained in:
committed by
Cody Henthorne
parent
3151effc7f
commit
1f29540bbf
@@ -0,0 +1,32 @@
|
||||
/*
|
||||
* Copyright 2026 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.signal.signallogin
|
||||
|
||||
/**
|
||||
* A recovery key split into the fixed-size character groups it is always shown in, along with the ways those groups get
|
||||
* turned back into a string.
|
||||
*/
|
||||
@JvmInline
|
||||
value class RecoveryKeyGroups private constructor(val groups: List<String>) {
|
||||
|
||||
companion object {
|
||||
/** How many characters make up a single displayed group of a recovery key. */
|
||||
const val GROUP_SIZE = 4
|
||||
|
||||
fun from(recoveryKey: String): RecoveryKeyGroups = RecoveryKeyGroups(recoveryKey.chunked(GROUP_SIZE))
|
||||
}
|
||||
|
||||
/** The key with no separators, which is the form everything outside of the UI expects. */
|
||||
val flat: String
|
||||
get() = groups.joinToString(separator = "")
|
||||
|
||||
/** The key as one space-separated string, for when the groups have to wrap as ordinary text. */
|
||||
val spaced: String
|
||||
get() = groups.joinToString(separator = " ")
|
||||
|
||||
/** The groups laid out [perRow] at a time. */
|
||||
fun rows(perRow: Int): List<List<String>> = groups.chunked(perRow)
|
||||
}
|
||||
@@ -14,8 +14,9 @@ object SignalLoginTestTags {
|
||||
const val VIEW_DETAILS_SCREEN = "signal_login_view_details_screen"
|
||||
const val VIEW_DETAILS_SAVE_TO_PASSWORD_MANAGER_BUTTON = "signal_login_view_details_save_to_password_manager_button"
|
||||
const val VIEW_DETAILS_SAVE_AS_PDF_BUTTON = "signal_login_view_details_save_as_pdf_button"
|
||||
const val VIEW_DETAILS_ACCOUNT_KEY_BLOCK = "signal_login_view_details_account_key_block"
|
||||
const val VIEW_DETAILS_RECOVERY_KEY_BLOCK = "signal_login_view_details_recovery_key_block"
|
||||
const val VIEW_DETAILS_ACCOUNT_KEY_COPY_BUTTON = "signal_login_view_details_account_key_copy_button"
|
||||
const val VIEW_DETAILS_RECOVERY_KEY_COPY_BUTTON = "signal_login_view_details_recovery_key_copy_button"
|
||||
|
||||
const val KEY_DETAILS_ACCOUNT_ID_BLOCK = "signal_login_key_details_account_id_block"
|
||||
const val KEY_DETAILS_RECOVERY_KEY_BLOCK = "signal_login_key_details_recovery_key_block"
|
||||
const val KEY_DETAILS_ACCOUNT_ID_COPY_BUTTON = "signal_login_key_details_account_id_copy_button"
|
||||
const val KEY_DETAILS_RECOVERY_KEY_COPY_BUTTON = "signal_login_key_details_recovery_key_copy_button"
|
||||
}
|
||||
|
||||
+234
@@ -0,0 +1,234 @@
|
||||
/*
|
||||
* Copyright 2026 Signal Messenger, LLC
|
||||
* SPDX-License-Identifier: AGPL-3.0-only
|
||||
*/
|
||||
|
||||
package org.signal.signallogin.details
|
||||
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.BoxWithConstraints
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
import androidx.compose.foundation.layout.padding
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.platform.testTag
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.rememberTextMeasurer
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import org.signal.core.ui.compose.DayNightPreviews
|
||||
import org.signal.core.ui.compose.Previews
|
||||
import org.signal.core.ui.compose.SignalIcons
|
||||
import org.signal.core.ui.compose.Texts
|
||||
import org.signal.core.ui.compose.horizontalGutters
|
||||
import org.signal.core.ui.compose.theme.SignalTheme
|
||||
import org.signal.signallogin.R
|
||||
import org.signal.signallogin.RecoveryKeyGroups
|
||||
import org.signal.signallogin.SignalLoginTestTags
|
||||
import org.signal.signallogin.fonts.MonoTypeface
|
||||
|
||||
private const val GROUPS_PER_ROW = 4
|
||||
|
||||
/** The least amount of space allowed between recovery key groups before falling back to natural text wrapping. */
|
||||
private val MIN_GROUP_SPACING = 12.dp
|
||||
|
||||
private val KEY_BLOCK_TEXT_PADDING_HORIZONTAL = 28.dp
|
||||
private val KEY_BLOCK_TEXT_PADDING_VERTICAL = 20.dp
|
||||
|
||||
/** Insets that center the copy button's icon on the first line of key text and put it 16dp from the block's end edge, accounting for the button's own 12dp of internal padding. */
|
||||
private val COPY_BUTTON_PADDING_TOP = 10.dp
|
||||
private val COPY_BUTTON_PADDING_END = 4.dp
|
||||
|
||||
/**
|
||||
* Both halves of a Signal Login spelled out in full -- the account ID and the recovery key -- each under a section
|
||||
* header and each with a button that copies it to the clipboard.
|
||||
*
|
||||
* Shared by every screen that shows the user their keys, so the screens themselves only supply the surrounding
|
||||
* chrome: headers, footers and whatever buttons that particular step of the flow needs.
|
||||
*/
|
||||
@Composable
|
||||
fun SignalLoginKeyDetails(
|
||||
accountId: String,
|
||||
recoveryKeyGroups: RecoveryKeyGroups,
|
||||
onCopyAccountId: (String) -> Unit,
|
||||
onCopyRecoveryKey: (String) -> Unit,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
Column(modifier = modifier) {
|
||||
Texts.SectionHeader(text = stringResource(R.string.SignalLoginKeyDetails__account_id))
|
||||
|
||||
AccountIdBlock(
|
||||
text = accountId,
|
||||
onCopyAccountId = onCopyAccountId,
|
||||
modifier = Modifier.testTag(SignalLoginTestTags.KEY_DETAILS_ACCOUNT_ID_BLOCK)
|
||||
)
|
||||
|
||||
Texts.SectionHeader(text = stringResource(R.string.SignalLoginKeyDetails__recovery_key))
|
||||
|
||||
RecoveryKeyBlock(
|
||||
groups = recoveryKeyGroups,
|
||||
onCopyRecoveryKey = onCopyRecoveryKey,
|
||||
modifier = Modifier.testTag(SignalLoginTestTags.KEY_DETAILS_RECOVERY_KEY_BLOCK)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* A full credential rendered in the special monospace font on a rounded surface.
|
||||
*/
|
||||
@Composable
|
||||
private fun AccountIdBlock(
|
||||
text: String,
|
||||
onCopyAccountId: (String) -> Unit,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.Top,
|
||||
modifier = modifier.keyBlockSurface()
|
||||
) {
|
||||
Text(
|
||||
text = text,
|
||||
style = keyTextStyle(),
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(start = KEY_BLOCK_TEXT_PADDING_HORIZONTAL, top = KEY_BLOCK_TEXT_PADDING_VERTICAL, bottom = KEY_BLOCK_TEXT_PADDING_VERTICAL)
|
||||
)
|
||||
|
||||
CopyButton(
|
||||
contentDescription = stringResource(R.string.SignalLoginKeyDetails__copy_account_id),
|
||||
onClick = { onCopyAccountId(text) },
|
||||
modifier = Modifier.testTag(SignalLoginTestTags.KEY_DETAILS_ACCOUNT_ID_COPY_BUTTON)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The recovery key rendered as character groups. When four groups fit per row with at least
|
||||
* [MIN_GROUP_SPACING] between them, renders rows of four groups evenly spaced across the full
|
||||
* width. Otherwise renders the whole key as a single space-separated string that wraps naturally.
|
||||
*/
|
||||
@Composable
|
||||
private fun RecoveryKeyBlock(
|
||||
groups: RecoveryKeyGroups,
|
||||
onCopyRecoveryKey: (String) -> Unit,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.Top,
|
||||
modifier = modifier.keyBlockSurface()
|
||||
) {
|
||||
BoxWithConstraints(
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(start = KEY_BLOCK_TEXT_PADDING_HORIZONTAL, top = KEY_BLOCK_TEXT_PADDING_VERTICAL, bottom = KEY_BLOCK_TEXT_PADDING_VERTICAL)
|
||||
) {
|
||||
val style = keyTextStyle()
|
||||
val textMeasurer = rememberTextMeasurer()
|
||||
val maxWidth = constraints.maxWidth
|
||||
|
||||
val groupWidth = remember(groups, style) {
|
||||
groups.groups.maxOfOrNull { group -> textMeasurer.measure(text = group, style = style).size.width } ?: 0
|
||||
}
|
||||
|
||||
val minSpacing = with(LocalDensity.current) { MIN_GROUP_SPACING.roundToPx() }
|
||||
val fitsFourPerRow = groupWidth * GROUPS_PER_ROW + minSpacing * (GROUPS_PER_ROW - 1) <= maxWidth
|
||||
|
||||
if (fitsFourPerRow) {
|
||||
val spacing = with(LocalDensity.current) { ((maxWidth - groupWidth * GROUPS_PER_ROW) / (GROUPS_PER_ROW - 1)).toDp() }
|
||||
|
||||
Column {
|
||||
groups.rows(GROUPS_PER_ROW).forEach { row ->
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.spacedBy(spacing),
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
row.forEach { group ->
|
||||
Text(
|
||||
text = group,
|
||||
style = style
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Text(
|
||||
text = groups.spaced,
|
||||
style = style
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
CopyButton(
|
||||
contentDescription = stringResource(R.string.SignalLoginKeyDetails__copy_recovery_key),
|
||||
onClick = { onCopyRecoveryKey(groups.flat) },
|
||||
modifier = Modifier.testTag(SignalLoginTestTags.KEY_DETAILS_RECOVERY_KEY_COPY_BUTTON)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The button in the top-end corner of a key block that copies the key to the clipboard.
|
||||
*/
|
||||
@Composable
|
||||
private fun CopyButton(
|
||||
contentDescription: String,
|
||||
onClick: () -> Unit,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
IconButton(
|
||||
onClick = onClick,
|
||||
modifier = modifier.padding(top = COPY_BUTTON_PADDING_TOP, end = COPY_BUTTON_PADDING_END)
|
||||
) {
|
||||
Icon(
|
||||
painter = SignalIcons.Copy.painter,
|
||||
contentDescription = contentDescription,
|
||||
tint = MaterialTheme.colorScheme.onSurfaceVariant
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Modifier.keyBlockSurface(): Modifier {
|
||||
return this
|
||||
.horizontalGutters()
|
||||
.fillMaxWidth()
|
||||
.clip(RoundedCornerShape(18.dp))
|
||||
.background(SignalTheme.colors.colorSurface2)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun keyTextStyle(): TextStyle {
|
||||
return MaterialTheme.typography.bodyLarge.copy(
|
||||
fontFamily = MonoTypeface.fontFamily(),
|
||||
fontSize = 18.sp,
|
||||
lineHeight = 28.sp,
|
||||
letterSpacing = 1.44.sp
|
||||
)
|
||||
}
|
||||
|
||||
@DayNightPreviews
|
||||
@Composable
|
||||
private fun SignalLoginKeyDetailsPreview() {
|
||||
Previews.Preview {
|
||||
SignalLoginKeyDetails(
|
||||
accountId = "A6B28482-2E32-83D0-7F23-91360A4C2B91",
|
||||
recoveryKeyGroups = RecoveryKeyGroups.from("UY38JH2778HJJHJ8LK19GA61S672JSJ=89R=23S6A578=9BAP92J2YH5T326VV7T"),
|
||||
onCopyAccountId = {},
|
||||
onCopyRecoveryKey = {}
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -23,8 +23,8 @@ import kotlinx.coroutines.withContext
|
||||
import org.signal.core.util.Result
|
||||
import org.signal.core.util.logging.Log
|
||||
import org.signal.signallogin.R
|
||||
import org.signal.signallogin.RecoveryKeyGroups
|
||||
import org.signal.signallogin.fonts.MonoTypeface
|
||||
import org.signal.signallogin.viewdetails.SignalLoginViewDetailsState
|
||||
import java.io.ByteArrayOutputStream
|
||||
import java.io.IOException
|
||||
import kotlin.math.ceil
|
||||
@@ -90,12 +90,12 @@ object SignalLoginPdfRenderer {
|
||||
private const val BODY_TEXT_COLOR = 0xFF4D4D4D.toInt()
|
||||
|
||||
/**
|
||||
* Renders the credentials in [state] to a PDF and writes it to [uri].
|
||||
* Renders the given credentials to a PDF and writes it to [uri].
|
||||
*/
|
||||
suspend fun renderTo(context: Context, uri: Uri, state: SignalLoginViewDetailsState): Result<Unit, SignalLoginPdfError> {
|
||||
suspend fun renderTo(context: Context, uri: Uri, accountId: String, recoveryKeyGroups: RecoveryKeyGroups): Result<Unit, SignalLoginPdfError> {
|
||||
return withContext(Dispatchers.IO) {
|
||||
try {
|
||||
val bytes = render(context, state)
|
||||
val bytes = render(context, accountId, recoveryKeyGroups)
|
||||
val stream = context.contentResolver.openOutputStream(uri)
|
||||
if (stream == null) {
|
||||
Log.w(TAG, "Could not open an output stream for the chosen location.")
|
||||
@@ -114,11 +114,11 @@ object SignalLoginPdfRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
fun render(context: Context, state: SignalLoginViewDetailsState): ByteArray {
|
||||
fun render(context: Context, accountId: String, recoveryKeyGroups: RecoveryKeyGroups): ByteArray {
|
||||
val document = PdfDocument()
|
||||
try {
|
||||
val page = document.startPage(PdfDocument.PageInfo.Builder(PAGE_WIDTH, PAGE_HEIGHT, 1).create())
|
||||
drawPage(context, page.canvas, state)
|
||||
drawPage(context, page.canvas, accountId, recoveryKeyGroups)
|
||||
document.finishPage(page)
|
||||
|
||||
return ByteArrayOutputStream().use { stream ->
|
||||
@@ -130,7 +130,7 @@ object SignalLoginPdfRenderer {
|
||||
}
|
||||
}
|
||||
|
||||
private fun drawPage(context: Context, canvas: Canvas, state: SignalLoginViewDetailsState) {
|
||||
private fun drawPage(context: Context, canvas: Canvas, accountId: String, recoveryKeyGroups: RecoveryKeyGroups) {
|
||||
val titlePaint = textPaint(TITLE_TEXT_SIZE, TITLE_LETTER_SPACING_EM, TEXT_COLOR, semiBold = true)
|
||||
val bodyPaint = textPaint(BODY_TEXT_SIZE, BODY_LETTER_SPACING_EM, BODY_TEXT_COLOR, semiBold = false)
|
||||
val headerPaint = textPaint(HEADER_TEXT_SIZE, HEADER_LETTER_SPACING_EM, TEXT_COLOR, semiBold = true)
|
||||
@@ -168,7 +168,7 @@ object SignalLoginPdfRenderer {
|
||||
y = drawKeyBlock(canvas, top = y, rowCount = 1, lineHeight = ACCOUNT_KEY_LINE_HEIGHT) { contentTop ->
|
||||
drawText(
|
||||
canvas = canvas,
|
||||
text = state.accountKey,
|
||||
text = accountId,
|
||||
paint = keyPaint,
|
||||
left = CONTENT_LEFT,
|
||||
top = contentTop,
|
||||
@@ -178,7 +178,7 @@ object SignalLoginPdfRenderer {
|
||||
)
|
||||
}
|
||||
|
||||
val rows = state.recoveryKeyGroups.chunked(GROUPS_PER_ROW)
|
||||
val rows = recoveryKeyGroups.rows(GROUPS_PER_ROW)
|
||||
y = drawSectionHeader(canvas, headerPaint, context.getString(R.string.SignalLoginPdf__recovery_key), top = y)
|
||||
drawKeyBlock(canvas, top = y, rowCount = rows.size, lineHeight = RECOVERY_KEY_LINE_HEIGHT) { contentTop ->
|
||||
drawRecoveryKeyGroups(canvas, keyPaint, rows, contentTop)
|
||||
|
||||
+6
-175
@@ -6,11 +6,8 @@
|
||||
package org.signal.signallogin.viewdetails
|
||||
|
||||
import androidx.compose.foundation.Image
|
||||
import androidx.compose.foundation.background
|
||||
import androidx.compose.foundation.layout.Arrangement
|
||||
import androidx.compose.foundation.layout.BoxWithConstraints
|
||||
import androidx.compose.foundation.layout.Column
|
||||
import androidx.compose.foundation.layout.Row
|
||||
import androidx.compose.foundation.layout.Spacer
|
||||
import androidx.compose.foundation.layout.fillMaxSize
|
||||
import androidx.compose.foundation.layout.fillMaxWidth
|
||||
@@ -22,36 +19,25 @@ import androidx.compose.foundation.rememberScrollState
|
||||
import androidx.compose.foundation.shape.RoundedCornerShape
|
||||
import androidx.compose.foundation.verticalScroll
|
||||
import androidx.compose.material3.ButtonDefaults
|
||||
import androidx.compose.material3.Icon
|
||||
import androidx.compose.material3.IconButton
|
||||
import androidx.compose.material3.MaterialTheme
|
||||
import androidx.compose.material3.Text
|
||||
import androidx.compose.runtime.Composable
|
||||
import androidx.compose.runtime.remember
|
||||
import androidx.compose.ui.Alignment
|
||||
import androidx.compose.ui.Modifier
|
||||
import androidx.compose.ui.draw.clip
|
||||
import androidx.compose.ui.draw.shadow
|
||||
import androidx.compose.ui.layout.ContentScale
|
||||
import androidx.compose.ui.platform.LocalDensity
|
||||
import androidx.compose.ui.platform.testTag
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.res.stringResource
|
||||
import androidx.compose.ui.text.TextStyle
|
||||
import androidx.compose.ui.text.rememberTextMeasurer
|
||||
import androidx.compose.ui.unit.dp
|
||||
import androidx.compose.ui.unit.sp
|
||||
import org.signal.core.ui.compose.Buttons
|
||||
import org.signal.core.ui.compose.DayNightPreviews
|
||||
import org.signal.core.ui.compose.Previews
|
||||
import org.signal.core.ui.compose.Scaffolds
|
||||
import org.signal.core.ui.compose.SignalIcons
|
||||
import org.signal.core.ui.compose.Texts
|
||||
import org.signal.core.ui.compose.horizontalGutters
|
||||
import org.signal.core.ui.compose.theme.SignalTheme
|
||||
import org.signal.signallogin.R
|
||||
import org.signal.signallogin.SignalLoginTestTags
|
||||
import org.signal.signallogin.fonts.MonoTypeface
|
||||
import org.signal.signallogin.details.SignalLoginKeyDetails
|
||||
|
||||
/** Size of the miniature credential card artwork shown at the top of the screen, from the design. */
|
||||
private val MINI_CARD_WIDTH = 175.dp
|
||||
@@ -62,18 +48,6 @@ private val MINI_CARD_CORNER_RADIUS = 13.dp
|
||||
|
||||
private val BUTTON_MAX_WIDTH = 331.dp
|
||||
|
||||
private const val GROUPS_PER_ROW = 4
|
||||
|
||||
/** The least amount of space allowed between recovery key groups before falling back to natural text wrapping. */
|
||||
private val MIN_GROUP_SPACING = 12.dp
|
||||
|
||||
private val KEY_BLOCK_TEXT_PADDING_HORIZONTAL = 28.dp
|
||||
private val KEY_BLOCK_TEXT_PADDING_VERTICAL = 20.dp
|
||||
|
||||
/** Insets that center the copy button's icon on the first line of key text and put it 16dp from the block's end edge, accounting for the button's own 12dp of internal padding. */
|
||||
private val COPY_BUTTON_PADDING_TOP = 10.dp
|
||||
private val COPY_BUTTON_PADDING_END = 4.dp
|
||||
|
||||
/**
|
||||
* Shows the user the full keys that make up their Signal Login and offers ways to save them.
|
||||
*/
|
||||
@@ -109,20 +83,11 @@ fun SignalLoginViewDetailsScreen(
|
||||
|
||||
Spacer(modifier = Modifier.height(16.dp))
|
||||
|
||||
Texts.SectionHeader(text = stringResource(R.string.SignalLoginViewDetailsScreen__account_id))
|
||||
|
||||
AccountIdBlock(
|
||||
text = state.accountKey,
|
||||
onEvent = onEvent,
|
||||
modifier = Modifier.testTag(SignalLoginTestTags.VIEW_DETAILS_ACCOUNT_KEY_BLOCK)
|
||||
)
|
||||
|
||||
Texts.SectionHeader(text = stringResource(R.string.SignalLoginViewDetailsScreen__recovery_key))
|
||||
|
||||
RecoveryKeyBlock(
|
||||
groups = state.recoveryKeyGroups,
|
||||
onEvent = onEvent,
|
||||
modifier = Modifier.testTag(SignalLoginTestTags.VIEW_DETAILS_RECOVERY_KEY_BLOCK)
|
||||
SignalLoginKeyDetails(
|
||||
accountId = state.accountKey,
|
||||
recoveryKeyGroups = state.recoveryKeyGroups,
|
||||
onCopyAccountId = { onEvent(SignalLoginViewDetailsScreenEvents.CopyAccountIdClicked(it)) },
|
||||
onCopyRecoveryKey = { onEvent(SignalLoginViewDetailsScreenEvents.CopyRecoveryKeyClicked(it)) }
|
||||
)
|
||||
}
|
||||
|
||||
@@ -146,140 +111,6 @@ private fun MiniCard(modifier: Modifier = Modifier) {
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* A full credential rendered in the special monospace font on a rounded surface.
|
||||
*/
|
||||
@Composable
|
||||
private fun AccountIdBlock(
|
||||
text: String,
|
||||
onEvent: (SignalLoginViewDetailsScreenEvents) -> Unit,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.Top,
|
||||
modifier = modifier.keyBlockSurface()
|
||||
) {
|
||||
Text(
|
||||
text = text,
|
||||
style = keyTextStyle(),
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(start = KEY_BLOCK_TEXT_PADDING_HORIZONTAL, top = KEY_BLOCK_TEXT_PADDING_VERTICAL, bottom = KEY_BLOCK_TEXT_PADDING_VERTICAL)
|
||||
)
|
||||
|
||||
CopyButton(
|
||||
contentDescription = stringResource(R.string.SignalLoginViewDetailsScreen__copy_account_id),
|
||||
onClick = { onEvent(SignalLoginViewDetailsScreenEvents.CopyAccountIdClicked(text)) },
|
||||
modifier = Modifier.testTag(SignalLoginTestTags.VIEW_DETAILS_ACCOUNT_KEY_COPY_BUTTON)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The recovery key rendered as character groups. When four groups fit per row with at least
|
||||
* [MIN_GROUP_SPACING] between them, renders rows of four groups evenly spaced across the full
|
||||
* width. Otherwise renders the whole key as a single space-separated string that wraps naturally.
|
||||
*/
|
||||
@Composable
|
||||
private fun RecoveryKeyBlock(
|
||||
groups: List<String>,
|
||||
onEvent: (SignalLoginViewDetailsScreenEvents) -> Unit,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
Row(
|
||||
verticalAlignment = Alignment.Top,
|
||||
modifier = modifier.keyBlockSurface()
|
||||
) {
|
||||
BoxWithConstraints(
|
||||
modifier = Modifier
|
||||
.weight(1f)
|
||||
.padding(start = KEY_BLOCK_TEXT_PADDING_HORIZONTAL, top = KEY_BLOCK_TEXT_PADDING_VERTICAL, bottom = KEY_BLOCK_TEXT_PADDING_VERTICAL)
|
||||
) {
|
||||
val style = keyTextStyle()
|
||||
val textMeasurer = rememberTextMeasurer()
|
||||
val maxWidth = constraints.maxWidth
|
||||
|
||||
val groupWidth = remember(groups, style) {
|
||||
groups.maxOfOrNull { group -> textMeasurer.measure(text = group, style = style).size.width } ?: 0
|
||||
}
|
||||
|
||||
val minSpacing = with(LocalDensity.current) { MIN_GROUP_SPACING.roundToPx() }
|
||||
val fitsFourPerRow = groupWidth * GROUPS_PER_ROW + minSpacing * (GROUPS_PER_ROW - 1) <= maxWidth
|
||||
|
||||
if (fitsFourPerRow) {
|
||||
val spacing = with(LocalDensity.current) { ((maxWidth - groupWidth * GROUPS_PER_ROW) / (GROUPS_PER_ROW - 1)).toDp() }
|
||||
|
||||
Column {
|
||||
groups.chunked(GROUPS_PER_ROW).forEach { row ->
|
||||
Row(
|
||||
horizontalArrangement = Arrangement.spacedBy(spacing),
|
||||
modifier = Modifier.fillMaxWidth()
|
||||
) {
|
||||
row.forEach { group ->
|
||||
Text(
|
||||
text = group,
|
||||
style = style
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else {
|
||||
Text(
|
||||
text = groups.joinToString(separator = " "),
|
||||
style = style
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
CopyButton(
|
||||
contentDescription = stringResource(R.string.SignalLoginViewDetailsScreen__copy_recovery_key),
|
||||
onClick = { onEvent(SignalLoginViewDetailsScreenEvents.CopyRecoveryKeyClicked(groups.joinToString(separator = ""))) },
|
||||
modifier = Modifier.testTag(SignalLoginTestTags.VIEW_DETAILS_RECOVERY_KEY_COPY_BUTTON)
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The button in the top-end corner of a key block that copies the key to the clipboard.
|
||||
*/
|
||||
@Composable
|
||||
private fun CopyButton(
|
||||
contentDescription: String,
|
||||
onClick: () -> Unit,
|
||||
modifier: Modifier = Modifier
|
||||
) {
|
||||
IconButton(
|
||||
onClick = onClick,
|
||||
modifier = modifier.padding(top = COPY_BUTTON_PADDING_TOP, end = COPY_BUTTON_PADDING_END)
|
||||
) {
|
||||
Icon(
|
||||
painter = SignalIcons.Copy.painter,
|
||||
contentDescription = contentDescription,
|
||||
tint = MaterialTheme.colorScheme.onSurfaceVariant
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Modifier.keyBlockSurface(): Modifier {
|
||||
return this
|
||||
.horizontalGutters()
|
||||
.fillMaxWidth()
|
||||
.clip(RoundedCornerShape(18.dp))
|
||||
.background(SignalTheme.colors.colorSurface2)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun keyTextStyle(): TextStyle {
|
||||
return MaterialTheme.typography.bodyLarge.copy(
|
||||
fontFamily = MonoTypeface.fontFamily(),
|
||||
fontSize = 18.sp,
|
||||
lineHeight = 28.sp,
|
||||
letterSpacing = 1.44.sp
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun Footer(onEvent: (SignalLoginViewDetailsScreenEvents) -> Unit) {
|
||||
Column(
|
||||
|
||||
+3
-6
@@ -6,6 +6,7 @@
|
||||
package org.signal.signallogin.viewdetails
|
||||
|
||||
import org.signal.core.util.censor
|
||||
import org.signal.signallogin.RecoveryKeyGroups
|
||||
|
||||
/**
|
||||
* State for the screen that shows the user the full keys that make up their Signal Login.
|
||||
@@ -14,13 +15,9 @@ data class SignalLoginViewDetailsState(
|
||||
val accountKey: String = "",
|
||||
val recoveryKey: String = ""
|
||||
) {
|
||||
companion object {
|
||||
private const val GROUP_SIZE = 4
|
||||
}
|
||||
|
||||
/** The recovery key broken into character groups, in display order. */
|
||||
val recoveryKeyGroups: List<String>
|
||||
get() = recoveryKey.chunked(GROUP_SIZE)
|
||||
val recoveryKeyGroups: RecoveryKeyGroups
|
||||
get() = RecoveryKeyGroups.from(recoveryKey)
|
||||
|
||||
override fun toString(): String = "SignalLoginViewDetailsState(accountKey=${accountKey.censor()}, recoveryKey=${recoveryKey.censor()})"
|
||||
}
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Rekeningsleutel</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Herwinsleutel</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Herwinsleutel</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Stoor in wagwoordbestuurstelsel</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">مفتاح الحساب</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">مفتاح الاستعادة</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">مفتاح الاستعادة</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">حفظ في مدير كلمات المرور</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Hesab şifrəsi</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Bərpa şifrəsi</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Bərpa şifrəsi</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Parol menecerində yaddaşda saxlayın</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Ключ уліковага запісу</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Код для аднаўлення</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Код для аднаўлення</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Захаваць у менеджары пароляў</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Ключ на акаунта</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Ключ за възстановяване</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Ключ за възстановяване</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Запазване в мениджър на пароли</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">অ্যাকাউন্ট \'কি\'</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">পুনরুদ্ধার \'কি\'</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">পুনরুদ্ধার \'কি\'</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">পাসওয়ার্ড ম্যানেজারে সেভ করুন</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Ključ računa</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Ključ za oporavak</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Ključ za oporavak</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Sačuvaj u upravitelju lozinki</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Clau del compte</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Clau de recuperació</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Clau de recuperació</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Guardar al gestor de contrasenyes</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Klíč účtu</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Klíč pro obnovení</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Klíč pro obnovení</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Uložit do správce hesel</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Kontonøgle</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Gendannelsesnøgle</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Gendannelsesnøgle</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Gem i adgangskodeadministrator</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Kontoschlüssel</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Wiederherstellungsschlüssel</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Wiederherstellungsschlüssel</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Im Passwortmanager speichern</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Κλειδί λογαριασμού</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Κλειδί ανάκτησης</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Κλειδί ανάκτησης</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Αποθήκευση στον διαχειριστή κωδικών πρόσβασης</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Clave de cuenta</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Clave de recuperación</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Clave de recuperación</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Guardar en el gestor de contraseñas</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Konto võti</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Varukoopia võti</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Varukoopia võti</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Salvesta paroolihaldurisse</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Kontuaren gakoa</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Berreskuratze-gakoa</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Berreskuratze-gakoa</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Gorde pasahitz-kudeatzailean</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">رمز حساب</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">رمز بازیابی</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">رمز بازیابی</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">ذخیره در مدیر رمز عبور</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Tiliavain</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Palautusavain</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Palautusavain</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Tallenna salasananhallintaan</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Clé de compte</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Clé de récupération</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Clé de récupération</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Enregistrer dans le gestionnaire de mots de passe</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Eochair an chuntais</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Eochair athshlánaithe</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Eochair athshlánaithe</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Sábháil chuig an mbainisteoir pasfhocal</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Clave da conta</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Clave de recuperación</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Clave de recuperación</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Gardar no xestor de contrasinais</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">એકાઉન્ટ કી</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">રિકવરી કી</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">રિકવરી કી</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">પાસવર્ડ મેનેજરમાં સેવ કરો</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">अकाउंट की</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">\'रिकवरी की\'</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">\'रिकवरी की\'</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">पासवर्ड मैनेजर में सेव करें</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Ključ računa</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Ključ za oporavak</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Ključ za oporavak</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Spremi u upravitelju lozinki</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Fiókkulcs</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Helyreállítási kulcs</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Helyreállítási kulcs</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Mentés a jelszókezelőbe</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Kunci akun</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Kunci pemulihan</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Kunci pemulihan</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Simpan di pengelola kata sandi</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Chiave dell\'account</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Chiave di ripristino</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Chiave di ripristino</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Salva sul password manager</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">מפתח חשבון</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">מפתח שחזור</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">מפתח שחזור</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">שמירה במנהל הסיסמאות</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">アカウントキー</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">回復キー</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">回復キー</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">パスワードマネージャーに保存する</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">ანგარიშის გასაღები</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">აღდგენის გასაღები</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">აღდგენის გასაღები</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">პაროლების მენეჯერში შენახვა</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Аккаунт кілті</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Қалпына келтіру кілті</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Қалпына келтіру кілті</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Құпия сөз менеджерінде сақтау</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">លេខកូដគណនី</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">សោស្តារ</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">សោស្តារ</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">រក្សាទុកក្នុងមុខងារគ្រប់គ្រងពាក្យសម្ងាត់</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">ಖಾತೆ ಕೀ</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">ರಿಕವರಿ ಕೀ</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">ರಿಕವರಿ ಕೀ</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">ಪಾಸ್ವರ್ಡ್ ಮ್ಯಾನೇಜರ್ಗೆ ಸೇವ್ ಮಾಡಿ</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">계정 키</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">복구 키</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">복구 키</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">비밀번호 관리자에 저장</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Аккаунттун ачкычы</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Калыбына келтирүү ачкычы</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Калыбына келтирүү ачкычы</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Сырсөздөрдү башкаргычка сактоо</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Paskyros raktas</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Atkūrimo raktas</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Atkūrimo raktas</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Išsaugoti slaptažodžių tvarkyklėje</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Konta atslēga</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Atkopšanas atslēga</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Atkopšanas atslēga</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Saglabāt paroļu pārvaldniekā</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Клуч за корисничка сметка</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Клуч за враќање резервни копии</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Клуч за враќање резервни копии</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Зачувајте во управувачот со лозинки</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">അക്കൗണ്ട് കീ</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">വീണ്ടെടുക്കൽ കീ</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">വീണ്ടെടുക്കൽ കീ</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">പാസ്വേഡ് മാനേജറിൽ സംരക്ഷിക്കുക</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">खाते की</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">रीकव्हरी की</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">रीकव्हरी की</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">पासवर्ड व्यवस्थापकामध्ये जतन करा</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Kunci akaun</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Kunci pemulihan</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Kunci pemulihan</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Simpan ke pengurus kata laluan</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">အကောင့်ကီး</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">ပြန်လည်ရယူရေးကီး</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">ပြန်လည်ရယူရေးကီး</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">စကားဝှက်စီမံရေးတွင် သိမ်းဆည်းပါ</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Kontokode</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Sikkerhetskode</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Sikkerhetskode</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Lagre i passordverktøyet ditt</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Accountsleutel</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Herstelsleutel</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Herstelsleutel</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Opslaan in wachtwoordmanager</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">ਖਾਤੇ ਦੀ ਕੁੰਜੀ</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">ਰਿਕਵਰੀ ਕੁੰਜੀ</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">ਰਿਕਵਰੀ ਕੁੰਜੀ</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">ਪਾਸਵਰਡ ਮੈਨੇਜਰ ਵਿੱਚ ਸੇਵ ਕਰੋ</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Klucz konta</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Kod odzyskiwania</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Kod odzyskiwania</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Zapisz w menedżerze haseł</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Chave da conta</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Chave de recuperação</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Chave de recuperação</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Salvar no gerenciador de senhas</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Chave da conta</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Chave de recuperação</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Chave de recuperação</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Guardar no gestor de palavras-passe</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Cheie pentru cont</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Cod de recuperare</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Cod de recuperare</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Salvează în managerul de parole</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Ключ к учётной записи</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Ключ восстановления</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Ключ восстановления</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Сохранить в менеджере паролей</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Kľúč účtu</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Kľúč na obnovenie</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Kľúč na obnovenie</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Uložiť do správcu hesiel</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Ključ računa</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Obnovitveni ključ</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Obnovitveni ključ</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Shrani v upravitelja gesel</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Kodi i llogarisë</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Kodi i rikthimit</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Kodi i rikthimit</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Ruaj te menaxheri i fjalëkalimeve</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Кључ налога</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Кључ за опоравак</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Кључ за опоравак</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Сачувај у менаџер лозинки</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Kontonyckel</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Återställningsnyckel</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Återställningsnyckel</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Spara i lösenordshanterare</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Ufunguo wa akaunti</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Ufunguo wa kurejesha akaunti</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Ufunguo wa kurejesha akaunti</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Hifadhi kwenye kidhibiti cha manenosiri</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">கணக்குக் குறியீடு</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">மீட்புக் குறியீடு</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">மீட்புக் குறியீடு</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">கடவுச்சொல் மேலாளரில் சேமித்திடுக</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">ఖాతా కీ</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">రికవరీ కీ</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">రికవరీ కీ</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">పాస్వర్డ్ మేనేజర్లో సేవ్ చేయండి</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">กุญแจเข้าบัญชี</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">กุญแจกู้คืน</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">กุญแจกู้คืน</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">บันทึกไปยังตัวจัดการรหัสผ่าน</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Account key</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Recovery key</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Recovery key</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">I-save sa password manager</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Hesap anahtarı</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Kurtarma anahtarı</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Kurtarma anahtarı</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Parola yöneticisine kaydet</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">ھېسابات ئاچقۇچى</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">ئەسلىگە كەلتۈرۈش ئاچقۇچى</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">ئەسلىگە كەلتۈرۈش ئاچقۇچى</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">پارول باشقۇرغۇچىغا ساقلاڭ</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Ключ від акаунту</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Ключ відновлення</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Ключ відновлення</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Зберегти в менеджер паролів</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">اکاؤنٹ کیی</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">ریکوری کیی</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">ریکوری کیی</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">پاسورڈ مینیجر میں محفوظ کریں</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">Mã khóa tài khoản</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Mã khóa khôi phục</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Mã khóa khôi phục</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Lưu vào công cụ quản lý mật khẩu</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">帳戶金鑰</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">恢復金鑰</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">恢復金鑰</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">儲存去密碼管理器</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">账户密钥</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">恢复密钥</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">恢复密钥</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">保存到密码管理器</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">帳戶金鑰</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">恢復金鑰</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">恢復金鑰</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">儲存至密碼管理器</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_key">帳戶金鑰</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">恢復金鑰</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">恢復金鑰</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">儲存至密碼管理器</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
@@ -14,13 +14,13 @@
|
||||
<!-- Content description for the back arrow in the top app bar. -->
|
||||
<string name="SignalLoginViewDetailsScreen__navigate_back">Navigate back</string>
|
||||
<!-- Section header above the account key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__account_id">Account ID</string>
|
||||
<string name="SignalLoginKeyDetails__account_id">Account ID</string>
|
||||
<!-- Section header above the recovery key. -->
|
||||
<string name="SignalLoginViewDetailsScreen__recovery_key">Recovery key</string>
|
||||
<string name="SignalLoginKeyDetails__recovery_key">Recovery key</string>
|
||||
<!-- Content description for the button that copies the account key to the clipboard. -->
|
||||
<string name="SignalLoginViewDetailsScreen__copy_account_id">Copy account ID</string>
|
||||
<string name="SignalLoginKeyDetails__copy_account_id">Copy account ID</string>
|
||||
<!-- Content description for the button that copies the recovery key to the clipboard. -->
|
||||
<string name="SignalLoginViewDetailsScreen__copy_recovery_key">Copy recovery key</string>
|
||||
<string name="SignalLoginKeyDetails__copy_recovery_key">Copy recovery key</string>
|
||||
<!-- Action button that stores the Signal Login in the device password manager. -->
|
||||
<string name="SignalLoginViewDetailsScreen__save_to_password_manager">Save to password manager</string>
|
||||
<!-- Action button that saves the Signal Login as a PDF. -->
|
||||
|
||||
Reference in New Issue
Block a user