mirror of
https://github.com/simplex-chat/simplex-chat.git
synced 2026-10-23 00:02:28 +00:00
Merge branch 'master' into f/directory-integration-plan
This commit is contained in:
commit
b6f141d6e5
67 files changed
+684
-565
No files matched your search
+1
-1
@@ -1945,7 +1945,7 @@ data class Contact(
|
||||
}
|
||||
|
||||
val isContactCard: Boolean get() =
|
||||
(activeConn == null || activeConn.connStatus == ConnStatus.Prepared) && profile.contactLink != null && active && preparedContact == null && contactRequestId == null
|
||||
(activeConn == null || activeConn.connStatus == ConnStatus.Prepared) && profile.contactLink != null && active && preparedContact == null && contactRequestId == null && groupDirectInv == null
|
||||
|
||||
val isBot: Boolean get() = profile.peerType == ChatPeerType.Bot
|
||||
|
||||
|
||||
+2
-2
@@ -58,7 +58,7 @@ private fun formatBadgeCodeInput(s: String): String {
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BadgesRedeemCodeView() {
|
||||
fun BadgesRedeemCodeView(modalManager: ModalManager) {
|
||||
val rhId = remember { chatModel.remoteHostId() }
|
||||
val supporterBannerShown = remember { appPrefs.supporterBannerShown }
|
||||
val code = remember { mutableStateOf(TextFieldValue("")) }
|
||||
@@ -96,7 +96,7 @@ fun BadgesRedeemCodeView() {
|
||||
)
|
||||
} else {
|
||||
supporterBannerShown.set(true)
|
||||
ModalManager.start.closeModal()
|
||||
modalManager.closeModal()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+11
-11
@@ -32,7 +32,7 @@ import chat.simplex.common.views.onboarding.TextButtonBelowOnboardingButton
|
||||
import chat.simplex.res.MR
|
||||
|
||||
@Composable
|
||||
fun BadgesSupportSimplexView() {
|
||||
fun BadgesSupportSimplexView(modalManager: ModalManager) {
|
||||
ColumnWithScrollBar(
|
||||
Modifier.background(MaterialTheme.colors.background).padding(horizontal = 25.dp).padding(top = 8.dp, bottom = 20.dp),
|
||||
verticalArrangement = Arrangement.spacedBy(16.dp),
|
||||
@@ -57,7 +57,7 @@ fun BadgesSupportSimplexView() {
|
||||
|
||||
// TODO [badges] restore WhyBuiltButton() when in-app purchase lands: the level screen
|
||||
// returns to the flow and HowItWorksButton() moves there, leaving this one alone here.
|
||||
HowItWorksButton()
|
||||
HowItWorksButton(modalManager)
|
||||
|
||||
Spacer(Modifier.weight(1f))
|
||||
|
||||
@@ -66,7 +66,7 @@ fun BadgesSupportSimplexView() {
|
||||
Spacer(Modifier.weight(1f))
|
||||
|
||||
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||
RedeemCodeButton()
|
||||
RedeemCodeButton(modalManager)
|
||||
GetCodeButton()
|
||||
}
|
||||
}
|
||||
@@ -74,22 +74,22 @@ fun BadgesSupportSimplexView() {
|
||||
|
||||
// the in-app purchase path, kept compiling and uncalled until payments return after the MVP
|
||||
@Composable
|
||||
private fun ChooseLevelButton() {
|
||||
private fun ChooseLevelButton(modalManager: ModalManager) {
|
||||
OnboardingActionButton(
|
||||
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
|
||||
labelId = MR.strings.badges_choose_your_level,
|
||||
onboarding = null,
|
||||
onclick = {
|
||||
ModalManager.start.showModal { BadgesYourLevelView() }
|
||||
modalManager.showModal { BadgesYourLevelView(modalManager) }
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun WhyBuiltButton() {
|
||||
private fun WhyBuiltButton(modalManager: ModalManager) {
|
||||
val primary = MaterialTheme.colors.primary
|
||||
TextButton({
|
||||
ModalManager.start.showModal { HowItWorks(user = chatModel.currentUser.value, onboardingStage = null, titleColor = primary) }
|
||||
modalManager.showModal { HowItWorks(user = chatModel.currentUser.value, onboardingStage = null, titleColor = primary) }
|
||||
}) {
|
||||
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(6.dp)) {
|
||||
Icon(painterResource(MR.images.ic_info), null, tint = MaterialTheme.colors.primary)
|
||||
@@ -99,9 +99,9 @@ private fun WhyBuiltButton() {
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun HowItWorksButton() {
|
||||
private fun HowItWorksButton(modalManager: ModalManager) {
|
||||
TextButton({
|
||||
ModalManager.start.showModal { BadgesHowItWorksView() }
|
||||
modalManager.showModal { BadgesHowItWorksView() }
|
||||
}) {
|
||||
Row(verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.spacedBy(6.dp)) {
|
||||
Icon(painterResource(MR.images.ic_info), null, tint = MaterialTheme.colors.primary)
|
||||
@@ -111,13 +111,13 @@ private fun HowItWorksButton() {
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun RedeemCodeButton() {
|
||||
private fun RedeemCodeButton(modalManager: ModalManager) {
|
||||
OnboardingActionButton(
|
||||
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
|
||||
labelId = MR.strings.badges_redeem_code_button,
|
||||
onboarding = null,
|
||||
onclick = {
|
||||
ModalManager.start.showModal { BadgesRedeemCodeView() }
|
||||
modalManager.showModal { BadgesRedeemCodeView(modalManager) }
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
+9
-3
@@ -5,11 +5,12 @@ import androidx.compose.runtime.Composable
|
||||
import chat.simplex.common.model.BadgeModel
|
||||
import chat.simplex.common.model.BadgeState
|
||||
import chat.simplex.common.platform.chatModel
|
||||
import chat.simplex.common.views.helpers.ModalManager
|
||||
import chat.simplex.common.views.helpers.ModalView
|
||||
|
||||
@OptIn(ExperimentalAnimationApi::class)
|
||||
@Composable
|
||||
fun BadgesView(close: () -> Unit) {
|
||||
fun BadgesView(modalManager: ModalManager, close: () -> Unit) {
|
||||
val shownBadge: BadgeState? = run {
|
||||
if (!BadgeModel.isCurrent(chatModel.remoteHostId(), chatModel.currentUser.value?.userId)) return@run null
|
||||
val badgeState = BadgeModel.badgeState.value
|
||||
@@ -20,10 +21,15 @@ fun BadgesView(close: () -> Unit) {
|
||||
ModalView(close, cardScreen = shownBadge != null) {
|
||||
AnimatedContent(targetState = shownBadge, transitionSpec = { fadeIn() with fadeOut() }, contentKey = { it != null }) { badgeState ->
|
||||
if (badgeState != null) {
|
||||
BadgesYourBadgeView(badgeState)
|
||||
BadgesYourBadgeView(badgeState, modalManager)
|
||||
} else {
|
||||
BadgesSupportSimplexView()
|
||||
BadgesSupportSimplexView(modalManager)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// ModalManager.end, not start: every caller is in the chat, which on desktop is the right pane
|
||||
fun openBadgesView() {
|
||||
ModalManager.end.showCustomModal { close -> BadgesView(ModalManager.end, close) }
|
||||
}
|
||||
+3
-3
@@ -37,7 +37,7 @@ import chat.simplex.common.views.usersettings.simplexTeamUri
|
||||
import chat.simplex.res.MR
|
||||
|
||||
@Composable
|
||||
fun BadgesYourBadgeView(badgeState: BadgeState) {
|
||||
fun BadgesYourBadgeView(badgeState: BadgeState, modalManager: ModalManager) {
|
||||
ColumnWithScrollBar {
|
||||
AppBarTitle(stringResource(MR.strings.badges_your_badge))
|
||||
|
||||
@@ -54,7 +54,7 @@ fun BadgesYourBadgeView(badgeState: BadgeState) {
|
||||
SettingsActionItem(
|
||||
painterResource(MR.images.ic_info),
|
||||
stringResource(MR.strings.badges_how_it_works_button),
|
||||
{ ModalManager.start.showModal { BadgesHowItWorksView() } },
|
||||
{ modalManager.showModal { BadgesHowItWorksView() } },
|
||||
)
|
||||
}
|
||||
SectionSpacer()
|
||||
@@ -98,7 +98,7 @@ fun BadgesYourBadgeView(badgeState: BadgeState) {
|
||||
SectionItemView({ clipboard.setText(AnnotatedString(badgeState.purchaseKey)) }) {
|
||||
Text(stringResource(MR.strings.badges_copy_purchase_key), color = MaterialTheme.colors.primary)
|
||||
}
|
||||
SectionItemView({ ModalManager.start.showCustomModal { close -> BadgesLedgerView(badgeState, close) } }) {
|
||||
SectionItemView({ modalManager.showCustomModal { close -> BadgesLedgerView(badgeState, close) } }) {
|
||||
Text(stringResource(MR.strings.badges_ledger))
|
||||
}
|
||||
}
|
||||
|
||||
+5
-5
@@ -54,7 +54,7 @@ enum class BadgeLevel {
|
||||
}
|
||||
|
||||
@Composable
|
||||
fun BadgesYourLevelView() {
|
||||
fun BadgesYourLevelView(modalManager: ModalManager) {
|
||||
var selectedLevel by remember { mutableStateOf(BadgeLevel.Supporter) }
|
||||
|
||||
LaunchedEffect(Unit) { BadgeStore.load() }
|
||||
@@ -99,11 +99,11 @@ fun BadgesYourLevelView() {
|
||||
// Nested Column with no spacing so the TextButtonBelowOnboardingButton sits directly under
|
||||
// the action button (matches onboarding pattern where its own 7.5dp top padding is the gap).
|
||||
Column(horizontalAlignment = Alignment.CenterHorizontally) {
|
||||
ContinueButton(selectedLevel)
|
||||
ContinueButton(selectedLevel, modalManager)
|
||||
TextButtonBelowOnboardingButton(
|
||||
text = stringResource(MR.strings.badges_how_it_works_button),
|
||||
icon = painterResource(MR.images.ic_info),
|
||||
onClick = { ModalManager.start.showModal { BadgesHowItWorksView() } }
|
||||
onClick = { modalManager.showModal { BadgesHowItWorksView() } }
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -140,13 +140,13 @@ private fun LevelCard(level: BadgeLevel, selectedLevel: BadgeLevel, modifier: Mo
|
||||
}
|
||||
|
||||
@Composable
|
||||
private fun ContinueButton(selectedLevel: BadgeLevel) {
|
||||
private fun ContinueButton(selectedLevel: BadgeLevel, modalManager: ModalManager) {
|
||||
OnboardingActionButton(
|
||||
modifier = if (appPlatform.isAndroid) Modifier.padding(horizontal = DEFAULT_ONBOARDING_HORIZONTAL_PADDING).fillMaxWidth() else Modifier.widthIn(min = 300.dp),
|
||||
labelId = MR.strings.badges_continue,
|
||||
onboarding = null,
|
||||
onclick = {
|
||||
ModalManager.start.showModal { BadgesPayView(selectedLevel) }
|
||||
modalManager.showModal { BadgesPayView(selectedLevel) }
|
||||
}
|
||||
)
|
||||
}
|
||||
|
||||
+7
@@ -29,7 +29,9 @@ import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.common.ui.theme.*
|
||||
import chat.simplex.common.views.chat.group.MemberProfileImage
|
||||
import chat.simplex.common.views.chat.item.*
|
||||
import chat.simplex.common.views.badges.openBadgesView
|
||||
import chat.simplex.common.views.chatlist.*
|
||||
import chat.simplex.common.views.newchat.noShownBadge
|
||||
import chat.simplex.common.views.usersettings.networkAndServers.serverHostname
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.ImageResource
|
||||
@@ -277,6 +279,11 @@ fun ChatItemInfoView(chatRh: Long?, ci: ChatItem, ciInfo: ChatItemInfo, devTools
|
||||
if (file?.fileExpires != null) {
|
||||
val expiresRes = if (file.expired) MR.strings.info_row_file_expired else MR.strings.info_row_file_expires
|
||||
InfoRow(stringResource(expiresRes), localTimestamp(file.fileExpires))
|
||||
if (noShownBadge()) {
|
||||
SectionItemView(::openBadgesView) {
|
||||
Text(stringResource(MR.strings.badges_larger_files_longer), color = MaterialTheme.colors.primary)
|
||||
}
|
||||
}
|
||||
}
|
||||
if (ci.meta.msgVerified?.verified == true) {
|
||||
val signedRes = if (sent) MR.strings.info_row_signed else MR.strings.info_row_signed_verified
|
||||
|
||||
+22
-8
@@ -33,12 +33,14 @@ import chat.simplex.common.model.ChatModel.controller
|
||||
import chat.simplex.common.model.ChatModel.filesToDelete
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.ui.theme.*
|
||||
import chat.simplex.common.views.badges.openBadgesView
|
||||
import chat.simplex.common.views.chat.group.hostFromRelayLink
|
||||
import chat.simplex.common.views.chat.group.relayConnStatus
|
||||
import chat.simplex.common.views.chat.item.*
|
||||
import chat.simplex.common.views.helpers.*
|
||||
import chat.simplex.common.views.newchat.RelayProgressIndicator
|
||||
import chat.simplex.common.views.newchat.RelayStatusIndicator
|
||||
import chat.simplex.common.views.newchat.noShownBadge
|
||||
import chat.simplex.common.views.newchat.relayDisplayName
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.ImageResource
|
||||
@@ -320,6 +322,24 @@ private fun isVideoUri(uri: URI): Boolean {
|
||||
|
||||
private fun isWebmUri(uri: URI): Boolean = getFileName(uri)?.lowercase()?.endsWith(".webm") == true
|
||||
|
||||
// A badge only helps below the largest badge's limit, and not in incognito chats, so outside that
|
||||
// the alert is informational as before.
|
||||
fun showLargeFileAlert(fileSize: Long, incognito: Boolean, senderProfile: LocalProfile?) {
|
||||
val title = generalGetString(MR.strings.large_file)
|
||||
val text = largeFileMessage(fileSize, incognito, expiredBadgeReason(fileSize, senderProfile))
|
||||
if (!incognito && fileSize <= MAX_FILE_SIZE_XFTP_LEGEND && noShownBadge()) {
|
||||
AlertManager.shared.showAlertDialog(
|
||||
title = title,
|
||||
text = text,
|
||||
confirmText = generalGetString(MR.strings.ok),
|
||||
dismissText = generalGetString(MR.strings.badges_support_simplex_title),
|
||||
onDismiss = ::openBadgesView
|
||||
)
|
||||
} else {
|
||||
AlertManager.shared.showAlertMsg(title, text)
|
||||
}
|
||||
}
|
||||
|
||||
fun MutableState<ComposeState>.processPickedFile(uri: URI?, text: String?) {
|
||||
if (uri != null) {
|
||||
val maxFileSize = value.maxFileSize
|
||||
@@ -330,10 +350,7 @@ fun MutableState<ComposeState>.processPickedFile(uri: URI?, text: String?) {
|
||||
value = value.copy(message = if (text != null) ComposeMessage(text) else value.message, preview = ComposePreview.FilePreview(fileName, uri))
|
||||
}
|
||||
} else if (fileSize != null) {
|
||||
AlertManager.shared.showAlertMsg(
|
||||
generalGetString(MR.strings.large_file),
|
||||
largeFileMessage(fileSize, value.sendIncognito, expiredBadgeReason(fileSize, chatModel.currentUser.value?.profile))
|
||||
)
|
||||
showLargeFileAlert(fileSize, value.sendIncognito, chatModel.currentUser.value?.profile)
|
||||
} else {
|
||||
showWrongUriAlert()
|
||||
}
|
||||
@@ -359,10 +376,7 @@ suspend fun MutableState<ComposeState>.processPickedMedia(uris: List<URI>, text:
|
||||
UploadContent.AnimatedImage(uri)
|
||||
} else {
|
||||
bitmap = null
|
||||
AlertManager.shared.showAlertMsg(
|
||||
generalGetString(MR.strings.large_file),
|
||||
largeFileMessage(fileSize ?: 0, value.sendIncognito, expiredBadgeReason(fileSize ?: 0, chatModel.currentUser.value?.profile))
|
||||
)
|
||||
showLargeFileAlert(fileSize ?: 0, value.sendIncognito, chatModel.currentUser.value?.profile)
|
||||
null
|
||||
}
|
||||
} else if (bitmap != null) {
|
||||
|
||||
+3
-3
@@ -1052,7 +1052,7 @@ private fun BoxScope.ChatList(searchText: MutableState<TextFieldValue>, listStat
|
||||
SupportSimpleXBanner(
|
||||
title = stringResource(MR.strings.badges_support_ended),
|
||||
subtitle = String.format(stringResource(MR.strings.badges_support_ended_on), alert.dateText),
|
||||
onTap = { ModalManager.start.showCustomModal { close -> BadgesView(close) } },
|
||||
onTap = { ModalManager.start.showCustomModal { close -> BadgesView(ModalManager.start, close) } },
|
||||
onDismiss = { showBadgeAlertDismissAlert(generalGetString(MR.strings.badges_support_ended)) }
|
||||
)
|
||||
}
|
||||
@@ -1065,7 +1065,7 @@ private fun BoxScope.ChatList(searchText: MutableState<TextFieldValue>, listStat
|
||||
title = stringResource(MR.strings.badges_renewal_failed),
|
||||
subtitle = stringResource(MR.strings.badges_tap_for_details),
|
||||
warning = true,
|
||||
onTap = { ModalManager.start.showCustomModal { close -> BadgesView(close) } },
|
||||
onTap = { ModalManager.start.showCustomModal { close -> BadgesView(ModalManager.start, close) } },
|
||||
onDismiss = { showBadgeAlertDismissAlert(generalGetString(MR.strings.badges_renewal_failed)) }
|
||||
)
|
||||
}
|
||||
@@ -1078,7 +1078,7 @@ private fun BoxScope.ChatList(searchText: MutableState<TextFieldValue>, listStat
|
||||
showDismiss = supporterBannerTapped.value,
|
||||
onTap = {
|
||||
appPrefs.supporterBannerTapped.set(true)
|
||||
ModalManager.start.showCustomModal { close -> BadgesView(close) }
|
||||
ModalManager.start.showCustomModal { close -> BadgesView(ModalManager.start, close) }
|
||||
},
|
||||
onDismiss = ::showSupportSimpleXDismissAlert
|
||||
)
|
||||
|
||||
+13
-4
@@ -36,6 +36,8 @@ import chat.simplex.common.model.LocalBadge
|
||||
import chat.simplex.common.model.localDate
|
||||
import chat.simplex.common.platform.*
|
||||
import chat.simplex.common.ui.theme.*
|
||||
import chat.simplex.common.views.badges.openBadgesView
|
||||
import chat.simplex.common.views.newchat.noShownBadge
|
||||
import chat.simplex.res.MR
|
||||
import dev.icerock.moko.resources.ImageResource
|
||||
import kotlin.math.max
|
||||
@@ -244,10 +246,17 @@ fun showBadgeInfoAlert(name: String, badge: LocalBadge, uriHandler: UriHandler)
|
||||
String.format(generalGetString(MR.strings.badge_supported_simplex), name, localDate(badge.badge.badgeExpiry))
|
||||
else
|
||||
String.format(generalGetString(MR.strings.badge_supports_simplex), name)
|
||||
AlertManager.shared.showAlertMsg(
|
||||
title = title,
|
||||
text = supports + "\n\n" + generalGetString(MR.strings.badge_support_from_v7)
|
||||
)
|
||||
if (noShownBadge()) {
|
||||
AlertManager.shared.showAlertDialog(
|
||||
title = title,
|
||||
text = supports,
|
||||
confirmText = generalGetString(MR.strings.ok),
|
||||
dismissText = generalGetString(MR.strings.badges_support_simplex_title),
|
||||
onDismiss = ::openBadgesView
|
||||
)
|
||||
} else {
|
||||
AlertManager.shared.showAlertMsg(title = title, text = supports)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+1
-1
@@ -107,7 +107,7 @@ fun SettingsLayout(
|
||||
SectionView {
|
||||
// Direct showModal (no settings / cardScreen flags) — settings-style card chrome would render
|
||||
// a gray top bar / back button that badges views don't want (they have their own inline titles).
|
||||
SectionItemView(click = { ModalManager.start.showCustomModal { close -> BadgesView(close) } }) {
|
||||
SectionItemView(click = { ModalManager.start.showCustomModal { close -> BadgesView(ModalManager.start, close) } }) {
|
||||
val badgeType = chatModel.currentUser.value?.profile?.localBadge?.badge?.badgeType ?: BadgeType.Supporter
|
||||
Image(painterResource(badgeImage(badgeType)), stringResource(MR.strings.supporter_perks), Modifier.size(24.dp))
|
||||
TextIconSpaced()
|
||||
|
||||
@@ -2762,7 +2762,6 @@
|
||||
<string name="badge_unverified_title">شارة غير متحقق منها</string>
|
||||
<string name="relays_no_web_support">لا تدعم خوادم ترحيل الدردشة المستعملة صفحات الويب.</string>
|
||||
<string name="webpage_code">رمز صفحة الويب</string>
|
||||
<string name="badge_support_from_v7">يمكنك دعم SimpleX بدءًا من الإصدار 7 من التطبيق.</string>
|
||||
<string name="error_saving_simplex_name">خطأ في حفظ الاسم</string>
|
||||
<string name="set_user_simplex_name_footer">اسمح للناس بالتواصل معك عبر الاسم المسجَّل في عنوان SimpleX الخاص بك.</string>
|
||||
<string name="set_channel_simplex_name_footer">اسمح للأشخاص بالانضمام باستخدام الاسم المسجَّل عبر رابط هذه القناة.</string>
|
||||
|
||||
@@ -3134,7 +3134,6 @@
|
||||
<string name="appearance_minimize_to_tray_desc">Runs in background to receive messages</string>
|
||||
<string name="badge_supports_simplex">%s supports SimpleX Chat.</string>
|
||||
<string name="badge_supported_simplex">%1$s supported SimpleX Chat. The badge expired on %2$s.</string>
|
||||
<string name="badge_support_from_v7">You can support SimpleX starting from v7 of the app.</string>
|
||||
<string name="badge_invested">%s invested in SimpleX Chat crowdfunding.</string>
|
||||
<string name="badge_unverified_title">Unverified badge</string>
|
||||
<string name="badge_unverified_desc">This badge could not be verified and may not be genuine.</string>
|
||||
@@ -3176,6 +3175,7 @@
|
||||
<string name="badges_banner_title">Support SimpleX</string>
|
||||
<string name="badges_banner_subtitle">Get badge + better files</string>
|
||||
<string name="badges_banner_dismiss_message">You can support SimpleX later in Settings.</string>
|
||||
<string name="badges_larger_files_longer">Support SimpleX to send larger files that stay available longer</string>
|
||||
<string name="badges_purchase_successful">Purchase successful</string>
|
||||
<string name="badges_purchase_pending">Purchase pending</string>
|
||||
<string name="badges_purchase_pending_desc">The purchase is awaiting approval. This build does not deliver purchases approved later.</string>
|
||||
|
||||
@@ -2858,7 +2858,6 @@
|
||||
<string name="badge_unverified_title">Abzeichen nicht verifiziert</string>
|
||||
<string name="relays_no_web_support">Die verwendeten Chat‑Relais unterstützen keine Webseiten.</string>
|
||||
<string name="webpage_code">Webseiten-Code</string>
|
||||
<string name="badge_support_from_v7">Sie können SimpleX ab der App-Version v7 unterstützen.</string>
|
||||
<string name="error_saving_simplex_name">Fehler beim Speichern des Namens</string>
|
||||
<string name="set_user_simplex_name_footer">Lassen Sie sich über den mit Ihrer SimpleX‑Adresse registrierten Namen verbinden.</string>
|
||||
<string name="set_channel_simplex_name_footer">Ermöglichen Sie Beitritte über den mit diesem Kanal‑Link registrierten Namen.</string>
|
||||
|
||||
@@ -2785,7 +2785,6 @@
|
||||
<string name="group_link_requires_newer_version">Este grupo requiere una versión más reciente de la aplicación. Por favor, actualizala para unirte.</string>
|
||||
<string name="webpage_code">Código web</string>
|
||||
<string name="relays_no_web_support">Los servidores usados no admiten páginas web.</string>
|
||||
<string name="badge_support_from_v7">Puedes apoyar SimpleX desde la versión 7.</string>
|
||||
<string name="badge_unverified_title">Insignia sin verificar</string>
|
||||
<string name="connect_plan_connect_to_name">Conectar con %s</string>
|
||||
<string name="error_saving_simplex_name">Error al guardar el nombre</string>
|
||||
|
||||
@@ -2833,7 +2833,6 @@
|
||||
<string name="appearance_minimize_to_tray_desc">Fonctionne en arrière-plan pour recevoir les messages</string>
|
||||
<string name="badge_supports_simplex">%s soutient SimpleX Chat.</string>
|
||||
<string name="badge_supported_simplex">%1$s a soutenu SimpleX Chat. Le badge a expiré le %2$s.</string>
|
||||
<string name="badge_support_from_v7">Vous pouvez soutenir SimpleX à partir de la version 7 de l’application.</string>
|
||||
<string name="badge_invested">%s a investi dans le financement participatif de SimpleX Chat.</string>
|
||||
<string name="badge_unverified_title">Badge non vérifié</string>
|
||||
<string name="badge_unverified_desc">Ce badge n’a pas pu être vérifié et peut ne pas être authentique.</string>
|
||||
|
||||
@@ -2751,7 +2751,6 @@
|
||||
<string name="relay_status_acknowledged_roster">visszaigazolt névsor</string>
|
||||
<string name="badge_supports_simplex">%s támogatja a SimpleX Chatet.</string>
|
||||
<string name="badge_supported_simplex">%1$s támogatta a SimpleX Chatet. A kitűző lejárt ekkor: %2$s.</string>
|
||||
<string name="badge_support_from_v7">A SimpleXet az alkalmazás v7-es verziójától kezdve támogathatja.</string>
|
||||
<string name="badge_invested">%s befektetett a SimpleX Chat közösségi finanszírozásába.</string>
|
||||
<string name="badge_unverified_title">Ellenőrizetlen kitűző</string>
|
||||
<string name="badge_unverified_desc">Nem sikerült ellenőrizni ezt a kitűzőt, és lehet, hogy nem eredeti.</string>
|
||||
|
||||
@@ -2789,7 +2789,6 @@
|
||||
<string name="badge_unverified_title">Targhetta non verificata</string>
|
||||
<string name="relays_no_web_support">I relay di chat usati non supportano le pagine web.</string>
|
||||
<string name="webpage_code">Codice pagina web</string>
|
||||
<string name="badge_support_from_v7">Puoi sostenere SimpleX dalla versione 7 dell\'app.</string>
|
||||
<string name="error_saving_simplex_name">Errore di salvataggio del nome</string>
|
||||
<string name="set_user_simplex_name_footer">Consenti alle persone di collegarsi tramite il nome registrato con il tuo indirizzo SimpleX.</string>
|
||||
<string name="set_channel_simplex_name_footer">Consenti alle persone di entrare attraverso il nome registrato con questo link del canale.</string>
|
||||
|
||||
@@ -2747,7 +2747,6 @@
|
||||
<string name="appearance_minimize_to_tray_desc">メッセージを受信するためにバックグラウンドで実行します</string>
|
||||
<string name="badge_supports_simplex">%s は SimpleX Chat をサポートしています。</string>
|
||||
<string name="badge_supported_simplex">%1$s は SimpleX Chat をサポートしました。バッジは %2$s に期限切れになりました。</string>
|
||||
<string name="badge_support_from_v7">アプリのv7から SimpleX をサポートできます。</string>
|
||||
<string name="badge_invested">%s は SimpleX Chat のクラウドファンディングに出資しました。</string>
|
||||
<string name="badge_unverified_title">未検証のバッジ</string>
|
||||
<string name="badge_unverified_desc">このバッジは検証できず、本物ではない可能性があります。</string>
|
||||
|
||||
@@ -2316,7 +2316,6 @@
|
||||
<string name="channel_subscriber_count_singular">%1$d inscrito</string>
|
||||
<string name="channel_subscriber_count_plural">%1$d inscritos</string>
|
||||
<string name="badge_supported_simplex">%1$s apoiou o SimpleX Chat. O selo expirou em %2$s.</string>
|
||||
<string name="badge_support_from_v7">Você pode apoiar o SimpleX a partir da versão 7 do aplicativo.</string>
|
||||
<string name="accept_contact_request">Aceitar solicitação de contato</string>
|
||||
<string name="chat_banner_accept_contact_request">Aceitar solicitação de contato</string>
|
||||
<string name="relay_status_accepted">aceito</string>
|
||||
|
||||
@@ -2812,7 +2812,6 @@
|
||||
<string name="badge_unverified_desc">Не удалось проверить подлинность этого значка. Возможно, он не является подлинным.</string>
|
||||
<string name="badge_unverified_title">Неподтвержденный значок</string>
|
||||
<string name="badge_invested">%s инвестировал(а) в краудфандинг SimpleX Chat.</string>
|
||||
<string name="badge_support_from_v7">Вы можете поддержать SimpleX начиная с версии приложения v7.</string>
|
||||
<string name="badge_supports_simplex">%s поддерживает SimpleX Chat.</string>
|
||||
<string name="appearance_minimize_to_tray_desc">Работает в фоновом режиме для получения сообщений</string>
|
||||
<string name="no_names_servers_enabled">Нет серверов для разрешения имён.</string>
|
||||
|
||||
@@ -2788,7 +2788,6 @@
|
||||
<string name="channel_member_you">sen</string>
|
||||
<string name="you_are_subscriber">Abonesiniz</string>
|
||||
<string name="you_can_share_channel_link_anybody_will_be_able_to_connect">Bir bağlantı veya QR kodu paylaşabilirsiniz; böylece kanala herkes katılabilir.</string>
|
||||
<string name="badge_support_from_v7">Uygulamanın v7 sürümünden itibaren SimpleX\'i destekleyebilirsiniz.</string>
|
||||
<string name="relay_section_footer_subscriber">Bu aktarım bağlantısı (relay link) üzerinden kanala bağlandınız.</string>
|
||||
<string name="chat_banner_your_channel">Kanalınız</string>
|
||||
<string name="connect_plan_this_is_your_link_for_channel">Kanalınız</string>
|
||||
|
||||
@@ -2768,7 +2768,6 @@
|
||||
<string name="badge_unverified_title">未验证的徽章</string>
|
||||
<string name="relays_no_web_support">所用的聊天中继不支持网页。</string>
|
||||
<string name="webpage_code">网页代码</string>
|
||||
<string name="badge_support_from_v7">从 v7 版本起您可以支持 SimpleX。</string>
|
||||
<string name="advanced_options">高级选项</string>
|
||||
<string name="advanced_settings">高级设置</string>
|
||||
<string name="allow_anyone_to_embed">允许任何人嵌入</string>
|
||||
|
||||
@@ -2772,7 +2772,6 @@
|
||||
<string name="appearance_minimize_to_tray_desc">在背景執行以接收訊息</string>
|
||||
<string name="badge_supports_simplex">%s 支持 SimpleX Chat。</string>
|
||||
<string name="badge_supported_simplex">%1$s 曾支持 SimpleX Chat。此徽章已於 %2$s 過期。</string>
|
||||
<string name="badge_support_from_v7">你可以從應用程式 v7 開始支持 SimpleX。</string>
|
||||
<string name="badge_invested">%s 投資了 SimpleX Chat 眾籌。</string>
|
||||
<string name="badge_unverified_title">未驗證徽章</string>
|
||||
<string name="badge_unverified_desc">無法驗證此徽章,可能並非真實。</string>
|
||||
|
||||
Reference in new issue
Block a user