diff --git a/app/src/main/java/com/infomaniak/mail/data/cache/userInfo/MergedContactController.kt b/app/src/main/java/com/infomaniak/mail/data/cache/userInfo/MergedContactController.kt index a48addddd87..b9c29063f2e 100644 --- a/app/src/main/java/com/infomaniak/mail/data/cache/userInfo/MergedContactController.kt +++ b/app/src/main/java/com/infomaniak/mail/data/cache/userInfo/MergedContactController.kt @@ -54,6 +54,10 @@ class MergedContactController @Inject constructor(@UserInfoRealm private val use .sort(MergedContact::name.name) .sort(MergedContact::comesFromApi.name, Sort.DESCENDING) } + + private fun getMergedContactFromEmailQuery(email: String): RealmQuery { + return userInfoRealm.query("${MergedContact::email.name} == $0", email) + } //endregion //region Get data @@ -69,6 +73,10 @@ class MergedContactController @Inject constructor(@UserInfoRealm private val use return getMergedContactFromAddressBookQuery(contact).find().map { it } } + fun getMergedContactFromEmail(email: String): MergedContact? { + return getMergedContactFromEmailQuery(email).find().firstOrNull() + } + fun getMergedContactsAsync(): Flow> { return getMergedContactsQuery().asFlow() } diff --git a/app/src/main/java/com/infomaniak/mail/ui/newMessage/BackspaceAwareTextInput.kt b/app/src/main/java/com/infomaniak/mail/ui/newMessage/BackspaceAwareTextInput.kt index fcbb19894cd..09ff472159c 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/newMessage/BackspaceAwareTextInput.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/newMessage/BackspaceAwareTextInput.kt @@ -17,9 +17,11 @@ */ package com.infomaniak.mail.ui.newMessage +import android.content.ClipboardManager import android.content.Context import android.util.AttributeSet import android.view.KeyEvent +import android.R as Randroid import com.google.android.material.textfield.TextInputEditText class BackspaceAwareTextInput @JvmOverloads constructor( @@ -28,13 +30,32 @@ class BackspaceAwareTextInput @JvmOverloads constructor( ) : TextInputEditText(context, attrs) { private var backspaceOnEmptyField: () -> Unit = {} + private var onPasteIntercept: ((String) -> Boolean)? = null override fun onKeyDown(keyCode: Int, event: KeyEvent?): Boolean { if (keyCode == KeyEvent.KEYCODE_DEL && text.isNullOrEmpty()) backspaceOnEmptyField() return super.onKeyDown(keyCode, event) } + override fun onTextContextMenuItem(id: Int): Boolean { + if (id == Randroid.id.paste) { + val clipboard = context.getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager + val clip = clipboard.primaryClip + + if (clip != null && clip.itemCount > 0) { + val pastedText = clip.getItemAt(0).text?.toString() ?: "" + if (onPasteIntercept?.invoke(pastedText) == true) return true + } + } + + return super.onTextContextMenuItem(id) + } + fun setBackspaceOnEmptyFieldListener(listener: () -> Unit) { backspaceOnEmptyField = listener } + + fun setOnPasteInterceptListener(listener: (String) -> Boolean) { + onPasteIntercept = listener + } } diff --git a/app/src/main/java/com/infomaniak/mail/ui/newMessage/ContactChipAdapter.kt b/app/src/main/java/com/infomaniak/mail/ui/newMessage/ContactChipAdapter.kt index 086a0153348..e56ef96b5d6 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/newMessage/ContactChipAdapter.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/newMessage/ContactChipAdapter.kt @@ -74,6 +74,14 @@ class ContactChipAdapter( } } + fun addChips(newRecipients: List): Int { + var added = 0 + newRecipients.forEach { recipient -> if (recipients.add(recipient)) added++ } + if (added > 0) notifyItemRangeInserted(itemCount - added, added) + + return added + } + fun removeChip(recipient: Recipient) { val index = recipients.indexOf(recipient) recipients.remove(recipient) diff --git a/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageRecipientFieldsManager.kt b/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageRecipientFieldsManager.kt index 65d6cd6c209..95f298f04c0 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageRecipientFieldsManager.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageRecipientFieldsManager.kt @@ -74,6 +74,7 @@ class NewMessageRecipientFieldsManager @Inject constructor(private val snackbarM getAddressBookWithGroupCallback = newMessageViewModel::getAddressBookWithName, getMergedContactFromContactGroupCallback = newMessageViewModel::getMergedContactFromContactGroup, getMergedContactFromAddressBookCallback = newMessageViewModel::getMergedContactFromAddressBook, + getMergedContactFromEmailCallback = newMessageViewModel::getMergedContactFromEmail ), ) @@ -88,6 +89,7 @@ class NewMessageRecipientFieldsManager @Inject constructor(private val snackbarM getAddressBookWithGroupCallback = newMessageViewModel::getAddressBookWithName, getMergedContactFromContactGroupCallback = newMessageViewModel::getMergedContactFromContactGroup, getMergedContactFromAddressBookCallback = newMessageViewModel::getMergedContactFromAddressBook, + getMergedContactFromEmailCallback = newMessageViewModel::getMergedContactFromEmail ) ) @@ -102,6 +104,7 @@ class NewMessageRecipientFieldsManager @Inject constructor(private val snackbarM getAddressBookWithGroupCallback = newMessageViewModel::getAddressBookWithName, getMergedContactFromContactGroupCallback = newMessageViewModel::getMergedContactFromContactGroup, getMergedContactFromAddressBookCallback = newMessageViewModel::getMergedContactFromAddressBook, + getMergedContactFromEmailCallback = newMessageViewModel::getMergedContactFromEmail ) ) } diff --git a/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageViewModel.kt b/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageViewModel.kt index 93a7fccd522..4c809f69bc2 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageViewModel.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/newMessage/NewMessageViewModel.kt @@ -416,6 +416,10 @@ class NewMessageViewModel @Inject constructor( return mergedContactController.getMergedContactFromAddressBook(addressBook) } + fun getMergedContactFromEmail(email: String): MergedContact? { + return mergedContactController.getMergedContactFromEmail(email) + } + private fun saveNavArgsToSavedState(localUuid: String) { savedStateHandle[NewMessageActivityArgs::draftLocalUuid.name] = localUuid diff --git a/app/src/main/java/com/infomaniak/mail/ui/newMessage/RecipientFieldView.kt b/app/src/main/java/com/infomaniak/mail/ui/newMessage/RecipientFieldView.kt index 21a30f87b1a..c1be9775912 100644 --- a/app/src/main/java/com/infomaniak/mail/ui/newMessage/RecipientFieldView.kt +++ b/app/src/main/java/com/infomaniak/mail/ui/newMessage/RecipientFieldView.kt @@ -121,6 +121,7 @@ class RecipientFieldView @JvmOverloads constructor( private var getAddressBookWithGroup: ((ContactGroup) -> AddressBook?)? = null private var getMergedContactFromContactGroup: ((ContactGroup) -> List)? = null private var getMergedContactFromAddressBook: ((AddressBook) -> List)? = null + private var getMergedContactFromEmail: ((String) -> MergedContact?)? = null @Inject lateinit var snackbarManager: SnackbarManager @@ -163,7 +164,7 @@ class RecipientFieldView @JvmOverloads constructor( onContactClicked = ::contactClicked, onAddUnrecognizedContact = { val input = textInput.text.toString() - addRecipient(email = input, name = input) + addRecipientsFromInput(input = input) }, snackbarManager = snackbarManager, getAddressBookWithGroup = { getAddressBookWithGroup?.invoke(it) }, @@ -174,8 +175,7 @@ class RecipientFieldView @JvmOverloads constructor( onBackspace = { recipient -> removeRecipient(recipient) focusTextField() - } - ) + }) isSelfCollapsed = true @@ -184,6 +184,7 @@ class RecipientFieldView @JvmOverloads constructor( setToggleRelatedListeners() setTextInputListeners() setPopupMenuListeners() + setPasteListeners(textInput) if (isInEditMode) { singleChip.root.isVisible = canCollapseEverything @@ -260,7 +261,11 @@ class RecipientFieldView @JvmOverloads constructor( setOnEditorActionListener { _, actionId, _ -> if (actionId == EditorInfo.IME_ACTION_DONE && text?.isNotBlank() == true) { - contactAdapter.addFirstAvailableItem() + if (isAutoCompletionOpened && contactAdapter.itemCount > 0) { + contactAdapter.addFirstAvailableItem() + } else { + addRecipientsFromInput(text.toString()) + } } true // Keep keyboard open } @@ -286,6 +291,17 @@ class RecipientFieldView @JvmOverloads constructor( } } + private fun setPasteListeners(textInput: BackspaceAwareTextInput) { + textInput.setOnPasteInterceptListener { pastedText -> + if (pastedText.contains(EMAIL_SEPARATORS_REGEX)) { + addRecipientsFromInput(pastedText) + true + } else { + false + } + } + } + private fun focusLastChip() { val count = contactChipAdapter.itemCount // chipsRecyclerView.children.last() won't work because they are not always ordered correctly @@ -379,21 +395,17 @@ class RecipientFieldView @JvmOverloads constructor( } private fun addRecipient(email: String, name: String) { - if (!email.isEmail()) { snackbarManager.setValue(context.getString(R.string.addUnknownRecipientInvalidEmail)) return } - if (contactChipAdapter.itemCount > MAX_ALLOWED_RECIPIENT) { + if (contactChipAdapter.itemCount >= MAX_ALLOWED_RECIPIENT) { snackbarManager.setValue(context.getString(R.string.tooManyRecipients)) return } - if (contactChipAdapter.isEmpty()) { - expand() - binding.chipsRecyclerView.isVisible = true - } + updateChipsVisibility() val recipientIsNew = contactAdapter.addUsedContact(email) if (recipientIsNew) { @@ -404,6 +416,137 @@ class RecipientFieldView @JvmOverloads constructor( } } + private fun addMultipleRecipients(recipients: List>) { + if (recipients.isEmpty()) return + + val availableSlots = (MAX_ALLOWED_RECIPIENT - contactChipAdapter.itemCount).coerceAtLeast(0) + val result = processRecipients(recipients, availableSlots) + + showWarningSnackbars( + initialRecipientsSize = recipients.size, + initialAvailableSlots = availableSlots, + duplicateCount = result.duplicateCount, + outOfSpaceCount = result.outOfSpaceCount + ) + + updateChipsVisibility() + + contactChipAdapter.addChips(result.acceptedRecipients) + result.acceptedRecipients.forEach { onContactAdded?.invoke(it) } + + clearField() + } + + private fun processRecipients( + recipients: List>, + initialAvailableSlots: Int + ): ProcessedRecipientsResult { + var availableSlots = initialAvailableSlots + var duplicateCount = 0 + var outOfSpaceCount = 0 + + val acceptedRecipients = buildList { + for ((name, email) in recipients) { + if (availableSlots <= 0) { + outOfSpaceCount++ + continue + } + + if (!contactAdapter.addUsedContact(email)) { + duplicateCount++ + continue + } + + availableSlots-- + add(Recipient().initLocalValues(email, name)) + } + } + + return ProcessedRecipientsResult(acceptedRecipients, duplicateCount, outOfSpaceCount) + } + + private fun showWarningSnackbars( + initialRecipientsSize: Int, + initialAvailableSlots: Int, + duplicateCount: Int, + outOfSpaceCount: Int + ) { + if (initialAvailableSlots == 0) { + snackbarManager.setValue( + context.resources.getQuantityString( + R.plurals.tooManyRecipientsPaste, + initialRecipientsSize, + initialRecipientsSize + ) + ) + return + } + + if (outOfSpaceCount > 0) { + snackbarManager.setValue( + context.resources.getQuantityString( + R.plurals.tooManyRecipientsPaste, + outOfSpaceCount, + outOfSpaceCount + ) + ) + return + } + + if (duplicateCount > 0) { + snackbarManager.setValue( + context.resources.getQuantityString( + R.plurals.addMultipleDuplicateEmails, + duplicateCount, + duplicateCount + ) + ) + return + } + } + + private fun updateChipsVisibility() { + if (contactChipAdapter.isEmpty()) { + expand() + binding.chipsRecyclerView.isVisible = true + } + } + + fun getContactName(email: String): String { + return getMergedContactFromEmail?.invoke(email)?.name ?: email + } + + private fun addRecipientsFromInput(input: String) { + val potentialEmails = input.split(EMAIL_SEPARATORS_REGEX).filter { it.isNotBlank() }.map { it.trim() } + + val emailsToAdd = mutableListOf() + val invalidEmails = mutableListOf() + + potentialEmails.forEach { email -> + if (email.isEmail()) { + emailsToAdd.add(email) + } else { + invalidEmails.add(email) + } + } + + val recipientsToAdd = emailsToAdd.map { email -> + getContactName(email) to email + } + + addMultipleRecipients(recipientsToAdd) + + if (invalidEmails.isNotEmpty()) { + snackbarManager.setValue( + context.resources.getQuantityString( + R.plurals.addMultipleInvalidEmails, + invalidEmails.size, + invalidEmails.size + ) + ) + } + } + private fun showContactContextMenu(recipient: Recipient, anchor: BackspaceAwareChip, isForSingleChip: Boolean = false) { contextMenuBinding.contactDetails.setCorrespondent(recipient) @@ -443,6 +586,7 @@ class RecipientFieldView @JvmOverloads constructor( getAddressBookWithGroup = getAddressBookWithGroupCallback getMergedContactFromContactGroup = getMergedContactFromContactGroupCallback getMergedContactFromAddressBook = getMergedContactFromAddressBookCallback + getMergedContactFromEmail = getMergedContactFromEmailCallback gotFocus = gotFocusCallback } } @@ -512,7 +656,8 @@ class RecipientFieldView @JvmOverloads constructor( val onToggleEverythingCallback: ((isCollapsed: Boolean) -> Unit)? = null, val getAddressBookWithGroupCallback: (ContactGroup) -> AddressBook?, val getMergedContactFromContactGroupCallback: (ContactGroup) -> List, - val getMergedContactFromAddressBookCallback: (AddressBook) -> List + val getMergedContactFromAddressBookCallback: (AddressBook) -> List, + val getMergedContactFromEmailCallback: ((String) -> MergedContact?)? ) companion object { @@ -520,6 +665,7 @@ class RecipientFieldView @JvmOverloads constructor( private const val MAX_ALLOWED_RECIPIENT = 99 private const val EXTERNAL_CHIP_STROKE_WIDTH = 1 private const val NO_STROKE = 0.0f + private val EMAIL_SEPARATORS_REGEX = Regex("""[,;\s\r\n]+""") fun Chip.setChipStyle(displayAsExternal: Boolean, encryptionStatus: EncryptionStatus) = when { encryptionStatus == EncryptionStatus.Encrypted -> { @@ -548,6 +694,12 @@ class RecipientFieldView @JvmOverloads constructor( }.applyTo(this) } + private data class ProcessedRecipientsResult( + val acceptedRecipients: List, + val duplicateCount: Int, + val outOfSpaceCount: Int + ) + private data class ChipStyle( val backgroundColor: Int, val textColor: Int, diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index c38fa7696ec..945560473c2 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -48,6 +48,14 @@ Vis i mørk tema Vis i lyst tema Tekst til visning + + %d email er allerede blevet tilføjet + %d emails er allerede blevet tilføjet + + + %d email er ugyldig + %d emails er ugyldige + E-mailadressen er allerede i brug E-mailadressen er ugyldig Tilføj en modtager @@ -661,6 +669,10 @@ Til: I morgen tidlig Du kan ikke tilføje denne adresse, fordi du har nået grænsen for modtagere + + %d adresse kunne ikke tilføjes, fordi du har nået grænsen for modtagere + %d adresser kunne ikke tilføjes, fordi du har nået grænsen for modtagere + Papirkurv Fjern blokering Ukendt afsender diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index 38d0c348c62..d76eb506909 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -48,6 +48,14 @@ Ansicht im dunklen Thema Ansicht im hellen Thema Anzuzeigender Text + + %d E-Mail wurde bereits hinzugefügt + %d E-Mails wurden bereits hinzugefügt + + + %d E-Mail ist ungültig + %d E-Mails sind ungültig + Die E-Mail wird bereits verwendet Die E-Mail ist ungültig Einen Empfänger hinzufügen @@ -661,6 +669,10 @@ An: Morgen früh Sie können diese Adresse nicht hinzufügen, da Sie die Höchstzahl an Empfängern erreicht haben + + %d Adresse konnte nicht hinzugefügt werden, da Sie das Empfängerlimit erreicht haben + %d Adressen konnten nicht hinzugefügt werden, da Sie das Empfängerlimit erreicht haben + Papierkorb Entsperren Unbekannter Spediteur diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index a3ec193a193..10f19596fe6 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -48,6 +48,14 @@ Προβολή σε σκούρο θέμα Προβολή σε φωτεινό θέμα Κείμενο για εμφάνιση + + %d email έχει ήδη προστεθεί + %d emails έχουν ήδη προστεθεί + + + %d email είναι μη έγκυρο + %d emails είναι μη έγκυρα + Το e-mail χρησιμοποιείται ήδη Το e-mail δεν είναι έγκυρο Προσθήκη παραλήπτη @@ -661,6 +669,10 @@ Προς: Αύριο το πρωί Δεν μπορείτε να προσθέσετε αυτή τη διεύθυνση γιατί έχετε φτάσει το όριο παραληπτών + + %d διεύθυνση δεν μπόρεσε να προστεθεί επειδή έχετε φτάσει στο όριο των παραληπτών + %d διευθύνσεις δεν μπόρεσαν να προστεθούν επειδή έχετε φτάσει στο όριο των παραληπτών + Κάδος απορριμμάτων Ξεμπλοκάρισμα Άγνωστος αποστολέας diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 8111d7cbdeb..4aebd348f4e 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -48,6 +48,14 @@ Ver en tema oscuro Ver en tema claro Texto a mostrar + + %d email ya se ha añadido + %d emails ya se han añadido + + + %d email no es válido + %d emails no son válidos + El correo electrónico ya está utilizado El correo electrónico no es válido Añadir un destinatario @@ -661,6 +669,10 @@ Para: Mañana por la mañana No puede añadir esta dirección porque ha alcanzado el límite de destinatarios + + %d dirección no se ha podido añadir porque has alcanzado el límite de destinatarios + %d direcciones no se han podido añadir porque has alcanzado el límite de destinatarios + Papelera Desbloquear Expedidor desconocido diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index bd29e2881cf..d6253b35e30 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -48,6 +48,14 @@ Näytä tummassa teemassa Näytä vaaleassa teemassa Näytettävä teksti + + %d email on jo lisätty + %d emailia on jo lisätty + + + %d email on virheellinen + %d emailia ovat virheellisiä + Sähköpostiosoite on jo käytössä Sähköpostiosoite on virheellinen Lisää vastaanottaja @@ -661,6 +669,10 @@ Vastaanottaja: Huomenna aamulla Et voi lisätä tätä osoitetta, koska olet saavuttanut vastaanottajien rajan + + %d osoite ei voitu lisätä, koska olet saavuttanut vastaanottajien enimmäismäärän + %d osoitetta ei voitu lisätä, koska olet saavuttanut vastaanottajien enimmäismäärän + Roskakori Poista esto Tuntematon lähettäjä diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index 237020638a0..9ae0577728e 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -48,6 +48,14 @@ Voir en thème sombre Voir en thème clair Texte à afficher + + %d e-mail a déjà été ajouté + %d e-mails ont déjà été ajoutés + + + %d e-mail est invalide + %d e-mails sont invalides + L’adresse mail est déjà utilisée L’adresse mail n’est pas valide Ajouter un destinataire @@ -661,6 +669,10 @@ À : Demain matin Vous ne pouvez pas ajouter cette adresse car vous avez atteint la limite de destinataires + + %d adresse n’a pas pu être ajoutée car vous avez atteint la limite de destinataires + %d adresses n’ont pas pu être ajoutées car vous avez atteint la limite de destinataires + Corbeille Débloquer Expéditeur inconnu diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index a85a370073d..79bb851c340 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -48,6 +48,14 @@ Visualizzazione in tema scuro Vista in tema chiaro Testo da visualizzare + + %d email è già stato aggiunto + %d email sono già stati aggiunti + + + %d email non è valido + %d email non sono validi + L’e-mail è già utilizzata L’e-mail non è valida Aggiungi un destinatario @@ -661,6 +669,10 @@ A: Domani mattina Non è possibile aggiungere questo indirizzo perché è stato raggiunto il limite di destinatari + + %d indirizzo non ha potuto essere aggiunto perché hai raggiunto il limite dei destinatari + %d indirizzi non hanno potuto essere aggiunti perché hai raggiunto il limite dei destinatari + Cestino Sbloccare Spedizioniere sconosciuto diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index c695dc6806a..5d8dd58e63b 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -48,6 +48,14 @@ Vis i mørkt tema Vis i lyst tema Tekst å vise + + %d email er allerede lagt til + %d emails er allerede lagt til + + + %d email er ugyldig + %d emails er ugyldige + E-postadressen er allerede i bruk E-postadressen er ugyldig Legg til mottaker @@ -661,6 +669,10 @@ Til: I morgen tidlig Du kan ikke legge til denne adressen fordi du har nådd grensen for mottakere + + %d adresse kunne ikke legges til fordi du har nått grensen for mottakere + %d adresser kunne ikke legges til fordi du har nått grensen for mottakere + Papirkurv Opphev blokkering Ukjent avsender diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index b678be346c2..334bd7f9abd 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -48,6 +48,14 @@ Weergeven in donker thema Weergeven in licht thema Weer te geven tekst + + %d email is al toegevoegd + %d emails zijn al toegevoegd + + + %d email is ongeldig + %d emails zijn ongeldig + Het e-mailadres wordt al gebruikt Het e-mailadres is ongeldig Een ontvanger toevoegen @@ -661,6 +669,10 @@ Aan: Morgenochtend U kunt dit adres niet toevoegen omdat u de limiet van ontvangers heeft bereikt + + %d adres kon niet worden toegevoegd omdat u de limiet voor ontvangers heeft bereikt + %d adressen konden niet worden toegevoegd omdat u de limiet voor ontvangers heeft bereikt + Prullenbak Deblokkeren Onbekende afzender diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index af9d595dde4..ca2c9269248 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -48,6 +48,18 @@ Zobacz w ciemnym motywie Zobacz w jasnym motywie Tekst do wyświetlenia + + %d email został już dodany + %d emaile zostały już dodane + %d emaili zostało już dodanych + %d emaili zostało już dodanych + + + %d email jest nieprawidłowy + %d emaile są nieprawidłowe + %d emaili jest nieprawidłowych + %d emaili jest nieprawidłowych + Ten adres e-mail jest już używany Adres e-mail jest nieprawidłowy Dodaj odbiorcę @@ -705,6 +717,12 @@ Do: Jutro rano Nie możesz dodać tego adresu, ponieważ osiągnąłeś/aś limit odbiorców + + %d adres nie mógł zostać dodany, ponieważ osiągnięto limit odbiorców + %d adresy nie mogły zostać dodane, ponieważ osiągnięto limit odbiorców + %d adresów nie mogło zostać dodanych, ponieważ osiągnięto limit odbiorców + %d adresów nie mogło zostać dodanych, ponieważ osiągnięto limit odbiorców + Kosz Odblokuj Nieznany nadawca diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index 30bfc92e3bf..311227a0208 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -48,6 +48,14 @@ Ver no tema escuro Ver no tema claro Texto a exibir + + %d email já foi adicionado + %d emails já foram adicionados + + + %d email é inválido + %d emails são inválidos + O e-mail já está sendo usado O e-mail é inválido Adicionar destinatário @@ -661,6 +669,10 @@ Para: Amanhã de manhã Não pode adicionar este endereço pois atingiu o limite de destinatários + + %d endereço não pôde ser adicionado porque atingiu o limite de destinatários + %d endereços não puderam ser adicionados porque atingiu o limite de destinatários + Lixo Desbloquear Remetente desconhecido diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index fea697360a6..b6338ee6f20 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -48,6 +48,14 @@ Visa i mörkt tema Visa i ljust tema Text att visa + + %d email har redan lagts till + %d emails har redan lagts till + + + %d email är ogiltig + %d emails är ogiltiga + E-postadressen används redan E-postadressen är ogiltig Lägg till mottagare @@ -661,6 +669,10 @@ Till: I morgon bitti Du kan inte lägga till denna adress eftersom du har nått gränsen för mottagare + + %d adress kunde inte läggas till eftersom du har nått gränsen för mottagare + %d adresser kunde inte läggas till eftersom du har nått gränsen för mottagare + Papperskorg Avblockera Okänd avsändare diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index d035ece8e30..8547d3ca530 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -17,7 +17,6 @@ --> Infomaniak Mail - draft_service_channel_id general_channel_id sync_messages_service_channel_id @@ -53,6 +52,14 @@ View in dark theme View in light theme Text to display + + %d email has already been added + %d emails have already been added + + + %d email is invalid + %d emails are invalid + The email is already used The email is invalid Add a recipient @@ -666,6 +673,10 @@ To: Tomorrow morning You can’t add this address because you have reached the limit of recipients + + %d address could not be added because you have reached the recipient limit + %d addresses could not be added because you have reached the recipient limit + Trash Unblock Unknown expeditor