Explorar el Código

Version 6.3.1-1116

Threema hace 3 semanas
padre
commit
e2fc69affe
Se han modificado 86 ficheros con 1038 adiciones y 660 borrados
  1. 2 8
      app/build.gradle.kts
  2. 2 1
      app/src/androidTest/java/ch/threema/app/processors/MessageProcessorProvider.kt
  3. 23 47
      app/src/libre/play/listings/de/full-description.txt
  4. 23 47
      app/src/libre/play/listings/en-US/full-description.txt
  5. 4 3
      app/src/libre/play/release-notes/de/default.txt
  6. 4 3
      app/src/libre/play/release-notes/en-US/default.txt
  7. 4 0
      app/src/main/AndroidManifest.xml
  8. 2 0
      app/src/main/java/ch/threema/app/ThreemaApplication.kt
  9. 1 0
      app/src/main/java/ch/threema/app/activities/EnterSerialActivity.java
  10. 1 0
      app/src/main/java/ch/threema/app/activities/SendMediaActivity.java
  11. 15 6
      app/src/main/java/ch/threema/app/activities/referral/ReferralActivity.kt
  12. 15 4
      app/src/main/java/ch/threema/app/activities/wizard/WizardSafeRestoreActivity.java
  13. 2 9
      app/src/main/java/ch/threema/app/adapters/SendMediaAdapter.kt
  14. 25 10
      app/src/main/java/ch/threema/app/applock/AppLockUtil.kt
  15. 5 0
      app/src/main/java/ch/threema/app/camera/CameraFragment.kt
  16. 0 1
      app/src/main/java/ch/threema/app/emojireactions/EmojiReactionsGridAdapter.java
  17. 0 1
      app/src/main/java/ch/threema/app/emojis/EmojiGridAdapter.java
  18. 1 0
      app/src/main/java/ch/threema/app/emojis/EmojiItemView.java
  19. 0 1
      app/src/main/java/ch/threema/app/emojis/EmojiListAdapter.kt
  20. 3 1
      app/src/main/java/ch/threema/app/fragments/ComposeMessageFragment.java
  21. 7 3
      app/src/main/java/ch/threema/app/managers/CoreServiceManagerImpl.kt
  22. 11 3
      app/src/main/java/ch/threema/app/preference/service/PreferenceServiceImpl.java
  23. 5 1
      app/src/main/java/ch/threema/app/restrictions/AppRestrictionService.java
  24. 4 0
      app/src/main/java/ch/threema/app/startup/AppStartupUtil.kt
  25. 2 0
      app/src/main/java/ch/threema/app/tasks/OutgoingVoipCallAnswerMessageTask.kt
  26. 2 0
      app/src/main/java/ch/threema/app/tasks/OutgoingVoipCallHangupMessageTask.kt
  27. 2 0
      app/src/main/java/ch/threema/app/tasks/OutgoingVoipCallOfferMessageTask.kt
  28. 2 0
      app/src/main/java/ch/threema/app/tasks/OutgoingVoipCallRingingMessageTask.kt
  29. 2 0
      app/src/main/java/ch/threema/app/tasks/OutgoingVoipICECandidateMessageTask.kt
  30. 54 0
      app/src/main/java/ch/threema/app/tasks/TaskLogging.kt
  31. 1 1
      app/src/main/java/ch/threema/app/tasks/archive/TaskArchiverImpl.kt
  32. 1 6
      app/src/main/java/ch/threema/app/threemasafe/ThreemaSafeServiceImpl.java
  33. 54 22
      app/src/main/java/ch/threema/app/utils/ConfigUtils.java
  34. 44 27
      app/src/main/java/ch/threema/app/utils/OutgoingCspMessageUtils.kt
  35. 23 17
      app/src/main/java/ch/threema/app/voip/services/VoipStateService.java
  36. 6 1
      app/src/main/java/ch/threema/app/webviews/EulaActivity.kt
  37. 1 1
      app/src/main/java/ch/threema/app/webviews/LicenseActivity.kt
  38. 6 1
      app/src/main/java/ch/threema/app/webviews/PrivacyPolicyActivity.kt
  39. 51 0
      app/src/main/java/ch/threema/app/webviews/ReferralTosActivity.kt
  40. 12 12
      app/src/main/java/ch/threema/app/webviews/SimpleWebViewActivity.java
  41. 1 1
      app/src/main/java/ch/threema/app/webviews/SupportActivity.kt
  42. 6 1
      app/src/main/java/ch/threema/app/webviews/TermsOfServiceActivity.kt
  43. 1 1
      app/src/main/java/ch/threema/app/webviews/WorkExplainActivity.kt
  44. 1 1
      app/src/main/java/ch/threema/app/widget/WidgetUtil.kt
  45. 0 1
      app/src/main/res/layout/activity_simple_webview.xml
  46. 1 13
      app/src/main/res/values-be-rBY/strings.xml
  47. 1 1
      app/src/main/res/values-bg/strings.xml
  48. 0 3
      app/src/main/res/values-ca/strings.xml
  49. 19 2
      app/src/main/res/values-cs/strings.xml
  50. 28 32
      app/src/main/res/values-de/strings.xml
  51. 37 21
      app/src/main/res/values-es/strings.xml
  52. 38 21
      app/src/main/res/values-fr/strings.xml
  53. 38 21
      app/src/main/res/values-gsw/strings.xml
  54. 1 33
      app/src/main/res/values-hu/strings.xml
  55. 45 29
      app/src/main/res/values-it/strings.xml
  56. 2 19
      app/src/main/res/values-ja/strings.xml
  57. 39 21
      app/src/main/res/values-nl-rNL/strings.xml
  58. 1 11
      app/src/main/res/values-no/strings.xml
  59. 39 23
      app/src/main/res/values-pl/strings.xml
  60. 40 23
      app/src/main/res/values-pt-rBR/strings.xml
  61. 34 17
      app/src/main/res/values-ru/strings.xml
  62. 10 10
      app/src/main/res/values-ru/webclient_strings.xml
  63. 0 9
      app/src/main/res/values-sk/strings.xml
  64. 26 9
      app/src/main/res/values-tr/strings.xml
  65. 24 7
      app/src/main/res/values-uk/strings.xml
  66. 37 20
      app/src/main/res/values-zh-rCN/strings.xml
  67. 37 18
      app/src/main/res/values-zh-rTW/strings.xml
  68. 5 4
      app/src/main/res/values/strings.xml
  69. 1 0
      app/src/main/res/values/untranslatable_strings.xml
  70. 6 0
      app/src/test/java/ch/threema/app/tasks/TaskArchiverTest.kt
  71. 2 1
      domain/src/main/java/ch/threema/domain/protocol/connection/csp/socket/CspSocket.kt
  72. 7 2
      domain/src/main/java/ch/threema/domain/protocol/connection/d2m/socket/D2mSocket.kt
  73. 1 1
      domain/src/main/java/ch/threema/domain/protocol/connection/layer/CspFrameLayer.kt
  74. 2 1
      domain/src/main/java/ch/threema/domain/protocol/connection/layer/D2mFrameLayer.kt
  75. 1 1
      domain/src/main/java/ch/threema/domain/protocol/connection/layer/EndToEndLayer.kt
  76. 4 2
      domain/src/main/java/ch/threema/domain/protocol/connection/layer/MultiplexLayer.kt
  77. 13 3
      domain/src/main/java/ch/threema/domain/taskmanager/IncomingMessageTaskQueue.kt
  78. 16 4
      domain/src/main/java/ch/threema/domain/taskmanager/LocalTaskQueue.kt
  79. 6 5
      domain/src/main/java/ch/threema/domain/taskmanager/Task.kt
  80. 6 1
      domain/src/main/java/ch/threema/domain/taskmanager/TaskManager.kt
  81. 11 9
      domain/src/main/java/ch/threema/domain/taskmanager/TaskManagerProvider.kt
  82. 9 2
      domain/src/main/java/ch/threema/domain/taskmanager/TaskQueue.kt
  83. 2 2
      domain/src/main/java/ch/threema/domain/taskmanager/TaskRunner.kt
  84. 4 3
      domain/src/test/java/ch/threema/domain/protocol/connection/CspConnectionTest.kt
  85. 4 3
      domain/src/test/java/ch/threema/domain/protocol/taskmanager/BypassTest.kt
  86. 10 11
      domain/src/test/java/ch/threema/domain/protocol/taskmanager/TaskExecutionTest.kt

+ 2 - 8
app/build.gradle.kts

@@ -51,7 +51,7 @@ if (gradle.startParameter.taskRequests.toString().contains("Hms")) {
 /**
  * Only use the scheme "<major>.<minor>.<patch>" for the appVersion
  */
-val appVersion = "6.3.0"
+val appVersion = "6.3.1"
 
 /**
  * betaSuffix with leading dash (e.g. `-beta1`).
@@ -60,7 +60,7 @@ val appVersion = "6.3.0"
  */
 val betaSuffix = ""
 
-val defaultVersionCode = 1113
+val defaultVersionCode = 1116
 
 /**
  * Map with keystore paths (if found).
@@ -151,9 +151,6 @@ android {
         booleanBuildConfigField("AVAILABILITY_STATUS_ENABLED", BuildFeatureFlags["availability_status"] ?: false)
         booleanBuildConfigField("CRASH_REPORTING_SUPPORTED", BuildFeatureFlags["crash_reporting"] ?: false)
 
-        // TODO(ANDR-4376): Remove this build flag
-        booleanBuildConfigField("REFERRAL_PROGRAM_AVAILABLE", BuildFeatureFlags["referral_program_available"] ?: false)
-
         // config fields for action URLs / deep links
         stringBuildConfigField("uriScheme", "threema")
         stringBuildConfigField("actionUrl", "go.threema.ch")
@@ -291,9 +288,6 @@ android {
             stringBuildConfigField("MAP_POI_NAMES_URL", "https://poi.test.threema.ch/names/{latitude}/{longitude}/{query}/")
             stringBuildConfigField("BLOB_MIRROR_SERVER_URL", "https://blob-mirror-{deviceGroupIdPrefix4}.test.threema.ch/{deviceGroupIdPrefix8}")
             booleanBuildConfigField("CRASH_REPORTING_SUPPORTED", true)
-
-            // TODO(ANDR-4376): Remove this build flag
-            booleanBuildConfigField("REFERRAL_PROGRAM_AVAILABLE", true)
         }
         create("sandbox_work") {
             versionName = "${appVersion}k$betaSuffix"

+ 2 - 1
app/src/androidTest/java/ch/threema/app/processors/MessageProcessorProvider.kt

@@ -34,6 +34,7 @@ import ch.threema.app.services.FileService
 import ch.threema.app.services.LifetimeService
 import ch.threema.app.tasks.archive.TaskArchiverImpl
 import ch.threema.app.tasks.archive.recovery.TaskRecoveryManagerImpl
+import ch.threema.app.tasks.getDebugString
 import ch.threema.app.testutils.TestHelpers
 import ch.threema.app.testutils.TestHelpers.TestContact
 import ch.threema.app.testutils.TestHelpers.TestGroup
@@ -422,7 +423,7 @@ open class MessageProcessorProvider {
             serviceManager.databaseService,
             serviceManager.preferenceStore,
             serviceManager.encryptedPreferenceStore,
-            TaskArchiverImpl(serviceManager.databaseService.taskArchiveFactory, TaskRecoveryManagerImpl()),
+            TaskArchiverImpl(serviceManager.databaseService.taskArchiveFactory, TaskRecoveryManagerImpl(), getDebugString),
             serviceManager.deviceCookieManager,
             taskManager,
             serviceManager.multiDeviceManager as MultiDeviceManagerImpl,

+ 23 - 47
app/src/libre/play/listings/de/full-description.txt

@@ -1,51 +1,27 @@
-HINWEIS: Für Threema Libre wird ein Lizenzcode benötigt. Dieser kann unter https://shop.threema.ch gekauft werden.
+HINWEIS: Für Threema Libre wird ein Lizenzcode benötigt. Dieser kann unter <a href="https://shop.threema.ch">https://shop.threema.ch</a> gekauft werden.
 
-Threema ist der weltweit meistverkaufte sichere Messenger und schützt Ihre Daten vor dem Zugriff durch Hacker, Unternehmen und Regierungen. Der Dienst kann völlig anonym (ohne Angabe einer Telefonnummer oder E-Mail-Adresse) verwendet werden. Threema ist Open Source und bietet alle Funktionen, die man von einer modernen Instant Messaging-App erwartet. Es lassen sich Ende-zu-Ende-verschlüsselte Sprach-, Video- und Gruppenanrufe durchführen, und die Desktop-App sowie der Web-Client erlauben, Threema bequem vom PC aus zu nutzen.
+Threema ist der weltweit meistverkaufte sichere Messenger, der von mehr als 12 Millionen Menschen in über 175 Ländern verwendet wird – entwickelt in der Schweiz und konsequent auf Datenschutz und Privatsphäre ausgelegt. Ob Chats, Anrufe oder Dateien: Alles ist Ende-zu-Ende-verschlüsselt, und keine Datenspur bleibt zurück. Anstelle einer Telefonnummer oder E-Mail-Adresse dient eine zufällig erzeugte Threema-ID als eindeutige Kennung – anonym und sicher. Threema schützt, was wirklich zählt: Ihre Privatsphäre.
 
 Im Gegensatz zur Version auf Google Play enthält Threema Libre keine proprietären Bibliotheken / Komponenten (wie Google Play Services).
 
-<strong>KOMMUNIZIEREN OHNE DATENSPUR</strong>
-
-Threema ist so konzipiert dass möglichst keine Datenspur entsteht: Gruppen und Kontaktlisten werden auf Ihrem Gerät und nicht auf den Servern verwaltet; Nachrichten werden sofort nach Zustellung gelöscht; lokale Daten werden verschlüsselt auf dem Mobiltelefon/Tablet gespeichert. All dies verhindert das Sammeln und den Missbrauch persönlicher Informationen – sowohl Nachrichten wie auch Metadaten. Threema ist vollumfänglich konform mit dem europäischen Datenschutzgesetz (DSGVO).
-
-<strong>FELSENFESTE VERSCHLÜSSELUNG</strong>
-
-Jegliche Kommunikation, auch Sprach- und Videoanrufe, Gruppen-Chats, Medien, Dateien und Statusmeldungen, sind Ende-zu-Ende-verschlüsselt. Sie können sicher sein, dass ausser dem vorgesehenen Empfänger niemand Ihre Chats lesen kann – auch wir nicht. Zur Verschlüsselung kommt die renommierte Open-Source-Bibliothek NaCl zum Einsatz. Das Schlüsselpaar wird direkt auf Ihrem Gerät generiert; externe Server haben keinen Einfluss.
-
-<strong>UMFANGREICHE FUNKTIONEN</strong>
-
-Threema schützt Ihre Privatsphäre und bietet zahlreiche und einzigartige Funktionen.
-
-· Senden Sie Text- und Sprachnachrichten
-· Bearbeiten und löschen Sie bereits gesendete Nachrichten für Chatpartner
-· Tätigen Sie Sprach-, Video- und Gruppenanrufe
-· Teilen Sie Videos Bilder und Standorte
-· Senden Sie Dateien beliebigen Formats (pdf animierte gif, mp3, doc, zip usw.)
-· Nutzen Sie die Desktop-App oder den Web-Client, um bequem vom PC aus zu chatten
-· Gründen Sie Gruppen
-· Erstellen Sie Abstimmungen
-· Wählen Sie zwischen dunklem und hellem Design
-· Mit der Zustimmen/Ablehnen-Funktion können Sie unaufdringlich ohne beim Chat-Partner eine Push-Benachrichtigung auszulösen, kommunizieren
-· Verifizieren Sie die Identität von Kontakten durch Scannen des QR-Codes
-· Threema kann auch genutzt werden um völlig anonym zu kommunizieren
-· Synchronisieren Sie Ihre Kontakte (optional)
-
-<strong>SERVER IN DER SCHWEIZ</strong>
-
-Wir betreiben unsere eigenen Server in der Schweiz und entwickeln unsere Software selbst.
-
-<strong>VOLLSTÄNDIGE ANONYMITÄT</strong>
-
-Jeder Threema-Nutzer erhält eine zufällig generierte Threema-ID zur Identifizierung. Für die Nutzung von Threema ist keine Registrierung oder Verlinkung der Telefonnummer oder E-Mail-Adresse erforderlich. So kann Threema auch völlig anonym genutzt werden.
-
-<strong>OPEN SOURCE UND AUDITS</strong>
-
-Der Quellcode von Threema ist offen und für jedermann einsehbar. Zudem werden regelmässig externe Experten mit der systematischen Sicherheits-Überprüfung von Threemas Code betraut.
-
-<strong>KEINE WERBUNG, KEINE TRACKER</strong>
-
-Threema ist nicht durch Werbung finanziert und erhebt keinerlei Nutzerdaten.
-
-<strong>HILFE / KONTAKT</strong>
-
-Bei Fragen oder Problemen konsultieren Sie bitte unsere FAQs: <a href="https://threema.com/de/faq">https://threema.com/de/faq</a>
+Vorteile mit Threema:
+    • Text- und Sprachnachrichten inkl. Emoji-Reaktionen
+    • Durchgängig verschlüsselte Sprach-, Video- und Gruppenanrufe
+    • Teilen des Standorts
+    • Versand von Dateien aller Formate (PDF, GIF, MP3, ZIP und mehr)
+    • Möglichkeit, bereits gesendete Nachrichten zu bearbeiten und für Chatpartner zu löschen
+    • Desktop-App und Web-Client, um bequem am PC zu chatten
+    • Erstellen von Gruppen und Umfragen
+    • Helles oder dunkles Design
+    • Keine Werbung, keine Tracker, keine Datensammelei
+    • Verifikation der Identität von Kontakten durch Scannen des QR-Codes
+
+Zuverlässige Sicherheit:
+    • Open Source und regelmässige Audits
+    • Server in der Schweiz
+    • Anonyme Nutzung möglich: keine Telefonnummer oder E-Mail-Adresse erforderlich
+    • Löschung von Nachrichten vom Server sofort nach Zustellung
+
+Haben Sie Fragen oder Probleme? Unsere FAQ helfen weiter: <a href="https://threema.com/support">https://threema.com/support</a>
+
+Viel Freude mit Threema!

+ 23 - 47
app/src/libre/play/listings/en-US/full-description.txt

@@ -1,51 +1,27 @@
-NOTE: A Threema Shop license is required, please visit: https://shop.threema.ch to get one.
+NOTE: A Threema Shop license is required, please visit: <a href="https://shop.threema.ch">https://shop.threema.ch</a> to get one.
 
-Threema is the world’s best-selling secure messenger and keeps your data out of the hands of hackers, corporations, and governments. The service can be used completely anonymously. Threema is open source and offers every feature one would expect from a state-of-the-art instant messenger. The app also allows you to make end-to-end encrypted voice, video, and group calls. Using the desktop app and the web client, you can also use Threema from your desktop.
+Threema is the world’s best-selling secure messenger, used by more than 12 million people in over 175 countries, developed in Switzerland, and designed with privacy and data protection in mind. Whether chats, calls, or files, everything is end-to-end encrypted, and no data trail is left behind. Instead of a phone number or email address, a randomly generated Threema ID serves as a unique identifier – anonymous and secure. Threema protects what really matters: your privacy.
 
 In contrast to the version distributed via Google Play, Threema Libre contains no proprietary libraries / components (like Google Play Services).
 
-<strong>PRIVACY AND ANONYMITY</strong>
-
-Threema is designed from the ground up to generate as little data on servers as possible. Group memberships and contact lists are managed on your device only and never stored on our servers. Messages are immediately deleted after they have been delivered. Local files are stored encrypted on your mobile phone or tablet. All this effectively prevents the collection and misuse of your personal information, including metadata. Threema is fully compliant with the European privacy legislation (GDPR).
-
-<strong>ROCK-SOLID ENCRYPTION</strong>
-
-Threema end-to-end encrypts all your communication, including messages, voice and video calls, group chats, files, and even status messages. Only the intended recipient, and nobody else, can read your messages. Threema uses the trusted open source NaCl cryptography library for encryption. The encryption keys are generated and safely stored on the users’ devices to prevent backdoor access or copies.
-
-<strong>COMPREHENSIVE FEATURES</strong>
-
-Threema is not only an encrypted and private messenger but also versatile and feature-rich.
-
-· Write text and send voice messages
-· Edit and delete sent messages on the recipient’s end
-· Make voice, video and group calls
-· Share videos pictures and locations
-· Send any type of file (pdf animated gif, mp3, doc, zip, etc.)
-· Use the desktop app or the web client to chat from your computer
-· Create groups
-· Conduct polls with the poll feature
-· Choose between a dark and a light theme
-· Quickly and silently reply with the unique agree/disagree feature
-· Verify the identity of a contact by scanning their personal QR code
-· Use Threema as anonymous instant messaging tool
-· Synchronize your contacts (optional)
-
-<strong>SERVERS IN SWITZERLAND</strong>
-
-All our servers are located in Switzerland, and we develop our software in-house.
-
-<strong>FULL ANONYMITY</strong>
-
-Each Threema user receives a random Threema ID for identification. A phone number or email address is not required to use Threema. This unique feature allows you to use Threema completely anonymously – no need to give up private information or to open an account.
-
-<strong>OPEN SOURCE AND AUDITS</strong>
-
-The source code of the Threema app is open for everyone to review. On top of that, renowned experts are regularly commissioned to conduct systematic security audits of Threema’s code.
-
-<strong>NO ADS, NO TRACKERS</strong>
-
-Threema is not financed by advertising and does not collect user data.
-
-<strong>SUPPORT / CONTACT</strong>
-
-For questions or problems please consult our FAQs: <a href="https://threema.com/en/faq">https://threema.com/en/faq</a>
+Advantages of Threema:
+    • Text and voice messages, including emoji reactions
+    • End-to-end encrypted voice, video, and group calls
+    • Location sharing
+    • Sending files in all formats (PDF, GIF, MP3, ZIP, and more)
+    • Ability to edit sent messages and delete them for chat partners
+    • Desktop app and web client for convenient chatting on your PC
+    • Group creation and polls
+    • Light or dark mode
+    • No ads, no trackers, no data collection
+    • Identity verification of contacts by scanning their QR code
+
+Reliable security:
+    • Open source and regular audits
+    • Servers in Switzerland
+    • Anonymous use possible: no phone number or email address required
+    • Messages are deleted from the server immediately after delivery
+
+Do you have any questions or problems? Our FAQ can help: <a href="https://threema.com/support">https://threema.com/support</a>
+
+Enjoy using Threema!

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

@@ -1,3 +1,4 @@
-- Behebung eines Fehlers beim Zugriff auf gespeicherte Dateien
-- Nachrichtenentwürfe werden während des Tippens gespeichert
-- Verbesserungen und Behebung verschiedener Fehler
+- 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

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

@@ -1,3 +1,4 @@
-- Fixed a bug in relation to access of stored files
-- Message drafts are saved while typing
-- Various improvements and bug fixes
+- 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

+ 4 - 0
app/src/main/AndroidManifest.xml

@@ -444,6 +444,10 @@
             android:name=".webviews.PrivacyPolicyActivity"
             android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
             android:theme="@style/Theme.Threema.WithToolbar" />
+        <activity
+            android:name=".webviews.ReferralTosActivity"
+            android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize|uiMode"
+            android:theme="@style/Theme.Threema.WithToolbar" />
         <activity
             android:name=".activities.ServerMessageActivity"
             android:label="server_message"

+ 2 - 0
app/src/main/java/ch/threema/app/ThreemaApplication.kt

@@ -73,6 +73,7 @@ import ch.threema.app.stores.PreferenceStore
 import ch.threema.app.systemupdates.SystemUpdateException
 import ch.threema.app.systemupdates.SystemUpdateProvider
 import ch.threema.app.systemupdates.SystemUpdater
+import ch.threema.app.tasks.getDebugString
 import ch.threema.app.ui.DynamicColorsHelper
 import ch.threema.app.utils.AppVersionProvider.appVersion
 import ch.threema.app.utils.ConfigUtils
@@ -515,6 +516,7 @@ class ThreemaApplication : Application() {
                     logger.info("Nonce count (d2d): {}", databaseNonceStore.getCount(NonceScope.D2D))
                     databaseNonceStore
                 },
+                getDebugString = getDebugString,
             )
 
         private fun cancelNewMessageNotification(context: Context) {

+ 1 - 0
app/src/main/java/ch/threema/app/activities/EnterSerialActivity.java

@@ -221,6 +221,7 @@ public class EnterSerialActivity extends ThreemaActivity {
 
         String configuredPassword = getConfiguredPassword();
         if (configuredPassword != null) {
+            logger.info("A password is configured, disabling password field");
             passwordText.setEnabled(false);
         }
 

+ 1 - 0
app/src/main/java/ch/threema/app/activities/SendMediaActivity.java

@@ -747,6 +747,7 @@ public class SendMediaActivity extends ThreemaToolbarActivity implements
             PackageManager packageManager = getPackageManager();
             if (packageManager == null || !(packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA) ||
                 packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_ANY))) {
+                logger.info("No camera found, closing");
                 Toast.makeText(getApplicationContext(), R.string.no_camera_installed, Toast.LENGTH_LONG).show();
                 finish();
                 return;

+ 15 - 6
app/src/main/java/ch/threema/app/activities/referral/ReferralActivity.kt

@@ -83,11 +83,20 @@ import ch.threema.app.compose.theme.dimens.responsive
 import ch.threema.app.framework.EventHandler
 import ch.threema.app.utils.ConfigUtils
 import ch.threema.app.utils.MimeUtil
+import ch.threema.app.utils.logScreenVisibility
+import ch.threema.app.webviews.ReferralTosActivity
+import ch.threema.base.utils.getThreemaLogger
 import ch.threema.domain.types.Identity
 import org.koin.androidx.viewmodel.ext.android.viewModel
 
+private val logger = getThreemaLogger("ReferralActivity")
+
 class ReferralActivity : ThreemaActivity() {
 
+    init {
+        logScreenVisibility(logger)
+    }
+
     val viewModel by viewModel<ReferralViewModel>()
 
     override fun onCreate(savedInstanceState: Bundle?) {
@@ -109,8 +118,8 @@ class ReferralActivity : ThreemaActivity() {
                     onClickShareInvitationLink = {
                         viewModel.onClickShareInvitationLink()
                     },
-                    onClickViewTerms = {
-                        // TODO(ANDR-4376): Open terms & conditions when provided
+                    onClickViewTos = {
+                        startActivity(ReferralTosActivity.createIntent(this))
                     },
                 )
             }
@@ -146,7 +155,7 @@ class ReferralActivity : ThreemaActivity() {
 private fun ReferralScreenContent(
     onClickedBack: () -> Unit,
     onClickShareInvitationLink: () -> Unit,
-    onClickViewTerms: () -> Unit,
+    onClickViewTos: () -> Unit,
 ) {
     val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(rememberTopAppBarState())
 
@@ -311,7 +320,7 @@ private fun ReferralScreenContent(
                     modifier = Modifier.fillMaxWidth(),
                     text = stringResource(R.string.referral_view_terms_and_conditions),
                     colorPrimaryOverride = colorResource(R.color.work_primary_fixed),
-                    onClick = onClickViewTerms,
+                    onClick = onClickViewTos,
                     maxLines = 1,
                 )
             }
@@ -367,7 +376,7 @@ private fun ReferralScreenContent_Preview() {
         ReferralScreenContent(
             onClickedBack = {},
             onClickShareInvitationLink = {},
-            onClickViewTerms = {},
+            onClickViewTos = {},
         )
     }
 }
@@ -381,7 +390,7 @@ private fun ReferralScreenContent_Preview_DynamicColors() {
         ReferralScreenContent(
             onClickedBack = {},
             onClickShareInvitationLink = {},
-            onClickViewTerms = {},
+            onClickViewTos = {},
         )
     }
 }

+ 15 - 4
app/src/main/java/ch/threema/app/activities/wizard/WizardSafeRestoreActivity.java

@@ -33,7 +33,6 @@ import android.widget.Toast;
 import org.koin.java.KoinJavaComponent;
 import org.slf4j.Logger;
 
-import java.io.FileNotFoundException;
 import java.io.IOException;
 
 import androidx.annotation.NonNull;
@@ -64,6 +63,9 @@ import ch.threema.app.utils.executor.BackgroundTask;
 import ch.threema.app.workers.WorkSyncWorker;
 import ch.threema.base.ThreemaException;
 import static ch.threema.base.utils.LoggingKt.getThreemaLogger;
+
+import ch.threema.common.Http;
+import ch.threema.common.HttpResponseException;
 import ch.threema.domain.protocol.csp.ProtocolDefines;
 
 import static ch.threema.app.di.DIJavaCompat.isSessionScopeReady;
@@ -85,6 +87,7 @@ public class WizardSafeRestoreActivity extends WizardBackgroundActivity implemen
     private static final String DIALOG_TAG_WORK_SYNC = "workSync";
     private static final String DIALOG_TAG_PASSWORD_PRESET_CONFIRM = "safe_pw_preset";
     private static final String DIALOG_TAG_APPLICATION_SETUP_RETRY = "app-setup-retry";
+    private static final String ERROR_WITHOUT_DETAILS = "";
 
     @NonNull
     private final DependencyContainer dependencies = KoinJavaComponent.get(DependencyContainer.class);
@@ -253,10 +256,14 @@ public class WizardSafeRestoreActivity extends WizardBackgroundActivity implemen
                     return null;
                 } catch (ThreemaException | IOException e) {
                     logger.error("Failed to restore backup", e);
-                    if (e instanceof FileNotFoundException) {
+                    if (e instanceof HttpResponseException && ((HttpResponseException) e).getCode() == Http.StatusCode.NOT_FOUND) {
                         return getString(R.string.safe_no_backup_found);
                     }
-                    return e.getLocalizedMessage();
+                    if (e instanceof ThreemaException) {
+                        // TODO(ANDR-4447): The error message should be localized
+                        return e.getMessage();
+                    }
+                    return ERROR_WITHOUT_DETAILS;
                 }
             }
 
@@ -272,9 +279,13 @@ public class WizardSafeRestoreActivity extends WizardBackgroundActivity implemen
                 if (failureMessage == null) {
                     runApplicationSetupStepsAndFinish();
                 } else {
+                    var message = getString(R.string.safe_restore_failed);
+                    if (!failureMessage.equals(ERROR_WITHOUT_DETAILS)) {
+                        message += ". " + failureMessage;
+                    }
                     LongToast.makeText(
                         WizardSafeRestoreActivity.this,
-                        getString(R.string.safe_restore_failed) + ". " + failureMessage,
+                        message,
                         Toast.LENGTH_LONG
                     ).show();
                     if (safeMDMConfig.isRestoreForced()) {

+ 2 - 9
app/src/main/java/ch/threema/app/adapters/SendMediaAdapter.kt

@@ -21,11 +21,9 @@
 
 package ch.threema.app.adapters
 
-import androidx.annotation.OptIn
 import androidx.fragment.app.Fragment
 import androidx.fragment.app.FragmentManager
 import androidx.lifecycle.Lifecycle
-import androidx.media3.common.util.UnstableApi
 import androidx.viewpager2.adapter.FragmentStateAdapter
 import androidx.viewpager2.adapter.FragmentViewHolder
 import androidx.viewpager2.widget.ViewPager2
@@ -55,7 +53,6 @@ class SendMediaAdapter(
 
     override fun getItemCount() = mm.size()
 
-    @OptIn(UnstableApi::class)
     override fun createFragment(position: Int): Fragment {
         return BigMediaFragment.newInstance(mm.get(position), bottomElemHeight).also {
             fragments[position] = it
@@ -63,7 +60,6 @@ class SendMediaAdapter(
         }
     }
 
-    @OptIn(UnstableApi::class)
     override fun onBindViewHolder(
         holder: FragmentViewHolder,
         position: Int,
@@ -83,9 +79,8 @@ class SendMediaAdapter(
         return mm.getItems().map { it.uri.hashCode().toLong() }.contains(itemId)
     }
 
-    @OptIn(UnstableApi::class)
     override fun filenameUpdated(position: Int) {
-        if (position < 0 || position >= itemCount) {
+        if (position !in 0 until itemCount) {
             logger.error(
                 "Could not update filename at position {} of {} items",
                 position,
@@ -96,9 +91,8 @@ class SendMediaAdapter(
         fragments[position]?.updateFilename()
     }
 
-    @OptIn(UnstableApi::class)
     override fun videoMuteStateUpdated(position: Int) {
-        if (position < 0 || position >= itemCount) {
+        if (position !in 0 until itemCount) {
             logger.error("Could not update video at position {} of {} items", position, itemCount)
             return
         }
@@ -109,7 +103,6 @@ class SendMediaAdapter(
         // Nothing to do as the view pager position is updated via the layout
     }
 
-    @OptIn(UnstableApi::class)
     override fun sendAsFileStateUpdated(position: Int) {
         fragments[position]?.updateSendAsFileState()
     }

+ 25 - 10
app/src/main/java/ch/threema/app/applock/AppLockUtil.kt

@@ -50,10 +50,15 @@ class AppLockUtil(
 
     fun checkBiometrics(): BiometricsState {
         if (ActivityCompat.checkSelfPermission(appContext, Manifest.permission.USE_BIOMETRIC) != PackageManager.PERMISSION_GRANTED) {
+            logger.info("Biometrics permission not granted")
             return BiometricsState.NO_PERMISSION
         }
         val biometricManager = BiometricManager.from(appContext)
-        return when (biometricManager.canAuthenticate(BIOMETRIC_WEAK)) {
+        val canAuthenticate = biometricManager.canAuthenticate(BIOMETRIC_WEAK)
+        if (canAuthenticate != BiometricManager.BIOMETRIC_SUCCESS) {
+            logger.info("Biometrics unavailable ({})", canAuthenticate)
+        }
+        return when (canAuthenticate) {
             BiometricManager.BIOMETRIC_SUCCESS -> BiometricsState.AVAILABLE
             BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE,
             BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE,
@@ -68,17 +73,18 @@ class AppLockUtil(
         val executor = ContextCompat.getMainExecutor(activity)
         val authenticators = when (authType) {
             AuthType.ANY -> {
-                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
-                    when (checkBiometrics()) {
-                        BiometricsState.AVAILABLE -> DEVICE_CREDENTIAL or BIOMETRIC_WEAK
-                        else -> DEVICE_CREDENTIAL
-                    }
-                } else {
-                    // Android SDK 29 and lower does not support using `DEVICE_CREDENTIALS` on its own
-                    DEVICE_CREDENTIAL or BIOMETRIC_WEAK
+                when (checkBiometrics()) {
+                    BiometricsState.AVAILABLE -> DEVICE_CREDENTIAL or BIOMETRIC_WEAK
+                    else -> getDeviceCredentialAuthenticatorCompat()
+                }
+            }
+            AuthType.BIOMETRIC -> when (checkBiometrics()) {
+                BiometricsState.AVAILABLE -> BIOMETRIC_WEAK
+                else -> {
+                    logger.warn("Biometrics not available, fallback to credentials")
+                    getDeviceCredentialAuthenticatorCompat()
                 }
             }
-            AuthType.BIOMETRIC -> BIOMETRIC_WEAK
         }
         return suspendCoroutine { continuation ->
             val prompt = BiometricPrompt(
@@ -126,6 +132,15 @@ class AppLockUtil(
         }
     }
 
+    private fun getDeviceCredentialAuthenticatorCompat(): Int {
+        return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) {
+            DEVICE_CREDENTIAL
+        } else {
+            // Android SDK 29 and lower does not support using `DEVICE_CREDENTIALS` on its own
+            DEVICE_CREDENTIAL or BIOMETRIC_WEAK
+        }
+    }
+
     enum class BiometricsState {
         NO_PERMISSION,
         NO_HARDWARE,

+ 5 - 0
app/src/main/java/ch/threema/app/camera/CameraFragment.kt

@@ -371,6 +371,9 @@ class CameraFragment : Fragment() {
         cameraProviderFuture.addListener({
             // CameraProvider
             cameraProvider = cameraProviderFuture.get()
+            if (cameraProvider == null) {
+                logger.warn("Camera provider is null")
+            }
 
             // Select lensFacing depending on the available cameras
             if (viewModel.lensFacing == CameraSelector.LENS_FACING_BACK && !hasBackCamera()) {
@@ -901,6 +904,7 @@ class CameraFragment : Fragment() {
         return try {
             cameraProvider?.hasCamera(CameraSelector.DEFAULT_BACK_CAMERA) ?: false
         } catch (e: Exception) {
+            logger.error("Failed to check for presence of back camera", e)
             false
         }
     }
@@ -910,6 +914,7 @@ class CameraFragment : Fragment() {
         return try {
             return cameraProvider?.hasCamera(CameraSelector.DEFAULT_FRONT_CAMERA) ?: false
         } catch (e: Exception) {
+            logger.error("Failed to check for presence of front camera", e)
             false
         }
     }

+ 0 - 1
app/src/main/java/ch/threema/app/emojireactions/EmojiReactionsGridAdapter.java

@@ -98,7 +98,6 @@ public class EmojiReactionsGridAdapter extends BaseAdapter {
         }
 
         if (view.setEmoji(item.emojiSequence, false, diverseHintColor) != null) {
-            view.setContentDescription(item.emojiSequence);
             view.setOnClickListener(v -> keyClickListener.onEmojiReactionClicked(item.emojiSequence));
             view.post(() -> view.setSelected(item.isSender));
         } else {

+ 0 - 1
app/src/main/java/ch/threema/app/emojis/EmojiGridAdapter.java

@@ -119,7 +119,6 @@ public class EmojiGridAdapter extends BaseAdapter {
         }
 
         view.setEmoji(emojiSequence, pageNumber != 0 && item.diversityFlag == EmojiSpritemap.DIVERSITY_PARENT, diverseHintColor);
-        view.setContentDescription(emojiSequence);
         view.setOnClickListener(v -> keyClickListener.onEmojiKeyClicked(getKey(item.emojiSequence)));
         view.setOnLongClickListener(v -> {
             if (pageNumber != 0) {

+ 1 - 0
app/src/main/java/ch/threema/app/emojis/EmojiItemView.java

@@ -59,6 +59,7 @@ public class EmojiItemView extends View implements Drawable.Callback {
         this.drawable = EmojiManager.getInstance(getContext()).getEmojiDrawableAsync(emoji);
         this.hasDiverse = hasDiverse;
         this.diverseColor = diverseColor;
+        setContentDescription(emoji);
 
         postInvalidate();
 

+ 0 - 1
app/src/main/java/ch/threema/app/emojis/EmojiListAdapter.kt

@@ -86,7 +86,6 @@ class EmojiListAdapter(
             emojiInfo.diversityFlag == EmojiSpritemap.DIVERSITY_PARENT,
             diverseHintColor,
         )
-        holder.emojiView.contentDescription = emojiSequence
         holder.emojiView.setOnClickListener {
             keyClickListener.onEmojiKeyClicked(emojiService.getPreferredDiversity(emojiInfo.emojiSequence))
         }

+ 3 - 1
app/src/main/java/ch/threema/app/fragments/ComposeMessageFragment.java

@@ -1841,7 +1841,9 @@ public class ComposeMessageFragment extends Fragment implements
             }
 
             //remove wallpaper
-            this.wallpaperView.setImageBitmap(null);
+            if (wallpaperView != null) {
+                wallpaperView.setImageBitmap(null);
+            }
 
             removeIsTypingFooter();
             this.isTypingView = null;

+ 7 - 3
app/src/main/java/ch/threema/app/managers/CoreServiceManagerImpl.kt

@@ -33,6 +33,7 @@ import ch.threema.app.utils.DeviceCookieManagerImpl
 import ch.threema.base.crypto.NonceFactory
 import ch.threema.domain.models.AppVersion
 import ch.threema.domain.stores.IdentityStore
+import ch.threema.domain.taskmanager.Task
 import ch.threema.domain.taskmanager.TaskManager
 import ch.threema.domain.taskmanager.TaskManagerConfiguration
 import ch.threema.domain.taskmanager.TaskManagerProvider
@@ -51,6 +52,7 @@ class CoreServiceManagerImpl(
     override val encryptedPreferenceStore: EncryptedPreferenceStore,
     override val identityStore: IdentityStore,
     private val nonceDatabaseStoreProvider: () -> DatabaseNonceStore,
+    private val getDebugString: Task<*, *>.() -> String,
 ) : CoreServiceManager {
     /**
      * The task archiver. Note that this must only be used to load the persisted tasks when the
@@ -60,6 +62,7 @@ class CoreServiceManagerImpl(
         TaskArchiverImpl(
             taskArchiveFactory = databaseService.taskArchiveFactory,
             taskRecoveryManager = TaskRecoveryManagerImpl(),
+            getDebugString = getDebugString,
         )
     }
 
@@ -78,9 +81,10 @@ class CoreServiceManagerImpl(
     override val taskManager: TaskManager by lazy {
         TaskManagerProvider.getTaskManager(
             TaskManagerConfiguration(
-                { taskArchiver },
-                deviceCookieManager,
-                ConfigUtils.isDevBuild(),
+                taskArchiver = { taskArchiver },
+                deviceCookieManager = deviceCookieManager,
+                assertContext = ConfigUtils.isDevBuild(),
+                getDebugString = getDebugString,
             ),
         )
     }

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

@@ -394,7 +394,7 @@ public class PreferenceServiceImpl implements PreferenceService {
     @Override
     @Nullable
     public synchronized String getLicenseUsername() {
-        return encryptedPreferenceStore.getString(getKeyName(R.string.preferences__license_username));
+        return takeUnlessEmpty(encryptedPreferenceStore.getString(getKeyName(R.string.preferences__license_username)));
     }
 
     @Override
@@ -404,7 +404,7 @@ public class PreferenceServiceImpl implements PreferenceService {
 
     @Override
     public synchronized String getLicensePassword() {
-        return encryptedPreferenceStore.getString(getKeyName(R.string.preferences__license_password));
+        return takeUnlessEmpty(encryptedPreferenceStore.getString(getKeyName(R.string.preferences__license_password)));
     }
 
     @Override
@@ -415,7 +415,7 @@ public class PreferenceServiceImpl implements PreferenceService {
     @Override
     @Nullable
     public synchronized String getOnPremServer() {
-        return encryptedPreferenceStore.getString(getKeyName(R.string.preferences__onprem_server));
+        return takeUnlessEmpty(encryptedPreferenceStore.getString(getKeyName(R.string.preferences__onprem_server)));
     }
 
     @Override
@@ -1770,4 +1770,12 @@ public class PreferenceServiceImpl implements PreferenceService {
     public void setProblemDismissed(@NonNull String problemKey, @Nullable Instant timestamp) {
         preferenceStore.save(getKeyName(R.string.preferences__problem_dismissed_prefix, problemKey), timestamp);
     }
+
+    @Nullable
+    private static String takeUnlessEmpty(@Nullable String string) {
+        if (string == null || string.isEmpty()) {
+            return null;
+        }
+        return string;
+    }
 }

+ 5 - 1
app/src/main/java/ch/threema/app/restrictions/AppRestrictionService.java

@@ -237,6 +237,7 @@ public class AppRestrictionService {
      * Reload restriction (without fetching work data)
      */
     public void reload() {
+        logger.info("Reloading restrictions");
         Context context = ThreemaApplication.getAppContext();
         RestrictionsManager restrictionsManager = (RestrictionsManager) context.getSystemService(Context.RESTRICTIONS_SERVICE);
         this.appRestrictions = restrictionsManager.getApplicationRestrictions();
@@ -274,6 +275,8 @@ public class AppRestrictionService {
         }
 
         ApplyAppRestrictionsWorker.Companion.applyAppRestrictions(context);
+
+        logger.info("Reloaded restrictions, MDM source = {}", getMdmSource());
     }
 
     public Bundle getAppRestrictions() {
@@ -335,12 +338,13 @@ public class AppRestrictionService {
     private void updateUserCredentials() {
         ServiceManager serviceManager = ThreemaApplication.getServiceManager();
         if (serviceManager != null) {
+            logger.info("Updating user credentials");
             Context context = serviceManager.getContext();
             @Nullable String mdmUsername = getStringRestriction(context.getString(R.string.restriction__license_username));
             @Nullable String mdmPassword = getStringRestriction(context.getString(R.string.restriction__license_password));
 
             if (TestUtil.isEmptyOrNull(mdmUsername) && TestUtil.isEmptyOrNull(mdmPassword)) {
-                logger.debug("No credentials provided via mdm");
+                logger.info("No credentials provided via mdm");
                 return;
             }
 

+ 4 - 0
app/src/main/java/ch/threema/app/startup/AppStartupUtil.kt

@@ -34,6 +34,10 @@ import org.koin.android.ext.android.get
  * Once the app is ready, the calling activity will be recreated.
  */
 fun Activity.finishAndRestartLaterIfNotReady(): Boolean {
+    if (isFinishing) {
+        // If the activity is already finishing, there's no point in waiting or recreating the activity later
+        return true
+    }
     if (get<AppStartupMonitor>().isReady()) {
         return false
     }

+ 2 - 0
app/src/main/java/ch/threema/app/tasks/OutgoingVoipCallAnswerMessageTask.kt

@@ -38,6 +38,8 @@ class OutgoingVoipCallAnswerMessageTask(
 
     override val type: String = "OutgoingVoipCallAnswerMessageTask"
 
+    override val shortLogInfo: String = "cid=${voipCallAnswerData.callId}"
+
     override suspend fun runSendingSteps(handle: ActiveTaskCodec) {
         val message = VoipCallAnswerMessage()
         message.data = voipCallAnswerData

+ 2 - 0
app/src/main/java/ch/threema/app/tasks/OutgoingVoipCallHangupMessageTask.kt

@@ -36,6 +36,8 @@ class OutgoingVoipCallHangupMessageTask(
 ) : OutgoingCspMessageTask(serviceManager) {
     override val type: String = "OutgoingVoipCallHangupMessageTask"
 
+    override val shortLogInfo: String = "cid=${voipCallHangupData.callId}"
+
     override suspend fun runSendingSteps(handle: ActiveTaskCodec) {
         val message = VoipCallHangupMessage().apply {
             this.data = voipCallHangupData

+ 2 - 0
app/src/main/java/ch/threema/app/tasks/OutgoingVoipCallOfferMessageTask.kt

@@ -38,6 +38,8 @@ class OutgoingVoipCallOfferMessageTask(
 
     override val type: String = "OutgoingVoipCallOfferMessageTask"
 
+    override val shortLogInfo: String = "cid=${voipCallOfferData.callId}"
+
     override suspend fun runSendingSteps(handle: ActiveTaskCodec) {
         val message = VoipCallOfferMessage()
         message.data = voipCallOfferData

+ 2 - 0
app/src/main/java/ch/threema/app/tasks/OutgoingVoipCallRingingMessageTask.kt

@@ -38,6 +38,8 @@ class OutgoingVoipCallRingingMessageTask(
 
     override val type: String = "OutgoingVoipCallRingingMessageTask"
 
+    override val shortLogInfo: String = "cid=${voipCallRingingData.callId}"
+
     override suspend fun runSendingSteps(handle: ActiveTaskCodec) {
         val message = VoipCallRingingMessage()
         message.data = voipCallRingingData

+ 2 - 0
app/src/main/java/ch/threema/app/tasks/OutgoingVoipICECandidateMessageTask.kt

@@ -36,6 +36,8 @@ class OutgoingVoipICECandidateMessageTask(
 ) : OutgoingCspMessageTask(serviceManager) {
     override val type: String = "OutgoingVoipICECandidateMessageTask"
 
+    override val shortLogInfo: String = "cid=${voipICECandidatesData.callId}"
+
     override suspend fun runSendingSteps(handle: ActiveTaskCodec) {
         val message = VoipICECandidatesMessage()
         message.data = voipICECandidatesData

+ 54 - 0
app/src/main/java/ch/threema/app/tasks/TaskLogging.kt

@@ -0,0 +1,54 @@
+/*  _____ _
+ * |_   _| |_  _ _ ___ ___ _ __  __ _
+ *   | | | ' \| '_/ -_) -_) '  \/ _` |_
+ *   |_| |_||_|_| \___\___|_|_|_\__,_(_)
+ *
+ * Threema for Android
+ * Copyright (c) 2025 Threema GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package ch.threema.app.tasks
+
+import ch.threema.domain.taskmanager.Task
+import kotlinx.serialization.encodeToString
+import kotlinx.serialization.json.Json
+
+/**
+ * Get the task as debug string. This is only used for debugging.
+ */
+val getDebugString: Task<*, *>.() -> String = {
+    val serializedHashCode = if (this is PersistableTask) {
+        serialize()?.let { serializedTaskData ->
+            Json.encodeToString(serializedTaskData).trim().hashCode()
+        }
+    } else {
+        null
+    }
+    val taskInstanceHashCode = hashCode()
+    buildString {
+        append(type)
+        if (shortLogInfo != null) {
+            append("[")
+            append(shortLogInfo)
+            append("]")
+        }
+        append("@")
+        append(taskInstanceHashCode)
+        if (serializedHashCode != null) {
+            append("~")
+            append(serializedHashCode)
+        }
+    }
+}

+ 1 - 1
app/src/main/java/ch/threema/app/tasks/archive/TaskArchiverImpl.kt

@@ -29,7 +29,6 @@ import ch.threema.base.utils.getThreemaLogger
 import ch.threema.domain.taskmanager.Task
 import ch.threema.domain.taskmanager.TaskArchiver
 import ch.threema.domain.taskmanager.TaskCodec
-import ch.threema.domain.taskmanager.getDebugString
 import ch.threema.storage.factories.TaskArchiveFactory
 import kotlinx.serialization.encodeToString
 import kotlinx.serialization.json.Json
@@ -39,6 +38,7 @@ private val logger = getThreemaLogger("TaskArchiverImpl")
 class TaskArchiverImpl(
     private val taskArchiveFactory: TaskArchiveFactory,
     private val taskRecoveryManager: TaskRecoveryManager,
+    private val getDebugString: Task<*, *>.() -> String,
 ) : TaskArchiver {
     private var serviceManager: ServiceManager? = null
 

+ 1 - 6
app/src/main/java/ch/threema/app/threemasafe/ThreemaSafeServiceImpl.java

@@ -599,12 +599,7 @@ public class ThreemaSafeServiceImpl implements ThreemaSafeService {
         preferenceService.setThreemaSafeMasterKey(masterKey);
         preferenceService.setThreemaSafeServerInfo(serverInfo);
 
-        byte[] threemaSafeEncryptedBackup;
-        try {
-            threemaSafeEncryptedBackup = threemaSafeApiClient.downloadEncryptedBackup(serverInfo, getThreemaSafeBackupId());
-        } catch (IOException e) {
-            throw new ThreemaException("Failed to get backup", e);
-        }
+        byte[] threemaSafeEncryptedBackup = threemaSafeApiClient.downloadEncryptedBackup(serverInfo, getThreemaSafeBackupId());
 
         byte[] nonce = new byte[NaCl.NONCE_BYTES];
         byte[] gzippedData = new byte[threemaSafeEncryptedBackup.length - NaCl.NONCE_BYTES];

+ 54 - 22
app/src/main/java/ch/threema/app/utils/ConfigUtils.java

@@ -123,6 +123,7 @@ import ch.threema.app.preference.service.PreferenceService;
 import ch.threema.app.services.license.LicenseService;
 import ch.threema.app.threemasafe.ThreemaSafeConfigureActivity;
 import ch.threema.app.workers.RestartWorker;
+
 import static ch.threema.base.utils.LoggingKt.getThreemaLogger;
 
 import static android.content.res.Configuration.UI_MODE_NIGHT_YES;
@@ -154,6 +155,9 @@ public class ConfigUtils {
     @PreferenceService.EmojiStyle
     public static int emojiStyle = 0;
 
+    private static final String LICENSE_URL_THEME_VALUE_LIGHT = "light";
+    private static final String LICENSE_URL_THEME_VALUE_DARK = "dark";
+
     private static Boolean isTablet = null, isBiggerSingleEmojis = null;
     private static int preferredThumbnailWidth = -1, preferredAudioMessageWidth = -1, currentDayNightMode;
     private static WeakReference<MapLibre> mapLibreWeakReference = null;
@@ -505,6 +509,11 @@ public class ConfigUtils {
         return emojiStyle == EmojiStyle_DEFAULT;
     }
 
+    @NonNull
+    private static String getVersionUrlParamValue() {
+        return getAppVersion();
+    }
+
     /**
      * Get user-facing application version string including alpha/beta version suffix
      */
@@ -570,43 +579,66 @@ public class ConfigUtils {
         return info.toString();
     }
 
-    public static String getPrivacyPolicyURL(Context context) {
-        return getLicenceURL(context, R.string.privacy_policy_url);
+    @NonNull
+    public static String getPrivacyPolicyURL(@NonNull Context context, boolean isDarkTheme) {
+        return String.format(
+            context.getString(R.string.privacy_policy_url),
+            getLanguageUrlParamValue(),
+            getVersionUrlParamValue(),
+            getThemeUrlParamValue(isDarkTheme)
+        );
+    }
+
+    @NonNull
+    public static String getTermsOfServiceURL(@NonNull Context context, boolean isDarkTheme) {
+        return String.format(
+            context.getString(R.string.terms_of_service_url),
+            getLanguageUrlParamValue(),
+            getVersionUrlParamValue(),
+            getThemeUrlParamValue(isDarkTheme)
+        );
     }
 
-    public static String getTermsOfServiceURL(Context context) {
-        return getLicenceURL(context, R.string.terms_of_service_url);
+    @NonNull
+    public static String getReferralTermsOfServiceURL(@NonNull Context context, boolean isDarkTheme) {
+        return String.format(
+            context.getString(R.string.referral_terms_of_service_url),
+            getLanguageUrlParamValue(),
+            getThemeUrlParamValue(isDarkTheme)
+        );
     }
 
-    public static String getEulaURL(Context context) {
-        return getLicenceURL(context, R.string.eula_url);
+    @NonNull
+    public static String getEulaURL(@NonNull Context context, boolean isDarkTheme) {
+        return String.format(
+            context.getString(R.string.eula_url),
+            getLanguageUrlParamValue(),
+            getVersionUrlParamValue(),
+            getThemeUrlParamValue(isDarkTheme)
+        );
     }
 
-    private static String getLicenceURL(Context context, @StringRes int url) {
-        String language = LocaleUtil.getAppLanguage();
-        String lang = language.startsWith("de") || language.startsWith("gsw")
+    @NonNull
+    private static String getLanguageUrlParamValue() {
+        final @NonNull String language = LocaleUtil.getAppLanguage();
+        return language.startsWith("de") || language.startsWith("gsw")
             ? "de"
             : "en";
-        String version = ConfigUtils.getAppVersion();
-        boolean darkModeOverride = false;
-        if (context instanceof AppCompatActivity) {
-            darkModeOverride = ((AppCompatActivity) context).getDelegate().getLocalNightMode() == MODE_NIGHT_YES;
-        }
-
-        String theme = isTheDarkSide(context) || darkModeOverride ? "dark" : "light";
+    }
 
-        return String.format(context.getString(url), lang, version, theme);
+    @NonNull
+    static String getThemeUrlParamValue(boolean isDarkTheme) {
+        return isDarkTheme ? LICENSE_URL_THEME_VALUE_DARK : LICENSE_URL_THEME_VALUE_LIGHT;
     }
 
+    @NonNull
     public static String getWorkExplainURL(Context context) {
-        String lang = LocaleUtil.getAppLanguage();
-
+        @NonNull String lang = LocaleUtil.getAppLanguage();
         if (lang.length() >= 2) {
             lang = lang.substring(0, 2);
         } else {
             lang = "en";
         }
-
         return String.format(context.getString(R.string.work_explain_url), lang);
     }
 
@@ -1531,7 +1563,7 @@ public class ConfigUtils {
     /**
      * Check whether the user has restricted the app from network use when in the background
      *
-     * @param context           A context
+     * @param context A context
      * @return true if the app cannot access the network when in background
      */
     public static boolean isBackgroundDataRestricted(@NonNull Context context) {
@@ -1623,6 +1655,6 @@ public class ConfigUtils {
     }
 
     public static boolean isReferralProgramEnabled() {
-        return !isWorkBuild() && BuildConfig.REFERRAL_PROGRAM_AVAILABLE;
+        return !isWorkBuild();
     }
 }

+ 44 - 27
app/src/main/java/ch/threema/app/utils/OutgoingCspMessageUtils.kt

@@ -428,22 +428,26 @@ private class OutgoingCspMessageSender(
      * It is safe to call this method even if multi device is deactivated.
      */
     suspend fun reflectMessage(handle: ActiveTaskCodec) {
-        if (multiDeviceProperties != null && genericMessage.reflectOutgoing()) {
-            genericMessage.logMessage("Reflecting")
-            val cspNonces = receiverPairs.map { it.second }.toList()
-            val encryptedEnvelopeResult = getEncryptedOutgoingMessageEnvelope(
-                genericMessage,
-                cspNonces,
-                multiDeviceProperties.mediatorDeviceId,
-                multiDeviceProperties.keys,
-            )
+        if (multiDeviceProperties == null || !genericMessage.reflectOutgoing()) {
+            genericMessage.logMessage("Skipping reflection of")
+            return
+        }
 
-            if (encryptedEnvelopeResult != null) {
-                val reflectId: UInt = handle.reflect(encryptedEnvelopeResult)
-                pendingReflectAck = reflectId to encryptedEnvelopeResult.nonce
-            } else {
-                logger.error("Cannot reflect message")
-            }
+        genericMessage.logMessage("Reflecting")
+        val cspNonces = receiverPairs.map { it.second }.toList()
+        val encryptedEnvelopeResult = getEncryptedOutgoingMessageEnvelope(
+            genericMessage,
+            cspNonces,
+            multiDeviceProperties.mediatorDeviceId,
+            multiDeviceProperties.keys,
+        )
+
+        if (encryptedEnvelopeResult != null) {
+            val reflectId: UInt = handle.reflect(encryptedEnvelopeResult)
+            genericMessage.logMessage("Reflected (with reflect id $reflectId)")
+            pendingReflectAck = reflectId to encryptedEnvelopeResult.nonce
+        } else {
+            logger.error("Cannot reflect message")
         }
     }
 
@@ -455,13 +459,17 @@ private class OutgoingCspMessageSender(
      * @return the reflected at timestamp or null if there is nothing to await
      */
     suspend fun awaitReflectAck(handle: PassiveTaskCodec): ULong? {
-        val (reflectId, d2dNonce) = pendingReflectAck ?: return null
+        val (reflectId, d2dNonce) = pendingReflectAck ?: run {
+            logger.info("No pending reflect ack to await")
+            return null
+        }
+        logger.info("Awaiting reflect ack for message with reflect id {}", reflectId)
         val reflectedAt = handle.awaitReflectAck(reflectId)
         if (genericMessage.protectAgainstReplay()) {
             nonceFactory.store(NonceScope.D2D, d2dNonce)
         }
         pendingReflectAck = null
-        genericMessage.logMessage("Received reflect ack for")
+        logger.info("Received reflect ack for message with reflect id {}", reflectId)
         return reflectedAt
     }
 
@@ -470,7 +478,7 @@ private class OutgoingCspMessageSender(
      * not already a forward security envelope message.
      */
     suspend fun sendMessage(handle: ActiveTaskCodec) {
-        genericMessage.logMessage("Sending")
+        genericMessage.logMessage("Preparing to send")
         receiverPairs.mapNotNull { (receiver, nonce) ->
             // Encapsulate the messages with the given nonce. Note that this may lead to two
             // messages in total if an fs init or empty message needs to be sent too.
@@ -510,6 +518,7 @@ private class OutgoingCspMessageSender(
                     nonceFactory.store(NonceScope.CSP, nonce)
                 }
 
+                message.logMessage("Sending")
                 // Send the message
                 handle.write(
                     message.toCspMessage(
@@ -531,9 +540,12 @@ private class OutgoingCspMessageSender(
         handle: PassiveTaskCodec,
     ) {
         pendingCspMessageAcks.forEach { (receiverIdentity, messageId) ->
+            logger.info("Awaiting server ack of message {} to {}", messageId, receiverIdentity)
             handle.awaitOutgoingMessageAck(messageId, receiverIdentity)
+            logger.info("Awaited server ack of message {} to {}", messageId, receiverIdentity)
         }
         pendingCspMessageAcks.clear()
+        logger.info("Received all required server acks")
     }
 
     /**
@@ -546,6 +558,7 @@ private class OutgoingCspMessageSender(
             forwardSecurityMessageProcessor.commitSessionState(it)
         }
         forwardSecurityResults.clear()
+        logger.info("All forward security sessions committed")
     }
 
     /**
@@ -553,16 +566,20 @@ private class OutgoingCspMessageSender(
      * add the reflect ids to [pendingReflectAck].
      */
     suspend fun reflectMessageUpdateSent(handle: ActiveTaskCodec) {
-        if (multiDeviceProperties != null && genericMessage.reflectSentUpdate()) {
-            genericMessage.logMessage("Reflecting outgoing message sent update for")
-            val encryptedEnvelopeResult = getEncryptedOutgoingMessageUpdateSentEnvelope(
-                genericMessage,
-                multiDeviceProperties.mediatorDeviceId,
-                multiDeviceProperties.keys,
-            )
-            val reflectId: UInt = handle.reflect(encryptedEnvelopeResult)
-            pendingReflectAck = reflectId to encryptedEnvelopeResult.nonce
+        if (multiDeviceProperties == null || !genericMessage.reflectSentUpdate()) {
+            genericMessage.logMessage("Skipping reflection of message update sent for")
+            return
         }
+
+        genericMessage.logMessage("Reflecting outgoing message sent update for")
+        val encryptedEnvelopeResult = getEncryptedOutgoingMessageUpdateSentEnvelope(
+            genericMessage,
+            multiDeviceProperties.mediatorDeviceId,
+            multiDeviceProperties.keys,
+        )
+        val reflectId: UInt = handle.reflect(encryptedEnvelopeResult)
+        genericMessage.logMessage("Reflected outgoing message sent update (with reflect id $reflectId) for")
+        pendingReflectAck = reflectId to encryptedEnvelopeResult.nonce
     }
 
     fun storeForwardSecurityStateInfo() {

+ 23 - 17
app/src/main/java/ch/threema/app/voip/services/VoipStateService.java

@@ -28,15 +28,11 @@ import android.content.ComponentName;
 import android.content.Context;
 import android.content.Intent;
 import android.graphics.Bitmap;
-import android.graphics.Color;
 import android.media.AudioManager;
 import android.net.Uri;
 import android.os.Build;
 import android.os.Bundle;
 import android.os.SystemClock;
-import android.text.Spannable;
-import android.text.SpannableString;
-import android.text.style.ForegroundColorSpan;
 
 import org.koin.java.KoinJavaComponent;
 import org.slf4j.Logger;
@@ -60,7 +56,9 @@ import androidx.annotation.Nullable;
 import androidx.annotation.WorkerThread;
 import androidx.core.app.NotificationCompat;
 import androidx.core.app.NotificationManagerCompat;
+import androidx.core.app.Person;
 import androidx.core.content.LocusIdCompat;
+import androidx.core.graphics.drawable.IconCompat;
 import androidx.localbroadcastmanager.content.LocalBroadcastManager;
 import androidx.work.Data;
 import androidx.work.OneTimeWorkRequest;
@@ -1459,7 +1457,7 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
     @WorkerThread
     private Notification showNotification(
         @NonNull ContactModel contact,
-        @Nullable PendingIntent accept,
+        @NonNull PendingIntent accept,
         @NonNull PendingIntent reject,
         final VoipCallOfferMessage msg) {
         final long timestamp = System.currentTimeMillis();
@@ -1467,10 +1465,12 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
         final PendingIntent inCallPendingIntent = createLaunchPendingIntent(contact.getIdentity(), msg);
         Notification notification = null;
 
+        String callerName = NameUtil.getDisplayNameOrNickname(contact, true);
+
         if (notificationManagerCompat.areNotificationsEnabled()) {
             final NotificationCompat.Builder nbuilder = new NotificationCompat.Builder(this.appContext, NotificationChannels.NOTIFICATION_CHANNEL_INCOMING_CALLS)
                 .setContentTitle(appContext.getString(R.string.voip_notification_title))
-                .setContentText(appContext.getString(R.string.voip_notification_text, NameUtil.getDisplayNameOrNickname(contact, true)))
+                .setContentText(appContext.getString(R.string.voip_notification_text, callerName))
                 .setOngoing(true)
                 .setWhen(timestamp)
                 .setAutoCancel(false)
@@ -1514,23 +1514,29 @@ public class VoipStateService implements AudioManager.OnAudioFocusChangeListener
                     .build()
                 );
 
+            Person.Builder personBuilder = new Person.Builder()
+                .setName(callerName)
+                .setKey(ContactUtil.getUniqueIdString(contact.getIdentity()));
+            Bitmap callerProfilePicture = contactService.getAvatar(contact.getIdentity(), false);
+            if (callerProfilePicture != null) {
+                personBuilder.setIcon(IconCompat.createWithBitmap(callerProfilePicture));
+            }
             // Add identity to notification for DND priority override
             String contactLookupUri = contactService.getAndroidContactLookupUriString(contact);
             if (contactLookupUri != null) {
-                nbuilder.addPerson(contactLookupUri);
+                personBuilder.setUri(contactLookupUri);
             }
+            Person person = personBuilder.build();
 
             nbuilder.setLocusId(new LocusIdCompat(ContactUtil.getUniqueIdString(contact.getIdentity())));
-
-            // Actions
-            final SpannableString rejectString = new SpannableString(appContext.getString(R.string.voip_reject));
-            rejectString.setSpan(new ForegroundColorSpan(Color.RED), 0, rejectString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-
-            final SpannableString acceptString = new SpannableString(appContext.getString(R.string.voip_accept));
-            acceptString.setSpan(new ForegroundColorSpan(Color.GREEN), 0, acceptString.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
-
-            nbuilder.addAction(R.drawable.ic_call_end_grey600_24dp, rejectString, reject)
-                .addAction(R.drawable.ic_call_grey600_24dp, acceptString, accept != null ? accept : inCallPendingIntent);
+            nbuilder.addPerson(person);
+            nbuilder.setStyle(
+                NotificationCompat.CallStyle.forIncomingCall(
+                    person,
+                    reject,
+                    accept
+                )
+            );
 
             // Build notification
             notification = nbuilder.build();

+ 6 - 1
app/src/main/java/ch/threema/app/webviews/EulaActivity.kt

@@ -37,7 +37,12 @@ class EulaActivity : SimpleWebViewActivity() {
 
     override fun getWebViewTitle() = R.string.eula
 
-    override fun getWebViewUrl() = ConfigUtils.getEulaURL(this)
+    override fun getWebViewUrl(isDarkTheme: Boolean) = ConfigUtils.getEulaURL(
+        /* context = */
+        this,
+        /* isDarkTheme = */
+        isDarkTheme,
+    )
 
     companion object {
         fun createIntent(context: Context) = buildActivityIntent<EulaActivity>(context)

+ 1 - 1
app/src/main/java/ch/threema/app/webviews/LicenseActivity.kt

@@ -36,7 +36,7 @@ class LicenseActivity : SimpleWebViewActivity() {
 
     override fun getWebViewTitle() = R.string.os_licenses
 
-    override fun getWebViewUrl() = "file:///android_asset/license.html"
+    override fun getWebViewUrl(isDarkTheme: Boolean) = "file:///android_asset/license.html"
 
     override fun requiresConnection() = false
 

+ 6 - 1
app/src/main/java/ch/threema/app/webviews/PrivacyPolicyActivity.kt

@@ -37,7 +37,12 @@ class PrivacyPolicyActivity : SimpleWebViewActivity() {
 
     override fun getWebViewTitle() = R.string.privacy_policy
 
-    override fun getWebViewUrl() = ConfigUtils.getPrivacyPolicyURL(this)
+    override fun getWebViewUrl(isDarkTheme: Boolean) = ConfigUtils.getPrivacyPolicyURL(
+        /* context = */
+        this,
+        /* isDarkTheme = */
+        isDarkTheme,
+    )
 
     companion object {
         @JvmStatic

+ 51 - 0
app/src/main/java/ch/threema/app/webviews/ReferralTosActivity.kt

@@ -0,0 +1,51 @@
+/*  _____ _
+ * |_   _| |_  _ _ ___ ___ _ __  __ _
+ *   | | | ' \| '_/ -_) -_) '  \/ _` |_
+ *   |_| |_||_|_| \___\___|_|_|_\__,_(_)
+ *
+ * Threema for Android
+ * Copyright (c) 2013-2025 Threema GmbH
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package ch.threema.app.webviews
+
+import android.content.Context
+import ch.threema.android.buildActivityIntent
+import ch.threema.app.R
+import ch.threema.app.utils.ConfigUtils
+import ch.threema.app.utils.logScreenVisibility
+import ch.threema.base.utils.getThreemaLogger
+
+private val logger = getThreemaLogger("ReferralTosActivity")
+
+class ReferralTosActivity : SimpleWebViewActivity() {
+    init {
+        logScreenVisibility(logger)
+    }
+
+    override fun getWebViewTitle() = R.string.terms_of_service
+
+    override fun getWebViewUrl(isDarkTheme: Boolean) = ConfigUtils.getReferralTermsOfServiceURL(
+        /* context = */
+        this,
+        /* isDarkTheme = */
+        isDarkTheme,
+    )
+
+    companion object {
+        @JvmStatic
+        fun createIntent(context: Context) = buildActivityIntent<ReferralTosActivity>(context)
+    }
+}

+ 12 - 12
app/src/main/java/ch/threema/app/webviews/SimpleWebViewActivity.java

@@ -30,6 +30,7 @@ import android.webkit.WebChromeClient;
 import android.webkit.WebView;
 
 import androidx.annotation.NonNull;
+import androidx.annotation.Nullable;
 import androidx.annotation.StringRes;
 import androidx.appcompat.app.AppCompatDelegate;
 
@@ -53,6 +54,8 @@ public abstract class SimpleWebViewActivity extends ThreemaToolbarActivity imple
     private LinearProgressIndicator progressBar;
     private WebView webView;
 
+    private boolean isDarkThemeForced = false;
+
     public void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
 
@@ -61,23 +64,18 @@ public abstract class SimpleWebViewActivity extends ThreemaToolbarActivity imple
         toolbar.setTitle(getWebViewTitle());
 
         Intent intent = getIntent();
-        Bundle extras = intent.getExtras();
-        final boolean darkThemeForced;
+        final @Nullable Bundle extras = intent.getExtras();
 
         if (extras != null && extras.getBoolean(FORCE_DARK_THEME, false)) {
-            darkThemeForced = true;
+            isDarkThemeForced = true;
             if (getConnectionIndicator() != null) {
-                // hide connection indicator when launched from wizard
+                // hide connection indicator when dark theme is forced
                 getConnectionIndicator().setVisibility(View.INVISIBLE);
             }
-        } else {
-            darkThemeForced = false;
         }
 
-        if (!ConfigUtils.isTheDarkSide(this)) {
-            if (darkThemeForced) {
-                getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
-            }
+        if (!ConfigUtils.isTheDarkSide(this) && isDarkThemeForced) {
+            getDelegate().setLocalNightMode(AppCompatDelegate.MODE_NIGHT_YES);
         }
 
         progressBar = findViewById(R.id.progress);
@@ -121,7 +119,8 @@ public abstract class SimpleWebViewActivity extends ThreemaToolbarActivity imple
     }
 
     private void loadWebView() {
-        webView.loadUrl(getWebViewUrl());
+        final boolean isDarkTheme = ConfigUtils.isTheDarkSide(this) || isDarkThemeForced;
+        webView.loadUrl(getWebViewUrl(isDarkTheme));
     }
 
     private void checkConnection() {
@@ -149,7 +148,8 @@ public abstract class SimpleWebViewActivity extends ThreemaToolbarActivity imple
 
     protected abstract @StringRes int getWebViewTitle();
 
-    protected abstract String getWebViewUrl();
+    @NonNull
+    protected abstract String getWebViewUrl(boolean isDarkTheme);
 
     protected boolean requiresConnection() {
         return true;

+ 1 - 1
app/src/main/java/ch/threema/app/webviews/SupportActivity.kt

@@ -47,7 +47,7 @@ class SupportActivity : SimpleWebViewActivity() {
 
     override fun getWebViewTitle() = R.string.support
 
-    override fun getWebViewUrl(): String =
+    override fun getWebViewUrl(isDarkTheme: Boolean) =
         getBaseUrl().toUri()
             .buildUpon()
             .appendQueryParameter("lang", LocaleUtil.getAppLanguage())

+ 6 - 1
app/src/main/java/ch/threema/app/webviews/TermsOfServiceActivity.kt

@@ -37,7 +37,12 @@ class TermsOfServiceActivity : SimpleWebViewActivity() {
 
     override fun getWebViewTitle() = R.string.terms_of_service
 
-    override fun getWebViewUrl() = ConfigUtils.getTermsOfServiceURL(this)
+    override fun getWebViewUrl(isDarkTheme: Boolean) = ConfigUtils.getTermsOfServiceURL(
+        /* context = */
+        this,
+        /* isDarkTheme = */
+        isDarkTheme,
+    )
 
     companion object {
         fun createIntent(context: Context) = buildActivityIntent<TermsOfServiceActivity>(context)

+ 1 - 1
app/src/main/java/ch/threema/app/webviews/WorkExplainActivity.kt

@@ -50,7 +50,7 @@ class WorkExplainActivity : SimpleWebViewActivity() {
 
     override fun getWebViewTitle() = R.string.threema_work
 
-    override fun getWebViewUrl() = ConfigUtils.getWorkExplainURL(this)
+    override fun getWebViewUrl(isDarkTheme: Boolean) = ConfigUtils.getWorkExplainURL(this)
 
     companion object {
         private const val WORK_PACKAGE_NAME = "ch.threema.app.work"

+ 1 - 1
app/src/main/java/ch/threema/app/widget/WidgetUtil.kt

@@ -30,7 +30,7 @@ import ch.threema.app.receivers.WidgetProvider
 object WidgetUtil {
     @JvmStatic
     fun updateWidgets(context: Context) {
-        val appWidgetManager = AppWidgetManager.getInstance(context)
+        val appWidgetManager = AppWidgetManager.getInstance(context) ?: return
         val widgetIds = appWidgetManager.getAppWidgetIds(ComponentName(context, WidgetProvider::class.java))
         appWidgetManager.notifyAppWidgetViewDataChanged(widgetIds, R.id.widget_list)
     }

+ 0 - 1
app/src/main/res/layout/activity_simple_webview.xml

@@ -50,7 +50,6 @@
             android:id="@+id/simple_webview"
             android:layout_width="match_parent"
             android:layout_height="wrap_content"
-            android:layout_marginHorizontal="@dimen/grid_unit_x1"
             android:background="?android:attr/colorBackground"
             android:scrollbars="none" />
 

+ 1 - 13
app/src/main/res/values-be-rBY/strings.xml

@@ -165,7 +165,6 @@
     <string name="delete_id_title">Выдаліць ID</string>
     <string name="delete_id_message">Калі ў вас няма створанай або экспартаванай рэзервовай копіі гэтага ID, вы больш ніколі не зможаце адпраўляць ці атрымліваць паведамленні, выкарыстоўваючы гэты ID.\n\nКалі вы больш не хочаце выкарыстоўваць гэты ID, рэкамендуецца задаць пароль водгуку і адклікаць ID на сайце  .ch/revoke перад яго выдаленнем.</string>
     <string name="delete_id_message2">Апошняе папярэджанне: вы сапраўды хочаце выдаліць свой ID?</string>
-    <string name="delete_id_sum">Назаўжды выдаліць свой ID і ўсе даныя на гэтай прыладзе</string>
     <string name="delete_all_data_prompt">Выдаліць усе даныя праграмы?</string>
     <string name="backup_password_summary">Ваш экспарт ID будзе зашыфраваны паролем. Выкарыстоўвайце спалучэнне лацінскіх літар, лічбаў і спецыяльных сімвалаў. Не забудзьцеся запісаць ці запомніць свой новы пароль!</string>
     <string name="backup_password_again_summary">Увядзіце пароль яшчэ раз</string>
@@ -666,7 +665,6 @@
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="new_wizard_welcome">Сардэчна запрашаем у ${app_name}!</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_move_finger">Соўгайце пальцам па экране</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_this_is_your_id">Гэта ваш ${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. -->
@@ -881,9 +879,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>
     <!-- ${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">Галасавыя званкі</string>
     <string name="prefs_voice_call_sound">Рынгтон</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_sum_voice_call_sound">Абярыце сігнал для ўваходных званкоў ${app_name_short}</string>
@@ -892,7 +888,6 @@
     <!-- ${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_title_voip_enable">Уключыць званкі ${app_name_short}</string>
     <string name="webclient_invalid_push_token_message">Патрабуецца запуск уручную</string>
-    <string name="threema_work_contact">Рабочы кантакт ${app_name_short}</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="permission_phone_required">Даць дазвол на кіраванне тэлефоннымі званкамі пры выкарыстанні званкоў ${app_name}</string>
     <string name="strikethrough">Закрэсліванне</string>
@@ -907,7 +902,6 @@
     <string name="error_attaching_files">Памылка дадання ўкладанняў.</string>
     <string name="prefs_fix_powermanager_problems">Выпраўлены праблемы з Huawei</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="prefs_fix_powermanager_problems_desc">Выпраўлены праблемы на прыладах Huawei, якія атрымліваюць паведамленні, калі праграма знаходзіцца ў фонавым рэжыме</string>
     <string name="disable_powermanager_explain">Для атрымання паведамлення ў фонавым рэжыме, калі ласка, уключыце перамыкач побач з \"%s\" на наступным экране.</string>
     <string name="disable_autostart_explain">На наступным экране пераканайцеся, што \"%s\" ёсць у спісе праграм, якія могуць запускацца аўтаматычна. Скончыўшы, націсніце кнопку \"назад\".</string>
     <string name="notification_priority_default">Нізкі</string>
@@ -952,7 +946,6 @@
     <string name="webclient_session_stop_all">Закрыць усё</string>
     <string name="passphrase_service_name">Служба кодавых фраз</string>
     <string name="passphrase_service_description">Апавяшчэнне пры разблакіроўцы кодавай фразы</string>
-    <string name="webclient_service_description">Апавяшчэнне пры актыўнай сесіі ${app_name_short} Web</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>
@@ -982,7 +975,6 @@
     <!-- ${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_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. -->
-    <string name="safe_configure_server_explain">Можна выкарыстоўваць сэрвер ${app_name_short} Safe або паказаць пабочны сэрвер для рэзервовага капіявання.</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="onprem_safe_configure_server_explain">Захавайце рэзервовую копію ${app_name_short} на серверы вашай арганізацыі або пазначце іншы сервер рэзервовага капіравання.</string>
     <string name="safe_use_default_server">Прадвызначаны сервер</string>
@@ -993,7 +985,6 @@
     <string name="safe_threema_id">Ваш ID ${app_name_short}</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">Увядзіце ID ${app_name_short}, які вы хочаце аднавіць</string>
-    <string name="safe_search_id_title">Увядзіце нумар мабільнага ці email, звязаны з вашым 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">Пошук ID ${app_name_short}</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1224,7 +1215,6 @@
     <string name="picture_in_picture_disabled_in_setting">Рэжым «малюнак у малюнку» адключаны для %s. Уключыце яго ў сістэмных наладах.</string>
     <string name="delete_everything">Выдаліць усё</string>
     <string name="prefs_title_voip_video_enable">Дазволіць відэа</string>
-    <string name="video_calls">Відэазв. ${app_name_short}</string>
     <string name="prefs_videocall_profile">Пераважная якасць відарыса</string>
     <string name="videocall_profile_auto">Збалансаванае (рэкамендавана)</string>
     <string name="videocall_profile_low_bandwidth">Нізкі трафік даных</string>
@@ -1507,7 +1497,7 @@
     <string name="call_phone_permission_description">Для выканання выклікаў ${app_name_short} неабходны дазвол да тэлефона, каб вызначыць, калі іншы выклік перапыняе выклік ${app_name_short}.</string>
     <string name="group_call_nearby_devices_permission_description">Каб выконваць супольныя выклікі з дапамогай гарнітуры Bluetooth, вы павінны дазволіць «прыладам паблізу» выяўляць гарнітуры Bluetooth.</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">Для выканання выклікаў ${app_name} з гарнітурай bluetooth вы павінны дазволіць «прыладам паблізу» выяўляць гарнітуры bluetooth.</string>
+    <string name="call_nearby_devices_permission_description">Для выканання выклікаў ${app_name_short} з гарнітурай bluetooth вы павінны дазволіць «прыладам паблізу» выяўляць гарнітуры bluetooth.</string>
     <string name="settings">Налады</string>
     <string name="leave">Пакінуць</string>
     <string name="fs_key_mismatch">несупадзенне ключоў</string>
@@ -1523,7 +1513,6 @@
     <string name="forward_security_explanation">Perfect Forward Secrecy (PFS) абараняе запісанае паведамленне ад дэшыфравання заднім лікам, нават калі доўгатэрміновы ключ шыфравання скампраметаваны.\n\nОпцыю можна ўключыць, калі праграма з абодвух бакоў падтрымлівае PFS.</string>
     <string name="group_call_inactivity_left">Суполкавы выклік пакінуты з-за бяздзейнасці</string>
     <string name="missing_permission_external_storage">Немагчыма скапіяваць файл. Паспрабуйце наступныя крокі:\n 1. Адкрыйце праграму налад.\n 2. Перайдзіце ў раздзел «Праграмы» і абярыце «Доступ да спецыяльных праграм».\n 3. Націсніце на «Доступ да ўсіх файлаў».\n 4. Націсніце на тры кропкі ў правым верхнім куце і абярыце «Паказаць сістэму».\n 5. Націсніце на «Знешняе сховішча» і пераканайцеся, што «Дазволены доступ для кіравання ўсімі файламі».\n 6. Паспрабуйце яшчэ раз аднавіць рэзервовую копію.</string>
-    <string name="forward_security_downgraded_status_message">Perfect Forward Secrecy быў адключаны ў гэтай размове, таму што версія праграмы вашага партнёра па чаце не падтрымлівае яе.</string>
     <string name="forward_security_illegal_session_status_message">Сеанс Perfect Forward Secrecy быў скінуты з-за несапраўднасці.</string>
     <string name="crop_image_title">Абрэзаць відарыс</string>
     <string name="scroll_to_bottom">Пракруціце ўніз</string>
@@ -1588,7 +1577,6 @@
     <string name="status_orphaned_group">*Гэтая суполка выдалена*\n Стваральнік суполкі пакінуў суполку, і яна больш не можа падтрымлівацца.  Адзін з астатніх членаў можа кланаваць суполку (праз дэталі суполкі), каб стаць новым адміністратарам.</string>
     <string name="group_not_a_member_notice">Вы больш не з\'яўляецеся часткай гэтай суполкі і больш не можаце ёй карыстацца.</string>
     <string name="group_dissolved_notice">Гэтая суполка была распушчана і больш не можа выкарыстоўвацца.</string>
-    <string name="md_linked_devices">Звязаныя прылады</string>
     <string name="md_link_device">Звязаць новую прыладу</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 -->

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

@@ -814,7 +814,7 @@
     <string name="really_reset_ringtones">Наистина ли искате да възстановите настройките на звука на известията?</string>
     <string name="reset_ringtones_confirm">Настройките на известията на звука бяха възстановени.</string>
     <string name="prefs_language_override">Език</string>
-    <string name="threema_channel_intro">Threema каналът Ви предоставя новини за всичко около Threema. Искате ли да се абонирате за канала на Threema и да го добавите като контакт? Безплатно е и винаги можете да се отпишете.</string>
+    <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>

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

@@ -156,7 +156,6 @@ per aquesta ID. Això significa que algú ha manipulat el codi escanejat, i que
     <string name="delete_id_title">Eliminar ID</string>
     <string name="delete_id_message">A menys que hàgiu creat una còpia de seguretat o exportat i desat una còpia d\'aquesta ID, mai més podreu tornar a enviar o rebre missatges amb aquesta ID.\n\nSi no voleu tornar a utilitzar aquesta ID, es recomana definir una contrasenya de revocació i revocar la ID a myid.threema.ch/revoke abans d\'esborrar-la.</string>
     <string name="delete_id_message2">Darrera advertència: segur que voleu eliminar la vostra ID en aquest dispositiu?</string>
-    <string name="delete_id_sum">Eliminar permanentment la vostra ID i totes les dades en aquest dispositiu</string>
     <string name="backup_password_summary">La vostra exportació d\'ID serà xifrada amb una contrasenya. Utilitzeu una combinació de lletres, números i símbols. No l\'oblideu!</string>
     <string name="backup_password_again_summary">Torneu a entrar la contrasenya</string>
     <string name="password_hint">Contrasenya</string>
@@ -825,7 +824,6 @@ donar només el vostre nom o un pseudònim. Si no definiu un sobrenom utilitzare
     <string name="prefs_summary_force_turn_on">Forçar la retransmissió de totes les trucades a través dels servidors de ${company_name}, protegint la vostra adreça IP. Podria afectar la qualitat de la trucada.</string>
     <string name="permission_record_audio_required">Per fer trucades xifrades i enviar missatges de veu permeteu accés al micròfon.</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">Trucades de veu</string>
     <string name="prefs_voice_call_sound">To de trucada</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_sum_voice_call_sound">Seleccionar el to de trucada per les trucades entrants de ${app_name_short}</string>
@@ -933,7 +931,6 @@ donar només el vostre nom o un pseudònim. Si no definiu un sobrenom utilitzare
     <string name="safe_threema_id">La vostra ID de ${app_name_short}</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">Entreu la ID de ${app_name_short} que voldríeu recuperar</string>
-    <string name="safe_search_id_title">Entreu el número de mòbil o l\'adreça de correu electrònic enllaçada amb la vostra 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">Buscant la ID de ${app_name_short}</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->

+ 19 - 2
app/src/main/res/values-cs/strings.xml

@@ -119,8 +119,8 @@
     <string name="copy_message_action">Zkopírovat</string>
     <string name="delete_contact_action">Odstranit kontakt</string>
     <string name="delete_multiple_contact_action">Odstranit kontakty</string>
-    <string name="scan_id">Skenovat ID</string>
-    <string name="id_scanned">ID oskenováno</string>
+    <string name="scan_id">Naskenovat ID</string>
+    <string name="id_scanned">ID naskenováno</string>
     <string name="id_mismatch">Naskenovaný veřejný klíč se neshoduje s klíčem, který je uložen na serveru pro toto ID. To znamená, že někdo s naskenovaným kódem manipuloval, a klíč proto nelze považovat za důvěryhodný.</string>
     <string name="scan_successful">ID bylo úspěšně naskenováno a kontakt je nyní ověřen.</string>
     <string name="scan_duplicate">Toto ID již bylo naskenováno a ověřeno.</string>
@@ -1791,6 +1791,23 @@ přátelům vás automaticky najít, pokud vás mají v adresáři svého telef
     <string name="remote_secret_deactivating">Deaktivování ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">Deaktivování ${remote_secret} selhalo. Zkontrolujte prosím stav vašeho připojení k internetu a zkuste to znovu.</string>
+    <string name="referral_banner_title">Doporučte a získejte výhody</string>
+    <string name="referral_banner_body">Pozvěte přátele, aby používali aplikaci Threema Work ve své společnosti a získejte bonus za doporučení!</string>
+    <string name="referral_screen_title">Doporučte a získejte výhody</string>
+    <string name="referral_screen_subtitle">Získejte až 10 % z částky z první faktury přizvané společnosti.</string>
+    <string name="referral_how_it_works_title">Jak to funguje</string>
+    <string name="referral_how_it_works_referral_title">Doporučení</string>
+    <string name="referral_how_it_works_referral_body">Vyzvěte přítele nebo jeho společnost, aby začal používat Threema Work. Je důležité, aby bylo vaše Threema ID poskytnuto během registrace, nebo při nákupu licencí, aby vaše doporučení mohlo být uplatněno.</string>
+    <string name="referral_how_it_works_requirements_title">Požadavky</string>
+    <string name="referral_how_it_works_requirements_body">Společnost, kterou doporučíte, nesmí být naším stávajícím zákazníkem a musí si u nás objednat licence</string>
+    <string name="referral_how_it_works_confirmation_title">Potvrzení</string>
+    <string name="referral_how_it_works_confirmation_body">Abychom zajistili správné přiřazení a ověření vašeho doporučení, budeme vás před provedením platby kontaktovat. Jakmile bude proces ověření dokončen, budeme vás informovat.</string>
+    <string name="referral_your_reward_title">Vaše odměna</string>
+    <string name="referral_your_reward_subtitle">Získejte bonus za doporučení</string>
+    <string name="referral_your_reward_body">Za vaše doporučení obdržíte 10 % z částky z první platby přizvané společnosti (bez daní/poplatků). Bonus vám bude odeslán 30–60 dní po přijetí platby.</string>
+    <string name="referral_share_invitation_link">Sdílet zvací odkaz</string>
+    <string name="referral_view_terms_and_conditions">Zobrazit obchodní podmínky</string>
+    <string name="referral_invitation_message_content">Ahoj! Toto by tě možná mohlo zajímat: Threema Work je výborná volba pro bezpečnou podnikovou komunikaci. Tady ti posílám testovací odkaz: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d kontakt</item>
         <item quantity="few">%d kontakty</item>

+ 28 - 32
app/src/main/res/values-de/strings.xml

@@ -104,7 +104,7 @@
     <!-- Text shown when a task which shows a loading spinner takes longer than expected (e.g. creating a group) -->
     <string name="please_wait_timeout">Das dauert etwas länger als erwartet</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="wizard_first_create_id">Schlüsselpaar wird erzeugt…</string>
+    <string name="wizard_first_create_id">Ihre ${app_name_short}-ID wird erstellt…</string>
     <string name="wizard1_sync_contacts">Kontakte werden synchronisiert…</string>
     <string name="wizard2_email_hint">Ihre E-Mail-Adresse</string>
     <string name="wizard2_email_linking">E-Mail verknüpfen</string>
@@ -488,7 +488,7 @@
     <string name="really_delete_media">Möchten Sie diese %d Medien-Nachricht(en) wirklich löschen?</string>
     <string name="check_updates">Auf Updates prüfen</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
-    <string name="masterkey_lock_explain">${app_name} hält die Passphrase im RAM-Speicher. Wenn Sie häufig nach der Passphrase gefragt werden, kann dies an einer Task-Killer- oder Akku-Spar-App liegen, welche die Passphrase aus dem Speicher entfernt.</string>
+    <string name="masterkey_lock_explain">${app_name} hält die Passphrase im RAM-Speicher. Wenn Sie häufig nach der Passphrase gefragt werden, kann dies an einer Task-Killer- oder Akku-Spar-App liegen, welche ${app_name_short} frühzeitig beendet.</string>
     <string name="identity_already_exists">Diese ID ist bereits in Ihrer Kontaktliste</string>
     <string name="share_contact">Kontakt teilen</string>
     <string name="add_shortcut">Verknüpfung erstellen</string>
@@ -558,8 +558,7 @@
     <string name="show_as_qrcode">Als QR-Code anzeigen</string>
     <string name="qr_code">QR-Code</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="really_leave_id_export">Vergewissern Sie sich, dass Sie die Zeichenfolge des ID-Exports oder den QR-Code an einen
-sicheren Ort gesichert oder ausgedruckt haben.</string>
+    <string name="really_leave_id_export">Vergewissern Sie sich, dass Sie die Zeichenfolge des ID-Exports oder den QR-Code an einen sicheren Ort gesichert oder ausgedruckt haben. Ihre ${app_name_short}-ID kann ohne ein Backup nicht wiederhergestellt werden.</string>
     <string name="revocation_key_title">ID-Widerruf</string>
     <string name="revocation_key_not_set">Kein Widerrufspasswort gesetzt</string>
     <string name="revocation_key_set_at">Passwort gesetzt %1$s</string>
@@ -669,11 +668,11 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="prefs_exportlog">Logdatei teilen</string>
     <string name="prefs_exportlog_summary">Logdatei für Problemanalyse teilen</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="permission_storage_required">Aktivieren Sie die Speicher-Berechtigung, um Medien zu sichern oder zu senden.</string>
+    <string name="permission_storage_required">Aktivieren Sie die Speicher-Berechtigung für ${app_name}, um Medien zu sichern oder zu senden.</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="permission_location_required">Aktivieren Sie die Standort-Berechtigung, um Ihre Position zu senden.</string>
+    <string name="permission_location_required">Aktivieren Sie die Standort-Berechtigung für ${app_name}, um Ihre Position zu senden.</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="permission_contacts_required">Aktivieren Sie die Kontakte-Berechtigung, um einen Kontakt zu senden.</string>
+    <string name="permission_contacts_required">Aktivieren Sie die Kontakte-Berechtigung für ${app_name}, um einen Kontakt zu senden.</string>
     <!-- "Thumbs up" should be translated by the name of the emoji 👍 -->
     <string name="message_acknowledged">«Daumen hoch» gesendet</string>
     <!-- "Thumbs down" should be translated by the name of the emoji 👎 -->
@@ -729,10 +728,10 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="new_wizard_phone_invalid">Die angegebene Handynummer ist ungültig\nBitte korrigieren oder löschen Sie die markierten Angaben, bevor Sie fortfahren.</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_fingerprint">Durch die Bewegung des Fingers erzeugen Sie Zufallsdaten (sogenannte Entropie), die für die Erzeugung des Schlüsselpaars genutzt werden. Dieses Schlüsselpaar wird mit Ihrer neuen ${app_name_short}-ID verbunden. Es besteht aus einem <b>öffentlichen Schlüssel</b>, der an Ihre Kontakte verteilt wird und einem <b>privaten Schlüssel</b>, der auf Ihrem Gerät verbleibt. Bei Ihren Kontakten wird der öffentliche Schlüssel genutzt, um Nachrichten an Sie zu verschlüsseln. Nur der Inhaber des privaten Schlüssels und niemand anderes kann die Nachrichten wieder entschlüsseln.</string>
-    <string name="new_wizard_info_id">Sie haben mit der ${app_name_short}-ID ein Schlüsselpaar erzeugt. Der öffentliche Schlüssel wurde an unseren Server gesendet.
+    <string name="new_wizard_info_id">Sie haben auch ein Schlüsselpaar erzeugt. Der öffentliche Schlüssel wurde sicher an unseren Server gesendet.
         Der private Schlüssel verlässt Ihr Gerät nie. Dies stellt sicher, dass niemand anderes Ihre Nachrichten lesen kann.</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">Wenn Sie diese Option aktivieren, werden E-Mail-Adressen und Telefonnummern aus Ihrem Adressbuch einwegverschlüsselt (gehasht), bevor sie zum Kontaktabgleich an der Server geschickt werden. Wir speichern keinerlei Adressbuchdaten.</string>
+    <string name="new_wizard_info_sync_contacts">Wenn Sie diese Option aktivieren, werden E-Mail-Adressen und Telefonnummern aus Ihrem Adressbuch von ${app_name_short} einwegverschlüsselt (gehasht), bevor sie zum Kontaktabgleich an der Server geschickt werden. Wir speichern keinerlei Adressbuchdaten.</string>
     <string name="new_wizard_info_sync_contacts_dialog">Die Kontakt-Synchronisation hilft Ihnen, Ihre Kontakte automatisch zu finden. Wenn Sie zustimmen, werden Handynummern und E-Mail-Adressen aus Ihrem Telefonbuch verschlüsselt an unseren Server gesendet und dort verglichen, um passende Kontakte zu finden. Die Daten werden weder gespeichert noch weitergegeben.\n\nMöchten Sie die Kontakt-Synchronisation aktivieren?</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">Wenn Sie Ihre eigene Handynummer und/oder E-Mail-Adresse angeben, kann ${app_name_short} Ihren Kontakten helfen, Sie automatisch zu finden, wenn Sie in deren Adressbuch eingetragen sind. Die Angaben werden dazu in einwegverschlüsselter (gehashter) Form auf unserem Server gespeichert. Sie können diesen Schritt auch einfach übespringen, wenn Sie ${app_name} anonym benutzen möchten.</string>
@@ -752,9 +751,9 @@ sicheren Ort gesichert oder ausgedruckt haben.</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. -->
-    <string name="new_wizard_anonymous_confirm">Sie haben weder eine Handynummer noch eine E-Mail-Adresse zur Verknüpfung angegeben, weshalb Sie nicht automatisch zu Kontaktlisten hinzugefügt werden. Möchten Sie ${app_name} wirklich komplett anonym nutzen?</string>
+    <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 angegeben, weshalb Sie nicht automatisch zu Kontaktlisten hinzugefügt werden. Möchten Sie ${app_name} wirklich komplett anonym nutzen?</string>
+    <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>
     <string name="new_wizard_scan_id_backup">Oder scannen Sie den QR-Code Ihres ID-Exports</string>
     <string name="error_saving_file">Einige Dateien konnten nicht gesichert werden</string>
     <string name="wait_one_minute">Bitte warten Sie mindestens 10 Minuten auf die SMS, bevor Sie einen Anruf anfordern.</string>
@@ -810,7 +809,7 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="lock_option_pin">PIN</string>
     <string name="lock_option_screenlock">System-Displaysperre</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="hide_chat_message_explain">Sie können den Zugriff auf bestimmte Chats mittels PIN schützen und die Chats temporär in der Chatliste ausblenden. Um diese Funktion zu nutzen, legen Sie bitte zuerst einen Zugriffsschutz fest.</string>
+    <string name="hide_chat_message_explain">${app_name_short} ermöglicht, den Zugriff auf bestimmte Chats mittels PIN zu schützen und die Chats temporär in der Chatliste auszublenden. Um diese Funktion zu nutzen, legen Sie bitte zuerst einen Zugriffsschutz fest.</string>
     <string name="set_lock">Jetzt aktivieren</string>
     <string name="prefs_title_access_protection">Zugriffsschutz</string>
     <string name="private_chat_subject">Privat</string>
@@ -833,12 +832,12 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="draft">Entwurf</string>
     <string name="prefs_bigger_single_emojis">Einzelne Emojis vergrössern</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="wizard1_sync_work">Synchronisierung läuft…</string>
+    <string name="wizard1_sync_work">${app_name}-Daten werden synchronisiert…</string>
     <string name="notification_hidden_text">Inhalte ausgeblendet</string>
     <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>
-    <string name="threema_channel_intro">Der Threema Channel versorgt Sie mit Neuigkeiten zu Threema. Möchten Sie Threema Channel abonnieren und zu Ihren Kontakten hinzufügen? Es ist kostenlos und Sie können sich jederzeit abmelden.</string>
+    <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>
     <string name="take_photo">Foto aufnehmen</string>
@@ -916,7 +915,7 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="prefs_summary_force_turn_off">Wenn möglich, direkte Verbindung nutzen und nur Anrufe an unverifizierte Kontakte über ${company_name}-Server leiten. Kann Ihre IP-Adresse preisgeben.</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">Alle Anrufe über ${company_name}-Server leiten. Schützt Ihre IP-Adresse, kann aber zu schlechterer Anrufqualität führen.</string>
-    <string name="permission_record_audio_required">Aktivieren Sie die Mikrofon-Berechtigung, um verschlüsselte ${app_name_short}-Anrufe zu tätigen und Sprachnachrichten aufzunehmen.</string>
+    <string name="permission_record_audio_required">Aktivieren Sie die Mikrofon-Berechtigung, um verschlüsselte Anrufe zu tätigen und Sprachnachrichten aufzunehmen.</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}-Anrufe</string>
     <string name="prefs_voice_call_sound">Klingelton</string>
@@ -1009,15 +1008,15 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="disable_autostart_title">Autostart</string>
     <string name="unchanged">unverändert</string>
     <string name="safe_learn_more_button">Mehr erfahren</string>
-    <string name="safe_enable_explain">Bei ${app_name_short} haben Sie kein zentrales Benutzerkonto. Ihre Daten befinden sich nur bei Ihnen auf diesem Gerät und sind so bestmöglich vor Fremdzugriff geschützt.\n\n${app_name_short} Safe erstellt regelmässig ein verschlüsseltes, anonymes Backup Ihrer <b>Schlüssel, Kontakte, Gruppen und Einstellungen</b> (aber keine Nachrichteninhalte) auf einem Server Ihrer Wahl. Ihre ID und das gewählte Passwort genügen, um diese Daten auf einem anderen Gerät wiederherzustellen.</string>
+    <string name="safe_enable_explain">Bei uns haben Sie kein zentrales Benutzerkonto. Ihre Daten befinden sich nur bei Ihnen auf diesem Gerät und sind so bestmöglich vor Fremdzugriff geschützt.\n\n${app_name_short} Safe erstellt regelmässig ein verschlüsseltes, anonymes Backup Ihrer <b>Schlüssel, Kontakte, Gruppen und Einstellungen</b> (aber keine Nachrichteninhalte) auf einem Server Ihrer Wahl. Ihre ID und das gewählte Passwort genügen, um diese Daten auf einem anderen Gerät wiederherzustellen.</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_disable_confirm">Wollen Sie fortfahren, ohne ${app_name_short} Safe zu aktivieren? ${app_name_short} Safe erlaubt, Ihre ${app_name_short}-ID, Kontakte und Gruppen wiederherzustellen, falls Sie Ihr Gerät verlieren.</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_configure_choose_password">Wählen Sie ein sicheres Passwort. Sie benötigen dieses Passwort, um Ihr ${app_name_short} Safe-Backup wiederherzustellen.</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_configure_choose_server">Server auswählen</string>
+    <string name="safe_configure_choose_server">${app_name_short} Safe-Server auswählen</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="safe_configure_server_explain">Speichern Sie Ihr ${app_name_short} Safe-Backup bei ${company_name} oder auf einem beliebigen Server Ihrer Wahl.</string>
+    <string name="safe_configure_server_explain">Sie können den Server von ${company_name} oder einen beliebigen Backup-Server Ihrer Wahl verwenden.</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="onprem_safe_configure_server_explain">Speichern Sie Ihr ${app_name_short} Safe-Backup auf dem Server Ihrer Organisation, oder legen Sie einen anderen Backup-Server fest.</string>
     <string name="safe_use_default_server">Standardserver</string>
@@ -1045,7 +1044,7 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="safe_delete_success">Backup wurde erfolgreich vom Server gelöscht</string>
     <string name="safe_error_preparing">Fehler beim Vorbereiten des ${app_name_short} Safe-Backups</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_configure_choose_password_force">Setzen Sie ein starkes Passwort, um Ihre ID mit ${app_name_short} Safe abzusichern. Vergessen Sie nicht, was Sie hier eingeben!</string>
+    <string name="safe_configure_choose_password_force">Setzen Sie ein starkes Passwort, um Ihre ${app_name_short}-ID mit ${app_name_short} Safe abzusichern. Vergessen Sie nicht, was Sie hier eingeben!</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_deactivate">${app_name_short} Safe deaktivieren</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1126,8 +1125,8 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="hide_chat_enter_message_explain">Dieser Chat ist als privat markiert. Um ihn anzuzeigen, legen Sie bitte zuerst einen Zugriffsschutz fest.</string>
     <string name="unknown">Unbekannt</string>
     <string name="miui_notification_title">Wichtiger Hinweis für MIUI-Nutzer</string>
-    <string name="miui_notification_body">MIUI 10 unterbindet standardmässig Töne, LED und Popups für neu erstellte Benachrichtigungskanäle (ausser für einige Apps, die von Xiaomi als «wichtig» erachtet werden). Sie müssen deshalb diese Parameter in den ${app_name_short}-spezifischen Benachrichtigungseinstellungen Ihres Handys für jeden Kanal aktivieren. Kontaktieren Sie den Hersteller Ihres Handys für weitere Informationen.</string>
-    <string name="miui12_notification_body">MIUI unterbindet standardmässig Töne, LED und Popups (ausser für einige sehr populäre Apps, die von Xiaomi als «wichtig» erachtet werden). Sie müssen deshalb leider diese Optionen in den ${app_name_short}-spezifischen Benachrichtigungseinstellungen Ihres Handys manuell aktivieren und die Prozedur nach jedem App-Update wiederholen. Kontaktieren Sie den Hersteller Ihres Handys für weitere Informationen.</string>
+    <string name="miui_notification_body">MIUI 10 unterbindet standardmässig Töne und LED für neu erstellte Benachrichtigungskanäle (ausser für einige Apps, die von Xiaomi als «wichtig» erachtet werden). Sie müssen deshalb diese Parameter in den App-spezifischen Benachrichtigungseinstellungen Ihres Handys für jeden Kanal aktivieren. Kontaktieren Sie den Hersteller Ihres Handys für weitere Informationen.</string>
+    <string name="miui12_notification_body">MIUI unterbindet standardmässig Töne, LED und Popups (ausser für einige sehr populäre Apps, die von Xiaomi als «wichtig» erachtet werden). Sie müssen diese Optionen deshalb in den App-spezifischen Benachrichtigungseinstellungen Ihres Handys manuell aktivieren und die Prozedur nach jedem App-Update wiederholen. Kontaktieren Sie den Hersteller Ihres Handys für weitere Informationen.</string>
     <string name="dont_show_again">Nicht mehr anzeigen</string>
     <string name="miui_notification_prefs">MIUI-Einstellungen</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1154,7 +1153,7 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="url_warning_body">Die Website, die Sie öffnen möchten ist verdächtig:\n\nAngezeigter Hostname: <b>%s</b>\nTatsächlicher Hostname: <b>%s</b>\n\nEs könnte sich um einen Versuch handeln, Sie auf eine gefälschte Website umzuleiten.\n\nMöchten Sie trotzdem fortfahren?</string>
     <string name="url_warning_title">Phishing-Warnung</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="permission_camera_qr_required">Um QR-Codes zu scannen wird Zugriff auf die Kamera benötigt</string>
+    <string name="permission_camera_qr_required">Um QR-Codes zu scannen, benötigt ${app_name} Zugriff auf die Kamera</string>
     <string name="voice_action_title">Sprachbefehle</string>
     <string name="voice_action_body">Sprachbefehl wird verarbeitet</string>
     <string name="permission_camera_photo_required">Um ein Foto zu machen, bitte Zugriff auf die Kamera erlauben</string>
@@ -1245,7 +1244,7 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="prefs_work_time_end">Arbeitsende</string>
     <string name="prefs_work_time_end_sum">Legen Sie das Arbeitsende fest</string>
     <string name="prefs_working_days_enable_title">Ruhezeit-Regelung</string>
-    <string name="prefs_working_days_enable_sum">Ausserhalb der Arbeitszeit keine Benachrichtigungen anzeigen und ${app_name_short}-Anrufe ablehnen</string>
+    <string name="prefs_working_days_enable_sum">Ausserhalb der Arbeitszeit keine Benachrichtigungen anzeigen und Anrufe ablehnen</string>
     <string name="work_life_dnd_active">Ruhezeit aktiv</string>
     <string name="warning">Warnung</string>
     <string name="password_remember_warning">Merken Sie sich, was Sie hier eingeben! Da %s keine Passwörter auf Servern speichert, können wir Ihnen nicht helfen, wenn Sie die PIN oder die Passphrase vergessen haben.</string>
@@ -1514,7 +1513,7 @@ sicheren Ort gesichert oder ausgedruckt haben.</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="read_phone_state_dialog_message">Um zu verhindern, dass ${app_name_short} Anrufe reguläre Anrufe unterbrechen, wird die Telefon-Berechtigung benötigt. Falls diese Berechtigung nicht gegeben ist, wird ein ${app_name_short} Anruf einen regulären Anruf unterbrechen 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">Um laufende Anrufe zu berücksichtigen, wird die Telefon-Berechtigung benötigt.</string>
+    <string name="read_phone_state_short_message">Um laufende Anrufe zu berücksichtigen, benötigt ${app_name} die Telefon-Berechtigung.</string>
     <string name="prefs_title_read_phone_state">Telefon-Berechtigung erteilen</string>
     <string name="prefs_title_hibernation">Nicht verwendete Apps</string>
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1533,14 +1532,14 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="checking_compatibility">Die Kompatibilität wird überprüft…</string>
     <string name="group_call_mic_permission_rationale">Um Gruppenanrufe tätigen zu können, müssen Sie unter «Berechtigungen» %s den Zugriff aufs Mikrofon erlauben.</string>
     <string name="group_call_mic_permission_description">Um Gruppenanrufe zu benutzen, wird die Mikrofon-Berechtigung benötigt, damit die anderen Sie hören können.</string>
-    <string name="call_mic_permission_description">Um ${app_name_short} Anrufe zu benutzen, wird die Mikrofon-Berechtigung benötigt, damit Sie gehört werden können.</string>
+    <string name="call_mic_permission_description">Für Anrufe wird die Mikrofon-Berechtigung benötigt, damit Sie gehört werden können.</string>
     <string name="group_call_camera_permission_rationale">Damit die anderen Teilnehmer Ihr Bild sehen können, müssen Sie unter «Berechtigungen» %s den Zugriff auf die Kamera erlauben.</string>
     <string name="group_call_phone_permission_description">Um Gruppenanrufe zu benutzen, wird die Telefon-Berechtigung benötigt, damit der Gruppenanruf beendet werden kann, wenn Sie einen anderen Anruf annehmen.</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">Um ${app_name_short} Anrufe zu benutzen, wird die Telefon-Berechtigung benötigt, damit der ${app_name_short} Anruf beendet werden kann, wenn Sie einen anderen Anruf annehmen.</string>
-    <string name="group_call_nearby_devices_permission_description">Um Gruppenanrufe mit Bluetooth-Headset zu benutzen, wird die «Geräte in der Nähe»-Berechtigung benötigt, damit ${app_name} ein Bluetooth-Headset erkennen kann.</string>
+    <string name="group_call_nearby_devices_permission_description">Um Gruppenanrufe mit Bluetooth-Headset zu führen, wird die «Geräte in der Nähe»-Berechtigung benötigt, damit Bluetooth-Headsets erkannt werden können.</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">Um ${app_name_short} Anrufe mit Bluetooth-Headset zu benutzen, wird die «Geräte in der Nähe»-Berechtigung benötigt, damit ${app_name} ein Bluetooth-Headset erkennen kann.</string>
+    <string name="call_nearby_devices_permission_description">Um ${app_name_short}-Anrufe mit Bluetooth-Headset zu führen, wird die «Geräte in der Nähe»-Berechtigung benötigt, damit Bluetooth-Headsets erkannt werden können.</string>
     <string name="settings">Einstellungen</string>
     <string name="leave">Verlassen</string>
     <string name="fs_key_mismatch">schlüsselfehler</string>
@@ -1772,7 +1771,7 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <!-- Instruction text for the user directory search -->
     <string name="work_directory_search">Im Verzeichnis suchen</string>
     <!-- Prompt to the user shown in the work directory search. ${app_name_short} is a placeholder for the app's name, it must be kept as-is, not translated. -->
-    <string name="work_directory_empty_view_text">Bitte geben Sie mindestens 3 Zeichen eines Namens ein, um mit der Suche im Unternehmensverzeichnis zu beginnen oder wählen Sie eine Kategorie, indem Sie auf das Filter-Symbol tippen.</string>
+    <string name="work_directory_empty_view_text">Bitte geben Sie mindestens 3 Zeichen eines Namens ein, um im Unternehmensverzeichnis nach ${app_name_short}-Kontakten zu suchen.</string>
     <!-- Message that is shown when the user wants to share an invalid file. -->
     <string name="invalid_file_cannot_be_shared">Diese Datei ist ungültig und kann nicht geteilt werden</string>
     <!-- Status of a contact (only relevant for Work), e.g. as shown on their profile. Indicating that the person is currently available, i.e., not busy and not out-of-office -->
@@ -1819,10 +1818,8 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="remote_secret_deactivating">${remote_secret} wird deaktiviert</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">${remote_secret} konnte nicht deaktiviert werden. Bitte prüfen Sie Ihre Internetverbindung und versuchen Sie es erneut.</string>
-
     <string name="referral_banner_title">Empfehlen und profitieren</string>
     <string name="referral_banner_body">Laden Sie Ihre Freunde ein, Threema Work für ihr Unternehmen zu nutzen, und sichern Sie sich einen Empfehlungsbonus!</string>
-
     <string name="referral_screen_title">Empfehlen und profitieren</string>
     <string name="referral_screen_subtitle">Erhalten Sie bis zu 10% vom ersten Rechnungsbetrag des angeworbenen Unternehmens.</string>
     <string name="referral_how_it_works_title">So funktioniert’s</string>
@@ -1837,8 +1834,7 @@ sicheren Ort gesichert oder ausgedruckt haben.</string>
     <string name="referral_your_reward_body">Für Ihre Empfehlung erhalten Sie 10% des ersten Rechnungsbetrags des angeworbenen Unternehmens (exkl. Steuern/Gebühren). Der Bonus wird 30–60 Tage nach Zahlungseingang an Sie überwiesen.</string>
     <string name="referral_share_invitation_link">Einladungslink teilen</string>
     <string name="referral_view_terms_and_conditions">AGB ansehen</string>
-    <string name="referral_invitation_message_content">Hey! Teste Threema Work kostenlos mit diesem Einladungslink:  %1$s</string>
-
+    <string name="referral_invitation_message_content">Hi, ich dachte, das könnte für dich interessant sein: Threema Work ist eine hervorragende Lösung für die sichere Unternehmenskommunikation. Hier ist dein Testlink: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d Kontakt</item>
         <item quantity="other">%d Kontakte</item>

+ 37 - 21
app/src/main/res/values-es/strings.xml

@@ -104,7 +104,7 @@
     <!-- Text shown when a task which shows a loading spinner takes longer than expected (e.g. creating a group) -->
     <string name="please_wait_timeout">Esto está tardando más de lo esperado</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="wizard_first_create_id">Se están generando las claves…</string>
+    <string name="wizard_first_create_id">Creando tu ID de ${app_name_short}…</string>
     <string name="wizard1_sync_contacts">Se están sincronizando los contactos…</string>
     <string name="wizard2_email_hint">Su dirección de correo electrónico</string>
     <string name="wizard2_email_linking">Vincular correo electrónico</string>
@@ -166,7 +166,7 @@
     <string name="delete_id_message">A menos que haya creado una copia de seguridad o exportado y guardado una copia de este ID, no podrá volver a enviar ni recibir
 		mensajes con esta ID.\n\nSi no quiere volver a usar esta ID, le recomendamos que establezca una contraseña de anulación y anule la ID en myid.threema.ch/revoke antes de eliminarla.</string>
     <string name="delete_id_message2">Último aviso: ¿está seguro de que desea eliminar su ID?</string>
-    <string name="delete_id_sum">Eliminar el ID y todos los chats de este dispositivo de forma permanente</string>
+    <string name="delete_id_sum">Eliminar permanentemente tu ID de ${app_name_short} y todos los datos de este dispositivo</string>
     <string name="delete_all_data_prompt">¿Quieres eliminar todos los datos de la ap?</string>
     <string name="backup_password_summary">Tu ID exportada se encriptará con una contraseña. Usa una combinación de letras, números y símbolos. ¡No olvides lo que has elegido!</string>
     <string name="backup_password_again_summary">Vuelva a introducir la misma contraseña.</string>
@@ -187,7 +187,7 @@
     <string name="prefs_title_masterkey_passphrase">Frase para la contraseña</string>
     <string name="setting_masterkey_passphrase">Establecer frase de contraseña para clave maestra</string>
     <string name="masterkey_passphrase_title">Frase de contraseña para clave maestra</string>
-    <string name="masterkey_passphrase_summary">Establezca una frase de contraseña para proteger su clave maestra. Tenga en cuenta que deberá introducir esta frase cada vez ${app_name_short} se reinicie.</string>
+    <string name="masterkey_passphrase_summary">Establece una frase de contraseña para proteger tu clave maestra. Ten en cuenta que deberás introducirla cada vez que la aplicación se reinicie.</string>
     <string name="masterkey_passphrase_again_summary">Vuelva a introducir la misma frase de contraseña.</string>
     <string name="masterkey_passphrase_hint">Frase para la contraseña</string>
     <string name="master_key_locked_want_exit">La clave maestra sigue bloqueada. ¿Desea volver a intentarlo?</string>
@@ -245,11 +245,11 @@
     <string name="masterkey_is_unlocked">La clave maestra está desbloqueada</string>
     <string name="file_too_large">El archivo ocupa más espacio del permitido (%1$d MB)</string>
     <string name="deleting_thread">El chat se está eliminando</string>
-    <string name="enter_serial_body"><![CDATA[Introduzca una clave de licencia válida para activar ${app_name_short}.]]></string>
+    <string name="enter_serial_body"><![CDATA[Introduzca la clave de licencia de su tienda. Puede <a href="https://shop.threema.ch/">comprar</a> una licencia o <a href="https://shop.threema.ch/retrieve_keys">recuperar</a> sus claves si ya adquirió una licencia anteriormente.]]></string>
     <!-- ${app_name_short} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="work_enter_serial_body">Introduzca las credenciales de ${app_name_short} proporcionadas por su empresa.</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="enter_serial_title">Validación de licencia</string>
+    <string name="enter_serial_title">Desbloquear ${app_name}</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="serial_required_want_exit">La clave de licencia no es válida. ¿Desea volver a intentarlo o salir de ${app_name}?</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
@@ -298,15 +298,14 @@
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="pinentry_enter_pin">Introducir PIN ${app_name}</string>
     <string name="pinentry_wrong_pin">PIN incorrecto</string>
-    <string name="prefs_sum_security_pin">Bloquear el acceso a la interfaz de usuario de ${app_name_short}</string>
+    <string name="prefs_sum_security_pin">Bloquear el acceso a la interfaz de usuario</string>
     <string name="prefs_title_pin_switch">Protección de la app</string>
     <string name="prefs_title_pin_code">Cambiar PIN</string>
     <string name="prefs_pin_grace">Tiempo hasta el bloqueo</string>
     <string name="prefs_sum_pin_grace">Seleccionar intervalo de tiempo</string>
     <string name="click_here_to_change_pin">Haga clic aquí para cambiar el PIN</string>
     <string name="set_pin_menu_title">Establecer PIN nuevo</string>
-    <string name="set_pin_summary_intro">Proteja su privacidad dotando a ${app_name_short} de un bloqueo con PIN. El bloqueo se activa de forma automática
- cuando se agota el tiempo de espera especificado (solo cifras).</string>
+    <string name="set_pin_summary_intro">Protege tu privacidad configurando un PIN numérico (solo dígitos). Este PIN puede usarse para bloquear el acceso a la interfaz de la aplicación tras un período de gracia o para proteger chats privados</string>
     <string name="set_pin_again_summary">Vuelva a introducir el PIN.</string>
     <string name="set_pin_hint">PIN</string>
     <string name="title_addgroup">Grupo nuevo</string>
@@ -411,7 +410,7 @@
     <string name="prefs_sum_fullscreen_ime_on">El teclado llena toda la pantalla en orientación horizontal</string>
     <string name="prefs_sum_fullscreen_ime_off">Encima del teclado se ve un fragmento del chat</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="add_acount_from_within_threema">Cree un ID nuevo a partir de la aplicación ${app_name_short}.</string>
+    <string name="add_acount_from_within_threema">Gestiona tu ID de ${app_name_short} desde ${app_name_short}.</string>
     <string name="save_image">Guardar imagen</string>
     <string name="share_image">Compartir imagen</string>
     <string name="view_in_gallery">Ver en galería</string>
@@ -666,14 +665,14 @@ almacenado.</string>
     <string name="off">no</string>
     <string name="new_wizard_select_country">Código de país</string>
     <string name="new_wizard_lets_get_started">Comencemos</string>
-    <string name="new_wizard_setup_threema">Configurar ${app_name_short}</string>
+    <string name="new_wizard_setup_threema">Configurar ahora</string>
     <!-- Label on call-to-action button in setup wizard when app is first opened, to allow the user to start setting up the app. ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="work_new_wizard_setup_threema">Configurar ${app_name}</string>
     <string name="new_wizard_restore_id_backup">Restablecer ID exportada</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="new_wizard_welcome">Bienvenido a ${app_name}</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_move_finger">Desplace el dedo por la pantalla.</string>
+    <string name="new_wizard_move_finger">Mueve el dedo por la pantalla para generar un nuevo ID de ${app_name_short}.</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_this_is_your_id">Su ID de ${app_name_short} es:</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -730,7 +729,7 @@ almacenado.</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. -->
     <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 ha introducido un número de móvil para vincular con su ID de ${app_name_short}. No aparecerá en la lista de contactos de sus amigos. ¿Quiere usar ${app_name} de forma anónima?</string>
+    <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>
     <string name="new_wizard_scan_id_backup">O escanea el código QR de tu ID exportada.</string>
     <string name="error_saving_file">Error al guardar archivo. Compruebe los permisos.</string>
     <string name="wait_one_minute">Espere al menos 10 minutos a que llegue el SMS antes de realizar una llamada.</string>
@@ -892,9 +891,9 @@ almacenado.</string>
     <string name="prefs_summary_force_turn_off">Establecer una conexión directa y, si es posible, transmitir llamadas a contactos no verificados solo a través de los servidores de ${company_name}. Su dirección IP puede quedar al descubierto.</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">Forzar la transmisión de todas las llamadas a través de los servidores de ${company_name}, protegiendo su dirección IP. Puede afectar a la calidad de la llamada.</string>
-    <string name="permission_record_audio_required">Para hacer llamadas encriptadas y enviar mensajes de voz, permita que ${app_name_short} acceda al micrófono.</string>
+    <string name="permission_record_audio_required">Para realizar llamadas cifradas y enviar mensajes de voz, permite el acceso al micrófono.</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">Llamadas de voz</string>
+    <string name="prefs_voice_call_notifications">Llamadas de ${app_name_short}</string>
     <string name="prefs_voice_call_sound">Tono llamada</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_sum_voice_call_sound">Seleccionar tono de llamada para llamadas entrantes ${app_name_short}</string>
@@ -963,7 +962,7 @@ almacenado.</string>
     <string name="webclient_session_stop_all">Cerrar todo</string>
     <string name="passphrase_service_name">Servicio de contraseña</string>
     <string name="passphrase_service_description">Notificación cuando se desbloquea la contraseña</string>
-    <string name="webclient_service_description">Notificación cuando haya una sesión de ${app_name_short} Web activa</string>
+    <string name="webclient_service_description">Notificación cuando una sesión web/escritorio está activa</string>
     <string name="prefs_title_accept_privacy_policy">Aceptar Política de privacidad</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} protege tu privacidad con más rigor que cualquier otra aplicación de mensajería. Averigua más en nuestro %1$s.</string>
@@ -987,7 +986,7 @@ almacenado.</string>
     <string name="safe_learn_more_button">Descubra más</string>
     <string name="safe_enable_explain">Lo que necesitas para el chat se almacena solo en tu dispositivo. No tienes cuenta con nosotros y no podemos ayudarte si pierdes el teléfono o eliminas tus datos por accidente.\n\n${app_name_short} Safe crea copias de seguridad automáticas de todos los datos importantes, incluidas tus claves, tu lista de contactos y tus suscripciones a grupos (no el contenido de los mensajes), de forma anónima en un servidor seguro que elijas.</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_disable_confirm">¿Quieres continuar sin habilitar ${app_name_short} Safe?</string>
+    <string name="safe_disable_confirm">¿Deseas continuar sin habilitar ${app_name_short} Safe? Al usar ${app_name_short} Safe, puedes restaurar tu ID de ${app_name_short}, tus contactos y tus grupos en caso de que pierdas el acceso a tu dispositivo.</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_configure_choose_password">Elige una contraseña. Necesitarás una contraseña para restablecer tu copia de seguridad de ${app_name_short} Safe.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1004,7 +1003,7 @@ almacenado.</string>
     <string name="safe_threema_id">Tu ID de ${app_name_short}</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">Introduce la ID de ${app_name_short} que quieres recuperar</string>
-    <string name="safe_search_id_title">Introduce el número de móvil o la dirección de correo electrónico vinculados a tu cuenta</string>
+    <string name="safe_search_id_title">Introduce el número de teléfono móvil o la dirección de correo electrónico vinculados a tu ID de ${app_name_short}</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">Buscando ID de ${app_name_short}</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1237,7 +1236,7 @@ almacenado.</string>
     <string name="picture_in_picture_disabled_in_setting">El modo imagen en imagen está desactivado para %s. Actívelo en los ajustes del sistema.</string>
     <string name="delete_everything">Borrar todo</string>
     <string name="prefs_title_voip_video_enable">Permitir vídeo</string>
-    <string name="video_calls">Videollamadas de ${app_name_short}</string>
+    <string name="video_calls">Videollamadas</string>
     <string name="prefs_videocall_profile">Calidad de imagen preferida</string>
     <string name="videocall_profile_auto">Equilibrado (recomendado)</string>
     <string name="videocall_profile_low_bandwidth">Consumo de datos bajo</string>
@@ -1532,7 +1531,7 @@ almacenado.</string>
     <string name="forward_security_explanation">Perfect Forward Secrecy (PFS) protege una comunicación grabada del descifrado retroactivo incluso si la clave de cifrado a largo plazo se ve comprometida.\n\nLa opción se puede activar si la app es compatible con PFS por ambas partes.</string>
     <string name="group_call_inactivity_left">Llamada grupal abandonada por inactividad</string>
     <string name="missing_permission_external_storage">No se ha podido copiar el archivo. Prueba lo siguiente:\n1. Abre los ajustes.\n2. Ve a \"Aplicaciones\" y selecciona \"Acceso especial a la app\".\n3. Toca en \"Acceso a todos los archivos\".\n4. Toca en los tres puntos de la parte superior derecha y selecciona \"Mostrar sistema\".\n5. Toca en \"Almacenamiento externo\" y verifica que la opción de \"Permitir acceso para gestionar todos los archivos\" está activada.\n6. Vuelve a intentar restaurar la copia de seguridad.</string>
-    <string name="forward_security_downgraded_status_message">Se ha desactivado Perfect Forward Secrecy en esta conversación porque no es compatible con la versión de la app de su compañero de chat.</string>
+    <string name="forward_security_downgraded_status_message">La confidencialidad perfecta hacia adelante \"Perfect Forward Secrecy\" se ha desactivado en este chat porque la versión de la aplicación de tu interlocutor no la admite o se está usando ${app_name_desktop} 2.0 para escritorio (beta).</string>
     <string name="forward_security_illegal_session_status_message">Se ha restablecido la sesión Perfect Forward Secrecy por invalidez.</string>
     <string name="crop_image_title">Recortar imagen</string>
     <string name="scroll_to_bottom">Desplácese hasta abajo</string>
@@ -1597,7 +1596,7 @@ almacenado.</string>
     <string name="status_orphaned_group">*Este grupo está huérfano*\nEl creador del grupo ha abandonado el grupo y ya no se puede mantener. Uno de los miembros que quedan puede clonar el grupo (a través de los detalles del grupo) para convertirse en el nuevo administrador.</string>
     <string name="group_not_a_member_notice">Ya no forma parte de este grupo y no puede usarlo.</string>
     <string name="group_dissolved_notice">Este grupo se ha disuelto y ya no puede usarse.</string>
-    <string name="md_linked_devices">Dispositivos vinculados</string>
+    <string name="md_linked_devices">${app_name_desktop} 2.0 para escritorio (Beta)</string>
     <string name="md_link_device">Vincular nuevo dispositivo</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 -->
@@ -1639,7 +1638,7 @@ almacenado.</string>
     <string name="problemsolver_explain_app_battery_usgae_optimized">La app no tiene permiso para mantener una conexión permanente con los servidores, necesaria para que funcione ${app_name_short} Push. No se le informará de nuevos mensajes cuando la app esté en segundo plano. Para solucionarlo, pulse \"Uso de la batería de la app\" y seleccione \"Sin restricciones\".</string>
     <string name="problemsolver_to_settings">A la configuración</string>
     <!-- Label on button to dismiss/hide a warning -->
-    <string name="problemsolver_dismiss">Desestimar</string>
+    <string name="problemsolver_dismiss">Descartar</string>
     <string name="prefs_advanced_options">Opciones avanzadas</string>
     <string name="push_service">Servicio Push</string>
     <string name="edit_and_send">Editar y enviar</string>
@@ -1795,6 +1794,23 @@ almacenado.</string>
     <string name="remote_secret_deactivating">Desactivando ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">Error al desactivar ${remote_secret}. Por favor, compruebe su conexión a Internet e inténtelo de nuevo.</string>
+    <string name="referral_banner_title">Recomendar y beneficiarse</string>
+    <string name="referral_banner_body">¡Invita a tus amigos a usar Threema Work en su empresa y gana una bonificación por recomendación!</string>
+    <string name="referral_screen_title">Recomendar y beneficiarse</string>
+    <string name="referral_screen_subtitle">Recibe hasta el 10 % del importe de la primera factura de la empresa contratada.</string>
+    <string name="referral_how_it_works_title">Cómo funciona</string>
+    <string name="referral_how_it_works_referral_title">Recomendación</string>
+    <string name="referral_how_it_works_referral_body">Invita a un amigo o a su empresa a unirse a Threema Work. Es importante que facilites tu ID de Threema durante el registro o al comprar licencias para que tu recomendación pueda tenerse en cuenta.</string>
+    <string name="referral_how_it_works_requirements_title">Requisitos</string>
+    <string name="referral_how_it_works_requirements_body">La empresa recomendada no debe ser ya cliente nuestro y debe solicitar licencias</string>
+    <string name="referral_how_it_works_confirmation_title">Confirmación</string>
+    <string name="referral_how_it_works_confirmation_body">Para garantizar que tu recomendación se asigne y verifique correctamente, nos pondremos en contacto contigo antes de realizar el pago. Te informaremos tan pronto como se complete el proceso de verificación.</string>
+    <string name="referral_your_reward_title">Tu recompensa</string>
+    <string name="referral_your_reward_subtitle">Gana una bonificación por recomendación</string>
+    <string name="referral_your_reward_body">Por tu recomendación, recibirás el 10 % del importe de la primera factura de la empresa contratada (sin incluir impuestos ni tasas). La bonificación se te transferirá entre 30 y 60 días después de recibir el pago.</string>
+    <string name="referral_share_invitation_link">Compartir enlace de invitación</string>
+    <string name="referral_view_terms_and_conditions">Ver términos y condiciones</string>
+    <string name="referral_invitation_message_content">Hola, pensé que esto podría serte útil: Threema Work es una excelente opción para la comunicación empresarial segura. Aquí tienes el enlace de prueba: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d contacto</item>
         <item quantity="other">%d contactos</item>

+ 38 - 21
app/src/main/res/values-fr/strings.xml

@@ -134,7 +134,7 @@
     <string name="mobile_already_linked">Votre ID ${app_name_short} est déjà lié à ce numéro de mobile</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="email_already_linked">Votre ID ${app_name_short} est déjà lié à cette adresse e-mail</string>
-    <string name="whoaaa">Avis ${app_name_short}</string>
+    <string name="whoaaa">Avis</string>
     <string name="really_delete_message_title">Supprimer le message</string>
     <string name="really_delete_thread">Supprimer les messages</string>
     <string name="really_delete_multiple_threads">Supprimer les chats</string>
@@ -165,7 +165,7 @@
     <string name="delete_id_title">Supprimer l\'ID</string>
     <string name="delete_id_message">À moins de disposer d\'une sauvegarde et d\'une copie enregistrée de cet ID, vous ne pourrez plus envoyer ou recevoir de messages avec cet ID.\n\nSi vous ne souhaitez plus utiliser cet ID, nous vous conseillons de définir un mot de passe de révocation et révoquer cet ID sur myid.threema.ch/revoke avant de le supprimer.</string>
     <string name="delete_id_message2">Dernier avertissement : confirmez-vous la suppression de votre ID ?</string>
-    <string name="delete_id_sum">Supprime de manière permanente votre ID et toutes les données de cet appareil</string>
+    <string name="delete_id_sum">Supprimer définitivement votre identifiant ${app_name_short} et toutes les données sur cet appareil</string>
     <string name="delete_all_data_prompt">Supprimer toutes les données de l\'application ?</string>
     <string name="backup_password_summary">L\'exportation de votre ID sera chiffrée par mot de passe. Utilisez une combinaison de lettres, chiffres et symboles. N\'oubliez pas votre saisie !</string>
     <string name="backup_password_again_summary">Saisissez de nouveau le mot de passe.</string>
@@ -186,7 +186,7 @@
     <string name="prefs_title_masterkey_passphrase">Phrase secrète</string>
     <string name="setting_masterkey_passphrase">Définition de la phrase secrète de la clé principale</string>
     <string name="masterkey_passphrase_title">Phrase secrète de la clé principale</string>
-    <string name="masterkey_passphrase_summary">Définissez une phrase secrète pour protéger votre clé principale. Vous devrez la saisir à chaque fois que ${app_name_short} redémarre.</string>
+    <string name="masterkey_passphrase_summary">Définissez une phrase secrète pour protéger votre clé principale. Notez que vous devrez la saisir à chaque redémarrage de l’application.</string>
     <string name="masterkey_passphrase_again_summary">Saisissez de nouveau la phrase secrète.</string>
     <string name="masterkey_passphrase_hint">Phrase secrète</string>
     <string name="master_key_locked_want_exit">La clé principale est toujours verrouillée. Voulez-vous réessayer ?</string>
@@ -207,7 +207,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="no_contacts_sync_on"><![CDATA[Vous n’avez pas encore de contacts. La synchronisation est activée, mais il semble qu’aucun des contacts de votre carnet d’adresses ne soit sur ${app_name_short} (invitez-les !).]]></string>
     <string name="masterkey_title">Saisissez la phrase secrète</string>
-    <string name="masterkey_body">Votre clé principale ${app_name_short} est protégée par une phrase secrète. Pour déverrouiller la clé et accéder à l\'application, saisissez votre phrase secrète ici.</string>
+    <string name="masterkey_body">Votre clé principale est protégée par une phrase secrète. Saisissez votre phrase secrète pour déverrouiller la clé.</string>
     <string name="masterkey_unlocking">Déverrouillage de la clé principale</string>
     <string name="verify_phonecall_text">Demander un appel</string>
     <string name="prepare_call_message">Si vous poursuivez, nous essaierons de vous appeler immédiatement. Votre code de vérification vous sera lu deux fois. Nous n\'effectuerons qu\'une seule tentative, alors assurez-vous d\'être prêt avant de poursuivre.</string>
@@ -244,11 +244,11 @@
     <string name="masterkey_is_unlocked">Clé principale déverrouillée</string>
     <string name="file_too_large">Le fichier dépasse le maximum de %1$d Mo</string>
     <string name="deleting_thread">Suppression du fil en cours</string>
-    <string name="enter_serial_body"><![CDATA[Veuillez saisir votre clé de licence pour déverrouiller ${app_name_short}]]></string>
+    <string name="enter_serial_body"><![CDATA[Veuillez saisir votre clé de licence boutique. Vous pouvez <a href="https://shop.threema.ch/">acheter</a> une licence ou <a href="https://shop.threema.ch/retrieve_keys">récupérer</a> vos clés si vous avez déjà acheté une licence auparavant.]]></string>
     <!-- ${app_name_short} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="work_enter_serial_body">Veuillez saisir les informations d’identification de ${app_name_short} fournies par votre entreprise.</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="enter_serial_title">Veuillez saisir une clé de licence</string>
+    <string name="enter_serial_title">Déverrouiller ${app_name}</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="serial_required_want_exit">La clé de licence est invalide. Voulez-vous réessayer ou quitter ${app_name} ?</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
@@ -297,7 +297,7 @@
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="pinentry_enter_pin">Saisir le code NIP ${app_name}</string>
     <string name="pinentry_wrong_pin">Code NIP incorrect</string>
-    <string name="prefs_sum_security_pin">Verrouiller l\'accès à l\'interface utilisateur de ${app_name_short}</string>
+    <string name="prefs_sum_security_pin">Verrouiller l’accès à l’interface utilisateur</string>
     <string name="prefs_title_pin_switch">Protection de l\'app</string>
     <string name="prefs_title_pin_code">Modifier le code NIP</string>
     <string name="prefs_pin_grace">Délai pour verrouiller</string>
@@ -663,14 +663,14 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="off">désactivé</string>
     <string name="new_wizard_select_country">Indicatif international</string>
     <string name="new_wizard_lets_get_started">Commençons</string>
-    <string name="new_wizard_setup_threema">Configurer ${app_name_short}</string>
+    <string name="new_wizard_setup_threema">Configurer maintenant</string>
     <!-- Label on call-to-action button in setup wizard when app is first opened, to allow the user to start setting up the app. ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="work_new_wizard_setup_threema">Installer ${app_name}</string>
     <string name="new_wizard_restore_id_backup">Restaurer l\'ID exporté</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="new_wizard_welcome">Bienvenue sur ${app_name}</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_move_finger">Déplacez votre doigt sur l\'écran.</string>
+    <string name="new_wizard_move_finger">Faites glisser votre doigt sur l’écran pour générer un nouvel identifiant ${app_name_short}.</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_this_is_your_id">Voici votre ID ${app_name_short}:</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -724,7 +724,7 @@ Veuillez saisir une question pour votre enquête.</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. -->
     <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 saisi de numéro de téléphone portable à associer à votre ID ${app_name_short}. Vous n’apparaîtrez pas dans les listes de contacts de vos amis. Voulez-vous vraiment utiliser ${app_name} de façon anonyme ?</string>
+    <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>
     <string name="new_wizard_scan_id_backup">Ou scannez le code QR de votre exportation d\'ID</string>
     <string name="error_saving_file">Erreur lors de l\'enregistrement du fichier. Vérifiez les permissions.</string>
     <string name="wait_one_minute">Veuillez patienter au moins 10 minutes que le SMS arrive avant de passer un appel.</string>
@@ -792,7 +792,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="grace_thirty_minutes">30 minutes</string>
     <string name="grace_never">Jamais (manuel)</string>
     <string name="never">Jamais</string>
-    <string name="access_protection_private_chats_warning">En supprimant la protection d’accès, toutes vos conversations privées redeviendront visibles.</string>
+    <string name="access_protection_private_chats_warning">En supprimant la protection d’accès, toutes vos discussions privées redeviendront visibles.</string>
     <string name="verification_started">La vérification a commencé</string>
     <string name="cannot_open_file">Impossible d\'ouvrir le fichier</string>
     <string name="prefs_title_image_attach_previews">Sélection rapide de l\'image</string>
@@ -808,7 +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>
-    <string name="threema_channel_intro">La chaîne ${app_name_short} vous donne des actualités sur tout ce qui concerne ${app_name_short}. Voulez-vous ajouter la chaîne ${app_name_short} à vos contacts ?</string>
+    <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>
     <string name="take_photo">Prendre une photo</string>
@@ -886,9 +886,9 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="prefs_summary_force_turn_off">Établir une connexion directe, si possible, et transmettre via les serveurs ${company_name} uniquement les appels vers des contacts non vérifiés. Cela pourrait exposer votre adresse 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">Transmettre tous les appels via les serveurs ${company_name} pour protéger votre adresse IP. Cela peut affecter la qualité de l\'appel.</string>
-    <string name="permission_record_audio_required">Pour passer des appels cryptés et envoyer des messages vocaux, veuillez autoriser ${app_name_short} à accéder à votre microphone.</string>
+    <string name="permission_record_audio_required">Pour passer des appels cryptés et envoyer des messages vocaux, veuillez autoriser l’accès au microphone.</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">Appels vocaux</string>
+    <string name="prefs_voice_call_notifications">Appels vocaux ${app_name_short}</string>
     <string name="prefs_voice_call_sound">Sonnerie</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_sum_voice_call_sound">Choisissez une sonnerie pour les appels ${app_name_short} entrants</string>
@@ -912,7 +912,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="error_attaching_files">L\'ajout de pièces jointes a échoué</string>
     <string name="prefs_fix_powermanager_problems">Désactiver les restrictions de puissance</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="prefs_fix_powermanager_problems_desc">Résolvez les problèmes sur les appareils Huawei liés à la réception de messages lorsque l\'appli est en tâche de fond</string>
+    <string name="prefs_fix_powermanager_problems_desc">Autorisez l’application ${app_name} à fonctionner en arrière-plan afin qu’elle puisse recevoir des messages même lorsqu’elle n’est pas active.</string>
     <string name="disable_powermanager_explain">Pour pouvoir recevoir des messages en tâche de fond, veuillez activer le curseur près de « %s » sur l\'écran suivant.</string>
     <string name="disable_autostart_explain">Veuillez vous assurer que « %s » est présente sur la liste des applications qui peuvent se lancer automatiquement sur l\'écran suivant. Touchez le bouton « retour » lorsque vous avez terminé.</string>
     <string name="notification_priority_default">Faible</string>
@@ -957,7 +957,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="webclient_session_stop_all">Tout fermer</string>
     <string name="passphrase_service_name">Service de phrase secrète</string>
     <string name="passphrase_service_description">Une notification lorsque la phrase secrète est déverrouillée</string>
-    <string name="webclient_service_description">Une notification lorsqu\'une session ${app_name_short} Web est active</string>
+    <string name="webclient_service_description">Une notification lorsque la session Web/bureau est active</string>
     <string name="prefs_title_accept_privacy_policy">Accepter la Politique de confidentialité</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} protège votre vie privée plus rigoureusement que toute autre messagerie. Vous pouvez en savoir plus dans notre %1$s.</string>
@@ -981,7 +981,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="safe_learn_more_button">En savoir plus</string>
     <string name="safe_enable_explain">Tout ce qu\'il vous faut pour discuter n\'est stocké que sur votre appareil. Vous n\'avez pas de compte enregistré chez nous et nous ne pouvons pas vous aider si vous perdez votre téléphone ou si vous supprimez vos données par mégarde.\n\n${app_name_short} Safe crée des sauvegardes automatiques de toutes les données importantes, y compris vos clés, votre liste de contacts et vos abonnements de groupes (mais aucun contenu de messages), et ce de manière anonyme sur un serveur sécurisé de votre choix.</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_disable_confirm">Voulez-vous vraiment continuer sans activer ${app_name_short} Safe ?</string>
+    <string name="safe_disable_confirm">Souhaitez-vous continuer sans activer ${app_name_short} Safe ? Lorsque vous utilisez ${app_name_short} Safe, vous pouvez restaurer votre identifiant ${app_name_short}, vos contacts et vos groupes si vous perdez l’accès à votre appareil.</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_configure_choose_password">Veuillez choisir un mot de passe. Celui-ci sera nécessaire pour restaurer votre sauvegarde ${app_name_short} Safe.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -998,7 +998,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="safe_threema_id">Votre ID ${app_name_short}</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">Veuillez saisir l\'ID ${app_name_short} que vous voudriez récupérer</string>
-    <string name="safe_search_id_title">Veuillez saisir le numéro de mobile ou l\'adresse e-mail lié(e) à votre ID</string>
+    <string name="safe_search_id_title">Veuillez saisir l’adresse e-mail ou le numéro de téléphone mobile associé à votre identifiant ${app_name_short}</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">Recherche de l\'ID ${app_name_short}</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1231,7 +1231,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="picture_in_picture_disabled_in_setting">Le mode image incrustée est désactivé pour %s. Veuillez l\'activer depuis les paramètres système.</string>
     <string name="delete_everything">Tout supprimer</string>
     <string name="prefs_title_voip_video_enable">Autoriser la vidéo</string>
-    <string name="video_calls">Appels vidéo ${app_name_short}</string>
+    <string name="video_calls">Appels vidéo</string>
     <string name="prefs_videocall_profile">Qualité d\'image préférée</string>
     <string name="videocall_profile_auto">Équilibrée (recommandée)</string>
     <string name="videocall_profile_low_bandwidth">Consommation de données faible</string>
@@ -1526,7 +1526,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="forward_security_explanation">La Perfect Forward Secrecy (PFS) protège les communications enregistrées contre tout déchiffrement rétroactif, même si la clé de chiffrement à long terme est découverte.\n\nL\'option peut être activée si l\'application des deux côtés prend en charge la PFS.</string>
     <string name="group_call_inactivity_left">Appel de groupe arrêté pour cause d\'inactivité</string>
     <string name="missing_permission_external_storage">Impossible de copier le fichier. Essayez les étapes suivantes :\n1. Ouvrez l\'application Paramètres.\n2. Sous « Applications », choisissez « Accès spécial aux applications ».\n3. Touchez « Accès tous fichiers ».\n4. Touchez les trois points dans le coin supérieur droit et sélectionnez « Afficher le système ».\n5. Touchez « Stockage externe » et assurez-vous que « Autoriser l\'accès pour gérer tous les fichiers » est activé.\n6. Essayez à nouveau de restaurer la sauvegarde.</string>
-    <string name="forward_security_downgraded_status_message">La confidentialité persistante a été désactivée dans cette conversation, car la version de l\'application de votre partenaire de discussion ne la prend pas en charge.</string>
+    <string name="forward_security_downgraded_status_message">La confidentialité persistante (Perfect Forward Secrecy) a été désactivée dans cette discussion, car la version de l’application de votre interlocuteur ne la prend pas en charge ou parce que ${app_name_desktop} 2.0 pour ordinateur de bureau (version bêta) est utilisé.</string>
     <string name="forward_security_illegal_session_status_message">La session de confidentialité persistante a été réinitialisée pour cause de non-validité.</string>
     <string name="crop_image_title">Rogner l\'image</string>
     <string name="scroll_to_bottom">Défiler vers le bas</string>
@@ -1591,7 +1591,7 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="status_orphaned_group">*Ce groupe est orphelin*\nLe créateur du groupe a quitté le groupe et celui-ci ne peut plus être géré. L\'un des membres restants peut cloner le groupe (depuis les détails du groupe) pour devenir le nouvel administrateur.</string>
     <string name="group_not_a_member_notice">Vous ne faites plus partie de ce groupe et ne pouvez plus l\'utiliser.</string>
     <string name="group_dissolved_notice">Ce groupe a été dissous et ne peut plus être utilisé.</string>
-    <string name="md_linked_devices">Appareils liés</string>
+    <string name="md_linked_devices">${app_name_desktop} 2.0 pour ordinateur de bureau (version bêta)</string>
     <string name="md_link_device">Associer un nouvel appareil</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 -->
@@ -1789,6 +1789,23 @@ Veuillez saisir une question pour votre enquête.</string>
     <string name="remote_secret_deactivating">Désactivation de ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">La désactivation de ${remote_secret} a échoué. Veuillez vérifier votre connexion Internet et réessayer.</string>
+    <string name="referral_banner_title">Recommander et bénéficier</string>
+    <string name="referral_banner_body">Invitez vos amis à utiliser Threema Work dans leur entreprise et gagnez un bonus de parrainage !</string>
+    <string name="referral_screen_title">Recommander et bénéficier</string>
+    <string name="referral_screen_subtitle">Recevez jusqu’à 10 % du montant de la première facture de l’entreprise parrainée.</string>
+    <string name="referral_how_it_works_title">Comment ça marche</string>
+    <string name="referral_how_it_works_referral_title">Parrainage</string>
+    <string name="referral_how_it_works_referral_body">Invitez un ami ou son entreprise à rejoindre Threema Work. Il est important que votre ami indique votre identifiant Threema lors de son inscription ou lors de l’achat de licences pour que votre parrainage soit pris en compte.</string>
+    <string name="referral_how_it_works_requirements_title">Conditions</string>
+    <string name="referral_how_it_works_requirements_body">L’entreprise parrainée ne doit pas déjà être cliente chez nous et doit commander des licences</string>
+    <string name="referral_how_it_works_confirmation_title">Confirmation</string>
+    <string name="referral_how_it_works_confirmation_body">Afin de nous assurer que votre parrainage sera correctement attribué et vérifié, nous vous contacterons avant d’effectuer le paiement. Nous vous informerons dès que le processus de vérification sera terminé.</string>
+    <string name="referral_your_reward_title">Votre récompense</string>
+    <string name="referral_your_reward_subtitle">Gagnez un bonus de parrainage</string>
+    <string name="referral_your_reward_body">En contrepartie de votre parrainage, vous recevrez 10 % du montant de la première facture de l’entreprise parrainée (hors taxes/frais). Le bonus vous sera versé dans les 30 à 60 jours après réception du paiement.</string>
+    <string name="referral_share_invitation_link">Partager le lien d’invitation</string>
+    <string name="referral_view_terms_and_conditions">Consulter les conditions générales</string>
+    <string name="referral_invitation_message_content">Bonjour, je pense que cela pourrait vous être utile : Threema Work est une excellente option pour sécuriser les communications professionnelles. Voici votre lien d’essai :%1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d contact</item>
         <item quantity="other">%d contacts</item>

+ 38 - 21
app/src/main/res/values-gsw/strings.xml

@@ -104,7 +104,7 @@
     <!-- Text shown when a task which shows a loading spinner takes longer than expected (e.g. creating a group) -->
     <string name="please_wait_timeout">Das gaht länger als erwartet</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="wizard_first_create_id">Schlüsselpaar wird erzüügt…</string>
+    <string name="wizard_first_create_id">Ihri ${app_name_short}-ID wird erstellt…</string>
     <string name="wizard1_sync_contacts">Kontäkt werded synchronisiert…</string>
     <string name="wizard2_email_hint">Ihri E-Mail-Adrässe</string>
     <string name="wizard2_email_linking">E-Mail verchnüpfe</string>
@@ -409,7 +409,7 @@
     <string name="prefs_sum_fullscreen_ime_on">D’Tastatur füllt im Querformat de ganz Bildschirm</string>
     <string name="prefs_sum_fullscreen_ime_off">Oberhalb vode Tastatur wird en Uusschnitt vom Chat aazeigt</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="add_acount_from_within_threema">Erstelled Sie e neui ID vo de ${app_name_short}-App us.</string>
+    <string name="add_acount_from_within_threema">Verwalted Sie Ihri ${app_name_short}-ID vo de ${app_name_short}-App us.</string>
     <string name="save_image">Bild speichere</string>
     <string name="share_image">Bild teile</string>
     <string name="view_in_gallery">Ide Galerie aluege</string>
@@ -465,7 +465,7 @@
     <string name="really_delete_media">Wänd Sie die %d Medienachricht(e) würklich lösche?</string>
     <string name="check_updates">Uf Updates prüefe</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
-    <string name="masterkey_lock_explain">${app_name} halted d’Passphrase im RAM-Speicher. Wenn Sie hüüfig nach de Passphrase gfrögt werded, cha das anere Taskkiller- oder Akkuspar-App ligge, wo d’Passphrase usem Speicher entfernt.</string>
+    <string name="masterkey_lock_explain">${app_name} halted d’Passphrase im RAM-Speicher. Wenn Sie hüüfig nach de Passphrase gfrögt werded, deaktiviered Sie Taskkiller- oder Akkuspar-Apps, wo verursache chönnted, dass ${app_name_short} vorzitig beendet wird.</string>
     <string name="identity_already_exists">Die ID isch scho i Ihrere Kontaktliste</string>
     <string name="share_contact">Kontakt teile</string>
     <string name="add_shortcut">Verchnüpfig erstelle</string>
@@ -533,7 +533,7 @@
     <string name="show_as_qrcode">Als QR-Code aazeige</string>
     <string name="qr_code">QR-Code</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="really_leave_id_export">Vergwüssered Sie sich, dass Sie d’Zeichefolg vom ID-Export oder de QR-Code amene sichere Ort gspeicheret oder usdruckt händ.</string>
+    <string name="really_leave_id_export">Vergwüssered Sie sich, dass Sie d’Zeichefolg vom ID-Export oder de QR-Code amene sichere Ort gspeicheret oder usdruckt händ. Ihri ${app_name_short}-ID cha ohni es Backup nüme wiederhergstellt werde.</string>
     <string name="revocation_key_title">ID-Widerruef</string>
     <string name="revocation_key_not_set">Keis Widerruefspasswort gsetzt</string>
     <string name="revocation_key_set_at">Passwort gsetzt am %1$s</string>
@@ -636,11 +636,11 @@
     <string name="prefs_exportlog">Logdatei teile</string>
     <string name="prefs_exportlog_summary">Logdatei für Problemanalyse teile</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="permission_storage_required">Aktiviered Sie d’Speicher-Berächtigung, zum Medie z’sichere oder z’schicke.</string>
+    <string name="permission_storage_required">Aktiviered Sie d’Speicher-Berächtigung für ${app_name}, zum Medie z’sichere oder z’schicke.</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="permission_location_required">Aktiviered Sie d’Standort-Berächtigung, zum Ihri Position z’schicke.</string>
+    <string name="permission_location_required">Aktiviered Sie d’Standort-Berächtigung für ${app_name}, zum en Standort z’schicke.</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="permission_contacts_required">Aktiviered Sie d’Kontakt-Berächtigung, zum en Kontakt z’schicke.</string>
+    <string name="permission_contacts_required">Aktiviered Sie d’Kontakt-Berächtigung für ${app_name}, zum en Kontakt z’schicke.</string>
     <!-- "Thumbs up" should be translated by the name of the emoji 👍 -->
     <string name="message_acknowledged">«Duume ufe» gschickt</string>
     <!-- "Thumbs down" should be translated by the name of the emoji 👎 -->
@@ -695,9 +695,9 @@
     <string name="new_wizard_phone_invalid">D’Handynummere, wo Sie ageh händ, isch ungültig. Bitte korrigiered oder lösched Sie die markierte Agabe, bevor Sie wiitermached.</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_fingerprint">Dur d’Bewegig vom Finger erzüüged Sie Zuefallsdate (sog. Entropie), wo für d’Erstellig vom Schlüsselpaar gnutzt werded. Das Schlüsselpaar wird mit Ihrere neue ${app_name_short}-ID verbunde. Es bestaht useme <b>öffentliche Schlüssel</b>, wo a Ihri Fründe verteilt wird, und eme <b>private Schlüssel</b>, wo uf Ihrem Grät bliibt. Bi Ihrne Fründe wird de öffentlich Schlüssel gnutzt, zum Nachrichte a Sie z’verschlüssle. Nur de Inhaber vom private Schlüssel und niemer sust cha d’Nachrichte wieder entschlüssle.</string>
-    <string name="new_wizard_info_id">Sie händ mit de ${app_name_short}-ID es Schlüsselpaar erzüügt. De öffentlich Schlüssel isch a üse Server gschickt worde. De privat Schlüssel verlaht Ihres Grät nie. Das stellt sicher, dass niemer anders Ihri Nachrichte läse cha.</string>
+    <string name="new_wizard_info_id">Sie händ au es Schlüsselpaar erzüügt. De öffentlich Schlüssel isch sicher a üse Server gschickt worde. De privat Schlüssel verlaht Ihres Grät nie. Das stellt sicher, dass niemer anders Ihri Nachrichte läse cha.</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">Wenn Sie die Option aktiviered, werded E-Mail-Adrässe und Telefonnummere us Ihrem Adrässbuech einwegverschlüsslet (ghasht), bevor sie zum Kontaktabgliich an Server gschickt werded. Mir speichered kei Adrässbuechdate.</string>
+    <string name="new_wizard_info_sync_contacts">Wenn Sie die Option aktiviered, werded E-Mail-Adrässe und Telefonnummere us Ihrem Adrässbuech dur ${app_name_short} einwegverschlüsslet (ghasht), bevor sie zum Kontaktabgliich an Server gschickt werded. Mir speichered kei Adrässbuechdate.</string>
     <string name="new_wizard_info_sync_contacts_dialog">D’Kontakt-Synchronisation hilft Ihne, Ihri Fründe automatisch z’finde. Wenn Sie zuestimmed, werded Handynummere und E-Mail-Adrässe us Ihrem Telefonbuech verschlüsslet a üsere Server gschickt und deet vergliche, zum passendi Kontäkt z’finde. Die Date werded weder gspeicheret no wiitergeh.\n\nWänd Sie d’Kontakt-Synchronisation aktiviere?</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">Wenn Sie Ihri eigeni Telefonnummere und/oder E-Mail-Adrässe agebed, chan ${app_name_short} Ihrne Kontäkt helfe, Sie automatisch z’finde, wenn Sie i ihrem Adrässbuech iitreit sind. D’Agabe werded für das in einwegverschlüssleter (ghashter) Form uf üsem Server gspeicheret. Sie chönd de Schritt au eifach überspringe, wenn Sie ${app_name} anonym wänd nutze.</string>
@@ -717,9 +717,9 @@
     <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. -->
-    <string name="new_wizard_anonymous_confirm">Sie händ weder e Handynummere no e E-Mail-Adrässe zur Verchnüpfig ageh. Sie werded drum nöd automatisch in Kontaktliste ufgfüehrt. Wänd Sie ${app_name} würklich komplett anonym nutze?</string>
+    <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 ageh. Sie werded drum nöd automatisch in Kontaktliste. Wänd Sie ${app_name} würklich komplett anonym nutze?</string>
+    <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>
     <string name="new_wizard_scan_id_backup">Oder scanned Sie de QR-Code vo Ihrem ID-Export</string>
     <string name="error_saving_file">Es paar Dateie händ nöd chöne gsicheret werde</string>
     <string name="wait_one_minute">Bitte warted Sie mindestens 10 Minute uf das SMS, bevor Sie en Aruef aaforderet.</string>
@@ -775,7 +775,7 @@
     <string name="lock_option_pin">PIN</string>
     <string name="lock_option_screenlock">System-Displaysperri</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="hide_chat_message_explain">Sie chönd de Zuegriff uf bestimmti Chats mittels PIN schütze und d’Chats temporär ide Chatliste usblände. Zum die Funktion z’nutze, legged Sie bitte zerscht en Zuegriffsschutz fest.</string>
+    <string name="hide_chat_message_explain">${app_name_short} ermöglicht, de Zuegriff uf bestimmti Chats mittels PIN z’schütze und d’Chats temporär ide Chatliste uszblände. Zum die Funktion z’nutze, legged Sie bitte zerscht ide Iistellige en PIN oder e Gräte-Sperri fest.</string>
     <string name="set_lock">Jetzt aktiviere</string>
     <string name="prefs_title_access_protection">Zuegriffsschutz</string>
     <string name="private_chat_subject">Privat</string>
@@ -798,7 +798,7 @@
     <string name="draft">Entwurf</string>
     <string name="prefs_bigger_single_emojis">Einzelni Emojis vergrössere</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="wizard1_sync_work">Synchronisierig lauft…</string>
+    <string name="wizard1_sync_work">${app_name}-Date werded synchronisiert…</string>
     <string name="notification_hidden_text">Inhält usbländet</string>
     <string name="really_reset_ringtones">Benachrichtigungstön uf Werchsiistellige zruggsetze?</string>
     <string name="reset_ringtones_confirm">Benachrichtigungstön sind zrugggsetzt worde</string>
@@ -881,7 +881,7 @@
     <string name="prefs_summary_force_turn_off">Wenn möglich, direkti Verbindig nutze und nur Arüef a unverifizierti Kontäkt über ${company_name}-Server leite. Cha Ihri IP-Adrässe priisgeh.</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">All Arüef über ${company_name}-Server leite. Schützt Ihri IP-Adrässe, cha aber zu schlächterer Aruefqualität füehre.</string>
-    <string name="permission_record_audio_required">Aktiviered Sie d’Mikrofon-Berächtigung, zum verschlüssleti ${app_name_short}-Arüef z’mache und Sprachnachrichte ufzneh.</string>
+    <string name="permission_record_audio_required">Aktiviered Sie d’Mikrofon-Berächtigung, zum verschlüssleti Arüef z’mache und Sprachnachrichte ufzneh.</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}-Arüef</string>
     <string name="prefs_voice_call_sound">Klingelton</string>
@@ -974,15 +974,15 @@
     <string name="disable_autostart_title">Autostart</string>
     <string name="unchanged">unveränderet</string>
     <string name="safe_learn_more_button">Meh erfahre</string>
-    <string name="safe_enable_explain">Bi ${app_name_short} händ Sie keis zentrals Benutzerkonto. Ihri Date befindet sich nur bi Ihne uf dem Grät und sind so bestmöglich vor Fremdzuegriff gschützt.\n\n${app_name_short} Safe erstellt regelmässig es verschlüsslets, anonyms Backup vo Ihrne <b>Schlüssel, Kontäkt, Gruppe und Iistellige</b> (aber nöd vo Ihrne Nachrichteinhält) ufeme Server Ihrer Wahl. Ihri ID und s’gwählte Passwort langed, zum die Date ufeme andere Grät wiederherzstelle.</string>
+    <string name="safe_enable_explain">Alles, was Sie zum chatte bruched, isch nume uf Ihrem Grät gspeicheret. Es git keis zentrals Benutzerkonto, und falls Sie Ihres Handy verlüred oder us Versehe Ihri Date lösched, chönd mir die Date nüme wiederherstelle.\n\n${app_name_short} Safe erstellt regelmässig es verschlüsslets, anonyms Backup vo wichtige Date wie Schlüssel, Kontäkt und Gruppezueghörigkeite (aber nöd vo Nachrichteinhält) ufeme Server Ihrer Wahl.</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_disable_confirm">Wänd Sie wiitermache, ohni ${app_name_short} Safe z’aktiviere? ${app_name_short} Safe erlaubt, Ihri ${app_name_short}-ID, Kontäkt und Gruppe wiederherzstelle, falls Sie Ihres Grät verlüüred.</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_configure_choose_password">Wähled Sie es sichers Passwort. Sie benötiged das Passwort, zum Ihres ${app_name_short} Safe-Backup wiederherzstelle.</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_configure_choose_server">Server uswähle</string>
+    <string name="safe_configure_choose_server">${app_name_short} Safe-Server uswähle</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="safe_configure_server_explain">Speichered Sie Ihres ${app_name_short} Safe-Backup bi ${company_name} oder ufeme beliebige Server Ihrer Wahl.</string>
+    <string name="safe_configure_server_explain">Sie chönd de Server vo ${company_name} oder en beliebige Backup-Server Ihrer Wahl bruuche.</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="onprem_safe_configure_server_explain">Speichered Sie Ihres ${app_name_short} Safe-Backup ufem Server vo Ihrere Organisation, oder legged Sie en andere Backup-Server fest.</string>
     <string name="safe_use_default_server">Standardserver</string>
@@ -1010,7 +1010,7 @@
     <string name="safe_delete_success">Backup isch erfolgriich vom Server glöscht worde</string>
     <string name="safe_error_preparing">Fehler bim Vorbereite vom ${app_name_short} Safe-Backup</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_configure_choose_password_force">Setzed Sie es starchs Passwort, zum Ihri ID mit ${app_name_short} Safe abzsichere. Vergässed Sie nöd, was Sie da iigebed!</string>
+    <string name="safe_configure_choose_password_force">Setzed Sie es starchs Passwort, zum Ihri ${app_name_short}-ID mit ${app_name_short} Safe abzsichere. Vergässed Sie nöd, was Sie da iigebed!</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_deactivate">${app_name_short} Safe deaktiviere</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1091,8 +1091,8 @@
     <string name="hide_chat_enter_message_explain">De Chat isch als privat markiert. Zum ihn aa z’zeige, legged Sie bitte zerscht en Zuegriffsschutz fest.</string>
     <string name="unknown">Unbekannt</string>
     <string name="miui_notification_title">Wichtige Hiiwis für MIUI-Nutzer</string>
-    <string name="miui_notification_body">MIUI 10 underbindet standardmässig Tön, LED und Popups für neu erstellti Benachrichtigungskanäl (usser für eigeni Apps, wo vo Xiaomi als «wichtig» erachtet werded). Sie müend drum die Parameter ide ${app_name_short}-spezifische Benachrichtigungsiistellige vo Ihrem Handy für jede Kanal aktiviere. Kontaktiered Sie de Hersteller vo Ihrem Handy für wiiteri Informatione.</string>
-    <string name="miui12_notification_body">MIUI underbindet standardmässig Tön, LED und Popups für neu erstellti Benachrichtigungskanäl (usser für sehr populäri Apps, wo vo Xiaomi als «wichtig» erachtet werded). Sie müend drum die Optione ide ${app_name_short}-spezifische Benachrichtigungsiistellige vo Ihrem Handy manuell aktiviere und die Prozedur nach jedem App-Update wiederhole. Kontaktiered Sie de Hersteller vo Ihrem Handy für wiiteri Informatione.</string>
+    <string name="miui_notification_body">MIUI 10 underbindet standardmässig Tön und LED für neu erstellti Benachrichtigungskanäl (usser für es paar Apps, wo vo Xiaomi als «wichtig» erachtet werded). Sie müend drum die Parameter ide App-spezifische Benachrichtigungsiistellige vo Ihrem Handy für jede Kanal aktiviere. Kontaktiered Sie de Hersteller vo Ihrem Handy für wiiteri Informatione.</string>
+    <string name="miui12_notification_body">MIUI underbindet standardmässig Tön, LED und Popups für neu erstellti Benachrichtigungskanäl (usser für sehr populäri Apps, wo vo Xiaomi als «wichtig» erachtet werded). Sie müend drum die Optione ide App-spezifische Benachrichtigungsiistellige vo Ihrem Handy manuell aktiviere und die Prozedur nach jedem App-Update wiederhole. Kontaktiered Sie de Hersteller vo Ihrem Handy für wiiteri Informatione.</string>
     <string name="dont_show_again">Nüme aazeige</string>
     <string name="miui_notification_prefs">MIUI-Iistellige</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1119,7 +1119,7 @@
     <string name="url_warning_body">D’Website, wo Sie wänd ufmache, isch verdächtig: \n\nDe aazeigt Hostname: <b>%s</b> \nDe tatsächlich Hostname:<b>%s</b>\n\nEs chönnt sich um en Versuech handle, Sie uf e gfälschti Website umzleite. \n\nWänd Sie trotzdem wiitermache?</string>
     <string name="url_warning_title">Phishing-Warnig</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="permission_camera_qr_required">Zum QR-Codes z’scanne, wird Zuegriff uf d’Kamera benötigt</string>
+    <string name="permission_camera_qr_required">Zum QR-Codes z’scanne, brucht ${app_name} Zuegriff uf d’Kamera</string>
     <string name="voice_action_title">Sprachbefehl</string>
     <string name="voice_action_body">Sprachbefehl wird verarbeitet</string>
     <string name="permission_camera_photo_required">Zum es Foti z’mache, erlaubed Sie bitte de Zuegriff uf d’Kamera</string>
@@ -1783,6 +1783,23 @@
     <string name="remote_secret_deactivating">${remote_secret} wird deaktiviert</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">${remote_secret} hät nöd chöne deaktiviert werde. Bitte prüefed Sie Ihri Internetverbindig und versueched Sie’s nomal.</string>
+    <string name="referral_banner_title">Empfehle und profitiere</string>
+    <string name="referral_banner_body">Laded Sie Ihri Fründe ii, Threema Work im Gschäft z’bruche, und sichered Sie sich en Empfehligsbonus!</string>
+    <string name="referral_screen_title">Empfehle und profitiere</string>
+    <string name="referral_screen_subtitle">Staubed Sie bis zu 10% vom erste Rechnigsbetrag vode aagworbene Firma ab.</string>
+    <string name="referral_how_it_works_title">So funktioniert’s</string>
+    <string name="referral_how_it_works_referral_title">Empfehlig</string>
+    <string name="referral_how_it_works_referral_body">Laded Sie en Fründ bzw. dem sini Firma zu Threema Work ii. Wichtig isch, dass Ihri Threema-ID bide Registrierig oder bim Chauf vo Lizänze aageh wird, damit Ihri Empfehlig berücksichtigt werde cha.</string>
+    <string name="referral_how_it_works_requirements_title">Voruussetzige</string>
+    <string name="referral_how_it_works_requirements_body">Di aagworbe Firma dörf no kein Chund vo üs sii und mues e choschtepflichtigi Bstellig vo Lizänze ufgeh.</string>
+    <string name="referral_how_it_works_confirmation_title">Bestätigung</string>
+    <string name="referral_how_it_works_confirmation_body">Damit Ihri Empfehlig cha richtig zuegordnet und überprüeft werde, mäldet mir üs vor de Uszahlig bi Ihne. Sobald d’Prüefig abgschlosse isch, tüend mir Sie informiere.</string>
+    <string name="referral_your_reward_title">Ihri Belohnig</string>
+    <string name="referral_your_reward_subtitle">Staubed Sie en Empfehligsbonus ab</string>
+    <string name="referral_your_reward_body">Für Ihri Empfehlig chömed Sie 10% über vom erste Rechnigsbetrag vode aagworbne Firma (exkl. Stüüre/Gebühre). De Bonus wird 30–60 Täg nach Zahligsiigang a Sie überwise.</string>
+    <string name="referral_share_invitation_link">Iiladigslink teile</string>
+    <string name="referral_view_terms_and_conditions">AGB aluege</string>
+    <string name="referral_invitation_message_content">Hoi, das chönnt für dich no interessant sii: Threema Work isch e hervorragendi Lösig für sicheri Gschäftskommunikation. Da isch din Testlink: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d Kontakt</item>
         <item quantity="other">%d Kontäkt</item>

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

@@ -95,7 +95,6 @@
     <string name="please_wait">Kérjük, várjon…</string>
     <!-- Text shown when a task which shows a loading spinner takes longer than expected (e.g. creating a group) -->
     <!-- ${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="wizard_first_create_id">A kulcspár generálása…</string>
     <string name="wizard1_sync_contacts">A névjegyek szinkronizálása…</string>
     <string name="wizard2_email_hint">Az Ön e-mail címe</string>
     <string name="wizard2_email_linking">Összekapcsolás e-mail címmel</string>
@@ -397,7 +396,6 @@
     <string name="prefs_sum_fullscreen_ime_on">A billentyűzet a teljes képernyőt kitölti fekvő módban</string>
     <string name="prefs_sum_fullscreen_ime_off">A billentyűzet felett megjelenik a csevegés egy szakasza</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="add_acount_from_within_threema">Hozzon létre egy új ID-t a ${app_name_short} alkalmazásból.</string>
     <string name="save_image">Kép mentése</string>
     <string name="share_image">Kép megosztása</string>
     <string name="view_in_gallery">Megtekintés a galériában</string>
@@ -446,7 +444,6 @@
     <string name="really_delete_media">Tényleg törölni szeretné ezt a(z) %d médiaüzenetet?</string>
     <string name="check_updates">Frissítések keresése</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
-    <string name="masterkey_lock_explain">A ${app_name} a jelszót a RAM memóriában tartja. Ha gyakran kéri a jelszót, az lehet, hogy egy taskkiller vagy akkumulátorkímélő alkalmazás miatt van, amely eltávolítja a jelszót a memóriából.</string>
     <string name="identity_already_exists">Ez az ID már szerepel a névjegyzékében</string>
     <string name="share_contact">Kapcsolat megosztása</string>
     <string name="add_shortcut">Parancsikon létrehozása</string>
@@ -512,8 +509,6 @@
     <string name="show_as_qrcode">QR-kódként megjeleníteni</string>
     <string name="qr_code">QR-kód</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="really_leave_id_export">Győződjön meg róla, hogy az ID exportálási karakterláncot vagy
-		a QR-kódot elmentette egy biztonságos helyre vagy kinyomtatta.</string>
     <string name="revocation_key_title">ID visszavonása</string>
     <string name="revocation_key_not_set">Nincs visszavonási jelszó beállítva</string>
     <string name="revocation_key_set_at">Jelszó megadva %1$s</string>
@@ -615,11 +610,8 @@
     <!-- ${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_sendlog_summary">Naplófájl elküldése a ${company_name} számára a problémaelemzéshez.</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="permission_storage_required">Aktiválja a mentési engedélyt a média mentéséhez vagy küldéséhez.</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="permission_location_required">Aktiválja a helymeghatározási engedélyt a tartózkodási helye elküldéséhez.</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="permission_contacts_required">Aktiválja a kapcsolatok engedélyt egy névjegy elküldéséhez.</string>
     <!-- "Thumbs up" should be translated by the name of the emoji 👍 -->
     <!-- "Thumbs down" should be translated by the name of the emoji 👎 -->
     <string name="notifications_settings">Értesítési beállítások</string>
@@ -670,18 +662,10 @@
 		kulcspár generálódik. Ez a kulcspár az új ${app_name_short} ID-hez lesz társítva.	Ez egy <b>nyilvános kulcsból</b> áll, amelyet barátaid
 		kapnak meg, és egy <b>titkos kulcsból</b>, amely a készülékeden marad! A barátaid a nyilvános kulcsot használják a neked szóló
 		üzenetek titkosítására. Csak a privát kulcs tulajdonosa és senki más nem tudja újra visszafejteni az üzeneteket.</string>
-    <string name="new_wizard_info_id">A ${app_name_short} ID-val létrehozott egy kulcspárt. A nyilvános kulcsot elküldtük a szerverünkre.
-		A privát kulcs soha nem hagyja el a készülékét. Ez biztosítja, hogy senki más ne tudja elolvasni az üzeneteit.</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">Ha engedélyezi ezt a beállítást, a címjegyzékből származó e-mail címek és telefonszámok
-		egyirányú titkosításra (hash-elve) kerülnek, mielőtt elküldjük őket a kiszolgálónak a kapcsolattartás céljából.
-		Nem tárolunk semmilyen címjegyzékadatot.</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">Ha megadja saját mobilszámát és/vagy e-mail címét, a ${app_name_short} segítségével barátai automatikusan megtalálják Önt, ha szerepel a címjegyzékükben. Az információkat egyirányú titkosítással (hash-elve) tároljuk a szerverünkön. Ha névtelenül szeretné használni a ${app_name}, akkor ezt a lépést egyszerűen kihagyhatja.</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_link_phone_only">Ha megadja a saját mobilszámát, a ${app_name_short} segítségével barátai automatikusan
-		megtalálják önt, ha benne vagy a címjegyzékükben. A számot egyirányú titkosítással (hash-elve) tároljuk a szerverünkön.
-		Ha névtelenül szeretné használni a ${app_name}, akkor ezt a lépést egyszerűen kihagyhatja.</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_nickname">A becenév egyes eszközökön megjelenik az értesítésekben, és további azonosító jelként
 		szolgál a névjegyzékben azon csevegőpartnerek számára, akik nem szerepelnek a névjegyzékben. Javasoljuk, hogy csak keresztnevet
@@ -698,9 +682,7 @@
     <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. -->
-    <string name="new_wizard_anonymous_confirm">Nem adtál meg mobiltelefonszámot vagy e-mail címet összecsatoláshoz. Ezért nem fog automatikusan szerepelni a barátai névjegyzékében. Tényleg teljesen anonim módon szeretné használni a ${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">Ön nem adott meg mobiltelefonszámot összecsatoláshoz. Ezért nem fog automatikusan szerepelni a barátai névjegyzékében. Tényleg teljesen anonim módon szeretné használni a ${app_name}?</string>
     <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>
     <string name="wait_one_minute">Kérjük, várjon legalább 10 percet az SMS-re, mielőtt visszahívást kérne.</string>
@@ -740,7 +722,6 @@
     <string name="lock_option_pin">PIN-kód</string>
     <string name="lock_option_screenlock">Rendszer-zárolás</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="hide_chat_message_explain">Bizonyos csevegésekhez való hozzáférést PIN-kóddal védheti, és átmenetileg elrejtheti a csevegéseket a csevegési listában. A funkció használatához először állítson be egy hozzáférési védelmet.</string>
     <string name="set_lock">Aktiválás</string>
     <string name="prefs_title_access_protection">Hozzáférésvédelem</string>
     <string name="private_chat_subject">Privát</string>
@@ -762,13 +743,11 @@
     <string name="draft">Vázlat</string>
     <string name="prefs_bigger_single_emojis">Önálló emojik nagyítása</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="wizard1_sync_work">Szinkronizálás folyamatban…</string>
     <string name="notification_hidden_text">Tartalom elrejtve</string>
     <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>
-    <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="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>
     <string name="take_photo">Fotózás</string>
@@ -840,9 +819,7 @@
     <string name="prefs_summary_force_turn_off">Ha lehetséges, használjon közvetlen kapcsolatot, és csak nem ellenőrzött névjegyek hívásait irányítsa a ${company_name} szerverein keresztül. Feltárhatja az IP-címét.</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">Minden hívást a ${company_name} szervereken keresztül irányít. Védi az IP-címet, de rosszabb hívásminőséget eredményezhet.</string>
-    <string name="permission_record_audio_required">Engedélyezze a mikrofon használatát titkosított ${app_name_short}-hívások kezdeményezéséhez és hangüzenetek rögzítéséhez.</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">Hanghívások</string>
     <string name="prefs_voice_call_sound">Csengőhang</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_sum_voice_call_sound">Csengőhang kiválasztása ${app_name_short} hanghívásokhoz</string>
@@ -932,15 +909,12 @@
     <string name="disable_autostart_title">Autom. indulás</string>
     <string name="unchanged">változatlan</string>
     <string name="safe_learn_more_button">További információ</string>
-    <string name="safe_enable_explain">A ${app_name_short}-nál nincs központi felhasználói fiókja. Az Ön adatai csak az adott eszközön léteznek, és így a legjobban védettek a külső hozzáféréstől.\n\nA ${app_name_short} Safe rendszeresen készít titkosított, anonim biztonsági másolatot az Ön <b>kulcsairól, névjegyeiről, csoportjairól és beállításairól</b> (de az üzenetek tartalmáról nem) egy Ön által választott szerveren. Az Ön azonosítója és a kiválasztott jelszó elegendő ahhoz, hogy visszaállítsa ezeket az adatokat egy másik eszközön.</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_disable_confirm">A ${app_name_short} Safe aktiválása nélkül szeretne folytatni? A ${app_name_short} Safe lehetővé teszi a ${app_name_short} ID, a névjegyek és a csoportok visszaállítását, ha elveszíti a készülékét.</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_configure_choose_password">Válasszon egy biztonságos jelszót. Erre a jelszóra szüksége lesz a ${app_name_short} Safe biztonsági mentés visszaállításához.</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_configure_choose_server">Kiszolgáló kiválasztása</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="safe_configure_server_explain">${app_name_short} Safe biztonsági másolatának tárolása a ${company_name}-nál vagy az Ön által választott szerveren.</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_use_default_server">Alapkiszolgáló</string>
     <string name="safe_test_server">Kiszolgáló tesztelése</string>
@@ -967,7 +941,6 @@
     <string name="safe_delete_success">A biztonsági másolat sikeresen törlődött a kiszolgálóról</string>
     <string name="safe_error_preparing">Hiba a ${app_name_short} Safe biztonsági mentés elkészítése közben</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_configure_choose_password_force">Állítson be egy erős jelszót, hogy a ${app_name_short} Safe segítségével megvédje ID-jét. Ne felejtse el, hogy mit ír be ide!</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_deactivate">${app_name_short} Safe kikapcsolása</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1044,8 +1017,6 @@
     <string name="hide_chat_enter_message_explain">Ez a csevegés privátnak van jelölve. A megtekintéshez először állítson be egy hozzáférés védelmet.</string>
     <string name="unknown">Ismeretlen</string>
     <string name="miui_notification_title">Fontos megjegyzés a MIUI felhasználók számára</string>
-    <string name="miui_notification_body">A MIUI 10 alapértelmezetten letiltja a hangokat, a LED-et és a felugró ablakokat az újonnan létrehozott értesítési csatornákhoz (kivéve néhány, a Xiaomi által «fontosnak» tartott alkalmazás esetében). Ezért ezeket a paramétereket a telefon ${app_name_short}-specifikus értesítési beállításaiban kell engedélyeznie az egyes csatornákhoz. További információért forduljon a telefon gyártójához.</string>
-    <string name="miui12_notification_body">A MIUI alapértelmezetten kikapcsolja a hangokat, a LED-et és a felugró ablakokat (kivéve néhány nagyon népszerű alkalmazást, amelyeket a Xiaomi «fontosnak» tart). Ezért sajnos manuálisan kell aktiválnia ezeket a beállításokat a telefon ${app_name_short}-specifikus értesítési beállításaiban, és minden alkalmazásfrissítés után meg kell ismételnie az eljárást. További információért forduljon a telefon gyártójához.</string>
     <string name="dont_show_again">Ne mutassa újra</string>
     <string name="miui_notification_prefs">MIUI beállítások</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1070,7 +1041,6 @@
     <string name="url_warning_body">A megnyitni kívánt weboldal gyanús:\n\nMegjelenített hostnév: <b>%s</b>\nValódi hostnév: <b>%s</b>\n\nLehet, hogy egy hamis weboldalra próbálják átirányítani Önt.\n\nMégis folytatni akarja?</string>
     <string name="url_warning_title">Adathalászat figyelmeztetés</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="permission_camera_qr_required">A QR-kódok beolvasásához kamerához való hozzáférés szükséges</string>
     <string name="voice_action_title">Hangparancsok</string>
     <string name="voice_action_body">A hangparancs feldolgozása</string>
     <string name="permission_camera_photo_required">A fénykép készítéséhez kérjük, engedélyezze a kamerához való hozzáférést.</string>
@@ -1153,7 +1123,6 @@
     <string name="prefs_work_time_end">Munka vége</string>
     <string name="prefs_work_time_end_sum">Állítsa be a munka végét</string>
     <string name="prefs_working_days_enable_title">Pihenőidő-politika</string>
-    <string name="prefs_working_days_enable_sum">Ne jelenítsen meg értesítéseket és utasítsa el a ${app_name_short} hívásokat munkaidőn kívül</string>
     <string name="work_life_dnd_active">Pihenőidő aktív</string>
     <string name="warning">Figyelmeztetés</string>
     <string name="password_remember_warning">Ne feledje, mit ír be ide! Mivel a %s nem tárolja a jelszavakat a kiszolgálón, nem tudunk segíteni, ha elfelejtette a PIN-kódot vagy a jelszót.</string>
@@ -1307,7 +1276,6 @@ Ha új eszközre vált, kérjük, távolítsa el vagy deaktiválja a %s-t a rég
     <string name="no_votes_yet">Még nem adtak le szavazatot.</string>
     <string name="permission_contacts_sync_required">A szinkronizáláshoz engedélyezze a névjegyekhez való hozzáférést.</string>
     <string name="not_voted_user_list">Ezek a résztvevők nem szavaztak: %s</string>
-    <string name="invalid_onprem_id">Nincs érvényes ${app_name_short} OnPrem-ID</string>
     <string name="enable_unknown_sources">Telepítés nem lehetséges. Kérjük, engedélyezze a \"Ismeretlen alkalmazások telepítése\" opciót a %s-hoz.</string>
     <!-- ${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. -->

+ 45 - 29
app/src/main/res/values-it/strings.xml

@@ -196,7 +196,7 @@
     <string name="prefs_title_masterkey_passphrase">Passphrase</string>
     <string name="setting_masterkey_passphrase">Inserisci passphrase per chiave principale</string>
     <string name="masterkey_passphrase_title">Passphrase per chiave principale</string>
-    <string name="masterkey_passphrase_summary">Imposta una passphrase per proteggere la chiave principale. Nota: la passphrase va inserita ad ogni riavvio di ${app_name_short}.</string>
+    <string name="masterkey_passphrase_summary">Imposta una passphrase per proteggere la chiave principale. Nota: la passphrase va inserita a ogni riavvio dell\'app.</string>
     <string name="masterkey_passphrase_again_summary">Inserisci nuovamente la passphrase</string>
     <string name="masterkey_passphrase_hint">Passphrase</string>
     <string name="master_key_locked_want_exit">La chiave principale è ancora bloccata. Vuoi riprovare?</string>
@@ -258,11 +258,11 @@
     <string name="masterkey_is_unlocked">La chiave principale è sbloccata</string>
     <string name="file_too_large">Il file video supera il limite di %1$d MB</string>
     <string name="deleting_thread">Cancellazione chat in corso</string>
-    <string name="enter_serial_body"><![CDATA[Inserire una chiave di licenza valida per attivare ${app_name_short}.]]></string>
+    <string name="enter_serial_body"><![CDATA[Inserisci la chiave di licenza del tuo negozio. Puoi <a href="https://shop.threema.ch/">acquistare</a> una licenza o <a href="https://shop.threema.ch/retrieve_keys">recuperare</a> le tue chiavi nel caso in cui tu abbia già acquistato una licenza.]]></string>
     <!-- ${app_name_short} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="work_enter_serial_body">Inserisci le credenziali ${app_name_short} ricevute dalla tua azienda o organizzazione.</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="enter_serial_title">Esame di licenza</string>
+    <string name="enter_serial_title">Sblocca ${app_name}</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="serial_required_want_exit">La chiave di licenza non è valida. Vuoi riprovare o desideri uscire da ${app_name}?</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
@@ -312,15 +312,14 @@
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="pinentry_enter_pin">Inserisci codice PIN ${app_name}</string>
     <string name="pinentry_wrong_pin">Codice PIN errato</string>
-    <string name="prefs_sum_security_pin">Bloccare l\'accesso all\'interfaccia utente di ${app_name_short}</string>
+    <string name="prefs_sum_security_pin">Blocca l\'accesso all\'interfaccia utente</string>
     <string name="prefs_title_pin_switch">Protezione dell\'App</string>
     <string name="prefs_title_pin_code">Modifica codice PIN</string>
     <string name="prefs_pin_grace">Intervallo prima del blocco</string>
     <string name="prefs_sum_pin_grace">Seleziona l\'intervallo</string>
     <string name="click_here_to_change_pin">Cliccare qui per modificare il codice PIN</string>
     <string name="set_pin_menu_title">Creare nuovo codice PIN</string>
-    <string name="set_pin_summary_intro">Proteggi la tua privacy attivando un blocco PIN per ${app_name_short}. Questo si attiva
-automaticamente in caso di inattività dopo un intervallo predefinito (solo caratteri).</string>
+    <string name="set_pin_summary_intro">Proteggi la tua privacy configurando un PIN numerico (solo cifre). Puoi ricorrere a questo PIN per bloccare l\'accesso all\'interfaccia utente dell\'app dopo un periodo di tolleranza o per proteggere le chat private</string>
     <string name="set_pin_again_summary">Inserisci nuovamente il codice PIN</string>
     <string name="set_pin_hint">Codice PIN</string>
     <string name="title_addgroup">Nuovo gruppo</string>
@@ -427,7 +426,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="prefs_sum_fullscreen_ime_on">La tastiera in orizzontale occupa tutto lo schermo</string>
     <string name="prefs_sum_fullscreen_ime_off">Sopra alla tastiera viene visualizzato un estratto della chat</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="add_acount_from_within_threema">Creare un nuovo ID dall\'app ${app_name_short}.</string>
+    <string name="add_acount_from_within_threema">Gestisci il tuo ID ${app_name_short} da ${app_name_short}.</string>
     <string name="save_image">Salva immagine</string>
     <string name="share_image">Condividi immagine</string>
     <string name="view_in_gallery">Visualizza nella galleria</string>
@@ -555,7 +554,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="show_as_qrcode">Mostra come codice QR</string>
     <string name="qr_code">Codice QR</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="really_leave_id_export">Verifica che la tua stringa ID o il tuo codice QR siano memorizzati in un luogo sicuro. Non è possibile ripristinare l\'ID senza un backup. Vuoi continuare lo stesso?</string>
+    <string name="really_leave_id_export">Se non l\'hai ancora fatto, salva la stringa di testo esportata del tuo ID o il codice QR corrispondente in un luogo sicuro oppure stampalo. Non è possibile ripristinare il tuo ID ${app_name_short} senza un backup.</string>
     <string name="revocation_key_title">Revoca ID</string>
     <string name="revocation_key_not_set">Non è stata impostata alcuna password di revoca</string>
     <string name="revocation_key_set_at">Password impostata il %1$s</string>
@@ -680,14 +679,14 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="off">inattivo</string>
     <string name="new_wizard_select_country">Codice paese</string>
     <string name="new_wizard_lets_get_started">Iniziamo</string>
-    <string name="new_wizard_setup_threema">Imposta ${app_name_short}</string>
+    <string name="new_wizard_setup_threema">Imposta ora</string>
     <!-- Label on call-to-action button in setup wizard when app is first opened, to allow the user to start setting up the app. ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="work_new_wizard_setup_threema">Imposta ${app_name}</string>
     <string name="new_wizard_restore_id_backup">Ripristina ID esportato</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="new_wizard_welcome">Ti diamo il benvenuto su ${app_name}</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_move_finger">Muovi il dito sullo schermo.</string>
+    <string name="new_wizard_move_finger">Muovi il dito sullo schermo per generare un nuovo ID ${app_name_short}.</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_this_is_your_id">Il tuo ${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. -->
@@ -741,7 +740,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <!-- 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. -->
     <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">Non hai inserito un numero di cellulare 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>
+    <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>
     <string name="new_wizard_scan_id_backup">O scansiona il codice QR dell\'ID esportato</string>
     <string name="error_saving_file">Errore nel salvataggio del file. Controlla le autorizzazioni.</string>
     <string name="wait_one_minute">Attendi per almeno 10 minuti l\'arrivo dell\'SMS prima di richiedere una chiamata.</string>
@@ -809,7 +808,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="grace_thirty_minutes">30 minuti</string>
     <string name="grace_never">Mai (manuale)</string>
     <string name="never">Mai</string>
-    <string name="access_protection_private_chats_warning">Rimuovendo la protezione di accesso tutte le tue chat private torneranno a essere visibili.</string>
+    <string name="access_protection_private_chats_warning">Rimuovendo la protezione di accesso, tutte le tue chat private torneranno a essere visibili.</string>
     <string name="verification_started">Verifica avviata</string>
     <string name="cannot_open_file">Impossibile aprire il file</string>
     <string name="prefs_title_image_attach_previews">Selezione rapida immagine</string>
@@ -825,7 +824,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <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>
-    <string name="threema_channel_intro">${app_name_short} Channel ti offre tutte le novità del mondo ${app_name_short}. Vuoi aggiungere ${app_name_short} Channel ai tuoi contatti?</string>
+    <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>
     <string name="take_photo">Scatta foto</string>
@@ -903,9 +902,9 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="prefs_summary_force_turn_off">Stabilisci una connessione diretta, se possibile, e inoltra solo le chiamate ai contatti non verificati tramite i server ${company_name}. Potrebbe rivelare il tuo indirizzo 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">Forza l\'inoltro di tutte le chiamate tramite i server ${company_name}, proteggendo il tuo indirizzo IP. Potrebbe avere ripercussioni sulla qualità.</string>
-    <string name="permission_record_audio_required">Consenti a ${app_name_short} di accedere al microfono per eseguire chiamate criptate e inviare messaggi vocali.</string>
+    <string name="permission_record_audio_required">Consenti l\'accesso al microfono per eseguire chiamate criptate e inviare messaggi vocali.</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">Chiamate vocali</string>
+    <string name="prefs_voice_call_notifications">Chiamate ${app_name_short}</string>
     <string name="prefs_voice_call_sound">Suoneria</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_sum_voice_call_sound">Seleziona suoneria per le chiamate ${app_name_short} in arrivo</string>
@@ -974,7 +973,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="webclient_session_stop_all">Chiudi tutto</string>
     <string name="passphrase_service_name">Servizio passphrase</string>
     <string name="passphrase_service_description">Notifica in caso di sblocco di passphrase</string>
-    <string name="webclient_service_description">Notifica quando è attiva una sessione ${app_name_short} Web</string>
+    <string name="webclient_service_description">Notifica quando la sessione Web/Desktop è attiva</string>
     <string name="prefs_title_accept_privacy_policy">Accetta le Norme sulla Privacy</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} protegge la tua privacy più rigorosamente di qualsiasi altro servizio di messaggistica. Maggiori informazioni nella sezione %1$s.</string>
@@ -998,13 +997,13 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="safe_learn_more_button">Scopri di più</string>
     <string name="safe_enable_explain">Tutto quello che ti serve per la chat viene archiviato solo nel tuo dispositivo. Non possiedi un nostro account e non potremo aiutarti in caso di smarrimento del telefono o cancellazione accidentale dei tuoi dati. \n\n${app_name_short} Safe crea automaticamente i backup di tutti i dati importanti (come le chiavi, la lista contatti e il tuo gruppo di iscrizione) in un server sicuro di tua scelta e in modo anonimo.</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_disable_confirm">Vuoi veramente continuare senza abilitare ${app_name_short} Safe?</string>
+    <string name="safe_disable_confirm">Vuoi continuare senza abilitare ${app_name_short} Safe? Quando usi ${app_name_short} Safe, puoi ripristinare il tuo ID ${app_name_short}, i tuoi contatti e i tuoi gruppi nel caso in cui perdessi l\'accesso al tuo dispositivo.</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_configure_choose_password">Scegli una password. Ti serve per ripristinare il backup ${app_name_short} Safe.</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_configure_choose_server">Scegli un 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. -->
-    <string name="safe_configure_server_explain">Puoi usare un server ${app_name_short} Safe o specificare in alternativa l\'utilizzo di un server di terza parte per il backup.</string>
+    <string name="safe_configure_server_explain">Puoi usare un server di ${company_name} o, in alternativa, specificare l\'utilizzo di un server di terza parte per il backup.</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="onprem_safe_configure_server_explain">Salva il backup sicuro di ${app_name_short} sul server della tua organizzazione oppure specifica un server di backup diverso.</string>
     <string name="safe_use_default_server">Usa il server di default</string>
@@ -1015,7 +1014,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="safe_threema_id">Il tuo ${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">Inserisci il ${app_name_short} ID che vorresti recuperare</string>
-    <string name="safe_search_id_title">Inserisci il numero di cellulare o l\'indirizzo e-mail collegati al tuo ID</string>
+    <string name="safe_search_id_title">Inserisci il numero di cellulare o l\'indirizzo e-mail collegati al tuo ID ${app_name_short}</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">Ricerca ${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. -->
@@ -1376,7 +1375,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <!-- ${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="no_threema_qr_info">Questo non è un codice QR ${app_name_short}, il contenuto decodificato è:</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="qr_scanner_id_hint">Scansiona il codice QR di un altro contatto. Puoi visualizzare il codice QR cliccando sull\'avatar in alto a destra sulla schermata Home.</string>
+    <string name="qr_scanner_id_hint">Scansiona il codice QR di un contatto per verificarne l\'identità. Per visualizzare il codice, chiedi al contatto di toccare l\'immagine del profilo nell\'angolo in alto a sinistra della schermata iniziale di ${app_name_short}.</string>
     <string name="enable_storage_access_for_media">Attiva l\'accesso alla memoria per visualizzare immagini e video sul tuo dispositivo</string>
     <string name="select_storage_access_for_media_is_granted">Hai consentito l\'accesso a un numero selezionato di foto e video.</string>
     <string name="take_me_there">Attiva ora…</string>
@@ -1389,7 +1388,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="permission_contacts_sync_required">Sei pregato di consentire l\'accesso ai contatti per sincronizzarli.</string>
     <string name="not_voted_user_list">Questi partecipanti non hanno votato: %s</string>
     <string name="contact_update">Aggiornamento stato dei contatti</string>
-    <string name="invalid_onprem_id">L\'ID ${app_name_short} OnPrem non è valida</string>
+    <string name="invalid_onprem_id">Questo ID non esiste (più) oppure non è compatibile con il tuo ID.</string>
     <string name="enable_unknown_sources">Non è possibile installare l\'app. Attiva %s alla voce \"Installare app sconosciute\".</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_push">${app_name_short} Push</string>
@@ -1501,7 +1500,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <!-- ${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">Per evitare che le chiamate ${app_name_short} interrompano le chiamate regolari è necessaria l\'autorizzazione chiamata. Se l\'autorizzazione non è impostata le chiamate ${app_name_short} possono interrompere le chiamate regolari e viceversa.</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">Per accettare le chiamate in corso è richiesta l\'autorizzazione chiamata.</string>
+    <string name="read_phone_state_short_message">Per accettare le chiamate in corso, concedi a ${app_name} l\'autorizzazione Telefono.</string>
     <string name="prefs_title_read_phone_state">Concedi autorizzazione chiamata</string>
     <string name="prefs_title_hibernation">App non in uso</string>
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1520,14 +1519,14 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="checking_compatibility">Verifica della compatibilità in corso…</string>
     <string name="group_call_mic_permission_rationale">Per effettuare chiamate di gruppo consenti a %s di accedere al microfono alla voce «Autorizzazioni».</string>
     <string name="group_call_mic_permission_description">Per utilizzare le chiamate di gruppo è necessario l\'accesso al microfono, affinché gli altri possano sentirti.</string>
-    <string name="call_mic_permission_description">Per utilizzare le chiamate ${app_name_short} è necessario l\'accesso al microfono, affinché gli altri possano sentirti.</string>
+    <string name="call_mic_permission_description">Per effettuare chiamate e affinché gli altri possano sentirti, devi consentire l\'accesso al microfono.</string>
     <string name="group_call_camera_permission_rationale">Per permettere agli altri partecipanti di vedere la tua immagine consenti a %s di accedere alla fotocamera alla voce «Autorizzazioni».</string>
     <string name="group_call_phone_permission_description">Per utilizzare le chiamate di gruppo è necessaria l\'autorizzazione chiamata. Ciò ti consente di chiudere una chiamata di gruppo per accettarne un\'altra.</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">Per utilizzare le chiamate ${app_name_short} è necessaria l\'autorizzazione chiamata. Ciò ti consente di chiudere una chiamata ${app_name_short} per accettarne un\'altra.</string>
-    <string name="group_call_nearby_devices_permission_description">Per utilizzare le chiamate di gruppo con headset bluetooth è necessaria l\'autorizzazione «Dispositivi nelle vicinanze», affinché ${app_name_short} possa riconoscere il headset bluetooth.</string>
+    <string name="group_call_nearby_devices_permission_description">Per effettuare chiamate di gruppo con un auricolare Bluetooth, devi concedere l\'autorizzazione \"dispositivi nelle vicinanze\" per rilevare gli auricolari Bluetooth.</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">Per utilizzare le chiamate ${app_name_short} con headset bluetooth è necessaria l\'autorizzazione «Dispositivi nelle vicinanze», affinché ${app_name} possa riconoscere il headset bluetooth.</string>
+    <string name="call_nearby_devices_permission_description">Per effettuare chiamate ${app_name_short} con un auricolare Bluetooth, devi concedere l\'autorizzazione \"dispositivi nelle vicinanze\" per rilevare gli auricolari Bluetooth.</string>
     <string name="settings">Impostazioni</string>
     <string name="leave">Abbandona</string>
     <string name="fs_key_mismatch">Differenza di chiave</string>
@@ -1543,7 +1542,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="forward_security_explanation">La Perfect Forward Secrecy (PFS) protegge le comunicazioni registrate contro qualsiasi decodifica retroattiva, anche se la chiave di codifica a lungo termine è nota.\n\nL\'opzione può essere attivata se l\'app di entrambe le parti supporta la PFS.</string>
     <string name="group_call_inactivity_left">Abbandona chiamata di gruppo per inattività</string>
     <string name="missing_permission_external_storage">Errore durante la copia del file. Prova a seguire questi passi:\n1. Apri sul telefono l\'app «Impostazioni».\n2. Vai su «App».\n3. Tocca su «Accedere a tutti i file».\n4. Tocca sui tre punti in alto e seleziona «Visualizza app di sistema».\n5. Tocca su «Memoria esterna» e verifica che sia attivo «Autorizza accesso per gestire tutti i file».\n6. Riprova a ripristinare il backup dei dati.</string>
-    <string name="forward_security_downgraded_status_message">Questo contatto usa una versione dell\'app che non supporta la Perfect Forward Secrecy. D\'ora in poi i messaggi saranno inviati senza PFS.</string>
+    <string name="forward_security_downgraded_status_message">Perfect Forward Secrecy è stata disabilitata in questa chat perché la versione dell\'app del tuo interlocutore non la supporta oppure è in uso ${app_name_desktop} 2.0 per Desktop (beta).</string>
     <string name="forward_security_illegal_session_status_message">La sessione di Perfect Forward Secrecy è stata ripristinata perché non valida.</string>
     <string name="crop_image_title">Taglia immagine</string>
     <string name="scroll_to_bottom">Scorri in fondo</string>
@@ -1608,7 +1607,7 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="status_orphaned_group">*Il gruppo è senza amministratore*\nIl creatore del gruppo ha lasciato il gruppo, il quale ora non è più amministrabile. Un membro del gruppo può clonare il gruppo (mediante dettagli gruppo) per diventare il nuovo amministratore.</string>
     <string name="group_not_a_member_notice">Non sei più membro di questo gruppo e non puoi più utilizzarlo.</string>
     <string name="group_dissolved_notice">Questo gruppo è stato chiuso e non può più essere utilizzato.</string>
-    <string name="md_linked_devices">Dispositivi collegati</string>
+    <string name="md_linked_devices">${app_name_desktop} 2.0 per Desktop (Beta)</string>
     <string name="md_link_device">Collega un nuovo dispositivo</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 -->
@@ -1793,11 +1792,11 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <!-- Shown as the title of an info dialog when DualLock (a.k.a. "Remote Secret") has been activated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_activated_notification_title">${remote_secret} è stato attivato</string>
     <!-- Shown as the content of an info dialog when DualLock (a.k.a. "Remote Secret") has been activated. The text in [square brackets] must be translated, and the brackets must be kept around the translation. -->
-    <string name="remote_secret_activated_dialog_content">Se perdi il dispositivo, questa funzione consente all\'amministratore di bloccare l\'app, garantendo che le tue chat rimangano crittografate anche se persone non autorizzate riescono a sbloccare il dispositivo.\n[Scopri di più]</string>
+    <string name="remote_secret_activated_dialog_content">Se smarrisci il dispositivo, questa funzionalità consente all\'amministratore di bloccare l\'app, facendo sì che le tue chat rimangano crittografate anche qualora persone non autorizzate riescano a sbloccare il dispositivo.\n[Scopri di più]</string>
     <!-- Shown as the title of an info dialog when DualLock (a.k.a. "Remote Secret") has been deactivated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivated_notification_title">${remote_secret} è stato disattivato</string>
     <!-- Shown as the content of an info dialog when DualLock (a.k.a. "Remote Secret") has been deactivated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. The text in [square brackets] must be translated, and the brackets must be kept around the translation. -->
-    <string name="remote_secret_deactivated_dialog_content">Il tuo amministratore ha disattivato ${remote_secret}. Ulteriori informazioni su ${remote_secret} sono disponibili in questa [Domanda frequente].</string>
+    <string name="remote_secret_deactivated_dialog_content">Il tuo amministratore ha disattivato ${remote_secret}. Ulteriori informazioni su ${remote_secret} sono disponibili in questa [FAQ entry].</string>
     <!-- Shown on loading indicator while the DualLock (a.k.a. "Remote Secret") feature is being activated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_activating">Attivazione di ${remote_secret}</string>
     <!-- Error message shown fullscreen when activating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
@@ -1806,6 +1805,23 @@ automaticamente in caso di inattività dopo un intervallo predefinito (solo cara
     <string name="remote_secret_deactivating">Disattivazione di ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">Disattivazione di ${remote_secret} non riuscita. Controlla la tua connessione Internet e riprova.</string>
+    <string name="referral_banner_title">Consiglia e ricevi vantaggi</string>
+    <string name="referral_banner_body">Invita i tuoi amici a utilizzare Threema Work nella loro azienda e guadagna un bonus di presentazione!</string>
+    <string name="referral_screen_title">Consiglia e ricevi vantaggi</string>
+    <string name="referral_screen_subtitle">Ricevi fino al 10% dell\'importo della prima fattura dell\'azienda reclutata.</string>
+    <string name="referral_how_it_works_title">Come funziona</string>
+    <string name="referral_how_it_works_referral_title">Presentazione</string>
+    <string name="referral_how_it_works_referral_body">Invita un amico o la sua azienda a registrarsi su Threema Work. È importante che tu fornisca il tuo ID Threema durante la registrazione o l\'acquisto delle licenze affinché il soggetto presentato possa essere preso in considerazione.</string>
+    <string name="referral_how_it_works_requirements_title">Requisiti</string>
+    <string name="referral_how_it_works_requirements_body">L\'azienda presentata non deve essere già nostra cliente e deve ordinare le licenze</string>
+    <string name="referral_how_it_works_confirmation_title">Conferma</string>
+    <string name="referral_how_it_works_confirmation_body">Per garantire che il soggetto presentato possa essere correttamente assegnato e verificato, ti contatteremo prima di effettuare il pagamento. Ti informeremo non appena il processo di verifica sarà completato.</string>
+    <string name="referral_your_reward_title">La tua ricompensa</string>
+    <string name="referral_your_reward_subtitle">Guadagna un bonus di presentazione</string>
+    <string name="referral_your_reward_body">Per ogni presentazione riceverai il 10% dell\'importo della prima fattura dell\'azienda reclutata (tasse/commissioni escluse). Il bonus ti verrà accreditato 30–60 giorni dopo la data di pagamento.</string>
+    <string name="referral_share_invitation_link">Condividi il link dell\'invito</string>
+    <string name="referral_view_terms_and_conditions">Consulta i Termini e condizioni</string>
+    <string name="referral_invitation_message_content">Ciao, ho pensato che questo potesse esserti utile: Threema Work è un\'ottima soluzione per comunicazioni aziendali sicure. Ecco il link per il test: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d contatto</item>
         <item quantity="other">%d contatti</item>

+ 2 - 19
app/src/main/res/values-ja/strings.xml

@@ -134,7 +134,6 @@
     <string name="mobile_already_linked">あなたの${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="email_already_linked">あなたの${app_name_short} IDは既にこのEメールアドレスに紐付けされています</string>
-    <string name="whoaaa">${app_name_short}の通知</string>
     <string name="really_delete_message_title">メッセージを削除</string>
     <string name="really_delete_thread">トークを削除</string>
     <string name="really_delete_multiple_threads">トークを削除</string>
@@ -167,7 +166,6 @@
     <string name="delete_id_message">バックアップを取ったり、エクスポートして保存しておかないと、このIDでメッセージを送受信することはできません。
 \n\nこのIDを使用する予定がない場合は、このIDを削除する前に、紐付けしているEメールアドレスや電話番号を解除してください。</string>
     <string name="delete_id_message2">最終警告: 本当にあなたの端末にあるIDを削除しますか?</string>
-    <string name="delete_id_sum">あなたのIDとこの端末上のすべてのデータを永久に削除する</string>
     <string name="delete_all_data_prompt">すべてのアプリデータを消去しますか?</string>
     <string name="backup_password_summary">あなたのIDエクスポートは、パスワードで暗号化されます。アルファベット、数字、記号を組み合わせてください。そして、ここで入力した内容を忘れないようにしてください!</string>
     <string name="backup_password_again_summary">パスワードの確認</string>
@@ -202,15 +200,12 @@
     <string name="audio_placeholder">音声</string>
     <string name="restoring_backup">バックアップを復元中</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="server_message_title">サーバーからのメッセージ</string>
     <string name="error">エラー</string>
     <!-- Empty state text for Contacts tab, shown when there are no contacts and Contact Synchronization is disabled -->
     <string name="no_contacts"><![CDATA[まだ連絡先がありません。同期をオン(「設定」>「プライバシー」)にするか、手動で連絡先を追加してください。]]></string>
     <!-- Empty state text for Contacts tab, shown when there are no contacts and Contact Synchronization is enabled -->
     <!-- ${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="masterkey_title">パスフレーズを入力</string>
-    <string name="masterkey_body">${app_name_short}のマスターキーはパスフレーズで保護されています。
-キーのロックを解除するためのパスフレーズを入力してください。</string>
     <string name="masterkey_unlocking">マスターキーの解除</string>
     <string name="verify_phonecall_text">電話を掛ける</string>
     <string name="prepare_call_message">電話番号を送信したら、すぐにお電話を差し上げます。あなたの認証コードが2回読み上げられます。1度しか試みませんので、準備ができたら続行してください。</string>
@@ -259,6 +254,7 @@ https://shop.threema.ch/retrieve_keys]]></string>
     <!-- Message shown on progress dialog that shows while the credentials that the user entered are being checked for their validity -->
     <string name="update_available">アップデートが可能です</string>
     <!-- Message shown in Update dialog to inform the user that a new version of the app is available -->
+    <string name="update_available_message">新しいバージョンが利用可能です。今ダウンロードしますか?</string>
     <string name="no_update_available">アップデートはありません</string>
     <string name="download">ダウンロード</string>
     <string name="not_now">後で通知する</string>
@@ -297,14 +293,12 @@ https://shop.threema.ch/retrieve_keys]]></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="pinentry_enter_pin">続けるにはあなたの${app_name} PINを入力してください</string>
     <string name="pinentry_wrong_pin">PINが正しくありません</string>
-    <string name="prefs_sum_security_pin">${app_name_short}のUIへのアクセスをロックします</string>
     <string name="prefs_title_pin_switch">アプリのロック</string>
     <string name="prefs_title_pin_code">PIN を設定</string>
     <string name="prefs_pin_grace">ロックするまでの時間</string>
     <string name="prefs_sum_pin_grace">画面ロックが有効になるまでの時間</string>
     <string name="click_here_to_change_pin">PINが設定されました。変更するにはタップしてください。</string>
     <string name="set_pin_menu_title">新しいPINを設定</string>
-    <string name="set_pin_summary_intro">PIN(数字のみ)を設定することで、プライバシーを守ることができます。このPINは、一定時間経過後に${app_name_short}へのアクセスをロックしたり、プライベートなトークを保護するために使用できます。</string>
     <string name="set_pin_again_summary">PINの確認</string>
     <string name="set_pin_hint">PIN</string>
     <string name="title_addgroup">グループを作成</string>
@@ -657,13 +651,12 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="off">オフ</string>
     <string name="new_wizard_select_country">あなたの国を選択</string>
     <string name="new_wizard_lets_get_started">ようこそ!</string>
-    <string name="new_wizard_setup_threema">${app_name_short}を始める</string>
     <!-- Label on call-to-action button in setup wizard when app is first opened, to allow the user to start setting up the app. ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
+    <string name="work_new_wizard_setup_threema">${app_name}をセットアップする</string>
     <string name="new_wizard_restore_id_backup">エクスポート済みの ID を復元</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="new_wizard_welcome">${app_name}にようこそ!</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_move_finger">画面上で指を動かしてみてください</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_this_is_your_id">これがあなたの${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. -->
@@ -698,9 +691,7 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="new_wizard_info_sync_contacts">このオプションを有効にすると、${app_name_short}は電子メールアドレスと電話番号を一方的に暗号化(ハッシュ化)してからサーバーに送信し、一致する連絡先を探します。アドレス帳のデータは一切保存されません。</string>
     <string name="new_wizard_info_sync_contacts_dialog">連絡先の同期を行うと、あなたの友達を自動的に見つけることができます。同意を行うと、あなたの連絡帳から電話番号とメールアドレスが暗号化されたのちに当社のサーバーに送信され、一致する連絡先を探します。データが保存されたり共有されたりすることは絶対にありません。\n\n連絡先の同期を有効にしますか?</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">${app_name}は、あなたの電話番号とメールアドレスを提供することで、あなたの友達が携帯電話のアドレス帳にあなたを登録している場合、自動的にあなたを見つけることができます。これらのデータは、暗号化(ハッシュ化)された状態で、私たちのサーバーに保存されます。完全に匿名で利用したい場合には、このステップを省略することができます。</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_link_phone_only">電話番号を提供することで、友達があなたを自動的に見つけることができます。電話番号は暗号化(ハッシュ化)された状態で、私たちのサーバーに保存されます。完全に匿名で利用したい場合には、このステップを省略することができます。</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_nickname">ユーザー名は、一部の端末のプッシュ通知や、アドレス帳に登録されていないユーザーに対して、あなたを識別するための追加手段として使用されます。
 下の名前のみか仮名での記入をお勧めします。ユーザー名を設定しない場合は、デフォルトで${app_name_short} IDが使用されます。</string>
@@ -933,7 +924,6 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="webclient_session_stop_all">すべて閉じる</string>
     <string name="passphrase_service_name">パスフレーズサービス</string>
     <string name="passphrase_service_description">パスフレーズが解除された時の通知</string>
-    <string name="webclient_service_description">${app_name_short} Webセッションが始まったときに通知</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>
@@ -957,7 +947,6 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="safe_learn_more_button">詳細</string>
     <string name="safe_enable_explain">トークに必要なものは、あなたの端末にのみ保存されます。携帯電話を紛失したり、誤ってデータを削除してしまった場合、私たちはあなたを助けることができません。\n\n${app_name_short} Safeは、あなたが選んだ安全なサーバーに、あなたのキー、連絡先リスト、グループメンバー(ただしメッセージ内容は除く)など、すべての重要なデータの自動バックアップを匿名で作成します。</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_disable_confirm">本当に${app_name_short} Safeを有効にせずに続行しますか?</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_configure_choose_password">強力なパスワードを選んでください。このパスワードは、${app_name_short} Safeのバックアップを復元する際に必要となります。</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -973,7 +962,6 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="safe_threema_id">${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">復元をする${app_name_short} IDを入力してください</string>
-    <string name="safe_search_id_title">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">${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. -->
@@ -990,7 +978,6 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="safe_delete_success">バックアップのサーバーからの削除は成功しました</string>
     <string name="safe_error_preparing">${app_name_short} Safeのバックアップの用意のエラー</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_configure_choose_password_force">あなたの${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_deactivate">${app_name_short} Safeの無効化</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1098,7 +1085,6 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="url_warning_body">開こうとしているリンクのホスト名が不審です。\n\n表示されたホスト名: <b>%s</b>\n本当のホスト名: <b>%s</b>\n\nこれは、あなたを騙して、別のサイトのふりをしたサイトを開かせようとしている可能性があります。\n\nそれでも続行しますか?</string>
     <string name="url_warning_title">警告: フィッシング</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="permission_camera_qr_required">QRコードの読み取りには、カメラへのアクセス権が必要です。</string>
     <string name="voice_action_title">ボイス・アクション</string>
     <string name="voice_action_body">ボイスアクションの処理中</string>
     <string name="permission_camera_photo_required">写真を撮るために、カメラへのアクセスを許可してください</string>
@@ -1483,7 +1469,6 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="call_phone_permission_description">${app_name_short}通話を行うためには、他の通話が${app_name_short}通話を中断した際に検出するために、電話の許可が必要です。</string>
     <string name="group_call_nearby_devices_permission_description">Bluetoothヘッドセットを使用してグループ通話を行うには、「近くのデバイス」の許可をBluetoothヘッドセットの検出に許可する必要があります。</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">Bluetoothヘッドセットを使用して${app_name}通話を行うには、「近くのデバイス」の許可をBluetoothヘッドセットの検出に許可する必要があります。</string>
     <string name="settings">設定</string>
     <string name="leave">退出</string>
     <string name="fs_key_mismatch">キーが一致しません</string>
@@ -1497,7 +1482,6 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="forward_security_explanation">Perfect Forward Secrecy (略してPFS、日本語で前方秘匿性) は、長期鍵の安全性が損なわれたとしても、記録された通信をさかのぼって復号化されることから保護します。\n\nこのオプションは、双方のアプリがPFSに対応している場合に有効にすることができます。</string>
     <string name="group_call_inactivity_left">非アクティブによるグループ通話の退出</string>
     <string name="missing_permission_external_storage">ファイルをコピーできませんでした。下記の手段を試みてください:\n1. 設定アプリを開く\n2.「アプリ」から「特別なアプリへのアクセス」を選択\n3. 「すべてのファイルのアクセス」を選択\n4. 右上の3つの点をタップし「システムを表示」を選択\n5. 「外部ストレージ」と「すべてのファイルの管理へのアクセスを許可」が許可されていることを確認\n6. バックアップの復元をもう一度試す</string>
-    <string name="forward_security_downgraded_status_message">相手のアプリバージョンがサポートされていないため、このトークではPerfect Forward Secrecyが無効になっています。</string>
     <string name="forward_security_illegal_session_status_message">このPerfect Forward Secrecyセッションは無効であるため、リセットされました。</string>
     <string name="crop_image_title">画像を切り抜く</string>
     <string name="scroll_to_bottom">下部にスクロール</string>
@@ -1562,7 +1546,6 @@ https://myid.threema.ch/revoke に入力することで ID を削除すること
     <string name="status_orphaned_group">*このグループは孤立しています*\nグループの作成者がグループを離れたため、これ以上管理することができません。残ったメンバーの中で、新しい管理者になるためにグループの詳細からグループをクローンすることができます。</string>
     <string name="group_not_a_member_notice">あなたはもはやこのグループの一員ではなく、これ以上使用することはできません。</string>
     <string name="group_dissolved_notice">このグループは解散され、もはや使用することはできません。</string>
-    <string name="md_linked_devices">紐づいた端末</string>
     <string name="md_link_device">新しい端末と紐づけ</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 -->

+ 39 - 21
app/src/main/res/values-nl-rNL/strings.xml

@@ -134,7 +134,7 @@
     <string name="mobile_already_linked">Uw ${app_name_short} ID is al gekoppeld aan dit mobiele nummer</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="email_already_linked">Uw ${app_name_short} ID is al gekoppeld aan dit e-mailadres</string>
-    <string name="whoaaa">${app_name_short} melding</string>
+    <string name="whoaaa">Melding</string>
     <string name="really_delete_message_title">Bericht verwijderen</string>
     <string name="really_delete_thread">Chat verwijderen</string>
     <string name="really_delete_multiple_threads">Chats verwijderen</string>
@@ -165,7 +165,7 @@
     <string name="delete_id_title">ID verwijderen</string>
     <string name="delete_id_message">Tenzij u een back-up voor dit ID heeft, kunt u nooit meer met dit ID berichten versturen/ontvangen.\n\nAls u dit ID niet meer wilt gebruiken, is het aanbevolen om een intrekkingswachtwoord in te stellen en het ID via myid.threema.ch in te trekken voordat u het verwijdert.</string>
     <string name="delete_id_message2">Laatste waarschuwing: wilt u uw ID echt verwijderen?</string>
-    <string name="delete_id_sum">Uw ID en alle gegevens op dit apparaat permanent verwijderen</string>
+    <string name="delete_id_sum">Uw ${app_name_short}-ID en alle gegevens op dit apparaat permanent verwijderen</string>
     <string name="delete_all_data_prompt">Alle gegevens van de app verwijderen?</string>
     <string name="backup_password_summary">Uw ID-exportbestand wordt versleuteld met een wachtwoord. Gebruik een combinatie van letters, cijfers en symbolen. Vergeet niet wat u hier invoert!</string>
     <string name="backup_password_again_summary">Wachtwoord opnieuw invoeren</string>
@@ -186,7 +186,7 @@
     <string name="prefs_title_masterkey_passphrase">Wachtwoordzin</string>
     <string name="setting_masterkey_passphrase">Wachtwoordzin hoofdsleutel instellen</string>
     <string name="masterkey_passphrase_title">Wachtwoordzin hoofdsleutel</string>
-    <string name="masterkey_passphrase_summary">Stel een wachtwoordzin in om uw hoofdsleutel te beschermen. Let op: u moet deze zin iedere keer dat u ${app_name_short} opstart, invoeren.</string>
+    <string name="masterkey_passphrase_summary">Stel een wachtwoordzin in om uw hoofdsleutel te beschermen. Let op: u moet deze iedere keer invoeren als de app opnieuw wordt opgestart.</string>
     <string name="masterkey_passphrase_again_summary">Wachtwoordzin opnieuw invoeren</string>
     <string name="masterkey_passphrase_hint">Wachtwoordzin</string>
     <string name="master_key_locked_want_exit">Hoofdsleutel is nog afgesloten. Wilt u het nog een keer proberen?</string>
@@ -207,7 +207,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="no_contacts_sync_on"><![CDATA[U hebt nog geen contacten. Synchronisatie staat aan, maar het lijkt erop dat geen van uw adresboekcontacten op ${app_name_short} staan (nodig ze uit!).]]></string>
     <string name="masterkey_title">Wachtwoordzin invoeren</string>
-    <string name="masterkey_body">Uw ${app_name_short} hoofdsleutel is beschermd met een wachtwoordzin. Voer uw wachtwoordzin in om de sleutel vrij te geven.</string>
+    <string name="masterkey_body">Uw hoofdsleutel is beschermd met een wachtwoordzin. Voer uw wachtwoordzin in om de sleutel vrij te geven.</string>
     <string name="masterkey_unlocking">Hoofdsleutel vrijgeven</string>
     <string name="verify_phonecall_text">Oproep aanvragen</string>
     <string name="prepare_call_message">Als u doorgaat, zullen we onmiddellijk proberen u te bellen. Uw verificatiecode wordt twee keer opgelezen. Let op: we doen maar één poging, dus zorg dat u gereed bent voordat u doorgaat.</string>
@@ -298,14 +298,14 @@
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="pinentry_enter_pin">Voer uw ${app_name} PIN in om door te gaan</string>
     <string name="pinentry_wrong_pin">PIN onjuist</string>
-    <string name="prefs_sum_security_pin">Toegang tot ${app_name_short}\'s UI afsluiten</string>
+    <string name="prefs_sum_security_pin">Toegang tot de UI afsluiten</string>
     <string name="prefs_title_pin_switch">App-bescherming</string>
     <string name="prefs_title_pin_code">PIN instellen</string>
     <string name="prefs_pin_grace">Afsluit-timer</string>
     <string name="prefs_sum_pin_grace">Tijd totdat het schermslot wordt geactiveerd</string>
     <string name="click_here_to_change_pin">PIN ingesteld. Tik hier om te wijzigen</string>
     <string name="set_pin_menu_title">Nieuwe PIN instellen</string>
-    <string name="set_pin_summary_intro">Bescherm uw privacy door een numerieke PIN in te stellen (alleen cijfers). Deze PIN kan worden gebruikt om de toegang tot de ${app_name_short} UI na een bepaalde periode te blokkeren of om privé-chats te beschermen.</string>
+    <string name="set_pin_summary_intro">Bescherm uw privacy door een numerieke pincode in te stellen (alleen cijfers). Deze pincode kan worden gebruikt om de toegang tot de UI van de app na een bepaalde periode te blokkeren of om privé-chats te beschermen</string>
     <string name="set_pin_again_summary">PIN opnieuw invoeren</string>
     <string name="set_pin_hint">PIN</string>
     <string name="title_addgroup">Nieuwe groep</string>
@@ -663,14 +663,14 @@ Voer een vraag in voor uw poll.</string>
     <string name="off">uit</string>
     <string name="new_wizard_select_country">Selecteer uw land</string>
     <string name="new_wizard_lets_get_started">Aan de slag!</string>
-    <string name="new_wizard_setup_threema">${app_name} instellen</string>
+    <string name="new_wizard_setup_threema">Nu instellen</string>
     <!-- Label on call-to-action button in setup wizard when app is first opened, to allow the user to start setting up the app. ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="work_new_wizard_setup_threema">${app_name} instellen</string>
     <string name="new_wizard_restore_id_backup">Geëxporteerd ID herstellen</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="new_wizard_welcome">Welkom by ${app_name}!</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_move_finger">Verplaats uw vinger over het scherm</string>
+    <string name="new_wizard_move_finger">Beweeg uw vinger over het scherm om een nieuwe ${app_name_short}-ID te genereren.</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_this_is_your_id">Dit is uw ${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. -->
@@ -724,7 +724,7 @@ Voer een vraag in voor uw poll.</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. -->
     <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 verschijnt niet in contactlijsten van vrienden. Weet u zeker dat u ${app_name} anoniem wil gebruiken?</string>
+    <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>
     <string name="new_wizard_scan_id_backup">Of scan de QR-code van uw ID exportbestand</string>
     <string name="error_saving_file">Fout bij opslaan bestand. Controleer de rechten.</string>
     <string name="wait_one_minute">Wacht minstens 10 minuten voordat u een oproep aanvraagt.</string>
@@ -792,7 +792,7 @@ Voer een vraag in voor uw poll.</string>
     <string name="grace_thirty_minutes">30 minuten</string>
     <string name="grace_never">Nooit (handmatig)</string>
     <string name="never">Nooit</string>
-    <string name="access_protection_private_chats_warning">Door de toegangsbeveiliging te verwijderen, worden all uw privéchats weer zichtbaar voordat u verdergaat.</string>
+    <string name="access_protection_private_chats_warning">Door de toegangsbeveiliging te verwijderen, worden all uw privéchats weer zichtbaar.</string>
     <string name="verification_started">Verificatie gestart</string>
     <string name="cannot_open_file">Kon bestand niet openen</string>
     <string name="prefs_title_image_attach_previews">Afbeelding snel selecteren</string>
@@ -808,7 +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>
-    <string name="threema_channel_intro">Threema Channel geeft u alle Threema-nieuwtjes. Wilt u zich abonneren op Threema Channel en dit toevoegen aan uw contactpersonen? Het is gratis en u kunt zich op elk moment afmelden.</string>
+    <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>
     <string name="take_photo">Foto nemen</string>
@@ -883,12 +883,12 @@ Voer een vraag in voor uw poll.</string>
     <string name="prefs_title_voip">${app_name_short}-Oproep</string>
     <string name="prefs_title_force_turn">Oproep altijd doorschakelen</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_off">Een directe verbinding maken, indien mogelijk, en oproepen naar niet-geverifieerde contactpersonen alleen doorschakelen via ${app_name_short}-servers. Dit kan uw IP-adres kenbaar maken.</string>
+    <string name="prefs_summary_force_turn_off">Indien mogelijk een directe verbinding maken en oproepen naar niet-geverifieerde contactpersonen alleen doorschakelen via ${company_name}-servers. Dit kan uw IP-adres kenbaar maken.</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">Alle oproepen geforceerd doorschakelen via ${company_name}-servers om uw IP-adres te beschermen. Dit kan de kwaliteit beïnvloeden.</string>
-    <string name="permission_record_audio_required">Geef ${app_name_short} toegang tot de microfoon om versleutelde oproepen te doen en gesproken berichten te verzenden.</string>
+    <string name="permission_record_audio_required">Geef toegang tot de microfoon om versleutelde oproepen te doen en gesproken berichten te verzenden.</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">Stemoproepen</string>
+    <string name="prefs_voice_call_notifications">${app_name_short}-oproepen</string>
     <string name="prefs_voice_call_sound">Ringtoon</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_sum_voice_call_sound">Ringtoon selecteren voor ontvangen ${app_name_short}-oproepen</string>
@@ -912,7 +912,7 @@ Voer een vraag in voor uw poll.</string>
     <string name="error_attaching_files">Fout tijdens toevoegen bijlagen.</string>
     <string name="prefs_fix_powermanager_problems">Huawei-problemen oplossen</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="prefs_fix_powermanager_problems_desc">Problemen oplossen op Huawei-toestellen die berichten ontvangen terwijl app op de achtergrond draait</string>
+    <string name="prefs_fix_powermanager_problems_desc">Sta ${app_name} toe om op de achtergrond te draaien zodat de app zelfs berichten kan ontvangen als deze niet actief is.</string>
     <string name="disable_powermanager_explain">Om berichten op de achtergrond te ontvangen, dient u de schakelaar naast «%s» in het volgende scherm in te schakelen.</string>
     <string name="disable_autostart_explain">Zorg er in het volgende scherm voor dat  «%s» is opgenomen in de lijst van apps die automatisch mogen opstarten. Tap op «back» als u klaar bent.</string>
     <string name="notification_priority_default">Laag</string>
@@ -981,7 +981,8 @@ Voer een vraag in voor uw poll.</string>
     <string name="safe_learn_more_button">Meer informatie</string>
     <string name="safe_enable_explain">Alles wat u nodig hebt om te chatten wordt alleen op uw apparaat opgeslagen. U hebt geen account bij ons en we kunnen u niet helpen als u uw telefoon verliest of per ongeluk uw gegevens verwijdert.\n\n${app_name_short} Safe maakt automatisch back-ups aan van alle belangrijke gegevens zoals uw sleutelcodes, uw lijst contactpersonen en uw groepslidmaatschappen (maar niet de inhoud van de berichten), anoniem op een beveiligde server naar keuze.</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_disable_confirm">Wilt u echt doorgaan zonder ${app_name_short} Safe in te schakelen?</string>
+    <string name="safe_disable_confirm">Wilt u doorgaan zonder ${app_name_short} Safe in te schakelen? 
+Wanneer u ${app_name_short} Safe gebruikt, kunt u uw ${app_name_short}-ID, contactpersonen en groepen herstellen in het geval dat u toegang tot uw apparaat verliest.</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_configure_choose_password">Kies een wachtwoord. U hebt dit wachtwoord nodig om uw back-upbestanden van ${app_name_short} Safe te herstellen.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -998,7 +999,7 @@ Voer een vraag in voor uw poll.</string>
     <string name="safe_threema_id">Uw ${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">Voer het ${app_name_short} ID in dat u wilt herstellen</string>
-    <string name="safe_search_id_title">Voer het mobiele nummer of het e-mailadres in dat aan uw ID is gekoppeld</string>
+    <string name="safe_search_id_title">Voer het mobiele nummer of het e-mailadres in dat aan uw ${app_name_short}-ID is gekoppeld</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">${app_name_short} ID opzoeken</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1510,7 +1511,7 @@ Voer een vraag in voor uw poll.</string>
     <string name="call_phone_permission_description">Er is toestemming voor de telefoon vereist om ${app_name_short}-gesprekken te voeren en te detecteren wanneer het ${app_name_short}-gesprek door een ander gesprek wordt onderbroken.</string>
     <string name="group_call_nearby_devices_permission_description">Om groepsgesprekken met een bluetooth-headset te voeren, moet u toestemming geven voor \'apparaten in de buurt\' om bluetooth-headsets te detecteren.</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">Om ${app_name}-gesprekken met een bluetooth-headset te voeren, moet u toestemming geven voor \'apparaten in de buurt\' om bluetooth-headsets te detecteren.</string>
+    <string name="call_nearby_devices_permission_description">Om ${app_name_short}-gesprekken met een bluetooth-headset te voeren, moet u toestemming geven voor \'apparaten in de buurt\' om bluetooth-headsets te detecteren.</string>
     <string name="settings">Instellingen</string>
     <string name="leave">Verlaten</string>
     <string name="fs_key_mismatch">sleutel mismatch</string>
@@ -1526,7 +1527,7 @@ Voer een vraag in voor uw poll.</string>
     <string name="forward_security_explanation">Perfect Forward Secrecy (PFS) beschermt opgenomen communicatie tegen ontsleuteling met terugwerkende kracht, zelfs wanneer de lange termijn-coderingssleutel gecomprimeerd is.\n\nDe optie kan worden ingeschakeld als de app aan beide zijden PFS ondersteunt.</string>
     <string name="group_call_inactivity_left">Groepsgesprek verlaten vanwege inactiviteit</string>
     <string name="missing_permission_external_storage">Het bestand kon niet worden gekopieerd. Probeer de volgende stappen:\n1. Open de Instellingen-app.\n2. Ga naar \'Apps\' en kies \'Speciale apptoegang\'.\n3. Tik op \'Toegang tot alle bestanden\'.\n4. Tik op de drie stippen rechts bovenaan en kies \'Systeem tonen\'.\n5. Tik op \'Externe opslag\' en zorg dat \'Toegang voor het beheren van alle bestanden toestaan\' verleend is.\n6. Probeer de back-up opnieuw te herstellen.</string>
-    <string name="forward_security_downgraded_status_message">Perfect Forward Secrecy voor dit gesprek is uitgeschakeld omdat je gesprekspartner een versie van de app gebruikt die deze functie niet ondersteunt.</string>
+    <string name="forward_security_downgraded_status_message">Perfect Forward Secrecy is uitgeschakeld voor dit gesprek omdat de appversie van de gesprekspartner deze functie niet ondersteunt of ${app_name_desktop} 2.0 voor desktop (beta) wordt gebruikt.</string>
     <string name="forward_security_illegal_session_status_message">De Perfect Forward Secrecy-sessie is gereset vanwege ongeldigheid.</string>
     <string name="crop_image_title">Snij beeld bij</string>
     <string name="scroll_to_bottom">Naar beneden scrollen</string>
@@ -1591,7 +1592,7 @@ Voer een vraag in voor uw poll.</string>
     <string name="status_orphaned_group">*Deze groep is een orphan*\nDe maker heeft de groep verlaten en de groep wordt niet langer onderhouden. Een van de overgebleven leden kan de groep klonen (via de groepsdetails) en de nieuwe beheerder worden.</string>
     <string name="group_not_a_member_notice">U maakt geen deel meer uit van deze groep en kunt deze niet langer gebruiken.</string>
     <string name="group_dissolved_notice">Deze groep is opgeheven en kan niet langer worden gebruikt.</string>
-    <string name="md_linked_devices">Gekoppelde apparaten</string>
+    <string name="md_linked_devices">${app_name_desktop} 2.0 voor desktop (beta)</string>
     <string name="md_link_device">Koppel een nieuw apparaat</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 -->
@@ -1780,7 +1781,7 @@ Voer een vraag in voor uw poll.</string>
     <!-- Shown as the title of an info dialog when DualLock (a.k.a. "Remote Secret") has been deactivated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivated_notification_title">${remote_secret} is gedeactiveerd</string>
     <!-- Shown as the content of an info dialog when DualLock (a.k.a. "Remote Secret") has been deactivated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. The text in [square brackets] must be translated, and the brackets must be kept around the translation. -->
-    <string name="remote_secret_deactivated_dialog_content">Uw beheerder heeft ${remote_secret} gedeactiveerd. Meer informatie over ${remote_secret} kunt u vinden in dit [FAQ artikel].</string>
+    <string name="remote_secret_deactivated_dialog_content">Uw beheerder heeft ${remote_secret} gedeactiveerd. Meer informatie over ${remote_secret} kunt u vinden in dit [FAQ-artikel].</string>
     <!-- Shown on loading indicator while the DualLock (a.k.a. "Remote Secret") feature is being activated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_activating">${remote_secret} wordt geactiveerd</string>
     <!-- Error message shown fullscreen when activating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
@@ -1789,6 +1790,23 @@ Voer een vraag in voor uw poll.</string>
     <string name="remote_secret_deactivating">${remote_secret} wordt gedeactiveerd</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">Het deactiveren van ${remote_secret} is niet gelukt. Controleer uw internetverbinding en probeer het opnieuw.</string>
+    <string name="referral_banner_title">Beveel ons aan en profiteer</string>
+    <string name="referral_banner_body">Nodig uw vrienden uit om Threema Work in hun bedrijf te gebruiken en verdien een doorverwijzingsbonus!</string>
+    <string name="referral_screen_title">Beveel ons aan en profiteer</string>
+    <string name="referral_screen_subtitle">Ontvang tot 10% van de eerste factuur van het gerekruteerde bedrijf.</string>
+    <string name="referral_how_it_works_title">Hoe het werkt</string>
+    <string name="referral_how_it_works_referral_title">Doorverwijzing</string>
+    <string name="referral_how_it_works_referral_body">Nodig uw vrienden of hun bedrijf uit om zich aan te melden voor Threema Work. Het is belangrijk dat uw Threema ID tijdens de registratie of bij het kopen van licenties wordt vermeld zodat er rekening kan worden gehouden met uw doorverwijzing.</string>
+    <string name="referral_how_it_works_requirements_title">Vereisten</string>
+    <string name="referral_how_it_works_requirements_body">Het doorverwezen bedrijf mag niet al klant van ons zijn en moet licenties bestellen</string>
+    <string name="referral_how_it_works_confirmation_title">Bevestiging</string>
+    <string name="referral_how_it_works_confirmation_body">Om ervoor te zorgen dat uw doorverwijzing op de juiste manier kan worden toegewezen en gecontroleerd, nemen we voor het uitvoeren van de betaling contact met u op. We informeren u zodra het controleproces voltooid is.</string>
+    <string name="referral_your_reward_title">Uw beloning</string>
+    <string name="referral_your_reward_subtitle">Verdien een doorverwijsbonus</string>
+    <string name="referral_your_reward_body">U ontvangt voor uw doorverwijzing 10% van het eerste factuurbedrag van het gerekruteerde bedrijf (exclusief belastingen/kosten). De bonus wordt 30-60 dagen na ontvangst van de betaling naar u overgeschreven.</string>
+    <string name="referral_share_invitation_link">Uitnodigingslink delen</string>
+    <string name="referral_view_terms_and_conditions">Algemene voorwaarden bekijken</string>
+    <string name="referral_invitation_message_content">Hoi, ik dacht dat dit misschien wel handig voor je zou zijn: Threema Work is een uitstekende optie voor veilige zakelijke communicatie. Hier is je link om het te testen: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d contactpersoon</item>
         <item quantity="other">%d contactpersonen</item>

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

@@ -161,7 +161,6 @@ når den første meldingen mottas.</string>
     <string name="delete_id_title">Slett ID</string>
     <string name="delete_id_message">Du vil ikke ha muligheten til å sende eller motta meldinger med denne IDen igjen, med mindre du har tatt en sikkerhetskopi eller eksportert og lagret en kopi av IDen.\n\nOm du ikke har planer om å bruke denne IDen igjen, er det anbefalt å opprette et tilbakekallingspassord og tilbakekalle IDen på myid.threema.ch/revoke før du sletter den.</string>
     <string name="delete_id_message2">Siste advarsel: Vil du virkelig slette din ID på denne enheten?</string>
-    <string name="delete_id_sum">Permanent slett din ID og all data på denne enheten</string>
     <string name="backup_password_summary">Eksporten av din ID blir kryptert med et passord. Bruk en kombinasjon av bokstaver, tall og symboler. Ikke glem hva du skriver her!</string>
     <string name="backup_password_again_summary">Oppgi passord igjen</string>
     <string name="password_hint">Passord</string>
@@ -385,7 +384,6 @@ når den første meldingen mottas.</string>
     <string name="prefs_sum_fullscreen_ime_on">Tastaturet kommer til å dekke over applikasjonen om enheten er i landskapsmodus</string>
     <string name="prefs_sum_fullscreen_ime_off">Vis en forhåndsvisning av samtalen over tastaturet om det er plass</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="add_acount_from_within_threema">Behandle ${app_name_short} IDen din internt i applikasjonen</string>
     <string name="save_image">Lagre bilde</string>
     <string name="share_image">Del bilde</string>
     <string name="view_in_gallery">Vis i galleri</string>
@@ -940,7 +938,6 @@ http://www.7-zip.org eller https://itunes.apple.com/us/app/the-unarchiver/id4254
     <string name="safe_threema_id">Din ${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">Vennligst skriv ${app_name_short} IDen du vil gjenopprette</string>
-    <string name="safe_search_id_title">Vennligst skriv mobilnummeret eller e-postadressen som er koblet til din 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">Sjekker ${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. -->
@@ -1038,7 +1035,6 @@ http://www.7-zip.org eller https://itunes.apple.com/us/app/the-unarchiver/id4254
     <string name="hide_chat_enter_message_explain">Denne samtalen er merket som privat samtale. For å åpne, vennligst opprett tilgangsbeskyttelse først.</string>
     <string name="unknown">Ukjent</string>
     <string name="miui_notification_title">Viktig melding om varsler i MIUI</string>
-    <string name="miui_notification_body">MIUI 10 deaktiverer lyd og lys for alle nylig opprettede varslinger som standard (bortsett fra noen applikasjoner som Xiaomi har merket som \"viktig\"). Du må spesifikt aktivere lyd og lys i innstillingene for varsler, for ${app_name_short}. Kontakt produsenten av mobilen din for mer informasjon.</string>
     <string name="miui12_notification_body">MIUI lyd, lys og svevende varsler for alle apper som standard (bortsett fra noen veldig populære applikasjoner som Xiaomi har merket som \"viktig\"). Du må manuelt aktivere slike varsler i innstillingene for din mobil. Dette må også gjentas etter hver oppdatering av appen. Kontakt Xiaomi for mer informasjon.</string>
     <string name="dont_show_again">Ikke vis igjen</string>
     <string name="miui_notification_prefs">MIUI innstillinger</string>
@@ -1247,7 +1243,6 @@ http://www.7-zip.org eller https://itunes.apple.com/us/app/the-unarchiver/id4254
     <string name="video_size_explain">Store videofiler kan bli komprimert uavhengig av denne innstillingen.</string>
     <string name="status_create_notes">*Du er den eneste medlemmen i denne gruppen*\nBruk denne samtalen som en sikker notatbok for tekst, media eller dokumenter.</string>
     <string name="status_create_notes_off">*Du er ikke lenger alene i denne samtalen*\nNye meldinger vil bli sendt til alle gruppemedlemmer.</string>
-    <string name="note_group_howto">Tips: Om du ikke legger til andre medlemmer i gruppen, så vil meldinger forbli lokale. Det er ideelt for å lagre notater, media og dokumenter på en sikker måte, eller å overføre til en annen enhet (via ${app_name_short} Web).</string>
     <string name="mark_unread">Merk som ulest</string>
     <string name="mark_read_short">Merk som lest</string>
     <string name="unread">Ulest</string>
@@ -1278,7 +1273,6 @@ Om du bytter til en ny enhet, vennligst avinstaller eller deaktiver %s på den g
     <string name="edit_answer">Rediger svar</string>
     <string name="share_media">Del med en annen app…</string>
     <string name="group_image">Gruppebilde</string>
-    <string name="miui_battery_optimization">Vennligst deaktiver batterioptimalisering for %s, slik at den kan gjøre denne operasjonen. Siden Xiaomi ikke tillter apper å åpne denne innstillingen direkte, så må du gjøre det manuelt i innstillingene. Vennligst kontakt Xiaomi brukerstøtte om du trenger assistanse med å deaktivere batterioptimalisering for ${app_name_short}-appen.</string>
     <string name="forward_captions">Inkluder kommentarer</string>
     <string name="importing_files_failed">Ikke mulig å importere sikkerhetskopi. Sørg for at det er nok ledig plass på det interne minnet.</string>
     <string name="label_continue">Fortsett</string>
@@ -1315,7 +1309,6 @@ Om du bytter til en ny enhet, vennligst avinstaller eller deaktiver %s på den g
     <!-- ${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_push_notification_info_text_1">${app_name_short} Push er aktiv i bakgrunnen, for å kunne varsle deg om innkommende meldinger og anrop.</string>
     <string name="threema_push_notification_info_text_2">Apper kan ikke kjøre i bakgrunnen uten å vise en vedvarende varsel. Ved å vise dette varselet så kan vi sørge for at ${app_name_short} Push vil forbli aktiv, selv om du ikke aktivt bruker appen.</string>
-    <string name="threema_push_notification_info_text_3">Om du fortsatt får problemer med forsinket eller manglende varsler, vennligst endre systeminnstillinger for å sørge for at appen kan være aktiv i bakgrunnen uten noen begrensninger og all batterisparing er deaktivert for ${app_name_short}.</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_push_service_description">Vedvarende varsel blir vist når ${app_name_short} er aktiv</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1428,7 +1421,6 @@ Om du bytter til en ny enhet, vennligst avinstaller eller deaktiver %s på den g
     <string name="prefs_summary_hibernation_api">For å unngå at ${app_name} blir pauset av systemet etter en periode med inaktivitet, vennligst slå av innstillingen: \"Sett en app i dvale om den er ubrukt\"</string>
     <string name="unable_to_fetch_configuration">Ute av stand til å hente data fra konfigurasjonsserver. Prøv igjen senere.</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="rogue_device_warning"><![CDATA[Serveren har oppdaget en tilkobling med den samme ${app_name_short} IDen, men fra en annen enhet. Har du nylig brukt ${app_name_short} på en annen enhet? <br><br>Om du har gjort det, så kan du ignorere denne meldingen. <br><br>Om du ikke har brukt din ${app_name_short} ID på en annen enhet eller brukt en eldre versjon av ${app_name_short}, vennligst kontakt brukerstøtte og send en loggfil om det er mulig. Vennligst <a href="https://threema.com/faq/another_connection">følg våre råd</a> for å beskytte din enhet og dine data før du lager en ny ID.]]></string>
     <string name="fetch2_failure">Synkronisering med server mislyktes.</string>
     <string name="no_members_support_group_calls">Det er ingen andre medlemmer i denne gruppen som er i stand til å svare på gruppesamtale</string>
     <string name="group_calls">Gruppesamtaler</string>
@@ -1445,7 +1437,7 @@ Om du bytter til en ny enhet, vennligst avinstaller eller deaktiver %s på den g
     <string name="call_phone_permission_description">For å starte et anrop i ${app_name_short}, må du aktivere tilgang til telefon, for å oppdage om det kommer et annet anrop som kan forstyrre anropet i ${app_name_short}.</string>
     <string name="group_call_nearby_devices_permission_description">For å starte en gruppesamtale med bluetooth hodetelefoner, så må du aktivere \"Enheter i nærheten\"-tillatelsen for å oppdage bluetooth enheter.</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">For å starte et anrop i ${app_name} med bluetooth hodetelefoner, så må du aktivere \"Enheter i nærheten\"-tillatelsen for å oppdage bluetooth enheter.</string>
+    <string name="call_nearby_devices_permission_description">For å starte et anrop i ${app_name_short} med bluetooth hodetelefoner, så må du aktivere \"Enheter i nærheten\"-tillatelsen for å oppdage bluetooth enheter.</string>
     <string name="settings">Innstillinger</string>
     <string name="leave">Forlat</string>
     <string name="fs_key_mismatch">Nøkler er ikke lik</string>
@@ -1461,7 +1453,6 @@ Om du bytter til en ny enhet, vennligst avinstaller eller deaktiver %s på den g
     <string name="forward_security_explanation">Perfect Forward Secrecy (PFS) beskytter kommunikasjonen fra å kunne bli dekryptert i fremtiden, selv om den langsiktige krypteringsnøkkelen er kompromittert.\n\nDette kan skrus på om appen på begge sider av kommunikasjonen støtter PFS.</string>
     <string name="group_call_inactivity_left">Gruppesamtale avsluttet på grunn av inaktivitet</string>
     <string name="missing_permission_external_storage">Ikke mulig å kopiere filen. Prøv følgende: \n1. Åpne innstillinger på enheten.\n2. Gå til \"Apper\" og velg \"Spesiell tilgang\" på menyen med tre prikker eller en nedtrekksmeny.\n3. Trykk på \"Lagring\" eller \"Tilgang til filer\".\n4. Trykk på de tre prikkene oppe i høyre hjørne og velg \"Vis systemet\". \n5. Trykk på \"Ekstern lagring\" og sørg for at \"Tilgang til alle filer\" er gitt.\n6. Prøv igjen å gjenopprette sikkerhetskopien.</string>
-    <string name="forward_security_downgraded_status_message">Perfect Forward Secrecy har blitt deaktivert for denne samtalen fordi app-versjonen til den du chattet med ikke støtter det.</string>
     <string name="forward_security_illegal_session_status_message">Perfect Forward Secrecy økten ble resatt fordi den er ugyldig.</string>
     <string name="crop_image_title">Bekjær bilde</string>
     <string name="scroll_to_bottom">Rull til bunnen</string>
@@ -1526,7 +1517,6 @@ Om du bytter til en ny enhet, vennligst avinstaller eller deaktiver %s på den g
     <string name="status_orphaned_group">*Gruppen mangler en administrator*\nGruppens grunnlegger har forlatt gruppen og den kan ikke lenger administreres. En av de gjenværende medlemmene kan klone gruppen (via gruppedetaljer) for å bli den nye administratoren.</string>
     <string name="group_not_a_member_notice">Du er ikke lenger medlem av gruppen og kan ikke bruke den lenger.</string>
     <string name="group_dissolved_notice">Gruppen har blitt oppløst og kan ikke bli brukt lenger.</string>
-    <string name="md_linked_devices">Tilkoblede enheter</string>
     <string name="md_link_device">Koble til ny enhet</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 -->

+ 39 - 23
app/src/main/res/values-pl/strings.xml

@@ -104,7 +104,7 @@
     <!-- Text shown when a task which shows a loading spinner takes longer than expected (e.g. creating a group) -->
     <string name="please_wait_timeout">To zajmuje dłużej, niż oczekiwano</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="wizard_first_create_id">Tworzenie Twojego identyfikatora ID…</string>
+    <string name="wizard_first_create_id">Tworzenie Twojego identyfikatora ${app_name_short}…</string>
     <string name="wizard1_sync_contacts">Synchronizowanie kontaktów…</string>
     <string name="wizard2_email_hint">Wprowadź swój adres e-mail</string>
     <string name="wizard2_email_linking">Łączenie adresu e-mail z Twoim identyfikatorem</string>
@@ -134,7 +134,7 @@
     <string name="mobile_already_linked">Twój identyfikator ${app_name_short} jest już połączony z tym numerem telefonu</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="email_already_linked">Twój identyfikator ${app_name_short} jest już połączony z tym adresem e-mail</string>
-    <string name="whoaaa">Powiadomienie ${app_name_short}</string>
+    <string name="whoaaa">Zawiadomienie</string>
     <string name="really_delete_message_title">Usuń wiadomość</string>
     <string name="really_delete_thread">Usuń chat</string>
     <string name="really_delete_multiple_threads">Usuń czaty</string>
@@ -165,7 +165,7 @@
     <string name="delete_id_title">Skasuj identyfikator</string>
     <string name="delete_id_message">Jeśli nie utworzyłeś kopii zapasowej lub nie wyeksportowałeś i nie zapisałeś kopii tego identyfikatora, nie będziesz mógł więcej wysyłać ani otrzymywać wiadomości za jego pomocą.\n\nJeśli nie chcesz już korzystać z tego identyfikatora, zaleca się ustawienie hasła unieważnienia i unieważnienie identyfikatora na myid.threema.ch/revoke przed jego usunięciem.</string>
     <string name="delete_id_message2">Ostatnie ostrzeżenie: czy na pewno chcesz usunąć swój identyfikator?</string>
-    <string name="delete_id_sum">Trwale usuń swój identyfikator i wszystkie dane na tym urządzeniu</string>
+    <string name="delete_id_sum">Trwale usuń swój identyfikator ${app_name_short} i wszystkie dane na tym urządzeniu</string>
     <string name="delete_all_data_prompt">Usunąć wszystkie dane dotyczące aplikacji?</string>
     <string name="backup_password_summary">Twój eksport identyfikatora zostanie zabezpieczony hasłem. Użyj kombinacji liter, cyfr i symboli. Nie zapomnij swojego hasła!</string>
     <string name="backup_password_again_summary">Wprowadź hasło ponownie.</string>
@@ -186,7 +186,7 @@
     <string name="prefs_title_masterkey_passphrase">Hasło</string>
     <string name="setting_masterkey_passphrase">Ustawianie klucz generalnego hasła</string>
     <string name="masterkey_passphrase_title">Klucz generalny hasła</string>
-    <string name="masterkey_passphrase_summary">Ustaw hasło, aby chronić swój klucz generalny. Pamiętaj, że będziesz musiał wprowadzać je za każdym razem, gdy aplikacja ${app_name_short} zostanie uruchomiona ponownie.</string>
+    <string name="masterkey_passphrase_summary">Ustaw frazę hasłową, aby chronić swój główny klucz. Pamiętaj, że trzeba będzie ją wpisywać za każdym razem, gdy aplikacja uruchomi się ponownie.</string>
     <string name="masterkey_passphrase_again_summary">Wprowadź hasło ponownie</string>
     <string name="masterkey_passphrase_hint">Hasło</string>
     <string name="master_key_locked_want_exit">Klucz generalny jest zablokowany. Chciałbyś spróbować ponownie?</string>
@@ -207,7 +207,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="no_contacts_sync_on"><![CDATA[Na razie nie masz kontaktów. Synchronizacja jest włączona, ale wygląda na to, że żadna z osób zapisanych w Twojej książce adresowej nie korzysta z aplikacji ${app_name_short} (zaproś je!).]]></string>
     <string name="masterkey_title">Wprowadź hasło</string>
-    <string name="masterkey_body">Twój klucz generalny ${app_name_short} jest chroniony hasłem. Wprowadź hasło, aby odblokować klucz.</string>
+    <string name="masterkey_body">Twój główny klucz jest chroniony za pomocą frazy hasłowej. Wpisz ją, aby odblokować klucz.</string>
     <string name="masterkey_unlocking">Odblokowywanie klucz generalnego</string>
     <string name="verify_phonecall_text">Żądanie połączenia</string>
     <string name="prepare_call_message">Jeżeli przejdziesz dalej, postaramy się zadzwonić od razu. Twój kod weryfikacyjny zostanie Tobie przeczytany dwukrotnie. Zauważ, że podejmiemy tylko jedną próbę, więc upewnij się, że jesteś gotowy, zanim kontynuujesz.</string>
@@ -297,15 +297,14 @@
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="pinentry_enter_pin">Wprowadź PIN ${app_name}</string>
     <string name="pinentry_wrong_pin">PIN niepoprawny</string>
-    <string name="prefs_sum_security_pin">Blokada dostępu do interfejsu użytkownika ${app_name_short}</string>
+    <string name="prefs_sum_security_pin">Zablokuj dostęp do interfejsu użytkownika</string>
     <string name="prefs_title_pin_switch">Ochrona aplikacji</string>
     <string name="prefs_title_pin_code">Zmień PIN</string>
     <string name="prefs_pin_grace">Czas do zablokowania</string>
     <string name="prefs_sum_pin_grace">Czas, aż blokada PIN jest aktywowana</string>
     <string name="click_here_to_change_pin">Zmień PIN</string>
     <string name="set_pin_menu_title">Ustaw nowy PIN</string>
-    <string name="set_pin_summary_intro">Chroń swoją prywatność – ustal numer PIN. ${app_name_short} automatycznie się zablokuje,
- jeśli nie będzie używana przez określony czas (tylko cyfry).</string>
+    <string name="set_pin_summary_intro">Chroń swoją prywatność, ustawiając numer PIN (zawierający tylko cyfry). Może on być używany do blokowania dostępu do interfejsu użytkownika aplikacji po upływie określonego czasu lub do zabezpieczania prywatnych czatów</string>
     <string name="set_pin_again_summary">Wprowadź PIN ponownie</string>
     <string name="set_pin_hint">PIN</string>
     <string name="title_addgroup">Nowa grupa</string>
@@ -441,7 +440,7 @@
     <string name="edit_name">Wprowadź nazwę i zdjęcie</string>
     <string name="edit_name_only">Wprowadź nazwę</string>
     <string name="group_was_synchronized">Grupa zsynchronizowana.</string>
-    <string name="verification_level2_work_explain">Tożsamość tej osoby została zweryfikowana przez administratora ${app_name_short}.</string>
+    <string name="verification_level2_work_explain">Kontakt wewnętrzny, uprzednio wprowadzony przez Twoją organizację.</string>
     <string name="verification_level3_work_explain">Kontakt wewnętrzny, którego tożsamość i kod publiczny zweryfikowano osobiście, skanując jego kod QR.</string>
     <string name="verification_level3_explain">Zweryfikowałeś tożsamość tej osoby poprzez skanowanie jej kodu.</string>
     <string name="verification_level2_explain">Tożsamość tej osoby została zweryfikowana poprzez e-mail lub SMS.</string>
@@ -466,7 +465,7 @@
     <string name="really_delete_media">Czy na pewno chcesz usunąć %d wiadomości multimedialnych?</string>
     <string name="check_updates">Sprawdź, czy są dostępne aktualizacje</string>
     <!-- ${app_name} and ${app_name_short} are placeholders for the app's name, e.g. "Threema". They must be left as-is and not translated. -->
-    <string name="masterkey_lock_explain">${app_name} przechowuje hasło w pamięci. Jeżeli musisz często podawać hasło ponownie, upewnij się, że menedżer zadań i aplikacje oszczędzające baterie, które mogą przedwcześnie zamknąć ${app_name}, są wyłaczone.</string>
+    <string name="masterkey_lock_explain">${app_name} przechowuje frazę hasłową w pamięci. Jeśli często musisz ponownie wpisywać tę sekwencję słów, upewnij się, że wyłączone są aplikacje do oszczędzania energii i menedżer zadań, które mogą przedwcześnie zamykać aplikację ${app_name_short}.</string>
     <string name="identity_already_exists">Ten identyfikator jest już na Twojej liście</string>
     <string name="share_contact">Udostępnij kontakt</string>
     <string name="add_shortcut">Dodaj skrót</string>
@@ -664,14 +663,14 @@ Wprowadź pytanie do swojej ankiety.</string>
     <string name="off">wył.</string>
     <string name="new_wizard_select_country">Wybierz kraj</string>
     <string name="new_wizard_lets_get_started">Zaczynamy!</string>
-    <string name="new_wizard_setup_threema">Ustaw aplikację ${app_name_short}</string>
+    <string name="new_wizard_setup_threema">Skonfiguruj teraz</string>
     <!-- Label on call-to-action button in setup wizard when app is first opened, to allow the user to start setting up the app. ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="work_new_wizard_setup_threema">Skonfiguruj aplikację ${app_name}</string>
     <string name="new_wizard_restore_id_backup">Przywróć wyeksportowany identyfikator</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="new_wizard_welcome">Witamy w ${app_name}!</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_move_finger">Przejedź palcem po ekranie</string>
+    <string name="new_wizard_move_finger">Przesuń palcem po ekranie, aby wygenerować nowy identyfikator ${app_name_short}.</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_this_is_your_id">Oto twoje ID w ${app_name_short}:</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -733,7 +732,7 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <!-- 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. -->
     <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 podano numeru komórki do połączenia z twoim identyfikatorem w ${app_name_short}. Nie pojawisz się więc na listach kontaktów swoich znajomych. Naprawdę chcesz używać ${app_name} anonimowo?</string>
+    <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>
     <string name="new_wizard_scan_id_backup">Lub zeskanuj kod QR swojego eksportu</string>
     <string name="error_saving_file">Błąd zapisywania pliku. Sprawdź pozwolenia.</string>
     <string name="wait_one_minute">Poczekaj co najmniej 10 minut na nadejście SMS-a, zanim rozpoczniesz rozmowę.</string>
@@ -812,12 +811,12 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="draft">Szkic</string>
     <string name="prefs_bigger_single_emojis">Większe pojedyncze emoji</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="wizard1_sync_work">Synchronizacja danych pracowych…</string>
+    <string name="wizard1_sync_work">Synchronizowanie danych z aplikacji ${app_name}…</string>
     <string name="notification_hidden_text">Treści ukryte</string>
     <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>
-    <string name="threema_channel_intro">${app_name_short} Channel dostarcza wiadomości na temat wszystkich rzeczy związanych z ${app_name_short}. Czy chcesz dodać ${app_name_short} Channel do swoich kontaktów?</string>
+    <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>
     <string name="take_photo">Zrób zdjęcie</string>
@@ -895,9 +894,9 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="prefs_summary_force_turn_off">Ustanawiaj bezpośrednie połączenie, o ile to możliwe, i przekierowuj przez serwery ${company_name} tylko połączenia z niezweryfikowanymi kontaktami. Twój adres IP może zostać ujawniony.</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">Wymuś przekierowywanie wszystkich rozmów przez serwery ${company_name}, aby chronić swój adres IP. Może to wpłynąć na jakość połączenia.</string>
-    <string name="permission_record_audio_required">Aby móc wykonywać szyfrowane połączenia i wysyłać wiadomości głosowe, zezwól ${app_name_short} na dostęp do mikrofonu.</string>
+    <string name="permission_record_audio_required">Aby móc wykonywać szyfrowane połączenia i wysyłać wiadomości głosowe, zezwól na dostęp do 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">Połączenia głosowe</string>
+    <string name="prefs_voice_call_notifications">Połączenia w aplikacji ${app_name_short}</string>
     <string name="prefs_voice_call_sound">Dzwonek</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_sum_voice_call_sound">Wybierz dzwonek dla przychodzących połączeń ${app_name_short}</string>
@@ -921,7 +920,7 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="error_attaching_files">Błąd podczas dodawania załączników</string>
     <string name="prefs_fix_powermanager_problems">Usuń problemy z Huawei</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="prefs_fix_powermanager_problems_desc">Usuń problemy na urządzeniach Huawei odbierających wiadomości, gdy aplikacja działa w tle</string>
+    <string name="prefs_fix_powermanager_problems_desc">Zezwól aplikacji ${app_name} na działanie w tle, aby mogła odbierać wiadomości nawet wtedy, gdy nie jest aktywna.</string>
     <string name="disable_powermanager_explain">Aby odbierać wiadomości w tle, włącz przełącznik obok «%s» na następnym ekranie.</string>
     <string name="disable_autostart_explain">Na następnym ekranie upewnij się, że %s znajduje się na liście aplikacji, które mogą uruchamiać się automatycznie. Gdy skończysz, dotknij przycisku Wstecz.</string>
     <string name="notification_priority_default">Niski</string>
@@ -966,7 +965,7 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="webclient_session_stop_all">Zamknij wszystkie</string>
     <string name="passphrase_service_name">Obsługa hasła</string>
     <string name="passphrase_service_description">Powiadomienie, gdy hasło zostało odblokowane</string>
-    <string name="webclient_service_description">Powiadomienie, gdy sesja ${app_name_short} Web jest aktywna</string>
+    <string name="webclient_service_description">Powiadomienie, gdy sesja sieciowa/komputerowa jest aktywna</string>
     <string name="prefs_title_accept_privacy_policy">Zaakceptuj Politykę prywatności</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} chroni Twoją prywatność znacznie lepiej niż jakikolwiek inny komunikator. Więcej informacji na ten temat zawiera nasza %1$s.</string>
@@ -1502,7 +1501,7 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="prefs_summary_hibernation_api">Aby zapobiec wstrzymywaniu aplikacji ${app_name} przez system po dłuższej nieaktywności, wyłącz ustawienie systemowe „Wstrzymuj aktywność aplikacji w razie nieużywania”.</string>
     <string name="unable_to_fetch_configuration">Nie można pobrać danych z serwera konfiguracji. Spróbuj ponownie później.</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="rogue_device_warning"><![CDATA[Wykryto połączenie z innego urządzenia z tym samym identyfikatorem ${app_name_short}. Czy był on ostatnio używany na innym urządzeniu?<br><br>Jeśli tak, to można zignorować tę wiadomość.<br><br>Jeśli nie, to mogło nastąpić ujawnienie Twojego klucza prywatnego. <a href="https://threema.com/faq/another_connection">Postępuj zgodnie z naszymi sugestiami</a>, aby zabezpieczyć swoje urzązenie i dane przed utworzeniem nowego identyfikatora.]]></string>
+    <string name="rogue_device_warning"><![CDATA[Wykryto połączenie nawiązane na innym urządzeniu o takim samym identyfikatorze ${app_name_short}. Czy zdarzyło Ci się ostatnio użyć identyfikatora ${app_name_short} na innym urządzeniu?<br><br>Jeśli tak, to możesz zignorować tę wiadomość.<br><br>W przeciwnym razie mogło dojść do ujawnienia Twojego prywatnego klucza. <a href="https://threema.com/faq/another_connection">Postępuj zgodnie z naszymi sugestiami</a>, aby zabezpieczyć swoje urządzenie oraz dane, zanim utworzysz nowy identyfikator.]]></string>
     <string name="fetch2_failure">Synchronizacja z serwerem udostępniającym nie powiodła się.</string>
     <string name="no_members_support_group_calls">W tej grupie nie ma innych członków, którzy mogą odpowiadać na połączenia grupowe</string>
     <string name="group_calls">Poł. grupowe</string>
@@ -1519,7 +1518,7 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="call_phone_permission_description">Aby wykonywać połączenia ${app_name_short}, musisz przyznać uprawnienie do telefonu, aby aplikacja mogła wykrywać, kiedy inne połączenie przerywa połączenie ${app_name_short}.</string>
     <string name="group_call_nearby_devices_permission_description">Aby wykonywać połączenia grupowe przy użyciu zestawu słuchawkowego Bluetooth, musisz przyznać uprawnienie „urządzenia w pobliżu”, aby wykrywać zestawy Bluetooth.</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">Aby wykonywać połączenia ${app_name} przy użyciu zestawu słuchawkowego Bluetooth, musisz przyznać uprawnienie „urządzenia w pobliżu”, aby wykrywać zestawy Bluetooth.</string>
+    <string name="call_nearby_devices_permission_description">Aby wykonywać połączenia w aplikacji ${app_name_short}, używając zestawu słuchawkowego obsługującego Bluetooth, musisz zezwolić na dostęp do „urządzeń w pobliżu” w celu wykrywania takich zestawów słuchawkowych.</string>
     <string name="settings">Ustawienia</string>
     <string name="leave">Opuść</string>
     <string name="fs_key_mismatch">niezgodność kluczy</string>
@@ -1535,7 +1534,7 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="forward_security_explanation">Doskonałe utajnianie z wyprzedzeniem (Perfect Forward Secrecy – PFS) chroni rejestrowaną komunikację przed odszyfrowaniem po fakcie, nawet jeśli zostaną ujawnione długoterminowe klucze szyfrujące.\n\nOpcję tę można włączyć, jeśli aplikacja po obu stronach obsługuje PFS.</string>
     <string name="group_call_inactivity_left">Opuszczono rozmowę grupową z powodu nieaktywności</string>
     <string name="missing_permission_external_storage">Nie udało się skopiować pliku. Spróbuj następujących kroków:\n1. Otwórz aplikację Ustawienia.\n2. Przejdź do \"Aplikacje\" i wybierz \"Dostęp specjalny\".\n3. Dotknij \"Dostęp do wszystkich plików\".\n4. Dotknij trzech kropek w prawym górnym rogu i wybierz \"Pokaż aplikacje systemowe\".\n5. Dotknij \"Pamięć zewnętrzna\" i upewnij się, że \"Zezwól na dostęp do zarządzania wszystkimi plikami\" jest przyznane.\n6. Spróbuj ponownie przywrócić kopię zapasową.</string>
-    <string name="forward_security_downgraded_status_message">Funkcja Perfect Forward Secrecy została wyłączona w tej konwersacji, ponieważ wersja aplikacji partnera na czacie jej nie obsługuje.</string>
+    <string name="forward_security_downgraded_status_message">Wyłączono doskonałe utajnianie z wyprzedzeniem (funkcję PFS) w tej rozmowie, ponieważ nie jest ono obsługiwane przez wersję aplikacji posiadaną przez Twojego partnera na czacie lub używana jest aplikacja ${app_name_desktop} 2.0 na komputer (wersja beta).</string>
     <string name="forward_security_illegal_session_status_message">Zresetowano sesję Perfect Forward Secrecy z powodu nieprawidłowości.</string>
     <string name="crop_image_title">Przytnij obraz</string>
     <string name="scroll_to_bottom">Przewiń na dół</string>
@@ -1600,7 +1599,7 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="status_orphaned_group">*Ta grupa jest porzucona*\nTwórca grupy opuścił ją i nie można już nią zarządzać. Jeden z pozostałych członków może sklonować grupę (poprzez szczegóły grupy), aby zostać nowym administratorem.</string>
     <string name="group_not_a_member_notice">Nie należysz już do tej grupy i nie możesz z niej korzystać.</string>
     <string name="group_dissolved_notice">Grupa ta została rozwiązana i nie można już z niej korzystać.</string>
-    <string name="md_linked_devices">Połączone urządzenia</string>
+    <string name="md_linked_devices">${app_name_desktop} 2.0 na komputer (wersja beta)</string>
     <string name="md_link_device">Połącz nowe urządzenie</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 -->
@@ -1800,6 +1799,23 @@ podanie wyłącznie imienia lub pseudonimu. Jeśli nie ustawisz pseudonimu, będ
     <string name="remote_secret_deactivating">Dezaktywowanie funkcji ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">Nie udało się dezaktywować funkcji ${remote_secret}. Sprawdź swoje połączenie internetowe i spróbuj ponownie.</string>
+    <string name="referral_banner_title">Poleć i zyskaj</string>
+    <string name="referral_banner_body">Zachęć znajomych do używania Threema Work w ich firmie i zyskaj bonus za polecenie!</string>
+    <string name="referral_screen_title">Poleć i zyskaj</string>
+    <string name="referral_screen_subtitle">Otrzymaj nawet 10% kwoty, na którą będzie opiewała pierwsza faktura dla namówionej przez Ciebie firmy.</string>
+    <string name="referral_how_it_works_title">Jak to działa</string>
+    <string name="referral_how_it_works_referral_title">Polecenie</string>
+    <string name="referral_how_it_works_referral_body">Zachęć znajomego lub jego firmę do dołączenia do Threema Work. Ważne jest podanie Twojego identyfikatora Threema podczas rejestracji lub w trakcie kupowania licencji, abyśmy mogli uwzględnić Twoje polecenie.</string>
+    <string name="referral_how_it_works_requirements_title">Wymagania</string>
+    <string name="referral_how_it_works_requirements_body">Skierowana do nas firma nie może wcześniej być naszym klientem i musi zamówić licencje</string>
+    <string name="referral_how_it_works_confirmation_title">Potwierdzenie</string>
+    <string name="referral_how_it_works_confirmation_body">Aby zadbać o prawidłowe przypisanie i zweryfikowanie skierowanego do nas podmiotu, skontaktujemy się z Tobą przed dokonaniem płatności. Jak tylko zakończy się proces weryfikacji, poinformujemy Cię o tym.</string>
+    <string name="referral_your_reward_title">Twoja nagroda</string>
+    <string name="referral_your_reward_subtitle">Zdobądź bonus za polecenie</string>
+    <string name="referral_your_reward_body">Za polecenie otrzymasz 10% kwoty (bez podatków/opłat), na którą będzie opiewała pierwsza faktura dla namówionej przez Ciebie firmy. Przekażemy Ci bonus w ciągu 30–60 dni od daty otrzymania płatności.</string>
+    <string name="referral_share_invitation_link">Udostępnij link do zaproszenia</string>
+    <string name="referral_view_terms_and_conditions">Wyświetl Regulamin</string>
+    <string name="referral_invitation_message_content">Cześć, myślę, że to może Ci się przydać: Threema Work jest doskonałym rozwiązaniem do bezpiecznej komunikacji biznesowej. Oto Twój link umożliwiający wypróbowanie tej opcji: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d kontakt</item>
         <item quantity="few">%d kontakty</item>

+ 40 - 23
app/src/main/res/values-pt-rBR/strings.xml

@@ -134,7 +134,7 @@
     <string name="mobile_already_linked">Seu ID ${app_name_short} já está vinculado a este número de celular</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="email_already_linked">Seu ID ${app_name_short} já está vinculado a este endereço de e-mail</string>
-    <string name="whoaaa">Aviso ${app_name_short}</string>
+    <string name="whoaaa">Aviso</string>
     <string name="really_delete_message_title">Excluir mensagem</string>
     <string name="really_delete_thread">Excluir conversa</string>
     <string name="really_delete_multiple_threads">Excluir conversas</string>
@@ -165,7 +165,7 @@
     <string name="delete_id_title">Excluir ID</string>
     <string name="delete_id_message">A menos que tenha criado um backup ou exportado e salvo uma cópia desta ID, você nunca conseguirá enviar ou receber mensagens com esta ID novamente.\n\nSe não deseja usar mais esta ID, recomendamos que você crie uma senha de revogação e revogue a ID em myid.threema.ch/revoke antes de excluí-la.</string>
     <string name="delete_id_message2">Último aviso: você realmente deseja excluir a sua ID neste dispositivo?</string>
-    <string name="delete_id_sum">Excluir permanentemente a sua ID e todos os dados neste dispositivo?</string>
+    <string name="delete_id_sum">Excluir permanentemente o seu ${app_name_short}-ID e todos os dados neste dispositivo</string>
     <string name="delete_all_data_prompt">Excluir todos os dados do aplicativo?</string>
     <string name="backup_password_summary">A exportação da sua ID será criptografada com uma senha. Use uma combinação de letras, números e símbolos. Não esqueça a senha digitada!</string>
     <string name="backup_password_again_summary">Digite a senha novamente</string>
@@ -186,7 +186,7 @@
     <string name="prefs_title_masterkey_passphrase">Frase secreta</string>
     <string name="setting_masterkey_passphrase">Definir frase secreta da chave mestra</string>
     <string name="masterkey_passphrase_title">Frase secreta da chave mestra</string>
-    <string name="masterkey_passphrase_summary">Definir uma frase secreta para proteger sua chave mestra. Note que você terá de digitar a frase todas as vezes que o ${app_name_short} reiniciar.</string>
+    <string name="masterkey_passphrase_summary">Defina uma frase secreta para proteger sua chave mestra. Note que você terá de inseri-la toda vez que o aplicativo for reiniciado.</string>
     <string name="masterkey_passphrase_again_summary">Digite a frase secreta novamente</string>
     <string name="masterkey_passphrase_hint">Frase secreta</string>
     <string name="master_key_locked_want_exit">Chave mestra ainda bloqueada. Gostaria de tentar novamente?</string>
@@ -207,7 +207,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="no_contacts_sync_on"><![CDATA[Você ainda não tem nenhum contato. A sincronização está ativada, mas parece que nenhum dos contatos do seu catálogo de endereços está em ${app_name_short} (convide-os!).]]></string>
     <string name="masterkey_title">Digite a frase secreta</string>
-    <string name="masterkey_body">Sua chave mestra do ${app_name_short} é protegida por uma frase secreta. Digite a frase secreta para desbloquear a chave.</string>
+    <string name="masterkey_body">Sua chave mestra é protegida por uma frase secreta. Digite a frase secreta para desbloquear a chave.</string>
     <string name="masterkey_unlocking">Desbloqueando a chave mestra</string>
     <string name="verify_phonecall_text">Solicitar uma ligação</string>
     <string name="prepare_call_message">Se você continuar, vamos tentar chamá-lo imediatamente. Seu código de confirmação será lido para você duas vezes. Note que só vamos fazer uma tentativa, por isso certifique-se de que está pronto antes de continuar.</string>
@@ -297,7 +297,7 @@
     <!-- ${app_name} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
     <string name="pinentry_enter_pin">Digite o seu ${app_name} PIN para continuar</string>
     <string name="pinentry_wrong_pin">PIN incorreto</string>
-    <string name="prefs_sum_security_pin">Bloquear o acesso à Interface do Usuário do ${app_name_short}</string>
+    <string name="prefs_sum_security_pin">Bloquear o acesso à Interface do Usuário</string>
     <string name="prefs_title_pin_switch">Bloquear app</string>
     <string name="prefs_title_pin_code">Alterar PIN</string>
     <string name="prefs_pin_grace">Tempo para bloquear</string>
@@ -374,7 +374,7 @@
     <string name="prefs_sum_blocked_contacts">As mensagens das IDs listadas aqui serão ignoradas.</string>
     <string name="verified">Confirmado(s)</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="want_to_add_to_exclude_list">Este contato do ${app_name_short} está vinculado a um contato do seu celular. Se você apagá-lo no ${app_name_short}, ele irá reaparecer depois de uma sincronização de contatos.\nGostaria de excluí-lo da sincronização?</string>
+    <string name="want_to_add_to_exclude_list">Este contato está vinculado a um registro na agenda de contatos do seu telefone. Se você apagá-lo no ${app_name_short}, ele reaparecerá após uma sincronização de contatos.\nGostaria de excluí-lo da sincronização?</string>
     <string name="no">Não</string>
     <string name="yes">Sim</string>
     <string name="deleting_contact">Excluindo contato</string>
@@ -430,7 +430,7 @@
     <string name="push_not_available_text1">O serviço de push não pôde ser usado no seu dispositivo, porque o Google Play Services não está instalado ou não é a versão atual.</string>
     <string name="push_not_available_text2">O %s tentará abrir uma conexão de fundo persistente com o servidor. Isso poderá não funcionar de forma confiável se os mecanismos de otimização da bateria do seu dispositivo interferirem na conexão de fundo.</string>
     <string name="backup_in_progress">Backup em andamento</string>
-    <string name="backup_or_restore_success_body">Backup do ${app_name_short} concluído com sucesso</string>
+    <string name="backup_or_restore_success_body">Backup de dados concluído com sucesso</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="backup_or_restore_error">Backup do ${app_name_short}</string>
     <string name="backup_or_restore_error_body">Backup não foi concluído com sucesso</string>
@@ -663,14 +663,14 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="off">desligado</string>
     <string name="new_wizard_select_country">Código do país</string>
     <string name="new_wizard_lets_get_started">Vamos começar</string>
-    <string name="new_wizard_setup_threema">Configurar ${app_name_short}</string>
+    <string name="new_wizard_setup_threema">Configurar agora</string>
     <!-- Label on call-to-action button in setup wizard when app is first opened, to allow the user to start setting up the app. ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="work_new_wizard_setup_threema">Configurar ${app_name}</string>
     <string name="new_wizard_restore_id_backup">Restaurar ID exportada</string>
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="new_wizard_welcome">Bem-vindo ao ${app_name}</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_move_finger">Mova seu dedo na tela.</string>
+    <string name="new_wizard_move_finger">Mova o dedo na tela para gerar um novo ID do ${app_name_short}.</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_this_is_your_id">Esta é a sua ID do ${app_name_short}:</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -724,7 +724,7 @@ Por favor, insira uma pergunta para a sua enquete.</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. -->
     <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 celular para vincular à sua ID do ${app_name_short}. Você não aparecerá na lista de contatos de seus amigos. Deseja mesmo usar o ${app_name} anonimamente?</string>
+    <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>
     <string name="new_wizard_scan_id_backup">Ou leia o código QR da sua exportação de ID</string>
     <string name="error_saving_file">Erro ao salvar o arquivo. Verifique as permissões.</string>
     <string name="wait_one_minute">Por favor, aguarde pelo menos 10 minutos para o SMS chegar antes de fazer uma chamada.</string>
@@ -792,7 +792,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="grace_thirty_minutes">30 minutos</string>
     <string name="grace_never">Nunca (manual)</string>
     <string name="never">Nunca</string>
-    <string name="access_protection_private_chats_warning">Remover a proteção de acesso deixará todos os seus chats privados visíveis novamente.</string>
+    <string name="access_protection_private_chats_warning">Ao remover a proteção de acesso, todos os seus chats privados ficarão visíveis novamente.</string>
     <string name="verification_started">Verificação iniciada</string>
     <string name="cannot_open_file">Não foi possível abrir o arquivo</string>
     <string name="prefs_title_image_attach_previews">Seleção rápida de imagem</string>
@@ -886,9 +886,9 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="prefs_summary_force_turn_off">Estabeleça uma conexão direta, se possível, e apenas retransmita chamadas para contatos não verificados através do servidores do ${company_name}. Pode expor seu endereço de 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">Force a retransmissão de todas as chamadas através dos servidores do ${company_name}, protegendo seu endereço de IP. Pode afetar a qualidade da chamada.</string>
-    <string name="permission_record_audio_required">Para fazer chamadas criptografadas e enviar mensagens de voz, permita que o ${app_name_short} acesse o microfone.</string>
+    <string name="permission_record_audio_required">Para fazer chamadas criptografadas e enviar mensagens de voz, permita acesso ao microfone.</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">Chamadas de voz</string>
+    <string name="prefs_voice_call_notifications">Chamadas do ${app_name_short}</string>
     <string name="prefs_voice_call_sound">Tom de chamada</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_sum_voice_call_sound">Selecione o tom de chamada para chamadas recebidas do ${app_name_short}</string>
@@ -912,7 +912,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="error_attaching_files">Erro ao adicionar anexos.</string>
     <string name="prefs_fix_powermanager_problems">Repare problemas da Huawei</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="prefs_fix_powermanager_problems_desc">Repare problemas nos dispositivos Huawei que recebem mensagens quando o aplicativo está em segundo plano</string>
+    <string name="prefs_fix_powermanager_problems_desc">Permita que o aplicativo ${app_name} seja executado em segundo plano para que possa receber mensagens mesmo quando não estiver ativo.</string>
     <string name="disable_powermanager_explain">Para receber uma mensagem em segundo plano, habilite a opção ao lado de «%s» na tela a seguir.</string>
     <string name="disable_autostart_explain">Na tela a seguir, certifique-se de que «
 %s» está incluído na lista de aplicativos que podem iniciar automaticamente. Toque no botão «back» quando estiver pronto.</string>
@@ -958,7 +958,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="webclient_session_stop_all">Fechar tudo</string>
     <string name="passphrase_service_name">Serviço de frase secreta</string>
     <string name="passphrase_service_description">Notificar quando a frase secreta for desbloqueada</string>
-    <string name="webclient_service_description">Notificar quando a sessão do ${app_name_short} Web estiver ativa</string>
+    <string name="webclient_service_description">Notificação quando a sessão Web/Desktop estiver ativa</string>
     <string name="prefs_title_accept_privacy_policy">Aceitar Política de Privacidade</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} protege a sua privacidade com mais rigor do que qualquer outro aplicativo de mensagens. Saiba mais em %1$s.</string>
@@ -982,7 +982,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="safe_learn_more_button">Mais informação</string>
     <string name="safe_enable_explain">Todas as suas conversas são armazenadas somente no seu dispositivo. Você não tem uma conta conosco e não podemos ajudar se você perder seu celular ou excluir acidentalmente os seus dados.\n\nO ${app_name_short} Safe cria backups automáticos de todos os dados importantes, incluindo as suas chaves, lista de contatos e associações de grupo (sem nenhum conteúdo de mensagens) de forma anônima, em um servidor seguro da sua escolha.</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_disable_confirm">Tem certeza de que deseja continuar sem habilitar o ${app_name_short} Safe?</string>
+    <string name="safe_disable_confirm">Você deseja continuar sem ativar o ${app_name_short} Safe? Ao usar o ${app_name_short} Safe, você pode restaurar seu ID do ${app_name_short}, contatos e grupos caso perca o acesso ao seu dispositivo.</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_configure_choose_password">Escolha uma senha. Você precisará dessa senha para restaurar seu backup do ${app_name_short} Safe.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -999,7 +999,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="safe_threema_id">Sua ID do ${app_name_short}</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">Insira a ID do ${app_name_short} se quiser recuperar</string>
-    <string name="safe_search_id_title">Insira o número de celular ou endereço de e-mail vinculado à sua ID</string>
+    <string name="safe_search_id_title">Insira o número de celular ou o endereço de e-mail vinculado ao seu ${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">Procurando a ID do ${app_name_short}</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1336,7 +1336,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="id_backup_info">Apenas restaurar sua ID</string>
     <string name="restore_your_id_contacts_and_groups">Restaurar sua ID, contatos e grupos</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">Backup seguro do Backup</string>
+    <string name="threema_safe_backup">Backup do ${app_name_short} Safe</string>
     <string name="forgot_your_password"><![CDATA[<a href=%s>Ajuda</a>]]></string>
     <string name="download_failed">Falha no download. Código de erro: %d</string>
     <string name="edit_answer">Editar resposta</string>
@@ -1506,7 +1506,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="group_call_mic_permission_description">Para realizar chamadas de grupo, você deve permitir o uso do microfone para que as outras pessoas possam te ouvir</string>
     <string name="call_mic_permission_description">Para realizar chamadas, você deve permitir o uso do microfone para que as outras pessoas possam te ouvir</string>
     <string name="group_call_camera_permission_rationale">Para que os outros participantes vejam a sua foto, você precisa permitir que o %s acesse a câmera em «permissões».</string>
-    <string name="group_call_phone_permission_description">Para realizar chamadas de grupo, é necessária a permissão do telefone para detectar quando outra chamada interrompe a chamada do ${app_name_short}.</string>
+    <string name="group_call_phone_permission_description">Para realizar chamadas em grupo, é necessária a permissão do telefone para detectar quando outra chamada interrompe a chamada em grupo.</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">Para realizar chamadas do ${app_name_short}, é necessária a permissão do telefone para detectar quando outra chamada interrompe a chamada do ${app_name_short}.</string>
     <string name="group_call_nearby_devices_permission_description">Para realizar chamadas de grupo com um fone de ouvido bluetooth, você deve habilitar a permissão para que \"dispositivos próximos\" detectem fones de ouvido bluetooth.</string>
@@ -1527,7 +1527,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="forward_security_explanation">Perfect Forward Secrecy (PFS), ou \"sigilo encaminhado perfeito\", protege uma comunicação gravada de uma decodificação retroativa, mesmo se a chave criptográfica de longo prazo for comprometida.\n\nA opção pode ser ativada se o app em ambas as pontas for compatível com PFS.</string>
     <string name="group_call_inactivity_left">Chamada de grupo abandonada devido à inatividade</string>
     <string name="missing_permission_external_storage">Não foi possível copiar o arquivo. Tente os passos a seguir:\n1. Abra o aplicativo de ajustes.\n2. Vá até “Aplicativos” e escolha “Acesso especial ao aplicativo”.\n3. Toque em \"Acesso a todos os arquivos\".\n4. Toque nos três pontos no canto superior direito e escolha “Mostrar sistema“.\n5. Toque em “Armazenamento externo” e conceda autorização para “Permitir acesso para gerenciar todos os arquivos”.\n6. Tente restaurar o backup novamente.</string>
-    <string name="forward_security_downgraded_status_message">Perfect Forward Secrecy foi desativado nesta conversa porque a versão do app do seu contato do chat não é compatível.</string>
+    <string name="forward_security_downgraded_status_message">O Perfect Forward Secrecy foi desativado neste chat porque a versão do aplicativo do seu parceiro de chat não o suporta ou o ${app_name_desktop} 2.0 para Desktop (beta) está sendo usado.</string>
     <string name="forward_security_illegal_session_status_message">A sessão com Perfect Forward Secrecy foi reiniciada por ser inválida.</string>
     <string name="crop_image_title">Cortar imagem</string>
     <string name="scroll_to_bottom">Rolar para baixo</string>
@@ -1592,7 +1592,7 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="status_orphaned_group">*Este grupo está órfão*\nO(a) criador(a) do grupo saiu e ele não poderá ser mantido. Um dos membros restantes pode clonar o grupo (via detalhes do grupo) para tornar-se o novo administrador.</string>
     <string name="group_not_a_member_notice">Você não faz mais parte deste grupo e não pode mais usá-lo.</string>
     <string name="group_dissolved_notice">Este grupo foi dissolvido e não pode mais ser usado.</string>
-    <string name="md_linked_devices">Dispositivos vinculados</string>
+    <string name="md_linked_devices">${app_name_desktop} 2.0 para Desktop (Beta)</string>
     <string name="md_link_device">Vincular novo dispositivo</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 -->
@@ -1777,11 +1777,11 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <!-- Shown as the title of an info dialog when DualLock (a.k.a. "Remote Secret") has been activated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_activated_notification_title">O ${remote_secret} foi ativado</string>
     <!-- Shown as the content of an info dialog when DualLock (a.k.a. "Remote Secret") has been activated. The text in [square brackets] must be translated, and the brackets must be kept around the translation. -->
-    <string name="remote_secret_activated_dialog_content">Em caso de perda do seu dispositivo, esse recurso permitirá ao seu administrador bloquear o aplicativo, garantindo que seus chats permaneçam criptografados mesmo que pessoas não autorizadas consigam desbloquear seu dispositivo.\n[Saiba mais]</string>
+    <string name="remote_secret_activated_dialog_content">Se você perder seu dispositivo, este recurso permite que seu administrador bloqueie o aplicativo, garantindo que seus chats permaneçam criptografados mesmo que pessoas não autorizadas consigam desbloquear seu dispositivo.\n[Saiba mais]</string>
     <!-- Shown as the title of an info dialog when DualLock (a.k.a. "Remote Secret") has been deactivated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivated_notification_title">O ${remote_secret} foi desativado</string>
     <!-- Shown as the content of an info dialog when DualLock (a.k.a. "Remote Secret") has been deactivated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. The text in [square brackets] must be translated, and the brackets must be kept around the translation. -->
-    <string name="remote_secret_deactivated_dialog_content">Seu administrador desativou a opção ${remote_secret}. Mais informações sobre a opção ${remote_secret} podem ser encontradas em [Perguntas frequentes].</string>
+    <string name="remote_secret_deactivated_dialog_content">Seu administrador desativou o ${remote_secret}. Mais informações sobre o ${remote_secret} podem ser encontradas nesta [entrada do FAQ].</string>
     <!-- Shown on loading indicator while the DualLock (a.k.a. "Remote Secret") feature is being activated. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_activating">Ativando o ${remote_secret}</string>
     <!-- Error message shown fullscreen when activating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
@@ -1790,6 +1790,23 @@ Por favor, insira uma pergunta para a sua enquete.</string>
     <string name="remote_secret_deactivating">Desativando o ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">Falha ao desativar o ${remote_secret}. Verifique sua conexão com a internet e tente novamente.</string>
+    <string name="referral_banner_title">Recomende e beneficie-se</string>
+    <string name="referral_banner_body">Convide amigos para usar o Threema Work em suas empresas e ganhe um bônus por indicação!</string>
+    <string name="referral_screen_title">Recomende e beneficie-se</string>
+    <string name="referral_screen_subtitle">Receba até 10% do valor da primeira fatura da empresa recrutada.</string>
+    <string name="referral_how_it_works_title">Como funciona</string>
+    <string name="referral_how_it_works_referral_title">Indicação</string>
+    <string name="referral_how_it_works_referral_body">Convide um amigo ou empresa para fazer parte do Threema Work. É importante que seu ID do Threema seja fornecido durante o cadastro, ou na compra de licenças, para que sua indicação seja considerada.</string>
+    <string name="referral_how_it_works_requirements_title">Requisitos</string>
+    <string name="referral_how_it_works_requirements_body">A empresa indicada não deve já ser nossa cliente e deve solicitar licenças</string>
+    <string name="referral_how_it_works_confirmation_title">Confirmação</string>
+    <string name="referral_how_it_works_confirmation_body">Para garantir que sua indicação seja corretamente atribuída e verificada, entraremos em contato com você antes da realização do pagamento. Informaremos assim que o processo de verificação for concluído.</string>
+    <string name="referral_your_reward_title">Sua recompensa</string>
+    <string name="referral_your_reward_subtitle">Ganhe um bônus por indicação</string>
+    <string name="referral_your_reward_body">Pela sua indicação, você receberá 10% do valor da primeira fatura da empresa recrutada (excluindo impostos/taxas). O bônus será transferido para você no prazo de 30 a 60 dias após o recebimento do pagamento.</string>
+    <string name="referral_share_invitation_link">Compartilhar o link do convite</string>
+    <string name="referral_view_terms_and_conditions">Ver termos e condições</string>
+    <string name="referral_invitation_message_content">Olá, acredito que isto pode ser útil para você: o Threema Work é uma excelente opção de comunicação segura para empresas. Aqui está o link de teste: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d contato</item>
         <item quantity="other">%d contatos</item>

+ 34 - 17
app/src/main/res/values-ru/strings.xml

@@ -15,7 +15,7 @@
     <string name="title_invite_friend">Пригласить друга</string>
     <string name="invite_via">Пригласить друга через…</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="invite_email_body">Привет!\n\nЯ использую %1$s  приложение для безопасного мгновенного обмена сообщениями, защищающее конфиденциальность пользователей.\n\nМой ${app_name_short} ID: https://threema.id/%2$s\n\nДавайте общаться в %1$s!\n\nУдачи!\n</string>
+    <string name="invite_email_body">Привет!\n\nЯ использую %1$s  приложение для безопасного мгновенного обмена сообщениями, защищающее конфиденциальность пользователей.\n\nМой ${app_name_short} ID: https://threema.id/%2$s\n\nДавайте общаться в %1$s!\n\nУдачи!\n</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="invite_sms_body">Давайте использовать %1$s для безопасной и конфиденциальной связи! Мой ${app_name_short} ID: https://threema.id/%2$s</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -160,12 +160,12 @@
     <string name="check_incoming_sms">Проверка входящего SMS</string>
     <string name="backup_title">Экспорт 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="backup_sum">Экспортировать свой ID ${app_name_short}</string>
+    <string name="backup_sum">Экспортировать свой ${app_name_short} ID</string>
     <string name="backup_and_delete">Резервное копирование и удаление</string>
     <string name="delete_id_title">Удалить ID</string>
     <string name="delete_id_message">Если у вас нет созданной или экспортированной резервной копии этого ID, вы больше никогда не сможете отправлять или получать сообщения, используя этот ID.\n\nЕсли вы больше не хотите использовать этот ID, рекомендуется задать пароль аннулирования и отозвать ID на сайте myid.threema.ch/revoke перед его удалением.</string>
     <string name="delete_id_message2">Последнее предупреждение: вы действительно хотите удалить свой ID?</string>
-    <string name="delete_id_sum">Навсегда удалить свой ID и все данные на этом устройстве</string>
+    <string name="delete_id_sum">Навсегда удалить свой ${app_name_short} ID и все данные на этом устройстве</string>
     <string name="delete_all_data_prompt">Удалить все данные приложения?</string>
     <string name="backup_password_summary">Ваш экспорт ID будет зашифрован паролем. Используйте сочетание латинских букв, цифр и специальных символов. Не забудьте записать или запомнить свой новый пароль!</string>
     <string name="backup_password_again_summary">Введите пароль ещё раз</string>
@@ -667,7 +667,7 @@
     <!-- ${app_name} is a placeholder for the app's name, it must be kept as-is, not translated. -->
     <string name="new_wizard_welcome">Добро пожаловать в ${app_name}!</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_move_finger">Двигайте пальцем по экрану</string>
+    <string name="new_wizard_move_finger">Двигайте пальцем по экрану для создания нового ${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="new_wizard_this_is_your_id">Это ваш ${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. -->
@@ -801,12 +801,12 @@
     <string name="draft">Черновик</string>
     <string name="prefs_bigger_single_emojis">Большие одиночные эмоции</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="wizard1_sync_work">Синхронизация данных…</string>
+    <string name="wizard1_sync_work">Синхронизация данных ${app_name}…</string>
     <string name="notification_hidden_text">Содержимое скрыто</string>
     <string name="really_reset_ringtones">Сбросить настройки звуковых уведомлений по умолчанию?</string>
     <string name="reset_ringtones_confirm">Настройки звуковых уведомлений были сброшены.</string>
     <string name="prefs_language_override">Язык</string>
-    <string name="threema_channel_intro">Канал Threema предоставляет вам новости обо всех событиях Threema. Подписаться на канал и добавить его в список контактов? Это бесплатно и вы можете отписаться в любое время.</string>
+    <string name="threema_channel_intro">Канал ${app_name_short} предоставляет вам новости обо всех событиях ${app_name_short}. Подписаться на канал и добавить его в список контактов? Это бесплатно и вы можете отписаться в любое время.</string>
     <string name="quote">Цитировать</string>
     <string name="contacts_deleted">Контакты были удалены</string>
     <string name="take_photo">Сфотографировать</string>
@@ -884,7 +884,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">Для совершения шифрованных звонков и отправки голосовых сообщений предоставьте приложению Threema доступ к микрофону.</string>
+    <string name="permission_record_audio_required">Для совершения шифрованных звонков и отправки голосовых сообщений предоставьте приложению ${app_name_short} доступ к микрофону.</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>
@@ -985,7 +985,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="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. -->
-    <string name="safe_configure_server_explain">Можно использовать сервер ${app_name_short} Safe или указать сторонний сервер для резервного копирования.</string>
+    <string name="safe_configure_server_explain">Можно использовать сервер ${company_name} Safe или указать сторонний сервер для резервного копирования.</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="onprem_safe_configure_server_explain">Сохраните резервную копию ${app_name_short} Safe на сервере своей организации или укажите другой сервер для резервного копирования.</string>
     <string name="safe_use_default_server">Сервер по умолчанию</string>
@@ -993,17 +993,17 @@
     <string name="safe_advanced_options">Расширенные настройки</string>
     <string name="safe_enter_password">Введите пароль ${app_name_short} Safe</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_threema_id">Ваш ID ${app_name_short}</string>
+    <string name="safe_threema_id">Ваш ${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">Введите ID ${app_name_short}, который вы хотите восстановить</string>
-    <string name="safe_search_id_title">Введите номер телефона или эл. почту, связанную с вашим ID</string>
+    <string name="safe_restore_enter_id">Введите ${app_name_short} ID, который вы хотите восстановить</string>
+    <string name="safe_search_id_title">Введите номер телефона или эл. почту, связанную с вашим ${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">Поиск ID ${app_name_short}</string>
+    <string name="safe_id_lookup">Поиск ${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_no_id_found">${app_name_short} ID не найден</string>
     <string name="safe_no_backup_found">На сервере не найдена резервная копия. Проверьте 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_select_id">Найдено несколько ID ${app_name_short}. Выберите ID для использования:</string>
+    <string name="safe_select_id">Найдено несколько ${app_name_short} ID. Выберите ID для использования:</string>
     <string name="safe_backup_now">Создать копию</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_enable_explain_short">Включите ${app_name_short} Safe для автоматического создания защищённых анонимных резервных копий всех ваших важных данных.</string>
@@ -1229,7 +1229,7 @@
     <string name="picture_in_picture_disabled_in_setting">Режим «картинка в картинке» отключён для %s. Включите его в системных настройках.</string>
     <string name="delete_everything">Удалить все</string>
     <string name="prefs_title_voip_video_enable">Разрешить видео</string>
-    <string name="video_calls">Видеозвонки Threema</string>
+    <string name="video_calls">Видеозвонки</string>
     <string name="prefs_videocall_profile">Желаемое качество изображения</string>
     <string name="videocall_profile_auto">Сбалансированное (рекомендовано)</string>
     <string name="videocall_profile_low_bandwidth">Экономия данных</string>
@@ -1355,7 +1355,7 @@
     <string name="prefs_sum_reset_receipts">Сброс уведомлений о прочтении и индикатора ввода текста для конкретных контактов до настроек по умолчанию</string>
     <string name="reset_successful">Успешно сброшено до настроек по умолчанию</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="no_threema_qr_info">Это не QR-Code ${app_name_short}. Расшифрованное содержимое:</string>
+    <string name="no_threema_qr_info">Это не QR-код ${app_name_short}. Расшифрованное содержимое:</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="qr_scanner_id_hint">Сканируйте QR-код контакта для проверки его личности. Чтобы показать код, попросите контакта нажать на аватар в левом верхнем углу на главном экране ${app_name_short}.</string>
     <string name="enable_storage_access_for_media">Предоставьте доступ к памяти устройства для просмотра изображений и видео на нём.</string>
@@ -1570,7 +1570,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="safe_managed_password_confirm">Подготовлен управляемый пароль для вашей резервной копии ${app_name_short} Safe.\n\nИспользовать этот пароль? Если сомневаетесь, обратитесь к администратору.</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_managed_new_password_confirm">Подготовлен управляемый пароль для для вашей резервной копии ${app_name_short} Safe.\n\nЗаменить текущий пароль новым, управляемым? Если сомневаетесь, обратитесь к администратору.</string>
+    <string name="safe_managed_new_password_confirm">Подготовлен управляемый пароль для вашей резервной копии ${app_name_short} Safe.\n\nЗаменить текущий пароль новым, управляемым? Если сомневаетесь, обратитесь к администратору.</string>
     <string name="real_not_now">Не сейчас</string>
     <string name="add_contact_in">Добавить контакт в…</string>
     <string name="really_remove_all_stars">Убрать звёздочки со всех сообщений?</string>
@@ -1589,7 +1589,7 @@
     <string name="status_orphaned_group">*Группа осталась без создателя*\nСоздатель группы покинул её, она больше не будет поддерживаться. Кто-то из оставшихся участников может клонировать группу (с экрана сведений о группе) и стать её новым администратором.</string>
     <string name="group_not_a_member_notice">Вы больше не состоите в этой группе и не можете её использовать.</string>
     <string name="group_dissolved_notice">Группа распущена и больше не может использоваться.</string>
-    <string name="md_linked_devices">Привязанные устройства</string>
+    <string name="md_linked_devices">${app_name_desktop} 2.0 для ПК (бета)</string>
     <string name="md_link_device">Привязать новое устройство</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 -->
@@ -1789,6 +1789,23 @@
     <string name="remote_secret_deactivating">Деактивация ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">Невозможно деактивировать ${remote_secret}. Проверьте соединение с интернетом и повторите попытку.</string>
+    <string name="referral_banner_title">Рекомендуйте и получайте выгоду</string>
+    <string name="referral_banner_body">Пригласите друзей использовать Threema Work в их компании и получите бонус за привлечение!</string>
+    <string name="referral_screen_title">Рекомендовать и получить выгоду</string>
+    <string name="referral_screen_subtitle">Получите до 10% от суммы первого счёта привлечённой компании.</string>
+    <string name="referral_how_it_works_title">Как это работает</string>
+    <string name="referral_how_it_works_referral_title">Привлечение</string>
+    <string name="referral_how_it_works_referral_body">Пригласите друга или его компанию присоединиться к Threema Work. Важно, чтобы ваш Threema ID был указан при регистрации или покупке лицензий, чтобы ваше участие в привлечении могло быть учтено.</string>
+    <string name="referral_how_it_works_requirements_title">Требования</string>
+    <string name="referral_how_it_works_requirements_body">Приглашённая компания ещё не должна быть нашим клиентом и должна купить лицензии</string>
+    <string name="referral_how_it_works_confirmation_title">Подтверждение</string>
+    <string name="referral_how_it_works_confirmation_body">Чтобы убедиться, что привлечённый вами будет правильно назначен и подтверждён, мы свяжемся с вами перед совершением платежа. Мы сообщим вам, как только процесс проверки будет завершён.</string>
+    <string name="referral_your_reward_title">Ваша награда</string>
+    <string name="referral_your_reward_subtitle">Получите бонус за привлечение</string>
+    <string name="referral_your_reward_body">За каждого привлечённого вы получите 10% от суммы его первого счёта (без учёта налогов и сборов). Бонус будет перечислен вам в течение 30–60 дней после получения оплаты.</string>
+    <string name="referral_share_invitation_link">Поделиться ссылкой-приглашением</string>
+    <string name="referral_view_terms_and_conditions">Посмотреть условия и положения</string>
+    <string name="referral_invitation_message_content">Здравствуйте! Думаю, это может быть полезно для вас: Threema Work — отличный вариант для безопасного делового общения. Вот тестовая ссылка: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d контакт</item>
         <item quantity="few">%d контакта</item>

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

@@ -2,11 +2,11 @@
 <resources>
     <string name="webclient_qr_scan_error">Неправильные данные QR-кода</string>
     <string name="webclient_init_session">Начать новую сессию</string>
-    <string name="webclient_sessions_really_delete">Удалить эту сессию ПК/web?</string>
+    <string name="webclient_sessions_really_delete">Удалить эту сессию Desktop/Web?</string>
     <string name="webclient_last_usage">Последнее использование: %s</string>
     <string name="webclient_created_at">Создано: %1$s (%2$s)</string>
     <string name="webclient_active_since">Активно с: %s</string>
-    <string name="webclient_enable">Включить приложение для ПК/web-клиент</string>
+    <string name="webclient_enable">Включить приложение Desktop/Web</string>
     <string name="webclient_no_sessions_found">Для подключения загрузите приложение для ПК (<b>https://threema.com/download</b>) или откройте web-клиент (<b>%s</b>) на компьютере и нажмите кнопку ниже, чтобы считать QR-код с экрана компьютера.</string>
     <string name="webclient_session_rename">Переименовать сессию</string>
     <string name="webclient_session_label">Новое имя</string>
@@ -17,25 +17,25 @@
     <string name="webclient_unnamed_session">Безымянная сессия</string>
     <string name="webclient_session_remove">Удалить сессию</string>
     <string name="webclient_welcome_title">Общайтесь с вашего компьютера!</string>
-    <string name="webclient_welcome_explain">Приложение для ПК и web-клиент позволяют общаться с компьютера или ноутбука, давая вам полный доступ ко всем контактам, мультимедиа и чатам.\n\n<b>Все коммуникации между телефоном и компьютером защищены сквозным шифрованием</b> и используют прямое подключение, если телефон и компьютер находятся в одной сети.\n\nОбратите внимание: приложение для ПК/web-клиент может вызвать дополнительный разряд батареи, пока сессия активна. Вы можете включить или отключить приложение в любое время.</string>
-    <string name="webclient_launch">Запустить приложение для ПК/web-клиент</string>
+    <string name="webclient_welcome_explain">Приложение Desktop/Web позволяют общаться с компьютера или ноутбука, давая вам полный доступ ко всем контактам, мультимедиа и чатам.\n\n<b>Все коммуникации между телефоном и компьютером защищены сквозным шифрованием</b> и используют прямое подключение, если телефон и компьютер находятся в одной сети.\n\nОбратите внимание: приложение Desktop/Web может вызвать дополнительный разряд батареи, пока сессия активна. Вы можете включить или отключить приложение в любое время.</string>
+    <string name="webclient_launch">Запустить приложение Desktop/Web</string>
     <string name="webclient_qr_scan_message">Считайте QR-код с экрана компьютера.</string>
     <string name="webclient_invalid_qr_code">Неправильный QR-код</string>
-    <string name="webclient_new_connection_toast">Сессия приложения для ПК/web-клиента запущена</string>
+    <string name="webclient_new_connection_toast">Сессия приложения Desktop/Web запущена</string>
     <string name="webclient_protocol_error">Ошибка протокола</string>
-    <string name="webclient_protocol_version_to_old">Ваше приложение не поддерживает данную версию приложения для ПК/web-клиента. Обновите Threema для Android до последней версии.</string>
-    <string name="webclient_protocol_version_too_new_selfhosted">Ваше приложение не поддерживает данную версию данную версию приложения для ПК/web-клиента. Загрузите последнюю версию приложения для ПК или попросите администратора web-клиента перейти на последнюю версию.</string>
-    <string name="webclient_protocol_version_too_new_threema">Ваше приложение не поддерживает данную версию приложения для ПК/web-клиента. Используйте более новую версию приложения для ПК/web-клиента.</string>
+    <string name="webclient_protocol_version_to_old">Ваше приложение не поддерживает данную версию приложения Desktop/Web. Обновите Threema для Android до последней версии.</string>
+    <string name="webclient_protocol_version_too_new_selfhosted">Ваше приложение не поддерживает данную версию данную версию приложения Desktop/Web. Загрузите последнюю версию приложения для ПК или попросите администратора web-клиента перейти на последнюю версию.</string>
+    <string name="webclient_protocol_version_too_new_threema">Ваше приложение не поддерживает данную версию приложения Desktop/Web. Используйте более новую версию приложения Desktop/Web.</string>
     <string name="webclient_session_already_exists">Сессия, соответствующая считанному вами QR-коду, уже существует. Перезапустите приложение для ПК или перезагрузите web-клиент и повторите попытку.</string>
     <string name="webclient_really_start_webclient_by_payload_body">Запустить эту сессию?</string>
     <string name="webclient_cannot_restore">Невозможно восстановить сессию</string>
-    <string name="webclient_disabled">Приложение для ПК/web-версия не активированы</string>
+    <string name="webclient_disabled">Приложение Desktop/Web не активированы</string>
     <string name="webclient_cannot_start">Невозможно запустить сессию</string>
     <string name="webclient_constrained_by_mdm">Сервер не утверждён администратором.</string>
     <string name="webclient_clear_all_sessions">Очистить все сессии</string>
     <string name="webclient_clear_all_sessions_confirm">Остановить и удалить все сессии?</string>
     <string name="webclient_prefs_debug_tool_summary">Запустите это средство для диагностики неполадок с настройкой соединения с приложением для ПК или web-клиентом</string>
-    <string name="webclient_diagnostics">Диагностика приложения для ПК/web-клиента</string>
+    <string name="webclient_diagnostics">Диагностика приложения Desktop/Web</string>
     <string name="webclient_diagnostics_start">Пуск</string>
     <string name="webclient_diagnostics_intro">Нажмите кнопку «Пуск» для запуска теста</string>
     <string name="webclient_diagnostics_done">Готово! Если у вас возникают неполадки с настройкой соединения с приложением для ПК или web-клиентом, отправьте данные в службу поддержки Threema.</string>

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

@@ -164,11 +164,9 @@
     <string name="backup_sum">Exportovať vaše ${app_name_short} ID</string>
     <string name="backup_and_delete">Záloha a odstránenie</string>
     <string name="delete_id_title">Vymazať ID</string>
-    <string name="delete_id_message">Pokiaľ ste nevytvorili zálohu alebo neexportovali a neuložili kópiu tohto ID, už nikdy nebudete môcť odosielať ani prijímať správy s týmto ID.\n\nAk už toto ID nechcete používať, odporúčame nastaviť heslo na zrušenie ${app_name_short} ID a pred odstránením tohto ID ho odvolať na stránke myid.threema.ch/revoke.</string>
     <string name="delete_id_message2">Posledné varovanie: naozaj chcete z tohto zariadenia vymazať vaše ID?</string>
     <string name="delete_id_sum">Z tohto zariadenia sa natrvalo odstráni vaše ID a všetky údaje aplikácie ${app_name_short}</string>
     <string name="delete_all_data_prompt">Odstrániť všetky údaje aplikácie?</string>
-    <string name="backup_password_summary">Export vášho ${app_name_short} ID bude zašifrovaný heslom. Použite kombináciu písmen, číslic a symbolov. Nezabudnite, čo sem zadáte!</string>
     <string name="backup_password_again_summary">Vložte heslo znovu</string>
     <string name="password_hint">Heslo</string>
     <string name="generating_backup_data">Generujú sa údaje zálohy</string>
@@ -189,7 +187,6 @@ alebo naskenovať QR kód pomocou iného zariadenia.</string>
     <string name="prefs_title_masterkey_passphrase">Heslo</string>
     <string name="setting_masterkey_passphrase">Zadanie hesla hlavného kľúča</string>
     <string name="masterkey_passphrase_title">Heslo hlavného kľúča</string>
-    <string name="masterkey_passphrase_summary">Zadajte heslo pre ochranu hlavného kľúča. Toto heslo bude nutné zadať po každom reštarte aplikácie ${app_name_short}.</string>
     <string name="masterkey_passphrase_again_summary">Vložte heslo znovu</string>
     <string name="masterkey_passphrase_hint">Heslo</string>
     <string name="master_key_locked_want_exit">Hlavný kľúč je stále uzamknutý. Chcete to skúsiť znovu?</string>
@@ -538,8 +535,6 @@ Naplánujte udalosti, vytvorte prieskum, alebo sa niečo spýtajte svojich priat
     <string name="qr_code">QR kód</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="really_leave_id_export">Pokiaľ ste tak ešte neurobili, uložte si váš vyexportovaný ID textový reťazec alebo jemu zodpovedajúci QR kód na bezpečné miesto, alebo si ho vytlačte. Bez tejto zálohy nebude možné váš ${app_name_short} ID obnoviť.</string>
-    <string name="revocation_key_title">Zrušenie ${app_name_short} ID</string>
-    <string name="revocation_key_not_set">Heslo pre zrušenie ${app_name_short} ID nenastavené</string>
     <string name="revocation_key_set_at">Heslo nastavené %1$s</string>
     <string name="prefs_sum_remove_wallpapers">Vymazať všetky individuálne tapety</string>
     <string name="prefs_title_remove_wallpapers">Odstrániť všetky tapety</string>
@@ -703,7 +698,6 @@ Už ich nebude možné obnoviť.</string>
     <string name="new_wizard_info_fingerprint">Posúvaním prstom po displeji vytvoríte náhodné údaje (tzv. entropia), které sa použijú k vygenerovaniu páru šifrovacích kľúčov zviazaných s vaším ${app_name_short} ID. Dvojica šifrovacích kľúčov sa skládá z <b>verejného kľúča</b>, ktorý je distribuovaný vaším priateľom a zo <b>súkromého kľúča</b>, ktorý je bezpečne uložený len vo vašom zariadení. Správy, ktoré vám odošlú vaši priatelia budú zašifrované vaším verejným kľúčom. Tieto správy môže dešifrovať iba ten, kto vlastní súkromný kľúč, nikto iný.</string>
     <string name="new_wizard_info_id">Vytvorili jste dvojicu šifrovacích kľúčov. Verejný kľúč bol bezpečne prenesený na naše servery. Súkromný kľúč nikdy neopustí vaše zariadenie. Tým je zaistené, že nikto nepovolaný se nebude môcť dostať k vašim správam.</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">Pokiaľ túto možnosť povolíte, odošlú sa jednosmerne šifrované (hashe) emailové adresy a telefónne čísla na náš server. Tu sa porovnajú s kontaktmi ostatných užívateľov. Neukladáme žiadne údaje z vášho adresára.</string>
     <string name="new_wizard_info_sync_contacts_dialog">Synchronizácia kontaktov vám pomôže automaticky nájsť priateľov. Ak súhlasíte, telefónne čísla a emailové adresy z vášho telefónneho zoznamu budú zašifrované pred tým, než sa odošlu náš server z dôvodu porovnania zodpovedajúcich kontaktov. Absolútne žiadne údaje nebudú uložené ani zdieľané.\n\nChcete povoliť synchronizáciu kontaktov?</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">Poskytnutím svojho telefónneho čísla a emailovej adresy môže ${app_name} pomôcť vašim priateľom automaticky vás nájsť, ak vás majú v adresári svojho telefónu. Údaje sa uložia do jednosmerne šifrovanej (hashovanej) forme na našom serveri. Tento krok môžete jednoducho preskočiť, ak chcete používať službu ${app_name_short} úplne anonymne.</string>
@@ -808,7 +802,6 @@ 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>
-    <string name="threema_channel_intro">Kanál ${app_name_short} je informačný kanál aplikácie ${app_name_short}, ktorý vás formou správ informuje o všetkých novinkách. Chcete sa prihlásiť k odberu kanálu a pridať ho medzi kontakty? Je zadarmo a môžete sa z neho kedykoľvek odhlásiť.</string>
     <string name="quote">Citovať</string>
     <string name="contacts_deleted">Kontakty boli vymazané</string>
     <string name="take_photo">Odfotiť</string>
@@ -999,7 +992,6 @@ Vykonajte prosím zálohú vašich údajov vhodnou metódou.</string>
     <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">Zadajte ${app_name_short} ID, ktoré chcete obnoviť</string>
-    <string name="safe_search_id_title">Zadajte prosím mobilné číslo, alebo emailovú adresu prepojenú s vašim 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">Vyhľadáva sa ${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. -->
@@ -1592,7 +1584,6 @@ Vykonajte prosím zálohú vašich údajov vhodnou metódou.</string>
     <string name="status_orphaned_group">*Táto skupina je zastaralá*\nTvorca skupiny opustil skupinu a tá už nemôže byť ďalej udržiavaná. Jeden zo zostávajúcich členov môže skupinu klonovať (prostredníctvom podrobností o skupine) a stať sa novým správcom.</string>
     <string name="group_not_a_member_notice">Už nie ste súčasťou tejto skupiny a nemôžete ju ďalej používať.</string>
     <string name="group_dissolved_notice">Táto skupina bola rozpustená a už sa nedá používať.</string>
-    <string name="md_linked_devices">Prepojené zariadenia</string>
     <string name="md_link_device">Pripojiť nové zariadenie</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 -->

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

@@ -375,7 +375,8 @@ tekrar denemeden önce girdiğiniz numaranın doğru olduğundan ve mobil ağa b
     <string name="prefs_sum_blocked_contacts">Burada listelenen kimliklerden gelen mesajlar yok sayılacak.</string>
     <string name="verified">Doğrulandı</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="want_to_add_to_exclude_list">Bu kişi, telefonunuzun adres defterindeki bir kayda bağlıdır. Eğer  uygulamadan silerseniz, eşitlemeden sonra yeniden görünüyor olacaktır. Eşitlemeden hariç tutmak ister misiniz?</string>
+    <string name="want_to_add_to_exclude_list">Bu kişi, telefonunuzun adres defterindeki bir kayda bağlıdır. Eğer
+${app_name_short} uygulamasında silerseniz, kişi senkronizasyonundan sonra tekrar görünecektir.\nSenkronizasyondan hariç tutmak ister misiniz?</string>
     <string name="no">Hayır</string>
     <string name="yes">Evet</string>
     <string name="deleting_contact">Kişi siliniyor</string>
@@ -410,7 +411,7 @@ tekrar denemeden önce girdiğiniz numaranın doğru olduğundan ve mobil ağa b
     <string name="prefs_sum_fullscreen_ime_on">Cihazınız yatay durumda ise klavye uygulamayı kapsar</string>
     <string name="prefs_sum_fullscreen_ime_off">Yer varsa, klavyenin üzerinde sohbetin bir ön izlemesini görüntüle</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="add_acount_from_within_threema">${app_name_short} kimliğinizi uygulama içinden yönetin</string>
+    <string name="add_acount_from_within_threema">${app_name_short} uygulamasının içinden ${app_name_short} ID\'nizi yönetin.</string>
     <string name="save_image">Resmi kaydet</string>
     <string name="share_image">Resmi paylaş</string>
     <string name="view_in_gallery">Galeride görüntüle</string>
@@ -721,7 +722,7 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <!-- 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. -->
     <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 telefon numarası girmediniz. Arkadaşlarınızın kişi listelerinde görünmezsiniz. ${app_name}\'ı tamamen anonim şekilde kullanmak istiyor musunuz?</string>
+    <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>
     <string name="new_wizard_scan_id_backup">ya da dışa aktarılan kimliğin kare kodunu tarayın</string>
     <string name="error_saving_file">Dosya kaydedilirken hata oluştu. İzinleri kontrol edin.</string>
     <string name="wait_one_minute">Lütfen arama talebinde bulunmadan önce kısa mesajın gelmesi için en az 10 dakika bekleyin.</string>
@@ -805,7 +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>
-    <string name="threema_channel_intro">Threema Kanalı, uygulama hakkında her şeyi size haber verir. Bu kanala abone olmak ve kişilerinize eklemek ister misiniz? Ücretsizdir ve istediğiniz zaman abonelikten çıkabilirsiniz.</string>
+    <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>
     <string name="take_photo">Fotoğraf çek</string>
@@ -1000,7 +1001,7 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <string name="safe_id_lookup">${app_name_short} kimliği aranıyor</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_no_id_found">${app_name_short} kimliği bulunamadı</string>
-    <string name="safe_no_backup_found">Sunucuda yedek bulunamadı. Lütfen ${app_name_short} kimliğini ve şifreyi kontrol edin.</string>
+    <string name="safe_no_backup_found">Sunucuda yedekleme bulunamadı. Kimlik ve şifreyi kontrol edin.</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_select_id">Birden fazla ${app_name_short} kimliği bulundu. Lütfen kullanılacak kimliği seçin:</string>
     <string name="safe_backup_now">Şimdi yedekle</string>
@@ -1044,7 +1045,7 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <string name="safe_restore">${app_name_short} Safe\'i geri yükle</string>
     <string name="backup_restore_in_progress">Yedekleme veya geri yükleme devam ediyor. Son durum için bildirimleri kontrol edin</string>
     <string name="restore_error_body">Geri yükleme başarıyla tamamlanmadı</string>
-    <string name="forgot_your_id">${app_name_short} kimliğinizi mi unuttunuz?</string>
+    <string name="forgot_your_id">Kimliğinizi mi unuttunuz?</string>
     <string name="restore_success_body">Geri yükleme başarıyla tamamlandı</string>
     <string name="work_data_sync">Veri eşitlemesi</string>
     <string name="private_contact">Özel kişi</string>
@@ -1506,7 +1507,7 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <string name="call_phone_permission_description">${app_name_short} aramalarını gerçekleştirmek için, başka bir aramanın ${app_name_short} aramasını ne zaman kesintiye uğrattığını algılamak için telefon izni gerekmektedir.</string>
     <string name="group_call_nearby_devices_permission_description">Bluetooth kulaklıkla grup araması yapmak için, \"yakındaki cihazlar\"ın bluetooth kulaklıkları algılamasına izin vermeniz gerekmektedir.</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">Bluetooth kulaklıkla ${app_name} aramaları gerçekleştirmek için, \"yakındaki cihazlar\"ın bluetooth kulaklıkları algılamasına izin vermeniz gerekmektedir.</string>
+    <string name="call_nearby_devices_permission_description">Bluetooth kulaklık kullanarak ${app_name_short} aramaları gerçekleştirmek için, \"yakındaki cihazlar\" izninin Bluetooth kulaklıkları algılamasına izin vermeniz gerekir.</string>
     <string name="settings">Ayarlar</string>
     <string name="leave">Ayrıl</string>
     <string name="fs_key_mismatch">anahtar uyuşmazlığı</string>
@@ -1522,7 +1523,7 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <string name="forward_security_explanation">Mükemmel İletme Gizliliği (Perfect Forward Secrecy) (PFS), uzun süreli şifreleme anahtarı ele geçirilmiş olsa bile kaydedilmiş bir iletişimi geriye dönük şifre çözme işleminden korur.\n\nHer iki taraftaki uygulama PFS\'yi destekliyorsa bu seçenek etkinleştirilebilir.</string>
     <string name="group_call_inactivity_left">Hareketsizlik nedeniyle grup araması sonlandırıldı</string>
     <string name="missing_permission_external_storage">Dosya kopyalanamıyor. Aşağıdaki adımları deneyin:\n1. Ayarlar uygulamasını açın.\n2. \"Uygulamalar\"a gidin ve \"Özel uygulama erişimi\"ni seçin.\n3. “Tüm dosyalara erişim” seçeneğine dokunun.\n4. Sağ üst köşedeki üç noktaya dokunun ve \"Sistemi göster\"i seçin.\n5. \"Harici Depolama\" üzerine dokunun ve \"Tüm dosyaları yönetmek için erişime izin ver\" seçeneğinin verildiğinden emin olun.\n6. Yedeği tekrar geri yüklemeyi deneyin.</string>
-    <string name="forward_security_downgraded_status_message">Sohbet ortağınızın uygulama sürümü desteklemediği için Mükemmel İletme Gizliliği bu görüşmede devre dışı bırakıldı.</string>
+    <string name="forward_security_downgraded_status_message">Bu sohbette Mükemmel İleri Gizlilik özelliği devre dışı bırakıldı çünkü sohbet ortağınızın uygulama sürümü bunu desteklemiyor veya Masaüstü için ${app_name_desktop} 2.0 (beta) kullanılıyor.</string>
     <string name="forward_security_illegal_session_status_message">Mükemmel İletme Gizliliği oturumu geçersizlik nedeniyle sıfırlandı.</string>
     <string name="crop_image_title">Görüntüyü kırp</string>
     <string name="scroll_to_bottom">Aşağı kaydır</string>
@@ -1587,7 +1588,6 @@ 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">Bağlantılı cihazlar</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 -->
@@ -1785,6 +1785,23 @@ sunucularımıza güvenli bir şekilde iletildi. Kişisel anahtar hiçbir zaman
     <string name="remote_secret_deactivating">${remote_secret}\'u Etkinleştirme</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">${remote_secret} devre dışı bırakılamadı. Lütfen internet bağlantınızı kontrol edip tekrar deneyin.</string>
+    <string name="referral_banner_title">Tavsiye Edin ve Faydalanın</string>
+    <string name="referral_banner_body">Arkadaşlarınızı şirketlerinde Threema Work\'ü kullanmaya davet edin ve yönlendirme bonusu kazanın!</string>
+    <string name="referral_screen_title">Tavsiye Edin ve Faydalanın</string>
+    <string name="referral_screen_subtitle">ilk şirketin ilk fatura tutarının %10\'una kadar komisyon kazanın.</string>
+    <string name="referral_how_it_works_title">Nasıl Çalışır?</string>
+    <string name="referral_how_it_works_referral_title">Yönlendirme</string>
+    <string name="referral_how_it_works_referral_body">Bir arkadaşınızı veya şirketini Threema Work\'e katılmaya davet edin. Referansınızın dikkate alınabilmesi için kayıt sırasında veya lisans satın alırken Threema kimliğinizi belirtmeniz önemlidir.</string>
+    <string name="referral_how_it_works_requirements_title">Gereksinimler</string>
+    <string name="referral_how_it_works_requirements_body">Bahsi geçen şirket halihazırda müşterimiz olmamalı ve lisans siparişi vermelidir.</string>
+    <string name="referral_how_it_works_confirmation_title">Onay</string>
+    <string name="referral_how_it_works_confirmation_body">Referansınızın doğru bir şekilde atanıp doğrulanabilmesi için ödeme yapmadan önce sizinle iletişime geçeceğiz. Doğrulama işlemi tamamlanır tamamlanmaz sizi bilgilendireceğiz.</string>
+    <string name="referral_your_reward_title">Ödülünüz</string>
+    <string name="referral_your_reward_subtitle">Referans Bonusu Kazanın</string>
+    <string name="referral_your_reward_body">Referansınız karşılığında, yönlendirdiğiniz şirketin ilk fatura tutarının %10\'unu (vergi/ücretler hariç) bonus olarak alacaksınız. Bonus, ödemenin alınmasından 30-60 gün sonra hesabınıza aktarılacaktır.</string>
+    <string name="referral_share_invitation_link">Davet Bağlantısını Paylaş</string>
+    <string name="referral_view_terms_and_conditions">Şartlar ve Koşulları Görüntüle</string>
+    <string name="referral_invitation_message_content">Merhaba, bunun sizin için faydalı olabileceğini düşündüm: Threema iş, güvenli iş iletişimi için mükemmel bir seçenektir. İşte test bağlantınız: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d kişi</item>
         <item quantity="other">%d kişi</item>

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

@@ -758,7 +758,7 @@
     <!-- 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. -->
     <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">Ви не зв\'язали номер телефону чи адресу ел. пошти зі своїм ID ${app_name_short}, а тому не з\'явитесь у списках контактів інших людей. Справді використовувати ${app_name} анонімно?</string>
+    <string name="new_wizard_anonymous_confirm_phone_only">Ви не зв\'язали номер телефону\tз ID ${app_name_short}, а тому не з\'явитесь у списках контактів своїх друзів. Справді використовувати ${app_name} анонімно?</string>
     <string name="new_wizard_scan_id_backup">Відсканувати QR-код</string>
     <string name="error_saving_file">Не вдалося зберегти файл. Перевірте дозволи.</string>
     <string name="wait_one_minute">Якщо SMS не надійде протягом 10 хвилин, зробіть запит на дзвінок.</string>
@@ -842,7 +842,7 @@
     <string name="really_reset_ringtones">Скинути налаштування звуку сповіщень до значень за умовчанням?</string>
     <string name="reset_ringtones_confirm">Налаштування звуку сповіщень скинуто.</string>
     <string name="prefs_language_override">Мова</string>
-    <string name="threema_channel_intro">Канал Threema Channel публікує всі новини, пов\'язані з Threema. Підписатися на Threema Channel і додати цей канал у контакти? Це безкоштовно, і ви завжди зможете відписатися.</string>
+    <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>
     <string name="take_photo">Зробити фото</string>
@@ -1015,7 +1015,7 @@
     <string name="safe_learn_more_button">Докладніше</string>
     <string name="safe_enable_explain">Усе, що потрібно для спілкування, зберігається лише на вашому пристрої. Ми не створюємо облікові записи користувачів і не зможемо допомогти, якщо ви втратите пристрій або випадково видалите свої дані.\n\n${app_name_short} Safe автоматично й анонімно зберігає найважливіші дані, зокрема ваші ключі, список контактів та інформацію про участь у групах (але не самі повідомлення), у вигляді резервних копій на вибраному вами безпечному сервері.</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_disable_confirm">Продовжити без ${app_name_short} Safe? За допомогою цієї функції ви зможете відновити ID ${app_name_short}, контакти та групи, якщо втратите доступ до свого пристрою.</string>
+    <string name="safe_disable_confirm">Продовжити без ${app_name_short} Safe? За допомогою цієї функції ви зможете відновити ID ${app_name_short}, контакти та групи із ${app_name_short} Safe, якщо втратите доступ до свого пристрою.</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_configure_choose_password">Установіть надійний пароль. Він знадобиться вам, щоб відновити резервну копію ${app_name_short} Safe.</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1049,7 +1049,7 @@
     <string name="safe_delete_success">Резервну копію видалено із сервера</string>
     <string name="safe_error_preparing">Не вдалося підготувати резервну копію ${app_name_short} Safe</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_configure_choose_password_force">Установіть надійний пароль, щоб захистити свій ID в ${app_name_short} Safe. Запам\'ятайте цей пароль!</string>
+    <string name="safe_configure_choose_password_force">Установіть надійний пароль, щоб захистити свій ID ${app_name_short} за допомогою ${app_name_short} Safe. Запам\'ятайте цей пароль!</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_deactivate">Вимкнути ${app_name_short} Safe</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -1149,7 +1149,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">Коли в меню \"Безпека\" ввімкнено функцію \"Блокувати додаток\", ми приховуємо вміст ${app_name_short} та блокуємо зйомку екрана задля конфіденційності</string>
     <string name="work_select_categories">Виберіть категорії</string>
     <string name="my_profile">Мій профіль</string>
     <string name="message_too_long">Повідомлення задовге. Неможливо надіслати.</string>
@@ -1230,7 +1230,7 @@
     <string name="message_id">ID повідомлення</string>
     <string name="mime_type">Тип MIME</string>
     <string name="password_does_not_comply">Пароль не відповідає вимогам, які встановив адміністратор.</string>
-    <string name="audio_mute_due_to_focus_loss">Звук ${app_name_short} тимчасово вимкнено через відтворення звуку в іншому додатку</string>
+    <string name="audio_mute_due_to_focus_loss">Звук тимчасово вимкнено через відтворення звуку в іншому додатку</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="restore_data_backup_explain">Щоб відновити дані з резервної копії, спершу видаліть свій ID ${app_name_short} на екрані \"Мій профіль\".\n\nКоли додаток перезапуститься, натисніть \"Відновити з рез. копії\" &gt; \"Інші варіанти відновлення\" &gt; \"Резервне копіювання\" і виберіть файл резервної копії, з якого потрібно відновити дані.</string>
     <string name="audio_focus_loss_complete">Виклик завершено через відтворення звуку в іншому додатку.</string>
@@ -1572,7 +1572,7 @@
     <string name="prefs_dynamic_colors">Динамічний колір</string>
     <string name="prefs_dynamic_colors_sum">Використовувати кольори системи</string>
     <string name="apply_changes">Застосувати зміни</string>
-    <string name="prefs_threema_work_summary">Шукаєте рішення для робочого спілкування? Натисніть тут, щоб дізнатися більше про Threema Work.</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="vm_fg_service_not_allowed">Помилка відтворення голосового повідомлення</string>
@@ -1825,6 +1825,23 @@
     <string name="remote_secret_deactivating">Вимкнення ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">Не вдалося вимкнути ${remote_secret}. Перевірте інтернет-з\'єднання і повторіть спробу.</string>
+    <string name="referral_banner_title">Отримайте винагороду за рекомендацію</string>
+    <string name="referral_banner_body">Порекомендуйте друзям використовувати Threema Work у компанії та отримайте бонус!</string>
+    <string name="referral_screen_title">Отримайте винагороду за рекомендацію</string>
+    <string name="referral_screen_subtitle">Отримайте до 10 % від суми першого рахунка залученої компанії.</string>
+    <string name="referral_how_it_works_title">Як це працює</string>
+    <string name="referral_how_it_works_referral_title">Рекомендація</string>
+    <string name="referral_how_it_works_referral_body">Порекомендуйте друзям або їхній компанії приєднатися до Threema Work. Щоб рекомендацію було зараховано, обов\'язково попросіть їх указати ваш ID Threema під час реєстрації або придбання ліцензій.</string>
+    <string name="referral_how_it_works_requirements_title">Вимоги</string>
+    <string name="referral_how_it_works_requirements_body">Компанія, якій ви надсилаєте рекомендацію, має замовити ліцензії і бути нашим новим клієнтом</string>
+    <string name="referral_how_it_works_confirmation_title">Підтвердження</string>
+    <string name="referral_how_it_works_confirmation_body">Щоб правильно присвоїти та перевірити вашу рекомендацію, ми зв\'яжемося з вами перед здійсненням оплати. Вас буде поінформовано, щойно ми завершимо перевірку.</string>
+    <string name="referral_your_reward_title">Ваша винагорода</string>
+    <string name="referral_your_reward_subtitle">Отримайте бонус за рекомендацію</string>
+    <string name="referral_your_reward_body">За рекомендацію ви отримаєте до 10 % від суми першого рахунка залученої компанії (не враховуючи податки та комісії). Ми нарахуємо ваш бонус протягом 30–60 днів після отримання оплати.</string>
+    <string name="referral_share_invitation_link">Поділитися посиланням-запрошенням</string>
+    <string name="referral_view_terms_and_conditions">Переглянути Умови та положення</string>
+    <string name="referral_invitation_message_content">Вітаю! Пропоную використовувати Threema Work — чудове рішення для безпечного бізнес-спілкування. Ось посилання на нього: %1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="one">%d контакт</item>
         <item quantity="few">%d контакти</item>

+ 37 - 20
app/src/main/res/values-zh-rCN/strings.xml

@@ -15,9 +15,9 @@
     <string name="title_invite_friend">邀请朋友</string>
     <string name="invite_via">通过…邀请朋友</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="invite_email_body">您好,\n\n我使用%1$s,这是保护用户隐私的安全即时通讯工具。\n\n我的${app_name_short} ID:https://threema.id/%2$s\n\n让我们通过%1$s进行通信吧!\n\n\n谨启</string>
+    <string name="invite_email_body">您好,\n\n我使用 %1$s,这是保护用户隐私的安全即时通讯工具。\n\n我的 ${app_name_short} ID:https://threema.id/%2$s\n\n让我们通过%1$s进行通信吧!\n\n\n谨启</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="invite_sms_body">嗨!让我们使用%1$s以安全和符合隐私的方式进行交流!我的${app_name_short} ID:https://threema.id/%2$s</string>
+    <string name="invite_sms_body">嗨!让我们使用 %1$s 以安全和符合隐私的方式进行交流!我的 ${app_name_short} ID:https://threema.id/%2$s</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="invite_email_subject">${app_name_short},保护隐私的安全通讯工具。</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -166,7 +166,7 @@
     <string name="delete_id_title">删除ID</string>
     <string name="delete_id_message">除非您已创建备份或导出并保存了此ID的副本,否则您将永远无法使用该ID再次发送或接收消息。\n\n如果您不想再使用此ID,建议在删除ID之前,在 myid.threema.ch/revoke 上设置撤销密码并撤销该ID。</string>
     <string name="delete_id_message2">最后警告:您确定要删除此设备上的ID吗?</string>
-    <string name="delete_id_sum">永久删除您的ID和此设备上的所有数据</string>
+    <string name="delete_id_sum">永久删除您的 ${app_name_short} ID和此设备上的所有数据</string>
     <string name="delete_all_data_prompt">删除所有应用数据?</string>
     <string name="backup_password_summary">您的ID导出将使用密码进行加密。使用字母,数字和符号的组合。请牢牢记住这里输入的内容!</string>
     <string name="backup_password_again_summary">再次输入密码</string>
@@ -178,8 +178,7 @@
 电子邮件分享或使用其他设备扫描二维码。</string>
     <string name="support">帮助</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="backup_share_content">以下文本字符串可以与所选密码一起使用,以
-        恢复您的 ${app_name_short} ID。</string>
+    <string name="backup_share_content">以下文本字符串可以与所选密码一起使用,以恢复您的 ${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="backup_share_subject">${app_name_short} ID 导出为</string>
     <string name="add_attachment">新附件</string>
@@ -386,7 +385,7 @@
     <string name="verified">已验证</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="want_to_add_to_exclude_list">此联系人已链接到手机通讯录中的记录。如果您
-在 ${app_name_short} 中将其删除,在联系人同步之后他会重新出现。 \n是否要从同步中排除他?</string>
+        在 ${app_name_short} 中将其删除,在联系人同步之后他会重新出现。 \n是否要从同步中排除他?</string>
     <string name="no">否</string>
     <string name="yes">是</string>
     <string name="deleting_contact">正在删除联系人</string>
@@ -441,7 +440,6 @@
     <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 将在后台持续地与服务器连接。如果您的设备启用了电池优化,这可能会干扰后台连接,${app_name_short} Push 将可能无法可靠地运行。</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. -->
@@ -515,7 +513,8 @@ http://www.7-zip.org 或 https://itunes.apple.com/us/app/the-unarchiver/id425424
     <string name="ballot_no_ballots_yet">还没有人投票。</string>
     <string name="print">打印</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="ballot_wizard0_explain">您可以直接用 ${app_name_short} 快速创建在线投票,例如安排活动、创建调查问卷或向您的朋友问任何问题。</string>
+    <string name="ballot_wizard0_explain">您可以直接用 ${app_name_short} 快速创建在线投票,例如安排活动、创建
+        调查问卷或向您的朋友问任何问题。</string>
     <string name="ballot_add_choices">添加答案</string>
     <string name="blocked_cannot_send">您无法向被屏蔽的联系人发送信息</string>
     <string name="invalid_some_cannot_send">无法选择发送到某些收件人。</string>
@@ -715,24 +714,27 @@ ${app_name_short} 支持的所有表情符号。</string>
     <string name="new_wizard_phone_email_invalid">您输入的电话号码或电子邮件地址无效。\n请先更正,然后再继续。</string>
     <string name="new_wizard_phone_invalid">您输入的电话号码无效。\n请先更正,然后再继续。</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_fingerprint">通过移动手指,您可以创建随机数据(称为熵),该数据用于生成与全新而唯一的 ${app_name_short} ID 关联的密钥对。该密钥对包括一个的<b>公钥</b>分配给您的朋友,而<b>私钥</b>安全地存储在您的手机上。您的朋友将使用您的公钥加密发送给您的消息。只有私钥的擁有者才能解密这些消息,其他人都不能解密。</string>
+    <string name="new_wizard_info_fingerprint">通过移动手指,您可以创建随机数据(称为熵),该数据用于生成
+        与全新而唯一的 ${app_name_short} ID 关联的密钥对。该密钥对包括一个的<b>公钥</b>分配给您的朋友,
+        而<b>私钥</b>安全地存储在您的手机上。您的朋友将使用您的公钥加密发送给您的消息。
+        只有私钥的擁有者才能解密这些消息,其他人都不能解密。</string>
     <string name="new_wizard_info_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="new_wizard_info_sync_contacts">如果启用此选项,${app_name_short} 会将电子邮件地址和电话号码单向加密(散列),
-然后再将其发送到服务器以查找匹配的联系人。我们不会存储任何地址簿数据。</string>
+        然后再将其发送到服务器以查找匹配的联系人。我们不会存储任何地址簿数据。</string>
     <string name="new_wizard_info_sync_contacts_dialog">联系人同步可以帮助您找到您的朋友。如果选择同意,电话簿中的电话号码和电邮地址将先以加密的形式发送到我们的服务器,来查找匹配的联系人。我们绝对不会存储或分享任何数据。\n\n是否要启用联系人同步?</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">通过提供您的电话号码和电子邮件地址,${app_name_short} 可以帮助您的朋友 自动在您的电话通讯录中找到您。数据将以 单向加密(散列)形式存储在我们的服务器上。如果您想 完全匿名使用 ${app_name},则可以跳过此步骤。</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_link_phone_only">通过提供您的电话号码,${app_name_short} 可以帮助您的朋友
-自动在您的电话通讯录中找到您。该号码将以
-单向加密(散列)形式存储在我们的服务器上。如果您想
-完全匿名使用 ${app_name_short},则可以跳过此步骤。</string>
+        自动在您的电话通讯录中找到您。该号码将以
+        单向加密(散列)形式存储在我们的服务器上。如果您想
+        完全匿名使用 ${app_name_short},则可以跳过此步骤。</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_nickname">昵称用於设备上的推送通知,向尚未将您存储在通讯录的用户识别您的身份。
-我们建议仅提供您的名字或化名作为昵称。
-如果您未设置昵称,在默认情况下,我们将使用您的 ${app_name_short} ID。</string>
+        我们建议仅提供您的名字或化名作为昵称。
+        如果您未设置昵称,在默认情况下,我们将使用您的 ${app_name_short} ID。</string>
     <string name="not_linked">未链接</string>
     <string name="linked">已链接</string>
     <string name="pending_sms_verification_notice">您的手机号码尚未验证。</string>
@@ -747,7 +749,7 @@ ${app_name_short} 支持的所有表情符号。</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. -->
     <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">您没有输入手机号码链接到\n${app_name_short} ID。您将不会出现在朋友的联系人列表中。您确定要匿名使用 ${app_name} 吗?</string>
+    <string name="new_wizard_anonymous_confirm_phone_only">您没有输入手机号码链接到${app_name_short} ID。您将不会出现在朋友的联系人列表中。您确定要匿名使用 ${app_name} 吗?</string>
     <string name="new_wizard_scan_id_backup">或扫描ID导出的二维码</string>
     <string name="error_saving_file">保存文件时出错。请检查权限。</string>
     <string name="wait_one_minute">请求通话前,请至少等待10分钟,直至短信到达。</string>
@@ -980,7 +982,6 @@ ${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">${app_name_short} 网页版/桌面版会话运行时的通知</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>
@@ -1528,12 +1529,12 @@ ${app_name_short} 支持的所有表情符号。</string>
     <string name="group_call_mic_permission_description">如要进行群组通话,您必须允许访问麦克风的权限,以便其他人可以听到您的声音。</string>
     <string name="call_mic_permission_description">如要进行语音通话,您必须允许访问麦克风权限,以便其他人可以听到您的声音。</string>
     <string name="group_call_camera_permission_rationale">为了让其他参与者看到您的照片,您必须在系统 “权限” 设置下允许 %s 访问相机权限。</string>
-    <string name="group_call_phone_permission_description">如要进行群组通话,您必须允许访问电话权限,来防止语音通话中断 ${app_name_short} 通话。</string>
+    <string name="group_call_phone_permission_description">如要进行群组通话,您必须允许访问电话权限,来防止语音通话中断群组通话。</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">如要进行 ${app_name_short} 通话,您必须允许访问电话权限,来防止语音通话中断 ${app_name_short} 通话。</string>
     <string name="group_call_nearby_devices_permission_description">如要使用蓝牙耳机进行群组通话,您必须允许访问 “附近设备” 权限来检测蓝牙耳机。</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">如要使用蓝牙耳机进行 ${app_name} 通话,您必须允许访问 “附近设备” 权限来检测蓝牙耳机。</string>
+    <string name="call_nearby_devices_permission_description">如要使用蓝牙耳机进行 ${app_name_short} 通话,您必须允许访问 “附近设备” 权限来检测蓝牙耳机。</string>
     <string name="settings">设置</string>
     <string name="leave">退出</string>
     <string name="fs_key_mismatch">密钥不匹配</string>
@@ -1549,7 +1550,6 @@ ${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">因为对方使用的应用程序版本不支持 “完全正向保密” 功能,所以在此会话中已禁用 “完全正向保密” 。</string>
     <string name="forward_security_illegal_session_status_message">这个之前已启用 “完全正向保密” 的会话,因无效而被重置保密状态。</string>
     <string name="crop_image_title">裁剪图片</string>
     <string name="scroll_to_bottom">回到底部</string>
@@ -1811,6 +1811,23 @@ ${app_name_short} 支持的所有表情符号。</string>
     <string name="remote_secret_deactivating">正在停用 ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">停用 ${remote_secret} 失败,请检查您的互联网连接并重试。</string>
+    <string name="referral_banner_title">推荐奖励</string>
+    <string name="referral_banner_body">邀请您的朋友在公司中使用 Threema Work,即可获得推荐奖励!</string>
+    <string name="referral_screen_title">推荐奖励</string>
+    <string name="referral_screen_subtitle">最高可获得被招募公司首张发票金额的10%作为佣金。</string>
+    <string name="referral_how_it_works_title">运作原理</string>
+    <string name="referral_how_it_works_referral_title">推荐</string>
+    <string name="referral_how_it_works_referral_body">邀请好友或其公司加入 Threema Work。请注意:在注册或购买许可证时必须提供您的 Threema ID,以便我们计算您的推荐奖励。</string>
+    <string name="referral_how_it_works_requirements_title">要求</string>
+    <string name="referral_how_it_works_requirements_body">被推荐的公司不可以是我们已有的客户,并且必须订购许可证。</string>
+    <string name="referral_how_it_works_confirmation_title">确认</string>
+    <string name="referral_how_it_works_confirmation_body">为确保您的推荐奖励能够正确分配和验证,我们将在付款前与您联系。一旦验证流程完成,我们将立即通知您。</string>
+    <string name="referral_your_reward_title">你的奖励</string>
+    <string name="referral_your_reward_subtitle">赚取推荐奖励</string>
+    <string name="referral_your_reward_body">您将获得被推荐公司首张发票金额的10%作为推荐奖励(不含税费/杂费),奖金将在收到款项后30至60天内转入您的账户。</string>
+    <string name="referral_share_invitation_link">分享邀请链接</string>
+    <string name="referral_view_terms_and_conditions">查看条款及细则</string>
+    <string name="referral_invitation_message_content">你好,我推荐您使用这款即时通讯软件:Threema Work 是企业安全通信的绝佳选择。这是您的试用链接:%1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="other">%d个联系人</item>
     </plurals>

+ 37 - 18
app/src/main/res/values-zh-rTW/strings.xml

@@ -15,9 +15,9 @@
     <string name="title_invite_friend">邀請好友</string>
     <string name="invite_via">透過…邀請好友</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="invite_email_body">你好,\n\n我使用%1$s,這是保護使用者隱私的安全即時通訊工具。\n\n我的${app_name_short} ID:https://threema.id/%2$s\n\n讓我們透過%1$s進行通訊吧!\n\n\n關心您</string>
+    <string name="invite_email_body">你好,\n\n我使用 %1$s ,這是保護使用者隱私的安全即時通訊工具。\n\n我的 ${app_name_short} ID:https://threema.id/%2$s\n\n讓我們透過 %1$s 進行通訊吧!\n\n\n關心您</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="invite_sms_body">嘿!讓我們使用%1$s以安全和符合隱私的方式進行通訊!我的 ${app_name_short} ID:https://threema.id/%2$s</string>
+    <string name="invite_sms_body">嘿!讓我們使用 %1$s 以安全和符合隱私的方式進行通訊!我的 ${app_name_short} ID:https://threema.id/%2$s</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="invite_email_subject">${app_name_short},保護隱私的安全即時通訊工具。</string>
     <!-- ${app_name_short} is a placeholder for the app's name, e.g. "Threema". It must be left as-is and not translated. -->
@@ -167,7 +167,7 @@
     <string name="delete_id_title">刪除ID</string>
     <string name="delete_id_message">除非您已建立備份或匯出並儲存了此ID的副本,否則您將永遠無法使用該ID再次傳送或接收訊息。\n\n如果您不想再使用此ID,建議在刪除ID之前,在 myid.threema.ch/revoke 上設定撤銷密碼並撤銷該ID。</string>
     <string name="delete_id_message2">最後警告:您確定要刪除此裝置上的ID嗎?</string>
-    <string name="delete_id_sum">永久刪除您的ID和此裝置上的所有資料</string>
+    <string name="delete_id_sum">永久刪除您的 ${app_name_short} ID和此裝置上的所有資料</string>
     <string name="delete_all_data_prompt">刪除所有應用程式資料?</string>
     <string name="backup_password_summary">您的ID匯出將使用密碼進行加密。使用字母,數字和符號的組合。千萬不能忘記這裡輸入的內容!</string>
     <string name="backup_password_again_summary">再次輸入密碼</string>
@@ -179,8 +179,7 @@
 電子郵件分享或使用其他裝置掃描QR碼。</string>
     <string name="support">説明</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="backup_share_content">以下文字字串可以與所選密碼一起使用
-        ,以還原您的 ${app_name_short} ID。</string>
+    <string name="backup_share_content">以下文字字串可以與所選密碼一起使用,以還原您的 ${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="backup_share_subject">${app_name_short} ID 匯出為</string>
     <string name="add_attachment">新增附件</string>
@@ -386,7 +385,7 @@
     <string name="verified">已驗證</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="want_to_add_to_exclude_list">此聯絡人已連結至電話通訊錄中的記錄。如果您
-在 ${app_name_short} 中將其刪除,在聯絡人同步之後他會重新出現。 \n是否要從同步中排除他?</string>
+        在 ${app_name_short} 中將其刪除,在聯絡人同步之後他會重新出現。 \n是否要從同步中排除他?</string>
     <string name="no">否</string>
     <string name="yes">是</string>
     <string name="deleting_contact">正在刪除聯絡人</string>
@@ -441,7 +440,6 @@
     <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 將在背景持續地與伺服器連線。如果您的裝置啟用了電池最佳化,這可能會干擾背景連線,${app_name_short} Push 將可能無法可靠地執行。</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. -->
@@ -515,7 +513,8 @@ http://www.7-zip.org 或 https://itunes.apple.com/us/app/the-unarchiver/id425424
     <string name="ballot_no_ballots_yet">還沒有人投票。</string>
     <string name="print">列印</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="ballot_wizard0_explain">您可以直接用 ${app_name_short} 快速建立線上投票,例如安排活動、建立問卷調查或向好友問任何問題。</string>
+    <string name="ballot_wizard0_explain">您可以直接用 ${app_name_short} 快速建立線上投票,例如安排活動、建立
+        問卷調查或向好友問任何問題。</string>
     <string name="ballot_add_choices">新增答案</string>
     <string name="blocked_cannot_send">您無法將訊息傳送給被封鎖的聯絡人</string>
     <string name="invalid_some_cannot_send">無法選擇傳送至某些收件者。</string>
@@ -715,23 +714,27 @@ ${app_name_short} 支援的所有表情符號。</string>
     <string name="new_wizard_phone_email_invalid">您輸入的電話號碼或電子郵件地址無效。\n請先更正,然後再繼續。</string>
     <string name="new_wizard_phone_invalid">您輸入的電話號碼無效。\n請先更正,然後再繼續。</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_fingerprint">透過移動手指,您可以建立隨機資料(稱為熵),該資料用於生成與全新而唯一的 ${app_name_short} ID 相關的金鑰對。該金鑰對包括一個<b>公鑰</b>,分配給您的好友,而<b>私鑰</b>安全地儲存在您的電話上。您的好友將使用您的公鑰加密傳送給您的訊息。只有私鑰的擁有者才能解密這些訊息,其他人都不能解密。</string>
+    <string name="new_wizard_info_fingerprint">透過移動手指,您可以建立隨機資料(稱為熵),該資料用於生成
+        與全新而唯一的 ${app_name_short} ID 相關的金鑰對。該金鑰對包括一個<b>公鑰</b>,分配給您的好友,
+        而<b>私鑰</b>安全地儲存在您的電話上。您的好友將使用您的公鑰加密傳送給您的訊息。
+        只有私鑰的擁有者才能解密這些訊息,其他人都不能解密。</string>
     <string name="new_wizard_info_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="new_wizard_info_sync_contacts">如果開啟此選項,${app_name_short} 會將電子郵件地址和電話號碼單向加密(雜湊),
-然後將其傳送到伺服器以尋找相符的聯絡人。我們不會儲存任何通訊錄資料。</string>
+        然後將其傳送到伺服器以尋找相符的聯絡人。我們不會儲存任何通訊錄資料。</string>
     <string name="new_wizard_info_sync_contacts_dialog">聯絡人同步可以協助您找到您的好友。如果選擇同意,電話簿中的電話號碼和電郵地址將先以加密的形式傳送到我們的伺服器,來尋找相符的聯絡人。我們絕對不會儲存或分享任何資料。\n\n是否要開啟聯絡人同步?</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">透過提供您的電話號碼和電子郵件地址,${app_name_short} 可以協助您的好友自動在您的電話通訊錄中找到您。\n資料將以單向加密(雜湊)形式儲存在我們的伺服器上。\n如果您想完全匿名使用 ${app_name},則可以跳過此步驟。</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_link_phone_only">透過提供您的電話號碼,${app_name_short} 可以協助您的好友自動在您的電話通訊錄中找到您。
-電話號碼將單向加密(雜湊)形式儲存在我們的伺服器上。
-如果您想完全匿名使用 ${app_name_short},則可以跳過此步驟。</string>
+    <string name="new_wizard_info_link_phone_only">透過提供您的電話號碼,${app_name_short} 可以協助您的好友
+        自動在您的電話通訊錄中找到您。
+        電話號碼將單向加密(雜湊)形式儲存在我們的伺服器上。
+        如果您想完全匿名使用 ${app_name_short},則可以跳過此步驟。</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_nickname">暱稱用於裝置上的推播通知,或向尚未將您儲存在通訊錄的使用者識別您的身份。
-我們建議您僅提供您的名字或化名作為暱稱。
-如果您未設定暱稱,在預設情況下,我們將使用您的 ${app_name_short} ID。</string>
+        我們建議您僅提供您的名字或化名作為暱稱。
+        如果您未設定暱稱,在預設情況下,我們將使用您的 ${app_name_short} ID。</string>
     <string name="not_linked">尚未連結</string>
     <string name="linked">已連結</string>
     <string name="pending_sms_verification_notice">您的電話號碼尚未驗證。</string>
@@ -830,7 +833,7 @@ ${app_name_short} 支援的所有表情符號。</string>
     <string name="really_reset_ringtones">真的將通知音效設定重設為預設值嗎?</string>
     <string name="reset_ringtones_confirm">通知音效設定已重設。</string>
     <string name="prefs_language_override">語言</string>
-    <string name="threema_channel_intro">Threema 頻道為您提供關於 Threema 的所有新聞。您想訂閱 Threema 頻道並將其新增到您的聯絡人中嗎?這是免費的,您可以隨時退訂。</string>
+    <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>
@@ -1532,7 +1535,7 @@ ${app_name_short} 支援的所有表情符號。</string>
     <string name="call_phone_permission_description">如要進行 ${app_name_short} 通話,您必須允許取用電話權限,以防止語音通話中斷 ${app_name_short} 通話。</string>
     <string name="group_call_nearby_devices_permission_description">如要使用藍牙耳機進行群組通話,您必須允許取用「鄰近裝置」權限以檢測藍牙耳機。</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">如要使用藍牙耳機進行 ${app_name} 通話,您必須允許取用「鄰近裝置」權限以檢測藍牙耳機。</string>
+    <string name="call_nearby_devices_permission_description">如要使用藍牙耳機進行 ${app_name_short} 通話,您必須允許取用「鄰近裝置」權限以檢測藍牙耳機。</string>
     <string name="settings">設定</string>
     <string name="leave">離開</string>
     <string name="fs_key_mismatch">密鑰不相符</string>
@@ -1548,7 +1551,6 @@ ${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">因為對方使用的應用程式版本不支援「完全正向保密」功能,所以在此對話中已停用「完全正向保密」。</string>
     <string name="forward_security_illegal_session_status_message">這個之前已啟用「完全正向保密」的工作階段,因無效而被重設保密狀態。</string>
     <string name="crop_image_title">裁剪圖片</string>
     <string name="scroll_to_bottom">回到頁尾</string>
@@ -1810,6 +1812,23 @@ ${app_name_short} 支援的所有表情符號。</string>
     <string name="remote_secret_deactivating">正在停用 ${remote_secret}</string>
     <!-- Error message shown fullscreen when deactivating the DualLock (a.k.a. "Remote Secret") feature failed. ${remote_secret} is a placeholder for a feature name, e.g. "DualLock". It must be left as-is and not translated. -->
     <string name="remote_secret_deactivating_failed">停用 ${remote_secret} 失敗,請檢查您的網路連線並再試一次。</string>
+    <string name="referral_banner_title">推薦獎金</string>
+    <string name="referral_banner_body">邀請您的好友在公司使用 Threema Work,即可賺取推薦獎金!</string>
+    <string name="referral_screen_title">推薦獎金</string>
+    <string name="referral_screen_subtitle">最高可取得被招募公司首張發票金額的10%作為佣金。</string>
+    <string name="referral_how_it_works_title">運作原理</string>
+    <string name="referral_how_it_works_referral_title">推薦</string>
+    <string name="referral_how_it_works_referral_body">邀請好友或其公司加入 Threema Work。請注意:在註冊或購買授權時必須提供您的 Threema ID,以便我們計算您的推薦獎勵。</string>
+    <string name="referral_how_it_works_requirements_title">要求</string>
+    <string name="referral_how_it_works_requirements_body">被推薦的公司不可以是我們已有的客戶,並且必須訂購許可證。</string>
+    <string name="referral_how_it_works_confirmation_title">確認</string>
+    <string name="referral_how_it_works_confirmation_body">為確保您的推薦獎勵能夠正確分配和驗證,我們會在付款前與您聯絡。一旦驗證過程完成,我們會立即通知您。</string>
+    <string name="referral_your_reward_title">您的獎勵</string>
+    <string name="referral_your_reward_subtitle">賺取推薦獎勵</string>
+    <string name="referral_your_reward_body">您將獲得被推薦公司首張發票金額的10%作為推薦獎勵(不包括稅費/費用),獎金將在收到款項後30至60天內轉入您的帳戶。</string>
+    <string name="referral_share_invitation_link">分享邀請連結</string>
+    <string name="referral_view_terms_and_conditions">檢視條款及細則</string>
+    <string name="referral_invitation_message_content">您好,我推薦您使用這款即時通訊軟體:Threema Work 是企業安全通訊的絕佳選擇。這是您的試用連結:%1$s</string>
     <plurals name="contacts_counter_label">
         <item quantity="other">%d位聯絡人</item>
     </plurals>

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

@@ -753,10 +753,10 @@
     <string name="status_ballot_user_modified_vote">“%1$s” has changed the vote for “%2$s”</string>
     <string name="status_ballot_all_votes">Votes for “%1$s” complete</string>
     <string name="restore">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">You have entered neither a mobile number nor an email address to link to your ${app_name_short} ID. You will not appear on contact lists. Do you really want to use ${app_name} anonymously?</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">You have not entered a phone number or an email address to link to your ${app_name_short} ID. You will therefore not automatically be added to contact lists. Do you really want to use ${app_name} anonymously?</string>
+    <string name="new_wizard_anonymous_confirm_phone_only">You have not entered a phone number to link to your ${app_name_short} ID. You will therefore not automatically be added to contact lists. Do you really want to use ${app_name} anonymously?</string>
     <string name="new_wizard_scan_id_backup">Or scan the QR code of your ID export</string>
     <string name="error_saving_file">Some files could not be saved</string>
     <string name="wait_one_minute">Please wait for at least 10 minutes for the SMS to arrive before requesting a call.</string>
@@ -840,7 +840,8 @@
     <string name="really_reset_ringtones">Really reset notification sound settings to defaults?</string>
     <string name="reset_ringtones_confirm">Notification sound settings have been reset.</string>
     <string name="prefs_language_override">Language</string>
-    <string name="threema_channel_intro">Threema Channel provides you with news about all things Threema. Would you like to subscribe to Threema Channel and add it to your contacts? It’s free and you can unsubscribe at any time.</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 provides you with news about all things ${app_name_short}. Would you like to subscribe to ${app_name_short} Channel and add it to your contacts? It’s free and you can unsubscribe at any time.</string>
     <string name="quote">Quote</string>
     <string name="contacts_deleted">Contacts have been deleted</string>
     <string name="take_photo">Take photo</string>
@@ -1856,7 +1857,7 @@
     <string name="referral_your_reward_body">For your referral, you will receive 10% of the first invoice amount of the recruited company (excluding taxes/fees). The bonus will be transferred to you 30–60 days after receipt of payment.</string>
     <string name="referral_share_invitation_link">Share Invitation Link</string>
     <string name="referral_view_terms_and_conditions">View Terms &amp; Conditions</string>
-    <string name="referral_invitation_message_content">Hey! Try Threema Work for free with this invitation link: %1$s</string>
+    <string name="referral_invitation_message_content">Hi, I thought this could be useful for you: Threema Work is an excellent option for secure business communication. Here’s your test link: %1$s</string>
 
     <plurals name="contacts_counter_label">
         <item quantity="one">%d contact</item>

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

@@ -8,6 +8,7 @@
     <string name="webclient_info_url" translatable="false">https://threema.com/threema-web</string>
     <string name="privacy_policy_url" translatable="false">https://threema.com/privacy_policy/?lang=%1$s&amp;version=%2$s&amp;theme=%3$s&amp;platform=android</string>
     <string name="terms_of_service_url" translatable="false">https://threema.com/tos/?lang=%1$s&amp;version=%2$s&amp;theme=%3$s&amp;platform=android</string>
+    <string name="referral_terms_of_service_url" translatable="false">https://threema.com/referral-tos/?lang=%1$s&amp;theme=%2$s</string>
     <string name="eula_url" translatable="false">https://threema.com/eula/?lang=%1$s&amp;version=%2$s&amp;theme=%3$s&amp;platform=android</string>
     <string name="support_url" translatable="false">https://threema.com/android/support/</string>
     <!-- The marketing name of the remote secret feature -->

+ 6 - 0
app/src/test/java/ch/threema/app/tasks/TaskArchiverTest.kt

@@ -39,6 +39,9 @@ import kotlin.test.assertTrue
 class TaskArchiverTest {
     private val serviceManagerMock = mockk<ServiceManager>()
 
+    // For this test we do not need to log debug info of tasks
+    private val getDebugString: Task<*, *>.() -> String = { "" }
+
     @Test
     fun `old task encoding is recovered`() {
         val oldTaskEncoding = "oldTaskEncoding"
@@ -58,6 +61,7 @@ class TaskArchiverTest {
         val taskArchiver = TaskArchiverImpl(
             taskArchiveFactory = taskArchiveFactoryMock,
             taskRecoveryManager = taskRecoveryManagerMock,
+            getDebugString = getDebugString,
         )
 
         taskArchiver.setServiceManager(serviceManagerMock)
@@ -84,6 +88,7 @@ class TaskArchiverTest {
         val taskArchiver = TaskArchiverImpl(
             taskArchiveFactory = taskArchiveFactoryMock,
             taskRecoveryManager = taskRecoveryManagerMock,
+            getDebugString = getDebugString,
         )
 
         taskArchiver.setServiceManager(serviceManagerMock)
@@ -123,6 +128,7 @@ class TaskArchiverTest {
         val taskArchiver = TaskArchiverImpl(
             taskArchiveFactory = taskArchiveFactoryMock,
             taskRecoveryManager = taskRecoveryManagerMock,
+            getDebugString = getDebugString,
         )
 
         taskArchiver.setServiceManager(serviceManagerMock)

+ 2 - 1
domain/src/main/java/ch/threema/domain/protocol/connection/csp/socket/CspSocket.kt

@@ -161,11 +161,12 @@ internal class CspSocket(
     private suspend fun writeOutput(outputStream: OutputStream) {
         while (!ioProcessingStopped) {
             val data = outbound.take()
-            logger.debug("Write {} bytes to output", data.size)
+            logger.info("Sending {} bytes to output stream", data.size)
             runInterruptible(Dispatchers.IO) {
                 outputStream.write(data)
                 outputStream.flush()
             }
+            logger.info("Sent {} bytes to output stream", data.size)
         }
     }
 

+ 7 - 2
domain/src/main/java/ch/threema/domain/protocol/connection/d2m/socket/D2mSocket.kt

@@ -144,8 +144,13 @@ internal class D2mSocket(
     private suspend fun writeOutput() {
         while (!ioProcessingStopped) {
             val data = outbound.take()
-            logger.debug("Write {} bytes to output", data.size)
-            webSocket!!.send(data.toByteString())
+            logger.info("Sending {} bytes to web socket", data.size)
+            val successfullyEnqueued = webSocket!!.send(data.toByteString())
+            if (successfullyEnqueued) {
+                logger.info("Sent {} bytes successfully to web socket", data.size)
+            } else {
+                logger.warn("Failed to send {} bytes to web socket", data.size)
+            }
         }
     }
 

+ 1 - 1
domain/src/main/java/ch/threema/domain/protocol/connection/layer/CspFrameLayer.kt

@@ -34,8 +34,8 @@ private val logger = ConnectionLoggingUtil.getConnectionLogger("CspFrameLayer")
 
 internal class CspFrameLayer : Layer1Codec {
     override val encoder: PipeProcessor<OutboundL2Message, ByteArray, Unit> = MappingPipe {
-        logger.trace("Handle outbound message of type `{}`", it.type)
         if (it is ByteContainer) {
+            logger.info("Encoding ByteContainer of type={}, {} bytes", it.type, it.bytes.size)
             it.bytes
         } else {
             throw ServerConnectionException("OutboundL2Message has invalid type `${it.type}`")

+ 2 - 1
domain/src/main/java/ch/threema/domain/protocol/connection/layer/D2mFrameLayer.kt

@@ -29,6 +29,7 @@ import ch.threema.domain.protocol.connection.ServerConnectionException
 import ch.threema.domain.protocol.connection.data.D2mContainer
 import ch.threema.domain.protocol.connection.data.InboundL1Message
 import ch.threema.domain.protocol.connection.data.OutboundL2Message
+import ch.threema.domain.protocol.connection.data.toHex
 import ch.threema.domain.protocol.connection.socket.ServerSocketCloseReason
 import ch.threema.domain.protocol.connection.util.ConnectionLoggingUtil
 
@@ -36,8 +37,8 @@ private val logger = ConnectionLoggingUtil.getConnectionLogger("D2mFrameLayer")
 
 internal class D2mFrameLayer : Layer1Codec {
     override val encoder: PipeProcessor<OutboundL2Message, ByteArray, Unit> = MappingPipe {
-        logger.trace("Handle outbound message of type `{}`", it.type)
         if (it is D2mContainer) {
+            logger.info("Encoding D2mContainer with payloadType={}, {} bytes", it.payloadType.toHex(), it.bytes.size)
             it.bytes
         } else {
             throw ServerConnectionException("OutboundL2Message has invalid type `${it.type}`")

+ 1 - 1
domain/src/main/java/ch/threema/domain/protocol/connection/layer/EndToEndLayer.kt

@@ -96,7 +96,7 @@ internal class EndToEndLayer(
 
         CoroutineScope(outputDispatcher).launch {
             val l5Message = mapMessage(message)
-            logger.debug("Send outbound message of type `{}`", l5Message.type)
+            logger.info("Queuing outbound message of type `{}`", l5Message.type)
             outbound.send(l5Message)
         }
     }

+ 4 - 2
domain/src/main/java/ch/threema/domain/protocol/connection/layer/MultiplexLayer.kt

@@ -113,8 +113,8 @@ internal class MultiplexLayer(private val controller: ServerConnectionController
      * not required for further processing (will be passed on as a [CspFrame]).
      * Note: The conversion to a [CspLoginMessage] or a [CspFrame] will be completed in [handleInboundCspMessage].
      *
-     * When the [ch.threema.domain.protocol.connection.CspConnection] is used, the differentiation between
-     * login messages and frames is already performed in the [ch.threema.domain.protocol.connection.socket.CspSocket].
+     * When the [ch.threema.domain.protocol.connection.csp.CspConnection] is used, the differentiation between
+     * login messages and frames is already performed in the [ch.threema.domain.protocol.connection.csp.socket.CspSocket].
      */
     private fun getCspDataFromD2mProxyMessage(container: D2mContainer): CspData {
         if (container.payloadType != D2mPayloadType.PROXY) {
@@ -167,10 +167,12 @@ internal class MultiplexLayer(private val controller: ServerConnectionController
         } else {
             data
         }
+        logger.info("Sending outbound CspData of type {}", outboundData.type)
         outbound.send(outboundData)
     }
 
     private fun handleOutboundD2mMessage(message: OutboundD2mMessage) {
+        logger.info("Sending outbound D2mMessage of type `{}`", message.type)
         outbound.send(message.toContainer())
     }
 }

+ 13 - 3
domain/src/main/java/ch/threema/domain/taskmanager/IncomingMessageTaskQueue.kt

@@ -25,12 +25,14 @@ import ch.threema.base.utils.getThreemaLogger
 import ch.threema.domain.protocol.connection.data.CspMessage
 import ch.threema.domain.protocol.connection.data.InboundD2mMessage
 import ch.threema.domain.protocol.connection.data.InboundMessage
+import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.channels.Channel
 
 private val logger = getThreemaLogger("IncomingMessageTaskQueue")
 
 internal class IncomingMessageTaskQueue(
     private val incomingMessageProcessor: IncomingMessageProcessor,
+    private val getDebugString: Task<*, *>.() -> String,
 ) {
     /**
      * True if an incoming message task is currently being executed.
@@ -160,9 +162,17 @@ internal class IncomingMessageTaskQueue(
 
         override suspend fun run(handle: TaskCodec) {
             logger.info("Running task {}", task.getDebugString())
-            task.invoke(handle)
+            try {
+                task.invoke(handle)
+            } catch (e: Exception) {
+                when (e) {
+                    is CancellationException -> logger.info("Cancelled task {}", task.getDebugString())
+                    else -> logger.warn("Stopped task {} exceptionally", task.getDebugString())
+                }
+                throw e
+            }
             isCompleted = true
-            logger.info("Completed task {}", task.getDebugString())
+            logger.info("Completed task {} successfully", task.getDebugString())
             // Note that we do not need to set 'hasRunningTask' to false here. It suffices to set it
             // to false if 'getNextOrNull' returns null.
         }
@@ -170,7 +180,7 @@ internal class IncomingMessageTaskQueue(
         override fun isCompleted() = isCompleted
 
         override suspend fun completeExceptionally(exception: Throwable) {
-            logger.warn("Completing task {} exceptionally", task.getDebugString(), exception)
+            logger.warn("Completed task {} exceptionally", task.getDebugString(), exception)
             isCompleted = true
             // Note that we do not need to set 'hasRunningTask' to false here. It suffices to set it
             // to false if 'getNextOrNull' returns null.

+ 16 - 4
domain/src/main/java/ch/threema/domain/taskmanager/LocalTaskQueue.kt

@@ -23,6 +23,7 @@ package ch.threema.domain.taskmanager
 
 import ch.threema.base.utils.getThreemaLogger
 import ch.threema.domain.protocol.connection.socket.ServerSocketCloseReason
+import kotlinx.coroutines.CancellationException
 import kotlinx.coroutines.CompletableDeferred
 import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.sync.Mutex
@@ -30,7 +31,10 @@ import kotlinx.coroutines.sync.withLock
 
 private val logger = getThreemaLogger("LocalTaskQueue")
 
-internal class LocalTaskQueue(private val taskArchiver: TaskArchiver) {
+internal class LocalTaskQueue(
+    private val taskArchiver: TaskArchiver,
+    private val getDebugString: Task<*, *>.() -> String,
+) {
     /**
      * The mutex is required to access [taskQueue].
      */
@@ -94,8 +98,16 @@ internal class LocalTaskQueue(private val taskArchiver: TaskArchiver) {
 
         override suspend fun run(handle: TaskCodec) {
             logger.info("Running task {}", task.getDebugString())
-            done.complete(task.invoke(handle))
-            logger.info("Completed task {}", task.getDebugString())
+            try {
+                done.complete(task.invoke(handle))
+            } catch (e: Exception) {
+                when (e) {
+                    is CancellationException -> logger.info("Cancelled task {}", task.getDebugString())
+                    else -> logger.warn("Stopped task {} exceptionally", task.getDebugString())
+                }
+                throw e
+            }
+            logger.info("Completed task {} successfully", task.getDebugString())
             mutex.withLock {
                 taskQueue.remove(this)
                 taskArchiver.removeTask(task)
@@ -105,7 +117,7 @@ internal class LocalTaskQueue(private val taskArchiver: TaskArchiver) {
         override fun isCompleted() = done.isCompleted
 
         override suspend fun completeExceptionally(exception: Throwable) {
-            logger.warn("Completing task {} exceptionally", task.getDebugString(), exception)
+            logger.warn("Completed task {} exceptionally", task.getDebugString(), exception)
             done.completeExceptionally(exception)
             mutex.withLock {
                 taskQueue.remove(this)

+ 6 - 5
domain/src/main/java/ch/threema/domain/taskmanager/Task.kt

@@ -34,12 +34,13 @@ interface Task<out R, in TaskCodecType> {
      * The type of the task. This is only used for logging purposes.
      */
     val type: String
-}
 
-/**
- * Get the task as debug string. This is only used for debugging.
- */
-fun <R, T> Task<R, T>.getDebugString(): String = "$type@${hashCode()}"
+    /**
+     * Tasks may provide some short information that will be appended to the [type] when logging the task.
+     */
+    val shortLogInfo: String?
+        get() = null
+}
 
 /**
  * An active task may send messages.

+ 6 - 1
domain/src/main/java/ch/threema/domain/taskmanager/TaskManager.kt

@@ -102,6 +102,7 @@ internal class TaskManagerImpl(
     taskArchiverCreator: () -> TaskArchiver,
     private val deviceCookieManager: DeviceCookieManager,
     private val dispatchers: TaskManagerDispatchers,
+    private val getDebugString: Task<*, *>.() -> String,
 ) : InternalTaskManager, TaskManager {
     private val queueSendCompleteListeners: MutableSet<QueueSendCompleteListener> = mutableSetOf()
 
@@ -112,7 +113,11 @@ internal class TaskManagerImpl(
      * tasks.
      */
     private val taskQueue by lazy {
-        TaskQueue(taskArchiverCreator(), dispatchers)
+        TaskQueue(
+            taskArchiver = taskArchiverCreator(),
+            dispatcherAsserters = dispatchers,
+            getDebugString = getDebugString,
+        )
     }
 
     /**

+ 11 - 9
domain/src/main/java/ch/threema/domain/taskmanager/TaskManagerProvider.kt

@@ -27,6 +27,7 @@ data class TaskManagerConfiguration(
     val taskArchiver: () -> TaskArchiver,
     val deviceCookieManager: DeviceCookieManager,
     val assertContext: Boolean,
+    val getDebugString: Task<*, *>.() -> String,
 )
 
 interface TaskManagerProvider {
@@ -34,18 +35,19 @@ interface TaskManagerProvider {
         @JvmStatic
         fun getTaskManager(configuration: TaskManagerConfiguration): TaskManager =
             TaskManagerImpl(
-                configuration.taskArchiver,
-                configuration.deviceCookieManager,
-                TaskManagerImpl.TaskManagerDispatchers(
-                    SingleThreadedTaskManagerDispatcher(
-                        configuration.assertContext,
-                        "ExecutorDispatcher",
+                taskArchiverCreator = configuration.taskArchiver,
+                deviceCookieManager = configuration.deviceCookieManager,
+                dispatchers = TaskManagerImpl.TaskManagerDispatchers(
+                    executorDispatcher = SingleThreadedTaskManagerDispatcher(
+                        assertContext = configuration.assertContext,
+                        threadName = "ExecutorDispatcher",
                     ),
-                    SingleThreadedTaskManagerDispatcher(
-                        configuration.assertContext,
-                        "ScheduleDispatcher",
+                    scheduleDispatcher = SingleThreadedTaskManagerDispatcher(
+                        assertContext = configuration.assertContext,
+                        threadName = "ScheduleDispatcher",
                     ),
                 ),
+                getDebugString = configuration.getDebugString,
             )
     }
 }

+ 9 - 2
domain/src/main/java/ch/threema/domain/taskmanager/TaskQueue.kt

@@ -32,6 +32,7 @@ import kotlinx.coroutines.runBlocking
 internal class TaskQueue(
     taskArchiver: TaskArchiver,
     private val dispatcherAsserters: TaskManagerImpl.TaskManagerDispatcherAsserters,
+    private val getDebugString: Task<*, *>.() -> String,
 ) {
     /**
      * A channel that allows the schedule dispatcher to notify the executor dispatcher that a new
@@ -44,7 +45,10 @@ internal class TaskQueue(
     /**
      * This queue contains the locally created tasks.
      */
-    private val localTaskQueue = LocalTaskQueue(taskArchiver)
+    private val localTaskQueue = LocalTaskQueue(
+        taskArchiver = taskArchiver,
+        getDebugString = getDebugString,
+    )
 
     /**
      * This queue contains the task created from inbound messages.
@@ -96,7 +100,10 @@ internal class TaskQueue(
     internal fun recreateIncomingMessageQueue(incomingMessageProcessor: IncomingMessageProcessor) {
         dispatcherAsserters.executorDispatcher.assertDispatcherContext()
 
-        incomingMessageQueue = IncomingMessageTaskQueue(incomingMessageProcessor)
+        incomingMessageQueue = IncomingMessageTaskQueue(
+            incomingMessageProcessor = incomingMessageProcessor,
+            getDebugString = getDebugString,
+        )
     }
 
     /**

+ 2 - 2
domain/src/main/java/ch/threema/domain/taskmanager/TaskRunner.kt

@@ -40,8 +40,8 @@ import kotlinx.coroutines.awaitCancellation
 import kotlinx.coroutines.delay
 import kotlinx.coroutines.isActive
 import kotlinx.coroutines.launch
-import kotlinx.coroutines.runBlocking
 import kotlinx.coroutines.sync.Semaphore
+import kotlinx.coroutines.withContext
 
 private val logger = getThreemaLogger("TaskRunner")
 
@@ -200,7 +200,7 @@ internal class TaskRunner(
         this.layer5Codec = layer5Codec
 
         // Clear incoming message queue to get rid of old unprocessed messages
-        runBlocking(executorCoroutineContext) {
+        withContext(executorCoroutineContext) {
             logger.info("Flushing incoming message queues")
             // As the connection just has been initiated, we will again receive un-acked messages
             taskQueue.recreateIncomingMessageQueue(incomingMessageProcessor)

+ 4 - 3
domain/src/test/java/ch/threema/domain/protocol/connection/CspConnectionTest.kt

@@ -143,15 +143,16 @@ internal class CspConnectionTest : ServerConnectionTest() {
         }
         val taskManager = TaskManagerProvider.getTaskManager(
             TaskManagerConfiguration(
-                {
+                taskArchiver = {
                     object : TaskArchiver {
                         override fun addTask(task: Task<*, TaskCodec>) {}
                         override fun removeTask(task: Task<*, TaskCodec>) {}
                         override fun loadAllTasks(): List<Task<*, TaskCodec>> = emptyList()
                     }
                 },
-                TestNoopDeviceCookieManager(),
-                true,
+                deviceCookieManager = TestNoopDeviceCookieManager(),
+                assertContext = true,
+                getDebugString = { "" },
             ),
         )
         return CspConnectionConfiguration(

+ 4 - 3
domain/src/test/java/ch/threema/domain/protocol/taskmanager/BypassTest.kt

@@ -209,16 +209,17 @@ class BypassTest {
     private fun createTaskManager() = TaskManagerImpl(
         { noopTaskArchiver },
         noopDeviceCookieManager,
-        TaskManagerImpl.TaskManagerDispatchers(
-            SingleThreadedTaskManagerDispatcher(
+        dispatchers = TaskManagerImpl.TaskManagerDispatchers(
+            executorDispatcher = SingleThreadedTaskManagerDispatcher(
                 assertContext = true,
                 threadName = "ExecutorDispatcher",
             ),
-            SingleThreadedTaskManagerDispatcher(
+            scheduleDispatcher = SingleThreadedTaskManagerDispatcher(
                 assertContext = true,
                 threadName = "ScheduleDispatcher",
             ),
         ),
+        getDebugString = { "" },
     )
 
     private fun createLayer5Codec(taskManager: InternalTaskManager): Layer5Codec =

+ 10 - 11
domain/src/test/java/ch/threema/domain/protocol/taskmanager/TaskExecutionTest.kt

@@ -22,7 +22,6 @@
 package ch.threema.domain.protocol.taskmanager
 
 import ch.threema.base.utils.getThreemaLogger
-import ch.threema.domain.protocol.connection.csp.DeviceCookieManager
 import ch.threema.domain.protocol.connection.layer.Layer5Codec
 import ch.threema.domain.protocol.connection.socket.ServerSocketCloseReason
 import ch.threema.domain.protocol.taskmanager.TaskExecutionTest.UnexpectedExceptionTask.UnexpectedException
@@ -32,7 +31,6 @@ import ch.threema.domain.taskmanager.PassiveTask
 import ch.threema.domain.taskmanager.PassiveTaskCodec
 import ch.threema.domain.taskmanager.ProtocolException
 import ch.threema.domain.taskmanager.SingleThreadedTaskManagerDispatcher
-import ch.threema.domain.taskmanager.TaskArchiver
 import ch.threema.domain.taskmanager.TaskManagerImpl
 import io.mockk.every
 import io.mockk.mockk
@@ -68,18 +66,19 @@ class TaskExecutionTest {
      * The task manager that is tested.
      */
     private val taskManager: TaskManagerImpl = TaskManagerImpl(
-        { mockk<TaskArchiver>(relaxed = true) },
-        mockk<DeviceCookieManager>(),
-        TaskManagerImpl.TaskManagerDispatchers(
-            SingleThreadedTaskManagerDispatcher(
-                true,
-                "ExecutorDispatcher",
+        taskArchiverCreator = { mockk(relaxed = true) },
+        deviceCookieManager = mockk(),
+        dispatchers = TaskManagerImpl.TaskManagerDispatchers(
+            executorDispatcher = SingleThreadedTaskManagerDispatcher(
+                assertContext = true,
+                threadName = "ExecutorDispatcher",
             ),
-            SingleThreadedTaskManagerDispatcher(
-                true,
-                "ScheduleDispatcher",
+            scheduleDispatcher = SingleThreadedTaskManagerDispatcher(
+                assertContext = true,
+                threadName = "ScheduleDispatcher",
             ),
         ),
+        getDebugString = { "" },
     )
 
     /**