diff --git a/app/build.gradle.kts b/app/build.gradle.kts index a97bd14cdc..234be4b858 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -26,8 +26,8 @@ configurations.configureEach { exclude(module = "commons-logging") } -val canonicalVersionCode = 444 -val canonicalVersionName = "1.32.1" +val canonicalVersionCode = 445 +val canonicalVersionName = "1.32.2" val postFixSize = 10 val abiPostFix = mapOf( diff --git a/app/src/main/java/org/session/libsession/messaging/jobs/InviteContactsJob.kt b/app/src/main/java/org/session/libsession/messaging/jobs/InviteContactsJob.kt index 03d546c69a..119f1b61e4 100644 --- a/app/src/main/java/org/session/libsession/messaging/jobs/InviteContactsJob.kt +++ b/app/src/main/java/org/session/libsession/messaging/jobs/InviteContactsJob.kt @@ -51,6 +51,10 @@ class InviteContactsJob @AssistedInject constructor( override var failureCount: Int = 0 override val maxFailureCount: Int = 1 + private fun handleSuccess(dispatcherName: String) { + delegate?.handleJobSucceeded(this, dispatcherName) + } + override suspend fun execute(dispatcherName: String) { val group = requireNotNull(configFactory.getGroup(AccountId(groupSessionId))) { "Group must exist to invite" @@ -118,8 +122,10 @@ class InviteContactsJob @AssistedInject constructor( result.exceptionOrNull()?.let { err -> id to err } } - // if there are failed invites, display a message // assume job "success" even if we fail, the state of invites is tracked outside of this job + handleSuccess(dispatcherName) + + // if there are failed invites, display a message if (failures.isNotEmpty()) { // show the failure toast val (_, firstError) = failures.first() diff --git a/app/src/main/java/org/session/libsession/utilities/NonTranslatableStringConstants.kt b/app/src/main/java/org/session/libsession/utilities/NonTranslatableStringConstants.kt index 96dd03f4b5..cce09c539e 100644 --- a/app/src/main/java/org/session/libsession/utilities/NonTranslatableStringConstants.kt +++ b/app/src/main/java/org/session/libsession/utilities/NonTranslatableStringConstants.kt @@ -17,5 +17,6 @@ object NonTranslatableStringConstants { const val PRO = "Pro" const val ENTITY_RANGEPROOF = "Rangeproof PTY LTD" const val ENTITY_STF = "The Session Technology Foundation" + const val DONATE_APPEAL_NAME = "Cofounder of Session Chris McCabe" } diff --git a/app/src/main/java/org/session/libsession/utilities/StringSubKeys.kt b/app/src/main/java/org/session/libsession/utilities/StringSubKeys.kt index 4008f3f1bb..e34d3124f8 100644 --- a/app/src/main/java/org/session/libsession/utilities/StringSubKeys.kt +++ b/app/src/main/java/org/session/libsession/utilities/StringSubKeys.kt @@ -65,4 +65,5 @@ object StringSubstitutionConstants { const val ACTION_TYPE_KEY: StringSubKey = "action_type" const val ACTIVATION_TYPE_KEY: StringSubKey = "activation_type" const val ENTITY_KEY: StringSubKey = "entity" + const val DONATE_APPEAL_KEY: StringSubKey = "donate_appeal_name" } \ No newline at end of file diff --git a/app/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt b/app/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt index 81a63f787d..687a6609b3 100644 --- a/app/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt +++ b/app/src/main/java/org/session/libsession/utilities/TextSecurePreferences.kt @@ -406,11 +406,11 @@ interface TextSecurePreferences { const val HAS_CHECKED_DOZE_WHITELIST = "has_checked_doze_whitelist" // Donation - const val HAS_DONATED = "has_donated" - const val HAS_COPIED_DONATION_URL = "has_copied_donation_url" - const val SEEN_DONATION_CTA_AMOUNT = "seen_donation_cta_amount" - const val LAST_SEEN_DONATION_CTA = "last_seen_donation_cta" - const val SHOW_DONATION_CTA_FROM_POSITIVE_REVIEW = "show_donation_cta_from_positive_review" + const val HAS_DONATED = "has_donated_v2" + const val HAS_COPIED_DONATION_URL = "has_copied_donation_url_v2" + const val SEEN_DONATION_CTA_AMOUNT = "seen_donation_cta_amount_v2" + const val LAST_SEEN_DONATION_CTA = "last_seen_donation_cta_v2" + const val SHOW_DONATION_CTA_FROM_POSITIVE_REVIEW = "show_donation_cta_from_positive_review_v2" const val DEBUG_HAS_DONATED = "debug_has_donated" const val DEBUG_HAS_COPIED_DONATION_URL = "debug_has_copied_donation_url" diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionOverlay.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionOverlay.kt index 946c40ff73..e423f4e438 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionOverlay.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationReactionOverlay.kt @@ -350,6 +350,11 @@ class ConversationReactionOverlay : FrameLayout { updateBoundsOnLayoutChanged() revealAnimatorSet.start() + val maxMenuY = maxOf( + systemInsets.top.toFloat(), + (height - systemInsets.bottom - actualMenuHeight).toFloat() + ) + if (isWideLayout) { val menuXInOverlay = if (isMessageOnLeft) { // Menu to the RIGHT of the scrubber @@ -359,8 +364,7 @@ class ConversationReactionOverlay : FrameLayout { scrubberX - contextMenu.getMaxWidth() - menuPadding } - val maxMenuYInOverlay = (height - systemInsets.bottom - actualMenuHeight).toFloat() - val menuYInOverlay = minOf(backgroundView.y, maxMenuYInOverlay) + val menuYInOverlay = minOf(backgroundView.y, maxMenuY) // Convert overlay-local to anchor relative as expected by ConversationContextMenu.show() val (xOffset, yOffset) = toAnchorOffsets(menuXInOverlay, menuYInOverlay) @@ -377,7 +381,7 @@ class ConversationReactionOverlay : FrameLayout { val menuYInOverlay = (menuTop + menuPadding) .coerceIn( systemInsets.top.toFloat(), - (height - systemInsets.bottom - actualMenuHeight).toFloat() + maxMenuY ) val (xOffset, yOffset) = toAnchorOffsets(menuXInOverlay, menuYInOverlay) diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt index 705cce96de..e3d393782d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/ConversationOptionsBottomSheet.kt @@ -25,6 +25,7 @@ import org.session.libsession.utilities.getGroup import org.session.libsession.utilities.recipients.Recipient import org.session.libsession.utilities.withUserConfigs import org.session.libsignal.utilities.AccountId +import org.session.libsignal.utilities.Log import org.thoughtcrime.securesms.auth.LoginStateRepository import org.thoughtcrime.securesms.database.GroupDatabase import org.thoughtcrime.securesms.database.ThreadDatabase @@ -93,9 +94,15 @@ class ConversationOptionsBottomSheet() : BottomSheetDialogFragment(), View.OnCli requireNotNull(args.getLong(ARG_THREAD_ID)) val addressString = requireNotNull(args.getString(ARG_ADDRESS)) val address = Address.fromSerialized(addressString) - thread = requireNotNull( - threadDatabase.getThreads(listOf(address)).firstOrNull() - ) { "Thread not found for address: $addressString" } + val threadFromDb = threadDatabase.getThreads(listOf(address)).firstOrNull() + + if(threadFromDb == null){ + Log.w("", "Home conversation bottom sheet: Thread not found for address: $addressString" ) + dismiss() + return + } + + thread = threadFromDb group = groupDatabase.getGroup(thread.recipient.address.toString()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/HomeDialogs.kt b/app/src/main/java/org/thoughtcrime/securesms/home/HomeDialogs.kt index 9831a9f6d2..bb610c0a49 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/HomeDialogs.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/HomeDialogs.kt @@ -1,13 +1,39 @@ package org.thoughtcrime.securesms.home +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.IntrinsicSize +import androidx.compose.foundation.layout.Row +import androidx.compose.foundation.layout.Spacer +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.heightIn +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.shape.CircleShape +import androidx.compose.foundation.verticalScroll +import androidx.compose.material3.Icon +import androidx.compose.material3.IconButton +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.retain.retain import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.graphics.Color import androidx.compose.ui.platform.LocalContext +import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.stringResource +import androidx.compose.ui.text.style.TextAlign +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp import com.squareup.phrase.Phrase import kotlinx.coroutines.delay import network.loki.messenger.R @@ -26,21 +52,32 @@ import org.thoughtcrime.securesms.home.HomeViewModel.Commands.HideUrlDialog import org.thoughtcrime.securesms.home.HomeViewModel.Commands.HideUserProfileModal import org.thoughtcrime.securesms.home.HomeViewModel.Commands.OnLinkCopied import org.thoughtcrime.securesms.home.HomeViewModel.Commands.OnLinkOpened -import org.thoughtcrime.securesms.home.HomeViewModel.Commands.ShowDonationConfirmation import org.thoughtcrime.securesms.home.startconversation.StartConversationSheet import org.thoughtcrime.securesms.preferences.prosettings.ProSettingsDestination import org.thoughtcrime.securesms.ui.AlertDialog import org.thoughtcrime.securesms.ui.AnimatedSessionProCTA +import org.thoughtcrime.securesms.ui.BasicSessionAlertDialog +import org.thoughtcrime.securesms.ui.BottomFadingEdgeBox import org.thoughtcrime.securesms.ui.CTAFeature import org.thoughtcrime.securesms.ui.DialogButtonData +import org.thoughtcrime.securesms.ui.CTAImage +import org.thoughtcrime.securesms.ui.DialogBg import org.thoughtcrime.securesms.ui.GetString import org.thoughtcrime.securesms.ui.OpenURLAlertDialog import org.thoughtcrime.securesms.ui.PinProCTA -import org.thoughtcrime.securesms.ui.SimpleSessionProCTA import org.thoughtcrime.securesms.ui.UserProfileModal +import org.thoughtcrime.securesms.ui.components.AccentFillButtonRect import org.thoughtcrime.securesms.ui.components.annotatedStringResource +import org.thoughtcrime.securesms.ui.openUrl +import org.thoughtcrime.securesms.ui.qaTag +import org.thoughtcrime.securesms.ui.shimmerOverlay import org.thoughtcrime.securesms.ui.theme.LocalColors +import org.thoughtcrime.securesms.ui.theme.LocalDimensions +import org.thoughtcrime.securesms.ui.theme.LocalType +import org.thoughtcrime.securesms.ui.theme.PreviewTheme import org.thoughtcrime.securesms.ui.theme.SessionMaterialTheme +import org.thoughtcrime.securesms.ui.theme.blackAlpha40 +import org.thoughtcrime.securesms.util.DonationManager.Companion.URL_DONATE @Composable fun HomeDialogs( @@ -210,27 +247,8 @@ fun HomeDialogs( } if (showDonation && dialogsState.donationCTA) { - val context = LocalContext.current - SimpleSessionProCTA( - heroImage = R.drawable.cta_hero_flower, - title = Phrase.from(context,R.string.donateSessionHelp) - .put(StringSubstitutionConstants.APP_NAME_KEY, NonTranslatableStringConstants.APP_NAME) - .format() - .toString(), - showProBadge = false, - text = Phrase.from(context,R.string.donateSessionDescription) - .put(StringSubstitutionConstants.APP_NAME_KEY, NonTranslatableStringConstants.APP_NAME) - .format() - .toString(), - positiveButtonText = stringResource(R.string.donate), - negativeButtonText = stringResource(R.string.maybeLater), - onUpgrade = { - sendCommand(HideDonationCTADialog) - sendCommand(ShowDonationConfirmation) - }, - onCancel = { - sendCommand(HideDonationCTADialog) - } + DonationDialog( + sendCommand = sendCommand ) } @@ -245,3 +263,131 @@ fun HomeDialogs( } } +@Composable +fun DonationDialog( + sendCommand: (HomeViewModel.Commands) -> Unit +) { + val context = LocalContext.current + val onCancel = { + sendCommand(HideDonationCTADialog) + } + + val title = Phrase.from(context,R.string.donateSessionAppealTitle) + .put(StringSubstitutionConstants.DONATE_APPEAL_KEY, NonTranslatableStringConstants.DONATE_APPEAL_NAME) + .format() + + val text = Phrase.from(context,R.string.donateSessionAppealDescription) + .put(StringSubstitutionConstants.APP_NAME_KEY, NonTranslatableStringConstants.APP_NAME) + .format() + + val titleColor: Color = LocalColors.current.text + + BasicSessionAlertDialog( + onDismissRequest = onCancel, + content = { + DialogBg { + BoxWithConstraints(Modifier.fillMaxWidth()) { + val heroMaxHeight = maxHeight * 0.4f + Column( + modifier = Modifier.fillMaxWidth() + .verticalScroll(rememberScrollState()) + ) { + // hero image + BottomFadingEdgeBox( + modifier = Modifier.heightIn(max = heroMaxHeight), + fadingEdgeHeight = 70.dp, + fadingColor = LocalColors.current.backgroundSecondary, + content = { _ -> + CTAImage(heroImage = R.drawable.cta_hero_donation) + }, + ) + + // content + Column( + modifier = Modifier + .fillMaxWidth() + .padding(LocalDimensions.current.smallSpacing) + ) { + // title + Text( + modifier = Modifier + .align(Alignment.CenterHorizontally), + text = annotatedStringResource(title), + textAlign = TextAlign.Center, + style = LocalType.current.h5.copy(color = titleColor), + ) + + Spacer(Modifier.height(LocalDimensions.current.contentSpacing)) + + // main message + Text( + modifier = Modifier + .qaTag(R.string.qa_cta_body) + .align(Alignment.CenterHorizontally), + text = annotatedStringResource(text), + textAlign = TextAlign.Center, + style = LocalType.current.base.copy( + color = LocalColors.current.textSecondary + ) + ) + + Spacer(Modifier.height(LocalDimensions.current.contentSpacing)) + + // buttons + Row( + Modifier.height(IntrinsicSize.Min) + .fillMaxWidth(), + horizontalArrangement = Arrangement.spacedBy( + LocalDimensions.current.xsSpacing, + Alignment.CenterHorizontally + ), + ) { + AccentFillButtonRect( + modifier = Modifier + .qaTag(R.string.qa_cta_button_positive) + .shimmerOverlay(), + text = stringResource(R.string.donateSessionAppealReadMore), + onClick = { + context.openUrl(URL_DONATE) + sendCommand(HomeViewModel.Commands.OnDonationLinkClicked) + } + ) + } + } + } + + IconButton( + onClick = onCancel, + modifier = Modifier + .align(Alignment.TopEnd) + .padding(LocalDimensions.current.xxsSpacing) + .background( + color = blackAlpha40, + shape = CircleShape, + ).size(34.dp), + ) { + Icon( + painter = painterResource(id = R.drawable.ic_x), + tint = Color.White, + contentDescription = stringResource(R.string.close) + ) + } + } + } + } + ) +} + + +@Preview +@Composable +fun PreviewDonationDialog() { + PreviewTheme { + Column( + modifier = Modifier.fillMaxSize() + ) { + DonationDialog {} + } + } +} + diff --git a/app/src/main/java/org/thoughtcrime/securesms/home/HomeViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/home/HomeViewModel.kt index b4a1281707..20c7f91d21 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/home/HomeViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/home/HomeViewModel.kt @@ -406,8 +406,9 @@ class HomeViewModel @Inject constructor( _dialogsState.update { it.copy(donationCTA = false) } } - is Commands.ShowDonationConfirmation -> { - showUrlDialog(URL_DONATE) + is Commands.OnDonationLinkClicked -> { + donationManager.onDonationSeen() + _dialogsState.update { it.copy(donationCTA = false) } } is Commands.HideUrlDialog -> { @@ -533,7 +534,7 @@ class HomeViewModel @Inject constructor( data object HidePinCTADialog : Commands data object HideExpiringCTADialog : Commands data object HideExpiredCTADialog : Commands - data object ShowDonationConfirmation : Commands + data object OnDonationLinkClicked : Commands data object HideDonationCTADialog : Commands data object HideUserProfileModal : Commands data object HideUrlDialog : Commands diff --git a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java index 7cbff2d8f3..a7aedfb55d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/scribbles/ImageEditorFragment.java @@ -152,7 +152,11 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat @Override public void onSaveInstanceState(@NonNull Bundle outState) { super.onSaveInstanceState(outState); - new Data(outState).writeModel(imageEditorView.getModel()); + if (imageEditorView != null) { + new Data(outState).writeModel(imageEditorView.getModel()); + } else if (restoredModel != null) { + new Data(outState).writeModel(restoredModel); + } } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/DonationManager.kt b/app/src/main/java/org/thoughtcrime/securesms/util/DonationManager.kt index e9ac3fbf4b..96c24f4075 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/DonationManager.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/DonationManager.kt @@ -15,7 +15,7 @@ class DonationManager @Inject constructor( val prefs: TextSecurePreferences ){ companion object { - const val URL_DONATE = "https://getsession.org/donate#app" + const val URL_DONATE = "https://getsession.org/donate" } // increment in days between showing the donation CTA, matching the list index to the number of views of the CTA diff --git a/app/src/main/res/drawable-nodpi/cta_hero_donation.webp b/app/src/main/res/drawable-nodpi/cta_hero_donation.webp new file mode 100644 index 0000000000..b896ea1ec9 Binary files /dev/null and b/app/src/main/res/drawable-nodpi/cta_hero_donation.webp differ diff --git a/app/src/main/res/drawable-nodpi/cta_hero_flower.webp b/app/src/main/res/drawable-nodpi/cta_hero_flower.webp deleted file mode 100644 index b7fbe5ae9e..0000000000 Binary files a/app/src/main/res/drawable-nodpi/cta_hero_flower.webp and /dev/null differ diff --git a/app/src/main/res/values-b+cs+CZ/strings.xml b/app/src/main/res/values-b+cs+CZ/strings.xml index b9ee11f493..083a0330c9 100644 --- a/app/src/main/res/values-b+cs+CZ/strings.xml +++ b/app/src/main/res/values-b+cs+CZ/strings.xml @@ -487,6 +487,9 @@ Vaše zobrazované jméno je viditelné pro uživatele, skupiny a komunity, se kterými jste ve spojení. Dokument Darovat + Před osmi lety byla aplikace {app_name} založena s posláním obnovit vaše soukromí. Dnes aplikace {app_name} čelí nedostatku financí, který ohrožuje její samotnou existenci.\n\nPokud jste někdy v aplikaci {app_name} nebo v jejím poslání našli hodnotu, věnujte mi prosím chvilku svého času a přečtěte si tuto výzvu. + Přečíst výzvu + Přečtěte si prosím:\nOsobní výzva od {donate_appeal_name} Mocné síly se snaží oslabit soukromí, ale tento boj nemůžeme vést sami.\n\nPříspěvky pomáhají udržet aplikaci {app_name} bezpečnou, nezávislou a online. {app_name} potřebuje vaši pomoc Hotovo diff --git a/app/src/main/res/values-b+de+DE/strings.xml b/app/src/main/res/values-b+de+DE/strings.xml index 231d9e22d2..53a438f7fc 100644 --- a/app/src/main/res/values-b+de+DE/strings.xml +++ b/app/src/main/res/values-b+de+DE/strings.xml @@ -460,6 +460,9 @@ Ihr Anzeigename ist für Benutzer, Gruppen und Gemeinschaften sichtbar, mit denen Sie interagieren. Dokument Spenden + Vor acht Jahren wurde {app_name} mit der Mission gegründet, Ihre Privatsphäre wiederherzustellen. Heute hat {app_name} mit einem Finanzierungsengpass zu kämpfen, der das Überleben der App gefährdet.\n\nWenn {app_name} oder diese Mission für Sie jemals von Wert waren, bitte ich Sie um einen Moment Ihrer Zeit, diesen Spendenaufruf zu lesen. + Spendenaufruf lesen + Bitte lesen:\nEin persönlicher Spendenaufruf von {donate_appeal_name} Mächtige Kräfte versuchen, die Privatsphäre zu schwächen – aber wir können diesen Kampf nicht alleine führen.\n\nMit einer Spende hilfst du dabei, {app_name} sicher, unabhängig und online zu halten. {app_name} braucht deine Hilfe Fertig @@ -1179,6 +1182,8 @@ {app_name} bewerten? App bewerten Es freut uns, dass du {app_name} genießt! Wenn du einen Moment Zeit hast, hilft eine Bewertung im {storevariant} anderen dabei, private und sichere Nachrichten zu entdecken. + {app_name} schaltet keine Werbung, verkauft keine Nutzerdaten und ist nur seinen Nutzern gegenüber verantwortlich. Ihre Bewertung bei {storevariant} hilft anderen dabei, Nachrichtendienste zu finden, denen ihre Privatsphäre wirklich wichtig ist. + Bewerten Sie uns Gelesen Lesebestätigungen Zeige Lesebestätigungen für alle Nachrichten, die du sendest und erhältst. diff --git a/app/src/main/res/values-b+es+419/strings.xml b/app/src/main/res/values-b+es+419/strings.xml index 49c8231fcd..3b81474146 100644 --- a/app/src/main/res/values-b+es+419/strings.xml +++ b/app/src/main/res/values-b+es+419/strings.xml @@ -460,6 +460,9 @@ Tu nombre visible es visible para los usuarios, grupos y comunidades con los que interactúas. Documento Donar + Hace ocho años, se fundó {app_name} con la misión de restaurar su privacidad. Hoy, {app_name} se enfrenta a una escasez de financiación que pone en riesgo su propia supervivencia.\n\nSi alguna vez ha encontrado valor en {app_name} o en su misión, por favor dedíqueme un momento de su tiempo y lea este llamamiento. + Leer el llamamiento + Por favor, lea:\nUn llamamiento personal de {donate_appeal_name} Fuerzas poderosas intentan debilitar la privacidad, pero no podemos continuar esta lucha solos.\n\nDonar ayuda a mantener {app_name} seguro, independiente y en línea. {app_name} necesita tu ayuda Hecho diff --git a/app/src/main/res/values-b+es+ES/strings.xml b/app/src/main/res/values-b+es+ES/strings.xml index df6e346e8e..9e29ee2026 100644 --- a/app/src/main/res/values-b+es+ES/strings.xml +++ b/app/src/main/res/values-b+es+ES/strings.xml @@ -460,6 +460,9 @@ Tu nombre para mostrar es visible para los usuarios, grupos y comunidades con los que interactúas. Documento Donar + Hace ocho años, se fundó {app_name} con la misión de restaurar su privacidad. Hoy, {app_name} se enfrenta a una escasez de financiación que pone en riesgo su propia supervivencia.\n\nSi alguna vez ha encontrado valor en {app_name} o en su misión, por favor dedíqueme un momento de su tiempo y lea este llamamiento. + Leer el llamamiento + Por favor, lea:\nUn llamamiento personal de {donate_appeal_name} Fuerzas poderosas intentan debilitar la privacidad, pero no podemos continuar esta lucha solos.\n\nDonar ayuda a mantener {app_name} seguro, independiente y en línea. {app_name} necesita tu ayuda Hecho diff --git a/app/src/main/res/values-b+fr+FR/strings.xml b/app/src/main/res/values-b+fr+FR/strings.xml index ef1a39d945..32adcee953 100644 --- a/app/src/main/res/values-b+fr+FR/strings.xml +++ b/app/src/main/res/values-b+fr+FR/strings.xml @@ -460,6 +460,9 @@ Votre nom d\'affichage est visible par les utilisateurs, les groupes et les communautés avec lesquels vous interagissez. Document Faire un don + Il y a huit ans, {app_name} a été fondée avec pour mission de rétablir votre vie privée. Aujourd’hui, {app_name} fait face à un manque de financement qui met en péril sa survie même.\n\nSi {app_name} ou sa mission ont déjà eu de la valeur à vos yeux, accordez-moi un instant de votre temps et lisez cet appel. + Lire l’appel + À lire :\nAppel personnel de {donate_appeal_name} Des forces importantes cherchent à affaiblir la vie privée, mais nous ne pouvons poursuivre ce combat seuls.\n\nFaire un don permet à {app_name} de rester sécurisé, indépendant et accessible. {app_name} a besoin de votre aide Terminé diff --git a/app/src/main/res/values-b+hi+IN/strings.xml b/app/src/main/res/values-b+hi+IN/strings.xml index 8fe78913ec..b8d512456e 100644 --- a/app/src/main/res/values-b+hi+IN/strings.xml +++ b/app/src/main/res/values-b+hi+IN/strings.xml @@ -460,6 +460,9 @@ आपका डिस्प्ले नाम उन उपयोगकर्ताओं, समूहों और समुदायों को दिखाई देता है जिनके साथ आप संपर्क करते हैं। दस्तावेज़ दान करें + आठ साल पहले, {app_name} की स्थापना आपकी निजता को बहाल करने के मिशन के साथ की गई थी। आज, {app_name} को धन की कमी का सामना करना पड़ रहा है, जिससे उसके अस्तित्व पर ही खतरा मंडरा रहा है।\n\nअगर आपने कभी {app_name} या उसके मिशन में मूल्य पाया है, तो कृपया मुझे अपने समय का एक क्षण दें और इस अपील को पढ़ें। + अपील पढ़ें + कृपया पढ़ें:\n{donate_appeal_name} की ओर से एक व्यक्तिगत अपील शक्तिशाली ताकतें गोपनीयता को कमजोर करने का प्रयास कर रही हैं, लेकिन हम यह लड़ाई अकेले नहीं जारी रख सकते।\n\nदान करने से {app_name} को सुरक्षित, स्वतंत्र और ऑनलाइन बनाए रखने में मदद मिलती है। {app_name} को आपकी सहायता चाहिए पूरा हुआ @@ -1220,6 +1223,10 @@ सदस्य हटाएँ सदस्यों को हटाएँ + + सदस्य को हटाएं + सदस्यों को हटाएं + सदस्य और उनके संदेशों को हटाएं सदस्यों और उनके संदेशों को हटाएं diff --git a/app/src/main/res/values-b+hu+HU/strings.xml b/app/src/main/res/values-b+hu+HU/strings.xml index 945130c847..ad445a2b51 100644 --- a/app/src/main/res/values-b+hu+HU/strings.xml +++ b/app/src/main/res/values-b+hu+HU/strings.xml @@ -460,6 +460,9 @@ Az Ön megjelenítendő neve látható a felhaszálók, a csoportok és a közösségek számára, amelyekkel interakcióba lép. Dokumentum Adományozás + Nyolc évvel ezelőtt a(z) {app_name} azzal a küldetéssel jött létre, hogy helyreállítsa az Ön adatvédelmét. Ma a(z) {app_name} finanszírozási hiánnyal küzd, ami a fennmaradását is veszélyezteti.\n\nHa valaha értékesnek találta a(z) {app_name}-ot vagy annak küldetését, kérem, szánjon rám egy pillanatot, és olvassa el ezt a felhívást. + A felhívás elolvasása + Kérjük, olvassa el:\n{donate_appeal_name} személyes felhívása Hatalmas erők próbálják gyengíteni az adatvédelmet, de ezt a harcot nem tudjuk egyedül folytatni.\n\nA támogatásod segít megőrizni a(z) {app_name} biztonságát, függetlenségét és elérhetőségét. A(z) {app_name} a segítségedet kéri Kész diff --git a/app/src/main/res/values-b+it+IT/strings.xml b/app/src/main/res/values-b+it+IT/strings.xml index af92f875dc..b6c6ba92df 100644 --- a/app/src/main/res/values-b+it+IT/strings.xml +++ b/app/src/main/res/values-b+it+IT/strings.xml @@ -460,6 +460,9 @@ Il tuo Nome Pubblico è visibile agli utenti, ai gruppi e alle comunità con cui interagisci. Documento Dona + Otto anni fa, {app_name} è stata fondata con la missione di ripristinare la tua privacy. Oggi, {app_name} si trova ad affrontare una carenza di fondi che mette a rischio la sua stessa sopravvivenza.\n\nSe {app_name} o la sua missione hanno mai avuto valore per te, ti prego di dedicarmi un momento del tuo tempo e leggere questo appello. + Leggi l\'appello + Leggi attentamente:\nUn appello personale da parte di {donate_appeal_name} Forze potenti stanno cercando di indebolire la privacy, ma non possiamo continuare questa battaglia da soli.\n\nDonare aiuta a mantenere {app_name} sicuro, indipendente e online. {app_name} ha bisogno del tuo aiuto Fatto diff --git a/app/src/main/res/values-b+ja+JP/strings.xml b/app/src/main/res/values-b+ja+JP/strings.xml index 921ec75a43..82920478f6 100644 --- a/app/src/main/res/values-b+ja+JP/strings.xml +++ b/app/src/main/res/values-b+ja+JP/strings.xml @@ -446,6 +446,9 @@ あなたの表示名は、やり取りするユーザー、グループ、コミュニティに表示されます。 ドキュメント 寄付 + 8年前、{app_name}はあなたのプライバシーを取り戻すことを使命として設立されました。今日、{app_name}は資金不足に直面しており、その存続そのものが危機にさらされています。\n\n{app_name}やその使命に価値を感じたことがあるなら、少しだけお時間をいただき、この訴えをお読みください。 + 訴えを読む + お読みください:\n{donate_appeal_name}からの個人的な訴え 強大な勢力がプライバシーの弱体化を試みていますが、私たちだけではこの戦いを続けられません。\n\n寄付により、{app_name}の安全性、独立性、そしてオンライン維持を支援できます。 {app_name}へのご支援をお願いします 完了 diff --git a/app/src/main/res/values-b+nl+NL/strings.xml b/app/src/main/res/values-b+nl+NL/strings.xml index 503c6d887f..25341a31f1 100644 --- a/app/src/main/res/values-b+nl+NL/strings.xml +++ b/app/src/main/res/values-b+nl+NL/strings.xml @@ -460,6 +460,9 @@ Uw weergeven naam is zichtbaar voor gebruikers, groepen en gemeenschappen waarmee u communiceert. Document Doneer + Acht jaar geleden werd {app_name} opgericht met als missie uw privacy te herstellen. Vandaag kampt {app_name} met een financieringstekort, waardoor het voortbestaan ernstig in gevaar komt.\n\nAls u ooit waarde hebt gevonden in {app_name} of zijn missie, geef me dan alstublieft een moment van uw tijd en lees deze oproep. + Lees de oproep + Lees alstublieft:\nEen persoonlijke oproep van {donate_appeal_name} Krachtige machten proberen privacy te ondermijnen, maar we kunnen deze strijd niet alleen voeren.\n\nDonaties helpen om {app_name} veilig, onafhankelijk en online te houden. {app_name} heeft je hulp nodig Klaar diff --git a/app/src/main/res/values-b+pl+PL/strings.xml b/app/src/main/res/values-b+pl+PL/strings.xml index 265c0af7cf..aafed04c27 100644 --- a/app/src/main/res/values-b+pl+PL/strings.xml +++ b/app/src/main/res/values-b+pl+PL/strings.xml @@ -488,6 +488,9 @@ Wyświetlana nazwa użytkownika jest widoczna dla użytkowników, grup i społeczności, z którymi użytkownik wchodzi w interakcje. Dokument Wspomóż + Osiem lat temu {app_name} powstała z misją przywrócenia Ci prywatności. Dziś {app_name} boryka się z niedoborem funduszy, który zagraża jej dalszemu istnieniu.\n\nJeśli kiedykolwiek dostrzegłeś(-aś) wartość w {app_name} lub jej misji, poświęć mi proszę chwilę i przeczytaj ten apel. + Przeczytaj apel + Prosimy przeczytać:\nOsobisty apel od {donate_appeal_name} Potężne siły próbują osłabić prywatność, ale nie możemy prowadzić tej walki sami.\n\nTwoja darowizna pomoże utrzymać {app_name} jako bezpieczną, niezależną i działającą aplikację. {app_name} potrzebuje Twojej pomocy Gotowe diff --git a/app/src/main/res/values-b+pt+BR/strings.xml b/app/src/main/res/values-b+pt+BR/strings.xml index 59d3679704..7f508a72f0 100644 --- a/app/src/main/res/values-b+pt+BR/strings.xml +++ b/app/src/main/res/values-b+pt+BR/strings.xml @@ -460,6 +460,9 @@ Seu Nome de Exibição é visível para usuários, grupos e comunidades com os quais você interage. Documento Doar + Há oito anos, o {app_name} foi fundado com a missão de restaurar a sua privacidade. Hoje, o {app_name} enfrenta uma falta de recursos que coloca em risco a sua própria sobrevivência.\n\nSe você já viu valor no {app_name} ou em sua missão, por favor, me conceda um momento do seu tempo e leia este apelo. + Ler apelo + Leia, por favor:\nUm apelo pessoal de {donate_appeal_name} Forças poderosas estão tentando enfraquecer a privacidade, mas não podemos continuar essa luta sozinhos.\n\nDoar ajuda a manter o {app_name} seguro, independente e online. {app_name} precisa da sua ajuda Pronto diff --git a/app/src/main/res/values-b+pt+PT/strings.xml b/app/src/main/res/values-b+pt+PT/strings.xml index 80ac66fefe..68491b3002 100644 --- a/app/src/main/res/values-b+pt+PT/strings.xml +++ b/app/src/main/res/values-b+pt+PT/strings.xml @@ -460,6 +460,9 @@ Seu Nome de Exibição é visível para usuários, grupos e comunidades com os quais você interage. Documento Fazer uma doação + Há oito anos, {app_name} foi fundado com a missão de restaurar a sua privacidade. Hoje, {app_name} enfrenta uma falta de financiamento que coloca a sua própria sobrevivência em risco.\n\nSe você já encontrou valor em {app_name} ou em sua missão, por favor, me conceda um momento do seu tempo e leia este apelo. + Ler apelo + Por favor, leia:\nUm apelo pessoal de {donate_appeal_name} Forças poderosas estão tentando enfraquecer a privacidade, mas não podemos continuar esta luta sozinhos.\n\nDoar ajuda a manter o {app_name} seguro, independente e online. {app_name} precisa da sua ajuda Concluído diff --git a/app/src/main/res/values-b+ro+RO/strings.xml b/app/src/main/res/values-b+ro+RO/strings.xml index ad133d7c3b..a2c87c6e13 100644 --- a/app/src/main/res/values-b+ro+RO/strings.xml +++ b/app/src/main/res/values-b+ro+RO/strings.xml @@ -474,6 +474,9 @@ Numele tău de afișare este vizibil utilizatorilor, grupurilor și comunităților cu care interacționezi. Document Donează + Acum opt ani, {app_name} a fost fondată cu misiunea de a vă reda confidențialitatea. Astăzi, {app_name} se confruntă cu un deficit de finanțare care îi pune însăși supraviețuirea în pericol.\n\nDacă {app_name} sau misiunea sa au avut vreodată valoare pentru dumneavoastră, vă rog să-mi acordați un moment din timpul dumneavoastră și să citiți acest apel. + Citiți apelul + Vă rugăm să citiți:\nUn apel personal din partea lui {donate_appeal_name} Forțe puternice încearcă să slăbească confidențialitatea, dar nu putem duce această luptă singuri.\n\nDonațiile ajută la menținerea {app_name} sigur, independent și online. {app_name} are nevoie de ajutorul tău Terminat diff --git a/app/src/main/res/values-b+ru+RU/strings.xml b/app/src/main/res/values-b+ru+RU/strings.xml index 4a19842278..92c6140336 100644 --- a/app/src/main/res/values-b+ru+RU/strings.xml +++ b/app/src/main/res/values-b+ru+RU/strings.xml @@ -488,6 +488,9 @@ Ваше отображаемое имя видно пользователям, группам и сообществам, с которыми вы взаимодействуете. Документ Донат + Восемь лет назад {app_name} был создан с миссией вернуть вам конфиденциальность. Сегодня {app_name} столкнулся с нехваткой финансирования, что ставит под угрозу само его существование.\n\nЕсли {app_name} или его миссия когда-либо были для вас ценны, пожалуйста, уделите мне немного времени и прочитайте это обращение. + Прочитать обращение + Пожалуйста, прочитайте:\nЛичное обращение от {donate_appeal_name} Могущественные силы пытаются ослабить конфиденциальность, но мы не можем продолжать эту борьбу в одиночку.\n\nВаши пожертвования помогают сохранять безопасность, независимость и доступность {app_name}. {app_name} нуждается в вашей помощи Готово diff --git a/app/src/main/res/values-b+sv+SE/strings.xml b/app/src/main/res/values-b+sv+SE/strings.xml index df3d7661f5..d7d1b106dc 100644 --- a/app/src/main/res/values-b+sv+SE/strings.xml +++ b/app/src/main/res/values-b+sv+SE/strings.xml @@ -460,6 +460,9 @@ Ditt visningsnamn är synligt för användare, grupper och samhällen du interagerar med. Dokument Donera + För åtta år sedan grundades {app_name} med uppdraget att återställa din integritet. Idag står {app_name} inför en finansieringsbrist som riskerar dess överlevnad.\n\nOm du någonsin har sett värde i {app_name} eller dess uppdrag, ge mig gärna en stund av din tid och läs denna vädjan. + Läs vädjan + Vänligen läs:\nEn personlig vädjan från {donate_appeal_name} Starka krafter försöker försvaga den personliga integriteten, men vi kan inte fortsätta kampen ensamma.\n\nAtt donera hjälper till att hålla {app_name} säker, oberoende och online. {app_name} behöver din hjälp Klar diff --git a/app/src/main/res/values-b+zh+CN/strings.xml b/app/src/main/res/values-b+zh+CN/strings.xml index b94e11d583..87b0c7c5dc 100644 --- a/app/src/main/res/values-b+zh+CN/strings.xml +++ b/app/src/main/res/values-b+zh+CN/strings.xml @@ -446,6 +446,9 @@ 您的显示名称对与您互动的用户、群组和社区可见。 文档 捐赠 + 八年前,{app_name} 带着恢复您的隐私这一使命成立。如今,{app_name} 面临资金短缺,这使其生存本身也岌岌可危。\n\n如果您曾从 {app_name} 或其使命中获得过价值,请给我一点时间,读一读这封呼吁。 + 阅读呼吁 + 请阅读:\n来自 {donate_appeal_name} 的个人呼吁 有强大的势力正试图削弱隐私保护,但我们无法独自应对这场战斗。\n\n捐赠有助于保持 {app_name} 的安全性、独立性和在线状态。 {app_name} 需要您的帮助 完成 @@ -958,6 +961,7 @@ 通知效果预览 预览通知 你的 {pro} 访问权限已激活!\n\n你的 {pro} 访问将在 {date} 自动续订 {current_plan_length} + 您的 {pro} 访问权限将在 {date} 过期。\n\n请立即更新你的 {pro} 访问权限确保在你的 {pro} 访问权限到期前自动续订。 你的 {pro} 访问权限已激活!\n\n你的 {pro} 访问将在 {date} 自动续订 \n{current_plan_length}。你在此所做的更改将在下次续订时生效。 {pro} 访问错误 您的 {pro} 访问权限将于 {date} 到期。 @@ -1006,7 +1010,9 @@ 想要固定超过 {limit} 个对话?\n使用 {app_pro} Beta 整理您的对话并解锁高级功能 很遗憾看到您取消 {pro}。在取消您的 {pro} 访问之前,请了解以下信息。 取消 + 取消 {pro} 访问将阻止在 {pro} 到期前自动续订。取消 {pro} 会导致退款。在您的 {pro} 到期之前,您仍然可以使用 {app_pro} 功能。\n\n由于您最初是通过 {platform_account} 注册 {app_pro} 的,您需要使用相同的 {platform_account} 来取消 {pro}。 取消 {pro} 访问的两种方式: + 取消 {pro} 访问权限将阻止在 {pro} 到期前自动续订。\n\n取消 {pro} 不会导致退款。在 {pro} 到期前,您仍可继续使用 {app_pro} 功能。 选择适合您的 {pro} 访问选项。\n访问时间越长,折扣越大。 您确定要从此设备中删除您的数据吗?\n\n{app_pro} 无法转移至其他账户。请务必保存您的恢复密码,以确保您之后可以恢复对 {pro} 的访问权限。 您确定要从网络中删除您的数据吗?继续操作将无法恢复您的消息或联系人。\n\n{app_pro} 无法转移至其他账户。请务必保存您的恢复密码,以确保您之后可以恢复对 {pro} 的访问权限。 @@ -1098,6 +1104,7 @@ 无限置顶消息 使用无限置顶消息,整理你的所有聊天。 您当前的账单选项包括 {current_plan_length} 的 {pro} 访问权限。您确定要切换到 {selected_plan_length_singular} 的账单选项吗?\n\n更新后,您的 {pro} 访问权限将在 {date} 自动续订,新增 {selected_plan_length} 的 {pro} 访问时长。 + 您的 {pro} 访问权限将于 {date} 到期。\n\n更新后,您的 {pro} 访问权限将在 {date} 自动续订,延长 {selected_plan_length} 的 {pro} 使用时间。 正在更新 升级至 {app_pro} Beta,获取大量专属福利和功能。 请在通过 {platform_store} 或 {platform_store_other} 安装了 {app_name} 的关联设备上的 {app_pro} 设置中升级至 {pro}。 @@ -1138,6 +1145,8 @@ 给 {app_name} 评分? 评分应用 很高兴您喜欢 {app_name},如果方便的话,请在 {storevariant} 上为我们评分,这将帮助他人发现私密、安全的消息方式! + {app_name} 不包含广告、不出售数据,并且只对用户负责。您在 {storevariant} 上的评分有助于更多人发现真正尊重隐私的消息应用。 + 为我们评分 已读 已读回执 显示您发送和接收的所有消息的已读回执。 diff --git a/app/src/main/res/values-b+zh+TW/strings.xml b/app/src/main/res/values-b+zh+TW/strings.xml index deca8c8017..a8f377c84c 100644 --- a/app/src/main/res/values-b+zh+TW/strings.xml +++ b/app/src/main/res/values-b+zh+TW/strings.xml @@ -391,6 +391,9 @@ 您的顯示名稱對您互動的用戶、群組和社群可見。 文件 捐款 + 八年前,{app_name} 創立時肩負著恢復您隱私的使命。如今,{app_name} 面臨資金短缺,使其生存本身岌岌可危。\n\n如果您曾從 {app_name} 或其使命中獲得價值,請給我一點您的時間,讀一讀這份呼籲。 + 閱讀呼籲 + 請閱讀:\n來自 {donate_appeal_name} 的個人呼籲 完成 下載 下載中… diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 3001c61ac7..337fc8c22f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -465,6 +465,9 @@ Your Display Name is visible to users, groups, and communities you interact with. Document Donate + Eight years ago, {app_name} was founded with a mission to restore your privacy. Today, {app_name} faces a funding shortage which puts its very survival at risk.\n\nIf you’ve ever found value in {app_name} or its mission, please give me a moment of your time and read this appeal. + Read Appeal + Please Read:\nA Personal Appeal From {donate_appeal_name} Powerful forces are trying to weaken privacy, but we can’t continue this fight alone.\n\nDonating helps keep {app_name} secure, independent, and online. {app_name} Needs Your Help Done