Browse Source

Version 6.3.2-1118

Threema 1 month ago
parent
commit
caaefa1325
39 changed files with 315 additions and 110 deletions
  1. 3 3
      app/assets/license.html
  2. 2 2
      app/build.gradle.kts
  3. 3 3
      app/src/foss_based/assets/license.html
  4. 2 4
      app/src/libre/play/release-notes/de/default.txt
  5. 2 4
      app/src/libre/play/release-notes/en-US/default.txt
  6. 65 5
      app/src/main/java/ch/threema/app/fragments/BackupDataFragment.java
  7. 5 0
      app/src/main/java/ch/threema/app/preference/service/PreferenceService.java
  8. 11 0
      app/src/main/java/ch/threema/app/preference/service/PreferenceServiceImpl.java
  9. 5 2
      app/src/main/java/ch/threema/app/services/PinLockService.java
  10. 5 2
      app/src/main/java/ch/threema/app/voip/services/VoipCallService.java
  11. 9 43
      app/src/main/java/ch/threema/app/voip/services/VoipStateService.java
  12. BIN
      app/src/main/res/raw/call_initialization.ogg
  13. 5 3
      app/src/main/res/values-be-rBY/strings.xml
  14. 5 1
      app/src/main/res/values-bg/strings.xml
  15. 5 1
      app/src/main/res/values-ca/strings.xml
  16. 18 10
      app/src/main/res/values-cs/strings.xml
  17. 8 1
      app/src/main/res/values-de/strings.xml
  18. 8 1
      app/src/main/res/values-es/strings.xml
  19. 8 1
      app/src/main/res/values-fr/strings.xml
  20. 13 6
      app/src/main/res/values-gsw/strings.xml
  21. 5 1
      app/src/main/res/values-hu/strings.xml
  22. 8 1
      app/src/main/res/values-it/strings.xml
  23. 5 1
      app/src/main/res/values-ja/strings.xml
  24. 8 1
      app/src/main/res/values-nl-rNL/strings.xml
  25. 5 1
      app/src/main/res/values-no/strings.xml
  26. 8 1
      app/src/main/res/values-pl/strings.xml
  27. 8 1
      app/src/main/res/values-pt-rBR/strings.xml
  28. 10 3
      app/src/main/res/values-ru/strings.xml
  29. 5 1
      app/src/main/res/values-sk/strings.xml
  30. 9 1
      app/src/main/res/values-tr/strings.xml
  31. 10 3
      app/src/main/res/values-uk/strings.xml
  32. 11 1
      app/src/main/res/values-zh-rCN/strings.xml
  33. 10 1
      app/src/main/res/values-zh-rTW/strings.xml
  34. 1 0
      app/src/main/res/values/preferences_strings.xml
  35. 7 0
      app/src/main/res/values/strings.xml
  36. 1 1
      app/src/main/res/values/untranslatable_strings.xml
  37. 6 0
      commonAndroid/src/main/java/ch/threema/android/UriExtensions.kt
  38. 10 0
      domain/src/main/java/ch/threema/domain/protocol/csp/messages/voip/VoipCallAnswerData.java
  39. 6 0
      scripts/verify-build.sh

+ 3 - 3
app/assets/license.html

@@ -44,7 +44,7 @@
 
 <body>
 
-<p class="maincopyright">Copyright © 2013-2025 Threema GmbH.<br/>
+<p class="maincopyright">Copyright © Threema GmbH.<br/>
     All rights reserved.</p>
 
 <h1>Translations</h1>
@@ -254,14 +254,14 @@ SUCH DAMAGE.</p>
 
 <h2>saltyrtc-client-java</h2>
 
-<p>Copyright (c) 2016-2025 Threema GmbH</p>
+<p>Copyright (c) Threema GmbH</p>
 
 <p>Licensed under the Apache License, version 2.0 (copy below).</p>
 
 
 <h2>saltyrtc-task-webrtc-java</h2>
 
-<p>Copyright (c) 2016-2025 Threema GmbH</p>
+<p>Copyright (c) Threema GmbH</p>
 
 <p>Licensed under the Apache License, version 2.0 (copy below).</p>
 

+ 2 - 2
app/build.gradle.kts

@@ -30,7 +30,7 @@ if (gradle.startParameter.taskRequests.toString().contains("Hms")) {
 /**
  * Only use the scheme "<major>.<minor>.<patch>" for the appVersion
  */
-val appVersion = "6.3.1"
+val appVersion = "6.3.2"
 
 /**
  * betaSuffix with leading dash (e.g. `-beta1`).
@@ -39,7 +39,7 @@ val appVersion = "6.3.1"
  */
 val betaSuffix = ""
 
-val defaultVersionCode = 1116
+val defaultVersionCode = 1118
 
 /**
  * Map with keystore paths (if found).

+ 3 - 3
app/src/foss_based/assets/license.html

@@ -44,7 +44,7 @@
 
 <body>
 
-<p class="maincopyright">Copyright © 2013-2025 Threema GmbH.<br/>
+<p class="maincopyright">Copyright © Threema GmbH.<br/>
     All rights reserved.</p>
 
 <h1>Translations</h1>
@@ -214,14 +214,14 @@ SUCH DAMAGE.</p>
 
 <h2>saltyrtc-client-java</h2>
 
-<p>Copyright (c) 2016-2025 Threema GmbH</p>
+<p>Copyright (c) Threema GmbH</p>
 
 <p>Licensed under the Apache License, version 2.0 (copy below).</p>
 
 
 <h2>saltyrtc-task-webrtc-java</h2>
 
-<p>Copyright (c) 2016-2025 Threema GmbH</p>
+<p>Copyright (c) Threema GmbH</p>
 
 <p>Licensed under the Apache License, version 2.0 (copy below).</p>
 

+ 2 - 4
app/src/libre/play/release-notes/de/default.txt

@@ -1,4 +1,2 @@
-- Neu: Empfehlen Sie Threema Work und erhalten Sie einen Referral-Bonus!
-- Emoji-Reaktionen lassen sich nun von TalkBack vorlesen
-- Behebung eines Fehlers bei Ruftönen von Threema-Anrufen
-- Behebung eines Fehlers, der bei Verwendung der App-Sperre auftreten konnte
+- Abspielen eines Tons während des Rufaufbaus in Einzelchats
+- Verwendung des Standardpfads für Daten-Backups, wenn die Dateiauswahl im Systemdialog nicht funktioniert

+ 2 - 4
app/src/libre/play/release-notes/en-US/default.txt

@@ -1,4 +1,2 @@
-- New: Recommend Threema Work and earn a referral bonus!
-- Emoji reactions can now be read by TalkBack
-- Fixed a bug in relation to ringtones for Threema calls
-- Fixed a bug that could occur when the app lock is used
+- Play a sound when establishing Threema calls in individual chats
+- Use the default path for data backups if the system’s picker does not work

+ 65 - 5
app/src/main/java/ch/threema/app/fragments/BackupDataFragment.java

@@ -7,6 +7,8 @@ import android.content.Intent;
 import android.content.pm.PackageManager;
 import android.net.Uri;
 import android.os.Bundle;
+import android.os.Environment;
+import android.text.format.DateUtils;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
@@ -27,6 +29,8 @@ import com.google.android.material.floatingactionbutton.ExtendedFloatingActionBu
 
 import org.slf4j.Logger;
 
+import java.time.Instant;
+
 import ch.threema.app.AppConstants;
 import ch.threema.app.R;
 import ch.threema.app.ThreemaApplication;
@@ -45,6 +49,8 @@ import ch.threema.app.ui.ViewExtensionsKt;
 import ch.threema.app.utils.ConfigUtils;
 import ch.threema.app.utils.LocaleUtil;
 import ch.threema.app.utils.TestUtil;
+
+import static ch.threema.android.UriExtensionsKt.isFileUri;
 import static ch.threema.base.utils.LoggingKt.getThreemaLogger;
 
 public class BackupDataFragment extends Fragment implements
@@ -61,6 +67,7 @@ public class BackupDataFragment extends Fragment implements
     private static final String DIALOG_TAG_DISABLE_ENERGY_SAVING = "des";
     private static final String DIALOG_TAG_PASSWORD = "pwd";
     private static final String DIALOG_TAG_PATH_INTRO = "pathintro";
+    private static final String DIALOG_TAG_FALLBACK_PATH = "pathfallback";
 
     private View fragmentView;
     private ExtendedFloatingActionButton fab;
@@ -186,6 +193,12 @@ public class BackupDataFragment extends Fragment implements
         if (directoryTreeUri == null) {
             return getString(R.string.not_set);
         } else {
+            if (isFileUri(directoryTreeUri)) {
+                var dirName = directoryTreeUri.getLastPathSegment();
+                if (dirName != null) {
+                    return dirName;
+                }
+            }
             try {
                 DocumentFile documentFile = DocumentFile.fromTreeUri(getContext(), directoryTreeUri);
                 if (documentFile != null && documentFile.isDirectory()) {
@@ -201,21 +214,45 @@ public class BackupDataFragment extends Fragment implements
     }
 
     private void showPathSelectionIntro() {
+        if (hasDocumentPickerPotentiallyFailedRecently()) {
+            var dialog = GenericAlertDialog.newInstance(
+                R.string.set_backup_path,
+                R.string.backup_path_selection_message,
+                R.string.backup_path_selection_default,
+                R.string.backup_path_selection_documents
+            );
+            dialog.setTargetFragment(this);
+            dialog.show(getFragmentManager(), DIALOG_TAG_FALLBACK_PATH);
+            return;
+        }
+
         GenericAlertDialog dialog = GenericAlertDialog.newInstance(R.string.set_backup_path, R.string.set_backup_path_intro, R.string.ok, R.string.cancel);
         dialog.setTargetFragment(this);
         dialog.show(getFragmentManager(), DIALOG_TAG_PATH_INTRO);
     }
 
+    private boolean hasDocumentPickerPotentiallyFailedRecently() {
+        var lastLaunchTime = preferenceService.getDataBackupPickerLaunched();
+        if (lastLaunchTime == null) {
+            return false;
+        }
+        return Instant.now().toEpochMilli() - lastLaunchTime.toEpochMilli() < 10 * DateUtils.MINUTE_IN_MILLIS;
+    }
+
     @UiThread
     private void launchDocumentTree() {
         try {
             logger.info("Opening document picker");
             Intent i = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
-            // undocumented APIs according to https://issuetracker.google.com/issues/72053350
-            i.putExtra("android.content.extra.SHOW_ADVANCED", true);
-            i.putExtra("android.content.extra.FANCY", true);
-            i.putExtra("android.content.extra.SHOW_FILESIZE", true);
+            if (!hasDocumentPickerPotentiallyFailedRecently()) {
+                // undocumented APIs according to https://issuetracker.google.com/issues/72053350
+                // if we detected that the document picker might have failed, we excluded these, as they might be part of the problem
+                i.putExtra("android.content.extra.SHOW_ADVANCED", true);
+                i.putExtra("android.content.extra.FANCY", true);
+                i.putExtra("android.content.extra.SHOW_FILESIZE", true);
+            }
             startActivityForResult(i, REQUEST_CODE_DOCUMENT_TREE);
+            preferenceService.setDataBackupPickerLaunched(Instant.now());
         } catch (Exception e) {
             Toast.makeText(getContext(), "Your device is missing an activity for Intent.ACTION_OPEN_DOCUMENT_TREE. Contact the manufacturer of the device.", Toast.LENGTH_SHORT).show();
             logger.error("Broken device. No Activity for Intent.ACTION_OPEN_DOCUMENT_TREE", e);
@@ -230,6 +267,10 @@ public class BackupDataFragment extends Fragment implements
             if (backupUri == null) {
                 showPathSelectionIntro();
             } else {
+                if (isFileUri(backupUri)) {
+                    checkBatteryOptimizations();
+                    return;
+                }
                 DocumentFile documentFile = null;
                 try {
                     documentFile = DocumentFile.fromTreeUri(ThreemaApplication.getAppContext(), backupUri);
@@ -307,6 +348,7 @@ public class BackupDataFragment extends Fragment implements
             case DIALOG_TAG_ENERGY_SAVING_REMINDER:
                 doBackup();
                 break;
+            case DIALOG_TAG_FALLBACK_PATH:
             case DIALOG_TAG_PATH_INTRO:
                 launchDocumentTree();
                 break;
@@ -321,13 +363,30 @@ public class BackupDataFragment extends Fragment implements
             case DIALOG_TAG_DISABLE_ENERGY_SAVING:
                 doBackup();
                 break;
-            case DIALOG_TAG_ENERGY_SAVING_REMINDER:
+            case DIALOG_TAG_FALLBACK_PATH:
+                useFallbackPath();
                 break;
             default:
                 break;
         }
     }
 
+    private void useFallbackPath() {
+        logger.info("Using Documents dir as fallback");
+        preferenceService.setDataBackupPickerLaunched(null);
+        var documentsDirectory = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOCUMENTS);
+        documentsDirectory.mkdirs();
+        setBackupUri(Uri.fromFile(documentsDirectory));
+    }
+
+    private void setBackupUri(Uri backupUri) {
+        this.backupUri = backupUri;
+        preferenceService.setDataBackupUri(backupUri);
+        if (pathTextView != null) {
+            pathTextView.setText(getDirectoryName(backupUri));
+        }
+    }
+
     @Override
     public void onRequestPermissionsResult(int requestCode,
                                            @NonNull String permissions[], @NonNull int[] grantResults) {
@@ -366,6 +425,7 @@ public class BackupDataFragment extends Fragment implements
                 break;
             case REQUEST_CODE_DOCUMENT_TREE:
                 logger.info("Document picker returned, {}", resultCode);
+                preferenceService.setDataBackupPickerLaunched(null);
                 if (resultCode == RESULT_OK) {
                     if (data != null) {
                         Uri treeUri = data.getData();

+ 5 - 0
app/src/main/java/ch/threema/app/preference/service/PreferenceService.java

@@ -542,6 +542,11 @@ public interface PreferenceService {
 
     void setDataBackupUri(Uri newUri);
 
+    @Nullable
+    Instant getDataBackupPickerLaunched();
+
+    void setDataBackupPickerLaunched(@Nullable Instant timestamp);
+
     @Nullable
     Instant getLastDataBackupTimestamp();
 

+ 11 - 0
app/src/main/java/ch/threema/app/preference/service/PreferenceServiceImpl.java

@@ -1436,6 +1436,17 @@ public class PreferenceServiceImpl implements PreferenceService {
         );
     }
 
+    @Override
+    @Nullable
+    public Instant getDataBackupPickerLaunched() {
+        return preferenceStore.getInstant(getKeyName(R.string.preferences__data_backup_picker_launched));
+    }
+
+    @Override
+    public void setDataBackupPickerLaunched(@Nullable Instant timestamp) {
+        preferenceStore.save(getKeyName(R.string.preferences__data_backup_picker_launched), timestamp);
+    }
+
     @Override
     @Nullable
     public Instant getLastDataBackupTimestamp() {

+ 5 - 2
app/src/main/java/ch/threema/app/services/PinLockService.java

@@ -53,14 +53,17 @@ public class PinLockService implements LockAppService {
     public boolean unlock(String pin) {
         logger.debug("unlock");
 
-        if ((PreferenceService.LockingMech_PIN.equals(preferencesService.getLockMechanism()) &&
-            this.preferencesService.isPinCodeCorrect(pin)) ||
+        boolean isLockMechanismPin = PreferenceService.LockingMech_PIN.equals(preferencesService.getLockMechanism());
+
+        if ((isLockMechanismPin && this.preferencesService.isPinCodeCorrect(pin)) ||
             PreferenceService.LockingMech_SYSTEM.equals(preferencesService.getLockMechanism()) ||
             PreferenceService.LockingMech_BIOMETRIC.equals(preferencesService.getLockMechanism())) {
             this.resetLockTimer(false);
             this.updateState(false);
             this.lockTimeStamp = 0;
             return !this.locked;
+        } else if (isLockMechanismPin) {
+            logger.info("Incorrect PIN entered");
         }
         return false;
     }

+ 5 - 2
app/src/main/java/ch/threema/app/voip/services/VoipCallService.java

@@ -1236,6 +1236,8 @@ public class VoipCallService extends LifecycleService implements PeerConnectionC
         };
         VoipListenerManager.messageListener.add(this.voipMessageListener);
 
+        startLoopingSound(callId, R.raw.call_initialization, "call_initialization");
+
         logCallInfo(callId, "Creating offer...");
         this.peerConnectionClient.createOffer();
     }
@@ -2033,8 +2035,9 @@ public class VoipCallService extends LifecycleService implements PeerConnectionC
                                                 int rawResource,
                                                 final String soundName) {
         if (this.mediaPlayer != null) {
-            logCallError(callId, "Not looping {} sound, mediaPlayer is not null!", soundName);
-            return;
+            this.mediaPlayer.stop();
+            this.mediaPlayer.release();
+            this.mediaPlayer = null;
         }
         logCallInfo(callId, "Looping {} sound...", soundName);
 

+ 9 - 43
app/src/main/java/ch/threema/app/voip/services/VoipStateService.java

@@ -191,18 +191,6 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
     //       the call ID for every logging call. These helper methods provide some boilerplate
     //       code to make this easier.
 
-    private static void logCallTrace(long callId, String message) {
-        logger.trace("[cid={}]: {}", callId, message);
-    }
-
-    private static void logCallTrace(long callId, @NonNull String message, Object... arguments) {
-        logger.trace("[cid=" + callId + "]: " + message, arguments);
-    }
-
-    private static void logCallDebug(long callId, String message) {
-        logger.debug("[cid={}]: {}", callId, message);
-    }
-
     private static void logCallDebug(long callId, @NonNull String message, Object... arguments) {
         logger.debug("[cid=" + callId + "]: " + message, arguments);
     }
@@ -223,14 +211,6 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
         logger.warn("[cid=" + callId + "]: " + message, arguments);
     }
 
-    private static void logCallError(long callId, String message) {
-        logger.error("[cid={}]: {}", callId, message);
-    }
-
-    private static void logCallError(long callId, String message, Throwable t) {
-        logger.error("[cid=" + callId + "]: " + message, t);
-    }
-
     private static void logCallError(long callId, @NonNull String message, Object... arguments) {
         logger.error("[cid=" + callId + "]: " + message, arguments);
     }
@@ -765,9 +745,7 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
                 // Call was rejected
                 case VoipCallAnswerData.Action.REJECT:
                     // TODO(ANDR-XXXX): only for tests!
-                    VoipListenerManager.callEventListener.handle(listener -> {
-                        listener.onRejected(callId, msg.getFromIdentity(), false, callAnswerData.getRejectReason());
-                    });
+                    VoipListenerManager.callEventListener.handle(listener -> listener.onRejected(callId, msg.getFromIdentity(), false, callAnswerData.getRejectReason()));
                     logCallInfo(callId, "Call answer received from {}: reject/{}",
                         msg.getFromIdentity(), callAnswerData.getRejectReasonName());
                     break;
@@ -957,9 +935,7 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
             final boolean accepted = prevState.isInitializing();
             handleMissedCall(voipCallHangupMessage, callId, accepted);
         } else if (prevState.isCalling() && duration != null) {
-            VoipListenerManager.callEventListener.handle(listener -> {
-                listener.onFinished(callId, voipCallHangupMessage.getFromIdentity(), !incoming, duration);
-            });
+            VoipListenerManager.callEventListener.handle(listener -> listener.onFinished(callId, voipCallHangupMessage.getFromIdentity(), !incoming, duration));
         }
 
         return true;
@@ -1149,13 +1125,10 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
     }
 
     /**
-     * Send a call answer method.
+     * Send a call answer message.
      *
      * @param videoCall If set to TRUE, then the `video` call feature
      *                  will be sent along in the answer.
-     * @throws ThreemaException
-     * @throws IllegalArgumentException
-     * @throws IllegalStateException
      */
     private void sendCallAnswerMessage(
         @NonNull ContactModel receiver,
@@ -1164,7 +1137,7 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
         byte action,
         @Nullable Byte rejectReason,
         @Nullable Boolean videoCall
-    ) throws ThreemaException, IllegalArgumentException, IllegalStateException {
+    ) throws IllegalArgumentException, IllegalStateException {
         logCallInfo(callId, "Sending call answer message");
         final VoipCallAnswerData callAnswerData = new VoipCallAnswerData()
             .setCallId(callId)
@@ -1198,7 +1171,7 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
 
         contactService.createReceiver(receiver).sendVoipCallAnswerMessage(callAnswerData);
 
-        logCallInfo(callId, "Call answer enqueued to {}: {}", receiver.getIdentity(), callAnswerData.getAction());
+        logCallInfo(callId, "Call answer enqueued to {}: {}", receiver.getIdentity(), callAnswerData.getActionDescription());
         logCallInfo(callId, "  Answer features: {}", callAnswerData.getFeatures());
     }
 
@@ -1227,7 +1200,7 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
         }
         final VoipICECandidatesData voipICECandidatesData = new VoipICECandidatesData()
             .setCallId(callId)
-            .setCandidates(candidates.toArray(new VoipICECandidatesData.Candidate[candidates.size()]));
+            .setCandidates(candidates.toArray(new VoipICECandidatesData.Candidate[0]));
 
         contactService.createReceiver(receiver).sendVoipICECandidateMessage(voipICECandidatesData);
 
@@ -1302,12 +1275,10 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
 
     /**
      * Accept an incoming call.
-     *
-     * @return true if call was accepted, false otherwise (e.g. if no incoming call was active)
      */
-    public boolean acceptIncomingCall() {
+    public void acceptIncomingCall() {
         if (this.acceptIntent == null) {
-            return false;
+            return;
         }
         try {
             if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.UPSIDE_DOWN_CAKE) {
@@ -1317,11 +1288,9 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
                 this.acceptIntent.send();
             }
             this.acceptIntent = null;
-            return true;
         } catch (PendingIntent.CanceledException e) {
             logger.error("Cannot send pending accept intent: It was cancelled");
             this.acceptIntent = null;
-            return false;
         }
     }
 
@@ -1432,9 +1401,8 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
     /**
      * Show a call notification.
      */
-    @Nullable
     @WorkerThread
-    private Notification showNotification(
+    private void showNotification(
         @NonNull ContactModel contact,
         @NonNull PendingIntent accept,
         @NonNull PendingIntent reject,
@@ -1540,8 +1508,6 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
                 logger.error("Could not send inCallPendingIntent", e);
             }
         }
-
-        return notification;
     }
 
     private PendingIntent createLaunchPendingIntent(

BIN
app/src/main/res/raw/call_initialization.ogg


+ 5 - 3
app/src/main/res/values-be-rBY/strings.xml

@@ -715,7 +715,7 @@
     <string name="status_ballot_user_modified_vote">\"%1$s\" змяніў(ла) голас за \"%2$s\"</string>
     <string name="status_ballot_all_votes">Галасоў за «%1$s»</string>
     <string name="restore">Аднавіць</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Вы не ўказалі ні нумар мабільнага тэлефона, ні адрас электроннай пошты для прывязкі да вашага ${app_name_short} ID. Вы не з\'явіцеся ў спісе кантактаў вашых сяброў.  Вы сапраўды хочаце выкарыстоўваць ${app_name} ананімна?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Вы не ўказалі нумар мабільнага тэлефона для прывязкі да свайго ${app_name_short} ID. Вы не з\'явіцеся ў спісе кантактаў вашых сяброў. Вы сапраўды хочаце выкарыстоўваць ${app_name} ананімна?</string>
@@ -801,6 +801,7 @@
     <string name="really_reset_ringtones">Скінуць прадвызначаны налады гукавых апавяшчэнняў?</string>
     <string name="reset_ringtones_confirm">Налады гукавых апавяшчэнняў былі скінутыя.</string>
     <string name="prefs_language_override">Мова</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">Канал ${app_name_short} дае вам навіны аб усім ${app_name_short}.  Вы хочаце падпісацца на канал ${app_name_short} і дадаць яго ў свае кантакты?  Гэта бясплатна, і вы можаце адмовіцца ад падпіскі ў любы час.</string>
     <string name="quote">Цытаваць</string>
     <string name="contacts_deleted">Кантакты былі выдалены</string>
@@ -976,7 +977,6 @@
     <string name="safe_configure_choose_server">Абярыце сэрвер ${app_name_short} Safe</string>
     <!-- ${company_name} is a placeholder for the name of the company that operates the app, e.g. "Threema". It must be left as-is and not translated. -->
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
-    <string name="onprem_safe_configure_server_explain">Захавайце рэзервовую копію ${app_name_short} на серверы вашай арганізацыі або пазначце іншы сервер рэзервовага капіравання.</string>
     <string name="safe_use_default_server">Прадвызначаны сервер</string>
     <string name="safe_test_server">Тэставы сервер</string>
     <string name="safe_advanced_options">Пашыраныя налады</string>
@@ -1322,7 +1322,6 @@
     <string name="id_backup_info">Аднавіць толькі ID</string>
     <string name="restore_your_id_contacts_and_groups">Аднавіць ID, кантакты і суполкі</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
-    <string name="threema_safe_backup">Бяспечная рэз. копія ${app_name_short}</string>
     <string name="forgot_your_password"><![CDATA[<a href=%s>Даведка</a>]]></string>
     <string name="download_failed">Не ўдалося спампаваць. Код памылкі: %d</string>
     <string name="edit_answer">Змяніць адказ</string>
@@ -1646,6 +1645,9 @@
     <string name="device_linking_cancel_dialog_continue">Працягнуць</string>
     <string name="md_drop_device_dialog_close_button">Закрыць</string>
     <string name="md_drop_device_failed_dialog_button_close">Закрыць</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
     <!-- accessibility -->
     <string name="cd_ack_icon">згода адпраўлена</string>
     <string name="cd_dec_icon">нязгода адпраўлена</string>

+ 5 - 1
app/src/main/res/values-bg/strings.xml

@@ -727,7 +727,7 @@
     <string name="status_ballot_user_modified_vote">„%1$s“ промени вота си на „%2$s“</string>
     <string name="status_ballot_all_votes">Гласовете за „%1$s“ приключиха</string>
     <string name="restore">Възстановяване</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Не сте въвели мобилен телефон или имейл, които да се свържат с Вашия ${app_name_short} идентификатор. Вие няма да се виждате в списъка с контакти на Вашите приятели. Наистина ли искате да използвате ${app_name} анонимно?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Не сте въвели мобилен телефон, който да се свърже с Вашия ${app_name_short} идентификатор. Вие няма да се виждате в списъка с контакти на Вашите приятели. Наистина ли искате да използвате ${app_name} анонимно?</string>
@@ -814,6 +814,7 @@
     <string name="really_reset_ringtones">Наистина ли искате да възстановите настройките на звука на известията?</string>
     <string name="reset_ringtones_confirm">Настройките на известията на звука бяха възстановени.</string>
     <string name="prefs_language_override">Език</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">${app_name_short} каналът Ви предоставя новини за всичко около ${app_name_short}. Искате ли да се абонирате за канала на ${app_name_short} и да го добавите като контакт? Безплатно е и винаги можете да се отпишете.</string>
     <string name="quote">Цитирайте</string>
     <string name="contacts_deleted">Контактът е изтрит</string>
@@ -1681,6 +1682,9 @@
     <string name="md_drop_device_failed_dialog_title">Премахването на свързаните устройства може да е неуспешно</string>
     <string name="md_drop_device_failed_dialog_message">Моля, проверете интернет връзката Ви и опитайте отново.</string>
     <string name="md_drop_device_failed_dialog_button_close">Затворете</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
     <!-- accessibility -->
     <string name="cd_ack_icon">изпратено е „съгласие“</string>
     <string name="cd_dec_icon">изпратено е „несъгласие“</string>

+ 5 - 1
app/src/main/res/values-ca/strings.xml

@@ -680,7 +680,7 @@ donar només el vostre nom o un pseudònim. Si no definiu un sobrenom utilitzare
     <string name="status_ballot_user_modified_vote">«%1$s» a canviat el vot a favor de «%2$s»</string>
     <string name="status_ballot_all_votes">Les votacions per «%1$s» s\'han completat</string>
     <string name="restore">Restaurar</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">No heu entrat ni un número de mòbil ni una adreça de correu electrònic per enllaçar a la vostra ID de ${app_name_short}. No apareixereu a les llistes de contactes dels vostres amics. Realment voleu utilitzar ${app_name} anònimament?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">No heu entrat un número de mòbil per enllaçar a la vostra ID de ${app_name_short}. No apareixereu a les llistes de contactes dels vostres amics. Realment voleu utilitzar ${app_name} anònimament?</string>
@@ -750,6 +750,7 @@ donar només el vostre nom o un pseudònim. Si no definiu un sobrenom utilitzare
     <string name="really_reset_ringtones">Voleu restablir la configuració del so de notificació a la predeterminada?</string>
     <string name="reset_ringtones_confirm">S\'ha restablert la configuració del so de notificació.</string>
     <string name="prefs_language_override">Idioma</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">El Canal ${app_name_short} us proporciona notícies sobre totes les coses de ${app_name_short}. Voleu subscriure-us al Canal ${app_name_short} i afegir-lo als vostres contactes? És gratuït i podeu revocar la subscripció en qualsevol moment.</string>
     <string name="quote">Citar</string>
     <string name="contacts_deleted">Els contactes s\'han eliminat</string>
@@ -1357,6 +1358,9 @@ Si esteu canviant a un dispositiu nou, desinstal·leu o desactiveu %s al disposi
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <!-- Label on button to dismiss/hide a warning -->
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
     <!-- accessibility -->
     <!-- Hint shown on message details screen, to let the user know how they can view a message's emoji reactions -->
     <!-- Title shown in popup above emoji reaction buttons on a message, to hint to the user that they can long-press to view the details -->

+ 18 - 10
app/src/main/res/values-cs/strings.xml

@@ -544,8 +544,8 @@ http://www.7-zip.org nebo https://itunes.apple.com/us/app/the-unarchiver/id42542
     <string name="wallpapers_removed">Tapety byly odstraněny</string>
     <string name="invalid_backup">Neplatná data zálohy. Nelze je obnovit.</string>
     <string name="invalid_zip_restore_failed">Obnova selhala. Neplatný soubor se zálohou: %1$s</string>
-    <string name="revocation_explain">V případě nutnosti zrušit vaše ${app_name_short} ID (například v případě ztráty nebo odcizení) použijte tento odkaz, kde zadáte ID a zde vytvořené heslo.
-https://myid.threema.ch/revoke</string>
+    <string name="revocation_explain">Heslo, které zde zadáte, vám umožňuje zrušit vaše ID na webu
+        https://myid.threema.ch/revoke v případě, že zařízení ztratíte nebo vám bude ukradeno</string>
     <!-- Empty state text shown on home screen widget when there are no unread messages -->
     <string name="no_unread_messages">Žádné nepřečtené zprávy</string>
     <string name="send_media">Odeslat média</string>
@@ -700,8 +700,9 @@ možné je obnovit.</string>
     <string name="new_wizard_info_fingerprint">Přejížděním prstem po displeji vytvoříte náhodná data (tzv. entropii), která se využijí k vygenerování páru šifrovacích klíčů svázaných s vaším ${app_name_short} ID. Dvojice šifrovacích klíčů se skládá z <b>veřejného klíče</b>, který je distribuován vašim kontaktům, a ze <b>soukromého klíče</b>, který je bezpečně uložen pouze ve vašem zařízení. Zprávy, které vám odešlou vaše kontakty, budou zašifrovány vaším veřejným klíčem. Tyto zprávy může dešifrovat pouze ten, kdo vlastní soukromý klíč.</string>
     <string name="new_wizard_info_id">Vytvořili jste dvojici šifrovacích klíčů. Veřejný klíč byl bezpečně přenesen na naše servery. Soukromý klíč nikdy neopustí vaše zařízení. Tím je zajištěno, že nikdo nepovolaný se nebude moci dostat k vašim zprávám.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
-    <string name="new_wizard_info_sync_contacts">Pokud tuto možnost povolíte, odešlou se jednosměrně šifrované (hashované) e‑mailové adresy a telefonní čísla z vašich kontaktů na náš server. Zde se porovnají s kontakty ostatních uživatelů. V případě shody se u vás kontakt zobrazí v adresáři.
-Na našich serverech neukládáme žádná data z vašeho adresáře.</string>
+    <string name="new_wizard_info_sync_contacts">Když tuto možnost povolíte, ${app_name_short} jednosměrně zašifruje (zahashuje) e-mailové adresy a telefonní čísla
+        předtím, než je odešle na server, aby vyhledala odpovídající kontakty. Žádná data z adresáře
+        kontaktů neukládáme.</string>
     <string name="new_wizard_info_sync_contacts_dialog">Synchronizace kontaktů vám může pomoci najít vaše přátele automaticky. Pokud budete souhlasit, telefonní čísla a e‑mailové adresy z vašeho telefonního seznamu budou před odesláním na naše servery zašifrovány, aby mohly být vyhledány shodující se kontakty. Žádná data nebudou uložena nebo sdílena.\n\nPřejete si povolit synchronizaci kontaktů?</string>
     <!-- Instructions shown during the setup wizard. Only used for work builds (i.e., Threema Work or OnPrem). ${app_name_short} is a placeholders for the app's name, it must be kept as-is and should not be translated. -->
     <string name="new_wizard_info_link">Poskytnete‑li svoje telefonní číslo a e‑mailovou adresu, ${app_name_short} může pomoci vašim přátelům najít vás automaticky, pokud vás mají uložené v telefonním adresáři kontaktů. Data budou uložena jednosměrně šifrovaná (hashovaná) na našem serveru. Tento krok můžete přeskočit, pokud chcete používat aplikaci ${app_name} zcela anonymně. Toto nastavení lze později změnit.</string>
@@ -721,7 +722,7 @@ přátelům vás automaticky najít, pokud vás mají v adresáři svého telef
     <string name="status_ballot_user_modified_vote">Člen „%1$s“ změnil hlas pro „%2$s“</string>
     <string name="status_ballot_all_votes">Hlasy v anketě „%1$s“ jsou kompletní</string>
     <string name="restore">Obnovit</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Nezadali jste ani číslo mobilního telefonu, ani e‑mailovou adresu, které mohou být propojené s vaším ${app_name_short} ID. Nebudete se proto zobrazovat v seznamu kontaktů vašich přátel. Skutečně si přejete používat aplikaci ${app_name} anonymně?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Nezadali jste číslo mobilního telefonu, které může být propojeno s vaším ${app_name_short} ID. Nebudete se proto zobrazovat v seznamu kontaktů vašich přátel. Skutečně si přejete používat aplikaci ${app_name} anonymně?</string>
@@ -808,7 +809,8 @@ přátelům vás automaticky najít, pokud vás mají v adresáři svého telef
     <string name="really_reset_ringtones">Skutečně si přejete obnovit nastavení zvuků oznámení na výchozí hodnoty?</string>
     <string name="reset_ringtones_confirm">Nastavení zvuků oznámení bylo obnoveno.</string>
     <string name="prefs_language_override">Jazyk</string>
-    <string name="threema_channel_intro">${app_name_short} Channel je informační kanál aplikace ${app_name_short}, který vás formou zpráv informuje o všech novinkách. Přejete si přihlásit se k odběru kanálu a přidat jej mezi kontakty? Je zdarma a můžete se z něj kdykoliv odhlásit.</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
+    <string name="threema_channel_intro">Kanál ${app_name_short} vám poskytuje novinky z ekosystému aplikace ${app_name_short}. Máte zájem se ke Kanálu ${app_name_short} přihlásit a přidat jej mezi kontakty? Je zdarma a kdykoliv se z něj můžete odhlásit.</string>
     <string name="quote">Citovat</string>
     <string name="contacts_deleted">Kontakty byly odstraněny</string>
     <string name="take_photo">Pořídit fotku</string>
@@ -886,7 +888,7 @@ přátelům vás automaticky najít, pokud vás mají v adresáři svého telef
     <string name="prefs_summary_force_turn_off">Pokud to bude možné, naváže se přímé spojení s volaným. Pouze hovory s neověřenými kontakty budou přenášeny skrze ${company_name} servery. Vaše IP adresa může být pro volaného zjistitelná.</string>
     <!-- ${company_name} is a placeholder for the name of the company that operates the app, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="prefs_summary_force_turn_on">Všechny hovory se budou přenášet skrze ${company_name} servery, vaše IP adresa tak bude zabezpečena. Kvalita hovorů může být snížena.</string>
-    <string name="permission_record_audio_required">Chcete‑li provádět šifrované hovory a odesílat hlasové zprávy, povolte prosím aplikaci ${app_name_short} přístup k mikrofonu.</string>
+    <string name="permission_record_audio_required">Chcete-li provádět šifrované hovory a odesílat hlasové zprávy, udělte prosím přístup k mikrofonu.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="prefs_voice_call_notifications">Hovory ${app_name_short}</string>
     <string name="prefs_voice_call_sound">Vyzvánění</string>
@@ -998,7 +1000,7 @@ přátelům vás automaticky najít, pokud vás mají v adresáři svého telef
     <string name="safe_threema_id">Vaše ${app_name_short} ID</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="safe_restore_enter_id">Zadejte prosím ${app_name_short} ID, které si přejete obnovit</string>
-    <string name="safe_search_id_title">Zadejte prosím číslo mobilního telefonu nebo e‑mailovou adresu propojenou s vaším ID</string>
+    <string name="safe_search_id_title">Zadejte prosím číslo mobilního telefonu nebo e-mailovou adresu propojenou s vaším ${app_name_short} ID</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="safe_id_lookup">Vyhledává se ${app_name_short} ID</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1039,7 +1041,7 @@ přátelům vás automaticky najít, pokud vás mají v adresáři svého telef
     <string name="number_of_days">počet dnů: %d</string>
     <string name="backup_other_restore_options">Další možnosti obnovení</string>
     <string name="safe_size">Velikost zálohy</string>
-    <string name="backup_version_mismatch">Verze této zálohy je vyšší než verze podporovaná. Aktualizujte prosím aplikaci ${app_name_short} na nejnovější verzi.</string>
+    <string name="backup_version_mismatch">Verze této zálohy je vyšší než podporovaná verze. Aktualizujte prosím aplikaci na nejnovější verzi.</string>
     <string name="safe_restore_failed">Obnova selhala</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="safe_failed_notification">Záloha ${app_name_short} Safe se nezdařila %d dní po sobě. Klepněte sem pro další informace.</string>
@@ -1526,7 +1528,7 @@ přátelům vás automaticky najít, pokud vás mají v adresáři svého telef
     <string name="forward_security_explanation">Perfect Forward Secrecy (PFS) chrání zaznamenanou komunikaci před zpětným dešifrováním i když je dlouhodobý šifrovací klíč kompromitován.\n\nTato možnost může být povolena v případě, když aplikace na obou stranách podporuje PFS.</string>
     <string name="group_call_inactivity_left">Skupinový hovor byl opuštěn z důvodu neaktivity</string>
     <string name="missing_permission_external_storage">Soubor nelze zkopírovat. Vyzkoušejte následující postup:\n1. Otevřete aplikaci nastavení.\n2. Přejděte do kategorie „Aplikace“ a zvolte položku „Aplikace se speciálním přístupem“.\n3. Klepněte na „Přístup ke všem souborům“.\n4. Klepněte na tři tečky v pravém horním rohu obrazovky a zvolte „Zobrazit systémové aplikace“.\n5. Klepněte na „Externí úložiště“ a ujistěte se, že je povolena volba „Povolit přístup ke správě všech souborů“.\n6. Znovu vyzkoušejte obnovit zálohu.</string>
-    <string name="forward_security_downgraded_status_message">Funkce Perfect Forward Secrecy byla v této konverzaci zakázána, protože verze aplikace, kterou používá váš konverzační partner, ji nepodporuje.</string>
+    <string name="forward_security_downgraded_status_message">Funkce Perfect Forward Secrecy byla v této konverzaci zakázána, protože ji nepodporuje verze aplikace vaší protistrany, nebo protistrana používá ${app_name_desktop} 2.0 pro desktop (beta).</string>
     <string name="forward_security_illegal_session_status_message">Relace Perfect Forward Secrecy byla obnovena z důvodu neplatnosti.</string>
     <string name="crop_image_title">Oříznout obrázek</string>
     <string name="scroll_to_bottom">Posunout na konec</string>
@@ -1677,6 +1679,12 @@ přátelům vás automaticky najít, pokud vás mají v adresáři svého telef
     <string name="md_drop_device_failed_dialog_title">Odstraňování propojeného zařízení mohlo selhat</string>
     <string name="md_drop_device_failed_dialog_message">Zkontrolujte prosím připojení k internetu a zkuste to znovu.</string>
     <string name="md_drop_device_failed_dialog_button_close">Zavřít</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Během výběru adresáře byl zjištěn potenciální problém. Pokud tyto potíže přetrvávají, uložte zálohu do adresáře „Dokumenty“ namísto výběru vlastního adresáře.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Vybrat vlastní adresář</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Použít adresář „Dokumenty“</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">souhlas odeslán</string>
     <string name="cd_dec_icon">nesouhlas odeslán</string>

+ 8 - 1
app/src/main/res/values-de/strings.xml

@@ -750,7 +750,7 @@
     <string name="status_ballot_user_modified_vote">«%1$s» hat die Stimme für «%2$s» geändert</string>
     <string name="status_ballot_all_votes">Umfrage «%1$s» vollständig</string>
     <string name="restore">Wiederherstellen</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Sie haben weder eine Handynummer noch eine E-Mail-Adresse zur Verknüpfung mit Ihrer ${app_name_short}-ID angegeben, weshalb Sie nicht automatisch zu Kontaktlisten hinzugefügt werden. Möchten Sie ${app_name} wirklich komplett anonym nutzen?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Sie haben keine Handynummer zur Verknüpfung mit Ihrer ${app_name_short}-ID angegeben, weshalb Sie nicht automatisch zu Kontaktlisten hinzugefügt werden. Möchten Sie ${app_name} wirklich komplett anonym nutzen?</string>
@@ -837,6 +837,7 @@
     <string name="really_reset_ringtones">Benachrichtigungstöne auf Werkseinstellung zurücksetzen?</string>
     <string name="reset_ringtones_confirm">Benachrichtigungstöne wurden zurückgesetzt</string>
     <string name="prefs_language_override">Sprache</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">Der ${app_name_short} Channel versorgt Sie mit Neuigkeiten zu ${app_name_short}. Möchten Sie ${app_name_short} Channel abonnieren und zu Ihren Kontakten hinzufügen? Es ist kostenlos und Sie können sich jederzeit abmelden.</string>
     <string name="quote">Zitieren</string>
     <string name="contacts_deleted">Kontakte wurden gelöscht</string>
@@ -1704,6 +1705,12 @@
     <string name="md_drop_device_failed_dialog_title">Entfernen des Geräts möglicherweise fehlgeschlagen</string>
     <string name="md_drop_device_failed_dialog_message">Bitte überprüfen Sie die Internetverbindung und versuchen Sie es erneut.</string>
     <string name="md_drop_device_failed_dialog_button_close">Schliessen</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Bei der Auswahl des Ordners scheint ein Fehler aufgetreten zu sein. Wenn das Problem weiterhin besteht, können Sie das Backup im Ordner «Dokumente» speichern, anstatt einen eigenen Ordner auszuwählen.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Eigenen Ordner wählen</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">«Dokumente»-Ordner verwenden</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">Nachricht bestätigt</string>
     <string name="cd_dec_icon">Nachricht abgelehnt</string>

+ 8 - 1
app/src/main/res/values-es/strings.xml

@@ -726,7 +726,7 @@ almacenado.</string>
     <string name="status_ballot_user_modified_vote">«%1$s» ha cambiado el voto para «%2$s»</string>
     <string name="status_ballot_all_votes">Votos para «%1$s» completados</string>
     <string name="restore">Restaurar</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">No ha introducido ni un número de teléfono ni una dirección de correo electrónico para vincular a su ID de ${app_name_short}. Usted no aparecerá en la lista de contactos de sus amigos. ¿Seguro que desea utilizar ${app_name} de esta forma completamente anónima?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">No has introducido un número de teléfono para vincularlo a tu ID de ${app_name_short}. Por lo tanto, no se te añadirá automáticamente a las listas de contactos. ¿Realmente quieres usar ${app_name} de forma anónima?</string>
@@ -813,6 +813,7 @@ almacenado.</string>
     <string name="really_reset_ringtones">¿Confirma que desea restablecer los ajustes predeterminados de sonidos de notificaciones ?</string>
     <string name="reset_ringtones_confirm">Se han restablecido los ajustes de sonidos de notificaciones</string>
     <string name="prefs_language_override">Idioma</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">${app_name_short} Channel le mantiene actualizado sobre todo lo relativo a ${app_name_short}. ¿Desea añadir ${app_name_short} Channel a sus contactos?</string>
     <string name="quote">Citar</string>
     <string name="contacts_deleted">Se han eliminado los contactos.</string>
@@ -1680,6 +1681,12 @@ almacenado.</string>
     <string name="md_drop_device_failed_dialog_title">Es posible que haya fallado la remoción del dispositivo vinculado</string>
     <string name="md_drop_device_failed_dialog_message">Compruebe la conexión a internet e inténtelo de nuevo.</string>
     <string name="md_drop_device_failed_dialog_button_close">Cerrar</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Se ha detectado un problema en potencia al seleccionar la carpeta. Si continúa este problema, puede guardar la copia de seguridad en la carpeta «Documentos» en lugar de elegir una carpeta personalizada.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Seleccionar carpeta personalizada</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Usar carpeta «Documentos»</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">aceptar el envío</string>
     <string name="cd_dec_icon">no estoy de acuerdo enviado</string>

+ 8 - 1
app/src/main/res/values-fr/strings.xml

@@ -721,7 +721,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="status_ballot_user_modified_vote">« %1$s » a changé le vote pour « %2$s »</string>
     <string name="status_ballot_all_votes">Votes pour « %1$s » terminés</string>
     <string name="restore">Restaurer</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Vous n\'avez saisi ni numéro de téléphone portable, ni adresse e-mail à associer à votre ID ${app_name_short}. Vous n\'apparaîtrez pas dans la liste de contacts de vos amis. Voulez-vous vraiment utiliser ${app_name} de façon complètement anonyme?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Vous n’avez pas saisi de numéro de téléphone à associer à votre identifiant ${app_name_short}. Vous ne serez donc pas automatiquement ajouté aux listes de contacts. Voulez-vous vraiment utiliser ${app_name} de manière anonyme ?</string>
@@ -808,6 +808,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="really_reset_ringtones">Vraiment réinitialiser les paramètres sonores des notifications ?</string>
     <string name="reset_ringtones_confirm">Les paramètres sonores des notifications ont été réinitialisés.</string>
     <string name="prefs_language_override">Langue</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">La chaîne ${app_name_short} vous fournit des informations sur tout ce qui concerne ${app_name_short}. Souhaitez-vous vous abonner à la chaîne ${app_name_short} et l’ajouter à vos contacts ? C’est gratuit et vous pouvez vous désabonner à tout moment.</string>
     <string name="quote">Citation</string>
     <string name="contacts_deleted">Les contacts ont été supprimés</string>
@@ -1675,6 +1676,12 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="md_drop_device_failed_dialog_title">Il est possible que le retrait du dispositif lié ait échoué</string>
     <string name="md_drop_device_failed_dialog_message">Veuillez vérifier la connexion Internet et réessayer.</string>
     <string name="md_drop_device_failed_dialog_button_close">Fermer</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Un problème potentiel a été détecté lors de la sélection du dossier. Si le problème persiste, vous pouvez enregistrer la sauvegarde dans le dossier « Documents » au lieu de choisir un dossier personnalisé.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Sélectionner un dossier personnalisé</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Utiliser le dossier « Documents »</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">accord envoyé</string>
     <string name="cd_dec_icon">désaccord envoyé</string>

+ 13 - 6
app/src/main/res/values-gsw/strings.xml

@@ -716,7 +716,7 @@
     <string name="status_ballot_user_modified_vote">«%1$s» hät d’Stimm für «%2$s» gänderet</string>
     <string name="status_ballot_all_votes">Umfrag «%1$s» vollständig</string>
     <string name="restore">Wiederherstelle</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Sie händ weder e Handynummere no e E-Mail-Adrässe zur Verchnüpfig mit Ihrere ${app_name_short}-ID ageh. Sie werded drum nöd automatisch in Kontaktliste ufgfüehrt. Wänd Sie ${app_name} würklich komplett anonym nutze?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Sie händ kei Handynummere zur Verchnüpfig mit Ihrere ${app_name_short}-ID ageh. Sie werded drum nöd automatisch in Kontaktliste azeigt. Wänd Sie ${app_name} würklich komplett anonym nutze?</string>
@@ -803,6 +803,7 @@
     <string name="really_reset_ringtones">Benachrichtigungstön uf Werchsiistellige zruggsetze?</string>
     <string name="reset_ringtones_confirm">Benachrichtigungstön sind zrugggsetzt worde</string>
     <string name="prefs_language_override">Sprach</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">De ${app_name_short} Channel versorgt Sie mit Neuigkeite zu ${app_name_short}. Wänd Sie de ${app_name_short} Channel abonniere und zu Ihrne Kontäkt dezue tue? Das choschtet nüüt, und Sie chönd sich jederziit abmälde.</string>
     <string name="quote">Zitiere</string>
     <string name="contacts_deleted">Kontäkt sind glöscht worde</string>
@@ -1209,7 +1210,7 @@
     <string name="prefs_work_time_end">Arbetsschluss</string>
     <string name="prefs_work_time_end_sum">Legged Sie de Arbetsschluss fest</string>
     <string name="prefs_working_days_enable_title">Ruheziit-Regelig</string>
-    <string name="prefs_working_days_enable_sum">Usserhalb vode Arbetsziit kei Benachrichtigunge aazeige und ${app_name_short}-Arüef ablehne</string>
+    <string name="prefs_working_days_enable_sum">Usserhalb vode Arbetsziit kei Benachrichtigunge aazeige und Arüef ablehne</string>
     <string name="work_life_dnd_active">Ruheziit aktiv</string>
     <string name="warning">Warnig</string>
     <string name="password_remember_warning">Merked Sie sich, was Sie da iigebed! Wil %s kei Passwörter uf Server speicheret, chönd mir Ihne nöd hälfe, wenn Sie d’PIN oder d’Passphrase vergässe händ.</string>
@@ -1478,7 +1479,7 @@
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="read_phone_state_dialog_message">Zum verhindere, dass ${app_name_short}-Arüef reguläri Arüef underbrächet, wird d’Telefon-Berächtigung benötigt. Falls die Berächtigung nöd geh isch, wird en ${app_name_short}-Aruef en reguläre Aruef underbräche und umgekehrt.</string>
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
-    <string name="read_phone_state_short_message">Zum laufendi Arüef z’berücksichtige, wird d’Telefon-Berächtigung benötigt.</string>
+    <string name="read_phone_state_short_message">Zum laufendi Arüef z’berücksichtige, bruucht ${app_name} d’Telefon-Berächtigung.</string>
     <string name="prefs_title_read_phone_state">Telefon-Berächtigung erteile</string>
     <string name="prefs_title_hibernation">Nöd bruuchti Apps</string>
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1497,14 +1498,14 @@
     <string name="checking_compatibility">D’Kompatibilität wird überprüeft…</string>
     <string name="group_call_mic_permission_rationale">Zum Gruppearüef mache z’chöne, müend Sie under «Berächtigunge» in %s de Zuegriff ufs Mikrofon erlaube.</string>
     <string name="group_call_mic_permission_description">Zum Gruppearüef nutze z’chöne, wird d’Mikrofon-Berächtigung benötigt, demit die andere Sie chönd ghöre.</string>
-    <string name="call_mic_permission_description">Zum ${app_name_short}-Arüef nutze z’chöne, wird d’Mikrofon-Berächtigung benötigt, demit Sie ghört werded.</string>
+    <string name="call_mic_permission_description">Für Arüef wird d’Mikrofon-Berächtigung benötigt, demit Sie ghört werded.</string>
     <string name="group_call_camera_permission_rationale">Demit die andere Teilnehmer Ihres Bild chönd gseh, müend Sie under «Berächtigunge» in %s de Zuegriff uf d’Kamera erlaube.</string>
     <string name="group_call_phone_permission_description">Zum Gruppearüef nutze z’chöne, wird d’Telefon-Berächtigung benötigt, demit de Gruppearuef beendet werde cha, wenn Sie en andere Aruef aanehmed.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="call_phone_permission_description">Zum ${app_name_short}-Arüef nutze z’chöne, wird d’Telefon-Berächtigung benötigt, demit de ${app_name_short}-Aruef beendet werde cha, wenn Sie en andere Aruef aanehmed.</string>
-    <string name="group_call_nearby_devices_permission_description">Zum Gruppearüef mit Bluetooth-Headset nutze z’chöne, wird d’Berächtigung «Geräte in der Nähe» benötigt, demit ${app_name_short} es Bluetooth-Headset erchänne cha.</string>
+    <string name="group_call_nearby_devices_permission_description">Für Gruppearüef über Bluetooth-Headset wird d’Berächtigung «Geräte in der Nähe» benötigt, demit s’Bluetooth-Headset chan erchännt werde.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
-    <string name="call_nearby_devices_permission_description">Zum ${app_name_short}-Arüef mit Bluetooth-Headset nutze z’chöne, wird d’Berächtigung «Geräte in der Nähe» benötigt, demit ${app_name_short} es Bluetooth-Headset erchänne cha.</string>
+    <string name="call_nearby_devices_permission_description">Für ${app_name_short}-Arüef über Bluetooth-Headset wird d’Berächtigung «Geräte in der Nähe» benötigt, demit s’Bluetooth-Headset chan erchännt werde.</string>
     <string name="settings">Iistellige</string>
     <string name="leave">Verlaa</string>
     <string name="fs_key_mismatch">Schlüsselfehler</string>
@@ -1669,6 +1670,12 @@
     <string name="md_drop_device_failed_dialog_title">Entferne vom Grät möglicherwiis fehlgschlage</string>
     <string name="md_drop_device_failed_dialog_message">Bitte überprüefed Sie d’Internetverbindig und versueched Sie’s nomal.</string>
     <string name="md_drop_device_failed_dialog_button_close">Schlüsse</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Bi de Uswahl vom Ordner schiint en Fehler ufträtte z’sii. Wenn s’Problem wiiterhin bestaht, chönd Sie s’Backup im Ordner «Dokumente» speichere, statt en eigene Ordner uszwähle.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">En eigene Ordner uswähle</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">De «Dokumente»-Ordner wähle</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">Nachricht bestätigt</string>
     <string name="cd_dec_icon">Nachricht abglehnt</string>

+ 5 - 1
app/src/main/res/values-hu/strings.xml

@@ -681,7 +681,7 @@
     <string name="status_ballot_user_modified_vote">«%1$s» megváltoztatta szavazatát «%2$s»-hoz</string>
     <string name="status_ballot_all_votes">Szavazás «%1$s» befejeződött</string>
     <string name="restore">Visszaállítás</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_scan_id_backup">Vagy szkennelje be az ID export QR-kódját.</string>
     <string name="error_saving_file">Hiba mentés közben. Nincs engedélye?</string>
@@ -747,6 +747,7 @@
     <string name="really_reset_ringtones">Értesítési hangok visszaállítása a gyári beállításokra?</string>
     <string name="reset_ringtones_confirm">Értesítési hangok visszaállítva</string>
     <string name="prefs_language_override">Nyelv</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">A ${app_name_short} Channel a ${app_name_short}-ról szóló hírekkel látja el Önt. Szeretne feliratkozni a ${app_name_short} Channelre és hozzáadni a névjegyzékbe? Ingyenes, és bármikor leiratkozhatsz róla.</string>
     <string name="quote">Idéz</string>
     <string name="contacts_deleted">A névjegyek törölve lettek</string>
@@ -1339,6 +1340,9 @@ Ha új eszközre vált, kérjük, távolítsa el vagy deaktiválja a %s-t a rég
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <!-- Label on button to dismiss/hide a warning -->
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
     <!-- accessibility -->
     <!-- Hint shown on message details screen, to let the user know how they can view a message's emoji reactions -->
     <!-- Title shown in popup above emoji reaction buttons on a message, to hint to the user that they can long-press to view the details -->

+ 8 - 1
app/src/main/res/values-it/strings.xml

@@ -737,7 +737,7 @@
     <string name="status_ballot_user_modified_vote">«%1$s» ha modificato il voto per «%2$s»</string>
     <string name="status_ballot_all_votes">Votazioni per «%1$s» completate</string>
     <string name="restore">Ripristina</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Non hai inserito né il numero di cellulare né l\'indirizzo e-mail da collegare al tuo ${app_name_short} ID. Non comparirai nella lista contatti del tuo amico. Vuoi davvero usare ${app_name} in modo totalmente anonimo?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Poiché non hai inserito alcun numero di telefono da associare al tuo ID ${app_name_short}, non verrai aggiunto automaticamente alla rubrica. Vuoi davvero utilizzare ${app_name} in modo anonimo?</string>
@@ -824,6 +824,7 @@
     <string name="really_reset_ringtones">Vuoi davvero reimpostare l\'audio delle notifiche e tornare alle impostazioni predefinite?</string>
     <string name="reset_ringtones_confirm">Le impostazioni relative all\'audio delle notifiche sono state reimpostate.</string>
     <string name="prefs_language_override">Lingua</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">Il canale ${app_name_short} ti offre tutte le notizie riguardanti ${app_name_short}. Vuoi iscriverti al canale ${app_name_short} e aggiungerlo ai tuoi contatti? È gratuito e puoi annullare l\'iscrizione in qualsiasi momento.</string>
     <string name="quote">Quota</string>
     <string name="contacts_deleted">I contatti sono stati cancellati</string>
@@ -1691,6 +1692,12 @@
     <string name="md_drop_device_failed_dialog_title">La rimozione del dispositivo collegato non è riuscita</string>
     <string name="md_drop_device_failed_dialog_message">Controlla la connessione a Internet e riprova.</string>
     <string name="md_drop_device_failed_dialog_button_close">Chiudi</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">È stato rilevato un potenziale problema durante la selezione della cartella. Se il problema persiste, puoi salvare il backup nella cartella \"Documenti\" anziché scegliere una cartella personalizzata.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Seleziona cartella personalizzata</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Utilizza la cartella \"Documenti\"</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">accordo inviato</string>
     <string name="cd_dec_icon">disaccordo inviato</string>

+ 5 - 1
app/src/main/res/values-ja/strings.xml

@@ -706,7 +706,7 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="status_ballot_user_modified_vote">«%1$s»が«%2$s»への投票を変更しました</string>
     <string name="status_ballot_all_votes">«%1$s» への投票が完了しました</string>
     <string name="restore">復元</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">${app_name_short} IDに登録する携帯電話番号やメールアドレスが入力されていません。友達の連絡先リストには表示されません。本当に匿名で${app_name}を利用しますか?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">${app_name_short} IDと連携する携帯電話番号が入力されていません。友達の連絡先リストには表示されません。本当に匿名で${app_name}を利用しますか?</string>
@@ -778,6 +778,7 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="really_reset_ringtones">通知音の設定をデフォルトに戻しますか?</string>
     <string name="reset_ringtones_confirm">通知音の設定がリセットされました。</string>
     <string name="prefs_language_override">言語</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">${app_name_short} Channelでは、${app_name_short}に関するあらゆるニュースを提供しています。${app_name_short} Channelを購読して、連絡先に追加してみませんか?登録は無料で、いつでも解除することができます。</string>
     <string name="quote">引用</string>
     <string name="contacts_deleted">連絡先は削除されました</string>
@@ -1585,6 +1586,9 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="media_gallery_animated_webps">アニメーションWebP</string>
     <string name="unsupported_image_type">サポート外の画像形式: %s</string>
     <string name="add_contact_failed">連絡先の追加が失敗しました</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
     <!-- accessibility -->
     <!-- Hint shown on message details screen, to let the user know how they can view a message's emoji reactions -->
     <!-- Title shown in popup above emoji reaction buttons on a message, to hint to the user that they can long-press to view the details -->

+ 8 - 1
app/src/main/res/values-nl-rNL/strings.xml

@@ -721,7 +721,7 @@ Voer een vraag in voor uw poll.</string>
     <string name="status_ballot_user_modified_vote">«%1$s» heeft zijn/haar stem veranderd in «%2$s»</string>
     <string name="status_ballot_all_votes">Stemmen voor «%1$s» voltooid</string>
     <string name="restore">Herstellen</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">U hebt nog geen mobiel nummer of e-mailadres ingevoerd om te koppelen aan uw ${app_name_short} ID. U verschijnt niet op contactlijsten van vrienden. Weet u zeker dat u ${app_name} anoniem wil gebruiken?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">U hebt nog geen mobiel nummer ingevoerd om te koppelen aan uw ${app_name_short}-ID. U wordt daarom niet automatisch aan contactlijsten van vrienden toegevoegd. Weet u zeker dat u ${app_name} anoniem wil gebruiken?</string>
@@ -808,6 +808,7 @@ Voer een vraag in voor uw poll.</string>
     <string name="really_reset_ringtones">Meldingsgeluidsinstellingen echt herstellen naar standaard?</string>
     <string name="reset_ringtones_confirm">Meldingsgeluidsinstellingen zijn hersteld.</string>
     <string name="prefs_language_override">Taal</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">Het ${app_name_short}-kanaal biedt u alle nieuwtjes over ${app_name_short}. Wilt u zich abonneren op het ${app_name_short}-kanaal en dit toevoegen aan uw contactpersonen? Het is gratis en u kunt zich op elk gewenst moment afmelden.</string>
     <string name="quote">Citeren</string>
     <string name="contacts_deleted">Contactpersonen zijn verwijderd</string>
@@ -1676,6 +1677,12 @@ Wanneer u ${app_name_short} Safe gebruikt, kunt u uw ${app_name_short}-ID, conta
     <string name="md_drop_device_failed_dialog_title">Het verwijderen van het gekoppelde apparaat is mogelijk mislukt</string>
     <string name="md_drop_device_failed_dialog_message">Controleer de internetverbinding en probeer het opnieuw.</string>
     <string name="md_drop_device_failed_dialog_button_close">Sluiten</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Er is een mogelijk probleem gedetecteerd bij het selecteren van de map. Blijft het probleem zich voordoen, dan kunt u de back-up opslaan in de map \'Documenten\' in plaats van een eigen map te kiezen.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Eigen map selecteren</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Map \'Documenten\' gebruiken</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">akkoord verzonden</string>
     <string name="cd_dec_icon">niet akkoord verzonden</string>

+ 5 - 1
app/src/main/res/values-no/strings.xml

@@ -683,7 +683,7 @@ http://www.7-zip.org eller https://itunes.apple.com/us/app/the-unarchiver/id4254
     <string name="status_ballot_user_modified_vote">\"%1$s\" har endret stemmen sin til \"%2$s\"</string>
     <string name="status_ballot_all_votes">Stemmer for \"%1$s\" er fullført</string>
     <string name="restore">Gjenopprett</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Du har ikke skrevet et telefonnummer eller en e-postadresse for å koble til din ${app_name_short} ID. Du vil ikke dukke opp på dine venners kontaktliste. Vil du virkelig bruke ${app_name} anonymt?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Du har ikke skrevet et telefonnummer for å koble til din ${app_name_short} ID. Du vil ikke dukke opp på dine venners kontaktliste. Vil du virkelig bruke ${app_name} anonymt?</string>
@@ -755,6 +755,7 @@ http://www.7-zip.org eller https://itunes.apple.com/us/app/the-unarchiver/id4254
     <string name="really_reset_ringtones">Vil du virkelig resette innstillinger for varsellyder til standard?</string>
     <string name="reset_ringtones_confirm">Innstillinger for varsellyder har blitt resatt.</string>
     <string name="prefs_language_override">Språk</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">${app_name_short} Channel gir deg nyheter om alt som omhandler ${app_name_short}. Vil du abonnere til ${app_name_short} Channel og legge det til dine kontakter? Det er gratis og du kan avslutte abonnementet når som helst.</string>
     <string name="quote">Sitat</string>
     <string name="contacts_deleted">Kontakter har blitt slettet</string>
@@ -1552,6 +1553,9 @@ Om du bytter til en ny enhet, vennligst avinstaller eller deaktiver %s på den g
     <string name="media_gallery_animated_webps">Animerte WebP-er</string>
     <string name="unsupported_image_type">Ustøttet bildeformat: %s</string>
     <string name="application_setup_steps_failed">Det er krav om en aktiv internettforbindelse for å sjekke tilstanden til kontaktene dine. Sørg for at du er tilkoblet internett, og prøv igjen.</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
     <!-- accessibility -->
     <!-- Hint shown on message details screen, to let the user know how they can view a message's emoji reactions -->
     <!-- Title shown in popup above emoji reaction buttons on a message, to hint to the user that they can long-press to view the details -->

+ 8 - 1
app/src/main/res/values-pl/strings.xml

@@ -729,7 +729,7 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="status_ballot_user_modified_vote">«%1$s» zmienił(a) głos oddany na «%2$s»</string>
     <string name="status_ballot_all_votes">Głosowanie na „%1$s” zakończone</string>
     <string name="restore">Przywróć</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Nie podano ani numeru komórki, ani adresu e-mail do połączenia z twoim ID w ${app_name_short}. Nie pojawisz się na listach kontaktów swoich znajomych. Naprawdę chcesz używać ${app_name} anonimowo?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Nie udało Ci się wprowadzić numeru telefonu w celu powiązania go z identyfikatorem ${app_name_short}. Zatem nie wpiszemy Cię automatycznie na listy kontaktów. Czy naprawdę chcesz anonimowo korzystać z aplikacji ${app_name}?</string>
@@ -816,6 +816,7 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="really_reset_ringtones">Czy na pewno chcesz przywrócić domyślne ustawienia dźwiękowe powiadomień?</string>
     <string name="reset_ringtones_confirm">Ustawienia dźwiękowe powiadomień zostały zresetowane.</string>
     <string name="prefs_language_override">Język</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">Kanał ${app_name_short} dostarcza wiadomości na temat wszystkich rzeczy związanych z aplikacją ${app_name_short}. Czy chcesz subskrybować kanał ${app_name_short} oraz dodać go do swoich kontaktów? Jest bezpłatny i w każdej chwili możesz anulować subskrypcję.</string>
     <string name="quote">Cytat</string>
     <string name="contacts_deleted">Kontakty zostały usunięte</string>
@@ -1685,6 +1686,12 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="md_drop_device_failed_dialog_title">Usuwanie powiązanego urządzenia mogło się nie udać</string>
     <string name="md_drop_device_failed_dialog_message">Sprawdź połączenie z siecią i spróbuj ponownie.</string>
     <string name="md_drop_device_failed_dialog_button_close">Zamknij</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Wykryto potencjalny problem podczas wybierania folderu. Jeśli problem nie zniknie, możesz zapisać kopię zapasową w folderze „Dokumenty”, zamiast wybierać własny folder.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Wybierz własny folder</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Skorzystaj z folderu „Dokumenty”</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">zgoda została wysłana</string>
     <string name="cd_dec_icon">informacja o braku zgody została wysłana</string>

+ 8 - 1
app/src/main/res/values-pt-rBR/strings.xml

@@ -721,7 +721,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="status_ballot_user_modified_vote">«%1$s» alterou o voto em «%2$s»</string>
     <string name="status_ballot_all_votes">Votos para «%1$s» concluídos</string>
     <string name="restore">Restaurar</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Você não inseriu um número de celular ou um endereço de e-mail para vincular à sua ID do ${app_name_short}. Você não aparecerá na lista de contatos de seus amigos. Você realmente quer usar o ${app_name} de forma completamente anônima?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Você não inseriu um número de telefone para vincular ao seu ID do ${app_name_short}. Você, portanto, não será adicionado automaticamente às listas de contatos. Você realmente deseja usar o ${app_name} anonimamente?</string>
@@ -808,6 +808,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="really_reset_ringtones">Redefinir as configurações de sons de notificação para o padrão?</string>
     <string name="reset_ringtones_confirm">As configurações de sons de notificação foram redefinidas.</string>
     <string name="prefs_language_override">Idioma</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">O Canal ${app_name_short} lhe traz todas as novidades sobre o ${app_name_short}. Você gostaria de adicionar o Canal ${app_name_short} aos seus contatos?</string>
     <string name="quote">Citação</string>
     <string name="contacts_deleted">Os contatos foram excluídos</string>
@@ -1676,6 +1677,12 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="md_drop_device_failed_dialog_title">Pode ter ocorrido uma falha na remoção do dispositivo vinculado</string>
     <string name="md_drop_device_failed_dialog_message">Verifique a conexão com a Internet e tente novamente.</string>
     <string name="md_drop_device_failed_dialog_button_close">Fechar</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Detectamos um possível problema durante a seleção da pasta. Se o problema persistir, você pode salvar o backup na pasta \"Documentos\", em vez de escolher uma pasta personalizada.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Selecionar pasta personalizada</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Usar a pasta “Documentos”</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">aceitação enviada</string>
     <string name="cd_dec_icon">recusa enviada</string>

+ 10 - 3
app/src/main/res/values-ru/strings.xml

@@ -719,7 +719,7 @@
     <string name="status_ballot_user_modified_vote">«%1$s» изменил(а) голос за «%2$s»</string>
     <string name="status_ballot_all_votes">Голосов за «%1$s»</string>
     <string name="restore">Восстановить</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Вы не указали ни номера мобильного телефона, ни адреса электронной почты для привязки к вашему ${app_name_short} ID. Вы не появитесь в списке контактов ваших друзей. Вы действительно хотите использовать ${app_name} анонимно?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Вы не указали номер мобильного телефона для привязки к своему ${app_name_short} ID. Вы не появитесь в списке контактов ваших друзей. Вы действительно хотите использовать ${app_name} анонимно?</string>
@@ -806,7 +806,8 @@
     <string name="really_reset_ringtones">Сбросить настройки звуковых уведомлений по умолчанию?</string>
     <string name="reset_ringtones_confirm">Настройки звуковых уведомлений были сброшены.</string>
     <string name="prefs_language_override">Язык</string>
-    <string name="threema_channel_intro">Канал ${app_name_short} предоставляет вам новости обо всех событиях ${app_name_short}. Подписаться на канал и добавить его в список контактов? Это бесплатно и вы можете отписаться в любое время.</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
+    <string name="threema_channel_intro">Канал ${app_name_short} предоставляет вам новости обо всех событиях ${app_name_short}. Подписаться на канал ${app_name_short} и добавить его в список контактов? Это бесплатно и вы можете отписаться в любое время.</string>
     <string name="quote">Цитировать</string>
     <string name="contacts_deleted">Контакты были удалены</string>
     <string name="take_photo">Сфотографировать</string>
@@ -884,7 +885,7 @@
     <string name="prefs_summary_force_turn_off">По возможности устанавливать прямое соединение и ретранслировать звонки непроверенным контактам только через серверы ${company_name}. Может быть виден ваш IP-адрес.</string>
     <!-- ${company_name} is a placeholder for the name of the company that operates the app, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="prefs_summary_force_turn_on">Принудительно ретранслировать все звонки через серверы ${company_name} с защитой вашего IP-адреса. Может ухудшаться качество связи.</string>
-    <string name="permission_record_audio_required">Для совершения шифрованных звонков и отправки голосовых сообщений предоставьте приложению ${app_name_short} доступ к микрофону.</string>
+    <string name="permission_record_audio_required">Для совершения шифрованных звонков и отправки голосовых сообщений предоставьте приложению доступ к микрофону.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="prefs_voice_call_notifications">Звонки ${app_name_short}</string>
     <string name="prefs_voice_call_sound">Сигнал звонка</string>
@@ -1675,6 +1676,12 @@
     <string name="md_drop_device_failed_dialog_title">Возможно, не удалось удалить привязанное устройство</string>
     <string name="md_drop_device_failed_dialog_message">Проверьте подключение к интернету и повторите попытку.</string>
     <string name="md_drop_device_failed_dialog_button_close">Закрыть</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Возможна потенциальная проблема с выбранной папкой. Если она произойдёт, вы сможете сохранить резервную копию в папке «Documents» вместо выбранной.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Использовать выбранную папку</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Использовать папку «Documents»</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">согласие отправлено</string>
     <string name="cd_dec_icon">несогласие отправлено</string>

+ 5 - 1
app/src/main/res/values-sk/strings.xml

@@ -716,7 +716,7 @@ Už ich nebude možné obnoviť.</string>
     <string name="status_ballot_user_modified_vote">“%1$s” zmenil hlasovanie pre “%2$s”</string>
     <string name="status_ballot_all_votes">Hlasy pre anketu „%1$s“ sú kompletné</string>
     <string name="restore">Obnoviť</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Nezadali ste ani číslo mobilného telefónu, ani emailovú adresu, ktoré by boli prepojené s vašim ${app_name_short} ID. Nebudete se zobrazovať v zozname kontaktov vašich priateľov. Naozaj chcete používať aplikáciu ${app_name} anonymne?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Nezadali ste číslo mobilného telefónu, ktoré by bolo prepojené s vašim ${app_name_short} ID. Nebudete se zobrazovať v zozname kontaktov vašich priateľov. Naozaj chcete používať aplikáciu ${app_name} anonymne?</string>
@@ -802,6 +802,7 @@ Už ich nebude možné obnoviť.</string>
     <string name="really_reset_ringtones">Obnoviť nastavenia zvukových upozornení na východzie hodnoty?</string>
     <string name="reset_ringtones_confirm">Nastavenia zvukových upozornení boli obnovené.</string>
     <string name="prefs_language_override">Jazyk</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="quote">Citovať</string>
     <string name="contacts_deleted">Kontakty boli vymazané</string>
     <string name="take_photo">Odfotiť</string>
@@ -1669,6 +1670,9 @@ Vykonajte prosím zálohú vašich údajov vhodnou metódou.</string>
     <string name="md_drop_device_failed_dialog_title">Odstránenie prepojeného zariadenia mohlo zlyhať</string>
     <string name="md_drop_device_failed_dialog_message">Skontrolujte prosím internetové pripojenie a skúste to znova.</string>
     <string name="md_drop_device_failed_dialog_button_close">Zatvoriť</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
     <!-- accessibility -->
     <string name="cd_ack_icon">súhlas odoslaný</string>
     <string name="cd_dec_icon">nesúhlas odoslaný</string>

+ 9 - 1
app/src/main/res/values-tr/strings.xml

@@ -719,7 +719,7 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <string name="status_ballot_user_modified_vote">\"%1$s\", \"%2$s\" için oyunu değiştirdi</string>
     <string name="status_ballot_all_votes">\"%1$s\" için oylar tamamlandı</string>
     <string name="restore">Geri yükle</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">${app_name_short} kimliğinize bağlamak için telefon numarası veya e-posta adresi girmediniz. Arkadaşlarınızın kişi listelerinde görünmezsiniz. ${app_name}\'ı tamamen anonim şekilde kullanmak istiyor musunuz?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">${app_name_short} kimliğinize bağlamak için bir telefon numarası girmediniz. Bu nedenle, otomatik olarak kişi listelerine eklenmeyeceksiniz. ${app_name} uygulamasını gerçekten anonim olarak kullanmak istiyor musunuz?</string>
@@ -806,6 +806,7 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <string name="really_reset_ringtones">Bildirim tonunu gerçekten varsayılan ayarlara sıfırlamak istiyor musunuz?</string>
     <string name="reset_ringtones_confirm">Bildirim tonu ayarları sıfırlandı.</string>
     <string name="prefs_language_override">Dil</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">${app_name_short} Kanalı size ${app_name_short} ile ilgili her şey hakkında haberler sunuyor. ${app_name_short} Kanalına abone olmak ve rehberinize eklemek ister misiniz? Ücretsizdir ve istediğiniz zaman aboneliğinizi iptal edebilirsiniz.</string>
     <string name="quote">Alıntıla</string>
     <string name="contacts_deleted">Kişiler silindi</string>
@@ -1588,6 +1589,7 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <string name="status_orphaned_group">*Bu grup öksüz kaldı*\nGrubu oluşturan kişi gruptan ayrılmıştır ve grup artık sürdürülemez. Kalan üyelerden biri yeni yönetici olmak için grubu klonlayabilir (grup ayrıntıları aracılığıyla).</string>
     <string name="group_not_a_member_notice">Artık bu grubun bir parçası değilsiniz ve bu grubu kullanamazsınız.</string>
     <string name="group_dissolved_notice">Bu grup dağıtılmıştır ve artık kullanılamaz.</string>
+    <string name="md_linked_devices">${app_name_desktop} 2.0 Masaüstü Sürümü (Beta)</string>
     <string name="md_link_device">Yeni cihaz bağla</string>
     <!-- ${app_name_desktop} is a placeholder for the desktop app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <!-- The part of this text that is surrounded by the square brackets will be clickable by the user and lead them to the download page for the desktop client -->
@@ -1671,6 +1673,12 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <string name="md_drop_device_failed_dialog_title">Bağlantılı cihazın kaldırılması başarısız olmuş olabilir</string>
     <string name="md_drop_device_failed_dialog_message">Lütfen İnternet bağlantısını kontrol edin ve tekrar deneyin.</string>
     <string name="md_drop_device_failed_dialog_button_close">Kapat</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Klasör seçimi sırasında olası bir sorun tespit edildi. Sorun devam ederse, özel bir klasör seçmek yerine yedeklemeyi \"Belgeler\" klasörüne kaydedebilirsiniz.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Özel klasör seçin</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">\"Belgeler\" klasörünü kullanın.</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">\"kabul\" gönderildi</string>
     <string name="cd_dec_icon">\"katılmıyorum\" gönderildi</string>

+ 10 - 3
app/src/main/res/values-uk/strings.xml

@@ -755,7 +755,7 @@
     <string name="status_ballot_user_modified_vote">Контакт \"%1$s\" змінив свій голос в опитуванні \"%2$s\"</string>
     <string name="status_ballot_all_votes">Голосування в опитуванні \"%1$s\" завершено</string>
     <string name="restore">Відновити</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">Ви не зв\'язали номер телефону або адресу ел. пошти з ID ${app_name_short}, а тому не з\'явитесь у списках контактів своїх друзів. Справді використовувати ${app_name} анонімно?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">Ви не зв\'язали номер телефону\tз ID ${app_name_short}, а тому не з\'явитесь у списках контактів своїх друзів. Справді використовувати ${app_name} анонімно?</string>
@@ -842,6 +842,7 @@
     <string name="really_reset_ringtones">Скинути налаштування звуку сповіщень до значень за умовчанням?</string>
     <string name="reset_ringtones_confirm">Налаштування звуку сповіщень скинуто.</string>
     <string name="prefs_language_override">Мова</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">Канал ${app_name_short} Channel публікує всі новини, пов\'язані з ${app_name_short}. Підписатися на ${app_name_short} Channel і додати цей канал у контакти? Це безкоштовно, і ви завжди зможете відписатися.</string>
     <string name="quote">Цитувати</string>
     <string name="contacts_deleted">Контакти видалено</string>
@@ -1149,7 +1150,7 @@
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="work_safe_forced_explain">Ваш адміністратор увімкнув ${app_name_short} Safe на вашому пристрої.</string>
     <string name="pin_locked_cannot_send">Додаток заблоковано. Неможливо надіслати.</string>
-    <string name="prefs_summary_hide_screenshots_notice">Коли в меню \"Безпека\" ввімкнено функцію \"Блокувати додаток\", ми приховуємо вміст ${app_name_short} та блокуємо зйомку екрана задля конфіденційності</string>
+    <string name="prefs_summary_hide_screenshots_notice">Коли в меню \"Безпека\" ввімкнено функцію \"Блокувати додаток\", ми приховуємо вміст і блокуємо зйомку екрана задля конфіденційності</string>
     <string name="work_select_categories">Виберіть категорії</string>
     <string name="my_profile">Мій профіль</string>
     <string name="message_too_long">Повідомлення задовге. Неможливо надіслати.</string>
@@ -1574,7 +1575,7 @@
     <string name="apply_changes">Застосувати зміни</string>
     <string name="prefs_threema_work_summary">Шукаєте професійне рішення для бізнес-спілкування? Натисніть тут, щоб дізнатися більше про Threema Work.</string>
     <string name="notification_channel_voice_message_player">Програвач голосових повідомлень</string>
-    <string name="voice_message_from">Голосове повідомлення від \"%s\"</string>
+    <string name="voice_message_from">Голосове повідомлення від %s</string>
     <string name="vm_fg_service_not_allowed">Помилка відтворення голосового повідомлення</string>
     <string name="vm_fg_service_not_allowed_explain">Натисніть кнопку відтворення в сповіщенні медіа-вмісту, якщо воно досі є, або відкрийте додаток, щоб почати відтворення із чату.</string>
     <string name="use_threema_without_this_permission">Використовувати %s без цього дозволу</string>
@@ -1711,6 +1712,12 @@
     <string name="md_drop_device_failed_dialog_title">Не вдалося вилучити зв\'язаний пристрій</string>
     <string name="md_drop_device_failed_dialog_message">Перевірте з\'єднання з Інтернетом і повторіть спробу.</string>
     <string name="md_drop_device_failed_dialog_button_close">Закрити</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">Не вдалося вибрати власну папку. Якщо ця проблема не зникне, можете зберегти резервну копію в папці \"Documents\".</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Вибрати власну папку</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Використовувати папку \"Documents\"</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">\"погоджуюся\" надіслано</string>
     <string name="cd_dec_icon">\"не погоджуюся\" надіслано</string>

+ 11 - 1
app/src/main/res/values-zh-rCN/strings.xml

@@ -440,6 +440,7 @@
     <string name="is_typing">输入中…</string>
     <string name="push_not_available_title">找不到推送服务</string>
     <string name="push_not_available_text1">我们无法在您的设备上找到推送服务,因为 Google Play 服务没有安装或过时。</string>
+    <string name="push_not_available_text2">%s 将在后台持续与服务器连接。如果您的设备启用了电池优化,这可能会干扰后台连接,无法持续运行。</string>
     <string name="backup_in_progress">正在进行备份</string>
     <string name="backup_or_restore_success_body">数据备份成功完成</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -746,7 +747,7 @@ ${app_name_short} 支持的所有表情符号。</string>
     <string name="status_ballot_user_modified_vote">%1$s 更改了 %2$s 的投票</string>
     <string name="status_ballot_all_votes">已完成 %1$s 的投票</string>
     <string name="restore">恢复</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">您没有输入手机号码或电子邮件地址链接到\n${app_name_short} ID。您将不会出现在朋友的联系人列表中。您确定要匿名使用 ${app_name} 吗?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">您没有输入手机号码链接到${app_name_short} ID。您将不会出现在朋友的联系人列表中。您确定要匿名使用 ${app_name} 吗?</string>
@@ -833,6 +834,7 @@ ${app_name_short} 支持的所有表情符号。</string>
     <string name="really_reset_ringtones">真的将通知声音设置重置为默认值吗?</string>
     <string name="reset_ringtones_confirm">通知声音设置已重设。</string>
     <string name="prefs_language_override">语言</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">${app_name_short} 频道为您提供关于 ${app_name_short} 的所有新闻。您想订阅${app_name_short} 频道并将其添加到您的联系人中吗?这是免费的,您可以随时退订。</string>
     <string name="quote">引用</string>
     <string name="contacts_deleted">联系人已被删除</string>
@@ -982,6 +984,7 @@ ${app_name_short} 支持的所有表情符号。</string>
     <string name="webclient_session_stop_all">关闭所有</string>
     <string name="passphrase_service_name">密码服务</string>
     <string name="passphrase_service_description">密码解锁时的通知</string>
+    <string name="webclient_service_description">网页版/桌面版会话运行时的通知</string>
     <string name="prefs_title_accept_privacy_policy">接受隐私权政策</string>
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="privacy_policy_explain">${app_name}比任何其他即时通讯工具都更加严格地保护您的隐私。在我们的%1$s中了解更多。</string>
@@ -1550,6 +1553,7 @@ ${app_name_short} 支持的所有表情符号。</string>
     <string name="forward_security_explanation">完全正向保密(PFS)可以保护会话记录不被追溯解密,即使长期加密密钥已被盗用。\n\n如果双方的应用程序都支持完全正向保密的话,就可以启用此选项。</string>
     <string name="group_call_inactivity_left">因为长时间不活动,群组通话自动退出</string>
     <string name="missing_permission_external_storage">无法复制文件,请尝试以下步骤以解決问题:\n1. 打开系统设置。\n2. 前往 “应用程序”,然后点击右上角的三个点,选择 “特殊访问” 权限。\n3. 点击 “所有文件访问”。\n4. 点击右上角的三个点,选择“显示系统应用程序”。\n5. 点击 “外部存储” 并确保授予 “允许访问所有文件” 权限。\n6. 再次尝试恢复备份。</string>
+    <string name="forward_security_downgraded_status_message">因为对方使用的应用程序版本或  ${app_name_desktop} 2.0 桌面版(测试版)不支持 “完全正向保密” 功能,所以在此会话中已禁用 “完全正向保密” 。</string>
     <string name="forward_security_illegal_session_status_message">这个之前已启用 “完全正向保密” 的会话,因无效而被重置保密状态。</string>
     <string name="crop_image_title">裁剪图片</string>
     <string name="scroll_to_bottom">回到底部</string>
@@ -1697,6 +1701,12 @@ ${app_name_short} 支持的所有表情符号。</string>
     <string name="md_drop_device_failed_dialog_title">移除已链接设备可能失败</string>
     <string name="md_drop_device_failed_dialog_message">请检查您的互联网连接并重试。</string>
     <string name="md_drop_device_failed_dialog_button_close">关闭</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">在选择文件夹时检测到潜在问题。如果问题仍然存在,您可将备份保存至“文档”文件夹,而非选择自定义文件夹。</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">选择自定义文件夹</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">使用“文档”文件夹</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">您对这条消息表示 “同意”。</string>
     <string name="cd_dec_icon">您对这条消息表示 “不同意”。</string>

+ 10 - 1
app/src/main/res/values-zh-rTW/strings.xml

@@ -440,6 +440,7 @@
     <string name="is_typing">輸入中…</string>
     <string name="push_not_available_title">找不到推播服務</string>
     <string name="push_not_available_text1">我們無法在您的裝置上找到推播服務,因為 Google Play 服務未安裝或過期。</string>
+    <string name="push_not_available_text2">%s 將在背景持續與伺服器連線。如果您的裝置啟用了電池最佳化,這可能會干擾背景連線,無法持續執行。</string>
     <string name="backup_in_progress">正在進行備份</string>
     <string name="backup_or_restore_success_body">資料備份成功完成</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -746,7 +747,7 @@ ${app_name_short} 支援的所有表情符號。</string>
     <string name="status_ballot_user_modified_vote">%1$s 變更了 %2$s 的投票</string>
     <string name="status_ballot_all_votes">已完成 %1$s 的投票</string>
     <string name="restore">還原</string>
-    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <!-- Shown in prompt dialog during the setup wizard. Only used for work builds (i.e. Threema Work and OnPrem). ${app_name} and ${app_name_short} are placeholders for the app's name, they must be kept as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm">您沒有輸入電話號碼或電子郵件地址連結至 ${app_name_short} ID,您將不會出現在好友的聯絡人名單中。您確定要匿名使用 ${app_name} 嗎?</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="new_wizard_anonymous_confirm_phone_only">您沒有輸入電話號碼連結至 ${app_name_short} ID。您將不會出現在好友的聯絡人名單中。您確定要匿名使用 ${app_name} 嗎?</string>
@@ -833,6 +834,7 @@ ${app_name_short} 支援的所有表情符號。</string>
     <string name="really_reset_ringtones">真的將通知音效設定重設為預設值嗎?</string>
     <string name="reset_ringtones_confirm">通知音效設定已重設。</string>
     <string name="prefs_language_override">語言</string>
+    <!-- ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
     <string name="threema_channel_intro">${app_name_short} 頻道為您提供關於 ${app_name_short} 的所有新聞。您想訂閱 ${app_name_short} 頻道並將其新增到您的聯絡人中嗎?這是免費的,您可以隨時退訂。</string>
     <string name="quote">引用</string>
     <string name="contacts_deleted">聯絡人已被刪除</string>
@@ -1551,6 +1553,7 @@ ${app_name_short} 支援的所有表情符號。</string>
     <string name="forward_security_explanation">完全正向保密(PFS)可以保護對話記錄不被追溯解密,即使長期加密密鑰已被盜用。\n\n如果雙方的應用程式都支援完全正向保密的話,就可以啟用此選項。</string>
     <string name="group_call_inactivity_left">因為長時間未使用,群組通話自動退出</string>
     <string name="missing_permission_external_storage">無法複製檔案,請嘗試以下步驟以解決問題:\n1. 開啟系統設定。\n2. 前往「應用程式」,然後按一下右上角的三個點,選擇「特殊存取」權限。\n3. 按一下「所有檔案存取」。\n4. 按一下右上角的三個點,選擇「顯示系統應用程式」。\n5. 按一下「外部儲存空間」並確保授予「允許存取所有檔案」權限。\n6. 再次嘗試還原備份。</string>
+    <string name="forward_security_downgraded_status_message">因為對方使用的應用程式版本或 ${app_name_desktop} 2.0 桌面版(測試版)不支援「完全正向保密」功能,所以在此對話中已停用「完全正向保密」。</string>
     <string name="forward_security_illegal_session_status_message">這個之前已啟用「完全正向保密」的工作階段,因無效而被重設保密狀態。</string>
     <string name="crop_image_title">裁剪圖片</string>
     <string name="scroll_to_bottom">回到頁尾</string>
@@ -1698,6 +1701,12 @@ ${app_name_short} 支援的所有表情符號。</string>
     <string name="md_drop_device_failed_dialog_title">移除已連結的裝置可能失敗</string>
     <string name="md_drop_device_failed_dialog_message">請檢查您的網路連線並再試一次。</string>
     <string name="md_drop_device_failed_dialog_button_close">關閉</string>
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">在選擇資料夾時偵測到潛在問題。如果問題仍然存在,您可將備份儲存至「文件」資料夾,而非選擇自訂資料夾。</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">選擇自訂資料夾</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">使用「文件」資料夾</string>
     <!-- accessibility -->
     <string name="cd_ack_icon">您對這則訊息表示「同意」。</string>
     <string name="cd_dec_icon">您對這則訊息表示「不同意」。</string>

+ 1 - 0
app/src/main/res/values/preferences_strings.xml

@@ -172,6 +172,7 @@
     <string name="preferences__remove_menu" translatable="false">pref_key_remove_menu</string>
     <string name="preferences__rate" translatable="false">pref_key_rate</string>
     <string name="preferences__data_backup_uri" translatable="false">pref_data_backup_uri</string>
+    <string name="preferences__data_backup_picker_launched" translatable="false">pref_data_backup_picker_launched</string>
     <string name="preferences__show_unread_badge" translatable="false">pref_show_unread_badge</string>
     <string name="preferences__match_token" translatable="false">pref_match_token</string>
     <string name="preferences__auto_download_explain" translatable="false">pref_auto_download_explain</string>

+ 7 - 0
app/src/main/res/values/strings.xml

@@ -1716,6 +1716,13 @@
     <string name="md_drop_device_failed_dialog_message">Please check the Internet connection and try again.</string>
     <string name="md_drop_device_failed_dialog_button_close">Close</string>
 
+    <!-- Message shown in dialog when the user starts configuring a backup, but we detected that there might be a problem and thus offer a workaround option to choose from -->
+    <string name="backup_path_selection_message">A potential problem has been detected when selecting the folder. If the issue persists, you can save the backup in the “Documents” folder instead of choosing a custom folder.</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them use the regular file picker. -->
+    <string name="backup_path_selection_default">Select custom folder</string>
+    <!-- Button label on dialog when configuring a backup, shown on dialog that lets the user choose how they want to select the backup folder. This option lets them bypass the file picker and use the default Documents folder instead -->
+    <string name="backup_path_selection_documents">Use “Documents” folder</string>
+
     <!-- accessibility -->
     <string name="cd_ack_icon">agree sent</string>
     <string name="cd_dec_icon">disagree sent</string>

+ 1 - 1
app/src/main/res/values/untranslatable_strings.xml

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="utf-8"?>
 <resources>
-    <string name="about_copyright" translatable="false">Copyright © 2013–2025 Threema GmbH</string>
+    <string name="about_copyright" translatable="false">Copyright © Threema GmbH</string>
     <string name="enter_serial_hint" translatable="false">XXXXX-XXXXX</string>
     <string name="threema_channel" translatable="false">Threema Channel</string>
     <string name="default_notification_sound" translatable="false">content://settings/system/notification_sound</string>

+ 6 - 0
commonAndroid/src/main/java/ch/threema/android/UriExtensions.kt

@@ -0,0 +1,6 @@
+package ch.threema.android
+
+import android.net.Uri
+
+fun Uri.isFileUri() =
+    scheme?.equals("file", ignoreCase = true) == true

+ 10 - 0
domain/src/main/java/ch/threema/domain/protocol/csp/messages/voip/VoipCallAnswerData.java

@@ -47,6 +47,16 @@ public class VoipCallAnswerData extends VoipCallData<VoipCallAnswerData> {
         return this;
     }
 
+    public @NonNull String getActionDescription() {
+        if (action != null && action == Action.ACCEPT) {
+            return "accept";
+        } else if (action != null && action == Action.REJECT) {
+            return "reject/" + getRejectReasonName();
+        } else {
+            return "unknown";
+        }
+    }
+
     //endregion
 
     //region Answer data

+ 6 - 0
scripts/verify-build.sh

@@ -1,6 +1,12 @@
 #!/usr/bin/env bash
 #
 # A script to verify that a locally compiled APK matches the released APK.
+#
+# Steps taken to achieve this:
+#
+#   1. Unpack both APK files
+#   2. Remove meta information (containing things like the signature)
+#   3. Recursively diff the two directories to ensure they match
 
 set -euo pipefail