mirror of
https://github.com/ArcaneChat/android.git
synced 2026-07-03 14:05:24 +02:00
Compare commits
130 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 12b6939e7e | |||
| 20487d9e96 | |||
| a1920e383a | |||
| 4d3856c012 | |||
| eb997eca00 | |||
| 8b5dd70d75 | |||
| 2868b51835 | |||
| 14f55ca6b1 | |||
| 96c8c21b78 | |||
| 9ab1b1f3a7 | |||
| 94a0e426f8 | |||
| 006f8ae826 | |||
| 3847e20d18 | |||
| fc69212a51 | |||
| 8999f54ba2 | |||
| f470e92300 | |||
| 3ac49e3e58 | |||
| 8dd9cfec5b | |||
| 0588214ee7 | |||
| 4ec49a031c | |||
| a31d7d6d3e | |||
| 64bbe9866d | |||
| 5d7ab84efc | |||
| 11f73a88e8 | |||
| dd0e847976 | |||
| 41d94ae3ee | |||
| df7d80319c | |||
| 134145d166 | |||
| 688a103c10 | |||
| e2efa1f913 | |||
| 15c60c6b12 | |||
| ee9a8dd53a | |||
| 0a55023bdb | |||
| fec9f8b4d3 | |||
| 7fa04dc3c0 | |||
| 9d4e0e4e21 | |||
| 473c28ab07 | |||
| de47feac40 | |||
| 84894ff538 | |||
| f254c35749 | |||
| d574d33596 | |||
| f6756fc34b | |||
| 7c27eb47fc | |||
| 8d5a55c24c | |||
| 2e9aa79b02 | |||
| 1f9264225b | |||
| 18e145faaf | |||
| 47cf70120a | |||
| 86451a00ff | |||
| 1e4c8bc291 | |||
| c45a47e53c | |||
| a07723d515 | |||
| 02d7a6fb1f | |||
| d62e8fa864 | |||
| a03fd337ef | |||
| 27c0f45430 | |||
| a0f1232261 | |||
| 5640d31080 | |||
| 1542fc67ca | |||
| a99a4ec85b | |||
| fa17b134cf | |||
| 6898a37704 | |||
| 45b6a5c565 | |||
| 7330e6ba39 | |||
| 8f405914a2 | |||
| 6d09a6f318 | |||
| b349a7e601 | |||
| 0d610895d2 | |||
| a65c677ecc | |||
| db93aeacc0 | |||
| 09ff0d888b | |||
| b9c5e741e8 | |||
| 620d86c903 | |||
| 14e31650e7 | |||
| 9848cb5847 | |||
| bf7db005ef | |||
| aa032dbb37 | |||
| 9e1b9775e2 | |||
| fcd16d9e32 | |||
| 2a4bd2a001 | |||
| eacd089c8f | |||
| 9ed355efd1 | |||
| d1bb25004d | |||
| 8d1b010d1b | |||
| 8a9b76af3a | |||
| 4bbd9428e3 | |||
| 83646003b6 | |||
| 947887f335 | |||
| 69631cd857 | |||
| 0722426425 | |||
| 98d54bbe6a | |||
| c1dc0cf127 | |||
| 44a1ce42f0 | |||
| a0c6cef0fa | |||
| f96e89956c | |||
| ce9ded9d8b | |||
| cb2d9f16ac | |||
| c2a13ae9dd | |||
| f8c2403e61 | |||
| 616b495426 | |||
| a22baa7fc3 | |||
| 0b9bb9ff76 | |||
| ef96192d8b | |||
| 13c34d9480 | |||
| 610f4cebc2 | |||
| d4d15eee7c | |||
| ee3886285b | |||
| a32c20473f | |||
| db956d93cf | |||
| 6a5a75131e | |||
| a676a47ed4 | |||
| 2067122d2c | |||
| 8a0fe892f4 | |||
| 29a6f4eb31 | |||
| f610592bff | |||
| 898008e2a1 | |||
| 9eaa3ca182 | |||
| c98818e5cf | |||
| 7643ecd90a | |||
| e4993bd302 | |||
| 32ee198128 | |||
| ab0d33b3c0 | |||
| 2c8b781817 | |||
| e59655c456 | |||
| 2ce7e5a3c7 | |||
| 79c7419b71 | |||
| 2efaf1df93 | |||
| 814ac7d976 | |||
| b0e5c1c634 | |||
| bae998f811 |
+23
-2
@@ -1,10 +1,31 @@
|
||||
# Delta Chat Android Changelog
|
||||
|
||||
## Unreleased
|
||||
## v2.40.0
|
||||
2026-02
|
||||
|
||||
* Improve switch speed when changing profiles
|
||||
* Allow to switch profile when sharing or forwarding
|
||||
* Display message views count for channel owners
|
||||
* Don't notify notification-to-all from in-chat apps if the chat is muted
|
||||
* Allow to see inbox quota for all relays in connectivity screen
|
||||
* Update to core 2.36.0
|
||||
* Truncate file names in the middle, not at the end; important information are more often at the end
|
||||
* Remove email address from user profile
|
||||
* Mark external links with " ↗" to make them clear
|
||||
* Make QR code larger on "Add Second Device" screen
|
||||
* Add indication for blocked contacts in user profile
|
||||
* Allow to start calls with video disabled
|
||||
* Show hint for empty contact search results
|
||||
* Fix: Show dialog if pasted QR codes are invalid
|
||||
* Fix: Refresh chat list when returning from conversation if selected profile changed
|
||||
* Fix: Update menu when using "select all" in contact selection
|
||||
* Fix: Avoid empty profiles after using "add as second device" from welcome screen
|
||||
* Fix: Remove from group deselected members in the contact selection list
|
||||
* Fix multi-device seen messages synchronization when using multiple relays
|
||||
* Fix mailto handling
|
||||
* Fix layout problems inside in-chat apps
|
||||
* Avoid crash when the app is minimized with profile switcher or reactions dialogs open
|
||||
* Remove "trash icon" option from contact selection list when adding members to group
|
||||
* Update to core 2.40.0
|
||||
|
||||
## v2.35.0
|
||||
2026-01
|
||||
|
||||
+2
-2
@@ -33,8 +33,8 @@ android {
|
||||
useLibrary 'org.apache.http.legacy'
|
||||
|
||||
defaultConfig {
|
||||
versionCode 30000736
|
||||
versionName "2.36.0"
|
||||
versionCode 30000737
|
||||
versionName "2.40.0"
|
||||
|
||||
applicationId "chat.delta.lite"
|
||||
multiDexEnabled true
|
||||
|
||||
+39
-3
@@ -153,6 +153,42 @@ static uint32_t* jintArray2uint32Pointer(JNIEnv* env, jintArray ja, int* ret_icn
|
||||
}
|
||||
|
||||
|
||||
/************************************************************
|
||||
* DcEventChannel
|
||||
************************************************************/
|
||||
|
||||
static dc_event_channel_t* get_dc_event_channel(JNIEnv *env, jobject obj)
|
||||
{
|
||||
static jfieldID fid = 0;
|
||||
if (fid==0) {
|
||||
jclass cls = (*env)->GetObjectClass(env, obj);
|
||||
fid = (*env)->GetFieldID(env, cls, "eventChannelCPtr", "J" /*Signature, J=long*/);
|
||||
}
|
||||
if (fid) {
|
||||
return (dc_event_channel_t*)(*env)->GetLongField(env, obj, fid);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jlong Java_com_b44t_messenger_DcEventChannel_createEventChannelCPtr(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return (jlong)dc_event_channel_new();
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void Java_com_b44t_messenger_DcEventChannel_unrefEventChannelCPtr(JNIEnv *env, jobject obj)
|
||||
{
|
||||
dc_event_channel_unref(get_dc_event_channel(env, obj));
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jlong Java_com_b44t_messenger_DcEventChannel_getEventEmitterCPtr(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return (jlong)dc_event_channel_get_event_emitter(get_dc_event_channel(env, obj));
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************
|
||||
* DcAccounts
|
||||
******************************************************************************/
|
||||
@@ -172,11 +208,11 @@ static dc_accounts_t* get_dc_accounts(JNIEnv *env, jobject obj)
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_createAccountsCPtr(JNIEnv *env, jobject obj, jstring dir)
|
||||
JNIEXPORT jlong Java_com_b44t_messenger_DcAccounts_createAccountsCPtr(JNIEnv *env, jobject obj, jstring dir, jobject chanObj)
|
||||
{
|
||||
CHAR_REF(dir);
|
||||
int writable = 1;
|
||||
jlong accountsCPtr = (jlong)dc_accounts_new(dirPtr, writable);
|
||||
jlong accountsCPtr = (jlong)dc_accounts_new_with_event_channel(dirPtr, writable, get_dc_event_channel(env, chanObj));
|
||||
CHAR_UNREF(dir);
|
||||
return accountsCPtr;
|
||||
}
|
||||
@@ -1957,7 +1993,7 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcBackupProvider_getQr(JNIEnv *env, jo
|
||||
|
||||
JNIEXPORT jstring Java_com_b44t_messenger_DcBackupProvider_getQrSvg(JNIEnv *env, jobject obj)
|
||||
{
|
||||
char* temp = dc_backup_provider_get_qr_svg(get_dc_backup_provider(env, obj));
|
||||
char* temp = dc_create_qr_svg(dc_backup_provider_get_qr(get_dc_backup_provider(env, obj)));
|
||||
jstring ret = JSTRING_NEW(temp);
|
||||
dc_str_unref(temp);
|
||||
return ret;
|
||||
|
||||
+1
-1
Submodule jni/deltachat-core-rust updated: 42f35b47cb...5cdbc9d736
@@ -54,7 +54,6 @@
|
||||
android:requestLegacyExternalStorage="true"
|
||||
tools:targetApi="TIRAMISU"
|
||||
android:hasFragileUserData="true"
|
||||
android:enableOnBackInvokedCallback="false"
|
||||
>
|
||||
|
||||
<!-- android car support, see https://developer.android.com/training/auto/start/,
|
||||
@@ -93,6 +92,7 @@
|
||||
<intent-filter>
|
||||
<data android:scheme="mailto"/>
|
||||
<action android:name="android.intent.action.SENDTO"/>
|
||||
<action android:name="android.intent.action.VIEW"/>
|
||||
<category android:name="android.intent.category.DEFAULT"/>
|
||||
<category android:name="android.intent.category.BROWSABLE"/>
|
||||
</intent-filter>
|
||||
@@ -220,7 +220,7 @@
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
||||
|
||||
<activity android:name=".WelcomeActivity"
|
||||
android:launchMode="singleTask"
|
||||
android:launchMode="singleTop"
|
||||
android:theme="@style/TextSecure.LightNoActionBar"
|
||||
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"/>
|
||||
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -1663,52 +1663,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1317,7 +1317,7 @@ can not be identified easily.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Das verwendete <a href="#relays">Rekay</a> muss Ihre IP-Adresse kennen,
|
||||
<p>Das verwendete <a href="#relays">Relay</a> muss Ihre IP-Adresse kennen,
|
||||
sowie manchmal auch die Geräte Ihrer Kontakte, wenn Sie einen <a href="#experiments">Anruf</a> tätigen
|
||||
oder gemeinsam <a href="#webxdc">Apps</a> verwenden.</p>
|
||||
|
||||
@@ -1487,10 +1487,10 @@ Es wurden keine kritischen Probleme gefunden, aber zwei Probleme mit hohem Schwe
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Some features require certain permissions,
|
||||
e.g. you need to grant camera permission if you want to <a href="#howtoe2ee">scan an invite QR code</a>.</p>
|
||||
<p>Einige Features erfordern bestimmte Berechtigungen.
|
||||
So muss z.B. der Kamerazugriff gewährt werden, wenn du einen <a href="#howtoe2ee">QR-Code scannen</a> möchtest.</p>
|
||||
|
||||
<p>See <a href="https://delta.chat/en/gdpr#24-app-permissions">Privacy Policy</a> for a detailed overview.</p>
|
||||
<p>Siehe <a href="https://delta.chat/de/gdpr#24-berechtigungen-der-app">Datenschutzhinweise</a> für eine detaillierte Übersicht.</p>
|
||||
|
||||
<h3 id="wo-können-meine-freunde-delta-chat-finden">
|
||||
|
||||
@@ -1535,37 +1535,34 @@ Wir nutzen vielmehr öffentliche Finanzierungsquellen, die bisher aus der EU und
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Das EU-Projekt <a href="https://nextleap.eu">NEXTLEAP</a> finanzierte 2017 und 2018 die Entwicklung und Implementierung von “Verifizierten Gruppen” und “Setup Kontakt” und half auch bei der Integration der Ende-zu-Ende-Verschlüsselung durch <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Der <a href="https://opentechfund.org">Open Technology Fund</a> hat Delta Chat erstmals 2018/2019 bezuschusst; mit dieser Förderung (~$200K) wurden hauptsächlich die Android-App verbessert sowie das Release der Desktop-App in einer Betaversion ermöglicht. Basierend auf Nutzererfahrungen im Menschenrechtskontext wurden zudem verschiedene Funktionen entwickelt, siehe unseren Bericht <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
Die zweite Förderung 2019/2020 (~$300K) half uns bei der Erstellung der iOS-Version, unsere Kernbibliothek in die Programmiersprache “Rust” zu konvertieren und neue Funktionen für alle Plattformen bereitzustellen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Die <a href="https://nlnet.nl/">NLnet-Stiftung</a> bewilligte 2019/2020 46K EUR für die Fertigstellung von Rust-/Python-Bindungs und die Einrichtung eines Chat-Bot-Ökosystems.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Im Jahr 2021 erhielten wir weitere EU-Mittel für zwei “Next-Generation-Internet”-Anträge, nämlich für <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - E-Mail-Provider-Portabilitätsverzeichnis</a> (~97K EUR) und <a href="https://nlnet.nl/project/EmailPorting/">AEAP - E-Mail-Adressportierung</a> (~90K EUR). Ziel sind bessere Unterstützung von Mehrfachkonten, verbesserten QR-Code-Kontakt- und -Gruppen-Setups sowie Netzwerkverbesserungen auf allen Plattformen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Von Ende 2021 bis März 2023 erhielten wir eine <em>Internet-Freedom</em>-Finanzierung (500K USD) vom U.S. Bureau of Democracy, Human Rights and Labor (DRL). Diese Finanzierung unterstützte unsere langjährigen Ziele, Delta Chat benutzerfreundlicher und kompatibel mit einer breiten Palette von E-Mail-Servern weltweit zu machen, sowie widerstandsfähiger und sicherer an Orten, die häufig von Internetzensur und Abschaltungen betroffen sind.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 schlossen wir erfolgreich das vom OTF finanzierte
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure-Chatmail-Projekt</a> ab.
|
||||
Dieses fügt “Garantierte Verschlüsselung”,
|
||||
das <a href="https://delta.chat/chatmail">Chatmail-Server-Netzwerk</a>
|
||||
und „Instant Onboarding“ allen ab April 2024 veröffentlichten Anwendungen hinzu.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023 und 2024 wurden wir in das Next-Generation-Internet-Programm (NGI)
|
||||
für unsere Arbeit an <a href="https://nlnet.nl/project/WebXDC-Push/">Webxdc-PUSH</a> aufgenommen,
|
||||
zusammen mit Kooperationspartnern, die an
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">Webxdc-Evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">Webxdc-XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> und
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
Alle diese Projekte sind teilweise abgeschlossen oder sollen Anfang 2025 abgeschlossen werden.</p>
|
||||
<p>Das EU-Projekt <a href="https://nextleap.eu">NEXTLEAP</a> finanzierte 2017 und 2018 die Entwicklung und Implementierung von “Verifizierten Gruppen” und “Setup Kontakt” und half auch bei der Integration der Ende-zu-Ende-Verschlüsselung durch <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Manchmal erhalten wir einmalige Spenden von Privatpersonen, wofür wir sehr dankbar sind. Im Jahr 2021 hat uns zum Beispiel eine großzügige Privatperson 4000 EUR überwiesen mit dem Betreff “Weiter so!” 💜 Wir verwenden dieses Geld zur Finanzierung von Entwicklungstreffen oder zur Deckung von Ad-hoc-Ausgaben, die nicht ohne weiteres vorhersehbar sind oder nicht aus öffentlichen Fördermitteln erstattet werden können.
|
||||
|
||||
@@ -1663,52 +1663,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1652,52 +1652,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>El proyecto de la UE <a href="https://nextleap.eu">NEXTLEAP</a> financió la investigación
|
||||
e implementación de grupos verificados y protocolos de contacto
|
||||
en 2017 y 2018 y también ayudó a integrar el cifrado de extremo a extremo
|
||||
a través de <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>El proyecto de la UE <a href="https://nextleap.eu">NEXTLEAP</a> financió la investigación
|
||||
e implementación de grupos verificados y protocolos de contacto
|
||||
en 2017 y 2018 y también ayudó a integrar el cifrado de extremo a extremo
|
||||
a través de <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1628,47 +1628,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>L’association <a href="https://opentechfund.org">Open Technology Fund</a> nous a octroyé une première subvention en 2018/2019 (de 200.000$ environ), grâce à laquelle nous avons pu apporter des améliorations majeures à l’application Android et publier une première version Beta de l’application de bureau. Elle nous a aussi permis d’ancrer notre recherche UX de développement de fonctionnalités dans des contextes de droits humains. <br />
|
||||
À ce sujet, vous pouvez consulter notre rapport en anglais <a href="https://delta.chat/en/2019-07-19-uxreport">“Needfinding and UX report”</a>.
|
||||
La seconde subvention de 2019/2020 (environ 300.000$) nous a permis de publier des version iOS de Delta Chat, de convertir notre bibliothèque principale en Rust et de créer de nouvelles fonctionnalités pour toutes les plateformes.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Nous recevons parfois des dons ponctuels de la part de personnes privées.
|
||||
|
||||
@@ -6,6 +6,10 @@ a {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
a[href^='http']::after {
|
||||
content: " ↗";
|
||||
}
|
||||
|
||||
h2, h3, h4 {
|
||||
margin-top: 2rem;
|
||||
}
|
||||
|
||||
@@ -1663,52 +1663,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Terkadang kami menerima sumbangan satu kali dari perorangan.
|
||||
|
||||
@@ -1647,49 +1647,37 @@ ordinate cronologicamente:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Il progetto UE <a href="https://nextleap.eu">NEXTLEAP</a> ha finanziato la ricerca
|
||||
e implementazione di gruppi verificati e impostazione di protocolli di contatto
|
||||
nel 2017 e nel 2018 e ha anche contribuito a integrare la crittografia end-to-end
|
||||
tramite <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>L’<a href="https://opentechfund.org">Open Technology Fund</a> ci ha dato una
|
||||
prima sovvenzione 2018/2019 (~$200K) durante la quale abbiamo notevolmente migliorato l’app Android
|
||||
e ha rilasciato una prima versione beta dell’app desktop, e che inoltre
|
||||
ancorato i nostri sviluppi delle funzionalità nella ricerca sulla UX nei contesti dei diritti umani,
|
||||
vedete il nostro <a href="https://delta.chat/en/2019-07-19-uxreport">Rapporto Needfinding e UX</a> conclusivo.
|
||||
La seconda sovvenzione 2019/2020 (~$300K) ci ha aiutato a farlo
|
||||
rilasciare nelle versioni Delta/iOS, per convertire la nostra libreria principale in Rust, e
|
||||
per fornire nuove funzionalità per tutte le piattaforme.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>La <a href="https://nlnet.nl/">fondazione NLnet</a> ha concesso nel 2019/2020 46.000 EUR per
|
||||
completando i collegamenti Rust/Python e avviando un ecosistema Chat-bot.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Nel 2021 abbiamo ricevuto ulteriori finanziamenti dall’UE per due proposte di Next-Generation-Internet, ovvero per <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - directory di portabilità dei provider di posta elettronica</a> (~97.000 EUR) e <a href="https://nlnet.nl/project/EmailPorting/">AEAP - portabilità degli indirizzi email</a> (~90.000 EUR), che hanno portato a un migliore supporto multi-profilo, a un miglioramento delle impostazioni di contatto e di gruppo tramite codice QR e a numerosi miglioramenti di rete su tutte le piattaforme.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Da fine 2021 a marzo 2023 abbiamo ricevuto un finanziamento <em>Internet Freedom</em> (500.000 USD) dall’Ufficio per la Democrazia, i Diritti Umani e il Lavoro (DRL) degli Stati Uniti.
|
||||
Questo finanziamento ha supportato i nostri obiettivi a lungo termine: rendere Delta Chat più utilizzabile
|
||||
e compatibile con un’ampia gamma di server email in tutto il mondo, e più resiliente e sicura
|
||||
in luoghi spesso colpiti da censura e blocchi di Internet.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 abbiamo completato con successo il progetto <a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Chatmail Sicuro</a> finanziato da OTF,
|
||||
consentendoci di introdurre la crittografia garantita,
|
||||
creando una <a href="https://delta.chat/chatmail">rete di server di chatmail</a>
|
||||
e fornendo “inserimento immediato” in tutte le app rilasciate da aprile 2024 in poi.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Nel 2023 e nel 2024 siamo stati accettati nel programma Next Generation Internet (NGI)
|
||||
per il nostro lavoro in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
insieme ai partner di collaborazione che lavorano su
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> e
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
Tutti questi progetti sono parzialmente completati o saranno completati all’inizio del 2025.</p>
|
||||
<p>Il progetto UE <a href="https://nextleap.eu">NEXTLEAP</a> ha finanziato la ricerca
|
||||
e implementazione di gruppi verificati e impostazione di protocolli di contatto
|
||||
nel 2017 e nel 2018 e ha anche contribuito a integrare la crittografia end-to-end
|
||||
tramite <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>A volte riceviamo donazioni una tantum da privati.
|
||||
|
||||
@@ -1657,52 +1657,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> heeft twee subsidies toegekend.
|
||||
De eerste subsidie, voor 2018/2019, ter waarde van ong. $200,000, heeft enorm geholpen om de Android-app
|
||||
te verbeteren en een bètaversie van de computerclient vrij te geven.
|
||||
Verder hebben we onderzoek kunnen doen naar het uiterlijk in relatie tot mensenrechten -
|
||||
bekijk onze conclusie hier: <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
De tweede subsidie, voor 2019/2020, ter waarde van ong. $300,000, loopt nog en ondersteunt ons bij het
|
||||
vrijgeven van de iOS-client, het overzetten van de code van de kernbibliotheek naar Rust en
|
||||
het implementeren van nieuwe functies op alle platformen.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Soms ontvangen we eenmalige donaties van privépersonen, waar we
|
||||
|
||||
@@ -105,8 +105,7 @@
|
||||
|
||||
</h2>
|
||||
|
||||
<p>Delta Chat is a reliable, decentralized and secure instant messaging app,
|
||||
available for mobile and desktop platforms.</p>
|
||||
<p>Delta Chat to niezawodna, zdecentralizowana i bezpieczna aplikacja do błyskawicznego przesyłania wiadomości, dostępna na platformy mobilne i stacjonarne.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
@@ -1464,31 +1463,35 @@ Raczej korzystamy z publicznych źródeł finansowania, jak dotąd pochodzących
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Unijny projekt <a href="https://nextleap.eu">NEXTLEAP</a> sfinansował badania i wdrożenie zweryfikowanych grup i ustawień protokołów kontaktowych w latach 2017 i 2018, a także pomógł zintegrować szyfrowanie end-to-end poprzez <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> przyznał nam pierwszy grant w 2018/2019 (~200 000 $), dzięki któremu znacznie ulepszyliśmy aplikację na Androida i wydaliśmy pierwszą wersję beta aplikacji na komputery stacjonarne, a także ugruntował rozwój naszych funkcji w badaniach UX w kontekście praw człowieka, zobacz nasz końcowy raport <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX</a>.
|
||||
Druga dotacja w 2019/2020 (~300 000 4) pomogła nam wydać wersje Delta/iOS, przekonwertować naszą podstawową bibliotekę na Rust i zapewnić nowe funkcje dla wszystkich platform.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://nlnet.nl/">Fundacja NLnet</a> przekazała w latach 2019/2020 kwotę 46 tys. EUR na wykonanie wiązań Rust/Python i uruchomienie ekosystemu Chat-bot.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>W latach 2023-2024 pomyślnie ukończyliśmy finansowany przez OTF <a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">projekt Secure Chatmail</a>, co pozwoliło nam wprowadzić gwarantowane szyfrowanie, stworzyć <a href="https://delta.chat/chatmail">sieć serwerów chatmail</a> i zapewnić „natychmiastowe wdrażanie” we wszystkich aplikacjach wydanych od kwietnia 2024 r.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>W latach 2023 i 2024 zostaliśmy przyjęci do programu Next Generation Internet (NGI) za naszą pracę w <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>, wraz z partnerami współpracującymi pracującymi nad <a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>, <a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>, <a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> i <a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>. Wszystkie te projekty są częściowo ukończone lub zostaną ukończone na początku 2025 r.</p>
|
||||
<p>Unijny projekt <a href="https://nextleap.eu">NEXTLEAP</a> sfinansował badania i wdrożenie zweryfikowanych grup i ustawień protokołów kontaktowych w latach 2017 i 2018, a także pomógł zintegrować szyfrowanie end-to-end poprzez <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Czasami otrzymujemy jednorazowe darowizny od osób prywatnych. Na przykład w 2021 roku pewna hojna osoba przekazała nam 4K EUR w formie przelewu bankowego tytułem “kontynuujcie dobry rozwój!”. 💜 Takie pieniądze przeznaczamy na finansowanie spotkań rozwojowych lub na doraźne wydatki, których nie da się łatwo przewidzieć lub zrefundować z publicznych dotacji. Otrzymywanie większej ilości darowizn pomaga nam również stać się bardziej niezależnymi i długoterminowo rentownymi jako społeczność współpracowników.</p>
|
||||
|
||||
+237
-252
@@ -2,36 +2,36 @@
|
||||
<html lang="pt"><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<li><a href="#o-que-é-o-delta-chat">O que é o Delta Chat</a>
|
||||
<ul>
|
||||
<li><a href="#howtoe2ee">How can I find people to chat with?</a></li>
|
||||
<li><a href="#why-is-a-chat-marked-as-request">Why is a chat marked as “Request”?</a></li>
|
||||
<li><a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other">How can I put two of my friends in contact with each other?</a></li>
|
||||
<li><a href="#howtoe2ee">Como posso encontrar pessoas para conversar?</a></li>
|
||||
<li><a href="#por-que-um-chat-está-marcado-como-solicitação">Por que um chat está marcado como “Solicitação”?</a></li>
|
||||
<li><a href="#como-posso-colocar-dois-dos-meus-amigos-em-contato-um-com-o-outro">Como posso colocar dois dos meus amigos em contato um com o outro?</a></li>
|
||||
<li><a href="#dá-para-mandar-imagens-vídeos-e-outros-anexos-pelo-delta-chat">Dá para mandar imagens, vídeos e outros anexos pelo Delta Chat?</a></li>
|
||||
<li><a href="#multiple-accounts">What are profiles? How can I switch between them?</a></li>
|
||||
<li><a href="#multiple-accounts">O que são perfis? Como posso alternar entre eles?</a></li>
|
||||
<li><a href="#quem-consegue-ver-a-imagem-do-meu-perfil">Quem consegue ver a imagem do meu perfil?</a></li>
|
||||
<li><a href="#signature">Can I set a Bio/Status with Delta Chat?</a></li>
|
||||
<li><a href="#what-do-pinning-muting-and-archiving-mean">What do Pinning, Muting and Archiving mean?</a></li>
|
||||
<li><a href="#save">How do “Saved Messages” work?</a></li>
|
||||
<li><a href="#what-does-the-green-dot-mean">What does the green dot mean?</a></li>
|
||||
<li><a href="#signature">Posso definir uma Bio/Assinatura com o Delta Chat?</a></li>
|
||||
<li><a href="#o-que-significa-fixar-silenciar-e-arquivar">O que significa Fixar, Silenciar e Arquivar?</a></li>
|
||||
<li><a href="#save">Como funcionam as “Mensagens salvas”?</a></li>
|
||||
<li><a href="#o-que-significa-o-ponto-verde">O que significa o ponto verde?</a></li>
|
||||
<li><a href="#o-que-significam-os-carrapatos-mostrados-ao-lado-das-mensagens-de-saída">O que significam os carrapatos mostrados ao lado das mensagens de saída?</a></li>
|
||||
<li><a href="#edit">Correct typos and delete messages after sending</a></li>
|
||||
<li><a href="#ephemeralmsgs">How do disappearing messages work?</a></li>
|
||||
<li><a href="#delold">What happens if I turn on “Delete Messages from Device”?</a></li>
|
||||
<li><a href="#remove-account">How can I delete my chat profile?</a></li>
|
||||
<li><a href="#edit">Corrigir erros de digitação e excluir mensagens após o envio</a></li>
|
||||
<li><a href="#ephemeralmsgs">Como funcionam as mensagens efêmeras?</a></li>
|
||||
<li><a href="#delold">O que acontece se eu ativar a opção “Apagar mensagens do dispositivo”?</a></li>
|
||||
<li><a href="#remove-account">Como posso excluir minha conta?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#groups">Groups</a>
|
||||
<li><a href="#groups">Grupos</a>
|
||||
<ul>
|
||||
<li><a href="#criação-de-um-grupo">Criação de um grupo</a></li>
|
||||
<li><a href="#addmembers">Add and remove members</a></li>
|
||||
<li><a href="#addmembers">Adicionar e remover membros</a></li>
|
||||
<li><a href="#deletei-minha-própria-conta-por-acidente">Deletei minha própria conta por acidente.</a></li>
|
||||
<li><a href="#não-quero-mais-receber-as-mensagens-de-um-grupo">Não quero mais receber as mensagens de um grupo.</a></li>
|
||||
<li><a href="#cloning-a-group">Cloning a group</a></li>
|
||||
<li><a href="#how-many-members-can-participate-in-a-single-group">How many members can participate in a single group?</a></li>
|
||||
<li><a href="#clonagem-de-grupos">Clonagem de grupos</a></li>
|
||||
<li><a href="#quantos-membros-podem-participar-em-um-único-grupo">Quantos membros podem participar em um único grupo?</a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li><a href="#webxdc">In-chat apps</a>
|
||||
<li><a href="#webxdc">Aplicativos embutidos</a>
|
||||
<ul>
|
||||
<li><a href="#where-can-i-get-in-chat-apps">Where can I get in-chat apps?</a></li>
|
||||
<li><a href="#onde-posso-obter-aplicativos-embutidos">Onde posso obter aplicativos embutidos?</a></li>
|
||||
<li><a href="#how-private-are-in-chat-apps">How private are in-chat apps?</a></li>
|
||||
<li><a href="#create-xdc">How can I create my own in-chat apps?</a></li>
|
||||
</ul>
|
||||
@@ -105,118 +105,118 @@
|
||||
|
||||
</h2>
|
||||
|
||||
<p>Delta Chat is a reliable, decentralized and secure instant messaging app,
|
||||
available for mobile and desktop platforms.</p>
|
||||
<p>Delta Chat é um aplicativo de mensagens instantâneas confiável, descentralizado e seguro,
|
||||
disponível para desktop e plataformas móveis.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Instant creation of <strong>private chat profiles</strong>
|
||||
with secure and interoperable <a href="https://chatmail.at/relays">chatmail relays</a>
|
||||
that offer instant message delivery, and Push Notifications for iOS and Android devices.</p>
|
||||
<p>Criação instantânea de **perfis de chat privados **
|
||||
com <a href="https://chatmail.at/relays">relays chatmail</a> seguros e interoperáveis
|
||||
que oferecem entrega de mensagens instantâneas e Notificações Push para dispositivos iOS e Android.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Pervasive <a href="#multiple-accounts">multi-profile</a> and
|
||||
<a href="#multiclient">multi-device</a> support on all platforms
|
||||
and between different <a href="https://chatmail.at/clients">chatmail apps</a>.</p>
|
||||
<p>Suporte a <a href="#multiple-accounts">vários perfis</a> e
|
||||
a <a href="#multiclient">vários dispositivos</a> em todas as plataformas
|
||||
e entre diferentes <a href="https://chatmail.at/clients">aplicativos de chatmail</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Interactive <a href="#webxdc">in-chat apps</a> for gaming and collaboration</p>
|
||||
<p><a href="#webxdc">Aplicativos interativos embutidos</a> para jogos e colaboração</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="#security-audits">Audited end-to-end encryption</a>
|
||||
safe against network and server attacks.</p>
|
||||
<p><a href="#security-audits">Criptografia de ponta a ponta auditada</a>
|
||||
segura contra ataques à rede e ao servidor.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Free and Open Source software, both app and server side,
|
||||
built on <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Internet Standards</a>.</p>
|
||||
<p>Software gratuito e de código aberto, tanto no aplicativo quanto no servidor,
|
||||
desenvolvido com base nos <a href="https://github.com/chatmail/core/blob/main/standards.md#standards-used-in-delta-chat">Padrões da Internet</a>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="howtoe2ee">
|
||||
|
||||
|
||||
How can I find people to chat with? <a href="#howtoe2ee" class="anchor"></a>
|
||||
Como posso encontrar pessoas para conversar? <a href="#howtoe2ee" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>First, note that Delta Chat is a private messenger.
|
||||
There is no public discovery, <em>you</em> decide about your contacts.</p>
|
||||
<p>Primeiro, observe que o Delta Chat é um mensageiro privado.
|
||||
Não há descoberta pública, <em>você</em> decide sobre seus contatos.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>If you are <strong>face to face</strong> with your friend or family,
|
||||
tap the <strong>QR Code</strong> icon <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
|
||||
on the main screen.<br />
|
||||
Ask your chat partner to <strong>scan</strong> the QR image
|
||||
with their Delta Chat app.</p>
|
||||
<p>Se você estiver <strong>cara a cara</strong> com seu amigo ou parente,
|
||||
toque no ícone de <strong>QR Code</strong> <img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" />
|
||||
na tela principal.<br />
|
||||
Peça ao seu parceiro para <strong>escanear</strong> o QR code
|
||||
com o aplicativo Delta Chat dele.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>For a <strong>remote</strong> contact setup,
|
||||
from the same screen,
|
||||
click “Copy” or “Share” and send the <strong>invite link</strong>
|
||||
through another private chat.</p>
|
||||
<p>Para criar um contato <strong>remotamente</strong>,
|
||||
na mesma tela,
|
||||
clique em “Copiar” ou “Compartilhar” e envie o <strong>link do convite</strong>
|
||||
por meio de outro mensageiro privado.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Now wait while connection gets established.</p>
|
||||
<p>Agora, aguarde enquanto a conexão se estabelece.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>If both sides are online, they will soon see a chat
|
||||
and can start messaging securely.</p>
|
||||
<p>Se ambos os lados estiverem on-line, vocês logo verão um chat
|
||||
e poderão começar a enviar mensagens com segurança.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If one side is offline or in bad network,
|
||||
the ability to chat is delayed until connectivity is restored.</p>
|
||||
<p>Se um lado estiver off-line ou em uma rede ruim,
|
||||
a capacidade de acessar o chat será atrasada até que a conectividade seja restaurada.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Congratulations!
|
||||
You now will automatically use <a href="#e2ee">end-to-end encryption</a> with this contact.
|
||||
If you add each other to <a href="#groups">groups</a>, end-to-end encryption will be established among all members.</p>
|
||||
<p>Parabéns!
|
||||
Agora você usará automaticamente a <a href="#e2ee">criptografia de ponta a ponta</a> com esse contato.
|
||||
Se vocês se adicionarem a <a href="#groups">grupos</a>, a criptografia de ponta a ponta será estabelecida entre todos os membros.</p>
|
||||
|
||||
<h3 id="why-is-a-chat-marked-as-request">
|
||||
<h3 id="por-que-um-chat-está-marcado-como-solicitação">
|
||||
|
||||
|
||||
Why is a chat marked as “Request”? <a href="#why-is-a-chat-marked-as-request" class="anchor"></a>
|
||||
Por que um chat está marcado como “Solicitação”? <a href="#por-que-um-chat-está-marcado-como-solicitação" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>As being a private messenger,
|
||||
only friends and family you <a href="#howtoe2ee">share your QR code or invite link with</a> can write to you.</p>
|
||||
<p>Por ser um mensageiro privado,
|
||||
somente amigos e familiares com quem você <a href="#howtoe2ee">compartilha seu QR code ou link de convite</a> podem escrever para você.</p>
|
||||
|
||||
<p>Your friends may share your contact with other friends,
|
||||
this appears as <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Request</b></p>
|
||||
<p>Seus amigos podem compartilhar seu contato com outros amigos,
|
||||
isso aparece como <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Solicitação</b></p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>You need to <strong>accept</strong> the request before you can reply.</p>
|
||||
<p>Você precisa <strong>aceitar</strong> a solicitação antes de poder responder.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>You can also <strong>delete</strong> it if you don’t want to chat with them for now.</p>
|
||||
<p>Você também pode <strong>excluir</strong> a solicitação se não quiser conversar com a pessoa por enquanto.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If you delete a request, future messages from that contact will still appear
|
||||
as message request, so you can change your mind. If you really don’t want to
|
||||
receive messages from this person, consider <strong>blocking</strong> them.</p>
|
||||
<p>Se você excluir uma solicitação, as mensagens futuras desse contato ainda aparecerão
|
||||
como solicitação de mensagem, assim você pode mudar de ideia. Se você realmente não quiser
|
||||
receber mensagens dessa pessoa, considere <strong>bloqueá-la</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<h3 id="how-can-i-put-two-of-my-friends-in-contact-with-each-other">
|
||||
<h3 id="como-posso-colocar-dois-dos-meus-amigos-em-contato-um-com-o-outro">
|
||||
|
||||
|
||||
How can I put two of my friends in contact with each other? <a href="#how-can-i-put-two-of-my-friends-in-contact-with-each-other" class="anchor"></a>
|
||||
Como posso colocar dois dos meus amigos em contato um com o outro? <a href="#como-posso-colocar-dois-dos-meus-amigos-em-contato-um-com-o-outro" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Attach the first contact to the chat of the second using <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment Button → Contact</strong>.
|
||||
You can also add a little introduction message.</p>
|
||||
<p>Anexe o primeiro contato ao chat do segundo clicando em <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Botão de Anexo → Contato</strong>.
|
||||
Você também pode adicionar uma pequena mensagem de apresentação.</p>
|
||||
|
||||
<p>The second contact will receive a <strong>card</strong> then
|
||||
and can tap it to start chatting with the first contact.</p>
|
||||
<p>O segundo contato receberá um <strong>cartão</strong>
|
||||
e poderá tocar nele para começar a conversar com o primeiro contato.</p>
|
||||
|
||||
<h3 id="dá-para-mandar-imagens-vídeos-e-outros-anexos-pelo-delta-chat">
|
||||
|
||||
@@ -226,31 +226,31 @@ and can tap it to start chatting with the first contact.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Sim. Images, videos, files, voice messages etc. can be sent using the <img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Attachment-</strong>
|
||||
or <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Voice Message</strong> buttons</p>
|
||||
<p>Sim. Imagens, vídeos, arquivos, mensagens de voz etc. podem ser enviados usando os botões de<img style="vertical-align:middle; width:1.0em; margin:1px" src="../paperclip.png" alt="Paperclip" /> <strong>Anexo-</strong>
|
||||
ou <img style="vertical-align:middle; width:0.8em; margin:1px" src="../mic.png" alt="Microphone" /> <strong>Mensagem de Voz</strong></p>
|
||||
|
||||
<p>For performance, images are optimized and sent at a smaller size by default, but you can send it as a “file” to preserve the original.</p>
|
||||
<p>Para fins de desempenho, as imagens são otimizadas e enviadas em um tamanho menor por padrão, mas você pode enviá-las como um “arquivo” para preservar o original.</p>
|
||||
|
||||
<h3 id="multiple-accounts">
|
||||
|
||||
|
||||
What are profiles? How can I switch between them? <a href="#multiple-accounts" class="anchor"></a>
|
||||
O que são perfis? Como posso alternar entre eles? <a href="#multiple-accounts" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>A profile is <strong>a name, a picture</strong> and some additional information for encrypting messages.
|
||||
A profile lives on your device(s) only
|
||||
and uses the server only to relay messages.</p>
|
||||
<p>Um perfil é <strong>um nome, uma foto</strong> e algumas informações adicionais para criptografar mensagens.
|
||||
Um perfil reside apenas em seu(s) dispositivo(s)
|
||||
e usa o servidor somente para transportar mensagens.</p>
|
||||
|
||||
<p>On first installation of Delta Chat a first profile is created.</p>
|
||||
<p>Na primeira instalação do Delta Chat, é criado um primeiro perfil.</p>
|
||||
|
||||
<p>Later, you can tap your profile image in the upper left corner to <strong>Add Profiles</strong>
|
||||
or to <strong>Switch Profiles</strong>.</p>
|
||||
<p>Depois, você pode tocar em sua imagem de perfil no canto superior esquerdo para <strong>Adicionar Conta</strong>
|
||||
ou para <strong>Mudar de Conta</strong>.</p>
|
||||
|
||||
<p>You may want to use separate profiles for political, family or work related activities.</p>
|
||||
<p>Talvez você queira usar perfis separados para atividades políticas, familiares ou atividades do trabalho.</p>
|
||||
|
||||
<p>You may also wish to learn <a href="#multiclient">how to use the same profile on multiple devices</a>.</p>
|
||||
<p>Talvez você também queira aprender <a href="#multiclient">como usar a mesma conta em vários dispositivos</a>.</p>
|
||||
|
||||
<h3 id="quem-consegue-ver-a-imagem-do-meu-perfil">
|
||||
|
||||
@@ -267,96 +267,96 @@ or to <strong>Switch Profiles</strong>.</p>
|
||||
<h3 id="signature">
|
||||
|
||||
|
||||
Can I set a Bio/Status with Delta Chat? <a href="#signature" class="anchor"></a>
|
||||
Posso definir uma Bio/Assinatura com o Delta Chat? <a href="#signature" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Yes,
|
||||
you can do so under <strong>Settings → Profile → Bio</strong>.
|
||||
Once you sent a message to a contact,
|
||||
they will see it when they view your contact details.</p>
|
||||
<p>Sim,
|
||||
você pode fazer isso em <strong>Configurações → Conta → Assinatura</strong>.
|
||||
Depois de enviar uma mensagem para um contato,
|
||||
ele verá sua assinatura quando visualizar seus detalhes de contato.</p>
|
||||
|
||||
<h3 id="what-do-pinning-muting-and-archiving-mean">
|
||||
<h3 id="o-que-significa-fixar-silenciar-e-arquivar">
|
||||
|
||||
|
||||
What do Pinning, Muting and Archiving mean? <a href="#what-do-pinning-muting-and-archiving-mean" class="anchor"></a>
|
||||
O que significa Fixar, Silenciar e Arquivar? <a href="#o-que-significa-fixar-silenciar-e-arquivar" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Use these tools to organize your chats and keep everything in its place:</p>
|
||||
<p>Use essas ferramentas para organizar seus chats e manter tudo em seu devido lugar:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>Pinned chats</strong> always stay atop of the chat list. You can use them to access your most loved chats quickly or temporarily to not forget about things.</p>
|
||||
<p>Os <strong>chats fixados</strong> sempre ficam no topo da lista de conversas. Você pode usá-los para acessar seus chats mais queridos rapidamente ou temporariamente para não se esquecer de nada.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Mute chats</strong> if you do not want to get notifications for them. Muted chats stay in place and you can also pin a muted chat.</p>
|
||||
<p><strong>Silencie os chats</strong> se não quiser receber notificações deles. Os bate-papos silenciados permanecem no lugar e você também pode fixar um chat silenciado.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Archive chats</strong> if you do not want to see them in your chat list any longer.
|
||||
They remain accessible above the chat list or via search
|
||||
and are marked by <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Archived</b></p>
|
||||
<p><strong>Arquive chats</strong> se não quiser mais vê-los em sua lista de conversas.
|
||||
Eles permanecem acessíveis acima da lista conversa ou por meio de pesquisa
|
||||
e são marcados como <b style="border: 1px solid currentColor; padding: 0 3px; font-size:90%">Arquivado</b></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>When an archived chat gets a new message, unless muted, it will <strong>pop out of the archive</strong> and back into your chat list.
|
||||
<strong>Muted chats stay archived</strong> until you unarchive them manually.</p>
|
||||
<p>Quando um chat arquivado receber uma nova mensagem, a menos que esteja silenciado, ele <strong>sairá do arquivo</strong> e voltará à sua lista de conversas.
|
||||
<strong>Os chats silenciados permanecem arquivados</strong> até que você os desarquive manualmente.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>To use the functions, long tap or right click a chat in the chat list.</p>
|
||||
<p>Para usar as funções, toque e segure ou clique com o botão direito do mouse em um conversa na lista conversas.</p>
|
||||
|
||||
<h3 id="save">
|
||||
|
||||
|
||||
How do “Saved Messages” work? <a href="#save" class="anchor"></a>
|
||||
Como funcionam as “Mensagens salvas”? <a href="#save" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p><strong>Saved Messages</strong> is a chat that you can use to easily remember and find messages.</p>
|
||||
<p><strong>Saved Messages</strong> é um chat que você pode usar para lembrar e localizar facilmente as mensagens.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>In any chat, long tap or right click a message and select <strong>Save</strong></p>
|
||||
<p>Em qualquer chat, dê um toque longo ou clique com o botão direito do mouse em uma mensagem e selecione <strong>Salvar</strong></p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Saved messages are marked by the symbol
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" />
|
||||
next to the timestamp</p>
|
||||
<p>As mensagens salvas são marcadas com o símbolo
|
||||
<img style="vertical-align:middle; width:1.2em; margin:1px" src="../saved-icon.png" alt="Saved icon" />
|
||||
ao lado do registro de data e hora</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Later, open the “Saved Messages” chat - and you will see the saved messages there.
|
||||
By tapping <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />,
|
||||
you can go back to the original message in the original chat</p>
|
||||
<p>Depois, abra o chat de “Mensagens salvas” - e você verá as mensagens salvas lá.
|
||||
Ao tocar em <img style="vertical-align:middle; width:1.2em; margin:1px" src="../go-to-original.png" alt="Arrow-right icon" />,
|
||||
você pode voltar para a mensagem original no chat original</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Finally, you can also use “Saved Messages” to take <strong>personal notes</strong> - open the chat, type something, add a photo or a voice message etc.</p>
|
||||
<p>Por fim, você também pode usar “Mensagens Salvas” para fazer <strong>notas pessoais</strong> - abra o chat, digite algo, adicione uma foto ou uma mensagem de voz etc.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>As “Saved Message” are synced, they can become very handy for transferring data between devices</p>
|
||||
<p>Como as “Mensagens salvas” são sincronizadas, elas podem se tornar muito úteis para a transferência de dados entre dispositivos</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>Messages stay saved even if they are edited or deleted -
|
||||
may it be by <a href="#edit">sender</a>, by <a href="#delold">device cleanup</a> or by <a href="#ephemeralmsgs">disappearing messages of other chats</a>.</p>
|
||||
<p>As mensagens permanecem salvas mesmo que sejam editadas ou excluídas -
|
||||
seja pelo <a href="#edit">remetente</a>, por <a href="#delold">limpeza do dispositivo</a> ou por <a href="#ephemeralmsgs">mensagens temporárias de outros chats</a>.</p>
|
||||
|
||||
<h3 id="what-does-the-green-dot-mean">
|
||||
<h3 id="o-que-significa-o-ponto-verde">
|
||||
|
||||
|
||||
What does the green dot mean? <a href="#what-does-the-green-dot-mean" class="anchor"></a>
|
||||
O que significa o ponto verde? <a href="#o-que-significa-o-ponto-verde" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>You can sometimes see a <strong>green dot</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />
|
||||
next to the avatar of a contact.
|
||||
It means they were <strong>recently seen by you</strong> in the last 10 minutes,
|
||||
e.g. because they messaged you or sent a read receipt.</p>
|
||||
<p>Às vezes, você pode ver um <strong>ponto verde</strong> <img style="vertical-align:middle; width:1.2em; margin:1px" src="../green-dot.png" alt="" />
|
||||
ao lado do avatar de um contato.
|
||||
Isso significa que ele foi <strong>visto recentemente por você</strong> nos últimos 10 minutos,
|
||||
por exemplo, porque ele enviou uma mensagem para você ou uma confirmação de leitura.</p>
|
||||
|
||||
<p>So this is not a real time online status
|
||||
and others will as well not always see that you are “online”.</p>
|
||||
<p>Portanto, essa não é uma checagem de status on-line em tempo real
|
||||
e outras pessoas também nem sempre verão que você está “on-line”.</p>
|
||||
|
||||
<h3 id="o-que-significam-os-carrapatos-mostrados-ao-lado-das-mensagens-de-saída">
|
||||
|
||||
@@ -368,132 +368,131 @@ and others will as well not always see that you are “online”.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p><strong>One tick</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||
means that the message was sent successfully to the <a href="#relays">relay</a>.</p>
|
||||
<p><strong>Um tique</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick1.png" alt="" />
|
||||
significa que a mensagem foi enviada com sucesso para o <a href="#relays">relay</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><strong>Two ticks</strong> <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||
indicate your contact has read the message.</p>
|
||||
<p>Dois ticks** <img style="vertical-align:middle; width:1.5em; margin:1px" src="../tick2.png" alt="" />
|
||||
indicam que seu contato leu a mensagem.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>In <a href="#groups">groups</a> the second tick means that at least one member has reported back having read the message.</p>
|
||||
<p>Em <a href="#groups">grupos</a>, o segundo tique significa que pelo menos um membro leu a mensagem.</p>
|
||||
|
||||
<p>You will only get the second tick if both you and one of the recipients who read the message
|
||||
has <strong>Settings → Chats → Read Receipts</strong> enabled.</p>
|
||||
<p>Você só receberá o segundo tique se tanto você quanto um dos destinatários que leu a mensagem
|
||||
tiverem <strong>Configurações → Conversas → Confirmação de leitura</strong> ativada.</p>
|
||||
|
||||
<h3 id="edit">
|
||||
|
||||
|
||||
Correct typos and delete messages after sending <a href="#edit" class="anchor"></a>
|
||||
Corrigir erros de digitação e excluir mensagens após o envio <a href="#edit" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>You can edit the text of your messages after sending.
|
||||
For that, long tap or right click the message and select <strong>Edit</strong>
|
||||
or <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" />.</p>
|
||||
<p>Você pode editar o texto de suas mensagens após o envio.
|
||||
Para isso, toque longamente ou clique com o botão direito do mouse na mensagem e selecione <strong>Editar Mensagem</strong>
|
||||
ou <img style="vertical-align:middle; width:1.2em; margin:1px" src="../edit-icon.png" alt="Edit icon" />.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If you have sent a message accidentally,
|
||||
from the same menu, select <strong>Delete</strong> and then <strong>Delete for Everyone</strong>.</p>
|
||||
<p>Se você tiver enviado uma mensagem acidentalmente,
|
||||
no mesmo menu, selecione <strong>Apagar</strong> e, em seguida, <strong>Apagar para Toda a Gente</strong>.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>While edited messages will have the word “Edited” next to the timestamp,
|
||||
deleted messages will be removed without a marker in the chat.
|
||||
Notifications are not sent and there is no time limit.</p>
|
||||
<p>Enquanto as mensagens editadas terão a palavra “Editado” ao lado do registro de data e hora,
|
||||
as mensagens excluídas serão removidas sem um marcador no chat.
|
||||
Não são enviadas notificações e não há limite de tempo.</p>
|
||||
|
||||
<p>Note, that the original message may still be received by chat members
|
||||
who could have already replied, forwarded, saved, screenshotted or otherwise copied the message.</p>
|
||||
<p>Observe que a mensagem original ainda pode ser recebida pelos membros do conversa
|
||||
que podem ter respondido, encaminhado, salvo, capturado a tela ou copiado a mensagem.</p>
|
||||
|
||||
<h3 id="ephemeralmsgs">
|
||||
|
||||
|
||||
How do disappearing messages work? <a href="#ephemeralmsgs" class="anchor"></a>
|
||||
Como funcionam as mensagens efêmeras? <a href="#ephemeralmsgs" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>You can turn on “disappearing messages”
|
||||
in the settings of a chat,
|
||||
at the top right of the chat window,
|
||||
by selecting a time span
|
||||
between 5 minutes and 1 year.</p>
|
||||
<p>Você pode ativar a opção “mensagens temporárias”
|
||||
nas configurações de um conversa,
|
||||
no canto superior direito da janela conversa,
|
||||
selecionando um intervalo de tempo
|
||||
entre 5 minutos e 1 ano.</p>
|
||||
|
||||
<p>Until the setting is turned off again,
|
||||
each chat member’s Delta Chat app takes care
|
||||
of deleting the messages
|
||||
after the selected time span.
|
||||
The time span begins
|
||||
when the receiver first sees the message in Delta Chat.
|
||||
The messages are deleted both,
|
||||
on the servers,
|
||||
and in the apps itself.</p>
|
||||
<p>Até que a configuração seja desativada novamente,
|
||||
o aplicativo Delta Chat de cada membro do conversa se encarrega de
|
||||
de excluir as mensagens
|
||||
após o período de tempo selecionado.
|
||||
O intervalo de tempo começa
|
||||
quando o destinatário vê a mensagem pela primeira vez no Delta Chat.
|
||||
As mensagens são excluídas tanto
|
||||
nos servidores
|
||||
como nos próprios aplicativos.</p>
|
||||
|
||||
<p>Note that you can rely on disappearing messages
|
||||
only as long as you trust your chat partners;
|
||||
malicious chat partners can take photos,
|
||||
or otherwise save, copy or forward messages before deletion.</p>
|
||||
<p>Observe que você pode confiar no desaparecimento das mensagens
|
||||
somente se você confiar em seus parceiros do conversa;
|
||||
parceiros mal-intencionados de conversa podem tirar fotos,
|
||||
ou salvar, copiar ou encaminhar mensagens antes de excluí-las.</p>
|
||||
|
||||
<p>Apart from that,
|
||||
if one chat partner uninstalls Delta Chat,
|
||||
the (anyway encrypted) messages may take longer to get deleted from their server.</p>
|
||||
<p>Além disso,
|
||||
se um parceiro de conversa desinstalar o Delta Chat,
|
||||
as mensagens (de qualquer forma criptografadas) podem demorar mais para serem excluídas do servidor deles.</p>
|
||||
|
||||
<h3 id="delold">
|
||||
|
||||
|
||||
What happens if I turn on “Delete Messages from Device”? <a href="#delold" class="anchor"></a>
|
||||
O que acontece se eu ativar a opção “Apagar mensagens do dispositivo”? <a href="#delold" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>If you want to save storage on your device, you can choose to delete old
|
||||
messages automatically.</p>
|
||||
<p>Se quiser economizar espaço de armazenamento no dispositivo, você pode optar por excluir mensagens antigas automaticamente.</p>
|
||||
|
||||
<p>To turn it on, go to <strong>Settings → Chats → Delete Message from Device</strong>.
|
||||
You can set a timeframe between “after an hour” and “after a year”;
|
||||
this way, <em>all</em> messages will be deleted from your device as soon as they are
|
||||
older than that.</p>
|
||||
<p>Para ativá-la, vá para <strong>Configurações → Conversas → Apagar mensagens do dispositivo</strong>.
|
||||
Você pode definir um período de tempo entre “após uma hora” e “após um ano”;
|
||||
Dessa forma, <em>todas</em> as mensagens serão excluídas de seu dispositivo assim que forem
|
||||
mais antigas do que isso.</p>
|
||||
|
||||
<h3 id="remove-account">
|
||||
|
||||
|
||||
How can I delete my chat profile? <a href="#remove-account" class="anchor"></a>
|
||||
Como posso excluir minha conta? <a href="#remove-account" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>If you are using more than one chat profile,
|
||||
you can remove single ones in the top profile switcher menu (on Android and iOS),
|
||||
or in the sidebar with a right click (in the Desktop app).
|
||||
Chat profiles are only removed on the device where deletion was triggered.
|
||||
Chat profiles on other devices will continue to fully function.</p>
|
||||
<p>Se estiver usando mais de uma conta,
|
||||
você pode removê-las individualmente no menu superior de mudar de conta (no Android e no iOS),
|
||||
ou na barra lateral com um clique no botão direito do mouse (no aplicativo para desktop).
|
||||
As contas são removidas somente no dispositivo em que a exclusão foi acionada.
|
||||
Contas em outros dispositivos continuarão funcionando plenamente.</p>
|
||||
|
||||
<p>If you use a single default chat profile you can simply uninstall the app.
|
||||
This will still automatically trigger deletion of all associated address data on the chatmail server.
|
||||
For more info, please refer to <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org address-deletion</a>
|
||||
or the respective page from your chosen <a href="https://chatmail.at/relays">3rd party chatmail server</a>.</p>
|
||||
<p>Se você usar uma conta única padrão, poderá simplesmente desinstalar o aplicativo.
|
||||
Isso ainda acionará automaticamente a exclusão de todos os dados de endereço associados no servidor de chatmail.
|
||||
Para obter mais informações, consulte <a href="https://nine.testrun.org/info.html#account-deletion">nine.testrun.org address-deletion</a>
|
||||
ou a respectiva página do <a href="https://chatmail.at/relays">servidor de chatmail de terceiros</a> que você escolheu.</p>
|
||||
|
||||
<h2 id="groups">
|
||||
|
||||
|
||||
Groups <a href="#groups" class="anchor"></a>
|
||||
Grupos <a href="#groups" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
|
||||
<p>Groups let several people chat together privately with <strong>equal rights</strong>.</p>
|
||||
<p>Os grupos permitem que várias pessoas conversem em particular com <strong>direitos iguais</strong>.</p>
|
||||
|
||||
<p>Anyone can
|
||||
change the group name or avatar,
|
||||
<a href="#addmembers">add or remove members</a>,
|
||||
set <a href="#ephemeralmsgs">disappearing messages</a>,
|
||||
and <a href="#edit">delete their own messages</a> from all member’s devices.</p>
|
||||
<p>Qualquer pessoa pode
|
||||
alterar o nome do grupo ou o avatar,
|
||||
<a href="#addmembers">adicionar ou remover membros</a>,
|
||||
definir <a href="#ephemeralmsgs">mensagens temporárias</a>,
|
||||
e <a href="#edit">excluir suas próprias mensagens</a> dos dispositivos de todos os membros.</p>
|
||||
|
||||
<p>Because all members have the same rights, groups work best among <strong>trusted friends and family</strong>.</p>
|
||||
<p>Como todos os membros têm os mesmos direitos, os grupos funcionam melhor entre <strong>amigos e familiares de confiança</strong>.</p>
|
||||
|
||||
<h3 id="criação-de-um-grupo">
|
||||
|
||||
@@ -518,33 +517,33 @@ and <a href="#edit">delete their own messages</a> from all member’s devices.</
|
||||
<h3 id="addmembers">
|
||||
|
||||
|
||||
Add and remove members <a href="#addmembers" class="anchor"></a>
|
||||
Adicionar e remover membros <a href="#addmembers" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>All group members have the <strong>same rights</strong>.
|
||||
For this reason, everyone can delete any member or add new ones.</p>
|
||||
<p>Todos os membros do grupo têm os <strong>mesmos direitos</strong>.
|
||||
Por este motivo, todos podem remover qualquer membro ou adicionar novos membros.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>To <strong>add or delete members</strong>, tap the group name in the chat and select the member to add or remove.</p>
|
||||
<p>Para <strong>adicionar ou remover membros</strong>, toque no nome do grupo dentro do chat e selecione o membro a adicionar ou a remover.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>If the member is not yet in your contact list, but <strong>face to face</strong> with you,
|
||||
from the same screen, show a <strong>QR code</strong>.<br />
|
||||
Ask your chat partner to <strong>scan</strong> the QR image with their Delta Chat app by tapping
|
||||
<img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> on the main screen.</p>
|
||||
<p>Se o membro ainda não estiver na sua lista de contactos, mas estiver <strong>cara a cara</strong> com você,
|
||||
na mesma tela, moste um <strong>QR code</strong>.<br />
|
||||
Peça ao seu parceiro de conversa para <strong>escanear</strong> o QR code com o Delta Chat dele, tocando em
|
||||
<img style="vertical-align:middle; height:1.3em; margin:1px" src="../qr-icon.png" /> na tela inicial.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>For a <strong>remote</strong> member addition,
|
||||
click “Copy” or “Share” and send the <strong>invite link</strong>
|
||||
through another private chat to the new member.</p>
|
||||
<p>Para adicionar um membro <strong>remotamente</strong>,
|
||||
clique em “Copiar” ou “Compartilhar” e envie o link do <strong>convite</strong>
|
||||
por meio de outro mensageiro privado para o novo membro.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>QR code and invite link can be used to add several members.
|
||||
However, since groups are <a href="#groups">meant for trusted people</a>, avoid sharing them publicly.</p>
|
||||
<p>O QR code e o link de convite podem ser usados para adicionar vários membros.
|
||||
No entanto, como os grupos são <a href="#groups">destinados a pessoas de confiança</a>, evite compartilhá-los publicamente.</p>
|
||||
|
||||
<h3 id="deletei-minha-própria-conta-por-acidente">
|
||||
|
||||
@@ -571,60 +570,60 @@ Se você quiser entrar mais tarde no grupo novamente, peça a outra pessoa do gr
|
||||
|
||||
<p>Uma alternativa é “silenciar” um grupo. Fazendo isso, você receberá todas as mensagens e ainda poderá escrever, mas não será receberá mais notificações d enovas mensagens.</p>
|
||||
|
||||
<h3 id="cloning-a-group">
|
||||
<h3 id="clonagem-de-grupos">
|
||||
|
||||
|
||||
Cloning a group <a href="#cloning-a-group" class="anchor"></a>
|
||||
Clonagem de grupos <a href="#clonagem-de-grupos" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>You can duplicate a group to start a separate discussion
|
||||
or to exclude members without them noticing.</p>
|
||||
<p>Você pode duplicar um grupo para iniciar uma discussão separada
|
||||
ou para excluir membros sem que eles percebam.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Open the group profile and tap <strong>Clone Chat</strong> (Android/iOS),
|
||||
or right-click the group in the chat list (Desktop).</p>
|
||||
<p>Abra o perfil do grupo e toque em <strong>Clonar conversa</strong> (Android/iOS),
|
||||
ou clique com o botão direito do mouse no grupo na lista de conversa (desktop).</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Set a new name, choose an avatar, and adjust the member list if needed.</p>
|
||||
<p>Defina um novo nome, escolha um avatar e ajuste a lista de membros, se necessário.</p>
|
||||
</li>
|
||||
</ul>
|
||||
|
||||
<p>The new group is <strong>fully independent</strong> from the original,
|
||||
which continues to work as before.</p>
|
||||
<p>O novo grupo é <strong>totalmente independente</strong> do original,
|
||||
que continua funcionando como antes.</p>
|
||||
|
||||
<h3 id="how-many-members-can-participate-in-a-single-group">
|
||||
<h3 id="quantos-membros-podem-participar-em-um-único-grupo">
|
||||
|
||||
|
||||
How many members can participate in a single group? <a href="#how-many-members-can-participate-in-a-single-group" class="anchor"></a>
|
||||
Quantos membros podem participar em um único grupo? <a href="#quantos-membros-podem-participar-em-um-único-grupo" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
|
||||
<p>There is no strict technical limit,
|
||||
but more than 150 is not recommended.</p>
|
||||
<p>Não há um limite técnico rigoroso,
|
||||
mas não é recomendável mais de 150.</p>
|
||||
|
||||
<p>As groups get larger, they can become socially unstable and may need a hierarchy -
|
||||
where Delta Chat is a private messenger for chatting with <a href="#groups">equal rights</a>.
|
||||
See <a href="https://en.wikipedia.org/wiki/Dunbar%27s_number">Dunbar’s number</a> for more insights.</p>
|
||||
<p>À medida que os grupos se tornam maiores, eles podem se tornar socialmente instáveis e podem precisar de uma hierarquia -
|
||||
mas o Delta Chat é um mensageiro privado para conversar com <a href="#groups">direitos iguais</a>.
|
||||
Consulte o <a href="https://pt.wikipedia.org/wiki/N%C3%BAmero_de_Dunbar">Número de Dunbar</a> para obter mais informações.</p>
|
||||
|
||||
<h2 id="webxdc">
|
||||
|
||||
|
||||
In-chat apps <a href="#webxdc" class="anchor"></a>
|
||||
Aplicativos embutidos <a href="#webxdc" class="anchor"></a>
|
||||
|
||||
|
||||
</h2>
|
||||
|
||||
<p>You can send apps to a chat - games, editors, polls and other tools.
|
||||
This makes Delta Chat a truly extensible messenger.</p>
|
||||
<p>Você pode enviar aplicativos para um chat - jogos, editores, enquetes e outras ferramentas.
|
||||
Isso torna o Delta Chat um mensageiro realmente extensível.</p>
|
||||
|
||||
<h3 id="where-can-i-get-in-chat-apps">
|
||||
<h3 id="onde-posso-obter-aplicativos-embutidos">
|
||||
|
||||
|
||||
Where can I get in-chat apps? <a href="#where-can-i-get-in-chat-apps" class="anchor"></a>
|
||||
Onde posso obter aplicativos embutidos? <a href="#onde-posso-obter-aplicativos-embutidos" class="anchor"></a>
|
||||
|
||||
|
||||
</h3>
|
||||
@@ -1659,52 +1658,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1658,52 +1658,38 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS и macOS App Store, Microsof
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Проект ЕС <a href="https://nextleap.eu">NEXTLEAP</a> финансировал исследование
|
||||
и внедрение проверенных групп и настройку протоколов контактов
|
||||
в 2017 и 2018 годах, а также помог интегрировать сквозное шифрование
|
||||
через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Фонд <a href="https://opentechfund.org">Open Technology Fund</a> предоставил нам
|
||||
первый грант в 2018/2019 году (~$200 тыс.), благодаря которому мы существенно улучшили приложение для Android
|
||||
и выпустили первую бета-версию приложения для настольных систем, а также провели
|
||||
исследования в области UX в контексте прав человека,
|
||||
см. наш заключительный отчет <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
Второй грант, полученный в 2019/2020 году (~$300 тыс.), помог нам
|
||||
выпустить версии Delta/iOS, перевести наш основной код на Rust и
|
||||
предоставить новые функции для всех платформ.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://nlnet.nl/">Фонд NLnet</a> выделил в 2019/2020 году 46 тыс. евро на
|
||||
завершение привязки Rust/Python и создание экосистемы чат-ботов.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>В 2021 г. мы получили дополнительное финансирование из ЕС для двух Next-Generation-Internet
|
||||
целей, а именно для <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - e-mail provider portability directory</a> (~97 тыс. евро) и <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90 тыс. евро). Это привело к улучшению поддержки нескольких профилей, улучшению настройки контактов и групп с помощью QR-кода и многим улучшениям в сетевом взаимодействии на всех платформах.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>С конца 2021 года по март 2023 года мы получили финансирование в размере ($500 тыс.) от
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL) для поддержки <em>свободы интернета</em>.
|
||||
Это финансирование поддержало наши долгосрочные цели, сделать Delta Chat более удобным для использования
|
||||
и совместимым с широким спектром электронных почтовых серверов по всему миру, а также более устойчивым
|
||||
и безопасным в местах, часто подвергающихся интернет-цензуре и отключениям.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 мы завершили проект финансируемый OTF
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
что позволило нам внедрить гарантированное шифрование,
|
||||
создать сеть серверов <a href="https://delta.chat/chatmail">chatmail</a>
|
||||
и обеспечить “немедленную регистрацию” во всех приложениях, выпущенных с апреля 2024 года.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>В 2023 и 2024 годах мы были приняты в программу Next Generation Internet (NGI)
|
||||
за нашу работу над <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
в сотрудничестве с партнерами, работающими над
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> и
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
Все эти проекты частично завершены или будут завершены в начале 2025 года.</p>
|
||||
<p>Проект ЕС <a href="https://nextleap.eu">NEXTLEAP</a> финансировал исследование
|
||||
и внедрение проверенных групп и настройку протоколов контактов
|
||||
в 2017 и 2018 годах, а также помог интегрировать сквозное шифрование
|
||||
через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Иногда мы получаем разовые пожертвования от физических лиц.
|
||||
|
||||
@@ -1663,52 +1663,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Sometimes we receive one-time donations from private individuals.
|
||||
|
||||
@@ -1665,52 +1665,38 @@ ordered chronologically:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> na dha grantin e parë
|
||||
për 2018/2019 (~200 mijë dollarë) me të cilin përmirësuam ndjeshëm aplikacionin
|
||||
për Android dhe hodhëm në qarkullim një version të parë beta aplikacioni për Desktop,
|
||||
si dhe i afroi më tepër zhvillimet tona për veçori me kërkime UX në kontekste të drejtash të njeriut,
|
||||
shihni <a href="https://delta.chat/en/2019-07-19-uxreport">raportin tonë përfundimtar “Needfinding and UX”</a>.
|
||||
Granti i dytë për 2019/2020 (~$300K) na ndihmoi të hedhim në qarkullim
|
||||
versione Delta/iOS, për të shndërruar bibliotekën tonë bazë në Rust, si dhe
|
||||
për të sjellë veçori të reja për krejt platformat.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 we successfully completed the OTF-funded
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail project</a>,
|
||||
allowing us to introduce guaranteed encryption,
|
||||
creating a <a href="https://delta.chat/chatmail">chatmail server network</a>
|
||||
and providing “instant onboarding” in all apps released from April 2024 on.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
<p>The <a href="https://nextleap.eu">NEXTLEAP</a> EU project funded the research
|
||||
and implementation of verified groups and setup contact protocols
|
||||
in 2017 and 2018 and also helped to integrate end-to-end Encryption
|
||||
through <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Ndonjëherë marrim dhurime unike nga individë privatë.
|
||||
|
||||
@@ -1445,38 +1445,35 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS and macOS App Store, Microso
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>Проект ЄС <a href="https://nextleap.eu">NEXTLEAP</a> фінансував дослідження та впровадження верифікованих груп і протоколів встановлення контактів у 2017 та 2018 роках, а також допоміг інтегрувати наскрізне шифрування через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://opentechfund.org">Open Technology Fund</a> надав нам два гранти.
|
||||
Перший грант 2018/2019 року (~$200K), допоміг значно покращили додаток для Android
|
||||
і випустили першу бета-версію додатка для ПК, і який до того ж
|
||||
закріпив наші розробки функцій у дослідженнях UX у контексті прав людини,
|
||||
дивіться наш підсумковий звіт <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
Другий грант 2019/2020 року (~$300K) допоміг нам
|
||||
випустити Delta/iOS версію, конвертувати нашу основному бібліотеку на Rust,
|
||||
і додати нові функції для всіх платформ.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Фонд <a href="https://nlnet.nl/">NLnet</a> виділив у 2019/2020 роках 46 тисяч євро на
|
||||
завершення прив’язок Rust/Python та запуск екосистеми чат-ботів.</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>У 2023-2024 роках ми успішно завершили проєкт <a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">Secure Chatmail</a>, що фінансувався OTF, що дозволило нам запровадити гарантоване шифрування, створити <a href="https://delta.chat/chatmail">мережу серверів chatmail</a> та забезпечити “миттєву реєстрацію” у всіх застосунках, випущених з квітня 2024 року.</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>У 2023 та 2024 роках нас прийняли до програми Next Generation Internet (NGI) за нашу роботу над <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>, а також у співпраці з партнерами, які працюють над <a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>, <a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>, <a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> та <a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>. Усі ці проєкти частково завершені або будуть завершені на початку 2025 року.</p>
|
||||
<p>Проект ЄС <a href="https://nextleap.eu">NEXTLEAP</a> фінансував дослідження та впровадження верифікованих груп і протоколів встановлення контактів у 2017 та 2018 роках, а також допоміг інтегрувати наскрізне шифрування через <a href="https://autocrypt.org">Autocrypt</a>.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Іноді ми отримуємо одноразові пожертви від приватних осіб. Наприклад, у 2021 році щедра приватна особа перерахував нам 4 тис. євро з повідомленням «так тримати!». 💜 Ми використовуємо такі пожертви для фінансування зборів на розвиток або для тимчасових витрат, які важко передбачити або відшкодувати за рахунок грантів державного фінансування. Отримання більшої кількості пожертв також допомагає нам стати більш незалежними та довгостроково життєздатними як спільнота контриб’юторів.</p>
|
||||
|
||||
@@ -1624,40 +1624,35 @@ Google Play Store, F-Droid, Huawei App Gallery, iOS and macOS App Store, Microso
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p><a href="https://nextleap.eu">NEXTLEAP</a>欧盟项目资助了以下研究和实施工作:在 2017 年和 2018 年实施的验证组和设置联系协议和通过 <a href="https://autocrypt.org">Autocrypt</a>整合了端到端加密。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>在<a href="https://opentechfund.org">开放技术基金</a> 2018/2019 年提供的第一笔赠款(约 20 万美元)期间,我们显著改善了安卓应用,发布了第一个桌面测试版,并根据人权方面的用户体验研究进行了功能开发,请参阅我们的结论<a href="https://delta.chat/en/2019-07-19-uxreport">《需求发现与用户体验报告》</a>。2019/2020 年的第二笔赠款(约 30 万美元)对发布 Delta/iOS 版本,将核心库转换到 Rust ,以及为所有平台开发新功能提供了帮助。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p><a href="https://nlnet.nl/">NLnet 基金会</a> 2019/2020 年拨款 4.6 万欧元,用于完成 Rust/Python 绑定并建立聊天机器人生态系统。</p>
|
||||
<p>In 2023 and 2024 we got accepted in the Next Generation Internet (NGI)
|
||||
program for our work in <a href="https://nlnet.nl/project/WebXDC-Push/">webxdc PUSH</a>,
|
||||
along with collaboration partners working on
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">webxdc evolve</a>,
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">webxdc XMPP</a>,
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> and
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a>.
|
||||
All of these projects are partially completed or to be completed in early 2025.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>In 2021 we received further EU funding for two Next-Generation-Internet
|
||||
proposals, namely for <a href="https://dapsi.ngi.eu/hall-of-fame/eppd/">EPPD - email provider portability directory</a> (~97K EUR) and <a href="https://nlnet.nl/project/EmailPorting/">AEAP - email address porting</a> (~90K EUR) which resulted in better multi-profile support, improved QR-code contact and group setups and many networking improvements on all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>From End 2021 till March 2023 we received <em>Internet Freedom</em> funding (500K USD) from the
|
||||
U.S. Bureau of Democracy, Human Rights and Labor (DRL).
|
||||
This funding supported our long-running goals to make Delta Chat more usable
|
||||
and compatible with a wide range of email servers world-wide, and more resilient and secure
|
||||
in places often affected by internet censorship and shutdowns.</p>
|
||||
<p>The <a href="https://nlnet.nl/">NLnet foundation</a> granted in 2019/2020 EUR 46K for
|
||||
completing Rust/Python bindings and instigating a Chat-bot eco-system.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>2023-2024 年,我们成功完成了 OTF 资助的
|
||||
<a href="https://www.opentech.fund/projects-we-support/supported-projects/secure-chat-mail-with-delta-chat/">安全 Chatmail 项目</a>,
|
||||
使我们能够引入保证的加密,
|
||||
创建一个 <a href="https://delta.chat/chatmail">Chatmail 服务器网络</a>,
|
||||
并在 2024 年 4 月起发布的所有应用中提供“即时入职”。</p>
|
||||
<p>The <a href="https://opentechfund.org">Open Technology Fund</a> gave us a
|
||||
first 2018/2019 grant (~$200K) during which we majorly improved the Android app
|
||||
and released a first Desktop app beta version, and which moreover
|
||||
moored our feature developments in UX research in human rights contexts,
|
||||
see our concluding <a href="https://delta.chat/en/2019-07-19-uxreport">Needfinding and UX report</a>.
|
||||
The second 2019/2020 grant (~$300K) helped us to
|
||||
release Delta/iOS versions, to convert our core library to Rust, and
|
||||
to provide new features for all platforms.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>在 2023 年和 2024 年,我们的 <a href="https://nlnet.nl/project/WebXDC-Push/">WebXDC PUSH</a> 工作已在下一代互联网 (NGI) 中获得认可,
|
||||
并与致力于
|
||||
<a href="https://nlnet.nl/project/Webxdc-Evolve/">WebXDC evolve</a>、
|
||||
<a href="https://nlnet.nl/project/WebXDC-XMPP/">WebXDC XMPP</a>、
|
||||
<a href="https://nlnet.nl/project/DeltaTouch/">DeltaTouch</a> 和
|
||||
<a href="https://nlnet.nl/project/DeltaTauri/">DeltaTauri</a> 的合作伙伴合作。
|
||||
所有这些项目都已部分完成或将在 2025 年初完成。</p>
|
||||
<p><a href="https://nextleap.eu">NEXTLEAP</a>欧盟项目资助了以下研究和实施工作:在 2017 年和 2018 年实施的验证组和设置联系协议和通过 <a href="https://autocrypt.org">Autocrypt</a>整合了端到端加密。</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>我们有时会收到个人的一次性捐款。 例如,2021 年,一位慷慨的人士以 “继续保持良好的发展态势!”为主题通过银行向我们捐赠了4千欧元💜。 我们用这些钱来资助发展活动或支付不容易预测或从公共基金中报销的临时费用。收到更多的捐款也有助于我们作为一个贡献者社区变得更加独立和长期可持续。</p>
|
||||
|
||||
@@ -211,11 +211,11 @@ public class Rpc {
|
||||
}
|
||||
|
||||
/**
|
||||
* Set configuration values from a QR code. (technically from the URI that is stored in the qrcode)
|
||||
* Before this function is called, `checkQr()` should confirm the type of the
|
||||
* QR code is `account` or `webrtcInstance`.
|
||||
* Set configuration values from a QR code (technically from the URI stored in it).
|
||||
* Before this function is called, `check_qr()` should be used to get the QR code type.
|
||||
* <p>
|
||||
* Internally, the function will call dc_set_config() with the appropriate keys,
|
||||
* "DCACCOUNT:" and "DCLOGIN:" QR codes configure the account, but I/O mustn't be started for
|
||||
* such QR codes, consider using [`Self::add_transport_from_qr`] which also restarts I/O.
|
||||
*/
|
||||
public void setConfigFromQr(Integer accountId, String qrContent) throws RpcException {
|
||||
transport.call("set_config_from_qr", mapper.valueToTree(accountId), mapper.valueToTree(qrContent));
|
||||
@@ -234,6 +234,11 @@ public class Rpc {
|
||||
return transport.callForResult(new TypeReference<java.util.Map<String, String>>(){}, "batch_get_config", mapper.valueToTree(accountId), mapper.valueToTree(keys));
|
||||
}
|
||||
|
||||
/** Returns all `ui.*` config keys that were set by the UI. */
|
||||
public java.util.List<String> getAllUiConfigKeys(Integer accountId) throws RpcException {
|
||||
return transport.callForResult(new TypeReference<java.util.List<String>>(){}, "get_all_ui_config_keys", mapper.valueToTree(accountId));
|
||||
}
|
||||
|
||||
public void setStockStrings(java.util.Map<String, String> strings) throws RpcException {
|
||||
transport.call("set_stock_strings", mapper.valueToTree(strings));
|
||||
}
|
||||
@@ -449,11 +454,11 @@ public class Rpc {
|
||||
* Delete a chat.
|
||||
* <p>
|
||||
* Messages are deleted from the device and the chat database entry is deleted.
|
||||
* After that, the event #DC_EVENT_MSGS_CHANGED is posted.
|
||||
* After that, a `MsgsChanged` event is emitted.
|
||||
* Messages are deleted from the server in background.
|
||||
* <p>
|
||||
* Things that are _not done_ implicitly:
|
||||
* <p>
|
||||
* - Messages are **not deleted from the server**.
|
||||
* - The chat or the contact is **not blocked**, so new messages from the user/the group may appear as a contact request
|
||||
* and the user may create the chat again.
|
||||
* - **Groups are not left** - this would
|
||||
@@ -704,6 +709,25 @@ public class Rpc {
|
||||
transport.call("set_chat_profile_image", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(imagePath));
|
||||
}
|
||||
|
||||
/**
|
||||
* Set group or broadcast channel description.
|
||||
* Sends out #DC_EVENT_CHAT_MODIFIED and #DC_EVENT_MSGS_CHANGED if a status message was sent.
|
||||
* <p>
|
||||
* See also getChatDescription().
|
||||
*/
|
||||
public void setChatDescription(Integer accountId, Integer chatId, String descriptionStr) throws RpcException {
|
||||
transport.call("set_chat_description", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(descriptionStr));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get group or broadcast channel description.
|
||||
* <p>
|
||||
* See also setChatDescription().
|
||||
*/
|
||||
public String getChatDescription(Integer accountId, Integer chatId) throws RpcException {
|
||||
return transport.callForResult(new TypeReference<String>(){}, "get_chat_description", mapper.valueToTree(accountId), mapper.valueToTree(chatId));
|
||||
}
|
||||
|
||||
public void setChatVisibility(Integer accountId, Integer chatId, ChatVisibility visibility) throws RpcException {
|
||||
transport.call("set_chat_visibility", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(visibility));
|
||||
}
|
||||
@@ -733,11 +757,26 @@ public class Rpc {
|
||||
return transport.callForResult(new TypeReference<Integer>(){}, "add_device_message", mapper.valueToTree(accountId), mapper.valueToTree(label), mapper.valueToTree(msg));
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark all messages in all chats as _noticed_.
|
||||
* Skips messages from blocked contacts, but does not skip messages in muted chats.
|
||||
* <p>
|
||||
* _Noticed_ messages are no longer _fresh_ and do not count as being unseen
|
||||
* but are still waiting for being marked as "seen" using markseen_msgs()
|
||||
* (read receipts aren't sent for noticed messages).
|
||||
* <p>
|
||||
* Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED.
|
||||
* See also markseen_msgs().
|
||||
*/
|
||||
public void marknoticedAllChats(Integer accountId) throws RpcException {
|
||||
transport.call("marknoticed_all_chats", mapper.valueToTree(accountId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Mark all messages in a chat as _noticed_.
|
||||
* _Noticed_ messages are no longer _fresh_ and do not count as being unseen
|
||||
* but are still waiting for being marked as "seen" using markseen_msgs()
|
||||
* (IMAP/MDNs is not done for noticed messages).
|
||||
* (read receipts aren't sent for noticed messages).
|
||||
* <p>
|
||||
* Calling this function usually results in the event #DC_EVENT_MSGS_NOTICED.
|
||||
* See also markseen_msgs().
|
||||
@@ -893,6 +932,15 @@ public class Rpc {
|
||||
return transport.callForResult(new TypeReference<MessageInfo>(){}, "get_message_info_object", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns count of read receipts on message.
|
||||
* <p>
|
||||
* This view count is meant as a feedback measure for the channel owner only.
|
||||
*/
|
||||
public Integer getMessageReadReceiptCount(Integer accountId, Integer messageId) throws RpcException {
|
||||
return transport.callForResult(new TypeReference<Integer>(){}, "get_message_read_receipt_count", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||
}
|
||||
|
||||
/** Returns contacts that sent read receipts and the time of reading. */
|
||||
public java.util.List<MessageReadReceipt> getMessageReadReceipts(Integer accountId, Integer messageId) throws RpcException {
|
||||
return transport.callForResult(new TypeReference<java.util.List<MessageReadReceipt>>(){}, "get_message_read_receipts", mapper.valueToTree(accountId), mapper.valueToTree(messageId));
|
||||
@@ -1286,8 +1334,8 @@ public class Rpc {
|
||||
}
|
||||
|
||||
/** Starts an outgoing call. */
|
||||
public Integer placeOutgoingCall(Integer accountId, Integer chatId, String placeCallInfo) throws RpcException {
|
||||
return transport.callForResult(new TypeReference<Integer>(){}, "place_outgoing_call", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(placeCallInfo));
|
||||
public Integer placeOutgoingCall(Integer accountId, Integer chatId, String placeCallInfo, Boolean hasVideo) throws RpcException {
|
||||
return transport.callForResult(new TypeReference<Integer>(){}, "place_outgoing_call", mapper.valueToTree(accountId), mapper.valueToTree(chatId), mapper.valueToTree(placeCallInfo), mapper.valueToTree(hasVideo));
|
||||
}
|
||||
|
||||
/** Accepts an incoming call. */
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
/**
|
||||
* cheaper version of fullchat, omits: - contacts - contact_ids - fresh_message_counter - ephemeral_timer - self_in_group - was_seen_recently - can_send
|
||||
* cheaper version of fullchat, omits: - contact_ids - fresh_message_counter - ephemeral_timer - self_in_group - was_seen_recently - can_send
|
||||
* <p>
|
||||
* used when you only need the basic metadata of a chat like type, name, profile picture
|
||||
*/
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
package chat.delta.rpc.types;
|
||||
|
||||
public class CallInfo {
|
||||
/** True if SDP offer has a video. */
|
||||
/** True if the call is started as a video call. */
|
||||
public Boolean hasVideo;
|
||||
/**
|
||||
* SDP offer.
|
||||
|
||||
@@ -38,7 +38,7 @@ public class Contact {
|
||||
* <p>
|
||||
* UI should display the information in the contact's profile as follows:
|
||||
* <p>
|
||||
* - If `verifierId` != 0, display text "Introduced by ..." with the name and address of the contact formatted by `name_and_addr`/`nameAndAddr`. Prefix the text by a green checkmark.
|
||||
* - If `verifierId` != 0, display text "Introduced by ..." with the name of the contact. Prefix the text by a green checkmark.
|
||||
* <p>
|
||||
* - If `verifierId` == 0 and `isVerified` != 0, display "Introduced" prefixed by a green checkmark.
|
||||
* <p>
|
||||
|
||||
@@ -412,7 +412,9 @@ public abstract class EventType {
|
||||
/**
|
||||
* One or more transports has changed.
|
||||
* <p>
|
||||
* This event is used for tests to detect when transport synchronization messages arrives. UIs don't need to use it, it is unlikely that user modifies transports on multiple devices simultaneously.
|
||||
* UI should update the list.
|
||||
* <p>
|
||||
* This event is emitted when transport synchronization messages arrives, but not when the UI modifies the transport list by itself.
|
||||
*/
|
||||
public static class TransportsModified extends EventType {
|
||||
}
|
||||
|
||||
@@ -7,7 +7,6 @@ public class FullChat {
|
||||
public ChatType chatType;
|
||||
public String color;
|
||||
public java.util.List<Integer> contactIds;
|
||||
public java.util.List<Contact> contacts;
|
||||
public Integer ephemeralTimer;
|
||||
public Integer freshMessageCounter;
|
||||
public Integer id;
|
||||
|
||||
@@ -12,6 +12,7 @@ public class Message {
|
||||
public String error;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String file;
|
||||
/** The size of the file in bytes, if applicable. If message is a pre-message, then this is the size of the file to be downloaded. */
|
||||
public Integer fileBytes;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String fileMime;
|
||||
|
||||
@@ -22,6 +22,7 @@ public abstract class MessageLoadResult {
|
||||
public String error;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String file;
|
||||
/** The size of the file in bytes, if applicable. If message is a pre-message, then this is the size of the file to be downloaded. */
|
||||
public Integer fileBytes;
|
||||
@com.fasterxml.jackson.annotation.JsonSetter(nulls = com.fasterxml.jackson.annotation.Nulls.SET)
|
||||
public String fileMime;
|
||||
|
||||
@@ -2,8 +2,9 @@ package com.b44t.messenger;
|
||||
|
||||
public class DcAccounts {
|
||||
|
||||
public DcAccounts(String dir) {
|
||||
accountsCPtr = createAccountsCPtr(dir);
|
||||
public DcAccounts(String dir, DcEventChannel channel) {
|
||||
accountsCPtr = createAccountsCPtr(dir, channel);
|
||||
if (accountsCPtr == 0) throw new RuntimeException("createAccountsCPtr() returned null pointer");
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -45,7 +46,7 @@ public class DcAccounts {
|
||||
|
||||
// working with raw c-data
|
||||
private long accountsCPtr; // CAVE: the name is referenced in the JNI
|
||||
private native long createAccountsCPtr (String dir);
|
||||
private native long createAccountsCPtr (String dir, DcEventChannel channel);
|
||||
private native void unrefAccountsCPtr ();
|
||||
private native long getEventEmitterCPtr ();
|
||||
private native long getJsonrpcInstanceCPtr ();
|
||||
|
||||
@@ -0,0 +1,27 @@
|
||||
package com.b44t.messenger;
|
||||
|
||||
public class DcEventChannel {
|
||||
|
||||
public DcEventChannel() {
|
||||
eventChannelCPtr = createEventChannelCPtr();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void finalize() throws Throwable {
|
||||
super.finalize();
|
||||
if (eventChannelCPtr != 0) {
|
||||
unrefEventChannelCPtr();
|
||||
eventChannelCPtr = 0;
|
||||
}
|
||||
}
|
||||
|
||||
public DcEventEmitter getEventEmitter() {
|
||||
return new DcEventEmitter(getEventEmitterCPtr());
|
||||
}
|
||||
|
||||
// working with raw c-data
|
||||
private long eventChannelCPtr; // CAVE: the name is referenced in the JNI
|
||||
private native long createEventChannelCPtr ();
|
||||
private native void unrefEventChannelCPtr ();
|
||||
private native long getEventEmitterCPtr ();
|
||||
}
|
||||
@@ -54,7 +54,6 @@ public class AllMediaDocumentsFragment
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
|
||||
dcContext = DcHelper.getContext(getContext());
|
||||
chatId = getArguments().getInt(CHAT_ID_EXTRA, -1);
|
||||
viewtype1 = getArguments().getInt(VIEWTYPE1, 0);
|
||||
viewtype2 = getArguments().getInt(VIEWTYPE2, 0);
|
||||
|
||||
@@ -52,7 +52,6 @@ public class AllMediaGalleryFragment
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
|
||||
dcContext = DcHelper.getContext(getContext());
|
||||
chatId = getArguments().getInt(CHAT_ID_EXTRA, -1);
|
||||
|
||||
getLoaderManager().initLoader(0, null, this);
|
||||
|
||||
@@ -23,6 +23,7 @@ import androidx.work.WorkManager;
|
||||
import com.b44t.messenger.DcAccounts;
|
||||
import com.b44t.messenger.DcContext;
|
||||
import com.b44t.messenger.DcEvent;
|
||||
import com.b44t.messenger.DcEventChannel;
|
||||
import com.b44t.messenger.DcEventEmitter;
|
||||
import com.b44t.messenger.FFITransport;
|
||||
|
||||
@@ -164,7 +165,8 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
StringWriter stringWriter = new StringWriter();
|
||||
throwable.printStackTrace(new PrintWriter(stringWriter, true));
|
||||
String errorMsg = "Android " + Build.VERSION.RELEASE +":\n" + stringWriter.getBuffer().toString();
|
||||
String subject = "ArcaneChat " + BuildConfig.VERSION_NAME + " Crash Report";
|
||||
errorMsg += "\n" + LogViewFragment.grabLogcat();
|
||||
String subject = "ArcaneChat " + BuildConfig.VERSION_NAME + "-" + BuildConfig.FLAVOR + " Crash Report";
|
||||
Intent intent = new Intent(android.content.Intent.ACTION_SEND);
|
||||
intent.setType("text/plain");
|
||||
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, subject);
|
||||
@@ -195,7 +197,29 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
Util.runOnBackground(() -> {
|
||||
synchronized (initLock) {
|
||||
try {
|
||||
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath());
|
||||
DcEventChannel eventChannel = new DcEventChannel();
|
||||
DcEventEmitter emitter = eventChannel.getEventEmitter();
|
||||
eventCenter = new DcEventCenter(this);
|
||||
|
||||
new Thread(() -> {
|
||||
Log.i(TAG, "Starting event loop");
|
||||
while (true) {
|
||||
DcEvent event = emitter.getNextEvent();
|
||||
if (event == null) {
|
||||
break;
|
||||
}
|
||||
if (isInitialized) {
|
||||
eventCenter.handleEvent(event);
|
||||
} else {
|
||||
// not fully initialized, only handle logging events,
|
||||
// ex. account migrations during DcAccounts initialization
|
||||
eventCenter.handleLogging(event);
|
||||
}
|
||||
}
|
||||
Log.i("DeltaChat", "shutting down event handler");
|
||||
}, "eventThread").start();
|
||||
|
||||
dcAccounts = new DcAccounts(new File(getFilesDir(), "accounts").getAbsolutePath(), eventChannel);
|
||||
Log.i(TAG, "DcAccounts created");
|
||||
rpc = new Rpc(new FFITransport(dcAccounts.getJsonrpcInstance()));
|
||||
Log.i(TAG, "Rpc created");
|
||||
@@ -235,28 +259,12 @@ public class ApplicationContext extends MultiDexApplication {
|
||||
}
|
||||
dcContext = dcAccounts.getSelectedAccount();
|
||||
notificationCenter = new NotificationCenter(this);
|
||||
eventCenter = new DcEventCenter(this);
|
||||
dcLocationManager = new DcLocationManager(this, dcContext);
|
||||
|
||||
// Mark as initialized before starting threads that depend on it
|
||||
isInitialized = true;
|
||||
initLock.notifyAll();
|
||||
Log.i(TAG, "DcAccounts initialization complete");
|
||||
|
||||
new Thread(() -> {
|
||||
Log.i(TAG, "Starting event loop");
|
||||
DcEventEmitter emitter = dcAccounts.getEventEmitter();
|
||||
Log.i(TAG, "DcEventEmitter obtained");
|
||||
while (true) {
|
||||
DcEvent event = emitter.getNextEvent();
|
||||
if (event==null) {
|
||||
break;
|
||||
}
|
||||
eventCenter.handleEvent(event);
|
||||
}
|
||||
Log.i("DeltaChat", "shutting down event handler");
|
||||
}, "eventThread").start();
|
||||
|
||||
// set translations before starting I/O to avoid sending untranslated MDNs (issue #2288)
|
||||
DcHelper.setStockTranslations(this);
|
||||
|
||||
|
||||
@@ -34,6 +34,7 @@ import java.util.List;
|
||||
public class ContactMultiSelectionActivity extends ContactSelectionActivity {
|
||||
|
||||
public static final String CONTACTS_EXTRA = "contacts_extra";
|
||||
public static final String DESELECTED_CONTACTS_EXTRA = "deselected_contacts_extra";
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle, boolean ready) {
|
||||
@@ -71,7 +72,9 @@ public class ContactMultiSelectionActivity extends ContactSelectionActivity {
|
||||
private void saveSelection() {
|
||||
Intent resultIntent = getIntent();
|
||||
List<Integer> selectedContacts = contactsFragment.getSelectedContacts();
|
||||
List<Integer> deselectedContacts = contactsFragment.getDeselectedContacts();
|
||||
resultIntent.putIntegerArrayListExtra(CONTACTS_EXTRA, new ArrayList<>(selectedContacts));
|
||||
resultIntent.putIntegerArrayListExtra(DESELECTED_CONTACTS_EXTRA, new ArrayList<>(deselectedContacts));
|
||||
setResult(RESULT_OK, resultIntent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,8 +81,9 @@ public abstract class ContactSelectionActivity extends PassphraseRequiredActionB
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
super.onOptionsItemSelected(item);
|
||||
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home: super.onBackPressed(); return true;
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
|
||||
@@ -22,6 +22,7 @@ import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.os.Bundle;
|
||||
import android.text.TextUtils;
|
||||
import android.util.SparseIntArray;
|
||||
import android.view.LayoutInflater;
|
||||
import android.view.Menu;
|
||||
@@ -29,6 +30,7 @@ import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
import android.view.View;
|
||||
import android.view.ViewGroup;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -56,6 +58,7 @@ import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashSet;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
import java.util.Set;
|
||||
@@ -81,9 +84,11 @@ public class ContactSelectionListFragment extends Fragment
|
||||
private DcContext dcContext;
|
||||
|
||||
private Set<Integer> selectedContacts;
|
||||
private Set<Integer> deselectedContacts;
|
||||
private OnContactSelectedListener onContactSelectedListener;
|
||||
private String cursorFilter;
|
||||
private RecyclerView recyclerView;
|
||||
private TextView emptyView;
|
||||
private ActionMode actionMode;
|
||||
private ActionMode.Callback actionModeCallback;
|
||||
|
||||
@@ -113,6 +118,7 @@ public class ContactSelectionListFragment extends Fragment
|
||||
View view = inflater.inflate(R.layout.contact_selection_list_fragment, container, false);
|
||||
|
||||
recyclerView = ViewUtil.findById(view, R.id.recycler_view);
|
||||
emptyView = ViewUtil.findById(view, android.R.id.empty);
|
||||
|
||||
// add padding to avoid content hidden behind system bars
|
||||
ViewUtil.applyWindowInsets(recyclerView, true, false, true, true);
|
||||
@@ -123,8 +129,8 @@ public class ContactSelectionListFragment extends Fragment
|
||||
public boolean onCreateActionMode(ActionMode actionMode, Menu menu) {
|
||||
MenuInflater inflater = getActivity().getMenuInflater();
|
||||
inflater.inflate(R.menu.contact_list, menu);
|
||||
setCorrectMenuVisibility(menu);
|
||||
actionMode.setTitle("1");
|
||||
menu.findItem(R.id.menu_delete_selected).setVisible(!isMulti());
|
||||
updateActionModeState(actionMode);
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -161,19 +167,16 @@ public class ContactSelectionListFragment extends Fragment
|
||||
|
||||
private void handleSelectAll() {
|
||||
getContactSelectionListAdapter().selectAll();
|
||||
updateActionModeTitle();
|
||||
updateActionModeState(actionMode);
|
||||
}
|
||||
|
||||
private void updateActionModeTitle() {
|
||||
actionMode.setTitle(String.valueOf(getContactSelectionListAdapter().getActionModeSelection().size()));
|
||||
}
|
||||
|
||||
private void setCorrectMenuVisibility(Menu menu) {
|
||||
ContactSelectionListAdapter adapter = getContactSelectionListAdapter();
|
||||
if (adapter.getActionModeSelection().size() > 1) {
|
||||
menu.findItem(R.id.menu_view_profile).setVisible(false);
|
||||
private void updateActionModeState(ActionMode actionMode) {
|
||||
int size = getContactSelectionListAdapter().getActionModeSelection().size();
|
||||
if (size == 0) {
|
||||
actionMode.finish();
|
||||
} else {
|
||||
menu.findItem(R.id.menu_view_profile).setVisible(true);
|
||||
actionMode.getMenu().findItem(R.id.menu_view_profile).setVisible(size == 1);
|
||||
actionMode.setTitle(String.valueOf(size));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -226,6 +229,15 @@ public class ContactSelectionListFragment extends Fragment
|
||||
return selected;
|
||||
}
|
||||
|
||||
public @NonNull List<Integer> getDeselectedContacts() {
|
||||
List<Integer> deselected = new LinkedList<>();
|
||||
if (deselectedContacts != null) {
|
||||
deselected.addAll(deselectedContacts);
|
||||
}
|
||||
|
||||
return deselected;
|
||||
}
|
||||
|
||||
private boolean isMulti() {
|
||||
return getActivity().getIntent().getBooleanExtra(MULTI_SELECT, false);
|
||||
}
|
||||
@@ -241,6 +253,7 @@ public class ContactSelectionListFragment extends Fragment
|
||||
isMulti(),
|
||||
true);
|
||||
selectedContacts = adapter.getSelectedContacts();
|
||||
deselectedContacts = new HashSet<>();
|
||||
ArrayList<Integer> preselectedContacts = getActivity().getIntent().getIntegerArrayListExtra(PRESELECTED_CONTACTS);
|
||||
if(preselectedContacts!=null) {
|
||||
selectedContacts.addAll(preselectedContacts);
|
||||
@@ -266,7 +279,16 @@ public class ContactSelectionListFragment extends Fragment
|
||||
|
||||
@Override
|
||||
public void onLoadFinished(Loader<DcContactsLoader.Ret> loader, DcContactsLoader.Ret data) {
|
||||
((ContactSelectionListAdapter) recyclerView.getAdapter()).changeData(data);
|
||||
ContactSelectionListAdapter adapter = (ContactSelectionListAdapter) recyclerView.getAdapter();
|
||||
adapter.changeData(data);
|
||||
if (emptyView != null) {
|
||||
if (adapter.getItemCount() > 0 || TextUtils.isEmpty(cursorFilter)) {
|
||||
emptyView.setVisibility(View.GONE);
|
||||
} else {
|
||||
emptyView.setText(getString(R.string.search_no_result_for_x, cursorFilter));
|
||||
emptyView.setVisibility(View.VISIBLE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -280,10 +302,7 @@ public class ContactSelectionListFragment extends Fragment
|
||||
{
|
||||
if (handleActionMode) {
|
||||
if (actionMode != null) {
|
||||
Menu menu = actionMode.getMenu();
|
||||
setCorrectMenuVisibility(menu);
|
||||
updateActionModeTitle();
|
||||
finishActionModeIfSelectionIsEmpty();
|
||||
updateActionModeState(actionMode);
|
||||
}
|
||||
return;
|
||||
}
|
||||
@@ -303,12 +322,14 @@ public class ContactSelectionListFragment extends Fragment
|
||||
}
|
||||
|
||||
selectedContacts.add(contactId);
|
||||
deselectedContacts.remove(contactId);
|
||||
contact.setChecked(true);
|
||||
if (onContactSelectedListener != null) {
|
||||
onContactSelectedListener.onContactSelected(contactId);
|
||||
}
|
||||
} else {
|
||||
selectedContacts.remove(contactId);
|
||||
deselectedContacts.add(contactId);
|
||||
contact.setChecked(false);
|
||||
if (onContactSelectedListener != null) {
|
||||
onContactSelectedListener.onContactDeselected(contactId);
|
||||
@@ -321,17 +342,11 @@ public class ContactSelectionListFragment extends Fragment
|
||||
if (actionMode == null) {
|
||||
actionMode = ((AppCompatActivity)getActivity()).startSupportActionMode(actionModeCallback);
|
||||
} else {
|
||||
finishActionModeIfSelectionIsEmpty();
|
||||
updateActionModeState(actionMode);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private void finishActionModeIfSelectionIsEmpty() {
|
||||
if (getContactSelectionListAdapter().getActionModeSelection().size() == 0) {
|
||||
actionMode.finish();
|
||||
}
|
||||
}
|
||||
|
||||
public void setOnContactSelectedListener(OnContactSelectedListener onContactSelectedListener) {
|
||||
this.onContactSelectedListener = onContactSelectedListener;
|
||||
}
|
||||
@@ -355,6 +370,7 @@ public class ContactSelectionListFragment extends Fragment
|
||||
int contactId = data.getIntExtra(NewContactActivity.CONTACT_ID_EXTRA, 0);
|
||||
if (contactId != 0) {
|
||||
selectedContacts.add(contactId);
|
||||
deselectedContacts.remove(contactId);
|
||||
}
|
||||
getLoaderManager().restartLoader(0, null, ContactSelectionListFragment.this);
|
||||
}
|
||||
|
||||
@@ -57,6 +57,7 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.annotation.StringRes;
|
||||
@@ -187,7 +188,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
private ApplicationContext context;
|
||||
private Recipient recipient;
|
||||
private DcContext dcContext;
|
||||
private Rpc rpc;
|
||||
private DcChat dcChat = new DcChat(0, 0);
|
||||
private int chatId;
|
||||
@@ -196,11 +196,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
private boolean isSecurityInitialized = false;
|
||||
private boolean successfulForwardingAttempt = false;
|
||||
private boolean isEditing = false;
|
||||
private boolean switchedProfile = false;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle state, boolean ready) {
|
||||
this.context = ApplicationContext.getInstance(getApplicationContext());
|
||||
this.dcContext = DcHelper.getContext(context);
|
||||
this.rpc = DcHelper.getRpc(context);
|
||||
|
||||
supportRequestWindowFeature(WindowCompat.FEATURE_ACTION_BAR_OVERLAY);
|
||||
@@ -237,17 +237,34 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
});
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (container.isInputOpen()) {
|
||||
container.hideCurrentInput(composeText);
|
||||
} else {
|
||||
handleReturnToConversationList();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
setDcEventListener();
|
||||
handleRelaying();
|
||||
}
|
||||
|
||||
private void setDcEventListener() {
|
||||
DcEventCenter eventCenter = DcHelper.getEventCenter(this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||
// first cleanup in case it was already registered for other chat
|
||||
eventCenter.removeObservers(this);
|
||||
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_CHAT_MODIFIED, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||
|
||||
if (!isMultiUser()) {
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_INCOMING_MSG, this);
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_MSG_READ, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_INCOMING_MSG, this);
|
||||
eventCenter.addMultiAccountObserver(DcContext.DC_EVENT_MSG_READ, this);
|
||||
}
|
||||
|
||||
handleRelaying();
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -273,6 +290,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
});
|
||||
|
||||
setDcEventListener(); // reset event listener
|
||||
handleRelaying();
|
||||
|
||||
if (fragment != null) {
|
||||
@@ -299,7 +317,13 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
titleView.setTitle(glideRequests, dcChat);
|
||||
|
||||
DcHelper.getNotificationCenter(this).updateVisibleChat(dcContext.getAccountId(), chatId);
|
||||
try {
|
||||
int accId = rpc.getSelectedAccountId();
|
||||
DcHelper.getNotificationCenter(this).updateVisibleChat(accId, chatId);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "rpc.getSelectedAccountId() failed", e);
|
||||
}
|
||||
|
||||
|
||||
attachmentManager.onResume();
|
||||
}
|
||||
@@ -389,7 +413,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
break;
|
||||
|
||||
case GROUP_EDIT:
|
||||
dcChat = dcContext.getChat(chatId);
|
||||
dcChat = DcHelper.getContext(context).getChat(chatId);
|
||||
titleView.setTitle(glideRequests, dcChat);
|
||||
break;
|
||||
|
||||
@@ -545,8 +569,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
} else if (itemId == R.id.menu_show_map) {
|
||||
WebxdcActivity.openMaps(this, chatId);
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_start_call) {
|
||||
CallUtil.startCall(this, chatId);
|
||||
} else if (itemId == R.id.menu_start_audio_call) {
|
||||
CallUtil.startCall(this, chatId, false);
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_start_video_call) {
|
||||
CallUtil.startCall(this, chatId, true);
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_all_media) {
|
||||
handleAllMedia();
|
||||
@@ -568,15 +595,6 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (container.isInputOpen()){
|
||||
container.hideCurrentInput(composeText);
|
||||
} else {
|
||||
handleReturnToConversationList();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onKeyboardShown() {
|
||||
inputPanel.onKeyboardShown();
|
||||
@@ -599,6 +617,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
//////// Event Handlers
|
||||
|
||||
private void handleEphemeralMessages() {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
int preselected = dcContext.getChatEphemeralTimer(chatId);
|
||||
EphemeralMessagesDialog.show(this, preselected, duration -> {
|
||||
dcContext.setChatEphemeralTimer(chatId, (int) duration);
|
||||
@@ -610,6 +629,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void handleReturnToConversationList(@Nullable Bundle extras) {
|
||||
if (switchedProfile) { // force refreshing of chatlist
|
||||
if (extras == null) extras = new Bundle();
|
||||
extras.putInt(ConversationListFragment.RELOAD_LIST, 1);
|
||||
}
|
||||
|
||||
boolean archived = getIntent().getBooleanExtra(FROM_ARCHIVED_CHATS_EXTRA, false);
|
||||
Intent intent = new Intent(this, (archived ? ConversationListArchiveActivity.class : ConversationListActivity.class));
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
@@ -619,6 +643,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void handleMuteNotifications() {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
if(!dcChat.isMuted()) {
|
||||
MuteDialog.show(this, duration -> {
|
||||
dcContext.setChatMuteDuration(chatId, duration);
|
||||
@@ -654,7 +679,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
AlertDialog dialog = new AlertDialog.Builder(this)
|
||||
.setMessage(getString(R.string.ask_leave_group))
|
||||
.setPositiveButton(leaveLabel, (d, which) -> {
|
||||
dcContext.removeContactFromChat(chatId, DcContact.DC_CONTACT_ID_SELF);
|
||||
DcHelper.getContext(context).removeContactFromChat(chatId, DcContact.DC_CONTACT_ID_SELF);
|
||||
Toast.makeText(this, getString(R.string.done), Toast.LENGTH_SHORT).show();
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, null)
|
||||
@@ -663,6 +688,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void handleArchiveChat() {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
int newVisibility = isArchived() ?
|
||||
DcChat.DC_CHAT_VISIBILITY_NORMAL : DcChat.DC_CHAT_VISIBILITY_ARCHIVED;
|
||||
dcContext.setChatVisibility(chatId, newVisibility);
|
||||
@@ -678,7 +704,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
AlertDialog dialog = new AlertDialog.Builder(this)
|
||||
.setMessage(getResources().getString(R.string.ask_delete_named_chat, dcChat.getName()))
|
||||
.setPositiveButton(R.string.delete, (d, which) -> {
|
||||
dcContext.deleteChat(chatId);
|
||||
DcHelper.getContext(context).deleteChat(chatId);
|
||||
DirectShareUtil.clearShortcut(this, chatId);
|
||||
finish();
|
||||
})
|
||||
@@ -708,6 +734,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void handleForwarding() {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
if (dcChat.isSelfTalk()) {
|
||||
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
||||
@@ -756,7 +783,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
||||
} else {
|
||||
Uri uri = uriList.isEmpty()? null : uriList.get(0);
|
||||
dcContext.setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uri, ShareUtil.getSharedType(this), null, null, getSharedText(this)));
|
||||
DcHelper.getContext(context).setDraft(chatId, SendRelayedMessageUtil.createMessage(this, uri, ShareUtil.getSharedType(this), null, null, getSharedText(this)));
|
||||
}
|
||||
initializeDraft();
|
||||
}
|
||||
@@ -771,7 +798,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
private ListenableFuture<Boolean> initializeDraft() {
|
||||
isEditing = false;
|
||||
final SettableFuture<Boolean> future = new SettableFuture<>();
|
||||
DcMsg draft = dcContext.getDraft(chatId);
|
||||
DcMsg draft = DcHelper.getContext(context).getDraft(chatId);
|
||||
final String sharedText = ShareUtil.getSharedText(this);
|
||||
|
||||
if (!draft.isOk()) {
|
||||
@@ -932,7 +959,15 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void initializeBackground() {
|
||||
String backgroundImagePath = Prefs.getBackgroundImagePath(this, dcContext.getAccountId());
|
||||
int accId;
|
||||
try {
|
||||
accId = rpc.getSelectedAccountId();
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "rpc.getSelectedAccountId() failed", e);
|
||||
return;
|
||||
}
|
||||
|
||||
String backgroundImagePath = Prefs.getBackgroundImagePath(this, accId);
|
||||
Drawable background;
|
||||
if(!backgroundImagePath.isEmpty()) {
|
||||
background = Drawable.createFromPath(backgroundImagePath);
|
||||
@@ -958,16 +993,17 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
private void initializeResources() {
|
||||
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, dcContext.getAccountId());
|
||||
if (accountId != dcContext.getAccountId()) {
|
||||
int selectedAccId = DcHelper.getContext(context).getAccountId();
|
||||
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, selectedAccId);
|
||||
if (accountId != selectedAccId) {
|
||||
switchedProfile = true;
|
||||
AccountManager.getInstance().switchAccount(context, accountId);
|
||||
fragment.dcContext = dcContext = context.getDcContext();
|
||||
initializeBackground();
|
||||
}
|
||||
chatId = getIntent().getIntExtra(CHAT_ID_EXTRA, -1);
|
||||
if(chatId == DcChat.DC_CHAT_NO_CHAT)
|
||||
throw new IllegalStateException("can't display a conversation for no chat.");
|
||||
dcChat = dcContext.getChat(chatId);
|
||||
dcChat = DcHelper.getContext(context).getChat(chatId);
|
||||
recipient = new Recipient(this, dcChat);
|
||||
glideRequests = GlideApp.with(this);
|
||||
|
||||
@@ -1034,11 +1070,11 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
try {
|
||||
byte[] vcard = rpc.makeVcard(dcContext.getAccountId(), Collections.singletonList(contactId)).getBytes();
|
||||
byte[] vcard = rpc.makeVcard(rpc.getSelectedAccountId(), Collections.singletonList(contactId)).getBytes();
|
||||
String mimeType = "application/octet-stream";
|
||||
setMedia(PersistentBlobProvider.getInstance().create(this, vcard, mimeType, "vcard.vcf"), MediaType.DOCUMENT);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "makeVcard() failed", e);
|
||||
Log.e(TAG, "RPC failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1077,6 +1113,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
inputPanel.clearSubject();
|
||||
}
|
||||
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
DcMsg msg = null;
|
||||
int recompress = 0;
|
||||
@@ -1209,7 +1246,12 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
if (refreshFragment) {
|
||||
fragment.reload(recipient, chatId);
|
||||
DcHelper.getNotificationCenter(this).updateVisibleChat(dcContext.getAccountId(), chatId);
|
||||
try {
|
||||
int accId = rpc.getSelectedAccountId();
|
||||
DcHelper.getNotificationCenter(this).updateVisibleChat(accId, chatId);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "rpc.getSelectedAccountId() failed", e);
|
||||
}
|
||||
}
|
||||
|
||||
fragment.scrollToBottom();
|
||||
@@ -1371,6 +1413,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
Optional<QuoteModel> quote = inputPanel.getQuote();
|
||||
inputPanel.clearQuote();
|
||||
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
DcMsg msg = new DcMsg(dcContext, DcMsg.DC_MSG_STICKER);
|
||||
if (quote.isPresent()) {
|
||||
msg.setQuote(quote.get().getQuotedMsg());
|
||||
@@ -1492,7 +1535,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
if (isEditing) composeText.setText("");
|
||||
isEditing = false;
|
||||
// If you modify these lines you may also want to modify ConversationItem.setQuote():
|
||||
Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId()));
|
||||
Recipient author = new Recipient(this, DcHelper.getContext(context).getContact(msg.getFromId()));
|
||||
|
||||
SlideDeck slideDeck = new SlideDeck();
|
||||
if (msg.hasFile()) {
|
||||
@@ -1515,7 +1558,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
@Override
|
||||
public void handleEditMessage(DcMsg msg) {
|
||||
isEditing = true;
|
||||
Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId()));
|
||||
Recipient author = new Recipient(this, DcHelper.getContext(context).getContact(msg.getFromId()));
|
||||
|
||||
SlideDeck slideDeck = new SlideDeck();
|
||||
String text = msg.getSummarytext(500);
|
||||
@@ -1540,6 +1583,9 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
@Override
|
||||
public void handleEvent(@NonNull DcEvent event) {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
if (event.getAccountId() != dcContext.getAccountId()) return;
|
||||
|
||||
int eventId = event.getId();
|
||||
if ((eventId == DcContext.DC_EVENT_CHAT_MODIFIED && event.getData1Int() == chatId)
|
||||
|| (eventId == DcContext.DC_EVENT_CHAT_EPHEMERAL_TIMER_MODIFIED && event.getData1Int() == chatId)
|
||||
@@ -1626,7 +1672,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
|
||||
String normQuery = query.trim();
|
||||
searchResult = dcContext.searchMsgs(chatId, normQuery);
|
||||
searchResult = DcHelper.getContext(context).searchMsgs(chatId, normQuery);
|
||||
|
||||
if(searchResult.length>0) {
|
||||
searchResultPosition = searchResult.length - 1;
|
||||
@@ -1657,7 +1703,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
messageRequestBottomView.setVisibility(View.VISIBLE);
|
||||
messageRequestBottomView.setAcceptOnClickListener(v -> {
|
||||
dcContext.acceptChat(chatId);
|
||||
DcHelper.getContext(context).acceptChat(chatId);
|
||||
messageRequestBottomView.setVisibility(View.GONE);
|
||||
composePanel.setVisibility(View.VISIBLE);
|
||||
});
|
||||
@@ -1675,7 +1721,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
// avoid showing compose panel on receiving DC_EVENT_CONTACTS_CHANGED for the chat that is no longer a request after blocking
|
||||
DcHelper.getEventCenter(this).removeObserver(DcContext.DC_EVENT_CONTACTS_CHANGED, this);
|
||||
|
||||
dcContext.blockChat(chatId);
|
||||
DcHelper.getContext(context).blockChat(chatId);
|
||||
Bundle extras = new Bundle();
|
||||
extras.putInt(ConversationListFragment.RELOAD_LIST, 1);
|
||||
handleReturnToConversationList(extras);
|
||||
|
||||
@@ -68,6 +68,7 @@ import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.thoughtcrime.securesms.util.views.ConversationAdaptiveActionsToolbar;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Collections;
|
||||
import java.util.LinkedList;
|
||||
import java.util.List;
|
||||
@@ -75,6 +76,9 @@ import java.util.Set;
|
||||
import java.util.Timer;
|
||||
import java.util.TimerTask;
|
||||
|
||||
import chat.delta.rpc.Rpc;
|
||||
import chat.delta.rpc.RpcException;
|
||||
|
||||
@SuppressLint("StaticFieldLeak")
|
||||
public class ConversationFragment extends MessageSelectorFragment
|
||||
{
|
||||
@@ -103,11 +107,12 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
public boolean isPaused;
|
||||
private Debouncer markseenDebouncer;
|
||||
private Rpc rpc;
|
||||
|
||||
@Override
|
||||
public void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
this.dcContext = DcHelper.getContext(getContext());
|
||||
rpc = DcHelper.getRpc(getContext());
|
||||
|
||||
DcEventCenter eventCenter = DcHelper.getEventCenter(getContext());
|
||||
eventCenter.addObserver(DcContext.DC_EVENT_INCOMING_MSG, this);
|
||||
@@ -208,8 +213,13 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
@Override
|
||||
public void onResume() {
|
||||
super.onResume();
|
||||
|
||||
Util.runOnBackground(() -> dcContext.marknoticedChat((int) chatId));
|
||||
Util.runOnBackground(() -> {
|
||||
try {
|
||||
rpc.marknoticedChat(rpc.getSelectedAccountId(), (int) chatId);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
});
|
||||
if (list.getAdapter() != null) {
|
||||
list.getAdapter().notifyDataSetChanged();
|
||||
}
|
||||
@@ -288,7 +298,12 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
dateDecoration = new StickyHeaderDecoration(adapter, false, false);
|
||||
list.addItemDecoration(dateDecoration);
|
||||
|
||||
int freshMsgs = dcContext.getFreshMsgCount((int) chatId);
|
||||
int freshMsgs = 0;
|
||||
try {
|
||||
freshMsgs = rpc.getFreshMsgCnt(rpc.getSelectedAccountId(), (int) chatId);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
SetStartingPositionLinearLayoutManager layoutManager = (SetStartingPositionLinearLayoutManager) list.getLayoutManager();
|
||||
if (startingPosition > -1) {
|
||||
layoutManager.setStartingPosition(startingPosition);
|
||||
@@ -448,6 +463,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
StringBuilder result = new StringBuilder();
|
||||
|
||||
DcContext dcContext = DcHelper.getContext(getContext());
|
||||
DcMsg prevMsg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
for (DcMsg msg : dcMsgsList) {
|
||||
if (result.length() > 0) {
|
||||
@@ -476,9 +492,13 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
private void handleForwardMessage(final Set<DcMsg> messageRecords) {
|
||||
Intent composeIntent = new Intent();
|
||||
int[] msgIds = DcMsg.msgSetToIds(messageRecords);
|
||||
setForwardingMessageIds(composeIntent, msgIds);
|
||||
ConversationListRelayingActivity.start(this, composeIntent);
|
||||
getActivity().overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out);
|
||||
try {
|
||||
setForwardingMessageIds(composeIntent, msgIds, rpc.getSelectedAccountId());
|
||||
ConversationListRelayingActivity.start(this, composeIntent);
|
||||
getActivity().overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
@@ -504,6 +524,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
private void handleReplyMessagePrivately(final DcMsg msg) {
|
||||
|
||||
if (getActivity() != null) {
|
||||
DcContext dcContext = DcHelper.getContext(getActivity());
|
||||
int privateChatId = dcContext.createChatByContactId(msg.getFromId());
|
||||
DcMsg replyMsg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
replyMsg.setQuote(msg);
|
||||
@@ -520,10 +541,14 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
private void handleToggleSave(final Set<DcMsg> messageRecords) {
|
||||
DcMsg msg = getSelectedMessageRecord(messageRecords);
|
||||
if (msg.getSavedMsgId() != 0) {
|
||||
dcContext.deleteMsgs(new int[]{msg.getSavedMsgId()});
|
||||
} else {
|
||||
dcContext.saveMsgs(new int[]{msg.getId()});
|
||||
try {
|
||||
if (msg.getSavedMsgId() != 0) {
|
||||
rpc.deleteMessages(rpc.getSelectedAccountId(), Collections.singletonList(msg.getSavedMsgId()));
|
||||
} else {
|
||||
rpc.saveMsgs(rpc.getSelectedAccountId(), Collections.singletonList(msg.getId()));
|
||||
}
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -593,7 +618,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
}
|
||||
|
||||
private void updateLocationButton() {
|
||||
floatingLocationButton.setVisibility(dcContext.isSendingLocationsToChat((int) chatId)? View.VISIBLE : View.GONE);
|
||||
floatingLocationButton.setVisibility(DcHelper.getContext(getContext()).isSendingLocationsToChat((int) chatId)? View.VISIBLE : View.GONE);
|
||||
}
|
||||
|
||||
private void scrollAndHighlight(final int pos, boolean smooth) {
|
||||
@@ -729,16 +754,20 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
return;
|
||||
}
|
||||
|
||||
int[] ids = new int[lastPos - firstPos + 1];
|
||||
int index = 0;
|
||||
ArrayList<Integer> ids = new ArrayList<>(lastPos - firstPos + 1);
|
||||
for(int pos = firstPos; pos <= lastPos; pos++) {
|
||||
DcMsg message = ((ConversationAdapter) list.getAdapter()).getMsg(pos);
|
||||
if (message.getFromId() != DC_CONTACT_ID_SELF) {
|
||||
ids[index] = message.getId();
|
||||
index++;
|
||||
ids.add(message.getId());
|
||||
}
|
||||
}
|
||||
Util.runOnAnyBackgroundThread(() -> dcContext.markseenMsgs(ids));
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
try {
|
||||
rpc.markseenMsgs(rpc.getSelectedAccountId(), ids);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "RPC error", e);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
private class ConversationFragmentItemClickListener implements ItemClickListener {
|
||||
@@ -783,7 +812,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
startActivity(intent);
|
||||
}
|
||||
else {
|
||||
String self_mail = dcContext.getConfig("configured_mail_user");
|
||||
String self_mail = DcHelper.getContext(getContext()).getConfig("configured_mail_user");
|
||||
if (self_mail != null && !self_mail.isEmpty()
|
||||
&& messageRecord.getText().contains(self_mail)
|
||||
&& getListAdapter().getChat().isDeviceTalk()) {
|
||||
@@ -822,7 +851,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
if (foreignChatId != 0 && foreignChatId != chatId) {
|
||||
Intent intent = new Intent(getActivity(), ConversationActivity.class);
|
||||
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, foreignChatId);
|
||||
int start = DcMsg.getMessagePosition(original, dcContext);
|
||||
int start = DcMsg.getMessagePosition(original, DcHelper.getContext(getContext()));
|
||||
intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, start);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
((ConversationActivity) getActivity()).hideSoftKeyboard();
|
||||
@@ -838,7 +867,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
@Override
|
||||
public void onJumpToOriginalClicked(DcMsg messageRecord) {
|
||||
jumpToOriginal(dcContext.getMsg(messageRecord.getOriginalMsgId()));
|
||||
jumpToOriginal(DcHelper.getContext(getContext()).getMsg(messageRecord.getOriginalMsgId()));
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -857,12 +886,12 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
@Override
|
||||
public void onDownloadClicked(DcMsg messageRecord) {
|
||||
dcContext.downloadFullMsg(messageRecord.getId());
|
||||
DcHelper.getContext(getContext()).downloadFullMsg(messageRecord.getId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onReactionClicked(DcMsg messageRecord) {
|
||||
ReactionsDetailsFragment dialog = new ReactionsDetailsFragment(messageRecord.getId());
|
||||
ReactionsDetailsFragment dialog = ReactionsDetailsFragment.newInstance(messageRecord.getId());
|
||||
dialog.show(getActivity().getSupportFragmentManager(), null);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1000,9 +1000,9 @@ public class ConversationItem extends BaseConversationItem
|
||||
int chatId = messageRecord.getChatId();
|
||||
if (!messageRecord.isOutgoing() && callInfo.state instanceof CallState.Alerting) {
|
||||
int callId = messageRecord.getId();
|
||||
CallUtil.openCall(getContext(), accId, chatId, callId, callInfo.sdpOffer);
|
||||
CallUtil.openCall(getContext(), accId, chatId, callId, callInfo.sdpOffer, callInfo.hasVideo);
|
||||
} else {
|
||||
CallUtil.startCall(getContext(), accId, chatId);
|
||||
CallUtil.startCall(getContext(), accId, chatId, callInfo.hasVideo);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -16,8 +16,6 @@
|
||||
*/
|
||||
package org.thoughtcrime.securesms;
|
||||
|
||||
import static org.thoughtcrime.securesms.ConversationActivity.CHAT_ID_EXTRA;
|
||||
import static org.thoughtcrime.securesms.ConversationActivity.STARTING_POSITION_EXTRA;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_ENABLED;
|
||||
import static org.thoughtcrime.securesms.connect.DcHelper.CONFIG_PROXY_URL;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageContent;
|
||||
@@ -25,10 +23,12 @@ import static org.thoughtcrime.securesms.util.ShareUtil.getDirectSharingChatId;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedTitle;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.isDirectSharing;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.isForwarding;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getForwardedMessageAccountId;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.resetRelayingMessageContent;
|
||||
|
||||
import android.Manifest;
|
||||
import android.app.Activity;
|
||||
import android.content.Intent;
|
||||
import android.content.res.TypedArray;
|
||||
import android.graphics.Color;
|
||||
@@ -46,6 +46,7 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
import androidx.appcompat.widget.Toolbar;
|
||||
@@ -123,36 +124,9 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle, boolean ready) {
|
||||
// update messages - for new messages, do not reuse or modify strings but create new ones.
|
||||
// it is not needed to keep all past update messages, however, when deleted, also the strings should be deleted.
|
||||
try {
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
final String deviceMsgLabel = "update_2_33_1_android";
|
||||
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
|
||||
DcMsg msg = null;
|
||||
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
|
||||
// InputStream inputStream = getResources().getAssets().open("device-messages/green-checkmark.jpg");
|
||||
// String outputFile = DcHelper.getBlobdirFile(dcContext, "green-checkmark", ".jpg");
|
||||
// Util.copy(inputStream, new FileOutputStream(outputFile));
|
||||
// msg.setFile(outputFile, "image/jpeg");
|
||||
|
||||
msg.setText(getString(R.string.update_2_33, "https://arcanechat.me/#contribute"));
|
||||
}
|
||||
dcContext.addDeviceMsg(deviceMsgLabel, msg);
|
||||
|
||||
if (Prefs.getStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, "").equals(deviceMsgLabel)) {
|
||||
int deviceChatId = dcContext.getChatIdByContactId(DcContact.DC_CONTACT_ID_DEVICE);
|
||||
if (deviceChatId != 0) {
|
||||
dcContext.marknoticedChat(deviceChatId);
|
||||
}
|
||||
}
|
||||
Prefs.setStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, deviceMsgLabel);
|
||||
}
|
||||
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
addDeviceMessages(getIntent().getBooleanExtra(FROM_WELCOME, false));
|
||||
if (getIntent().getIntExtra(ACCOUNT_ID_EXTRA, -1) <= 0) {
|
||||
getIntent().putExtra(ACCOUNT_ID_EXTRA, DcHelper.getContext(this).getAccountId());
|
||||
}
|
||||
|
||||
// create view
|
||||
@@ -176,13 +150,41 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
|
||||
initializeSearchListener();
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (searchToolbar.isVisible()) {
|
||||
searchToolbar.collapse();
|
||||
} else {
|
||||
Activity activity = ConversationListActivity.this;
|
||||
if (isRelayingMessageContent(activity)) {
|
||||
int selectedAccId = DcHelper.getContext(activity).getAccountId();
|
||||
int initialAccId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, selectedAccId);
|
||||
if (initialAccId != selectedAccId) {
|
||||
// allowing to go back is dangerous, it could be activity on previously selected account,
|
||||
// instead of figuring out account rollback in onResume in each activity (conversation, gallery, media preview, webxdc, etc.)
|
||||
// just clear the back stack and stay in newly selected account
|
||||
finishAffinity();
|
||||
startActivity(new Intent(activity, ConversationListActivity.class));
|
||||
return;
|
||||
} else {
|
||||
handleResetRelaying();
|
||||
}
|
||||
}
|
||||
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
TooltipCompat.setTooltipText(searchAction, getText(R.string.search_explain));
|
||||
|
||||
TooltipCompat.setTooltipText(selfAvatar, getText(R.string.switch_account));
|
||||
selfAvatar.setOnClickListener(v -> AccountManager.getInstance().showSwitchAccountMenu(this));
|
||||
selfAvatar.setOnClickListener(v -> AccountManager.getInstance().showSwitchAccountMenu(this, false));
|
||||
findViewById(R.id.avatar_and_title).setOnClickListener(v -> {
|
||||
if (!isRelayingMessageContent(this)) {
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this);
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this, false);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -257,24 +259,29 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
}
|
||||
super.onNewIntent(intent);
|
||||
setIntent(intent);
|
||||
if (getIntent().getIntExtra(ACCOUNT_ID_EXTRA, -1) <= 0) {
|
||||
getIntent().putExtra(ACCOUNT_ID_EXTRA, DcHelper.getContext(this).getAccountId());
|
||||
}
|
||||
refresh();
|
||||
conversationListFragment.onNewIntent();
|
||||
invalidateOptionsMenu();
|
||||
}
|
||||
|
||||
private void refresh() {
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, dcContext.getAccountId());
|
||||
int selectedAccId = DcHelper.getContext(this).getAccountId();
|
||||
int accountId = getIntent().getIntExtra(ACCOUNT_ID_EXTRA, selectedAccId);
|
||||
if (getIntent().getBooleanExtra(CLEAR_NOTIFICATIONS, false)) {
|
||||
DcHelper.getNotificationCenter(this).removeAllNotifications(accountId);
|
||||
}
|
||||
if (accountId != dcContext.getAccountId()) {
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(this, accountId);
|
||||
if (accountId != selectedAccId) {
|
||||
AccountManager.getInstance().switchAccount(this, accountId);
|
||||
onProfileSwitched(accountId);
|
||||
} else {
|
||||
refreshAvatar();
|
||||
refreshUnreadIndicator();
|
||||
refreshTitle();
|
||||
}
|
||||
|
||||
refreshAvatar();
|
||||
refreshUnreadIndicator();
|
||||
refreshTitle();
|
||||
handleOpenpgp4fpr();
|
||||
if (isDirectSharing(this)) {
|
||||
openConversation(getDirectSharingChatId(this), -1);
|
||||
@@ -452,13 +459,16 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
startActivity(new Intent(this, ProxySettingsActivity.class));
|
||||
return true;
|
||||
} else if (itemId == android.R.id.home) {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_all_media) {
|
||||
startActivity(new Intent(this, AllMediaActivity.class));
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_export_attachment) {
|
||||
handleSaveAttachment();
|
||||
} else if (itemId == R.id.menu_switch_account) {
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -491,7 +501,7 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
};
|
||||
SaveAttachmentTask saveTask = new SaveAttachmentTask(this);
|
||||
saveTask.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR, attachments);
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
|
||||
private void handleOpenpgp4fpr() {
|
||||
@@ -526,15 +536,17 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
searchToolbar.clearFocus();
|
||||
|
||||
final DcContext dcContext = DcHelper.getContext(this);
|
||||
if (isForwarding(this) && dcContext.getChat(chatId).isSelfTalk()) {
|
||||
int fwdAccId = getForwardedMessageAccountId(this);
|
||||
if (fwdAccId == dcContext.getAccountId() && dcContext.getChat(chatId).isSelfTalk()) {
|
||||
SendRelayedMessageUtil.immediatelyRelay(this, chatId);
|
||||
Toast.makeText(this, DynamicTheme.getCheckmarkEmoji(this) + " " + getString(R.string.saved), Toast.LENGTH_SHORT).show();
|
||||
handleResetRelaying();
|
||||
finish();
|
||||
} else {
|
||||
Intent intent = new Intent(this, ConversationActivity.class);
|
||||
intent.putExtra(CHAT_ID_EXTRA, chatId);
|
||||
intent.putExtra(STARTING_POSITION_EXTRA, startingPosition);
|
||||
intent.putExtra(ConversationActivity.ACCOUNT_ID_EXTRA, dcContext.getAccountId());
|
||||
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatId);
|
||||
intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, startingPosition);
|
||||
if (isRelayingMessageContent(this)) {
|
||||
acquireRelayMessageContent(this, intent);
|
||||
}
|
||||
@@ -554,15 +566,6 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
overridePendingTransition(R.anim.slide_from_right, R.anim.fade_scale_out);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (searchToolbar.isVisible()) searchToolbar.collapse();
|
||||
else if (isRelayingMessageContent(this)) {
|
||||
handleResetRelaying();
|
||||
finish();
|
||||
} else super.onBackPressed();
|
||||
}
|
||||
|
||||
private void createChat() {
|
||||
Intent intent = new Intent(this, NewConversationActivity.class);
|
||||
if (isRelayingMessageContent(this)) {
|
||||
@@ -579,6 +582,48 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
startActivity(Intent.createChooser(intent, getString(R.string.chat_share_with_title)));
|
||||
}
|
||||
|
||||
private void addDeviceMessages(boolean fromWelcome) {
|
||||
// update messages - for new messages, do not reuse or modify strings but create new ones.
|
||||
// it is not needed to keep all past update messages, however, when deleted, also the strings should be deleted.
|
||||
try {
|
||||
DcContext dcContext = DcHelper.getContext(this);
|
||||
final String deviceMsgLabel = "update_2_33_1_android";
|
||||
if (!dcContext.wasDeviceMsgEverAdded(deviceMsgLabel)) {
|
||||
DcMsg msg = null;
|
||||
if (!getIntent().getBooleanExtra(FROM_WELCOME, false)) {
|
||||
msg = new DcMsg(dcContext, DcMsg.DC_MSG_TEXT);
|
||||
|
||||
// InputStream inputStream = getResources().getAssets().open("device-messages/green-checkmark.jpg");
|
||||
// String outputFile = DcHelper.getBlobdirFile(dcContext, "green-checkmark", ".jpg");
|
||||
// Util.copy(inputStream, new FileOutputStream(outputFile));
|
||||
// msg.setFile(outputFile, "image/jpeg");
|
||||
|
||||
msg.setText(getString(R.string.update_2_33, "https://arcanechat.me/#contribute"));
|
||||
}
|
||||
dcContext.addDeviceMsg(deviceMsgLabel, msg);
|
||||
|
||||
if (Prefs.getStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, "").equals(deviceMsgLabel)) {
|
||||
int deviceChatId = dcContext.getChatIdByContactId(DcContact.DC_CONTACT_ID_DEVICE);
|
||||
if (deviceChatId != 0) {
|
||||
dcContext.marknoticedChat(deviceChatId);
|
||||
}
|
||||
}
|
||||
Prefs.setStringPreference(this, Prefs.LAST_DEVICE_MSG_LABEL, deviceMsgLabel);
|
||||
}
|
||||
|
||||
} catch(Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
public void onProfileSwitched(int profileId) {
|
||||
addDeviceMessages(false);
|
||||
refreshAvatar();
|
||||
refreshUnreadIndicator();
|
||||
refreshTitle();
|
||||
conversationListFragment.loadChatlist();
|
||||
}
|
||||
|
||||
public void onDeleteProfile(int profileId) {
|
||||
deleteProfileId = profileId;
|
||||
boolean result = ScreenLockUtil.applyScreenLock(this, getString(R.string.delete_account), getString(R.string.enter_system_secret_to_continue), REQUEST_CODE_CONFIRM_CREDENTIALS_DELETE_PROFILE);
|
||||
@@ -594,9 +639,14 @@ public class ConversationListActivity extends PassphraseRequiredActionBarActivit
|
||||
accounts.removeAccount(profileId);
|
||||
if (selected) {
|
||||
DcContext selAcc = accounts.getSelectedAccount();
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(this, selAcc.isOk()? selAcc.getAccountId() : 0);
|
||||
if (selAcc.isOk()) {
|
||||
AccountManager.getInstance().switchAccount(this, selAcc.getAccountId());
|
||||
onProfileSwitched(selAcc.getAccountId());
|
||||
} else {
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(this, 0);
|
||||
}
|
||||
} else {
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this);
|
||||
AccountManager.getInstance().showSwitchAccountMenu(this, false);
|
||||
}
|
||||
|
||||
// title update needed to show "Delta Chat" in case there is only one profile left
|
||||
|
||||
@@ -12,6 +12,8 @@ import android.view.Menu;
|
||||
import android.view.MenuInflater;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
|
||||
import com.b44t.messenger.DcChat;
|
||||
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
@@ -33,6 +35,21 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
|
||||
Bundle bundle = new Bundle();
|
||||
bundle.putBoolean(ConversationListFragment.ARCHIVE, true);
|
||||
initFragment(R.id.fragment, new ConversationListFragment(), bundle);
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (!isRelayingMessageContent(ConversationListArchiveActivity.this)) {
|
||||
// Load the ConversationListActivity in case it's not existent for some reason
|
||||
Intent intent = new Intent(ConversationListArchiveActivity.this, ConversationListActivity.class);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -63,7 +80,7 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
|
||||
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == android.R.id.home) {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
} else if (itemId == R.id.mark_as_read) {
|
||||
DcHelper.getContext(this).marknoticedChat(DcChat.DC_CHAT_ID_ARCHIVED_LINK);
|
||||
@@ -73,20 +90,6 @@ public class ConversationListArchiveActivity extends PassphraseRequiredActionBar
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (isRelayingMessageContent(this)) {
|
||||
// Go back to the ConversationListRelayingActivity
|
||||
super.onBackPressed();
|
||||
} else {
|
||||
// Load the ConversationListActivity in case it's not existent for some reason
|
||||
Intent intent = new Intent(this, ConversationListActivity.class);
|
||||
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
|
||||
startActivity(intent);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateConversation(int chatId) {
|
||||
Intent intent = new Intent(this, ConversationActivity.class);
|
||||
|
||||
@@ -260,7 +260,7 @@ public class ConversationListFragment extends BaseConversationListFragment
|
||||
});
|
||||
}
|
||||
|
||||
private void loadChatlist() {
|
||||
public void loadChatlist() {
|
||||
int listflags = 0;
|
||||
if (archive) {
|
||||
listflags |= DcContext.DC_GCL_ARCHIVED_ONLY;
|
||||
|
||||
@@ -124,7 +124,6 @@ public class ConversationListItem extends RelativeLayout
|
||||
this.msgId = msgId;
|
||||
|
||||
int state = dcSummary.getState();
|
||||
int unreadCount = thread.getUnreadCount();
|
||||
|
||||
if (highlightSubstring != null) {
|
||||
this.fromView.setText(getHighlightedSpan(recipient.getName(), highlightSubstring));
|
||||
@@ -151,7 +150,7 @@ public class ConversationListItem extends RelativeLayout
|
||||
thread.getVisibility()==DcChat.DC_CHAT_VISIBILITY_PINNED? R.drawable.ic_pinned_chatlist : 0, 0
|
||||
);
|
||||
|
||||
setStatusIcons(thread.getVisibility(), state, unreadCount, thread.isContactRequest(), thread.isMuted() || chatId == DcChat.DC_CHAT_ID_ARCHIVED_LINK);
|
||||
setStatusIcons(thread, state);
|
||||
setBatchState(batchMode);
|
||||
setBgColor(thread);
|
||||
|
||||
@@ -240,14 +239,14 @@ public class ConversationListItem extends RelativeLayout
|
||||
return msgId;
|
||||
}
|
||||
|
||||
private void setStatusIcons(int visibility, int state, int unreadCount, boolean isContactRequest, boolean isMuted) {
|
||||
if (visibility==DcChat.DC_CHAT_VISIBILITY_ARCHIVED)
|
||||
private void setStatusIcons(ThreadRecord thread, int state) {
|
||||
if (thread.getVisibility() == DcChat.DC_CHAT_VISIBILITY_ARCHIVED)
|
||||
{
|
||||
archivedBadgeView.setVisibility(View.VISIBLE);
|
||||
requestBadgeView.setVisibility(isContactRequest ? View.VISIBLE : View.GONE);
|
||||
requestBadgeView.setVisibility(thread.isContactRequest() ? View.VISIBLE : View.GONE);
|
||||
deliveryStatusIndicator.setNone();
|
||||
}
|
||||
else if (isContactRequest) {
|
||||
else if (thread.isContactRequest()) {
|
||||
requestBadgeView.setVisibility(View.VISIBLE);
|
||||
archivedBadgeView.setVisibility(View.GONE);
|
||||
deliveryStatusIndicator.setNone();
|
||||
@@ -259,14 +258,16 @@ public class ConversationListItem extends RelativeLayout
|
||||
|
||||
if (state == DcMsg.DC_STATE_OUT_FAILED) {
|
||||
deliveryStatusIndicator.setFailed();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_MDN_RCVD) {
|
||||
deliveryStatusIndicator.setRead();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_DELIVERED) {
|
||||
deliveryStatusIndicator.setSent();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_PREPARING) {
|
||||
deliveryStatusIndicator.setPreparing();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_PENDING) {
|
||||
deliveryStatusIndicator.setPending();
|
||||
} else if (thread.isOutChannel()) {
|
||||
deliveryStatusIndicator.setNone();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_MDN_RCVD) {
|
||||
deliveryStatusIndicator.setRead();
|
||||
} else if (state == DcMsg.DC_STATE_OUT_DELIVERED) {
|
||||
deliveryStatusIndicator.setSent();
|
||||
} else {
|
||||
deliveryStatusIndicator.setNone();
|
||||
}
|
||||
@@ -278,11 +279,12 @@ public class ConversationListItem extends RelativeLayout
|
||||
}
|
||||
}
|
||||
|
||||
if(unreadCount==0 || isContactRequest) {
|
||||
int unreadCount = thread.getUnreadCount();
|
||||
if(unreadCount==0 || thread.isContactRequest()) {
|
||||
unreadIndicator.setVisibility(View.GONE);
|
||||
} else {
|
||||
final int color;
|
||||
if(isMuted){
|
||||
if(thread.isMuted() || chatId == DcChat.DC_CHAT_ID_ARCHIVED_LINK){
|
||||
color = getResources().getColor(ThemeUtil.isDarkTheme(getContext()) ? R.color.unread_count_muted_dark : R.color.unread_count_muted);
|
||||
} else {
|
||||
final TypedArray attrs = getContext().obtainStyledAttributes(new int[] {
|
||||
|
||||
@@ -21,6 +21,7 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.loader.app.LoaderManager;
|
||||
|
||||
@@ -52,8 +53,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
|
||||
private static final String TAG = CreateProfileActivity.class.getSimpleName();
|
||||
|
||||
public static final String FROM_WELCOME = "from_welcome";
|
||||
|
||||
private static final int REQUEST_CODE_AVATAR = 1;
|
||||
|
||||
private InputAwareLayout container;
|
||||
@@ -61,7 +60,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
private EditText name;
|
||||
private EditText statusView;
|
||||
|
||||
private boolean fromWelcome;
|
||||
private boolean avatarChanged;
|
||||
private boolean imageLoaded;
|
||||
|
||||
@@ -72,12 +70,11 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
@Override
|
||||
public void onCreate(Bundle bundle) {
|
||||
super.onCreate(bundle);
|
||||
this.fromWelcome = getIntent().getBooleanExtra(FROM_WELCOME, false);
|
||||
|
||||
setContentView(R.layout.profile_create_activity);
|
||||
|
||||
getSupportActionBar().setTitle(R.string.pref_profile_info_headline);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(!this.fromWelcome);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
getSupportActionBar().setHomeAsUpIndicator(R.drawable.ic_close_white_24dp);
|
||||
|
||||
attachmentManager = new AttachmentManager(this, () -> {});
|
||||
@@ -86,6 +83,18 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
initializeProfileName();
|
||||
initializeProfileAvatar();
|
||||
initializeStatusText();
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (container.isInputOpen()) {
|
||||
container.hideCurrentInput(name);
|
||||
} else {
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -100,7 +109,7 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
super.onOptionsItemSelected(item);
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == android.R.id.home) {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_create_profile) {
|
||||
updateProfile();
|
||||
@@ -109,17 +118,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (container.isInputOpen()) {
|
||||
container.hideCurrentInput(name);
|
||||
} else if (fromWelcome) {
|
||||
updateProfile();
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onRequestPermissionsResult(int requestCode, @NonNull String permissions[], @NonNull int[] grantResults) {
|
||||
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
|
||||
@@ -187,13 +185,7 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
// add padding to avoid content hidden behind system bars
|
||||
ViewUtil.applyWindowInsets(container);
|
||||
|
||||
if (fromWelcome) {
|
||||
loginSuccessText.setText(R.string.set_name_and_avatar_explain);
|
||||
ViewUtil.findById(this, R.id.status_text_layout).setVisibility(View.GONE);
|
||||
ViewUtil.findById(this, R.id.information_label).setVisibility(View.GONE);
|
||||
} else {
|
||||
loginSuccessText.setVisibility(View.GONE);
|
||||
}
|
||||
loginSuccessText.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
private void initializeProfileName() {
|
||||
@@ -260,11 +252,6 @@ public class CreateProfileActivity extends BaseActionBarActivity {
|
||||
|
||||
if (result) {
|
||||
attachmentManager.cleanup();
|
||||
if (fromWelcome) {
|
||||
Intent intent = new Intent(getApplicationContext(), ConversationListActivity.class);
|
||||
intent.putExtra(ConversationListActivity.FROM_WELCOME, true);
|
||||
startActivity(intent);
|
||||
}
|
||||
finish();
|
||||
} else {
|
||||
Toast.makeText(CreateProfileActivity.this, R.string.error, Toast.LENGTH_LONG).show();
|
||||
|
||||
@@ -63,6 +63,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
private boolean unencrypted;
|
||||
private boolean broadcast;
|
||||
private EditText groupName;
|
||||
private EditText descriptionText;
|
||||
private ListView lv;
|
||||
private ImageView avatar;
|
||||
private Bitmap avatarBmp;
|
||||
@@ -140,6 +141,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
lv = ViewUtil.findById(this, R.id.selected_contacts_list);
|
||||
avatar = ViewUtil.findById(this, R.id.avatar);
|
||||
groupName = ViewUtil.findById(this, R.id.group_name);
|
||||
descriptionText = ViewUtil.findById(this, R.id.description_text);
|
||||
TextView chatHints = ViewUtil.findById(this, R.id.chat_hints);
|
||||
|
||||
// add padding to avoid content hidden behind system bars
|
||||
@@ -174,10 +176,12 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
if (broadcast) {
|
||||
groupName.setHint(R.string.channel_name);
|
||||
descriptionText.setHint(R.string.channel_description);
|
||||
chatHints.setVisibility(View.VISIBLE);
|
||||
} else if (unencrypted) {
|
||||
avatar.setVisibility(View.GONE);
|
||||
groupName.setHint(R.string.subject);
|
||||
descriptionText.setVisibility(View.GONE);
|
||||
chatHints.setVisibility(View.GONE);
|
||||
} else {
|
||||
chatHints.setVisibility(View.GONE);
|
||||
@@ -186,6 +190,16 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
if(isEdit()) {
|
||||
groupName.setText(dcContext.getChat(groupChatId).getName());
|
||||
lv.setVisibility(View.GONE);
|
||||
|
||||
// Load existing description
|
||||
try {
|
||||
String description = DcHelper.getRpc(this).getChatDescription(dcContext.getAccountId(), groupChatId);
|
||||
if (description != null && !description.isEmpty()) {
|
||||
descriptionText.setText(description);
|
||||
}
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -286,6 +300,16 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
AvatarHelper.setGroupAvatar(this, groupChatId, avatarBmp);
|
||||
}
|
||||
|
||||
// Set description if provided
|
||||
String description = getDescription();
|
||||
if (description != null && !description.isEmpty()) {
|
||||
try {
|
||||
DcHelper.getRpc(this).setChatDescription(dcContext.getAccountId(), groupChatId, description);
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
attachmentManager.cleanup();
|
||||
Intent intent = new Intent(this, ConversationActivity.class);
|
||||
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, groupChatId);
|
||||
@@ -309,6 +333,14 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
if (avatarChanged) AvatarHelper.setGroupAvatar(this, groupChatId, avatarBmp);
|
||||
|
||||
// Update description
|
||||
String description = getDescription();
|
||||
try {
|
||||
DcHelper.getRpc(this).setChatDescription(dcContext.getAccountId(), groupChatId, description != null ? description : "");
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
attachmentManager.cleanup();
|
||||
Intent intent = new Intent();
|
||||
intent.putExtra(GroupCreateActivity.EDIT_GROUP_CHAT_ID, groupChatId);
|
||||
@@ -322,7 +354,18 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
private @Nullable String getGroupName() {
|
||||
String ret = groupName.getText() != null ? groupName.getText().toString() : null;
|
||||
if(ret!=null) {
|
||||
if(ret != null) {
|
||||
ret = ret.trim();
|
||||
if(ret.isEmpty()) {
|
||||
ret = null;
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
private @Nullable String getDescription() {
|
||||
String ret = descriptionText.getText() != null ? descriptionText.getText().toString() : null;
|
||||
if(ret != null) {
|
||||
ret = ret.trim();
|
||||
if(ret.isEmpty()) {
|
||||
ret = null;
|
||||
|
||||
@@ -25,7 +25,6 @@ import android.widget.ImageView;
|
||||
import android.widget.TextView;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -41,7 +40,6 @@ import com.google.zxing.integration.android.IntentIntegrator;
|
||||
import com.google.zxing.integration.android.IntentResult;
|
||||
|
||||
import org.thoughtcrime.securesms.components.AvatarSelector;
|
||||
import org.thoughtcrime.securesms.connect.AccountManager;
|
||||
import org.thoughtcrime.securesms.connect.DcEventCenter;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto;
|
||||
@@ -56,6 +54,7 @@ import org.thoughtcrime.securesms.relay.RelayListActivity;
|
||||
import org.thoughtcrime.securesms.scribbles.ScribbleActivity;
|
||||
import org.thoughtcrime.securesms.util.IntentUtils;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.util.TextUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
import org.thoughtcrime.securesms.util.ViewUtil;
|
||||
import org.thoughtcrime.securesms.util.views.ProgressDialog;
|
||||
@@ -76,7 +75,6 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
private static final String INSTANCES_URL = "https://chatmail.at/relays";
|
||||
private static final String DEFAULT_CHATMAIL_HOST = "arcanechat.me";
|
||||
|
||||
public static final String FROM_WELCOME = "from_welcome";
|
||||
private static final int REQUEST_CODE_AVATAR = 1;
|
||||
|
||||
private ImageView avatar;
|
||||
@@ -107,9 +105,9 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
Objects.requireNonNull(getSupportActionBar()).setTitle(R.string.onboarding_create_instant_account);
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
|
||||
boolean fromWelcome = getIntent().getBooleanExtra(FROM_WELCOME, false);
|
||||
boolean configured = DcHelper.getContext(this).isConfigured() == 1;
|
||||
|
||||
if (DcHelper.getContext(this).isConfigured() == 1) {
|
||||
if (configured) {
|
||||
// if account is configured it means we didn't come from Welcome screen nor from QR scanner,
|
||||
// instead, user clicked a dcaccount:// URI directly, so we need to just offer to add a new relay
|
||||
Uri uri = getIntent().getData();
|
||||
@@ -117,25 +115,11 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
Intent intent = new Intent(this, RelayListActivity.class);
|
||||
intent.putExtra(RelayListActivity.EXTRA_QR_DATA, uri.toString());
|
||||
startActivity(intent);
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
// if URI is unexpectedly null, then fallback to new profile creation
|
||||
AccountManager.getInstance().beginAccountCreation(this);
|
||||
finish();
|
||||
return;
|
||||
}
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(!fromWelcome) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
AccountManager accountManager = AccountManager.getInstance();
|
||||
if (accountManager.canRollbackAccountCreation(InstantOnboardingActivity.this)) {
|
||||
accountManager.rollbackAccountCreation(InstantOnboardingActivity.this);
|
||||
} else {
|
||||
finish();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
isDcLogin = false;
|
||||
providerHost = DEFAULT_CHATMAIL_HOST;
|
||||
providerQrData = DCACCOUNT + ":" + providerHost;
|
||||
@@ -341,7 +325,10 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
|
||||
signUpBtn.setOnClickListener(view -> createProfile());
|
||||
|
||||
findViewById(R.id.use_other_server).setOnClickListener((v) -> {
|
||||
Button otherServerButton = findViewById(R.id.use_other_server);
|
||||
otherServerButton.setText(
|
||||
TextUtil.markAsExternal(getString(R.string.instant_onboarding_other_server)));
|
||||
otherServerButton.setOnClickListener((v) -> {
|
||||
IntentUtils.showInBrowser(this, INSTANCES_URL);
|
||||
});
|
||||
findViewById(R.id.login_button).setOnClickListener((v) -> {
|
||||
@@ -365,9 +352,11 @@ public class InstantOnboardingActivity extends BaseActionBarActivity implements
|
||||
}
|
||||
|
||||
if (DEFAULT_CHATMAIL_HOST.equals(providerHost)) {
|
||||
privacyPolicyBtn.setText(getString(R.string.instant_onboarding_agree_default2, providerHost));
|
||||
privacyPolicyBtn.setText(TextUtil.markAsExternal(
|
||||
getString(R.string.instant_onboarding_agree_default2, providerHost)));
|
||||
} else {
|
||||
privacyPolicyBtn.setText(getString(R.string.instant_onboarding_agree_instance, providerHost));
|
||||
privacyPolicyBtn.setText(TextUtil.markAsExternal(
|
||||
getString(R.string.instant_onboarding_agree_instance, providerHost)));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,9 @@ import android.os.Bundle;
|
||||
import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
|
||||
import org.thoughtcrime.securesms.util.TextUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
|
||||
import java.io.InputStream;
|
||||
@@ -44,6 +47,18 @@ public class LocalHelpActivity extends WebViewActivity
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
if (webView.canGoBack()) {
|
||||
webView.goBack();
|
||||
} else {
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
webView.loadUrl("file:///android_asset/" + helpPath.replace("LANG", helpLang) + (section!=null? section : ""));
|
||||
}
|
||||
|
||||
@@ -51,6 +66,28 @@ public class LocalHelpActivity extends WebViewActivity
|
||||
public boolean onPrepareOptionsMenu(Menu menu) {
|
||||
super.onPrepareOptionsMenu(menu);
|
||||
this.getMenuInflater().inflate(R.menu.local_help, menu);
|
||||
|
||||
// Append " ↗" to external link buttons
|
||||
MenuItem item = menu.findItem(R.id.learn_more);
|
||||
if (item != null) {
|
||||
item.setTitle(TextUtil.markAsExternal(getString(R.string.delta_chat_homepage)));
|
||||
}
|
||||
|
||||
item = menu.findItem(R.id.privacy_policy);
|
||||
if (item != null) {
|
||||
item.setTitle(TextUtil.markAsExternal(getString(R.string.privacy_policy)));
|
||||
}
|
||||
|
||||
item = menu.findItem(R.id.contribute);
|
||||
if (item != null) {
|
||||
item.setTitle(TextUtil.markAsExternal(getString(R.string.contribute)));
|
||||
}
|
||||
|
||||
item = menu.findItem(R.id.report_issue);
|
||||
if (item != null) {
|
||||
item.setTitle(TextUtil.markAsExternal(getString(R.string.global_menu_help_report_desktop)));
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -77,15 +114,6 @@ public class LocalHelpActivity extends WebViewActivity
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
if (webView.canGoBack()) {
|
||||
webView.goBack();
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
|
||||
private boolean assetExists(String fileName) {
|
||||
// test using AssetManager.open();
|
||||
// AssetManager.list() is unreliable eg. on my Android 7 Moto G
|
||||
|
||||
@@ -129,7 +129,7 @@ public class LogViewFragment extends Fragment {
|
||||
return logFile;
|
||||
}
|
||||
|
||||
private static String grabLogcat(LogViewFragment fragment) {
|
||||
public static String grabLogcat() {
|
||||
String command = "logcat -v threadtime -d -t 10000 *:I";
|
||||
try {
|
||||
final Process process = Runtime.getRuntime().exec(command);
|
||||
@@ -165,7 +165,7 @@ public class LogViewFragment extends Fragment {
|
||||
if (fragment == null) return null;
|
||||
|
||||
return "**This log may contain sensitive information. If you want to post it publicly you may examine and edit it beforehand.**\n\n" +
|
||||
buildDescription(fragment) + "\n" + grabLogcat(fragment);
|
||||
buildDescription(fragment) + "\n" + grabLogcat();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -32,7 +32,6 @@ public abstract class MessageSelectorFragment
|
||||
implements DcEventCenter.DcEventDelegate
|
||||
{
|
||||
protected ActionMode actionMode;
|
||||
protected DcContext dcContext;
|
||||
|
||||
protected abstract void setCorrectMenuVisibility(Menu menu);
|
||||
|
||||
@@ -48,7 +47,7 @@ public abstract class MessageSelectorFragment
|
||||
protected void handleDisplayDetails(DcMsg dcMsg) {
|
||||
View view = View.inflate(getActivity(), R.layout.message_details_view, null);
|
||||
TextView detailsText = view.findViewById(R.id.details_text);
|
||||
detailsText.setText(dcContext.getMsgInfo(dcMsg.getId()));
|
||||
detailsText.setText(DcHelper.getContext(getContext()).getMsgInfo(dcMsg.getId()));
|
||||
|
||||
AlertDialog d = new AlertDialog.Builder(getActivity())
|
||||
.setView(view)
|
||||
@@ -62,6 +61,7 @@ public abstract class MessageSelectorFragment
|
||||
}
|
||||
|
||||
protected void handleDeleteMessages(int chatId, final int[] messageIds) {
|
||||
DcContext dcContext = DcHelper.getContext(getContext());
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
boolean canDeleteForAll = true;
|
||||
if (dcChat.isEncrypted() && dcChat.canSend() && !dcChat.isSelfTalk()) {
|
||||
@@ -134,7 +134,7 @@ public abstract class MessageSelectorFragment
|
||||
protected void handleShowInChat(final DcMsg dcMsg) {
|
||||
Intent intent = new Intent(getContext(), ConversationActivity.class);
|
||||
intent.putExtra(ConversationActivity.CHAT_ID_EXTRA, dcMsg.getChatId());
|
||||
intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, DcMsg.getMessagePosition(dcMsg, dcContext));
|
||||
intent.putExtra(ConversationActivity.STARTING_POSITION_EXTRA, DcMsg.getMessagePosition(dcMsg, DcHelper.getContext(getContext())));
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
@@ -144,6 +144,7 @@ public abstract class MessageSelectorFragment
|
||||
|
||||
protected void handleResendMessage(final Set<DcMsg> dcMsgsSet) {
|
||||
int[] ids = DcMsg.msgSetToIds(dcMsgsSet);
|
||||
DcContext dcContext = DcHelper.getContext(getContext());
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
boolean success = dcContext.resendMsgs(ids);
|
||||
Util.runOnMain(() -> {
|
||||
|
||||
@@ -22,10 +22,7 @@ import static org.thoughtcrime.securesms.util.ShareUtil.acquireRelayMessageConte
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.isRelayingMessageContent;
|
||||
|
||||
import android.content.Intent;
|
||||
import android.net.Uri;
|
||||
import android.os.Bundle;
|
||||
import android.util.Log;
|
||||
import android.widget.Toast;
|
||||
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
|
||||
@@ -37,7 +34,6 @@ import com.google.zxing.integration.android.IntentResult;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.qr.QrActivity;
|
||||
import org.thoughtcrime.securesms.qr.QrCodeHandler;
|
||||
import org.thoughtcrime.securesms.util.MailtoUtil;
|
||||
|
||||
import chat.delta.rpc.types.SecurejoinSource;
|
||||
import chat.delta.rpc.types.SecurejoinUiPath;
|
||||
@@ -57,53 +53,6 @@ public class NewConversationActivity extends ContactSelectionActivity {
|
||||
super.onCreate(bundle, ready);
|
||||
assert getSupportActionBar() != null;
|
||||
getSupportActionBar().setDisplayHomeAsUpEnabled(true);
|
||||
handleIntent();
|
||||
}
|
||||
|
||||
private void handleIntent() {
|
||||
Intent intent = getIntent();
|
||||
String action = intent.getAction();
|
||||
if(Intent.ACTION_VIEW.equals(action) || Intent.ACTION_SENDTO.equals(action)) {
|
||||
try {
|
||||
Uri uri = intent.getData();
|
||||
if(uri != null) {
|
||||
String scheme = uri.getScheme();
|
||||
if(MailtoUtil.isMailto(uri)) {
|
||||
String textToShare = MailtoUtil.getText(uri);
|
||||
String[] recipientsArray = MailtoUtil.getRecipients(uri);
|
||||
if (recipientsArray.length >= 1) {
|
||||
if (!textToShare.isEmpty()) {
|
||||
getIntent().putExtra(TEXT_EXTRA, textToShare);
|
||||
}
|
||||
final String addr = recipientsArray[0];
|
||||
final DcContext dcContext = DcHelper.getContext(this);
|
||||
int contactId = dcContext.lookupContactIdByAddr(addr);
|
||||
if (contactId == 0 && dcContext.mayBeValidAddr(addr)) {
|
||||
contactId = dcContext.createContact(null, recipientsArray[0]);
|
||||
}
|
||||
if (contactId == 0) {
|
||||
Toast.makeText(this, R.string.bad_email_address, Toast.LENGTH_LONG).show();
|
||||
} else {
|
||||
onContactSelected(contactId);
|
||||
}
|
||||
} else {
|
||||
Intent shareIntent = new Intent(this, ShareActivity.class);
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, textToShare);
|
||||
startActivity(shareIntent);
|
||||
finish();
|
||||
}
|
||||
} else if(scheme != null && scheme.startsWith("http")) {
|
||||
Intent shareIntent = new Intent(this, ShareActivity.class);
|
||||
shareIntent.putExtra(Intent.EXTRA_TEXT, uri.toString());
|
||||
startActivity(shareIntent);
|
||||
finish();
|
||||
}
|
||||
}
|
||||
}
|
||||
catch(Exception e) {
|
||||
Log.e(TAG, "start activity from external 'mailto:' link failed", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -30,6 +30,8 @@ import java.util.Collections;
|
||||
import java.util.HashSet;
|
||||
import java.util.Set;
|
||||
|
||||
import chat.delta.rpc.RpcException;
|
||||
|
||||
public class ProfileAdapter extends RecyclerView.Adapter
|
||||
{
|
||||
public static final int ITEM_AVATAR = 10;
|
||||
@@ -38,8 +40,8 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
public static final int ITEM_ALL_MEDIA_BUTTON = 30;
|
||||
public static final int ITEM_SEND_MESSAGE_BUTTON = 35;
|
||||
public static final int ITEM_LAST_SEEN = 40;
|
||||
public static final int ITEM_BLOCKED = 43;
|
||||
public static final int ITEM_INTRODUCED_BY = 45;
|
||||
public static final int ITEM_ADDRESS = 50;
|
||||
public static final int ITEM_HEADER = 53;
|
||||
public static final int ITEM_MEMBERS = 55;
|
||||
public static final int ITEM_SHARED_CHATS = 60;
|
||||
@@ -140,7 +142,7 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
} else if (viewType == ITEM_ALL_MEDIA_BUTTON || viewType == ITEM_SEND_MESSAGE_BUTTON) {
|
||||
final ProfileTextItem item = (ProfileTextItem)layoutInflater.inflate(R.layout.profile_text_item_button, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else if (viewType == ITEM_LAST_SEEN || viewType == ITEM_INTRODUCED_BY || viewType == ITEM_ADDRESS) {
|
||||
} else if (viewType == ITEM_LAST_SEEN || viewType == ITEM_INTRODUCED_BY || viewType == ITEM_BLOCKED) {
|
||||
final ProfileTextItem item = (ProfileTextItem)layoutInflater.inflate(R.layout.profile_text_item_small, parent, false);
|
||||
return new ViewHolder(item);
|
||||
} else {
|
||||
@@ -206,14 +208,11 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
else if(holder.itemView instanceof ProfileTextItem) {
|
||||
ProfileTextItem item = (ProfileTextItem) holder.itemView;
|
||||
item.setOnClickListener(view -> clickListener.onSettingsClicked(data.viewType));
|
||||
boolean tintIcon = data.viewType != ITEM_INTRODUCED_BY;
|
||||
boolean tintIcon = data.viewType != ITEM_INTRODUCED_BY && data.viewType != ITEM_BLOCKED;
|
||||
item.set(data.label, data.icon, tintIcon);
|
||||
if (data.viewType == ITEM_LAST_SEEN || data.viewType == ITEM_ADDRESS) {
|
||||
if (data.viewType == ITEM_BLOCKED) {
|
||||
int padding = (int)((float)context.getResources().getDimensionPixelSize(R.dimen.contact_list_normal_padding) * 1.2);
|
||||
item.setPadding(item.getPaddingLeft(), item.getPaddingTop(), item.getPaddingRight(), padding);
|
||||
if (data.viewType == ITEM_ADDRESS) {
|
||||
fragment.registerForContextMenu(item);
|
||||
}
|
||||
} else if (data.viewType == ITEM_INTRODUCED_BY) {
|
||||
int padding = context.getResources().getDimensionPixelSize(R.dimen.contact_list_normal_padding);
|
||||
item.setPadding(item.getPaddingLeft(), padding, item.getPaddingRight(), item.getPaddingBottom());
|
||||
@@ -281,8 +280,26 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
|
||||
itemData.add(new ItemData(ITEM_AVATAR, null, 0));
|
||||
|
||||
if (isSelfTalk || dcContact != null && !dcContact.getStatus().isEmpty()) {
|
||||
itemDataStatusText = isSelfTalk ? context.getString(R.string.saved_messages_explain) : dcContact.getStatus();
|
||||
// Show status/description for contacts, self-talk, groups, and broadcast channels
|
||||
String statusOrDescription = "";
|
||||
if (isSelfTalk) {
|
||||
statusOrDescription = context.getString(R.string.saved_messages_explain);
|
||||
} else if (dcContact != null && !dcContact.getStatus().isEmpty()) {
|
||||
statusOrDescription = dcContact.getStatus();
|
||||
} else if (dcChat != null && (dcChat.isGroup() || isOutBroadcast)) {
|
||||
// Load group or broadcast channel description
|
||||
try {
|
||||
String description = DcHelper.getRpc(context).getChatDescription(dcContext.getAccountId(), dcChat.getId());
|
||||
if (description != null && !description.isEmpty()) {
|
||||
statusOrDescription = description;
|
||||
}
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
if (!statusOrDescription.isEmpty()) {
|
||||
itemDataStatusText = statusOrDescription;
|
||||
itemData.add(new ItemData(ITEM_SIGNATURE, itemDataStatusText, 0));
|
||||
} else {
|
||||
itemData.add(new ItemData(ITEM_DIVIDER, null, 0));
|
||||
@@ -308,6 +325,10 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
}
|
||||
*/
|
||||
|
||||
if (dcContact != null && !isDeviceTalk && !isSelfTalk && dcContact.isBlocked()) {
|
||||
itemData.add(new ItemData(ITEM_BLOCKED, context.getString(R.string.contact_blocked), R.drawable.contact_blocked_24));
|
||||
}
|
||||
|
||||
if (memberList!=null && !isInBroadcast && !isMailingList) {
|
||||
itemData.add(new ItemData(ITEM_DIVIDER, null, 0));
|
||||
if (dcChat != null) {
|
||||
@@ -345,10 +366,6 @@ public class ProfileAdapter extends RecyclerView.Adapter
|
||||
String introducedBy = context.getString(R.string.verified_by_unknown);
|
||||
itemData.add(new ItemData(ITEM_INTRODUCED_BY, introducedBy, R.drawable.ic_verified));
|
||||
}
|
||||
|
||||
if (dcContact != null) {
|
||||
itemData.add(new ItemData(ITEM_ADDRESS, dcContact.getAddr(), 0));
|
||||
}
|
||||
}
|
||||
|
||||
notifyDataSetChanged();
|
||||
|
||||
@@ -310,11 +310,27 @@ public class ProfileFragment extends Fragment
|
||||
super.onActivityResult(requestCode, resultCode, data);
|
||||
if (requestCode==REQUEST_CODE_PICK_CONTACT && resultCode==Activity.RESULT_OK && data!=null) {
|
||||
List<Integer> selected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.CONTACTS_EXTRA);
|
||||
if(selected == null) return;
|
||||
List<Integer> deselected = data.getIntegerArrayListExtra(ContactMultiSelectionActivity.DESELECTED_CONTACTS_EXTRA);
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
for (Integer contactId : selected) {
|
||||
if (contactId!=null) {
|
||||
dcContext.addContactToChat(chatId, contactId);
|
||||
if (deselected != null) {
|
||||
// Remove members that were deselected
|
||||
int[] members = dcContext.getChatContacts(chatId);
|
||||
for (int contactId : deselected) {
|
||||
for (int memberId : members) {
|
||||
if (memberId == contactId) {
|
||||
dcContext.removeContactFromChat(chatId, memberId);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (selected != null) {
|
||||
// Add new members
|
||||
for (Integer contactId : selected) {
|
||||
if (contactId != null) {
|
||||
dcContext.addContactToChat(chatId, contactId);
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -104,26 +104,25 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
|
||||
resolvedExtras = new ArrayList<>();
|
||||
|
||||
List<Uri> streamExtras = new ArrayList<>();
|
||||
if (MailtoUtil.isMailto(getIntent().getData())) {
|
||||
String[] extraEmail = getIntent().getStringArrayExtra(Intent.EXTRA_EMAIL);
|
||||
if (extraEmail == null || extraEmail.length == 0) {
|
||||
getIntent().putExtra(Intent.EXTRA_EMAIL, MailtoUtil.getRecipients(getIntent().getData()));
|
||||
}
|
||||
String text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
|
||||
if (text == null || text.isEmpty()) {
|
||||
getIntent().putExtra(Intent.EXTRA_TEXT, MailtoUtil.getText(getIntent().getData()));
|
||||
}
|
||||
}
|
||||
|
||||
if (Intent.ACTION_SEND.equals(getIntent().getAction()) &&
|
||||
getIntent().getParcelableExtra(Intent.EXTRA_STREAM) != null) {
|
||||
Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM);
|
||||
streamExtras.add(uri);
|
||||
} else if (getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM) != null) {
|
||||
streamExtras = getIntent().getParcelableArrayListExtra(Intent.EXTRA_STREAM);
|
||||
} else {
|
||||
Uri uri = getIntent().getData();
|
||||
if (MailtoUtil.isMailto(uri)) {
|
||||
String[] extraEmail = getIntent().getStringArrayExtra(Intent.EXTRA_EMAIL);
|
||||
if (extraEmail == null || extraEmail.length == 0) {
|
||||
getIntent().putExtra(Intent.EXTRA_EMAIL, MailtoUtil.getRecipients(uri));
|
||||
}
|
||||
String text = getIntent().getStringExtra(Intent.EXTRA_TEXT);
|
||||
if (text == null || text.isEmpty()) {
|
||||
getIntent().putExtra(Intent.EXTRA_TEXT, MailtoUtil.getText(uri));
|
||||
}
|
||||
} else if (uri != null) {
|
||||
streamExtras.add(uri);
|
||||
}
|
||||
} else if (getIntent().getData() != null) {
|
||||
streamExtras.add(getIntent().getData());
|
||||
}
|
||||
|
||||
if (needsFilePermission(streamExtras)) {
|
||||
@@ -265,6 +264,7 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity implement
|
||||
}
|
||||
|
||||
chatId = dcContext.createChatByContactId(contactId);
|
||||
accId = dcContext.getAccountId();
|
||||
}
|
||||
Intent composeIntent;
|
||||
if (accId != -1 && chatId != -1) {
|
||||
|
||||
@@ -77,7 +77,7 @@ public class WebViewActivity extends PassphraseRequiredActionBarActivity
|
||||
findViewById(R.id.status_bar_background).setBackgroundResource(R.drawable.search_toolbar_shadow);
|
||||
} else {
|
||||
// add padding to avoid content hidden behind system bars
|
||||
ViewUtil.applyWindowInsets(findViewById(R.id.content_container));
|
||||
ViewUtil.applyWindowInsets(findViewById(R.id.content_container), true, true, true, true, true);
|
||||
}
|
||||
|
||||
webView.setWebViewClient(new WebViewClient() {
|
||||
|
||||
@@ -15,6 +15,7 @@ import android.view.View;
|
||||
import android.widget.Button;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
@@ -36,6 +37,7 @@ import org.thoughtcrime.securesms.qr.QrCodeHandler;
|
||||
import org.thoughtcrime.securesms.qr.RegistrationQrActivity;
|
||||
import org.thoughtcrime.securesms.service.GenericForegroundService;
|
||||
import org.thoughtcrime.securesms.service.NotificationController;
|
||||
import org.thoughtcrime.securesms.util.Prefs;
|
||||
import org.thoughtcrime.securesms.util.StorageUtil;
|
||||
import org.thoughtcrime.securesms.util.StreamUtil;
|
||||
import org.thoughtcrime.securesms.util.Util;
|
||||
@@ -67,16 +69,48 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
// add padding to avoid content hidden behind system bars
|
||||
ViewUtil.applyWindowInsets(findViewById(R.id.content_container));
|
||||
|
||||
findViewById(R.id.signup_button).setOnClickListener((v) -> startInstantOnboardingActivity());
|
||||
findViewById(R.id.add_as_second_device_button).setOnClickListener((v) -> startAddAsSecondDeviceActivity());
|
||||
findViewById(R.id.signup_button).setOnClickListener((v) -> startActivity(new Intent(this, InstantOnboardingActivity.class)));
|
||||
findViewById(R.id.add_as_second_device_button).setOnClickListener((v) -> showSignInDialogWithPermission());
|
||||
findViewById(R.id.backup_button).setOnClickListener((v) -> startImportBackup());
|
||||
|
||||
registerForEvents();
|
||||
initializeActionBar();
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
AccountManager accountManager = AccountManager.getInstance();
|
||||
if (accountManager.canRollbackAccountCreation(WelcomeActivity.this)) {
|
||||
accountManager.rollbackAccountCreation(WelcomeActivity.this);
|
||||
} else {
|
||||
setEnabled(false);
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
DcHelper.maybeShowMigrationError(this);
|
||||
}
|
||||
|
||||
private void showSignInDialogWithPermission() {
|
||||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU
|
||||
&& !Prefs.getBooleanPreference(this, Prefs.ASKED_FOR_NOTIFICATION_PERMISSION, false)) {
|
||||
Prefs.setBooleanPreference(this, Prefs.ASKED_FOR_NOTIFICATION_PERMISSION, true);
|
||||
Permissions.with(this)
|
||||
.request(Manifest.permission.POST_NOTIFICATIONS)
|
||||
.ifNecessary()
|
||||
.onAllGranted(() -> {
|
||||
startAddAsSecondDeviceActivity();
|
||||
})
|
||||
.onAnyDenied(() -> {
|
||||
startAddAsSecondDeviceActivity();
|
||||
})
|
||||
.execute();
|
||||
} else {
|
||||
startAddAsSecondDeviceActivity();
|
||||
}
|
||||
}
|
||||
|
||||
protected void initializeActionBar() {
|
||||
ActionBar supportActionBar = getSupportActionBar();
|
||||
if (supportActionBar == null) throw new AssertionError();
|
||||
@@ -97,7 +131,7 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
|
||||
switch (item.getItemId()) {
|
||||
case android.R.id.home:
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -131,12 +165,6 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
Permissions.onRequestPermissionsResult(this, requestCode, permissions, grantResults);
|
||||
}
|
||||
|
||||
private void startInstantOnboardingActivity() {
|
||||
Intent intent = new Intent(this, InstantOnboardingActivity.class);
|
||||
intent.putExtra(InstantOnboardingActivity.FROM_WELCOME, true);
|
||||
startActivity(intent);
|
||||
}
|
||||
|
||||
private void startAddAsSecondDeviceActivity() {
|
||||
new IntentIntegrator(this).setCaptureActivity(RegistrationQrActivity.class)
|
||||
.addExtra(RegistrationQrActivity.ADD_AS_SECOND_DEVICE_EXTRA, true)
|
||||
@@ -352,14 +380,4 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
AccountManager accountManager = AccountManager.getInstance();
|
||||
if (accountManager.canRollbackAccountCreation(this)) {
|
||||
accountManager.rollbackAccountCreation(this);
|
||||
} else {
|
||||
super.onBackPressed();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+27
-15
@@ -47,24 +47,31 @@ import chat.delta.rpc.RpcException;
|
||||
public class AccountSelectionListFragment extends DialogFragment implements DcEventCenter.DcEventDelegate
|
||||
{
|
||||
private static final String TAG = AccountSelectionListFragment.class.getSimpleName();
|
||||
private final ConversationListActivity activity;
|
||||
private static final String ARG_SELECT_ONLY = "select_only";
|
||||
private RecyclerView recyclerView;
|
||||
private AccountSelectionListAdapter adapter;
|
||||
private boolean selectOnly;
|
||||
|
||||
public AccountSelectionListFragment(ConversationListActivity activity) {
|
||||
super();
|
||||
this.activity = activity;
|
||||
public static AccountSelectionListFragment newInstance(boolean selectOnly) {
|
||||
AccountSelectionListFragment fragment = new AccountSelectionListFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putBoolean(ARG_SELECT_ONLY, selectOnly);
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(getActivity())
|
||||
selectOnly = getArguments() != null && getArguments().getBoolean(ARG_SELECT_ONLY, false);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(requireActivity())
|
||||
.setTitle(R.string.switch_account)
|
||||
.setNeutralButton(R.string.connectivity, ((dialog, which) -> {
|
||||
startActivity(new Intent(getActivity(), ConnectivityActivity.class));
|
||||
}))
|
||||
.setNegativeButton(R.string.cancel, null);
|
||||
if (!selectOnly) {
|
||||
builder.setNeutralButton(R.string.connectivity, ((dialog, which) -> {
|
||||
startActivity(new Intent(getActivity(), ConnectivityActivity.class));
|
||||
}));
|
||||
}
|
||||
|
||||
LayoutInflater inflater = getActivity().getLayoutInflater();
|
||||
View view = inflater.inflate(R.layout.account_selection_list_fragment, null);
|
||||
@@ -99,18 +106,20 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
DcAccounts accounts = DcHelper.getAccounts(getActivity());
|
||||
int[] accountIds = accounts.getAll();
|
||||
|
||||
int[] ids = new int[accountIds.length + 1];
|
||||
int[] ids = new int[(selectOnly? 0 : 1) + accountIds.length];
|
||||
int j = 0;
|
||||
for (int accountId : accountIds) {
|
||||
ids[j++] = accountId;
|
||||
}
|
||||
ids[j] = DC_CONTACT_ID_ADD_ACCOUNT;
|
||||
if (!selectOnly) ids[j] = DC_CONTACT_ID_ADD_ACCOUNT;
|
||||
adapter.changeData(ids, accounts.getSelectedAccount().getAccountId());
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onCreateContextMenu(@NonNull ContextMenu menu, @NonNull View v, ContextMenu.ContextMenuInfo menuInfo) {
|
||||
super.onCreateContextMenu(menu, v, menuInfo);
|
||||
if (selectOnly) return;
|
||||
|
||||
requireActivity().getMenuInflater().inflate(R.menu.account_item_context, menu);
|
||||
|
||||
AccountSelectionListItem listItem = (AccountSelectionListItem) v;
|
||||
@@ -173,6 +182,7 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
}
|
||||
|
||||
private void onSetTag(int accountId) {
|
||||
ConversationListActivity activity = (ConversationListActivity)requireActivity();
|
||||
AccountSelectionListFragment.this.dismiss();
|
||||
|
||||
DcContext dcContext = DcHelper.getAccounts(activity).getAccount(accountId);
|
||||
@@ -188,14 +198,15 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
.setPositiveButton(android.R.string.ok, (d, b) -> {
|
||||
String newTag = inputField.getText().toString().trim();
|
||||
dcContext.setConfig(CONFIG_PRIVATE_TAG, newTag);
|
||||
AccountManager.getInstance().showSwitchAccountMenu(activity);
|
||||
AccountManager.getInstance().showSwitchAccountMenu(activity, selectOnly);
|
||||
})
|
||||
.setNegativeButton(R.string.cancel, (d, b) -> AccountManager.getInstance().showSwitchAccountMenu(activity))
|
||||
.setNegativeButton(R.string.cancel, (d, b) -> AccountManager.getInstance().showSwitchAccountMenu(activity, selectOnly))
|
||||
.show();
|
||||
}
|
||||
|
||||
private void onDeleteProfile(int accountId) {
|
||||
AccountSelectionListFragment.this.dismiss();
|
||||
ConversationListActivity activity = (ConversationListActivity)requireActivity();
|
||||
DcAccounts accounts = DcHelper.getAccounts(activity);
|
||||
Rpc rpc = DcHelper.getRpc(activity);
|
||||
|
||||
@@ -230,7 +241,7 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
AlertDialog dialog = new AlertDialog.Builder(activity)
|
||||
.setTitle(R.string.delete_account)
|
||||
.setView(dialogView)
|
||||
.setNegativeButton(R.string.cancel, (d, which) -> AccountManager.getInstance().showSwitchAccountMenu(activity))
|
||||
.setNegativeButton(R.string.cancel, (d, which) -> AccountManager.getInstance().showSwitchAccountMenu(activity, selectOnly))
|
||||
.setPositiveButton(R.string.delete, (d2, w2) -> activity.onDeleteProfile(accountId))
|
||||
.show();
|
||||
Util.redPositiveButton(dialog);
|
||||
@@ -247,13 +258,14 @@ public class AccountSelectionListFragment extends DialogFragment implements DcEv
|
||||
|
||||
@Override
|
||||
public void onItemClick(AccountSelectionListItem contact) {
|
||||
Activity activity = requireActivity();
|
||||
AccountSelectionListFragment.this.dismiss();
|
||||
ConversationListActivity activity = (ConversationListActivity)requireActivity();
|
||||
int accountId = contact.getAccountId();
|
||||
if (accountId == DC_CONTACT_ID_ADD_ACCOUNT) {
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(activity, 0);
|
||||
} else if (accountId != DcHelper.getAccounts(activity).getSelectedAccount().getAccountId()) {
|
||||
AccountManager.getInstance().switchAccountAndStartActivity(activity, accountId);
|
||||
AccountManager.getInstance().switchAccount(activity, accountId);
|
||||
activity.onProfileSwitched(accountId);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -43,12 +43,14 @@ public class CallActivity extends WebViewActivity implements DcEventCenter.DcEve
|
||||
public static final String EXTRA_CHAT_ID = "chat_id";
|
||||
public static final String EXTRA_CALL_ID = "call_id";
|
||||
public static final String EXTRA_HASH = "hash";
|
||||
public static final String EXTRA_HAS_VIDEO = "has_video";
|
||||
|
||||
private DcContext dcContext;
|
||||
private Rpc rpc;
|
||||
private int accId;
|
||||
private int chatId;
|
||||
private int callId;
|
||||
private boolean hasVideo;
|
||||
private boolean ended = false;
|
||||
|
||||
@SuppressLint("SetJavaScriptEnabled")
|
||||
@@ -58,7 +60,9 @@ public class CallActivity extends WebViewActivity implements DcEventCenter.DcEve
|
||||
|
||||
Bundle bundle = getIntent().getExtras();
|
||||
assert bundle != null;
|
||||
hasVideo = bundle.getBoolean(EXTRA_HAS_VIDEO, true);
|
||||
String hash = bundle.getString(EXTRA_HASH, "");
|
||||
String query = hasVideo? "" : "?noOutgoingVideoInitially";
|
||||
accId = bundle.getInt(EXTRA_ACCOUNT_ID, -1);
|
||||
chatId = bundle.getInt(EXTRA_CHAT_ID, 0);
|
||||
callId = bundle.getInt(EXTRA_CALL_ID, 0);
|
||||
@@ -94,7 +98,7 @@ public class CallActivity extends WebViewActivity implements DcEventCenter.DcEve
|
||||
.withPermanentDenialDialog(getString(R.string.perm_explain_access_to_camera_denied))
|
||||
.onAllGranted(() -> {
|
||||
String url = "file:///android_asset/calls/index.html";
|
||||
webView.loadUrl(url + hash);
|
||||
webView.loadUrl(url + query + hash);
|
||||
}).onAnyDenied(this::finish)
|
||||
.execute();
|
||||
}
|
||||
@@ -168,7 +172,7 @@ public class CallActivity extends WebViewActivity implements DcEventCenter.DcEve
|
||||
@JavascriptInterface
|
||||
public void startCall(String payload) {
|
||||
try {
|
||||
callId = rpc.placeOutgoingCall(accId, chatId, payload);
|
||||
callId = rpc.placeOutgoingCall(accId, chatId, payload, hasVideo);
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "Error", e);
|
||||
}
|
||||
|
||||
@@ -18,28 +18,29 @@ import java.nio.charset.StandardCharsets;
|
||||
public class CallUtil {
|
||||
private static final String TAG = CallUtil.class.getSimpleName();
|
||||
|
||||
public static void startCall(Activity activity, int chatId) {
|
||||
public static void startCall(Activity activity, int chatId, boolean hasVideo) {
|
||||
Permissions.with(activity)
|
||||
.request(Manifest.permission.CAMERA, Manifest.permission.RECORD_AUDIO)
|
||||
.ifNecessary()
|
||||
.withPermanentDenialDialog(activity.getString(R.string.perm_explain_access_to_camera_denied))
|
||||
.onAllGranted(() -> {
|
||||
int accId = DcHelper.getContext(activity).getAccountId();
|
||||
startCall(activity, accId, chatId);
|
||||
startCall(activity, accId, chatId, hasVideo);
|
||||
})
|
||||
.execute();
|
||||
}
|
||||
|
||||
public static void startCall(Context context, int accId, int chatId) {
|
||||
public static void startCall(Context context, int accId, int chatId, boolean hasVideo) {
|
||||
Intent intent = new Intent(context, CallActivity.class);
|
||||
intent.setAction(Intent.ACTION_VIEW);
|
||||
intent.putExtra(CallActivity.EXTRA_ACCOUNT_ID, accId);
|
||||
intent.putExtra(CallActivity.EXTRA_CHAT_ID, chatId);
|
||||
intent.putExtra(CallActivity.EXTRA_HAS_VIDEO, hasVideo);
|
||||
intent.putExtra(CallActivity.EXTRA_HASH, "#startCall");
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
public static void openCall(Context context, int accId, int chatId, int callId, String payload) {
|
||||
public static void openCall(Context context, int accId, int chatId, int callId, String payload, boolean hasVideo) {
|
||||
String base64 = Base64.encodeToString(payload.getBytes(StandardCharsets.UTF_8), Base64.NO_WRAP);
|
||||
String hash = "";
|
||||
try {
|
||||
@@ -53,6 +54,7 @@ public class CallUtil {
|
||||
intent.putExtra(CallActivity.EXTRA_ACCOUNT_ID, accId);
|
||||
intent.putExtra(CallActivity.EXTRA_CHAT_ID, chatId);
|
||||
intent.putExtra(CallActivity.EXTRA_CALL_ID, callId);
|
||||
intent.putExtra(CallActivity.EXTRA_HAS_VIDEO, hasVideo);
|
||||
intent.putExtra(CallActivity.EXTRA_HASH, hash);
|
||||
context.startActivity(intent);
|
||||
}
|
||||
|
||||
@@ -71,6 +71,8 @@ public class CallItemView extends FrameLayout {
|
||||
title.setText(isOutgoing? R.string.outgoing_call : R.string.incoming_call);
|
||||
}
|
||||
|
||||
icon.setImageResource(callInfo.hasVideo? R.drawable.ic_videocam_white_24dp : R.drawable.baseline_call_24);
|
||||
|
||||
int[] attrs;
|
||||
if (isOutgoing) {
|
||||
attrs = new int[]{
|
||||
|
||||
@@ -15,39 +15,51 @@ import androidx.annotation.Nullable;
|
||||
import com.b44t.messenger.DcMsg;
|
||||
|
||||
import org.thoughtcrime.securesms.R;
|
||||
import org.thoughtcrime.securesms.connect.DcHelper;
|
||||
import org.thoughtcrime.securesms.util.DateUtils;
|
||||
|
||||
import chat.delta.rpc.Rpc;
|
||||
import chat.delta.rpc.RpcException;
|
||||
|
||||
public class ConversationItemFooter extends LinearLayout {
|
||||
|
||||
private TextView dateView;
|
||||
private TextView editedView;
|
||||
private TextView viewsLabel;
|
||||
private ImageView viewsIcon;
|
||||
private ImageView bookmarkIndicatorView;
|
||||
private ImageView emailIndicatorView;
|
||||
private ImageView locationIndicatorView;
|
||||
private DeliveryStatusView deliveryStatusView;
|
||||
private Integer textColor = null;
|
||||
private int callDuration = 0;
|
||||
private Context context;
|
||||
private Rpc rpc;
|
||||
|
||||
public ConversationItemFooter(Context context) {
|
||||
super(context);
|
||||
init(null);
|
||||
init(context, null);
|
||||
}
|
||||
|
||||
public ConversationItemFooter(Context context, @Nullable AttributeSet attrs) {
|
||||
super(context, attrs);
|
||||
init(attrs);
|
||||
init(context, attrs);
|
||||
}
|
||||
|
||||
public ConversationItemFooter(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
|
||||
super(context, attrs, defStyleAttr);
|
||||
init(attrs);
|
||||
init(context, attrs);
|
||||
}
|
||||
|
||||
private void init(@Nullable AttributeSet attrs) {
|
||||
private void init(Context context, @Nullable AttributeSet attrs) {
|
||||
this.context = context;
|
||||
this.rpc = DcHelper.getRpc(context);
|
||||
inflate(getContext(), R.layout.conversation_item_footer, this);
|
||||
|
||||
dateView = findViewById(R.id.footer_date);
|
||||
editedView = findViewById(R.id.footer_edited);
|
||||
viewsLabel = findViewById(R.id.footer_views);
|
||||
viewsIcon = findViewById(R.id.footer_views_icon);
|
||||
bookmarkIndicatorView = findViewById(R.id.footer_bookmark_indicator);
|
||||
emailIndicatorView = findViewById(R.id.footer_email_indicator);
|
||||
locationIndicatorView = findViewById(R.id.footer_location_indicator);
|
||||
@@ -79,13 +91,33 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
}
|
||||
|
||||
locationIndicatorView.setVisibility(messageRecord.hasLocation() ? View.VISIBLE : View.GONE);
|
||||
presentDeliveryStatus(messageRecord);
|
||||
|
||||
boolean isOutChannel = DcHelper.getContext(context).getChat(messageRecord.getChatId()).isOutBroadcast();
|
||||
|
||||
if (isOutChannel && messageRecord.isOutgoing()) {
|
||||
try {
|
||||
int accId = rpc.getSelectedAccountId();
|
||||
int count = rpc.getMessageReadReceiptCount(accId, messageRecord.getId());
|
||||
viewsLabel.setText(String.format("%d", count));
|
||||
viewsLabel.setVisibility(View.VISIBLE);
|
||||
viewsIcon.setVisibility(View.VISIBLE);
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
} else {
|
||||
viewsLabel.setVisibility(View.GONE);
|
||||
viewsIcon.setVisibility(View.GONE);
|
||||
}
|
||||
|
||||
presentDeliveryStatus(messageRecord, isOutChannel);
|
||||
}
|
||||
|
||||
public void setTextColor(int color) {
|
||||
textColor = color;
|
||||
dateView.setTextColor(color);
|
||||
editedView.setTextColor(color);
|
||||
viewsLabel.setTextColor(color);
|
||||
viewsIcon.setColorFilter(color);
|
||||
bookmarkIndicatorView.setColorFilter(color);
|
||||
emailIndicatorView.setColorFilter(color);
|
||||
locationIndicatorView.setColorFilter(color);
|
||||
@@ -106,7 +138,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
}
|
||||
}
|
||||
|
||||
private void presentDeliveryStatus(@NonNull DcMsg messageRecord) {
|
||||
private void presentDeliveryStatus(@NonNull DcMsg messageRecord, boolean isOutChannel) {
|
||||
// isDownloading is temporary and should be checked first.
|
||||
boolean isDownloading = messageRecord.getDownloadState() == DcMsg.DC_DOWNLOAD_IN_PROGRESS;
|
||||
boolean isCall = messageRecord.getType() == DcMsg.DC_MSG_CALL;
|
||||
@@ -114,7 +146,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
if (isDownloading) deliveryStatusView.setDownloading();
|
||||
else if (messageRecord.isPending()) deliveryStatusView.setPending();
|
||||
else if (messageRecord.isFailed()) deliveryStatusView.setFailed();
|
||||
else if (!messageRecord.isOutgoing() || isCall) deliveryStatusView.setNone();
|
||||
else if (!messageRecord.isOutgoing() || isCall || isOutChannel) deliveryStatusView.setNone();
|
||||
else if (messageRecord.isRemoteRead()) deliveryStatusView.setRead();
|
||||
else if (messageRecord.isDelivered()) deliveryStatusView.setSent();
|
||||
else if (messageRecord.isPreparing()) deliveryStatusView.setPreparing();
|
||||
|
||||
@@ -5,7 +5,6 @@ import android.content.Context;
|
||||
import android.content.Intent;
|
||||
import android.util.Log;
|
||||
|
||||
import androidx.annotation.Nullable;
|
||||
import androidx.fragment.app.FragmentActivity;
|
||||
import androidx.preference.PreferenceManager;
|
||||
|
||||
@@ -14,7 +13,6 @@ import com.b44t.messenger.DcContext;
|
||||
|
||||
import org.thoughtcrime.securesms.ApplicationContext;
|
||||
import org.thoughtcrime.securesms.ConversationListActivity;
|
||||
import org.thoughtcrime.securesms.InstantOnboardingActivity;
|
||||
import org.thoughtcrime.securesms.WelcomeActivity;
|
||||
import org.thoughtcrime.securesms.accounts.AccountSelectionListFragment;
|
||||
|
||||
@@ -123,10 +121,6 @@ public class AccountManager {
|
||||
}
|
||||
|
||||
public void switchAccountAndStartActivity(Activity activity, int destAccountId) {
|
||||
switchAccountAndStartActivity(activity, destAccountId, null);
|
||||
}
|
||||
|
||||
private void switchAccountAndStartActivity(Activity activity, int destAccountId, @Nullable String backupQr) {
|
||||
if (destAccountId==0) {
|
||||
beginAccountCreation(activity);
|
||||
} else {
|
||||
@@ -134,12 +128,8 @@ public class AccountManager {
|
||||
}
|
||||
|
||||
activity.finishAffinity();
|
||||
if (destAccountId==0) {
|
||||
Intent intent = new Intent(activity, WelcomeActivity.class);
|
||||
if (backupQr != null) {
|
||||
intent.putExtra(WelcomeActivity.BACKUP_QR_EXTRA, backupQr);
|
||||
}
|
||||
activity.startActivity(intent);
|
||||
if (destAccountId == 0) {
|
||||
activity.startActivity(new Intent(activity, WelcomeActivity.class));
|
||||
} else {
|
||||
activity.startActivity(new Intent(activity.getApplicationContext(), ConversationListActivity.class));
|
||||
}
|
||||
@@ -147,12 +137,21 @@ public class AccountManager {
|
||||
|
||||
// ui
|
||||
|
||||
public void showSwitchAccountMenu(ConversationListActivity activity) {
|
||||
AccountSelectionListFragment dialog = new AccountSelectionListFragment(activity);
|
||||
public void showSwitchAccountMenu(ConversationListActivity activity, boolean selectOnly) {
|
||||
AccountSelectionListFragment dialog = AccountSelectionListFragment.newInstance(selectOnly);
|
||||
dialog.show(((FragmentActivity) activity).getSupportFragmentManager(), null);
|
||||
}
|
||||
|
||||
public void addAccountFromSecondDevice(Activity activity, String backupQr) {
|
||||
switchAccountAndStartActivity(activity, 0, backupQr);
|
||||
DcAccounts accounts = DcHelper.getAccounts(activity);
|
||||
if (accounts.getSelectedAccount().isConfigured() == 1) {
|
||||
// the selected account is already configured, create a new one
|
||||
beginAccountCreation(activity);
|
||||
}
|
||||
|
||||
activity.finishAffinity();
|
||||
Intent intent = new Intent(activity, WelcomeActivity.class);
|
||||
intent.putExtra(WelcomeActivity.BACKUP_QR_EXTRA, backupQr);
|
||||
activity.startActivity(intent);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -164,6 +164,23 @@ public class DcEventCenter {
|
||||
});
|
||||
}
|
||||
|
||||
public void handleLogging(@NonNull DcEvent event) {
|
||||
final String logPrefix = "[accId="+event.getAccountId()+ "] ";
|
||||
switch (event.getId()) {
|
||||
case DcContext.DC_EVENT_INFO:
|
||||
Log.i("DeltaChat", logPrefix + event.getData2Str());
|
||||
break;
|
||||
|
||||
case DcContext.DC_EVENT_WARNING:
|
||||
Log.w("DeltaChat", logPrefix + event.getData2Str());
|
||||
break;
|
||||
|
||||
case DcContext.DC_EVENT_ERROR:
|
||||
Log.e("DeltaChat", logPrefix + event.getData2Str());
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
public long handleEvent(@NonNull DcEvent event) {
|
||||
int accountId = event.getAccountId();
|
||||
int id = event.getId();
|
||||
@@ -205,20 +222,7 @@ public class DcEventCenter {
|
||||
return 0;
|
||||
}
|
||||
|
||||
final String logPrefix = "[accId="+accountId + "] ";
|
||||
switch (id) {
|
||||
case DcContext.DC_EVENT_INFO:
|
||||
Log.i("DeltaChat", logPrefix + event.getData2Str());
|
||||
break;
|
||||
|
||||
case DcContext.DC_EVENT_WARNING:
|
||||
Log.w("DeltaChat", logPrefix + event.getData2Str());
|
||||
break;
|
||||
|
||||
case DcContext.DC_EVENT_ERROR:
|
||||
Log.e("DeltaChat", logPrefix + event.getData2Str());
|
||||
break;
|
||||
}
|
||||
handleLogging(event);
|
||||
|
||||
if (accountId != context.getDcContext().getAccountId()) {
|
||||
return 0;
|
||||
|
||||
@@ -101,6 +101,10 @@ public class ThreadRecord {
|
||||
return spannable;
|
||||
}
|
||||
|
||||
public boolean isOutChannel() {
|
||||
return recipient.getChat() != null && recipient.getChat().isOutBroadcast();
|
||||
}
|
||||
|
||||
public int getUnreadCount() {
|
||||
return unreadCount;
|
||||
}
|
||||
|
||||
@@ -61,6 +61,8 @@ import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import chat.delta.rpc.RpcException;
|
||||
|
||||
public class NotificationCenter {
|
||||
private static final String TAG = NotificationCenter.class.getSimpleName();
|
||||
@NonNull private final ApplicationContext context;
|
||||
@@ -164,7 +166,7 @@ public class NotificationCenter {
|
||||
return PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT | IntentUtils.FLAG_MUTABLE());
|
||||
}
|
||||
|
||||
public PendingIntent getOpenCallIntent(ChatData chatData, int callId, String payload, boolean autoAccept) {
|
||||
public PendingIntent getOpenCallIntent(ChatData chatData, int callId, String payload, boolean autoAccept, boolean hasVideo) {
|
||||
final Intent chatIntent = new Intent(context, ConversationActivity.class)
|
||||
.putExtra(ConversationActivity.ACCOUNT_ID_EXTRA, chatData.accountId)
|
||||
.putExtra(ConversationActivity.CHAT_ID_EXTRA, chatData.chatId)
|
||||
@@ -184,6 +186,7 @@ public class NotificationCenter {
|
||||
intent.putExtra(CallActivity.EXTRA_CHAT_ID, chatData.chatId);
|
||||
intent.putExtra(CallActivity.EXTRA_CALL_ID, callId);
|
||||
intent.putExtra(CallActivity.EXTRA_HASH, hash);
|
||||
intent.putExtra(CallActivity.EXTRA_HAS_VIDEO, hasVideo);
|
||||
intent.setPackage(context.getPackageName());
|
||||
return TaskStackBuilder.create(context)
|
||||
.addNextIntentWithParentStack(chatIntent)
|
||||
@@ -427,6 +430,13 @@ public class NotificationCenter {
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
NotificationManagerCompat notificationManager = NotificationManagerCompat.from(context);
|
||||
DcContext dcContext = context.getDcAccounts().getAccount(accId);
|
||||
boolean hasVideo;
|
||||
try {
|
||||
hasVideo = context.getRpc().callInfo(accId, callId).hasVideo;
|
||||
} catch (RpcException e) {
|
||||
Log.e(TAG, "Rpc.callInfo() failed", e);
|
||||
hasVideo = false;
|
||||
}
|
||||
int chatId = dcContext.getMsg(callId).getChatId();
|
||||
DcChat dcChat = dcContext.getChat(chatId);
|
||||
String name = dcChat.getName();
|
||||
@@ -434,7 +444,7 @@ public class NotificationCenter {
|
||||
String notificationChannel = getCallNotificationChannel(notificationManager, chatData, name);
|
||||
|
||||
PendingIntent declineCallIntent = getDeclineCallIntent(chatData, callId);
|
||||
PendingIntent openCallIntent = getOpenCallIntent(chatData, callId, payload, false);
|
||||
PendingIntent openCallIntent = getOpenCallIntent(chatData, callId, payload, false, hasVideo);
|
||||
|
||||
NotificationCompat.Builder builder = new NotificationCompat.Builder(context, notificationChannel)
|
||||
.setSmallIcon(R.drawable.icon_notification)
|
||||
@@ -459,7 +469,7 @@ public class NotificationCenter {
|
||||
new NotificationCompat.Action.Builder(
|
||||
R.drawable.ic_videocam_white_24dp,
|
||||
context.getString(R.string.answer_call),
|
||||
getOpenCallIntent(chatData, callId, payload, true)).build());
|
||||
getOpenCallIntent(chatData, callId, payload, true, hasVideo)).build());
|
||||
|
||||
Bitmap bitmap = getAvatar(dcChat);
|
||||
if (bitmap != null) {
|
||||
|
||||
@@ -21,7 +21,7 @@ import java.io.IOException;
|
||||
|
||||
public class AvatarHelper {
|
||||
/* the maximum width/height an avatar should have */
|
||||
public static final int AVATAR_SIZE = 640;
|
||||
public static final int AVATAR_SIZE = 512;
|
||||
|
||||
public static void setGroupAvatar(Context context, int chatId, Bitmap bitmap) {
|
||||
DcContext dcContext = DcHelper.getContext(context);
|
||||
|
||||
@@ -11,6 +11,7 @@ import android.view.Menu;
|
||||
import android.view.MenuItem;
|
||||
import android.widget.TextView;
|
||||
|
||||
import androidx.activity.OnBackPressedCallback;
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.appcompat.app.ActionBar;
|
||||
import androidx.appcompat.app.AlertDialog;
|
||||
@@ -56,6 +57,8 @@ public class BackupTransferActivity extends BaseActionBarActivity {
|
||||
private boolean notificationControllerClosed = false;
|
||||
public boolean warnAboutCopiedQrCodeOnAbort = false;
|
||||
|
||||
private OnBackPressedCallback backPressedCallback;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle icicle) {
|
||||
super.onCreate(icicle);
|
||||
@@ -89,6 +92,15 @@ public class BackupTransferActivity extends BaseActionBarActivity {
|
||||
|
||||
// add padding to avoid content hidden behind system bars
|
||||
ViewUtil.applyWindowInsets(findViewById(R.id.backup_provider_fragment));
|
||||
|
||||
backPressedCallback = new OnBackPressedCallback(true) {
|
||||
@Override
|
||||
public void handleOnBackPressed() {
|
||||
finishOrAskToFinish();
|
||||
}
|
||||
};
|
||||
|
||||
getOnBackPressedDispatcher().addCallback(this, backPressedCallback);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -107,18 +119,13 @@ public class BackupTransferActivity extends BaseActionBarActivity {
|
||||
return super.onPrepareOptionsMenu(menu);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBackPressed() {
|
||||
finishOrAskToFinish();
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(@NonNull MenuItem item) {
|
||||
super.onOptionsItemSelected(item);
|
||||
|
||||
int itemId = item.getItemId();
|
||||
if (itemId == android.R.id.home) {
|
||||
finishOrAskToFinish();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
} else if (itemId == R.id.troubleshooting) {
|
||||
DcHelper.openHelp(this, "#multiclient");
|
||||
|
||||
@@ -58,7 +58,9 @@ public class QrCodeHandler {
|
||||
public void handleOnlySecureJoinQr(String rawString, SecurejoinSource source, SecurejoinUiPath uiPath) {
|
||||
final DcLot qrParsed = dcContext.checkQr(rawString);
|
||||
if (!handleSecureJoinQr(qrParsed, rawString, source, uiPath)) {
|
||||
handleDefault(new AlertDialog.Builder(activity), rawString, qrParsed);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||
handleDefault(builder, rawString, qrParsed);
|
||||
builder.create().show();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -122,7 +124,9 @@ public class QrCodeHandler {
|
||||
public void handleOnlyAddRelayQr(String rawString) {
|
||||
final DcLot qrParsed = dcContext.checkQr(rawString);
|
||||
if (!handleAddRelayQr(qrParsed, rawString)) {
|
||||
handleDefault(new AlertDialog.Builder(activity), rawString, qrParsed);
|
||||
AlertDialog.Builder builder = new AlertDialog.Builder(activity);
|
||||
handleDefault(builder, rawString, qrParsed);
|
||||
builder.create().show();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -36,19 +36,24 @@ import chat.delta.rpc.types.Reactions;
|
||||
|
||||
public class ReactionsDetailsFragment extends DialogFragment implements DcEventCenter.DcEventDelegate {
|
||||
private static final String TAG = ReactionsDetailsFragment.class.getSimpleName();
|
||||
private static final String ARG_MSG_ID = "msg_id";
|
||||
|
||||
private RecyclerView recyclerView;
|
||||
private ReactionRecipientsAdapter adapter;
|
||||
private final int msgId;
|
||||
private int msgId;
|
||||
|
||||
public ReactionsDetailsFragment(int msgId) {
|
||||
super();
|
||||
this.msgId = msgId;
|
||||
public static ReactionsDetailsFragment newInstance(int msgId) {
|
||||
ReactionsDetailsFragment fragment = new ReactionsDetailsFragment();
|
||||
Bundle args = new Bundle();
|
||||
args.putInt(ARG_MSG_ID, msgId);
|
||||
fragment.setArguments(args);
|
||||
return fragment;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public Dialog onCreateDialog(Bundle savedInstanceState) {
|
||||
msgId = getArguments() != null? getArguments().getInt(ARG_MSG_ID, 0) : 0;
|
||||
adapter = new ReactionRecipientsAdapter(requireActivity(), GlideApp.with(requireActivity()), new ListClickListener());
|
||||
|
||||
LayoutInflater inflater = requireActivity().getLayoutInflater();
|
||||
|
||||
@@ -27,11 +27,4 @@ public class ScribbleActivity extends PassphraseRequiredActionBarActivity {
|
||||
boolean cropAvatar = getIntent().getBooleanExtra(CROP_AVATAR, false);
|
||||
imageEditorFragment = initFragment(R.id.scribble_container, ImageEditorFragment.newInstance(getIntent().getData(), cropAvatar));
|
||||
}
|
||||
|
||||
/* @Override
|
||||
public void onBackPressed() {
|
||||
if (!imageEditorFragment.onBackPressed()) {
|
||||
super.onBackPressed();
|
||||
}
|
||||
} */
|
||||
}
|
||||
|
||||
@@ -63,7 +63,7 @@ public class StickerSelectActivity extends FragmentActivity implements StickerSe
|
||||
@Override
|
||||
public boolean onOptionsItemSelected(MenuItem item) {
|
||||
if (item.getItemId() == android.R.id.home) {
|
||||
onBackPressed();
|
||||
getOnBackPressedDispatcher().onBackPressed();
|
||||
return true;
|
||||
}
|
||||
return super.onOptionsItemSelected(item);
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package org.thoughtcrime.securesms.util;
|
||||
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getForwardedMessageAccountId;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getForwardedMessageIDs;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedText;
|
||||
import static org.thoughtcrime.securesms.util.ShareUtil.getSharedUris;
|
||||
@@ -29,6 +30,11 @@ import java.io.InputStream;
|
||||
import java.io.InputStreamReader;
|
||||
import java.io.OutputStream;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
|
||||
import chat.delta.rpc.Rpc;
|
||||
import chat.delta.rpc.RpcException;
|
||||
|
||||
public class SendRelayedMessageUtil {
|
||||
private static final String TAG = SendRelayedMessageUtil.class.getSimpleName();
|
||||
@@ -40,12 +46,27 @@ public class SendRelayedMessageUtil {
|
||||
public static void immediatelyRelay(Activity activity, final Long[] chatIds) {
|
||||
ConversationListRelayingActivity.finishActivity();
|
||||
if (isForwarding(activity)) {
|
||||
int forwardedMsgAccId = getForwardedMessageAccountId(activity);
|
||||
int[] forwardedMessageIDs = getForwardedMessageIDs(activity);
|
||||
resetRelayingMessageContent(activity);
|
||||
if (forwardedMessageIDs == null) return;
|
||||
if (forwardedMessageIDs == null || forwardedMsgAccId <= 0) return;
|
||||
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
DcContext dcContext = DcHelper.getContext(activity);
|
||||
int accId = dcContext.getAccountId();
|
||||
if (forwardedMsgAccId != accId) {
|
||||
Rpc rpc = DcHelper.getRpc(activity);
|
||||
List<Integer> list = Util.toList(forwardedMessageIDs);
|
||||
for (long longChatId : chatIds) {
|
||||
try {
|
||||
rpc.forwardMessagesToAccount(forwardedMsgAccId, list, accId, (int)longChatId);
|
||||
} catch (RpcException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
for (long longChatId : chatIds) {
|
||||
int chatId = (int) longChatId;
|
||||
if (dcContext.getChat(chatId).isSelfTalk()) {
|
||||
|
||||
@@ -14,6 +14,7 @@ import androidx.annotation.NonNull;
|
||||
import java.util.ArrayList;
|
||||
|
||||
public class ShareUtil {
|
||||
private static final String FORWARDED_MESSAGE_ACCID = "forwarded_message_accid";
|
||||
private static final String FORWARDED_MESSAGE_IDS = "forwarded_message_ids";
|
||||
private static final String SHARED_URIS = "shared_uris";
|
||||
private static final String SHARED_CONTACT_ID = "shared_contact_id";
|
||||
@@ -27,11 +28,7 @@ public class ShareUtil {
|
||||
}
|
||||
|
||||
public static boolean isForwarding(Activity activity) {
|
||||
try {
|
||||
return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS) != null;
|
||||
} catch (NullPointerException npe) {
|
||||
return false;
|
||||
}
|
||||
return getForwardedMessageAccountId(activity) > 0;
|
||||
}
|
||||
|
||||
public static boolean isSharing(Activity activity) {
|
||||
@@ -66,6 +63,14 @@ public class ShareUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static int getForwardedMessageAccountId(Activity activity) {
|
||||
try {
|
||||
return activity.getIntent().getIntExtra(FORWARDED_MESSAGE_ACCID, -1);
|
||||
} catch (NullPointerException npe) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
static int[] getForwardedMessageIDs(Activity activity) {
|
||||
try {
|
||||
return activity.getIntent().getIntArrayExtra(FORWARDED_MESSAGE_IDS);
|
||||
@@ -137,6 +142,7 @@ public class ShareUtil {
|
||||
|
||||
public static void resetRelayingMessageContent(Activity activity) {
|
||||
try {
|
||||
activity.getIntent().removeExtra(FORWARDED_MESSAGE_ACCID);
|
||||
activity.getIntent().removeExtra(FORWARDED_MESSAGE_IDS);
|
||||
activity.getIntent().removeExtra(SHARED_URIS);
|
||||
activity.getIntent().removeExtra(SHARED_CONTACT_ID);
|
||||
@@ -153,7 +159,8 @@ public class ShareUtil {
|
||||
|
||||
public static void acquireRelayMessageContent(Activity currentActivity, @NonNull Intent newActivityIntent) {
|
||||
if (isForwarding(currentActivity)) {
|
||||
newActivityIntent.putExtra(FORWARDED_MESSAGE_IDS, getForwardedMessageIDs(currentActivity));
|
||||
int accId = getForwardedMessageAccountId(currentActivity);
|
||||
setForwardingMessageIds(newActivityIntent, getForwardedMessageIDs(currentActivity), accId);
|
||||
} else if (isSharing(currentActivity)) {
|
||||
newActivityIntent.putExtra(IS_SHARING, true);
|
||||
if (isDirectSharing(currentActivity)) {
|
||||
@@ -180,7 +187,8 @@ public class ShareUtil {
|
||||
}
|
||||
}
|
||||
|
||||
public static void setForwardingMessageIds(Intent composeIntent, int[] messageIds) {
|
||||
public static void setForwardingMessageIds(Intent composeIntent, int[] messageIds, int accId) {
|
||||
composeIntent.putExtra(FORWARDED_MESSAGE_ACCID, accId);
|
||||
composeIntent.putExtra(FORWARDED_MESSAGE_IDS, messageIds);
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,16 @@
|
||||
package org.thoughtcrime.securesms.util;
|
||||
|
||||
import androidx.annotation.NonNull;
|
||||
import androidx.core.text.BidiFormatter;
|
||||
|
||||
public class TextUtil {
|
||||
@NonNull
|
||||
public static String bidiAppend(String text, String suffix) {
|
||||
return BidiFormatter.getInstance().unicodeWrap(text) + suffix;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
public static String markAsExternal(String text) {
|
||||
return bidiAppend(text, " ↗");
|
||||
}
|
||||
}
|
||||
@@ -53,7 +53,9 @@ import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.io.OutputStream;
|
||||
import java.text.DecimalFormat;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.Locale;
|
||||
import java.util.Objects;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
@@ -115,6 +117,14 @@ public class Util {
|
||||
}
|
||||
}
|
||||
|
||||
public static List<Integer> toList(int[] array) {
|
||||
ArrayList<Integer> list = new ArrayList<>(array.length);
|
||||
for (int i : array) {
|
||||
list.add(i);
|
||||
}
|
||||
return list;
|
||||
}
|
||||
|
||||
public static @NonNull int[] appendInt(@Nullable int[] cur, int val) {
|
||||
if (cur == null) {
|
||||
return new int[] { val };
|
||||
|
||||
@@ -390,11 +390,27 @@ public class ViewUtil {
|
||||
/**
|
||||
* Apply window insets to a view by adding padding to avoid drawing elements behind system bars.
|
||||
* Convenience method that applies insets to all sides.
|
||||
* IME insets are propagated to child views.
|
||||
*
|
||||
* @param view The view to apply insets to
|
||||
*/
|
||||
public static void applyWindowInsets(@NonNull View view) {
|
||||
applyWindowInsets(view, true, true, true, true);
|
||||
applyWindowInsets(view, true, true, true, true, false);
|
||||
}
|
||||
|
||||
/**
|
||||
* Apply window insets to a view by adding padding to avoid drawing elements behind system bars.
|
||||
*
|
||||
* IME insets are propagated to child views.
|
||||
*
|
||||
* @param view The view to apply insets to
|
||||
* @param left Whether to apply left inset
|
||||
* @param top Whether to apply top inset
|
||||
* @param right Whether to apply right inset
|
||||
* @param bottom Whether to apply bottom inset
|
||||
*/
|
||||
public static void applyWindowInsets(@NonNull View view, boolean left, boolean top, boolean right, boolean bottom) {
|
||||
applyWindowInsets(view, left, top, right, bottom, false);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -408,8 +424,9 @@ public class ViewUtil {
|
||||
* @param top Whether to apply top inset
|
||||
* @param right Whether to apply right inset
|
||||
* @param bottom Whether to apply bottom inset
|
||||
* @param consumeImeInsets Whether to consume IME insets so they don't propagate to child views
|
||||
*/
|
||||
public static void applyWindowInsets(@NonNull View view, boolean left, boolean top, boolean right, boolean bottom) {
|
||||
public static void applyWindowInsets(@NonNull View view, boolean left, boolean top, boolean right, boolean bottom, boolean consumeImeInsets) {
|
||||
// Only enable on API 30+ where WindowInsets APIs work correctly
|
||||
if (!isEdgeToEdgeSupported()) return;
|
||||
|
||||
@@ -442,6 +459,11 @@ public class ViewUtil {
|
||||
bottom ? basePaddingBottom + insets.bottom : basePaddingBottom
|
||||
);
|
||||
|
||||
if (consumeImeInsets) {
|
||||
windowInsets = new WindowInsetsCompat.Builder(windowInsets)
|
||||
.setInsets(WindowInsetsCompat.Type.ime(), Insets.NONE)
|
||||
.build();
|
||||
}
|
||||
return windowInsets;
|
||||
});
|
||||
|
||||
|
||||
@@ -0,0 +1,5 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android" android:autoMirrored="true" android:height="24dp" android:viewportHeight="24" android:viewportWidth="24" android:width="24dp">
|
||||
|
||||
<path android:fillColor="#FF000000" android:pathData="M12,2C6.48,2 2,6.48 2,12s4.48,10 10,10 10,-4.48 10,-10S17.52,2 12,2zM4,12c0,-4.42 3.58,-8 8,-8 1.85,0 3.55,0.63 4.9,1.69L5.69,16.9C4.63,15.55 4,13.85 4,12zM12,20c-1.85,0 -3.55,-0.63 -4.9,-1.69L18.31,7.1C19.37,8.45 20,10.15 20,12c0,4.42 -3.58,8 -8,8z"/>
|
||||
|
||||
</vector>
|
||||
@@ -0,0 +1,9 @@
|
||||
<vector xmlns:android="http://schemas.android.com/apk/res/android"
|
||||
android:width="24dp"
|
||||
android:height="24dp"
|
||||
android:viewportWidth="24"
|
||||
android:viewportHeight="24">
|
||||
<path
|
||||
android:pathData="M12,4.5C7,4.5 2.73,7.61 1,12c1.73,4.39 6,7.5 11,7.5s9.27,-3.11 11,-7.5c-1.73,-4.39 -6,-7.5 -11,-7.5M12,17c-2.76,0 -5,-2.24 -5,-5s2.24,-5 5,-5s5,2.24 5,5s-2.24,5 -5,5m0,-8c-1.66,0 -3,1.34 -3,3s1.34,3 3,3s3,-1.34 3,-3s-1.34,-3 -3,-3"
|
||||
android:fillColor="#fff"/>
|
||||
</vector>
|
||||
@@ -44,7 +44,6 @@
|
||||
android:layout_width="30dp"
|
||||
android:layout_height="30dp"
|
||||
android:contentDescription="@null"
|
||||
android:src="@drawable/ic_videocam_white_24dp"
|
||||
/>
|
||||
|
||||
</LinearLayout>
|
||||
|
||||
@@ -62,6 +62,29 @@
|
||||
android:contentDescription="@string/location"
|
||||
tools:visibility="gone" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/footer_views_icon"
|
||||
android:layout_width="12sp"
|
||||
android:layout_height="11sp"
|
||||
android:layout_marginStart="6dp"
|
||||
android:layout_gravity="center_vertical|end"
|
||||
android:src="@drawable/ic_baseline_eye"
|
||||
android:importantForAccessibility="no"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible" />
|
||||
|
||||
<TextView
|
||||
android:id="@+id/footer_views"
|
||||
android:autoLink="none"
|
||||
android:layout_width="wrap_content"
|
||||
android:layout_height="wrap_content"
|
||||
android:linksClickable="false"
|
||||
style="@style/Signal.Text.Caption.MessageSent"
|
||||
android:textColor="?conversation_item_outgoing_text_secondary_color"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"
|
||||
tools:text="150" />
|
||||
|
||||
<ImageView
|
||||
android:id="@+id/delivery_indicator"
|
||||
android:layout_width="wrap_content"
|
||||
|
||||
@@ -37,9 +37,8 @@
|
||||
android:layout_height="wrap_content"
|
||||
style="@style/Signal.Text.Body"
|
||||
android:singleLine="true"
|
||||
android:maxLines="1"
|
||||
android:clickable="false"
|
||||
android:ellipsize="end"
|
||||
android:ellipsize="middle"
|
||||
android:textColor="@color/document_icon_text"
|
||||
tools:text="The-Anarchist-Tension-by-Alfredo-Bonanno.pdf"/>
|
||||
|
||||
|
||||
@@ -39,6 +39,24 @@
|
||||
</androidx.appcompat.widget.AppCompatEditText>
|
||||
</LinearLayout>
|
||||
|
||||
<com.google.android.material.textfield.TextInputLayout
|
||||
android:id="@+id/description_text_layout"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:layout_marginStart="16dp"
|
||||
android:layout_marginEnd="16dp"
|
||||
android:layout_marginTop="8dp">
|
||||
|
||||
<androidx.appcompat.widget.AppCompatEditText
|
||||
android:id="@+id/description_text"
|
||||
android:layout_width="match_parent"
|
||||
android:layout_height="wrap_content"
|
||||
android:gravity="top|start"
|
||||
android:hint="@string/group_description"
|
||||
android:inputType="textMultiLine"
|
||||
android:maxLines="3" />
|
||||
</com.google.android.material.textfield.TextInputLayout>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/chat_hints"
|
||||
android:layout_width="match_parent"
|
||||
|
||||
@@ -26,9 +26,22 @@
|
||||
app:showAsAction="always"/>
|
||||
|
||||
<item android:id="@+id/menu_start_call"
|
||||
android:title="@string/start_call"
|
||||
android:icon="@drawable/ic_videocam_white_24dp"
|
||||
app:showAsAction="always" />
|
||||
android:title="@string/start_call"
|
||||
app:showAsAction="always"
|
||||
android:icon="@drawable/baseline_call_24">
|
||||
<menu>
|
||||
<item android:id="@+id/menu_start_audio_call"
|
||||
android:title="@string/start_audio_call"
|
||||
android:icon="@drawable/baseline_call_24"
|
||||
app:iconTint="?attr/menu_icon_tint"
|
||||
/>
|
||||
<item android:id="@+id/menu_start_video_call"
|
||||
android:title="@string/start_video_call"
|
||||
android:icon="@drawable/ic_videocam_white_24dp"
|
||||
app:iconTint="?attr/menu_icon_tint"
|
||||
/>
|
||||
</menu>
|
||||
</item>
|
||||
|
||||
<item android:id="@+id/menu_all_media"
|
||||
android:title="@string/apps_and_media"
|
||||
|
||||
@@ -5,4 +5,7 @@
|
||||
<item android:title="@string/menu_export_attachment"
|
||||
android:id="@+id/menu_export_attachment" />
|
||||
|
||||
<item android:title="@string/switch_account"
|
||||
android:id="@+id/menu_switch_account" />
|
||||
|
||||
</menu>
|
||||
|
||||
@@ -282,7 +282,7 @@
|
||||
<string name="menu_message_details">Nachrichteninfo</string>
|
||||
<string name="menu_copy_to_clipboard">In Zwischenablage kopieren</string>
|
||||
<string name="share_invite_link">Einladungslink teilen</string>
|
||||
<string name="share_invite_link_explain">Teile den Link nur mit Personen, denen du vertrauen. Alle, die diesen Link haben, können einen Chat mit dir starten.</string>
|
||||
<string name="share_invite_link_explain">Teile den Link nur mit Personen, denen du vertraust. Alle, die diesen Link haben, können einen Chat mit dir starten.</string>
|
||||
<string name="invite_friends">Freunde einladen</string>
|
||||
<!-- %1$s is replaced by the user's invitation link ("https://i.delta.chat/...") -->
|
||||
<string name="invite_friends_text">Kontaktiere mich auf Delta Chat:\n%1$s</string>
|
||||
@@ -1003,6 +1003,7 @@
|
||||
<string name="secure_join_replies">%1$s antwortet. Warte, zur Gruppe hinzugefügt zu werden…</string>
|
||||
<string name="secure_join_wait">Verbindungsaufbau, bitte warten…</string>
|
||||
<string name="contact_verified">%1$s eingeführt.</string>
|
||||
<string name="contact_blocked">Du hast den Kontakt blockiert</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Eingeführt von %1$s</string>
|
||||
<string name="verified_by_you">Durch mich eingeführt</string>
|
||||
@@ -1088,8 +1089,8 @@
|
||||
<string name="name_desktop">Name</string>
|
||||
<string name="select_group_image_desktop">Gruppenbild auswählen</string>
|
||||
<string name="export_backup_desktop">Backup exportieren</string>
|
||||
<string name="message_detail_sent_desktop">gesendet</string>
|
||||
<string name="message_detail_received_desktop">empfangen</string>
|
||||
<string name="message_detail_sent_desktop">Gesendet</string>
|
||||
<string name="message_detail_received_desktop">Empfangen</string>
|
||||
<string name="menu.view.developer.open.log.folder">Log-Ordner öffnen</string>
|
||||
<string name="menu.view.developer.open.current.log.file">Aktuelle Logdatei öffnen</string>
|
||||
<string name="explain_desktop_minimized_disabled_tray_pref" tools:ignore="TypographyDashes">Benachrichtigungssymbol kann nicht deaktiviert werden, da Delta Chat mit der Option --minimized gestartet wurde.</string>
|
||||
|
||||
@@ -813,6 +813,9 @@
|
||||
<string name="disable_imap_idle">Lülita IMAP IDLE välja</string>
|
||||
<string name="disable_imap_idle_explain">Ära kasuta IMAP IDLE meetodit, seda isegi siis, kui server seda toetab. Sisselülitamisel tekib sõnumite laadimisel viivitusi. Kasuta seda vaid testimiseks.</string>
|
||||
<string name="send_stats_to_devs">Saada statistikat Delta Chati kasutajatele</string>
|
||||
<string name="stats_device_message">Kas sa tahad aidata Delta Chati paremaks muuta? Siis luba rakendusel kord nädalas saata anonüümset statistikat kasutuse kohta.\n\n👉 Klõpsa siia… 👈</string>
|
||||
<string name="stats_confirmation_dialog">Kas sa tahad aidata Delta Chati paremaks muuta? Siis luba rakendusel kord nädalas saata anonüümset statistikat kasutuse kohta.</string>
|
||||
<string name="stats_thanks">Suur tänu! Soovi korral võid saatmise siit välja lülitada: „Seadistused“ → „Täiendavad seadistused“.\n\nKas sul on ka 5 minuti jagu aega osalemaks Delta Chati turvalisust käsitlevas teaduslikus uuringus?</string>
|
||||
<string name="stats_disable_dialog">Statistika saatmine on juba kasutusel\n\nKas sa tahaksid ta välja lülitada?</string>
|
||||
<string name="disable">Lülita välja</string>
|
||||
<string name="stats_keep_sending">Jätka saatmist</string>
|
||||
@@ -999,6 +1002,7 @@
|
||||
<string name="secure_join_replies">%1$s vastas, ootan gruppi lisamist…</string>
|
||||
<string name="secure_join_wait">Panen aluse läbivale krüptimisele…</string>
|
||||
<string name="contact_verified">%1$s lisas vestlusesse.</string>
|
||||
<string name="contact_blocked">Sina blokeerisid selle kontakti</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">%1$s lisas kontakti vestlusesse</string>
|
||||
<string name="verified_by_you">Mina lisasin kontakti vestlusesse</string>
|
||||
|
||||
@@ -21,10 +21,10 @@
|
||||
<string name="none">هیچکدام</string>
|
||||
<string name="automatic">خودکار</string>
|
||||
<string name="strict">سختگیرانه</string>
|
||||
<string name="open">گشودن</string>
|
||||
<string name="open">بازکردن</string>
|
||||
<string name="download">بارگیری</string>
|
||||
<string name="downloading">در حال بارگیری…</string>
|
||||
<string name="open_attachment">گشودن پیوست</string>
|
||||
<string name="open_attachment">بازکردن پیوست</string>
|
||||
<string name="join">پیوستن</string>
|
||||
<string name="rejoin">پیوستن مجدد</string>
|
||||
<string name="delete">حذف</string>
|
||||
@@ -54,7 +54,7 @@
|
||||
<string name="mute">سکوت</string>
|
||||
<string name="muted">بیصدا</string>
|
||||
<string name="ephemeral_messages">پیامهای ناپدید شونده</string>
|
||||
<string name="ephemeral_messages_hint">این روی تمام عضوهای این گپ، اگر از دلتاچت استفاده کنند، اعمال میشود. ولی همچنان میتوانند پیامها را رونوشت، ذخیره و هدایت کنند.</string>
|
||||
<string name="ephemeral_messages_hint">شامل همه کسانی که در این گفتگو حضور دارند میشود. آنها همچنان میتوانند پیامها را هدایت و ذخیره کرده یا از آنها رونوشت بگیرند. </string>
|
||||
<string name="save">ذخیره</string>
|
||||
<string name="chat">گپ</string>
|
||||
<string name="media">رسانه</string>
|
||||
@@ -76,9 +76,9 @@
|
||||
<string name="activate">فعال کردن</string>
|
||||
<string name="load_remote_content">بارگیری تصاویر از بیرون</string>
|
||||
<!-- Possible answers to the question are: Never, Always, Once -->
|
||||
<string name="load_remote_content_ask">تصاویر مربوط به نشانیهای اینترنتی دیگر میتوانند برای ردیابی شما استفاده شوند. \n\n این تنظیمها همچنین برای بارگیری فونتها و دیگر محتواها استفاده میشوند. اگر غیرفعال باشد ممکن است همچنان تصویرهای درون پیام و تصویرهای بارگیری شده را ببینید. \n\n آيا تصاویر خارجی بارگیری شوند؟</string>
|
||||
<string name="load_remote_content_ask">تصاویر مربوط به نشانیهای اینترنتی دیگر میتوانند برای ردیابی شما استفاده شوند. \n\n این تنظیمات همچنین برای بارگیری فونتها و دیگر محتواها استفاده میشود. اگر غیرفعال باشد ممکن است همچنان تصویرهای درون پیام و تصویرهای بارگیری شده را ببینید. \n\n آيا تصاویر خارجی بارگیری شوند؟</string>
|
||||
<string name="always">همیشه</string>
|
||||
<string name="always_load_remote_images">تصاویر دوردست همیشه بار شوند</string>
|
||||
<string name="always_load_remote_images">تصاویر با منبع بیرونی همیشه بارگیری شوند</string>
|
||||
<string name="once">همین یک بار</string>
|
||||
<string name="show_warning">نمایش هشدار</string>
|
||||
<string name="not_now">اکنون نه</string>
|
||||
@@ -208,6 +208,8 @@
|
||||
<string name="webxdc_app">برنامه</string>
|
||||
<!-- plural of "App"; used to present "Webxdc App" (https://webxdc.org) in a user friendly way. Please stay close to the original term and keep it short (it is used in menus with few screen space). -->
|
||||
<string name="webxdc_apps">برنامهها</string>
|
||||
<string name="webxdc_store_url">آدرس مخزن برنامهها</string>
|
||||
<string name="webxdc_store_url_explain">اگر آن را تنظیم کنید، از این آدرس برای مخزن برنامهها به جای آدرس پیشفرض استفاده میشود</string>
|
||||
<string name="webxdc_draft_hint">برای به اشتراک گذاری روی «ارسال» بزنید</string>
|
||||
<string name="home">خانه</string>
|
||||
<string name="games">بازیها</string>
|
||||
@@ -629,6 +631,7 @@
|
||||
<string name="welcome_chat_over_email">گفتگو غیرمتمرکز و ایمن</string>
|
||||
<string name="scan_invitation_code">اسکن کردن کد دعوت</string>
|
||||
<string name="login_title">ورود</string>
|
||||
<string name="login_advanced_hint">این برای کاربرهای حرفهای است:\n\n • از یک آدرس که در برنامهای دیگر استفاده میکنید استفاده نکنید.\n\n • ارائهدهندهٔ رایانامه کلاسیک اجازه خواهد داد که گپها بدون رمزنگاری سراسری باشند. این گپها به وسیلهٔ یک نماد نامه نشانهگذاری میشوند.</string>
|
||||
<string name="login_inbox">ورودی</string>
|
||||
<string name="login_imap_login">IMAP Login Name</string>
|
||||
<string name="login_imap_server">IMAP Server</string>
|
||||
@@ -653,6 +656,19 @@
|
||||
<string name="proxy_use_proxy_confirm">میخواهید از پروکسی «%1$s» استفاده کنید؟</string>
|
||||
<string name="proxy_share_explain">دوستهایتان میتوانند با اسکن کردن کد QR این پروکسی را اضافه کنند.</string>
|
||||
<string name="proxy_share_link">اشتراک گذاشتن پیوند</string>
|
||||
<string name="proxy_enabled">پروکسی فعال شده</string>
|
||||
<string name="proxy_enabled_hint">شما از یک پروکسی استفاده میکنید. اگر مشکل وصل شدن داری، یک پروکسی دیگر استفاده کنید.</string>
|
||||
<!-- "Relay" refers to the relay servers used; please chose a common term in your language, no need to be literal. If in doubt, stay with "Relay" -->
|
||||
<string name="transports">رلهها</string>
|
||||
<string name="add_transport">اضافه کردن رله</string>
|
||||
<string name="remove_transport">حذف رله</string>
|
||||
<string name="edit_transport">ویرایش رله</string>
|
||||
<!-- shown if a QR code was scanned that can be used as a relay -->
|
||||
<string name="confirm_add_transport">اضافه کردن این رله؟</string>
|
||||
<string name="invalid_transport_qr">کیوآر کد اسکن شده دارای یک رلهٔ معتبر نیست.</string>
|
||||
<!-- placeholder will be replaced by a relay server name -->
|
||||
<string name="confirm_remove_transport">حذف کردن رلهٔ «%1$s»؟\n\n مخاطبهای شما تنها در صورتی میتوانند با شما ارتباط برقرار کنند که قبلا از طریق یک رلهٔ دیگر با آنها تماس داشتهاید.\n\n در صورت تردید، این رله را بعدا حذف کنید.</string>
|
||||
|
||||
<string name="login_certificate_checks">بررسیهای گواهینامه</string>
|
||||
<string name="login_error_mail">لطفاً یک نشانی رایانامهٔ معتبر وارد کنید</string>
|
||||
<string name="login_error_server">لطفا یک کارساز / نشانی آیپی صحیح وارد کنید</string>
|
||||
@@ -716,6 +732,7 @@
|
||||
<string name="pref_screen_security_explain">درخواست مسدود کردن عکس گرفتن از صفحه در لیست اخیر و درون نرمافزار</string>
|
||||
<string name="pref_screen_security_please_restart_hint">برای اعمال کردن تنظیمهای امنیت صفحه لطفا نرمافزار را بسته و دوباره باز کنید.</string>
|
||||
<string name="pref_notifications">اعلانها</string>
|
||||
<string name="pref_mention_notifications">اشارهها(منشنها)</string>
|
||||
<string name="pref_mention_notifications_explain">در گروههای بیصدا شده، برای پیامهای مستقیم به خودتان، مانند پاسخها یا واکنشها، اعلان دریافت کنید.</string>
|
||||
<string name="pref_notifications_show">نمایش</string>
|
||||
<string name="pref_notifications_priority">اولویت</string>
|
||||
@@ -766,6 +783,8 @@
|
||||
<string name="pref_imap_folder_warn_disable_defaults">اگر این گزینه را غیر فعال میکنید از اینکه سرور شما و حسابهایتان هم بر این اساس تنظیم شده باشند.\n\n در غیر این صورت ممکن است هیچ چیز کار نکند. </string>
|
||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||
<string name="pref_multidevice">حالت چند دستگاهی</string>
|
||||
<string name="pref_multidevice_explain">همگامسازی پیامهای شما با دیگر دستگاههایتان. در صورت اضافه کردن دستگاه دوم به صورت خودکار فعال میشود.</string>
|
||||
<string name="pref_multidevice_change_warn">حالت چند دستگاهی زمانی که از یک نمایه روی چند دستگاه استفاده میکنید باید فعال شود. تنها در صورتی این تنظیم را غیرفعال کنید که این نمایه را از روی همهٔ دیگر دستگاههایتان حذف کردهاید. \n\n غیرفعال کردن حالت چند دستگاهی زمانی که یک نمایه را روی چند دستگاه دارید باعث میشود که بعضی پیامها گم شوند و همچنین مشکلهای دیگری به وجود میآورد.</string>
|
||||
<string name="pref_auto_folder_moves">انتقال خودکار به پوشه دلتاچت</string>
|
||||
<string name="pref_only_fetch_mvbox_title">فقط پوشه دلتاچت را بررسی کن</string>
|
||||
<string name="pref_show_emails">نمایش رایانامههای معمولی</string>
|
||||
@@ -773,6 +792,7 @@
|
||||
<string name="pref_show_emails_accepted_contacts">برای مخاطبین پذیرفته شده</string>
|
||||
<string name="pref_show_emails_all">همه</string>
|
||||
<string name="pref_experimental_features">ویژگیهای آزمایشی</string>
|
||||
<string name="pref_experimental_features_explain">این ویژگیها ممکن است ناپایدار باشند و همچنین ممکن است بعدا تغییر کنند یا حذف شوند</string>
|
||||
<string name="pref_on_demand_location_streaming">همرسانی زندهٔ بهفرمان مکان</string>
|
||||
<string name="pref_background_default">پسزمینه پیشفرض</string>
|
||||
<string name="pref_background_default_color">رنگ پیشفرض</string>
|
||||
@@ -796,7 +816,16 @@
|
||||
<string name="pref_show_tray_icon">نمایش نمادک در زیر صفحه</string>
|
||||
<string name="pref_edit_profile">ویرایش نمایه</string>
|
||||
<string name="disable_imap_idle">غیر فعالسازی IMAP IDLE</string>
|
||||
<string name="disable_imap_idle_explain">استفاده نکردن از افزونهٔ IMAP IDLE حتی در صورتی که ارائهدهنده از آن پشتیبانی میکند. فعالسازی این گزینه باعث میشوند دریافت پیامها به تاخیر بیوفتد. تنها برای آزمایش آن را فعال کنید.</string>
|
||||
<string name="send_stats_to_devs">ارسال آمار برای توسعهدهندگان دلتاچت</string>
|
||||
<string name="stats_device_message">آیا میخواهید با فرستادن آمار استفادهٔ هفتگی به بهبود دلتاچت کمک کنید؟ 👈اینجا را بزنید...👉</string>
|
||||
<string name="stats_confirmation_dialog">میخواهید با فرستادن گزارشهای ناشناس استفادهٔ هفتگی به بهبود دلتاچت کمک کنید؟</string>
|
||||
<string name="stats_thanks">ممنون! هر زمان که خواستید میتوانید فرستادن آمارها را در «تنظیمها - پیشرفته» غیرفعال کنید\n\n علاوه بر این، تمایل دارید ۵ دقیقه در یک تحقیق علمی راجع به امنیت دلتاچت شرکت کنید؟</string>
|
||||
<string name="stats_disable_dialog">ارسال آمارها قبلا فعال شدن است.\n\n میخواهید آن را غیر فعال کنید؟</string>
|
||||
<string name="disable">غیرفعال کردن</string>
|
||||
<string name="stats_keep_sending">ادامهدادن به ارسال</string>
|
||||
<string name="stats_msg_body">این پیوست شامل آمار استفادهٔ ناشناس است که به ما کمک میکند دلتاچت را بهبود دهیم. برای اطلاعات بیشتر https://delta.chat/help#statssending را ببینید. متشکریم!</string>
|
||||
|
||||
<!-- Emoji picker and categories -->
|
||||
<string name="emoji_search_results">نتایج جستجو</string>
|
||||
<string name="emoji_not_found">شکلکی پیدا نشد</string>
|
||||
@@ -829,6 +858,8 @@
|
||||
<string name="autodel_server_ask">آیا میخواهید %1$d پیام را اکنون و تمام پیامهای آیندهٔ «%2$s» را پاک کنید؟/n/n⚠️ این شامل رایانامهها، رسانه و «پیامهای ذخیره شده» در همه پوشههای کارساز(سرور) میشود/n/n⚠️ اگر میخواهید دادهها در کارساز باقی بمانند از این قابلیت استفاده نکنید/n/n⚠️ اگر بهجز دلتاچت از دیگر نرمافزارهای رایانامه هم استفاده میکنید این قابلیت را به کار نگیرید.</string>
|
||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
||||
<string name="autodel_server_enabled_hint">این شامل رایانامهها، رسانهها و «پیامهای ذخیره شده» در تمام پوشههای کارساز(سرور) میشود. اگر میخواهید دادهها را در کارساز نگه دارید از این قابلیت استفاده نکنید. اگر از دیگر نرمافزارهای رایانامه بهجز دلتاچت استفاده میکنید هم از این قابلیت استفاده نکنید.</string>
|
||||
<string name="autodel_server_warn_multi_device_title">فعالسازی حذف بلافاصله</string>
|
||||
<string name="autodel_server_warn_multi_device">اگر حذف بلافاصله را فعال کنید، نمیتوانید این نمایه را روی چند دستگاه داشته باشید.</string>
|
||||
<string name="autodel_confirm">متوجه هستم، همه پیامها حذف شوند</string>
|
||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||
<string name="autodel_at_once">یک بار بعد از بارگیری</string>
|
||||
@@ -949,6 +980,7 @@
|
||||
<string name="qrscan_fingerprint_label">اثر انگشت</string>
|
||||
<string name="withdraw_verifycontact_explain">دیگران برای ارتباط با شما میتوانند این کد کیوآر را اسکن کنند. \n\n میتوان کد کیوآر را در اینجا غیر فعال کنید و با اسکن کردن مجدد، آن را فعال کنید. </string>
|
||||
<string name="withdraw_verifygroup_explain">این کد کیوآر میتواند توسط دیگران و برای پیوستن به گروه «%1$s» اسکن شود.\n\n شما میتواند این کد کیوآر را در اینجا غیرفعال کنید و با اسکن کردن مجدد، آن را فعال نمایید. </string>
|
||||
<string name="withdraw_joinbroadcast_explain">این کد کیوآر میتواند توسط بقیه برای پیوستن به کانال «%1$s» اسکن شود. \n\n میتوانید آن را بازنشانی کنید تا کد یا پیوند دعوت فعلی از کار بیوفتد.</string>
|
||||
<string name="withdraw_qr_code">غیرفعال کردن کد کیوآر</string>
|
||||
<string name="revive_verifycontact_explain">این کد کیوآر بازنشانی شده است و دیگر فعال نیست.</string>
|
||||
<string name="revive_qr_code">فعال کردن کد کیوآر</string>
|
||||
@@ -959,6 +991,7 @@
|
||||
<string name="qrshow_join_group_title">کد دعوت کیوآر</string>
|
||||
<!-- This text is shown inside the "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the group name, eg. "Scan to join group \"Testing group\"" -->
|
||||
<string name="qrshow_join_group_hint">برای عضو شدن در گروه\"%1$s\" این را اسکن کنید.</string>
|
||||
<string name="qrshow_join_channel_hint">برای ملحق شدن به کانال «%1$s» اسکن کنید</string>
|
||||
<string name="qrshow_join_contact_title">کد دعوت کیوآر</string>
|
||||
<!-- This text is shown inside the "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the profile name eg. "Scan to chat with Alice" -->
|
||||
<string name="qrshow_join_contact_hint">برای ارتباط با %1$s این را اسکن کنید.</string>
|
||||
@@ -972,10 +1005,13 @@
|
||||
<!-- first placeholder will be replaced by name of the inviter, second placeholder will be replaced by the name of the inviter. -->
|
||||
<string name="secure_join_started">کاربر %1$s شما را دعوت کرده است تا عضو این گروه شوید.
|
||||
در انتظار دستگاه %2$s برای پاسخگویی...</string>
|
||||
<!-- first placeholder will be replaced by name of the inviter, second placeholder will be replaced by the name of the inviter. -->
|
||||
<string name="secure_join_channel_started">%1$sشما را به این کانال دعوت کرده است.\n\n منتظر دستگاه %2$s برای پاسخدادن هستیم...</string>
|
||||
<!-- placeholder will be replaced by the name of the inviter. -->
|
||||
<string name="secure_join_replies">کاربر %1$s پاسخ داد، در انتظار اضافه شدن به گروه...</string>
|
||||
<string name="secure_join_wait">در حال برقراری ارتباط، لطفا صبر کنید...</string>
|
||||
<string name="contact_verified">%1$s تأیید شد.</string>
|
||||
<string name="contact_blocked">شما این مخاطب را مسدود کردید.</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">احراز هویت شده توسط %1$s</string>
|
||||
<string name="verified_by_you">تأیید شده توسط من</string>
|
||||
|
||||
@@ -199,6 +199,7 @@
|
||||
<string name="video">Vidéo</string>
|
||||
<string name="documents">Documents</string>
|
||||
<string name="contact">Contact</string>
|
||||
<string name="bot">Robot</string>
|
||||
<string name="camera">Caméra</string>
|
||||
<!-- As in "start a video recording" or "take a photo"; eg. the description of the "shutter button" in cameras -->
|
||||
<string name="capture">Enregistrer</string>
|
||||
@@ -218,6 +219,8 @@
|
||||
<string name="webxdc_app">Appli</string>
|
||||
<!-- plural of "App"; used to present "Webxdc App" (https://webxdc.org) in a user friendly way. Please stay close to the original term and keep it short (it is used in menus with few screen space). -->
|
||||
<string name="webxdc_apps">Applis</string>
|
||||
<string name="webxdc_store_url">URL du catalogue des apps </string>
|
||||
<string name="webxdc_store_url_explain">Si elle est définit l\'URL sera utilisée à la place de l\'URL par défaut.</string>
|
||||
<string name="webxdc_draft_hint">Appuyez \"Envoyer\" pour partager</string>
|
||||
<string name="home">Accueil</string>
|
||||
<string name="games">Jeux</string>
|
||||
@@ -267,6 +270,9 @@
|
||||
<string name="add_recipients">Ajouter des destinataires</string>
|
||||
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
|
||||
<string name="channel_name">Nom du canal</string>
|
||||
<string name="email">Courriel</string>
|
||||
<!-- "New" as in "Create New Email"; shown together with "New Group" and "New Channel" -->
|
||||
<string name="new_email">Nouveau courriel</string>
|
||||
<!-- the "Subject" of an email, use the term common in classic email apps -->
|
||||
<string name="subject">Sujet</string>
|
||||
<string name="menu_send">Envoyer</string>
|
||||
@@ -347,7 +353,7 @@
|
||||
<string name="device_talk">Messages de l\'appareil</string>
|
||||
<string name="device_talk_subtitle">Messages générés localement</string>
|
||||
<string name="device_talk_explain">Les messages dans cette discussion sont générés localement par votre application Delta Chat. Cela vous permet de recevoir des informations concernant les mises à jour et problèmes rencontrés à l\'utilisation.</string>
|
||||
<string name="device_talk_welcome_message2">Gardez contact !\n\n🙌 Cliquez sur « code QR » sur la page d\'accueil des deux appareils. Sélectionnez « Scanner le code QR » sur un des appareils et positionnez les deux appareils l\'un vers l\'autre\n\n🌍 Si vous n\'êtes pas dans la même pièce, vous pouvez scanner le code QR pendant un appel vidéo ou partager un lien d\'invitation à partir de « Scanner le code QR »\n\n Profitez ensuite de votre expérience de messagerie sur le plus grand réseau décentralisé du monde : les emails. Contrairement aux autres applications populaires, tout cela se fait sans contrôle centralisé, suivi ou revente de vos données, celles de vos amis, collègues ou famille à de grandes entreprises.</string>
|
||||
<string name="device_talk_welcome_message2">Entrez en contact !\n\n🙌 Cliquez sur « code QR » sur la page d\'accueil des deux appareils. Sélectionnez « Scanner le code QR » sur un des appareils et positionnez les deux appareils l\'un vers l\'autre\n\n🌍 Si vous n\'êtes pas dans la même pièce, vous pouvez scanner le code QR pendant un appel vidéo ou partager un lien d\'invitation à partir de « Scanner le code QR »\n\n Profitez ensuite de votre expérience de messagerie sur le plus grand réseau décentralisé du monde : les emails. Contrairement aux autres applications populaires, tout cela se fait sans contrôle centralisé, suivi ou revente de vos données, celles de vos amis, collègues ou famille à de grandes entreprises.</string>
|
||||
<string name="edit_contact">Mettre à jour le contact</string>
|
||||
<!-- Verb "to pin", making something sticky, not a noun or abbreviation for "pin number". -->
|
||||
<string name="pin_chat">Épingler la discussion</string>
|
||||
@@ -363,7 +369,7 @@
|
||||
<!-- Menu item beside an app/chat that adds an icon to the system's home screen. If the user taps that icon, the app/chat is opened directly. -->
|
||||
<string name="add_to_home_screen">Ajouter à l\'écran d\'accueil</string>
|
||||
<string name="donate">Faire un don</string>
|
||||
<string name="donate_device_msg">❤️ On dirait que vous aimez bien Delta Chat!\n\nMerci de considérer une donation à Delta Chat afin d\'assurer qu\'il reste libre et gratuit pour tout le monde.\n\nBien que Delta Chat est gratuit à l\'utilisation et un logiciel libre, le développer coûte de l\'argent. Aidez-nous à garder Delta Chat indépendent et le rendre encore plus incroyable dans le future.\n\nhttps://delta.chat/donate</string>
|
||||
<string name="donate_device_msg">❤️ On dirait que vous aimez bien Delta Chat!\n\nMerci de considérer une donation à Delta Chat afin d\'assurer qu\'il reste libre et gratuit pour tout le monde.\n\nBien que Delta Chat soit gratuit à l\'utilisation et un logiciel libre, le développer coûte de l\'argent. Aidez-nous à garder Delta Chat indépendant et le rendre encore plus incroyable dans le futur.\n\nhttps://delta.chat/donate</string>
|
||||
|
||||
<string name="mute_for_one_hour">Désactiver pour 1 heure</string>
|
||||
<string name="mute_for_eight_hours">Désactiver pour 8 heures</string>
|
||||
@@ -396,6 +402,9 @@
|
||||
<string name="declined_call">Appel rejeté</string>
|
||||
<string name="canceled_call">Appel annulé</string>
|
||||
<string name="missed_call">Appel manqué</string>
|
||||
<!-- the first placeholder will be replaced by a date, the second placeholder by duration, example: "Thu, 08:12 pm, 2 minutes" -->
|
||||
<string name="call_date_and_duration">%1$s, %2$s</string>
|
||||
|
||||
<!-- get confirmations -->
|
||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||
<string name="ask_leave_group">Êtes-vous sûr de vouloir quitter la discussion ?</string>
|
||||
@@ -464,6 +473,7 @@
|
||||
<string name="chat_input_placeholder">Message</string>
|
||||
<string name="chat_archived_label">Archivé</string>
|
||||
<string name="chat_request_label">Invitation</string>
|
||||
<string name="chat_request_label_explain">Inclure les messages d\'invitations dans les compteurs et notifications</string>
|
||||
<string name="chat_no_messages">Aucun message.</string>
|
||||
<string name="chat_self_talk_subtitle">Messages envoyés à moi-même</string>
|
||||
<string name="archive_empty_hint">Les discussions archivées apparaîtront ici.</string>
|
||||
@@ -654,7 +664,7 @@
|
||||
<string name="proxy_add_url_hint">Entrer le lien du proxy ici</string>
|
||||
<string name="proxy_invalid">Proxy invalide ou non supporté</string>
|
||||
<string name="proxy_list_header">Sauver les proxy</string>
|
||||
<string name="proxy_delete">Effacer le proxy</string>
|
||||
<string name="proxy_delete">Supprimer le proxy</string>
|
||||
<string name="proxy_delete_explain">Voulez-vous vraiment supprimer « %1$s » ?</string>
|
||||
<string name="proxy_use_proxy_confirm">Voulez-vous utilser le proxy \"%1$s\" ?</string>
|
||||
<string name="proxy_share_explain">Vos amis peuvent ajouter ce proxy en scannant le code QR.</string>
|
||||
@@ -668,6 +678,10 @@
|
||||
<string name="edit_transport">Modifier le relais</string>
|
||||
<!-- shown if a QR code was scanned that can be used as a relay -->
|
||||
<string name="confirm_add_transport">Ajouter le relais ?</string>
|
||||
<string name="invalid_transport_qr">Le QR code scanné ne renvoie pas vers un relai valide.</string>
|
||||
<!-- placeholder will be replaced by a relay server name -->
|
||||
<string name="confirm_remove_transport">Supprimer le relai \"%1$s\"\n\nVos contacts ne peuvent vous contacter que si vous les avez déjà contactés depuis un autre relai.\n\nDans le doute, supprimez le relai plus tard.</string>
|
||||
|
||||
<string name="login_certificate_checks">Vérification du certificat</string>
|
||||
<string name="login_error_mail">Entrez une adresse email valide</string>
|
||||
<string name="login_error_server">Entre un serveur / adresse IP valide</string>
|
||||
@@ -817,6 +831,12 @@
|
||||
<string name="disable_imap_idle">Désactiver IMAP IDLE</string>
|
||||
<string name="disable_imap_idle_explain">N\'utilisez pas d\'extension IMAP IDLE, même si elle est prise en charge par votre serveur, car elle provoque des retards dans la récupération des messages. Activez cette option uniquement pour effectuer des tests.</string>
|
||||
<string name="send_stats_to_devs">Envoyer les statistiques aux développeurs Delta Chat</string>
|
||||
<string name="stats_device_message">Voulez-vous aider à améliorer Delta Chat et soutenir notre recherche en envoyant des statistiques d\'utilisation hebdomadaires ?\n\n👉 Touchez ici... 👈</string>
|
||||
<string name="stats_confirmation_dialog">Voulez-vous aider à améliorer Delta Chat et soutenir notre recherche en envoyant des statistiques d\'utilisation hebdomadaires ?</string>
|
||||
<string name="stats_thanks">Merci ! Vous pouvez toujours désactiver l\'envoi dans \"Paramètres -> Avancé\".\n\nAvez-vous en plus 5 minutes pour participer à une étude scientifique sur la sécurité de Delta Chat ?</string>
|
||||
<string name="stats_disable_dialog">L\'envoi de statistiques est déjà activé.\n\nSouhaitez-vous le désactiver ?</string>
|
||||
<string name="disable">Désactiver</string>
|
||||
<string name="stats_keep_sending">Continuer l\'envoi</string>
|
||||
<string name="stats_msg_body">La pièce jointe contient des statistiques d\'usage anonymisés, qui nous aide à améliorer Delta Chat. Merci !</string>
|
||||
|
||||
<!-- Emoji picker and categories -->
|
||||
@@ -937,7 +957,7 @@
|
||||
<string name="ephemeral_timer_weeks_by_you">Vous avez réglé le temps d\'affichage des messages éphémères à %1$s semaines.</string>
|
||||
<!-- %1$s will be replaced by the number of weeks (always >1) the timer is set to, %2$s will be replaced by name of the contact -->
|
||||
<string name="ephemeral_timer_weeks_by_other">Minuterie des messages éphémères réglée à %1$s semaines par %2$s.</string>
|
||||
<string name="chat_unencrypted_explanation">Les messages de cette conversation utilise le mail classique et ne sont pas chiffrés de bout-en-bout.</string>
|
||||
<string name="chat_unencrypted_explanation">Les messages de cette conversation utilisent le mail classique et ne sont pas chiffrés de bout-en-bout.</string>
|
||||
<string name="chat_protection_enabled_tap_to_learn_more">Les messages sont désormais garantis chiffrés de bout en bout. Appuyer pour en savoir plus.</string>
|
||||
<string name="chat_protection_enabled_explanation">Il n\'est pas garanti que tous les messages de cette discussion sont chiffrés de bout en bout.\n\nLe chiffrement de bout en bout assure la confidentialité des messages échangés par les membres d\'une discussion. Même votre fournisseur de courriel ne peut pas les lire. </string>
|
||||
<string name="invalid_unencrypted_tap_to_learn_more">⚠️ %1$s nécessite un chiffrement de bout en bout qui n\'est pas encore configuré sur cette discussion. Appuyez pour en savoir plus.</string>
|
||||
@@ -987,7 +1007,7 @@
|
||||
<string name="qrshow_join_contact_hint">Scanner pour discuter avec %1$s</string>
|
||||
<string name="qrshow_join_contact_no_connection_toast">Pas de connexion Internet, ne peut pas effectuer la configuration du QR code.</string>
|
||||
<string name="qraccount_ask_create_and_login">Créer une nouvelle adresse de courriel sur « %1$s » et se connecter ici ?</string>
|
||||
<string name="set_name_and_avatar_explain">Choisissez un nom que vos contacts reconnaîtrons. Vous pouvez également définir une image pour votre profile.</string>
|
||||
<string name="set_name_and_avatar_explain">Choisissez un nom que vos contacts reconnaîtront. Vous pouvez également définir une image pour votre profil.</string>
|
||||
<string name="please_enter_name">Veuillez saisir un nom.</string>
|
||||
<string name="qraccount_qr_code_cannot_be_used">Le code QR scanné ne peut pas être utilisé pour ouvrir un nouveau compte.</string>
|
||||
<!-- the placeholder will be replaced by the address of the profile -->
|
||||
@@ -1000,6 +1020,7 @@
|
||||
<string name="secure_join_replies">%1$s a répondu, en attente d’être ajouté au groupe…</string>
|
||||
<string name="secure_join_wait">Chiffrement de bout en bout en cours d\'établissement, merci de patienter...</string>
|
||||
<string name="contact_verified">%1$s connu.</string>
|
||||
<string name="contact_blocked">Vous avez bloqué le contact</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Connu par %1$s</string>
|
||||
<string name="verified_by_you">Connu par vous</string>
|
||||
@@ -1136,9 +1157,17 @@
|
||||
<string name="notifications_avg_hours">Toutes les %1$d heures en moyenne</string>
|
||||
<string name="last_check_at">Dernièrement vu à %1$s</string>
|
||||
<string name="system_settings">Paramètres du système</string>
|
||||
<!-- shown below the button "System Settings" on the notification screen. this is a hint about what can be edited on System Settings' Notification page - eg. the notification type (banner, lock screen, notification centre), sound, badges and so on. no need to be exhaustive here, it is only to give the user an idea. -->
|
||||
<string name="system_settings_notify_explain_ios">Éditer le type, les badges, les prévisualisation et plus encore.</string>
|
||||
<!-- iOS shortcut widget -->
|
||||
<!-- use the same translation for "Shortcuts" as the system is using, often the term "Shortcut" stays untranslated; check eg. how the "Shortcuts" system app is called in your locale -->
|
||||
<string name="shortcuts_widget_title">Raccourcis</string>
|
||||
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
|
||||
<string name="shortcuts_widget_description">Utiliser la fonction \"Ajouter au Widget\" de Delta Chat pour ajouter un élément.</string>
|
||||
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
|
||||
<string name="remove_from_widget">Retirer du Widget</string>
|
||||
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
|
||||
<string name="add_to_widget">Ajouter au Widget</string>
|
||||
<!-- iOS permissions, copy from "deltachat-ios/Info.plist", which is used on missing translations in "deltachat-ios/LANG.lproj/InfoPlist.strings" -->
|
||||
<string name="InfoPlist_NSCameraUsageDescription">Delta Chat utilise votre appareil photo pour prendre des photos et des vidéos et les envoyer, ainsi que pour scanner des QR codes.</string>
|
||||
<string name="InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription">Delta Chat a besoin de votre autorisation pour partager votre position pour la durée d\'activation du partage de position.</string>
|
||||
@@ -1153,11 +1182,13 @@
|
||||
<string name="pref_background_notifications">Utiliser une connexion en arrière plan</string>
|
||||
<string name="pref_background_notifications_explain">Requiert la désactivation des optimisations de battterie, utilisez cette option si les notifications sont en retard.</string>
|
||||
<string name="pref_reliable_service">Forcer une connexion en arrière plan</string>
|
||||
<string name="pref_reliable_service_explain">Entraîne une notification permanente.</string>
|
||||
|
||||
<string name="pref_background_notifications_rationale">Pour maintenir une connexion à votre serveur de courriel et recevoir les messages en arrière-plan, ignorez l\'optimisation de la batterie à l\'étape suivante.\n\nDelta Chat utilise peu de ressources et prend garde à ne pas vider votre batterie.</string>
|
||||
<!-- disabling "Reliable service" will hide a the maybe annoying permanent-notification with the drawback that new-message-notifications get potentially unreliable -->
|
||||
<string name="perm_enable_bg_reminder_title">Touchez ici pour recevoir des messages pendant que DeltaChat est en arrière-plan.</string>
|
||||
<string name="perm_enable_bg_already_done">Vous avez déjà autorisé Delta Chat à recevoir des messages en arrière plan.\n\nSi vous ne les recevez toujours pas en arrière plan, vérifiez les paramètres de votre système.</string>
|
||||
|
||||
<!-- device messages for updates -->
|
||||
<string name="update_2_0">Quoi de neuf?\n\n💯 Le chiffrement de bout-en-bout est maintenant fiable et péreint. 🔒Fini les cadenas !\n\n✉️ Les mails sans chiffrement de bout-en-bout sont maintenant marqués par une icône de mail \n\n😻 Nouvelle fenêtre de profil améliorée pour tous les contactsn\n🔲 Un nouveau button pour l\'accès rapide aux applis utilisés dans une discussion\n\n❤️ Merci de considérer à faire une donation afin que nous restions indépendents et continuons à améliorer Delta Chat: %1$s</string>
|
||||
<string name="update_2_0">Quoi de neuf?\n\n💯 Le chiffrement de bout-en-bout est maintenant fiable et pérenne. 🔒Fini les cadenas !\n\n✉️ Les mails sans chiffrement de bout-en-bout sont maintenant marqués par une icône de mail \n\n😻 Nouvelle fenêtre de profil améliorée pour tous les contacts \n\n🔲 Nouveau bouton pour l\'accès rapide aux applis utilisées dans une discussion\n\n❤️ Merci d\'envisager de faire une donation afin que nous restions indépendants et continuions à améliorer Delta Chat: %1$s</string>
|
||||
</resources>
|
||||
|
||||
@@ -1020,6 +1020,7 @@
|
||||
<string name="secure_join_replies">%1$s ha risposto, in attesa di essere aggiunto al gruppo…</string>
|
||||
<string name="secure_join_wait">Impostazione della crittografia end-to-end, attendere...</string>
|
||||
<string name="contact_verified">%1$s introdotto.</string>
|
||||
<string name="contact_blocked">Hai bloccato il contatto</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Introdotto da %1$s</string>
|
||||
<string name="verified_by_you">Introdotto da me</string>
|
||||
|
||||
@@ -176,7 +176,7 @@
|
||||
<!-- "Stickers" as known from other messengers; in some languages, the English "Sticker" is fine. -->
|
||||
<string name="sticker">Tamenṭaḍt</string>
|
||||
<string name="add_to_sticker_collection">Rnu ɣer tegrumma n tamenṭaḍt</string>
|
||||
<string name="add_stickers_instructions">Akken ad ternuḍ tamenṭaḍt, sit ɣef \" ldi akaram n tmenṭaḍt \", snulfu-d akaram anaddaw i ukemmus-ik-im n tmenṭaḍt, zuɣer tugna akked ifuyla n tmenṭaḍt din</string>
|
||||
<string name="add_stickers_instructions">Akken ad ternuḍ tamenṭaḍt, sit ɣef \" ldi akaram n tmenṭaḍt \", snulfu-d akaram anaddaw i ukemmus-ik·im n tmenṭaḍt, zuɣer tugna akked ifuyla n tmenṭaḍt din</string>
|
||||
<string name="open_sticker_folder">Ldi akaran n tmenṭaḍt</string>
|
||||
<string name="images">Tugniwin</string>
|
||||
<string name="audio">Ameslaw</string>
|
||||
@@ -282,7 +282,7 @@
|
||||
<string name="menu_message_details">Talɣut n yizen</string>
|
||||
<string name="menu_copy_to_clipboard">Nɣel ɣer tecfawt</string>
|
||||
<string name="share_invite_link">Bḍu aseɣwen n tinnubga</string>
|
||||
<string name="share_invite_link_explain">Yal yiwen s useɣwen-a yezmer ad iwali amaɣnu-ik-im daɣen ad yebdu adiwenni yid-k-m. Bḍu-t kan d wid i tettamneḍ.</string>
|
||||
<string name="share_invite_link_explain">Yal yiwen s useɣwen-a yezmer ad iwali amaɣnu-ik·im daɣen ad yebdu adiwenni yid-k·m. Bḍu-t kan d wid i tettamneḍ.</string>
|
||||
<string name="invite_friends">Snubeg imeddukal</string>
|
||||
<!-- %1$s is replaced by the user's invitation link ("https://i.delta.chat/...") -->
|
||||
<string name="invite_friends_text">Nermes-iyi-d deg Delta:\n%1$s</string>
|
||||
@@ -341,7 +341,7 @@
|
||||
<string name="title_share_location">Bḍu adeg akked iɛeggalen n ugraw meṛṛa</string>
|
||||
<string name="device_talk">Iznan n yibenk</string>
|
||||
<string name="device_talk_subtitle">Slalen-d iznan seg yidis adigan</string>
|
||||
<string name="device_talk_explain">Iznan n udiwenni-a ttlalen-d deg yibenk-ik-im kken ad d-mlen ileqman akked wuguren n usnas deg useqdec.</string>
|
||||
<string name="device_talk_explain">Iznan n udiwenni-a ttlalen-d deg yibenk-ik·im kken ad d-mlen ileqman akked wuguren n usnas deg useqdec.</string>
|
||||
<string name="edit_contact">Ẓreg anermis</string>
|
||||
<!-- Verb "to pin", making something sticky, not a noun or abbreviation for "pin number". -->
|
||||
<string name="pin_chat">Senteḍ adiwenni</string>
|
||||
@@ -357,7 +357,7 @@
|
||||
<!-- Menu item beside an app/chat that adds an icon to the system's home screen. If the user taps that icon, the app/chat is opened directly. -->
|
||||
<string name="add_to_home_screen">Rnu ɣer ugdil agejdan</string>
|
||||
<string name="donate">Mudd tawsa</string>
|
||||
<string name="donate_device_msg">❤️ Yettban-iyi-d dakken aql-ik-im tḥemmled Delta Chat!\n\nMa ulac aɣilif, mudd-d tawsa akken ad tḍemneḍ d akken Delta Chat ad yeqqim baṭel i yal yiwen.\n\nMa d Delta Chat baṭel i useqdec d uɣbalu yeldin, taneflit tesqam-d idrimen. Mudd-aɣ-d afus ad neḥrez Delta Chat d ilelli u ad t-nerr d imgerrez ugar ɣer zdat.\n\nhttps://delta.chat/donate</string>
|
||||
<string name="donate_device_msg">❤️ Yettban-iyi-d dakken aql-ik·im tḥemmled Delta Chat!\n\nMa ulac aɣilif, mudd-d tawsa akken ad tḍemneḍ d akken Delta Chat ad yeqqim baṭel i yal yiwen.\n\nMa d Delta Chat baṭel i useqdec d uɣbalu yeldin, taneflit tesqam-d idrimen. Mudd-aɣ-d afus ad neḥrez Delta Chat d ilelli u ad t-nerr d imgerrez ugar ɣer zdat.\n\nhttps://delta.chat/donate</string>
|
||||
|
||||
<string name="mute_for_one_hour"> Sgugem i 1 usrag</string>
|
||||
<string name="mute_for_eight_hours">Sgugem i 8 yisragen</string>
|
||||
@@ -394,15 +394,23 @@
|
||||
<!-- get confirmations -->
|
||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||
<string name="ask_leave_group">Tetḥeqqeḍ tebɣiḍ ad truḥeḍ? </string>
|
||||
<plurals name="ask_delete_chat">
|
||||
<item quantity="one">Kkes %d n udiwenni?</item>
|
||||
<item quantity="other">Kkes %d n tdiwenniyin?</item>
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Kkes adiwenni \"%1$s\"?</string>
|
||||
<string name="ask_delete_message">Kkes izen-a?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="one">Kkes %d n yizen?</item>
|
||||
<item quantity="other">Kkes %d n yiznan?</item>
|
||||
</plurals>
|
||||
<string name="ask_forward">Welleh iznan ɣer %1$s?</string>
|
||||
<string name="ask_forward_multiple">Welleh iznan ɣer %1$d n yidiwenniyen?</string>
|
||||
<string name="ask_export_attachment">Asifeḍ n imeddayen ad yeǧǧ isnasen-nniḍen deg yibenk-ik-im ad kecmen ɣur-sen.\n\nad tkemmleḍ?</string>
|
||||
<string name="ask_export_attachment">Asifeḍ n imeddayen ad yeǧǧ isnasen-nniḍen deg yibenk-ik·im ad kecmen ɣur-sen.\n\nad tkemmleḍ?</string>
|
||||
<string name="ask_block_contact">Sewḥel anermis-agi?\n\nUr d-ttbanen ara yiznan usriden neɣ igrawen i d-yettwaxelqen s yinermisen iweḥlen.\n\nIgrawen-nniḍen yesεan inermisen iweḥlen mazal ad d-sseknen iznan-nsen.</string>
|
||||
<string name="ask_unblock_contact">Kkes asewḥel i unermis-a </string>
|
||||
<string name="ask_delete_contacts">Kkes inermisen?\n\nInermisen s udiwenni i d-iteddun ulamek ara ttwakksen i lebda.</string>
|
||||
<string name="ask_delete_contact">Kkes anermis %1$s?\n\nInermisen s udiwenni i d-iteddun ulamek ara ttwakksen i lebda.</string>
|
||||
<string name="ask_start_chat_with">Qeṣṣir d %1$s?</string>
|
||||
<!-- %1$s is replaced by a comma-separated list of names -->
|
||||
<string name="ask_remove_members">Kkes %1$s seg unagraw?</string>
|
||||
@@ -436,7 +444,7 @@
|
||||
<!-- The placeholder will be replaced by the name of the recipient in a one-to-one chat. -->
|
||||
<string name="chat_new_one_to_one_hint">Azen izen i %1$s.</string>
|
||||
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
|
||||
<string name="chat_new_channel_hint">Ibuda d afecku seg waṭas nniḍen i usiweḍ n yiznan-ik-im. </string>
|
||||
<string name="chat_new_channel_hint">Ibuda d afecku seg waṭas nniḍen i usiweḍ n yiznan-ik·im. </string>
|
||||
<string name="chat_new_group_hint">Wiyaḍ ad walin kan agraw-agi ticki tuzneḍ izen amezwaru.</string>
|
||||
<string name="chat_record_slide_to_cancel">Zuɣer akken ad tesfesxeḍ</string>
|
||||
<string name="chat_record_explain">Sit u ṭṭef akken ad teskelseḍ izen n taɣect, serreḥ i tuzna</string>
|
||||
@@ -476,7 +484,7 @@
|
||||
<!-- title shown above a list contacts where one should be selected (eg. when a webxdc attempts to send a message to a chat) -->
|
||||
<string name="send_message_to">Azen izen i...</string>
|
||||
<string name="enable_realtime">Isnasen n wakud ilaw</string>
|
||||
<string name="enable_realtime_explain">Rmed tuqqna n walud tilawt i yisnasen icudden ɣer idiwenniyen. Ma yella yermed, imttekkiyen n udiwenni zemren ad d-afen tansa-ik-im IP ticki tebdiḍ asnas.</string>
|
||||
<string name="enable_realtime_explain">Rmed tuqqna n walud tilawt i yisnasen icudden ɣer idiwenniyen. Ma yella yermed, imttekkiyen n udiwenni zemren ad d-afen tansa-ik·im IP ticki tebdiḍ asnas.</string>
|
||||
|
||||
<!-- map -->
|
||||
<string name="filter_map_on_time">Sken-d imeḍqan deg ukatar n wakud</string>
|
||||
@@ -544,7 +552,7 @@
|
||||
<string name="multidevice_title">Rnu ibenk wis sin</string>
|
||||
<string name="multidevice_same_network_hint">Wali ma yella sin n yibenkan-a deg yiwen n uzeṭṭa Wi-Fi neɣ deg yiwen n uẓeṭṭa</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Aya ad yernu tangalt QR i yezmer ad yeḍumm ibenk wis sin akken ad yenɣel amaɣnu.\n\nḍmen d akken ula d yiwen n umnadi neɣ n tkamra ur yezmer ad iwali agdil-a.</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Sebded delta Chat ɣef yibenk-ik-im nniḍen (https://get.delta.chat)</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Sebded delta Chat ɣef yibenk-ik·im nniḍen (https://get.delta.chat)</string>
|
||||
<!-- "I Already Have a Profile / Add as Second Device” should be the same text as defined by the keys onboarding_alternative_logins and multidevice_receiver_title -->
|
||||
<string name="multidevice_tap_scan_on_other_device">Bdu Delta Chat, sit “Sεiɣ yakan amaɣnu / Rnu am yibenk wis sin” sakin ḍumm tangalt i d-yettwaseknen dagi</string>
|
||||
<!-- Shown inside a "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the profile name eg. "Scan to set up second device for Alice" -->
|
||||
@@ -555,7 +563,7 @@
|
||||
<string name="multidevice_receiver_needs_update">Amaɣnu i tebɣiḍ ad d-tketreḍ seg lqem amaynut n Delta Chat.\n\nAkken ad tkemleḍ asebded n yibenk wis sin, ma ulac aɣilif leqqem ibenk-agi ɣer lqem aneggaru n Delta Chat. </string>
|
||||
<string name="multidevice_abort">Sefsex asbadu n yibenk wis sin?</string>
|
||||
<string name="multidevice_abort_will_invalidate_copied_qr">Aya ad yili d arameɣtu i tangalt QR i d-yettwanɣelen ɣer tecfawt.</string>
|
||||
<string name="multidevice_transfer_done_devicemsg">ℹ️ Amaɣnu yettusiweḍ ɣer yibenk-ik wis sin.</string>
|
||||
<string name="multidevice_transfer_done_devicemsg">ℹ️ Amaɣnu yettusiweḍ ɣer yibenk-ik·im wis sin.</string>
|
||||
<!-- Shown beside progress bar, stay short -->
|
||||
<string name="preparing_account">Aheggi n umaɣnu...</string>
|
||||
<!-- Shown beside progress bar, stay short -->
|
||||
@@ -580,7 +588,7 @@
|
||||
<string name="connectivity_connected">Yettwaqqen</string>
|
||||
<string name="sending">Tuzna...</string>
|
||||
<string name="last_msg_sent_successfully">Izen aneggaru yettwazen akken iwata. </string>
|
||||
<string name="not_supported_by_provider">ur yettusefrak ara ɣer usaǧǧaw-ik-im.</string>
|
||||
<string name="not_supported_by_provider">ur yettusefrak ara ɣer usaǧǧaw-ik·im.</string>
|
||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||
<string name="messages">Iznan</string>
|
||||
<!-- Used for describing resource usage, resulting string will be eg. "1.2 GiB of 3 GiB used" -->
|
||||
@@ -592,8 +600,10 @@
|
||||
<string name="onboarding_create_instant_account">Rnu amaɣnu amaynut</string>
|
||||
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
|
||||
<string name="onboarding_alternative_logins">Ɣur-i yakan amaɣnu</string>
|
||||
<!-- This is a button and a title, allowing to use existing, classic email, setting ports, passwords and so on -->
|
||||
<string name="manual_account_setup_option">Seqdec imayl aklasiki am Umsiweḍ</string>
|
||||
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
|
||||
<string name="instant_onboarding_title">Amaɣnu-ik-im</string>
|
||||
<string name="instant_onboarding_title">Amaɣnu-ik·im</string>
|
||||
<!-- The placeholder will be replaced by the default onboarding server -->
|
||||
<string name="instant_onboarding_agree_default2">Tsertit tabaḍnit i %1$s</string>
|
||||
<!-- The placeholder will be replaced by instance name, the whole text will link to the instance page -->
|
||||
@@ -615,6 +625,7 @@
|
||||
<string name="welcome_chat_over_email">Adiwenni Aɣelsan Aruslemmas</string>
|
||||
<string name="scan_invitation_code">Ḍumm tangalt n tinnubga</string>
|
||||
<string name="login_title">Kcem</string>
|
||||
<string name="login_advanced_hint">Tuqqna-agi i yiseqdacen leqqayen:\n\n• Ur sseqdac ara tansa i tseqdaceḍ deg usnas nniḍen.\n\n• Aqeddac n yimayl aklasik yesirig anekcum war awgelhen seg yixef ɣer yixef yettwacerḍen s tignit n yimayl.</string>
|
||||
<string name="login_inbox">Tanaka n urmas</string>
|
||||
<string name="login_imap_login">Isem n tuqqna IMAP. </string>
|
||||
<string name="login_imap_server">Aqeddac IMAP</string>
|
||||
@@ -637,10 +648,21 @@
|
||||
<string name="proxy_delete">Kkes apṛuksi</string>
|
||||
<string name="proxy_delete_explain">Tebɣiḍ ad tekkseḍ \"%1$s\"?</string>
|
||||
<string name="proxy_use_proxy_confirm">Tebɣiḍ ad tesqedceḍ apṛuksi \"%1$s\"?</string>
|
||||
<string name="proxy_share_explain">Imeddukal-ik zemren ad rnun apṛuksi-a s uḍumm n tengalt QR. </string>
|
||||
<string name="proxy_share_explain">Imeddukal-ik·im zemren ad rnun apṛuksi-a s uḍumm n tengalt QR. </string>
|
||||
<string name="proxy_share_link">Bḍu aseɣwen</string>
|
||||
<string name="proxy_enabled">Apṛuksi yermed</string>
|
||||
<string name="proxy_enabled_hint">Aql-ik-im tesseqdaced apṛuksi. Ma tesɛiḍ ugur deg tuqqna, ɛreḍ apṛuksi-nniḍen.</string>
|
||||
<string name="proxy_enabled_hint">Aql-ik·im tesseqdaced apṛuksi. Ma tesɛiḍ ugur deg tuqqna, ɛreḍ apṛuksi-nniḍen.</string>
|
||||
<!-- "Relay" refers to the relay servers used; please chose a common term in your language, no need to be literal. If in doubt, stay with "Relay" -->
|
||||
<string name="transports">Imsawaḍen</string>
|
||||
<string name="add_transport">Rnu amsiweḍ</string>
|
||||
<string name="remove_transport">Kkes amsiweḍ</string>
|
||||
<string name="edit_transport">Ẓreg amsiweḍ</string>
|
||||
<!-- shown if a QR code was scanned that can be used as a relay -->
|
||||
<string name="confirm_add_transport">Rnu amsiweḍ-agi?</string>
|
||||
<string name="invalid_transport_qr">Tangalt QR ittusemḍen ur tesɛi ara amsiweḍ ameɣtu</string>
|
||||
<!-- placeholder will be replaced by a relay server name -->
|
||||
<string name="confirm_remove_transport">Kkes amsiweḍ \"%1$s\"?\n\nInermisen-ik·im ur zmiren ara ad k·im-id-awḍen ala ma tnermseḍ-ten yakan s umsiweḍ-nniḍen.\n\nMa yella ccekk, kkes amsiweḍ ticki.</string>
|
||||
|
||||
<string name="login_certificate_checks">Asenqed n uselkin</string>
|
||||
<string name="login_error_mail">Ma ulac aɣilif, sekcem tansa imayl tameɣtut</string>
|
||||
<string name="login_error_server">Ma ulac aɣilif, sekcem aqeddac ameɣtu / tansa IP.</string>
|
||||
@@ -658,11 +680,11 @@
|
||||
<!-- for translations, you can also think of "Profile Tag" or "Profile Description" as the source string -->
|
||||
<string name="profile_tag">Tabzimt n umaɣnu</string>
|
||||
<string name="profile_tag_hint">eg. Axeddim, Tawacult</string>
|
||||
<string name="profile_tag_explain">Sbadu tabzimt i d-yettbanen kan i kečč-kemm ; mudd-d afus ad temgirrdeḍ gar imeɣna-ik-im. </string>
|
||||
<string name="profile_tag_explain">Sbadu tabzimt i d-yettbanen kan i kečč·kemm ; mudd-d afus ad temgirrdeḍ gar imeɣna-ik·im. </string>
|
||||
<!-- Menu entry to sort an item to the beginning of a list. Only "To Top" may do as well in some translations, if that helps to stay shorter. -->
|
||||
<string name="move_to_top">Ddu d asawen</string>
|
||||
<string name="delete_account">Kkes amaɣnu</string>
|
||||
<string name="delete_account_ask">Tebɣiḍ ad tekkseḍ isefka n umaɣnu-inek-inem? </string>
|
||||
<string name="delete_account_ask">Tebɣiḍ ad tekkseḍ isefka n umaɣnu-inek·inem? </string>
|
||||
<string name="delete_account_explain_with_name">Akk isefka n umaɣnu n \"%s\" ɣef yibenk-a ad ttwakksen, ula d asebded n uwgelhen seg yixef ɣer yixef, Inermisen, idiwenniyin, iznan akked umidya. Tigawt-a ur tezmir ara ad tuɣal ar deffir.</string>
|
||||
<string name="unconfigured_account">Amaɣnu ur yettwaswel ara</string>
|
||||
<string name="unconfigured_account_hint">Ldi amaɣnu akken ad t-tesweleḍ</string>
|
||||
@@ -685,12 +707,12 @@
|
||||
<!-- preferences -->
|
||||
<string name="pref_using_custom"> Aseqdec asagen: %s</string>
|
||||
<string name="pref_using_default">Aseqdec amezwer: %s</string>
|
||||
<string name="pref_profile_info_headline">Amaɣnu-inek-inem</string>
|
||||
<string name="pref_profile_info_headline">Amaɣnu-inek·inem</string>
|
||||
<string name="pref_profile_photo">Tugna n umaɣnu</string>
|
||||
<string name="pref_blocked_contacts">Inermisen yettusweḥlen</string>
|
||||
<string name="blocked_empty_hint">Inermisen yettusweḥlen ad d-banen dagi. </string>
|
||||
<string name="pref_who_can_see_profile_explain">Tugna-ik-im n umaɣnu, isem-ik-im akked tmeddurt ad ttwaznen akked iznan-ik-im ticki ttemseɣwalent akked iseqdacen-nniḍen.</string>
|
||||
<string name="pref_your_name">Isem-ik-im</string>
|
||||
<string name="pref_who_can_see_profile_explain">Tugna-ik·im n umaɣnu, isem-ik·im akked tmeddurt ad ttwaznen akked iznan-ik·im ticki ttemseɣwalent akked iseqdacen-nniḍen.</string>
|
||||
<string name="pref_your_name">Isem-ik·im</string>
|
||||
<!-- Label of the Bio/Signature/Status/Motto field -->
|
||||
<string name="pref_default_status_label">Tameddurt</string>
|
||||
<string name="pref_enter_sends">Kcem tisura i umazan</string>
|
||||
@@ -705,7 +727,7 @@
|
||||
<string name="pref_screen_security_please_restart_hint">Akken ad tesneseḍ tawila n tɣellist n ugdil, ales asenker n usnas. </string>
|
||||
<string name="pref_notifications">Ilɣa</string>
|
||||
<string name="pref_mention_notifications">Tibdarin</string>
|
||||
<string name="pref_mention_notifications_explain">Deg igrawen igugmen, iznan n telɣut rzuḍ ɣer-k-m, am tririyin neɣ tiririyin n tigawt</string>
|
||||
<string name="pref_mention_notifications_explain">Deg igrawen igugmen, iznan n telɣut rzuḍ ɣer-k·m, am tririyin neɣ tiririyin n tigawt</string>
|
||||
<string name="pref_notifications_show">Sken</string>
|
||||
<string name="pref_notifications_priority">Tazwart</string>
|
||||
<string name="pref_notifications_explain">Rmed ilɣa n unagraw i yiznan imaynuten</string>
|
||||
@@ -742,7 +764,7 @@
|
||||
<string name="pref_other">Wayeḍ</string>
|
||||
<string name="pref_backup">Aḥraz</string>
|
||||
<string name="pref_backup_explain">Aḥraz n idiwenniyen ɣer tkatut tazɣarayt</string>
|
||||
<string name="pref_backup_export_explain">Aḥraz ad ak-d-imudd afus ad tesbeddeḍ asebded amaynut ɣef wagi neɣ ɣef yibenk nniḍen.\n\nAḥraz ad yegber akk iznan, inermisen akked idiwenniyen akked usebded awurman n uwgelhen si tazwara ar tagara. Ḥrez afaylu n uḥrez deg umḍiq aɣelsan neɣ kkes-it s zreb. </string>
|
||||
<string name="pref_backup_export_explain">Aḥraz ad ak·m-d-imudd afus ad tesbeddeḍ asebded amaynut ɣef wagi neɣ ɣef yibenk nniḍen.\n\nAḥraz ad yegber akk iznan, inermisen akked idiwenniyen akked usebded awurman n uwgelhen si tazwara ar tagara. Ḥrez afaylu n uḥrez deg umḍiq aɣelsan neɣ kkes-it s zreb. </string>
|
||||
<string name="pref_backup_export_this">Sifeḍ amaɣnu-agi</string>
|
||||
<!-- the placeholder will be replaced by the number of profiles to export; the number is always larger than 1 -->
|
||||
<string name="pref_backup_export_all">Sifeḍ akk %1$d Imuɣna</string>
|
||||
@@ -752,11 +774,11 @@
|
||||
<string name="pref_background">Tugniwin n ugilal</string>
|
||||
<string name="pref_background_btn_default">Seqdec tugna tamezwert</string>
|
||||
<string name="pref_background_btn_gallery">Fren seg timidelt</string>
|
||||
<string name="pref_imap_folder_warn_disable_defaults">Ma tbeddleḍ aɣewwaṛ-a, senqed aqeddac-ik-im d yimsaɣen-ik-im-nniḍen ad ttuswelen akken iwata.\n\nMa ulac, yezmer lḥal ur tteddunt ara akk tɣawsiwin.</string>
|
||||
<string name="pref_imap_folder_warn_disable_defaults">Ma tbeddleḍ aɣewwaṛ-a, senqed aqeddac-ik·im d yimsaɣen-ik·im-nniḍen ad ttuswelen akken iwata.\n\nMa ulac, yezmer lḥal ur tteddunt ara akk tɣawsiwin.</string>
|
||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||
<string name="pref_multidevice">Askar n tugett n yibenk</string>
|
||||
<string name="pref_multidevice_explain">Mtawi iznan-ik akked ibenkan-nniḍen. Irmed s wudem awurman deg tmerna n yibenk wis sin</string>
|
||||
<string name="pref_multidevice_change_warn">Askar aget-ibenk yessefk ad yettwarmed mi ara tesqedceḍ yiwen n umaɣnu deg ddeqs n yibenkan. Sens kan aɣewwaṛ-agi ma yella tekkseḍ amaɣnu-yagi seg yibenkan-ik-im nniḍen.\n\nAsens n usakar n waget-ibenk mi ara tesqedceḍ amaɣnu ɣef ddeqs n yibenkan ad d-yeglu s yiznan yettwazeglen akked wuguren-nniḍen.</string>
|
||||
<string name="pref_multidevice_explain">Mtawi iznan-ik·im akked ibenkan-nniḍen. Irmed s wudem awurman deg tmerna n yibenk wis sin</string>
|
||||
<string name="pref_multidevice_change_warn">Askar aget-ibenk yessefk ad yettwarmed mi ara tesqedceḍ yiwen n umaɣnu deg ddeqs n yibenkan. Sens kan aɣewwaṛ-agi ma yella tekkseḍ amaɣnu-yagi seg yibenkan-ik·im nniḍen.\n\nAsens n usakar n waget-ibenk mi ara tesqedceḍ amaɣnu ɣef ddeqs n yibenkan ad d-yeglu s yiznan yettwazeglen akked wuguren-nniḍen.</string>
|
||||
<string name="pref_auto_folder_moves">Ddu s wudem awurman ɣer ukaram n DeltaChat</string>
|
||||
<string name="pref_only_fetch_mvbox_title">Awi-d kan seg akaram n DeltaChat</string>
|
||||
<string name="pref_show_emails">Sken imaylen iklasanen</string>
|
||||
@@ -764,6 +786,7 @@
|
||||
<string name="pref_show_emails_accepted_contacts">I yinermisen yettwaqeblen</string>
|
||||
<string name="pref_show_emails_all">Akk</string>
|
||||
<string name="pref_experimental_features">Timahilin tirmitanin</string>
|
||||
<string name="pref_experimental_features_explain">Timahilin-agi zemrent ad ilint ur rkident ara, daɣen zemrent ad ttwabeddlent neɣ ad ttwakksent</string>
|
||||
<string name="pref_on_demand_location_streaming">Seddu asuddem deg wadig s usuter</string>
|
||||
<string name="pref_background_default">Tugna tamezwert</string>
|
||||
<string name="pref_background_default_color">Ini amezwer</string>
|
||||
@@ -782,13 +805,21 @@
|
||||
<string name="download_max_available_until">Sader-d afellay i yellan alamma d %1$s</string>
|
||||
<string name="select_profile">Fren amaɣnu</string>
|
||||
<string name="profile_image_select">Fren tugna n umaɣnu</string>
|
||||
<string name="select_your_new_profile_image">Fren tugna-ik-im tamaynut n umaɣnu</string>
|
||||
<string name="select_your_new_profile_image">Fren tugna-ik·im tamaynut n umaɣnu</string>
|
||||
<string name="profile_image_delete">Kkes tugna n umaɣnu</string>
|
||||
<string name="pref_show_tray_icon">Sken Tignit n ufaggag n waddad</string>
|
||||
<string name="pref_edit_profile">Ẓreg amaɣnu</string>
|
||||
<string name="disable_imap_idle">Sens IMAP IDLE</string>
|
||||
<string name="disable_imap_idle_explain">Ur seqdac ara asiɣzef IMAP IDLE xas yella uqeddac isefrak-it. Asireg uɣewwaṛ-agi ad yerr izen iɛeṭṭel akken ad d-yuɣal, rmed-it kan i usekyed. </string>
|
||||
<string name="send_stats_to_devs">Azen tidaddanin i yineflayen n DeltaChat</string>
|
||||
<string name="stats_device_message">Tebɣiḍ ad tεawneḍ deg usnerni n Delta Chat u ad tεawneḍ anadi s tuzna n tesnaddadin n useqdec udrigen?\n\n👉 Tekki da... 👈</string>
|
||||
<string name="stats_confirmation_dialog">Tebɣiḍ ad tεawneḍ deg usnerni n Delta Chat u ad tεawneḍ anadi s tuzna n tesnaddadin n useqdec udrigen?</string>
|
||||
<string name="stats_thanks">Tanemmirt! Tzemreḍ dima ad tessenseḍ tuzna deg \"Iɣewwaṛen -> Talqayt\".\n\nƔur-k·m ugar n 5 n tesdatin akken ad ttekkiḍ deg yiwet n tezrawt tussnant ɣef tɣellist n Delta Chat?</string>
|
||||
<string name="stats_disable_dialog">Tuzzna n tdaddanin termed yakan.\n\nTebɣiḍ ad t-tessexsiḍ?</string>
|
||||
<string name="disable">Sens</string>
|
||||
<string name="stats_keep_sending">Eǧǧ tuzna</string>
|
||||
<string name="stats_msg_body">Afaylu amedday yegber tiddadanin tudrigin, i ɣ-iεawnen ad nesnerni Delta Chat. Wali https://delta.chat/help#statssending i wugar n telɣut. Tanemmirt-ik·im!</string>
|
||||
|
||||
<!-- Emoji picker and categories -->
|
||||
<string name="emoji_search_results">Igmaḍ n unadi</string>
|
||||
<string name="emoji_not_found">Ulac imujit</string>
|
||||
@@ -853,6 +884,8 @@
|
||||
<string name="remove_member_by_you">Tekkseḍ aɛeggal %1$s</string>
|
||||
<!-- %1$s will be replaced by name of the contact removed from the group, %2$s will be replaced by name of the contact who did the action -->
|
||||
<string name="remove_member_by_other">Aɛeggal %1$s yettwakkes sɣur %2$s.</string>
|
||||
<!-- %1$s will be replaced by name of the contact removed from the group; this string is used when it's unclear who did the action -->
|
||||
<string name="member_x_removed">Aεeggal %1$s yettwakkes.</string>
|
||||
<!-- "left" in the meaning of "exited". -->
|
||||
<string name="group_left_by_you">Teffɣeḍ seg ugraw.</string>
|
||||
<!-- "left" in the meaning of "exited". -->
|
||||
@@ -907,15 +940,17 @@
|
||||
<string name="ephemeral_timer_weeks_by_other">Amkud n yiznan ur nettdum ara yettwasbed ar %1$s n yimalas sɣur %2$s.</string>
|
||||
<string name="chat_unencrypted_explanation">Iznan deg udiwenni-a sseqdacen imayl aklasiki, ur ttwawgelhen ara seg yixef ɣer yixef.</string>
|
||||
<string name="chat_protection_enabled_tap_to_learn_more">Iznan ttwawgelhen seg yixef ɣer yixef. Sit akken ad tissineḍ ugar.</string>
|
||||
<string name="chat_protection_enabled_explanation">Iznan akk yellan deg udiwenni-a ttwawgelhen seg yixef ɣer yixef.\n\nAwgelhen n yixef ɣer yixef yettaǧǧa iznan d usligen gar-ak-am d yecriken n udiwenni. Ula d iqeddacen, isaǧǧawen neɣ isawaḍen ur zemren ad ten-ɣren.</string>
|
||||
<string name="chat_protection_enabled_explanation">Iznan akk yellan deg udiwenni-a ttwawgelhen seg yixef ɣer yixef.\n\nAwgelhen n yixef ɣer yixef yettaǧǧa iznan d usligen gar-ak·am d yecriken n udiwenni. Ula d iqeddacen, isaǧǧawen neɣ imsawaḍen ur zemren ad ten-ɣren.</string>
|
||||
<string name="invalid_unencrypted_tap_to_learn_more">⚠️%1$s Yesra awgelhen n yixef ɣer yixef ur nelli ara yakan i udiwenni-a. Sit akken ad tissineḍ ugar.</string>
|
||||
<string name="invalid_unencrypted_explanation">Akken ad tesbeddeḍ awgelhen n yixef ɣer yixef, tzemreḍ ad temlileḍ inermisen s timmad-nsen u ad ḍummeḍ tangalt-nsen QR akken ad ten-id-tesmendeḍ.</string>
|
||||
<string name="learn_more">Issin ugar</string>
|
||||
|
||||
<string name="devicemsg_self_deleted">Tekkseḍ adiwenni n \" iznan yettwakelsen \".\n\nℹ️ Akken ad tesqedceḍ tamahilt \" iznan yettwakelsen \", rnu adiwenni amaynut akked yiman-ik-im. </string>
|
||||
<string name="devicemsg_self_deleted">Tekkseḍ adiwenni n \" iznan yettwakelsen \".\n\nℹ️ Akken ad tesqedceḍ tamahilt \" iznan yettwakelsen \", rnu adiwenni amaynut akked yiman-ik·im. </string>
|
||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
||||
<string name="devicemsg_storage_exceeding">⚠️Asaǧǧaw-ik·im n usekles qrib ad yaččar: %1$s%% yettwaseqdec yakan.\n\nAhat ur tezmireḍ ara ad d-remseḍ iznan ma yella asekles yeččur.\n\n 👉 Ttxil-k·m senqed ma yella tzemreḍ ad tekkseḍ isefka iqburen deg ugrudem n web n isaǧǧawen syin rmed \"Iɣewwaṛen / Idiwenniyen / Kkes iznan iqbuṛen\". Tzemreḍ ad tesneqdeḍ aseqdec n usekles-inek·inem amiran deg \"Iɣewwaṛen / tuqqna\".</string>
|
||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||
<string name="devicemsg_bad_time">⚠️ Azemz neɣ akud deg yibenk-ik-im yettban-d ur iṣeḥḥa ara (%1$s).\n\nṢeggem tamasragt-nnek ⏰🔧Akken ad neḍmen d akken iznan-ik-im ad ttwaremsen akken iwata. </string>
|
||||
<string name="devicemsg_update_reminder">⚠️Yezmer lḥal alqem-ik-im n Delta Chat d aqbur.\n\nAya yezmer ad d-yeglu s wuguren acku imendiden-ik-im n udiwenni sseqdacen ileqman imaynuten - yerna txuṣṣeḍ timahilin tineggura 😳\nTtxil-k-m, ssefqed https://get.delta.chat neɣ taḥanut-nnek-nnem n usnas i uleqqem.</string>
|
||||
<string name="devicemsg_bad_time">⚠️ Azemz neɣ akud deg yibenk-ik·im yettban-d ur iṣeḥḥa ara (%1$s).\n\nṢeggem tamasragt-ik·im ⏰🔧Akken ad neḍmen d akken iznan-ik·im ad ttwaremsen akken iwata. </string>
|
||||
<string name="devicemsg_update_reminder">⚠️Yezmer lḥal alqem-ik·im n Delta Chat d aqbur.\n\nAya yezmer ad d-yeglu s wuguren acku imendiden-ik·im n udiwenni sseqdacen ileqman imaynuten - yerna txuṣṣeḍ timahilin tineggura 😳\nTtxil-k·m, ssefqed https://get.delta.chat neɣ taḥanut-nnek·nnem n usnas i uleqqem.</string>
|
||||
|
||||
<!-- Some options as "Add Second Device" or "Backup" may require the system PIN/Fingerprint/Gesture/Etc. to be entered in a system dialog. This hint is added to the system dialog, below a title as "Add Second Device" or "Backup". -->
|
||||
<string name="enter_system_secret_to_continue">Kkes assekeṛ akken ad tkemmleḍ</string>
|
||||
@@ -924,7 +959,7 @@
|
||||
<string name="qr_code">Tangalt QR</string>
|
||||
<string name="load_qr_code_as_image">Sali tangalt QR am tugna</string>
|
||||
<string name="qrscan_title">Ḍumm Tangalt QR</string>
|
||||
<string name="qrscan_hint">Ṭṭef takamra-nnek-nnem nnig n tangalt QR</string>
|
||||
<string name="qrscan_hint">Ṭṭef takamra-nnek·nnem nnig n tangalt QR</string>
|
||||
<string name="qrscan_hint_desktop">Awi tangalt QR ɣer tkamiṛat</string>
|
||||
<string name="qrscan_failed">Tangalt QR ur tezmir ara ad ttwakestengel</string>
|
||||
<string name="qrscan_ask_join_group">Tebɣiḍ ad tettekkiḍ deg ugraw \"%1$s\"?</string>
|
||||
@@ -934,7 +969,7 @@
|
||||
<string name="qrscan_contains_text">Aḍris n tengalt QR yettwaḍummen:\n\n%1$s</string>
|
||||
<string name="qrscan_contains_url">URL n tangalt QR yettwaḍummen:\n\n%1$s</string>
|
||||
<string name="qrscan_fingerprint_label">Adsil umḍin</string>
|
||||
<string name="withdraw_verifycontact_explain">Tangalt-a QR tezmer ad tt-id-ḍummen wiyaḍ akken ad k-id-nermsen.\n\nTzemreḍ ad talseḍ awennez, akken tangalt QR yellan neɣ aseɣwen n uεraḍ ur iteddu ara.</string>
|
||||
<string name="withdraw_verifycontact_explain">Tangalt-a QR tezmer ad tt-id-ḍummen wiyaḍ akken ad k·m-id-nermsen.\n\nTzemreḍ ad talseḍ awennez, akken tangalt QR yellan neɣ aseɣwen n uεraḍ ur iteddu ara.</string>
|
||||
<string name="withdraw_verifygroup_explain">Tangalt-a QR tezmer ad tt-id-ḍummen wiyaḍ akken ad kecmen ɣer ugraw \"%1$s\".\n\nTzemreḍ ad talseḍ awennez, akken tangalt QR yellan neɣ aseɣwen n uεraḍ ur iteddu ara.</string>
|
||||
<string name="withdraw_joinbroadcast_explain">Tangalt-a QR tezmer ad tt-id-ḍummen wiyaḍ akken ad ddun ɣer ubadu \"%1$s\".\n\nTzemreḍ ad talseḍ awennez, akken tangalt QR yellan neɣ aseɣwen n uεraḍ ur iteddu ara.</string>
|
||||
<string name="withdraw_qr_code">Ales Awennez n Tangalt QR</string>
|
||||
@@ -953,16 +988,18 @@
|
||||
<string name="qrshow_join_contact_hint">Ḍumm iwakken ad tmeslayeḍ d %1$s</string>
|
||||
<string name="qrshow_join_contact_no_connection_toast">Ulac tuqqna internet, ur izmir ara ad isebded tangalt QR.</string>
|
||||
<string name="qraccount_ask_create_and_login">Rnu amaɣnu amaynut di \"%1$s\" sakin tkecmeḍ dinna?</string>
|
||||
<string name="set_name_and_avatar_explain">Sbadu isem ara ɛeqlen inermisen-ik. Tzemreḍ daɣen ad tesbaduḍ tugna n umaɣnu.</string>
|
||||
<string name="set_name_and_avatar_explain">Sbadu isem ara ɛeqlen inermisen-ik·im. Tzemreḍ daɣen ad tesbaduḍ tugna n umaɣnu.</string>
|
||||
<string name="please_enter_name">Ma ulac aɣilif, sekcem isem.</string>
|
||||
<string name="qraccount_qr_code_cannot_be_used">Tangalt QR tettwaḍummen ur tezmir ara ad tettwaseqdec i usebded n umaɣnu amaynut. </string>
|
||||
<!-- the placeholder will be replaced by the address of the profile -->
|
||||
<string name="qrlogin_ask_login">Kcem ɣer \"%1$s\"?</string>
|
||||
<!-- first placeholder will be replaced by name of the inviter, second placeholder will be replaced by the name of the inviter. -->
|
||||
<string name="secure_join_started">%1$s yeɛreḍ-ik-im-id ad d-ternud ɣer ugraw-a.\n\nRǧu ibenk n %2$s ad d-yerr...</string>
|
||||
<string name="secure_join_started">%1$s yeɛreḍ-ik·im-id ad d-ternud ɣer ugraw-a.\n\nRǧu ibenk n %2$s ad d-yerr...</string>
|
||||
<!-- first placeholder will be replaced by name of the inviter, second placeholder will be replaced by the name of the inviter. -->
|
||||
<string name="secure_join_channel_started">%1$s inced-ik·m-id ad tkecmeḍ ɣer ubadu-a.\n\nAṛǧu n yibenk n %2$s akken ad d-yerr tiririt...</string>
|
||||
<!-- placeholder will be replaced by the name of the inviter. -->
|
||||
<string name="secure_join_replies">%1$s yerra-d, rǧu i tmerna-as ɣer ugraw...</string>
|
||||
<string name="secure_join_wait">Asbeddi n tuqqna, ttxil-k-m rǧu...</string>
|
||||
<string name="secure_join_wait">Asbeddi n tuqqna, ttxil-k·m rǧu...</string>
|
||||
<string name="contact_verified">%1$s ittwasenked.</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Yettwasenked sɣur %1$s</string>
|
||||
@@ -1091,7 +1128,7 @@
|
||||
<string name="open_settings">Ldi iɣewwaṛen</string>
|
||||
<!-- iOS device contact alert -->
|
||||
<string name="import_device_contacts">Kter inermisen n yibenk</string>
|
||||
<string name="import_device_contacts_hint">Iwakken ad tmeslayeḍ akked inermisen seg yibenk-ik-im, ldi Iɣewwaṛen sakkin rmed \"Iinermisen\".</string>
|
||||
<string name="import_device_contacts_hint">Iwakken ad tmeslayeḍ akked inermisen seg yibenk-ik·im, ldi Iɣewwaṛen sakkin rmed \"Iinermisen\".</string>
|
||||
<!-- iOS notification settings -->
|
||||
<string name="disabled_in_dc">Ittwasens deg Delta Chat</string>
|
||||
<string name="disabled_in_system_settings">Ittwasens deg iɣewwaren n unagraw</string>
|
||||
@@ -1112,26 +1149,26 @@
|
||||
<!-- use the same translation for "Widget" as the system is using; often the term "Widget" stays untranslated -->
|
||||
<string name="add_to_widget">Rnu ɣer uwiǧet</string>
|
||||
<!-- iOS permissions, copy from "deltachat-ios/Info.plist", which is used on missing translations in "deltachat-ios/LANG.lproj/InfoPlist.strings" -->
|
||||
<string name="InfoPlist_NSCameraUsageDescription">Delta Chat yesseqdac takamrat-ik-im akken ad d-yeṭṭfeḍ tiwlafin d tvidyutin yerna ad i uḍummu tingalin QR.</string>
|
||||
<string name="InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription">Delta Chat isra ad tebḍuḍ ideg-inek-inem ɣef wakud i tesremdeḍ ad tebḍuḍ ideg.</string>
|
||||
<string name="InfoPlist_NSLocationWhenInUseUsageDescription">Delta Chat yesra tasiregt akken ad yebḍu adig-inek-inem deg wakud i tremdeḍ buṭṭu n wadig.</string>
|
||||
<string name="InfoPlist_NSCameraUsageDescription">Delta Chat yesseqdac takamrat-ik·im akken ad d-yeṭṭfeḍ tiwlafin d tvidyutin yerna ad i uḍummu tingalin QR.</string>
|
||||
<string name="InfoPlist_NSLocationAlwaysAndWhenInUseUsageDescription">Delta Chat isra ad tebḍuḍ ideg-inek·inem ɣef wakud i tesremdeḍ ad tebḍuḍ ideg.</string>
|
||||
<string name="InfoPlist_NSLocationWhenInUseUsageDescription">Delta Chat yesra tasiregt akken ad yebḍu adig-inek·inem deg wakud i tremdeḍ buṭṭu n wadig.</string>
|
||||
<string name="InfoPlist_NSMicrophoneUsageDescription">Delta Chat yesseqdac amikrufun-ik·im i usekles d tuzna n yiznan n taɣect akked d tvidyutin s imesli.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryUsageDescription">Delta Chat ad k-yeǧǧ ad tferneḍ anwa tiwlafin seg temkarḍit-ik-im ara tazneḍ.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryAddUsageDescription">Delta Chat yebɣa ad yessekles tugniwin ɣer temkarḍit-ik-im n tewlafin.</string>
|
||||
<string name="InfoPlist_NSFaceIDUsageDescription">Delta cat yezmer ad iseqdec ID n wudem i ummesten n umaɣnu-ik-im adigan, asnulfu n uḥraz akked usebded n yibenk wis sin.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryUsageDescription">Delta Chat ad k-yeǧǧ ad tferneḍ anwa tiwlafin seg temkarḍit-ik·im ara tazneḍ.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryAddUsageDescription">Delta Chat yebɣa ad yessekles tugniwin ɣer temkarḍit-ik·im n tewlafin.</string>
|
||||
<string name="InfoPlist_NSFaceIDUsageDescription">Delta cat yezmer ad iseqdec ID n wudem i ummesten n umaɣnu-ik·im adigan, asnulfu n uḥraz akked usebded n yibenk wis sin.</string>
|
||||
|
||||
<!-- android specific strings, developers: please take care to remove strings that are no longer used! -->
|
||||
<string name="pref_instant_delivery">asiweḍ dindin</string>
|
||||
<string name="pref_background_notifications">Seqdec tuqqna n ugilal</string>
|
||||
<string name="pref_background_notifications_explain">Yesra ad yettwazgel useggem n tbatrit, seqdec ma yella ilɣa ur d-ttawḍen ara di lawan. </string>
|
||||
<string name="pref_background_notifications_explain">Yesra ad yettwazgel useggem n udɣaɣ, seqdec ma yella ilɣa ur d-ttawḍen ara di lawan. </string>
|
||||
<string name="pref_reliable_service">Ḥettem tuqqna n ugilal</string>
|
||||
<string name="pref_reliable_service_explain">ad d-yeglu s telɣut timezgit</string>
|
||||
|
||||
<string name="pref_background_notifications_rationale">Akken ad tḥerzeḍ tuqqna daɣen ad d-remseḍ iznan deg ugilal, zgel aseggem n tbatrit deg usurif ay d-itteddun.\n\nDelṭa Chat yesseqdac kra n teɣbula udiɣ ur ttḥewwil ara akken ad yečč aṭas deg tbatrit.</string>
|
||||
<string name="pref_background_notifications_rationale">Akken ad tḥerzeḍ tuqqna daɣen ad d-remseḍ iznan deg ugilal, zgel aseggem n tbatrit deg usurif ay d-itteddun.\n\nDelṭa Chat yesseqdac kra n teɣbula udiɣ ur ttḥewwil ara akken ad yečč aṭas deg udɣaɣ-ik.im.</string>
|
||||
<!-- disabling "Reliable service" will hide a the maybe annoying permanent-notification with the drawback that new-message-notifications get potentially unreliable -->
|
||||
<string name="perm_enable_bg_reminder_title">Sit dagi akken ad tremseḍ iznan ticki Delta Chat yella deg ugilal.</string>
|
||||
<string name="perm_enable_bg_already_done">Tsirgeḍ yakan Delta Chat i wakken ad d-remseḍ iznan deg ugilal.\n\nMa yella iznan ur d-ttawḍen ara deg ugilal, ttxil-k-m senqed daɣen iɣewwaṛen n unagraw.</string>
|
||||
<string name="perm_enable_bg_already_done">Tsirgeḍ yakan Delta Chat i wakken ad d-remseḍ iznan deg ugilal.\n\nMa yella iznan ur d-ttawḍen ara deg ugilal, ttxil-k·m senqed daɣen iɣewwaṛen n unagraw.</string>
|
||||
|
||||
<!-- device messages for updates -->
|
||||
<string name="update_2_0">D acu i d amaynut?\n\n💯Awgelhen n yixef ɣer yixef d ayen iɣef ara tettekleḍ u i lebda. Inekcaman 🔒 ruḥen!\n\n✉️ Imayl aklasik war awgelhen yettwacreḍ s usekkil azamulan.\n\n 😻 Agdil amaynut yettwasneflin n umaɣnu i akk inermisen-ik-im\n\n🔲 Taqeffalt tamaynutt i unekcum uzrib ɣer yisnasen yettwasqedcen deg udiwenni usrid\n\n❤️ Ma ulac aɣilif mudd-aɣ-d afus akken ad neqqim d imunanen, daɣen ad nkemmel ad d-nawi asnerni: %1$s</string>
|
||||
<string name="update_2_0">D acu i d amaynut?\n\n💯Awgelhen n yixef ɣer yixef d ayen iɣef ara tettekleḍ u i lebda. Inekcaman 🔒 ruḥen!\n\n✉️ Imayl aklasik war awgelhen yettwacreḍ s usekkil azamulan.\n\n 😻 Agdil amaynut yettwasneflin n umaɣnu i akk inermisen-ik·im\n\n🔲 Taqeffalt tamaynutt i unekcum uzrib ɣer yisnasen yettwasqedcen deg udiwenni usrid\n\n❤️ Ma ulac aɣilif mudd-aɣ-d afus akken ad neqqim d imunanen, daɣen ad nkemmel ad d-nawi asnerni: %1$s</string>
|
||||
</resources>
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
<string name="ok">Gerai</string>
|
||||
<string name="cancel">Atsisakyti</string>
|
||||
<string name="clear_search">Išvalyti paiešką</string>
|
||||
<!-- a noun, used on a button, short for "show link" -->
|
||||
<string name="link">Nuoroda</string>
|
||||
<!-- "scan" in the meaning of "scan QR code" -->
|
||||
<string name="scan">Skenuoti</string>
|
||||
<string name="yes">Taip</string>
|
||||
<string name="no">Ne</string>
|
||||
<string name="on">Įjungta</string>
|
||||
@@ -47,6 +51,7 @@
|
||||
<string name="ephemeral_messages_hint">Šie nustatymai taikomi visiems Delta Chat besinaudojantiems dalyviams. Vis dėlto, jie gali kopijuoti, įrašyti ir persiųsti žinutes arba naudoti kitas el. pašto kliento programas.</string>
|
||||
<string name="save">Įrašyti</string>
|
||||
<string name="media">Medija</string>
|
||||
<string name="apps_and_media">Programėlės ir medija</string>
|
||||
<string name="profile">Profilis</string>
|
||||
<string name="all_profiles">Visi profiliai</string>
|
||||
<string name="current_profile">Dabartinis profilis</string>
|
||||
@@ -83,7 +88,7 @@
|
||||
<string name="email_address">El. pašto adresas</string>
|
||||
<string name="bad_email_address">Blogas el. pašto adresas.</string>
|
||||
<string name="password">Slaptažodis</string>
|
||||
<string name="existing_password">Esamas slaptažodis</string>
|
||||
<string name="existing_password">Dabartinis slaptažodis</string>
|
||||
<string name="now">Dabar</string>
|
||||
<!-- Headline for destructive actions with no undo. Could also be "Caution" or "Warning". -->
|
||||
<string name="danger">Dėmesio</string>
|
||||
@@ -176,7 +181,7 @@
|
||||
<!-- "App" is used to present "Webxdc App" (https://webxdc.org) in a user friendly way. Please stay close to the original term and keep it short (it is used in menus with few screen space). -->
|
||||
<string name="webxdc_app">Privati programėlė</string>
|
||||
<!-- plural of "App"; used to present "Webxdc App" (https://webxdc.org) in a user friendly way. Please stay close to the original term and keep it short (it is used in menus with few screen space). -->
|
||||
<string name="webxdc_apps">Privačios programėlės</string>
|
||||
<string name="webxdc_apps">Programėlės</string>
|
||||
<string name="games">Žaidimai</string>
|
||||
<string name="app_size">Dydis</string>
|
||||
<!-- short for "Browse through the App Picker/Store/Catalogue"; could also be translated as "Discover" or "Search" -->
|
||||
@@ -207,8 +212,11 @@
|
||||
<string name="menu_new_classic_contact">Pridėti adresatą rankiniu būdu</string>
|
||||
<string name="menu_new_chat">Naujas pokalbis</string>
|
||||
<string name="menu_new_group">Nauja grupė</string>
|
||||
<string name="clone_chat">Dubliuoti pokalbį</string>
|
||||
<!-- deprecated -->
|
||||
<string name="add_recipients">Pridėti gavėjus</string>
|
||||
<!-- "New" as in "Create New Email"; shown together with "New Group" and "New Channel" -->
|
||||
<string name="new_email">Naujas el. laiškas</string>
|
||||
<!-- the "Subject" of an email, use the term common in classic email apps -->
|
||||
<string name="subject">Tema</string>
|
||||
<string name="menu_send">Siųsti</string>
|
||||
@@ -227,6 +235,7 @@
|
||||
<string name="menu_delete_location">Ištrinti šią vietą?</string>
|
||||
<string name="menu_message_details">Išsamesnė žinutės informacija</string>
|
||||
<string name="menu_copy_to_clipboard">Kopijuoti į iškarpinę</string>
|
||||
<string name="share_invite_link_explain">Kiekvienas, turintis šią nuorodą, gali peržiūrėti jūsų profilį ar pradėti su jumis pokalbį. Bendrinkite ją tik su žmonėmis, kuriais pasitikite.</string>
|
||||
<string name="menu_copy_selection_to_clipboard">Kopijuoti žymėjimą</string>
|
||||
<string name="menu_copy_link_to_clipboard">Kopijuoti nuorodą</string>
|
||||
<string name="menu_copy_text_to_clipboard">Kopijuoti tekstą</string>
|
||||
@@ -241,6 +250,7 @@
|
||||
<string name="menu_export_attachment">Eksportuoti priedą</string>
|
||||
<string name="menu_export_attachments">Eksportuoti priedus</string>
|
||||
<string name="menu_all_media">Visa medija</string>
|
||||
<string name="all_apps_and_media">Visos programėlės ir medija</string>
|
||||
<!-- Command to jump to the original message corresponding to a gallery image or document -->
|
||||
<string name="show_in_chat">Rodyti pokalbyje</string>
|
||||
<string name="menu_share">Bendrinti</string>
|
||||
@@ -255,7 +265,7 @@
|
||||
<string name="menu_scroll_to_top">Slinkti į viršų</string>
|
||||
<string name="menu_help">Žinynas</string>
|
||||
<!-- use the same term for "Apps" as elsewhere -->
|
||||
<string name="what_is_webxdc">Kas yra „Webxdc“?</string>
|
||||
<string name="what_is_webxdc">Apie programėles</string>
|
||||
<string name="privacy_policy">Privatumo politika</string>
|
||||
<string name="menu_select_all">Žymėti viską</string>
|
||||
<string name="menu_edit_name">Taisyti vardą</string>
|
||||
@@ -360,6 +370,7 @@
|
||||
<string name="chat_share_with_title">Bendrinti su</string>
|
||||
<string name="chat_input_placeholder">Žinutė</string>
|
||||
<string name="chat_archived_label">Archyvuotas</string>
|
||||
<string name="chat_request_label">Užklausa</string>
|
||||
<string name="chat_no_messages">Žinučių nėra.</string>
|
||||
<string name="chat_self_talk_subtitle">Žinutės, kurias siunčiu asmeniškai sau</string>
|
||||
<string name="archive_empty_hint">Jei archyvuosite pokalbius, jie bus rodomi čia.</string>
|
||||
@@ -406,7 +417,6 @@
|
||||
<string name="tab_image_empty_hint">Čia bus rodomi šiame pokalbyje bendrinti paveikslai.</string>
|
||||
<string name="tab_video_empty_hint">Čia bus rodomi šiame pokalbyje bendrinti vaizdo įrašai.</string>
|
||||
<string name="tab_audio_empty_hint">Čia bus rodomi šiame pokalbyje bendrinti garso įrašų failai ir balso žinutės.</string>
|
||||
<string name="tab_webxdc_empty_hint">Čia bus rodomos šiame pokalbyje bendrintos privačios programėlės.</string>
|
||||
<string name="tab_all_media_empty_hint">Čia bus rodoma bet kuriame pokalbyje bendrinama medija.</string>
|
||||
<string name="media_preview">Medijos peržiūra</string>
|
||||
<string name="send_message">Siųsti žinutę</string>
|
||||
@@ -415,8 +425,15 @@
|
||||
<!-- "Second Device" can also be translated as "Another Device", if that is catchier in the destination language. However, make sure to use the term consistently. -->
|
||||
<string name="multidevice_title">Pridėti antrąjį įrenginį</string>
|
||||
<string name="multidevice_same_network_hint">Įsitikinkite, kad abu įrenginiai yra prisijungę prie to pačio belaidžio (Wi-Fi) arba laidinio tinklo</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Tai sukuria QR kodą, kurį antrasis įrenginys gali nuskenuoti, kad nukopijuotų profilį.\n\nĮsitikinkite, kad joks pašalinis stebėtojas ar kamera nematys lango, kuris bus parodytas paspaudus mygtuką.</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Įsidiekite Delta Chat kitame savo įrenginyje (https://get.delta.chat)</string>
|
||||
<!-- "I Already Have a Profile / Add as Second Device” should be the same text as defined by the keys onboarding_alternative_logins and multidevice_receiver_title -->
|
||||
<string name="multidevice_tap_scan_on_other_device">Paleiskite Delta Chat, bakstelėkite „Aš jau turiu profilį / Pridėti kaip antrąjį įrenginį“ ir nuskenuokite čia rodomą kodą</string>
|
||||
<!-- Shown inside a "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the profile name eg. "Scan to set up second device for Alice" -->
|
||||
<string name="multidevice_qr_subtitle">Nuskenuokite norėdami nustatyti antrąjį įrenginį, skirtą %1$s</string>
|
||||
<string name="multidevice_receiver_title">Pridėti kaip antrąjį įrenginį</string>
|
||||
<string name="multidevice_open_settings_on_other_device">Pirmajame įrenginyje pereikite į „Nustatymai / Pridėti antrąjį įrenginį“ ir nuskenuokite ten rodomą kodą</string>
|
||||
<string name="multidevice_abort">Nutraukti antrojo įrenginio nustatymą?</string>
|
||||
<!-- Shown beside progress bar, stay short -->
|
||||
<string name="preparing_account">Ruošiama paskyra…</string>
|
||||
<string name="troubleshooting">Nesklandumų šalinimas</string>
|
||||
@@ -426,6 +443,8 @@
|
||||
<string name="incoming_messages">Gaunamosios žinutės</string>
|
||||
<!-- Headline for the "Outbox" eg. in the "Connectivity" view -->
|
||||
<string name="outgoing_messages">Siunčiamosios žinutės</string>
|
||||
<!-- deprecated -->
|
||||
<string name="storage_on_domain">Saugykla ties %1$s</string>
|
||||
<string name="connectivity">Jungiamumas</string>
|
||||
<!-- Shown in the title bar if the app is "Not connected"; prefer short strings. -->
|
||||
<string name="connectivity_not_connected">Neprisijungta</string>
|
||||
@@ -437,6 +456,7 @@
|
||||
<string name="connectivity_connected">Prisijungta</string>
|
||||
<string name="sending">Siunčiama…</string>
|
||||
<string name="last_msg_sent_successfully">Paskutinė žinutė sėkmingai išsiųsta.</string>
|
||||
<string name="not_supported_by_provider">Jūsų teikėjas nepalaiko šios ypatybės.</string>
|
||||
<!-- Subtitle in quota context of "Connectivity" view. Should be be plural always, no number is prefixed. -->
|
||||
<string name="messages">Žinutės</string>
|
||||
<!-- welcome and login -->
|
||||
@@ -444,14 +464,21 @@
|
||||
<string name="onboarding_create_instant_account">Sukurti naują profilį</string>
|
||||
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
|
||||
<string name="onboarding_alternative_logins">Aš jau turiu profilį</string>
|
||||
<!-- This is a button and a title, allowing to use existing, classic email, setting ports, passwords and so on -->
|
||||
<string name="manual_account_setup_option">Naudoti klasikinį el. paštą kaip retransliavimą</string>
|
||||
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
|
||||
<string name="instant_onboarding_title">Jūsų profilis</string>
|
||||
<!-- The placeholder will be replaced by the default onboarding server -->
|
||||
<string name="instant_onboarding_agree_default2">%1$s privatumo politika</string>
|
||||
<!-- Confirmation button on the instant onboarding screen -->
|
||||
<string name="instant_onboarding_create">Sutinku ir sukurti profilį</string>
|
||||
<!-- Secondary, link-like button to open a page with other possible instances -->
|
||||
<string name="instant_onboarding_show_more_instances">Naudoti kitą serverį</string>
|
||||
<string name="instant_onboarding_other_server">Išvardyti retransliavimo serverius</string>
|
||||
<string name="welcome_chat_over_email">Saugūs decentralizuoti pokalbiai</string>
|
||||
<string name="scan_invitation_code">Skenuoti pakvietimo kodą</string>
|
||||
<string name="login_title">Prisijungti</string>
|
||||
<string name="login_advanced_hint">Šis prisijungimas skirtas patyrusiems naudotojams:\n\n• Nenaudokite adreso, kurį naudojate kitoje programoje.\n\n• Klasikinis el. pašto serveris leidžia pokalbius be ištisinio šifravimo, pažymėtus voko piktograma.</string>
|
||||
<string name="login_inbox">Gauta</string>
|
||||
<string name="login_imap_login">IMAP prisijungimo vardas</string>
|
||||
<string name="login_imap_server">IMAP serveris</string>
|
||||
@@ -468,10 +495,13 @@
|
||||
<string name="proxy_use_proxy">Naudoti įgaliotąjį serverį</string>
|
||||
<string name="proxy_add">Pridėti įgaliotąjį serverį</string>
|
||||
<string name="proxy_add_explain">Palaikomi įgaliotųjų serverių tipai: HTTP(S), SOCKS5 ir Shadowsocks.</string>
|
||||
<string name="proxy_add_url_hint">Įveskite čia įgaliotojo serverio nuorodą</string>
|
||||
<string name="proxy_list_header">Įrašyti įgaliotieji serveriai</string>
|
||||
<string name="proxy_delete">Ištrinti įgaliotąjį serverį</string>
|
||||
<string name="proxy_delete_explain">Ar tikrai norite ištrinti „%1$s“?</string>
|
||||
<string name="proxy_use_proxy_confirm">Ar norite naudoti įgaliotąjį serverį „%1$s“?</string>
|
||||
<!-- "Relay" refers to the relay servers used; please chose a common term in your language, no need to be literal. If in doubt, stay with "Relay" -->
|
||||
<string name="transports">Retransliavimai</string>
|
||||
<string name="login_certificate_checks">Liudijimų patikrinimai</string>
|
||||
<string name="login_error_mail">Įveskite teisingą el. pašto adresą.</string>
|
||||
<string name="login_error_server">Įveskite teisingą serverį / IP adresą</string>
|
||||
@@ -523,6 +553,8 @@
|
||||
<string name="pref_screen_security_explain">Prašyti blokuoti ekrano kopijas paskiausiųjų sąraše ir programėlės viduje</string>
|
||||
<string name="pref_screen_security_please_restart_hint">Norėdami pritaikyti ekrano saugumo nustatymą, paleiskite programėlę iš naujo.</string>
|
||||
<string name="pref_notifications">Pranešimai</string>
|
||||
<string name="pref_mention_notifications">Paminėjimai</string>
|
||||
<string name="pref_mention_notifications_explain">Grupėse, kuriose išjungti pranešimai, pranešti apie jums adresuotas žinutes, tokias kaip atsakymai ar reakcijos</string>
|
||||
<string name="pref_notifications_show">Rodyti</string>
|
||||
<string name="pref_notifications_priority">Pirmenybė</string>
|
||||
<string name="pref_notifications_explain">Įjungti sistemos pranešimus apie naujas žinutes</string>
|
||||
@@ -558,7 +590,8 @@
|
||||
<string name="pref_other">Kita</string>
|
||||
<string name="pref_backup">Atsarginė kopija</string>
|
||||
<string name="pref_backup_explain">Padaro atsarginę pokalbių kopiją į išorinę saugyklą</string>
|
||||
<string name="pref_backup_export_explain">Atsarginė kopija padeda jums nusistatyti naują diegimą šiame ar kitame įrenginyje.\n\nAtsarginėje kopijoje bus visos žinutės, adresatai ir pokalbiai bei jūsų ištisinė Autocrypt sąranka. Atsarginės kopijos failą laikykite saugioje vietoje arba kaip įmanoma greičiau jį ištrinkite.</string>
|
||||
<string name="pref_backup_export_explain">Atsarginė kopija padeda jums nusistatyti naują diegimą šiame ar kitame įrenginyje.\n\nAtsarginėje kopijoje bus visos žinutės, adresatai ir pokalbiai bei jūsų ištisinio perdavimo „Autocrypt“ sąranka. Atsarginės kopijos failą laikykite saugioje vietoje arba kaip įmanoma greičiau jį ištrinkite.</string>
|
||||
<string name="pref_backup_export_this">Eksportuoti šį profilį</string>
|
||||
<!-- the placeholder will be replaced by the number of profiles to export; the number is always larger than 1 -->
|
||||
<string name="pref_backup_export_all">Eksportuoti visas %1$d paskyras</string>
|
||||
<string name="pref_backup_export_start_button">Pradėti daryti atsarginę kopiją</string>
|
||||
@@ -568,6 +601,8 @@
|
||||
<string name="pref_background_btn_default">Naudoti numatytąjį paveikslą</string>
|
||||
<string name="pref_background_btn_gallery">Pasirinkti iš galerijos</string>
|
||||
<string name="pref_imap_folder_warn_disable_defaults">Jeigu išjungiate šį parametrą, įsitikinkite, kad jūsų serveris ir kiti klientai yra sukonfigūruoti atitinkamai.\n\nPriešingu atveju, tai gali iš viso neveikti.</string>
|
||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||
<string name="pref_multidevice">Kelių įrenginių veiksena</string>
|
||||
<string name="pref_auto_folder_moves">Automatiniai perkėlimai į DeltaChat aplanką</string>
|
||||
<string name="pref_show_emails">Rodyti klasikinius el. laiškus</string>
|
||||
<string name="pref_show_emails_no">Ne, tik pokalbius</string>
|
||||
@@ -579,7 +614,7 @@
|
||||
<string name="pref_background_custom_image">Tinkintas paveikslas</string>
|
||||
<string name="pref_background_custom_color">Tinkinta spalva</string>
|
||||
<string name="export_aborted">Eksportavimas nutrauktas.</string>
|
||||
<string name="auto_download_messages">Automatinis žinučių atsisiuntimas</string>
|
||||
<string name="auto_download_messages">Automatinis žinučių atsiuntimas</string>
|
||||
<!-- %1$s will be replaced by a human-readable number of bytes, eg. 32 KiB, 1 MiB -->
|
||||
<string name="up_to_x">Iki %1$s</string>
|
||||
<string name="up_to_x_most_worse_quality_images">Iki %1$s, iš esmės, blogos kokybės paveikslus</string>
|
||||
@@ -587,7 +622,9 @@
|
||||
<string name="download_failed">Atsiuntimas nepavyko</string>
|
||||
<!-- %1$s will be replaced by a human-readable number of bytes, eg. 32 KiB, 1 MiB. Resulting string eg. "1 MiB message" -->
|
||||
<string name="n_bytes_message">%1$s žinutė</string>
|
||||
<string name="profile_image_delete">Ištrinti profilio paveikslą</string>
|
||||
<string name="profile_image_select">Pasirinkti profilio nuotrauką</string>
|
||||
<string name="select_your_new_profile_image">Pasirinkite naują profilio nuotrauką</string>
|
||||
<string name="profile_image_delete">Ištrinti profilio nuotrauką</string>
|
||||
<string name="pref_show_tray_icon">Rodyti dėklo piktogramą</string>
|
||||
<string name="pref_edit_profile">Taisyti profilį</string>
|
||||
<string name="send_stats_to_devs">Siųsti statistiką Delta Chat plėtotojams</string>
|
||||
@@ -671,6 +708,9 @@
|
||||
<string name="ephemeral_timer_weeks_by_you">Jūs nustatėte išnykstančių žinučių laikmatį į %1$s sav.</string>
|
||||
<!-- %1$s will be replaced by the number of weeks (always >1) the timer is set to, %2$s will be replaced by name of the contact -->
|
||||
<string name="ephemeral_timer_weeks_by_other">%2$s nustatė išnykstančių žinučių laikmatį į %1$s sav. </string>
|
||||
<string name="chat_unencrypted_explanation">Žinutės šiame pokalbyje naudoja klasikinius el. laiškus ir nėra šifruotos ištisinio perdavimo būdu.</string>
|
||||
<string name="chat_protection_enabled_tap_to_learn_more">Žinutės yra šifruotos ištisinio perdavimo būdu. Bakstelėkite norėdami sužinoti daugiau.</string>
|
||||
<string name="chat_protection_enabled_explanation">Visos žinutės šiame pokalbyje yra šifruotos ištisinio perdavimo būdu.\n\nIštisinis šifravimas išlaiko žinutes tarp jūsų ir jūsų pokalbio partnerių privačias. Netgi serveriai, teikėjai ar retransliavimai negali jų perskaityti.</string>
|
||||
<string name="learn_more">Sužinoti daugiau</string>
|
||||
|
||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||
@@ -698,9 +738,10 @@
|
||||
<string name="qrshow_join_group_hint">Nuskenuokite tai, norėdami prisijungti prie \"%1$s\" grupės.</string>
|
||||
<string name="qrshow_join_contact_title">QR pakvietimo kodas</string>
|
||||
<!-- This text is shown inside the "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the profile name eg. "Scan to chat with Alice" -->
|
||||
<string name="qrshow_join_contact_hint">Nuskenuokite tai, norėdami užmegzti kontaktą su %1$s</string>
|
||||
<string name="qrshow_join_contact_hint">Nuskenuokite norėdami pradėti pokalbį su %1$s</string>
|
||||
<string name="qrshow_join_contact_no_connection_toast">Nėra interneto ryšio, nepavyksta atlikti QR kodo sąrankos.</string>
|
||||
<string name="qraccount_ask_create_and_login">Sukurti naują el. pašto adresą ties „%1$s“ ir prisijungti ten?</string>
|
||||
<string name="set_name_and_avatar_explain">Nusistatykite vardą, kurį jūsų adresatai atpažins. Taip pat galite nusistatyti profilio nuotrauką.</string>
|
||||
<string name="please_enter_name">Įrašykite vardą.</string>
|
||||
<string name="qraccount_qr_code_cannot_be_used">Nuskenuotas QR kodas negali būti naudojamas naujos paskyros nustatymui.</string>
|
||||
<!-- the placeholder will be replaced by the address of the profile -->
|
||||
@@ -797,6 +838,7 @@
|
||||
<string name="InfoPlist_NSMicrophoneUsageDescription">Delta Chat naudoja mikrofoną, kad įrašytų ir siųstų balso žinutes bei vaizdo įrašus su garsu.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryUsageDescription">Delta Chat leis jums pasirinkti, kurias nuotraukas iš savo kolekcijos išsiųsti.</string>
|
||||
<string name="InfoPlist_NSPhotoLibraryAddUsageDescription">Delta Chat nori įrašyti paveikslus į jūsų nuotraukų kolekciją.</string>
|
||||
<string name="pref_background_notifications">Naudoti foninį ryšį</string>
|
||||
<string name="pref_background_notifications_rationale">Norėdami palaikyti ryšį su savo el. pašto serveriu ir gauti žinutes fone, kitame žingsnyje nepaisykite akumuliatoriaus optimizavimų (leiskite vykdyti programą fone).\n\nDelta Chat naudoja nedaug išteklių ir rūpinasi, kad neeikvotų jūsų akumuliatoriaus energijos.</string>
|
||||
<!-- disabling "Reliable service" will hide a the maybe annoying permanent-notification with the drawback that new-message-notifications get potentially unreliable -->
|
||||
<string name="perm_enable_bg_reminder_title">Bakstelėkite čia, norėdami gauti žinutes, kol Delta Chat veikia fone.</string>
|
||||
|
||||
@@ -1002,6 +1002,7 @@
|
||||
<string name="secure_join_replies">%1$s heeft geantwoord en wacht op toelating tot de groep…</string>
|
||||
<string name="secure_join_wait">Bezig met opzetten van eind-tot-eindversleuteling…</string>
|
||||
<string name="contact_verified">%1$s is goedgekeurd.</string>
|
||||
<string name="contact_blocked">Je hebt deze contactpersoon geblokkeerd</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Geïntroduceerd door %1$s</string>
|
||||
<string name="verified_by_you">Geïntroduceerd door mij</string>
|
||||
@@ -1087,8 +1088,8 @@
|
||||
<string name="name_desktop">Naam</string>
|
||||
<string name="select_group_image_desktop">Kies een groepsafbeelding</string>
|
||||
<string name="export_backup_desktop">Reservekopie exporteren</string>
|
||||
<string name="message_detail_sent_desktop">verstuurd</string>
|
||||
<string name="message_detail_received_desktop">ontvangen</string>
|
||||
<string name="message_detail_sent_desktop">Verstuurd</string>
|
||||
<string name="message_detail_received_desktop">Ontvangen</string>
|
||||
<string name="menu.view.developer.open.log.folder">Map met logbestanden openen</string>
|
||||
<string name="menu.view.developer.open.current.log.file">Huidig logbestand openen</string>
|
||||
<string name="explain_desktop_minimized_disabled_tray_pref" tools:ignore="TypographyDashes">Het systeemvakpictogram is uitgeschakeld omdat Delta Chat is gestart met de optie --minimized</string>
|
||||
|
||||
@@ -364,7 +364,7 @@
|
||||
<string name="device_talk">Komunikaty urządzenia</string>
|
||||
<string name="device_talk_subtitle">Wiadomości generowane lokalnie</string>
|
||||
<string name="device_talk_explain">Wiadomości w tym czacie są generowane lokalnie przez twoją aplikację Delta Chat. Twórcy używają go do informowania o aktualizacjach aplikacji i problemach podczas użytkowania.</string>
|
||||
<string name="device_talk_welcome_message2">Skontaktuj się!\n\n🙌 Dotknij „Kod QR” na ekranie głównym obu urządzeń. Wybierz opcję „Zeskanuj kod QR” na jednym urządzeniu i skieruj go na drugie\n\n🌍 Jeśli nie znajdujesz się w tym samym pomieszczeniu, zeskanuj kod podczas rozmowy wideo lub udostępnij link z zaproszeniem w sekcji „Zeskanuj kod QR”\n\nNastępnie: korzystaj z komunikatora za pośrednictwem największej zdecentralizowanej sieci, jaka kiedykolwiek istniała: e-mail. W przeciwieństwie do innych popularnych aplikacji bez centralnej kontroli, śledzenia lub sprzedawania Ciebie, znajomych, współpracowników lub rodziny dużym organizacjom.</string>
|
||||
<string name="device_talk_welcome_message2">Skontaktuj się!\n\n🙌 Dotknij „Kod QR” na ekranie głównym obu urządzeń. Wybierz opcję „Zeskanuj kod QR” na jednym urządzeniu i skieruj go na drugie\n\n🌍 Jeśli nie znajdujesz się w tym samym pomieszczeniu, zeskanuj kod podczas rozmowy wideo lub udostępnij link z zaproszeniem w sekcji „Zeskanuj kod QR”\n\nNastępnie: korzystaj ze zdecentralizowanego komunikatora. W przeciwieństwie do innych popularnych aplikacji bez centralnej kontroli, śledzenia lub sprzedawania Ciebie, znajomych, współpracowników lub rodziny dużym organizacjom.</string>
|
||||
<string name="edit_contact">Edytuj kontakt</string>
|
||||
<!-- Verb "to pin", making something sticky, not a noun or abbreviation for "pin number". -->
|
||||
<string name="pin_chat">Przypnij czat</string>
|
||||
@@ -420,26 +420,26 @@
|
||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||
<string name="ask_leave_group">Na pewno chcesz opuścić?</string>
|
||||
<plurals name="ask_delete_chat">
|
||||
<item quantity="one">Usunąć %d czat ze wszystkich urządzeń?</item>
|
||||
<item quantity="few">Usunąć %d czaty ze wszystkich urządzeń?</item>
|
||||
<item quantity="many">Usunąć %d czatów ze wszystkich urządzeń?</item>
|
||||
<item quantity="other">Usunąć %d czatu ze wszystkich urządzeń?</item>
|
||||
<item quantity="one">Usunąć %d czat?</item>
|
||||
<item quantity="few">Usunąć %d czaty?</item>
|
||||
<item quantity="many">Usunąć %d czatów?</item>
|
||||
<item quantity="other">Usunąć %d czatu?</item>
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Usunąć czat „%1$s” ze wszystkich urządzeń?</string>
|
||||
<string name="ask_delete_message">Usunąć tę wiadomość ze wszystkich urządzeń?</string>
|
||||
<string name="ask_delete_named_chat">Usunąć czat „%1$s”?</string>
|
||||
<string name="ask_delete_message">Usunąć tę wiadomość?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="one">Usunąć %d wiadomość ze wszystkich urządzeń?</item>
|
||||
<item quantity="few">Usunąć %d wiadomości ze wszystkich urządzeń?</item>
|
||||
<item quantity="many">Usunąć %d wiadomości ze wszystkich urządzeń?</item>
|
||||
<item quantity="other">Usunąć %d wiadomości ze wszystkich urządzeń?</item>
|
||||
<item quantity="one">Usunąć %d wiadomość?</item>
|
||||
<item quantity="few">Usunąć %d wiadomości?</item>
|
||||
<item quantity="many">Usunąć %d wiadomości?</item>
|
||||
<item quantity="other">Usunąć %d wiadomości?</item>
|
||||
</plurals>
|
||||
<string name="ask_forward">Przekazać wiadomości do użytkownika %1$s?</string>
|
||||
<string name="ask_forward_multiple">Przekazać wiadomości do %1$d czatów?</string>
|
||||
<string name="ask_export_attachment">Eksportować załącznik? Eksportowanie załączników umożliwi dostęp do nich wszystkim aplikacjom na urządzeniu.\n\nKontynuować?</string>
|
||||
<string name="ask_block_contact">Zablokować ten kontakt? Nie będziesz już odbierać wiadomości od tego kontaktu.</string>
|
||||
<string name="ask_unblock_contact">Odblokować ten kontakt? Ponownie będzie można odbierać wiadomości od tego kontaktu.</string>
|
||||
<string name="ask_delete_contacts">Usunąć kontakty? Spowoduje to trwałe usunięcie wybranych kontaktów.\n\nKontaktów z trwającymi rozmowami i kontaktów z książki adresowej systemu nie można trwale usunąć.</string>
|
||||
<string name="ask_delete_contact">Usunąć trwale kontakt %1$s?\n\nKontaktów z trwającymi czatami i kontaktów z książki adresowej systemu nie można trwale usunąć.</string>
|
||||
<string name="ask_delete_contacts">Usunąć kontakty?\n\nKontaktów z trwającymi rozmowami nie można trwale usunąć.</string>
|
||||
<string name="ask_delete_contact">Usunąć kontakt %1$s?\n\nKontaktów z trwającymi czatami nie można trwale usunąć.</string>
|
||||
<string name="ask_start_chat_with">Rozpocząć czat z %1$s?</string>
|
||||
<!-- %1$s is replaced by a comma-separated list of names -->
|
||||
<string name="ask_remove_members">Usunąć %1$s z grupy?</string>
|
||||
@@ -593,7 +593,7 @@
|
||||
<!-- Shown inside a "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the profile name eg. "Scan to set up second device for Alice" -->
|
||||
<string name="multidevice_qr_subtitle">Zeskanuj, aby skonfigurować kolejne urządzenie dla %1$s</string>
|
||||
<string name="multidevice_receiver_title">Dodaj jako kolejne urządzenie</string>
|
||||
<string name="multidevice_open_settings_on_other_device">Na pierwszym urządzeniu przejdź do „Ustawienia » Dodaj kolejne urządzenie” i zeskanuj wyświetlony tam kod</string>
|
||||
<string name="multidevice_open_settings_on_other_device">Na pierwszym urządzeniu uruchom Delta Chat, przejdź do „Ustawienia » Dodaj kolejne urządzenie” i zeskanuj wyświetlony tam kod</string>
|
||||
<string name="multidevice_receiver_scanning_ask">Skopiować konto z innego urządzenia na to urządzenie?</string>
|
||||
<string name="multidevice_receiver_needs_update">Profil, który chcesz zaimportować, pochodzi z nowszej wersji aplikacji Delta Chat.\n\nAby kontynuować konfigurowanie drugiego urządzenia, zaktualizuj to urządzenie do najnowszej wersji aplikacji Delta Chat.</string>
|
||||
<string name="multidevice_abort">Przerwać konfigurowanie kolejnego urządzenia?</string>
|
||||
@@ -636,7 +636,7 @@
|
||||
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
|
||||
<string name="onboarding_alternative_logins">Mam już profil</string>
|
||||
<!-- This is a button and a title, allowing to use existing, classic email, setting ports, passwords and so on -->
|
||||
<string name="manual_account_setup_option">Transport przez klasyczny e-mail</string>
|
||||
<string name="manual_account_setup_option">Użyj klasycznego e-maila jako przekaźnika</string>
|
||||
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
|
||||
<string name="instant_onboarding_title">Twój profil</string>
|
||||
<!-- The placeholder will be replaced by the default onboarding server -->
|
||||
@@ -653,14 +653,14 @@
|
||||
<!-- Hint about what happens when "Create Profile" button in pressed; the placeholder will be replaced by contact name -->
|
||||
<string name="instant_onboarding_contact_info">Tworzy profil, aby rozmawiać z „%1$s”.</string>
|
||||
<!-- Question shown when another user's QR code is scanned from onboarding screen -->
|
||||
<string name="instant_onboarding_confirm_contact">Chcesz utworzyć nowy profil i rozpocząć rozmowę z %1$s?</string>
|
||||
<string name="instant_onboarding_confirm_contact">Utworzyć nowy profil i rozpocząć rozmowę z %1$s?</string>
|
||||
<!-- Question shown when group's/channel's QR code is scanned from onboarding screen -->
|
||||
<string name="instant_onboarding_confirm_group">Chcesz utworzyć nowy profil i dołączyć do grupy „%1$s”?</string>
|
||||
<string name="instant_onboarding_confirm_group">Utworzyć nowy profil i dołączyć do grupy „%1$s”?</string>
|
||||
|
||||
<string name="welcome_chat_over_email">Bezpieczny zdecentralizowany czat</string>
|
||||
<string name="scan_invitation_code">Zeskanuj kod zaproszenia</string>
|
||||
<string name="login_title">Zaloguj się</string>
|
||||
<string name="login_advanced_hint">To logowanie jest przeznaczone dla zaawansowanych użytkowników:\n\n• Nie używaj konta, z którego korzystasz w innej aplikacji.\n\n• Klasyczny serwer pocztowy umożliwia rozmowy bez szyfrowania end-to-end, oznaczone ikoną poczty.</string>
|
||||
<string name="login_advanced_hint">To logowanie jest przeznaczone dla zaawansowanych użytkowników:\n\n• Nie używaj adresu, z którego korzystasz w innej aplikacji.\n\n• Klasyczny serwer pocztowy umożliwia rozmowy bez szyfrowania end-to-end, oznaczone ikoną poczty.</string>
|
||||
<string name="login_inbox">Skrzynka odbiorcza</string>
|
||||
<string name="login_imap_login">Nazwa użytkownika IMAP</string>
|
||||
<string name="login_imap_server">Serwer IMAP</string>
|
||||
@@ -688,15 +688,15 @@
|
||||
<string name="proxy_enabled">Włączone proxy</string>
|
||||
<string name="proxy_enabled_hint">Używasz serwera proxy. Jeśli masz problemy z połączeniem, spróbuj użyć innego serwera proxy.</string>
|
||||
<!-- "Relay" refers to the relay servers used; please chose a common term in your language, no need to be literal. If in doubt, stay with "Relay" -->
|
||||
<string name="transports">Serwery transportowe</string>
|
||||
<string name="add_transport">Dodaj serwer transportowy</string>
|
||||
<string name="remove_transport">Usuń serwer transportowy</string>
|
||||
<string name="edit_transport">Edytuj serwer transportowy</string>
|
||||
<string name="transports">Serwery przekaźnikowe</string>
|
||||
<string name="add_transport">Dodaj serwer przekaźnikowy</string>
|
||||
<string name="remove_transport">Usuń serwer przekaźnikowy</string>
|
||||
<string name="edit_transport">Edytuj serwer przekaźnikowy</string>
|
||||
<!-- shown if a QR code was scanned that can be used as a relay -->
|
||||
<string name="confirm_add_transport">Dodać ten serwer transportowy?</string>
|
||||
<string name="invalid_transport_qr">Zeskanowany kod QR zawiera nieprawidłowy serwer transportowy.</string>
|
||||
<string name="confirm_add_transport">Dodać ten serwer przekaźnikowy?</string>
|
||||
<string name="invalid_transport_qr">Zeskanowany kod QR zawiera nieprawidłowy serwer przekaźnikowy.</string>
|
||||
<!-- placeholder will be replaced by a relay server name -->
|
||||
<string name="confirm_remove_transport">Usunąć serwer transportowy „%1$s”?\n\nTwoje kontakty mogą się z tobą skontaktować tylko wtedy, gdy kontaktowałeś się z nimi wcześniej za pośrednictwem innego serwera transportowego.\n\nW razie wątpliwości usuń ten serwer transportowy.</string>
|
||||
<string name="confirm_remove_transport">Usunąć serwer przekaźnikowy „%1$s”?\n\nTwoje kontakty mogą się z tobą skontaktować tylko wtedy, gdy kontaktowałeś się z nimi wcześniej za pośrednictwem innego serwera przekaźnikowego.\n\nW razie wątpliwości usuń ten serwer przekaźnikowy.</string>
|
||||
|
||||
<string name="login_certificate_checks">Sprawdzanie certyfikatów</string>
|
||||
<string name="login_error_mail">Podaj ważny adres e-mail</string>
|
||||
@@ -821,6 +821,7 @@
|
||||
<string name="pref_show_emails_accepted_contacts">Dla zaakceptowanych kontaktów</string>
|
||||
<string name="pref_show_emails_all">Wszystkie</string>
|
||||
<string name="pref_experimental_features">Funkcje eksperymentalne</string>
|
||||
<string name="pref_experimental_features_explain">Te funkcje mogą być niestabilne i mogą zostać zmienione lub usunięte</string>
|
||||
<string name="pref_on_demand_location_streaming">Przesyłanie strumieniowe lokalizacji na żądanie</string>
|
||||
<string name="pref_background_default">Domyślne tło</string>
|
||||
<string name="pref_background_default_color">Domyślny kolor</string>
|
||||
@@ -846,6 +847,14 @@
|
||||
<string name="disable_imap_idle">Wyłącz IMAP IDLE</string>
|
||||
<string name="disable_imap_idle_explain">Nie używaj rozszerzenia IMAP IDLE, nawet jeśli serwer je obsługuje. Włączenie tej opcji opóźni pobieranie wiadomości, włącz ją tylko na testy.</string>
|
||||
<string name="send_stats_to_devs">Wyślij statystyki do programistów Delta Chat</string>
|
||||
<string name="stats_device_message">Chcesz pomóc w ulepszeniu Delta Chat i wesprzeć badania, wysyłając co tydzień anonimowe statystyki użytkowania?\n\n👉 Kliknij tutaj… 👈</string>
|
||||
<string name="stats_confirmation_dialog">Chcesz pomóc w ulepszeniu Delta Chat i wesprzeć badania, wysyłając co tydzień anonimowe statystyki użytkowania?</string>
|
||||
<string name="stats_thanks">Dziękujemy! Zawsze możesz wyłączyć wysyłanie w „Ustawienia » Zaawansowane”.\n\nCzy masz dodatkowo 5 minut na udział w badaniu naukowym dotyczącym bezpieczeństwa Delta Chat?</string>
|
||||
<string name="stats_disable_dialog">Wysyłanie statystyk jest już włączone.\n\nChcesz je wyłączyć?</string>
|
||||
<string name="disable">Wyłącz</string>
|
||||
<string name="stats_keep_sending">Kontynuuj wysyłanie</string>
|
||||
<string name="stats_msg_body">Załącznik zawiera anonimowe statystyki użytkowania, które pomagają nam ulepszać Delta Chat. Więcej informacji można znaleźć na: https://delta.chat/help#statssending. Dziękujemy!</string>
|
||||
|
||||
<!-- Emoji picker and categories -->
|
||||
<string name="emoji_search_results">Wyniki wyszukiwania</string>
|
||||
<string name="emoji_not_found">Nie znaleziono emoji</string>
|
||||
@@ -911,7 +920,7 @@
|
||||
<!-- %1$s will be replaced by name of the contact removed from the group, %2$s will be replaced by name of the contact who did the action -->
|
||||
<string name="remove_member_by_other">Użytkownik %2$s usunął członka %1$s.</string>
|
||||
<!-- %1$s will be replaced by name of the contact removed from the group; this string is used when it's unclear who did the action -->
|
||||
<string name="member_x_removed">Usunięto członka %1$s</string>
|
||||
<string name="member_x_removed">Usunięto członka %1$s.</string>
|
||||
<!-- "left" in the meaning of "exited". -->
|
||||
<string name="group_left_by_you">Opuszczono grupę</string>
|
||||
<!-- "left" in the meaning of "exited". -->
|
||||
@@ -973,7 +982,7 @@
|
||||
|
||||
<string name="devicemsg_self_deleted">Usunięto czat „Zapisane wiadomości”.\n\nℹ️ Aby ponownie użyć funkcji „Zapisane wiadomości”, utwórz nowy czat ze sobą.</string>
|
||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
||||
<string name="devicemsg_storage_exceeding">⚠️ Limit pamięci u twojego dostawcy wkrótce zostanie przekroczony, wykorzystano już %1$s%%.\n\nMożesz nie być w stanie otrzymywać wiadomości, gdy pamięć jest pełna.\n\n👉 Sprawdzić, czy możesz usunąć stare dane w interfejsie internetowym dostawcy i rozważyć włączenie opcji \"Ustawienia » Czaty i media » Usuwanie starych wiadomości\". W dowolnym momencie możesz sprawdzić swoje bieżące wykorzystanie pamięci w \"Ustawienia » Łączność\".</string>
|
||||
<string name="devicemsg_storage_exceeding">⚠️ Limit pamięci u twojego dostawcy wkrótce zostanie przekroczony, wykorzystano już %1$s%%.\n\nMożesz nie być w stanie otrzymywać wiadomości, gdy pamięć jest pełna.\n\n👉 Sprawdzić, czy możesz usunąć stare dane w interfejsie internetowym dostawcy i rozważyć włączenie opcji \"Ustawienia » Czaty » Usuwanie starych wiadomości\". W dowolnym momencie możesz sprawdzić swoje bieżące wykorzystanie pamięci w \"Ustawienia » Łączność\".</string>
|
||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||
<string name="devicemsg_bad_time">⚠️ Data lub godzina urządzenia wydaje się być niedokładna (%1$s).\n\nDostosuj zegar ⏰🔧, aby upewnić się, że wiadomości są prawidłowo odbierane.</string>
|
||||
<string name="devicemsg_update_reminder">⚠️ Twoja wersja Delta Chat może być nieaktualna.\n\nMoże to powodować problemy, ponieważ Twoi partnerzy czatu korzystają z nowszych wersji, a Ty nie masz najnowszych funkcji 😳\nSprawdź aktualizacje na stronie https://get.delta.chat lub w sklepie z aplikacjami.</string>
|
||||
@@ -1027,6 +1036,7 @@
|
||||
<string name="secure_join_replies">Użytkownik %1$s odpowiedział, czekając na dodanie do grupy…</string>
|
||||
<string name="secure_join_wait">Ustanawiam połączenie, proszę czekać…</string>
|
||||
<string name="contact_verified">Kontakt %1$s zweryfikowany.</string>
|
||||
<string name="contact_blocked">Zablokowano kontakt</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Kontakt zweryfikowany przez %1$s</string>
|
||||
<string name="verified_by_you">Kontakt zweryfikowany przez ciebie</string>
|
||||
@@ -1112,8 +1122,8 @@
|
||||
<string name="name_desktop">Nazwa</string>
|
||||
<string name="select_group_image_desktop">Wybierz obraz grupy</string>
|
||||
<string name="export_backup_desktop">Eksport kopii zapasowej</string>
|
||||
<string name="message_detail_sent_desktop">wysłane</string>
|
||||
<string name="message_detail_received_desktop">odebrane</string>
|
||||
<string name="message_detail_sent_desktop">Wysłana</string>
|
||||
<string name="message_detail_received_desktop">Odebrana</string>
|
||||
<string name="menu.view.developer.open.log.folder">Otwórz folder dziennika</string>
|
||||
<string name="menu.view.developer.open.current.log.file">Otwórz bieżący plik dziennika</string>
|
||||
<string name="explain_desktop_minimized_disabled_tray_pref" tools:ignore="TypographyDashes">Ikona w zasobniku nie może być wyłączona, ponieważ Delta Chat został uruchomiony z opcją --minimized.</string>
|
||||
|
||||
@@ -1036,6 +1036,7 @@
|
||||
<string name="secure_join_replies">%1$s ответил(а), ожидаем добавления в группу…</string>
|
||||
<string name="secure_join_wait">Устанавливается соединение, пожалуйста, подождите…</string>
|
||||
<string name="contact_verified">%1$s подтверждён.</string>
|
||||
<string name="contact_blocked">Вы заблокировали контакт</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Подтверждён: %1$s</string>
|
||||
<string name="verified_by_you">Подтверждён: Лично</string>
|
||||
|
||||
@@ -996,6 +996,7 @@
|
||||
<string name="secure_join_replies">%1$s u përgjigj, po pritet që të shtohet te grupi…</string>
|
||||
<string name="secure_join_wait">Po vendoset fshehtëzim skaj-më-skaj, ju lutemi, pritni…</string>
|
||||
<string name="contact_verified">%1$s u soll.</string>
|
||||
<string name="contact_blocked">E bllokuat kontaktin</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Sjellë nga %1$s</string>
|
||||
<string name="verified_by_you">Sjellë nga unë</string>
|
||||
|
||||
@@ -5,6 +5,10 @@
|
||||
<string name="ok">OK</string>
|
||||
<string name="cancel">Avbryt</string>
|
||||
<string name="clear_search">Rensa sök</string>
|
||||
<!-- a noun, used on a button, short for "show link" -->
|
||||
<string name="link">Länk</string>
|
||||
<!-- "scan" in the meaning of "scan QR code" -->
|
||||
<string name="scan">Skanna</string>
|
||||
<string name="yes">Ja</string>
|
||||
<string name="no">Nej</string>
|
||||
<string name="select">Välj</string>
|
||||
@@ -24,29 +28,40 @@
|
||||
<string name="join">Anslut</string>
|
||||
<string name="rejoin">Återanslut</string>
|
||||
<string name="delete">Ta bort</string>
|
||||
<string name="delete_for_me">Ta bort för mig</string>
|
||||
<string name="delete_for_everyone">Ta bort för alla</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="update">Uppdatera</string>
|
||||
<string name="emoji">Emoji</string>
|
||||
<string name="attachment">Bilaga</string>
|
||||
<!-- the placeholder will be replaced by the name of the image or file to attach -->
|
||||
<string name="ask_attach">Vill du bifoga \"%1$s\"?</string>
|
||||
<string name="back">Tillbaka</string>
|
||||
<string name="close">Stäng</string>
|
||||
<string name="close_window">Stäng fönster</string>
|
||||
<string name="forward">Vidarebefordra</string>
|
||||
<string name="create">Skapa</string>
|
||||
<string name="reset">Återställ</string>
|
||||
<string name="later">Senare</string>
|
||||
<!-- "Resend" means "Sending the selected message(s) again to the same chat". The string is used in a menu and should be as short as possible. Resending may be needed after failures or to repost old messages to new members. -->
|
||||
<string name="resend">Skicka igen</string>
|
||||
<string name="edited">Redigerad</string>
|
||||
<string name="edit_message">Redigera meddelande</string>
|
||||
<!-- Verb "to archive", as in "put a chat in the archive", not a noun "The Archive". -->
|
||||
<string name="archive">Arkivera</string>
|
||||
<!-- Verb "to unarchive", as in "remove a chat from the archive", opposite of the previous string -->
|
||||
<string name="unarchive">Avarkivera</string>
|
||||
<string name="mute">Tyst</string>
|
||||
<string name="muted">Tystad</string>
|
||||
<string name="ephemeral_messages">Försvinnande meddelanden</string>
|
||||
<string name="ephemeral_messages_hint">Dessa inställningar tillämpas för alla deltagare som använder Delta Chat. De kan dock kopiera, spara och vidarebefordra meddelanden eller använda andra e-postklienter.</string>
|
||||
<string name="save">Spara</string>
|
||||
<string name="chat">Chatt</string>
|
||||
<string name="media">Media</string>
|
||||
<string name="apps_and_media">Appar & Media</string>
|
||||
<string name="profile">Profil</string>
|
||||
<string name="all_profiles">Alla profiler</string>
|
||||
<string name="current_profile">Aktuell profil</string>
|
||||
<string name="main_menu">Huvudmeny</string>
|
||||
<string name="start_chat">Starta chatt</string>
|
||||
<string name="show_full_message">Visa hela meddelandet...</string>
|
||||
@@ -79,6 +94,8 @@
|
||||
<string name="no_app_to_handle_data">Kan inte hitta någon app som hanterar denna typ av data.</string>
|
||||
<string name="no_browser_installed">Ingen webbläsare installerad.</string>
|
||||
<string name="file_not_found">Kunde inte hitta %1$s.</string>
|
||||
<!-- the placeholder will be replaced by the name of a file -->
|
||||
<string name="cannot_save_file">Kan inte spara %1$s.</string>
|
||||
<string name="copied_to_clipboard">Kopierad till urklipp.</string>
|
||||
<string name="contacts_headline">Kontakter</string>
|
||||
<string name="email_address">E-postadress</string>
|
||||
@@ -99,6 +116,16 @@
|
||||
<!-- Refers to the time a contact was last seen. Shown below contact name in the profile. The placeholder will be replaced by a relative point in time as "3 minutes ago" (see https://momentjs.com for more examples and languages)-->
|
||||
<string name="last_seen_relative">Sågs senast %1$s</string>
|
||||
<string name="last_seen_unknown">Sågs senast: Okänt</string>
|
||||
<!-- Shown in call duration. Avoid abbreviations, prefer full words ex. "N seconds". -->
|
||||
<plurals name="n_seconds_ext">
|
||||
<item quantity="one">%d sekund</item>
|
||||
<item quantity="other">%d sekunder</item>
|
||||
</plurals>
|
||||
<!-- Shown in call duration. Avoid abbreviations, prefer full words ex. "N minutes". -->
|
||||
<plurals name="n_minutes_ext">
|
||||
<item quantity="one">%d minut</item>
|
||||
<item quantity="other">%d minuter</item>
|
||||
</plurals>
|
||||
<!-- Shown beside messages that are "N minutes old". Prefer short strings, or well-known abbreviations. -->
|
||||
<plurals name="n_minutes">
|
||||
<item quantity="one">%d min</item>
|
||||
@@ -122,6 +149,10 @@
|
||||
<item quantity="one">%d meddelande</item>
|
||||
<item quantity="other">%d meddelanden</item>
|
||||
</plurals>
|
||||
<plurals name="n_reactions">
|
||||
<item quantity="one">%d reaktion</item>
|
||||
<item quantity="other">%d reaktioner</item>
|
||||
</plurals>
|
||||
<plurals name="n_members">
|
||||
<item quantity="one">%d medlem</item>
|
||||
<item quantity="other">%d medlemmar</item>
|
||||
@@ -135,6 +166,7 @@
|
||||
<item quantity="one">%dmarkerade</item>
|
||||
<item quantity="other">%d markerad</item>
|
||||
</plurals>
|
||||
<string name="selected_colon">Markerat:</string>
|
||||
<string name="self">Jag</string>
|
||||
<string name="draft">Utkast</string>
|
||||
<string name="image">Bild</string>
|
||||
@@ -168,10 +200,25 @@
|
||||
<string name="images_and_videos">Bilder och videor</string>
|
||||
<string name="file">Arkiv</string>
|
||||
<string name="files">Filer</string>
|
||||
<string name="files_attach_hint">Skicka originalfiler och okomprimerade bilder</string>
|
||||
<!-- "Files" here means the "Files Selector App" or "Files Manager App" -->
|
||||
<string name="choose_from_files">Välj från Filer</string>
|
||||
<string name="choose_from_gallery">Välj från Galleri</string>
|
||||
<!-- "App" is used to present "Webxdc App" (https://webxdc.org) in a user friendly way. Please stay close to the original term and keep it short (it is used in menus with few screen space). -->
|
||||
<string name="webxdc_app">App</string>
|
||||
<!-- plural of "App"; used to present "Webxdc App" (https://webxdc.org) in a user friendly way. Please stay close to the original term and keep it short (it is used in menus with few screen space). -->
|
||||
<string name="webxdc_apps">Appar</string>
|
||||
<string name="webxdc_store_url">URL till appväljare</string>
|
||||
<string name="webxdc_store_url_explain">Om angivet, kommer URL:en att användas som appväljare istället för standardväljare</string>
|
||||
<string name="webxdc_draft_hint">Tryck \"Skicka\" för att dela</string>
|
||||
<string name="home">Hem</string>
|
||||
<string name="games">Spel</string>
|
||||
<string name="tools">Verktyg</string>
|
||||
<string name="app_size">Storlek</string>
|
||||
<string name="app_date_published">Publicerad</string>
|
||||
<string name="add_to_chat">Lägg till i chatten</string>
|
||||
<!-- short for "Browse through the App Picker/Store/Catalogue"; could also be translated as "Discover" or "Search" -->
|
||||
<string name="browse">Bläddra</string>
|
||||
<string name="unknown">Okänd</string>
|
||||
|
||||
<string name="green">Grön</string>
|
||||
@@ -199,9 +246,24 @@
|
||||
<string name="new_classic_contact_explain">Manuellt tillagda kontakter kan användas för att sms:a till klassisk e-post och är inte garanterat totalsträckskrypterat.</string>
|
||||
<string name="menu_new_chat">Ny chatt</string>
|
||||
<string name="menu_new_group">Ny grupp</string>
|
||||
<!-- "Chat" is a verb here, "Message to" would also fit. the string might be used in the "New Chat" screen above the contact list -->
|
||||
<string name="chat_with">Chatta med...</string>
|
||||
<string name="clone_chat">Klona chatt</string>
|
||||
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
|
||||
<string name="channel">Kanal</string>
|
||||
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
|
||||
<string name="channels">Kanaler</string>
|
||||
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
|
||||
<string name="new_channel">Ny kanal</string>
|
||||
<!-- deprecated -->
|
||||
<string name="add_recipients">Lägg till mottagare</string>
|
||||
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
|
||||
<string name="channel_name">Kanalnamn</string>
|
||||
<string name="email">E-post</string>
|
||||
<!-- "New" as in "Create New Email"; shown together with "New Group" and "New Channel" -->
|
||||
<string name="new_email">Ny e-post</string>
|
||||
<!-- the "Subject" of an email, use the term common in classic email apps -->
|
||||
<string name="subject">Ämne</string>
|
||||
<string name="menu_send">Skicka</string>
|
||||
<string name="menu_toggle_keyboard">Byt emoji-tangentbord</string>
|
||||
<string name="menu_edit_group">Redigera grupp</string>
|
||||
@@ -211,6 +273,7 @@
|
||||
<string name="menu_unarchive_chat">Avarkivera chatt</string>
|
||||
<string name="menu_add_attachment">Lägg till bilaga</string>
|
||||
<string name="menu_leave_group">Lämna grupp</string>
|
||||
<string name="menu_leave_channel">Lämna kanalen</string>
|
||||
<string name="menu_delete_chat">Ta bort chatt</string>
|
||||
<!-- Command to delete all messages in a chat. The chat itself will not be deleted but will be empty afterwards, so make sure to be different from "Delete Chat" here. "Clear" is a verb here, "Empty Chat" would also be fine (eg. in German "Chat leeren") -->
|
||||
<string name="clear_chat">Rensa chatt</string>
|
||||
@@ -219,6 +282,7 @@
|
||||
<string name="menu_message_details">Meddelandedetaljer</string>
|
||||
<string name="menu_copy_to_clipboard">Kopiera till urklipp</string>
|
||||
<string name="share_invite_link">Dela inbjudningslänk</string>
|
||||
<string name="share_invite_link_explain">Vem som helst med den här länken kan se din profil och börja chatta med dig. Dela den bara med personer som du litar på.</string>
|
||||
<string name="invite_friends">Bjud in vänner</string>
|
||||
<!-- %1$s is replaced by the user's invitation link ("https://i.delta.chat/...") -->
|
||||
<string name="invite_friends_text">Kontakta mig på Delta Chat:\n%1$s</string>
|
||||
@@ -236,6 +300,7 @@
|
||||
<string name="menu_export_attachment">Exportera bilaga</string>
|
||||
<string name="menu_export_attachments">Exportera bilaga</string>
|
||||
<string name="menu_all_media">All media</string>
|
||||
<string name="all_apps_and_media">Alla appar & media</string>
|
||||
<!-- Command to jump to the original message corresponding to a gallery image or document -->
|
||||
<string name="show_in_chat">Visa i chatten</string>
|
||||
<string name="show_app_in_chat">Visa app i chatt</string>
|
||||
@@ -257,6 +322,10 @@
|
||||
<string name="select_chat">Välj chatt</string>
|
||||
<string name="select_more">Välj flera</string>
|
||||
<string name="menu_edit_name">Redigera namn</string>
|
||||
<!-- The placeholder will be replaced by the name the contact gave themself -->
|
||||
<string name="edit_name_explain">Ange ett chattnamn som kommer att visas för dig istället för \"%1$s\". Lämnas tomt om du vill använda kontaktens valda namn.</string>
|
||||
<!-- The placeholder will be replaced by the name the contact gave themself -->
|
||||
<string name="edit_name_placeholder">Chattnamn för \"%1$s\"</string>
|
||||
<string name="menu_settings">Inställningar</string>
|
||||
<string name="menu_advanced">Avancerat</string>
|
||||
<string name="menu_view_profile">Visa profil</string>
|
||||
@@ -266,6 +335,7 @@
|
||||
<string name="menu_more_options">Mer alternativ</string>
|
||||
<string name="menu_learn_spelling">Lär stavning</string>
|
||||
<string name="jump_to_message">Hoppa till meddelande</string>
|
||||
<string name="jump_to_original_message">Hoppa till ursprungligt meddelande</string>
|
||||
<string name="copy_json">Kopiera JSON</string>
|
||||
<string name="replace_draft">Ersätt utkast</string>
|
||||
<string name="title_share_location">Dela plats med alla gruppmedlemmar</string>
|
||||
@@ -288,6 +358,8 @@
|
||||
<!-- Menu item beside an app/chat that adds an icon to the system's home screen. If the user taps that icon, the app/chat is opened directly. -->
|
||||
<string name="add_to_home_screen">Lägg till på hemskärmen</string>
|
||||
<string name="donate">Donera</string>
|
||||
<string name="donate_device_msg">❤️ Det verkar som att du gillar Delta Chat!\n\nVänligen överväg att donera för att hjälpa till att säkerställa att Delta Chat förblir gratis för alla.\n\nÄven om Delta Chat är gratis att använda och öppen källkod, kostar utvecklingen pengar. Hjälp oss att hålla Delta Chat oberoende och göra det ännu bättre i framtiden.\n\nhttps://delta.chat/donate</string>
|
||||
|
||||
<string name="mute_for_one_hour">Tysta 1 timma</string>
|
||||
<string name="mute_for_eight_hours">Tysta 8 timmar</string>
|
||||
<string name="mute_for_one_day">Tysta 1 dag</string>
|
||||
@@ -306,6 +378,29 @@
|
||||
</plurals>
|
||||
<string name="file_saved_to">Filen är sparad i \"%1$s\".</string>
|
||||
|
||||
<!-- the action "to call someone", used as a tooltip for the "phone" icon. not: "the call" -->
|
||||
<string name="start_call">Ring upp</string>
|
||||
<!-- the action "to answer" or to "accept" or to "pick up" a call. not: "the answer" -->
|
||||
<string name="answer_call">Svara</string>
|
||||
<!-- the action "to decline" a call, not: "the decline" -->
|
||||
<string name="end_call">Avböj</string>
|
||||
<string name="outgoing_call">Utgående samtal</string>
|
||||
<string name="incoming_call">Inkommande samtal</string>
|
||||
<string name="declined_call">Nekade samtal</string>
|
||||
<string name="canceled_call">Avbrutna samtal</string>
|
||||
<string name="missed_call">Missade samtal</string>
|
||||
<!-- the first placeholder will be replaced by a date, the second placeholder by duration, example: "Thu, 08:12 pm, 2 minutes" -->
|
||||
<string name="call_date_and_duration">%1$s, %2$s</string>
|
||||
|
||||
<!-- get confirmations -->
|
||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||
<string name="ask_leave_group">Vill du verkligen lämna?</string>
|
||||
<plurals name="ask_delete_chat">
|
||||
<item quantity="one">Vill du ta bort %d chatt?</item>
|
||||
<item quantity="other">Vill du ta bort %d chattar?</item>
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Vill du ta bort chatten\"%1$s\"?</string>
|
||||
<string name="ask_delete_message">Vill du ta bort detta meddelande?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="one">Vill du ta bort %d meddelande?</item>
|
||||
<item quantity="other">Vill du ta bort %d meddelanden?</item>
|
||||
@@ -320,6 +415,8 @@
|
||||
<string name="ask_start_chat_with">Chatta med %1$s ?</string>
|
||||
<!-- %1$s is replaced by a comma-separated list of names -->
|
||||
<string name="ask_remove_members">Ta bort %1$s från gruppen?</string>
|
||||
<!-- %1$s is replaced by a comma-separated list of names -->
|
||||
<string name="ask_remove_from_channel">Vill du ta bort %1$s från kanalen?</string>
|
||||
<string name="open_url_confirmation">Vill du öppna denna länk?</string>
|
||||
|
||||
|
||||
@@ -347,6 +444,8 @@
|
||||
</plurals>
|
||||
<!-- The placeholder will be replaced by the name of the recipient in a one-to-one chat. -->
|
||||
<string name="chat_new_one_to_one_hint">Skicka ett meddelande till %1$s.</string>
|
||||
<!-- consider keeping the term "channel" as in WhatsApp or Telegram -->
|
||||
<string name="chat_new_channel_hint">Kanaler är ett en-till-många-verktyg för att skicka ut dina meddelanden.</string>
|
||||
<string name="chat_new_group_hint">Komponera det första meddelandet, så att andra kan svara inom denna grupp.\n\n• Det är okej om inte alla medlemmar använder Delta Chat.\n\n• Det kan ta en stund innan det första meddelandet levereras.</string>
|
||||
<string name="chat_record_slide_to_cancel">Svep för att avbryta</string>
|
||||
<string name="chat_record_explain">Tryck och håll ner för att spela in ett röstmeddelande, släpp för att skicka.</string>
|
||||
@@ -356,6 +455,7 @@
|
||||
<string name="chat_input_placeholder">Meddelande</string>
|
||||
<string name="chat_archived_label">Arkiverat</string>
|
||||
<string name="chat_request_label">Efterfråga</string>
|
||||
<string name="chat_request_label_explain">Inkludera förfrågningar i räknare och meddelanden</string>
|
||||
<string name="chat_no_messages">Inga meddelanden.</string>
|
||||
<string name="chat_self_talk_subtitle">Meddelanden jag skickat till mig själv</string>
|
||||
<string name="archive_empty_hint">Arkiverde chattar kommer att visas här.</string>
|
||||
@@ -384,6 +484,9 @@
|
||||
<string name="send_file_to">Skicka \"%1$s\" till...</string>
|
||||
<!-- title shown above a list contacts where one should be selected (eg. when a webxdc attempts to send a message to a chat) -->
|
||||
<string name="send_message_to">Skicka meddelande till...</string>
|
||||
<string name="enable_realtime">Realtidsappar</string>
|
||||
<string name="enable_realtime_explain">Aktivera realtidsanslutningar för appar som är kopplade till chattar. Om detta är aktiverat kan chattpartners kanske få reda på din IP-adress när du startar en app.</string>
|
||||
|
||||
<!-- map -->
|
||||
<string name="filter_map_on_time">Visa platser inom tidsramen</string>
|
||||
<string name="show_location_traces">Visa spår</string>
|
||||
@@ -406,6 +509,10 @@
|
||||
<string name="search_files">Sök filer</string>
|
||||
<string name="search_explain">Sök efter chattar, kontakter och meddelanden</string>
|
||||
<string name="search_no_result_for_x">Inga resultat hittades för \" %s \"</string>
|
||||
<!-- Adjective, as in "Show Unread Messages" -->
|
||||
<string name="search_unread">Olästa</string>
|
||||
|
||||
|
||||
<!-- create/edit groups, contact/group profile -->
|
||||
<string name="group_name">Gruppnamn</string>
|
||||
<string name="group_avatar">Gruppbild</string>
|
||||
@@ -417,6 +524,8 @@
|
||||
<string name="group_self_not_in_group">Du måste vara medlem i gruppen för att utföra denna åtgärd.</string>
|
||||
<string name="profile_encryption">Kryptering</string>
|
||||
<string name="profile_shared_chats">Delade chattar</string>
|
||||
<!-- Separator between the list of actual members and past members -->
|
||||
<string name="past_members">Tidigare medlemmar</string>
|
||||
<string name="tab_contact">Kontakt</string>
|
||||
<string name="tab_group">Grupp</string>
|
||||
<string name="tab_gallery">Galleri</string>
|
||||
@@ -430,6 +539,7 @@
|
||||
<string name="tab_audio_empty_hint">Ljudfiler och röstmeddelanden delade i denna chatt kommer att visas här.</string>
|
||||
<string name="tab_webxdc_empty_hint">Appar delade i denna chatt kommer att visas här.</string>
|
||||
<string name="tab_all_media_empty_hint">Media delad i någon chatt kommer att visas här.</string>
|
||||
<string name="all_files_empty_hint">Dokument och andra filer som bifogas en chatt visas här.</string>
|
||||
<string name="all_apps_empty_hint">Appar som tas emot eller skickas i en chatt visas här.</string>
|
||||
<string name="media_preview">Förhandsvisning av media</string>
|
||||
<!-- option to show images in the gallery with the correct width/height aspect (instead of square); other gallery apps may be a source of inspiration for translation :) -->
|
||||
@@ -451,6 +561,7 @@
|
||||
<string name="multidevice_receiver_title">Lägg till som andra enhet</string>
|
||||
<string name="multidevice_open_settings_on_other_device">På den första enheten går du till \"Inställningar / Lägg till en andra enhet\" och skannar koden som visas där</string>
|
||||
<string name="multidevice_receiver_scanning_ask">Vill du kopiera profilen från den andra enheten till den här enheten?</string>
|
||||
<string name="multidevice_receiver_needs_update">Profilen du vill importera är från en nyare version av Delta Chat. \n\nFör att fortsätta konfigurera den andra enheten måste du uppdatera den här enheten till den senaste versionen av Delta Chat.</string>
|
||||
<string name="multidevice_abort">Vill du avbryta konfigurationen av den andra enheten?</string>
|
||||
<string name="multidevice_abort_will_invalidate_copied_qr">Detta kommer att ogiltigförklara QR-koden som kopierats till urklipp.</string>
|
||||
<string name="multidevice_transfer_done_devicemsg">ℹ️ Profilen överförd till din andra enhet.</string>
|
||||
@@ -515,6 +626,7 @@
|
||||
<string name="welcome_chat_over_email">Säker decentraliserad chatt</string>
|
||||
<string name="scan_invitation_code">Skanna inbjudningskod</string>
|
||||
<string name="login_title">Logga in</string>
|
||||
<string name="login_advanced_hint">Denna inloggning är för avancerade användare:\n\n- Använd inte en adress som du använder i en annan app.\n\n- Klassisk e-postserver tillåter chattar utan totalsträckskryptering, markerad med en e-postikon.</string>
|
||||
<string name="login_inbox">Inkorg</string>
|
||||
<string name="login_imap_login">IMAP inloggningsnamn</string>
|
||||
<string name="login_imap_server">IMAP server</string>
|
||||
@@ -526,6 +638,18 @@
|
||||
<string name="login_smtp_server">SMTP server</string>
|
||||
<string name="login_smtp_port">SMTP port</string>
|
||||
<string name="login_smtp_security">SMTP säkerhet</string>
|
||||
<!-- the word "Proxy" might be left untranslated unless the destination language has a well-known term for a "Proxy Server", acting intermediary between the app and the server -->
|
||||
<string name="proxy_settings">Proxy</string>
|
||||
<string name="proxy_use_proxy">Använd proxy</string>
|
||||
<string name="proxy_add">Lägg till proxy</string>
|
||||
<string name="proxy_add_explain">Proxytyper som stöds: HTTP(S), SOCKS5 och Shadowsocks.</string>
|
||||
<string name="proxy_add_url_hint">Ange proxylänk här</string>
|
||||
<string name="proxy_invalid">Ogiltig proxy eller stöd saknas</string>
|
||||
<string name="proxy_list_header">Sparade proxyer</string>
|
||||
<string name="proxy_delete">Ta bort proxy</string>
|
||||
<string name="proxy_delete_explain">Vill du verkligen ta bort \"%1$s\"?</string>
|
||||
<string name="proxy_use_proxy_confirm">Vill du använda proxyn \"%1$s\"?</string>
|
||||
<string name="proxy_share_explain">Dina vänner kan lägga till denna proxy genom att skanna QR-koden.</string>
|
||||
<string name="login_certificate_checks">Certifikatkontroller</string>
|
||||
<string name="login_error_mail">Ange en giltig e-postadress</string>
|
||||
<string name="login_error_server">Ange en giltig server/IP-adress</string>
|
||||
|
||||
@@ -1002,6 +1002,7 @@
|
||||
<string name="secure_join_replies">%1$s yanıtladı; gruba eklenmesi bekleniyor…</string>
|
||||
<string name="secure_join_wait">Bağlantı kuruluyor, lütfen bekleyin…</string>
|
||||
<string name="contact_verified">%1$s tanıtıldı.</string>
|
||||
<string name="contact_blocked">Kişiyi engellediniz</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">%1$s tarafından tanıtıldı</string>
|
||||
<string name="verified_by_you">Benim tarafımdan tanıtıldı</string>
|
||||
|
||||
@@ -420,18 +420,18 @@
|
||||
<!-- confirmation for leaving groups or channels. If a subject is needed, "Are you sure you want to leave the chat?" would work as well -->
|
||||
<string name="ask_leave_group">Ви впевнені, що хочете піти?</string>
|
||||
<plurals name="ask_delete_chat">
|
||||
<item quantity="one">¿Видалити %d чат на всіх Ваших пристроях?</item>
|
||||
<item quantity="few">¿Видалити %d чати на всіх Ваших пристроях?</item>
|
||||
<item quantity="many">¿Видалити %d чатів на всіх Ваших пристроях?</item>
|
||||
<item quantity="other">¿Видалити %d чатів на всіх Ваших пристроях?</item>
|
||||
<item quantity="one">Видалити %d чат?</item>
|
||||
<item quantity="few">Видалити %d чати?</item>
|
||||
<item quantity="many">Видалити %d чатів?</item>
|
||||
<item quantity="other">Видалити %d чатів?</item>
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Видалити чат \"%1$s\" на всіх ваших пристроях?</string>
|
||||
<string name="ask_delete_message">Видалити повідомлення на всіх ваших пристроях?</string>
|
||||
<string name="ask_delete_message">Видалити це повідомлення?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="one">¿Видалити %d повідомлення на всіх Ваших пристроях?</item>
|
||||
<item quantity="few">¿Видалити %d повідомлення на всіх Ваших пристроях?</item>
|
||||
<item quantity="many">¿Видалити %d повідомлень на всіх Ваших пристроях?</item>
|
||||
<item quantity="other">¿Видалити %d повідомлень на всіх Ваших пристроях?</item>
|
||||
<item quantity="one">Видалити %d повідомлення?</item>
|
||||
<item quantity="few">Видалити %d повідомлення?</item>
|
||||
<item quantity="many">Видалити %d повідомлень?</item>
|
||||
<item quantity="other">Видалити %d повідомлень?</item>
|
||||
</plurals>
|
||||
<string name="ask_forward">Переслати повідомлення %1$s?</string>
|
||||
<string name="ask_forward_multiple">Переслати повідомлення в %1$d?</string>
|
||||
@@ -439,7 +439,7 @@
|
||||
<string name="ask_block_contact">Заблокувати цей контакт?\n\nПрямі повідомлення або групи, створені заблокованими контактами, не відображатимуться.\n\nІнші групи із заблокованими контактами все одно показуватимуть свої повідомлення.</string>
|
||||
<string name="ask_unblock_contact">Розблокувати цей контакт?</string>
|
||||
<string name="ask_delete_contacts">Видалити контакти?\n\nКонтакти з поточними чатами неможливо видалити остаточно.</string>
|
||||
<string name="ask_delete_contact">Видалити %1$s?\n\nКонтакти з поточними чатами не можна видалити назавжди.</string>
|
||||
<string name="ask_delete_contact">Видалити контакт %1$s?\n\nКонтакти з поточними чатами не можна видалити назавжди.</string>
|
||||
<string name="ask_start_chat_with">Створити чат з %1$s?</string>
|
||||
<!-- %1$s is replaced by a comma-separated list of names -->
|
||||
<string name="ask_remove_members">Видалити %1$s із групи?</string>
|
||||
@@ -593,7 +593,7 @@
|
||||
<!-- Shown inside a "QR code card" with very limited space; please formulate the text as short as possible therefore. The placeholder will be replaced by the profile name eg. "Scan to set up second device for Alice" -->
|
||||
<string name="multidevice_qr_subtitle">Скануйте, щоб налаштувати другий пристрій %1$s</string>
|
||||
<string name="multidevice_receiver_title">Додати як другий пристрій</string>
|
||||
<string name="multidevice_open_settings_on_other_device">На першому пристрої перейдіть до «Налаштування / Додати другий пристрій» і відскануйте показаний там код</string>
|
||||
<string name="multidevice_open_settings_on_other_device">На першому пристрої запустіть Delta Chat, перейдіть до «Налаштування / Додати другий пристрій» і відскануйте зображений код</string>
|
||||
<string name="multidevice_receiver_scanning_ask">Скопіювати профіль з іншого пристрою на цей?</string>
|
||||
<string name="multidevice_receiver_needs_update">Профіль, який ви хочете імпортувати, належить до новішої версії Delta Chat.\n\nЩоб продовжити налаштування другого пристрою, будь ласка, оновіть його до останньої версії Delta Chat.</string>
|
||||
<string name="multidevice_abort">Скасувати налаштування другого пристрою?</string>
|
||||
@@ -636,7 +636,7 @@
|
||||
<!-- Secondary button on the welcome screen, allows to "Add as Second Device", "Restore from Backup" -->
|
||||
<string name="onboarding_alternative_logins">У мене вже є профіль</string>
|
||||
<!-- This is a button and a title, allowing to use existing, classic email, setting ports, passwords and so on -->
|
||||
<string name="manual_account_setup_option">Транспорт через класичну електронну пошту</string>
|
||||
<string name="manual_account_setup_option">Використовувати класичну пошту як транспортний сервер</string>
|
||||
<!-- Instant onboarding title (there is not more to do than to set name and avatar) -->
|
||||
<string name="instant_onboarding_title">Ваш профіль</string>
|
||||
<!-- The placeholder will be replaced by the default onboarding server -->
|
||||
@@ -686,7 +686,7 @@
|
||||
<string name="proxy_share_explain">Ваші друзі можуть додати цей проксі, відсканувавши QR-код.</string>
|
||||
<string name="proxy_share_link">Поділитися посиланням</string>
|
||||
<string name="proxy_enabled">Проксі увімкнено</string>
|
||||
<string name="proxy_enabled_hint">Ви використовуєте проксі-сервер. Якщо у вас проблеми з підключенням, спробуйте інший проксі.</string>
|
||||
<string name="proxy_enabled_hint">Ви використовуєте проксі-сервер. Якщо у вас проблеми зі зʼєднанням, спробуйте інший проксі.</string>
|
||||
<!-- "Relay" refers to the relay servers used; please chose a common term in your language, no need to be literal. If in doubt, stay with "Relay" -->
|
||||
<string name="transports">Транспортні сервери</string>
|
||||
<string name="add_transport">Додати транспортний сервер</string>
|
||||
@@ -705,7 +705,7 @@
|
||||
<string name="login_error_required_fields">Вкажіть дійсну адресу електронної пошти та пароль</string>
|
||||
<string name="import_backup_title">Відновити з резервної копії</string>
|
||||
<string name="import_backup_ask">Знайдена резервна копія \"%1$s\".\n\nВідновити з неї всі дані й параметри?</string>
|
||||
<string name="import_backup_no_backup_found">Резервних копій не знайдено.\n\nПомістіть резервну копію в папку \"%1$s\" та спробуйте знову запустити відновлення.</string>
|
||||
<string name="import_backup_no_backup_found">Жодної резервної копії не знайдено. \n\nПомістіть резервну копію в теку \"%1$s\" та спробуйте знову.</string>
|
||||
<!-- %1$s will be replaced by the failing address -->
|
||||
<string name="login_error_cannot_login">Не вдалося увійти як \"%1$s\". Будь ласка, перевірте правильність адреси електронної пошти та паролю.</string>
|
||||
<!-- TLS certificate checks -->
|
||||
@@ -812,7 +812,7 @@
|
||||
<string name="pref_imap_folder_warn_disable_defaults">Якщо ви змінюєте цей параметр, переконайтеся, що Ваш сервер та інші Ваші клієнти налаштовані відповідним чином.\n\nІнакше щось може взагалі не працювати.</string>
|
||||
<!-- No need to be literal here, you can also use "Use Multiple Devices", "Support Multiple Devices" or other fitting terms. However, it should fit to the wording or your language at https://delta.chat/help -->
|
||||
<string name="pref_multidevice">Режим роботи з декількома пристроями</string>
|
||||
<string name="pref_multidevice_explain">Синхронізуйте свій повідомлення з іншими пристроями. Автоматично вмикається після додавання другого пристрою</string>
|
||||
<string name="pref_multidevice_explain">Синхронізуйте свої повідомлення з іншими пристроями. Автоматично вмикається після додавання іншими пристроями</string>
|
||||
<string name="pref_multidevice_change_warn">Режим декількох пристроїв має бути увімкнений, якщо ви використовуєте один і той самий профіль на декількох пристроях. Вимикайте цей параметр, лише якщо ви видалили цей профіль з усіх інших пристроїв.\n\nВимкнення режиму декількох пристроїв під час використання профілю на декількох пристроях призведе до пропусків повідомлення та інших проблем.</string>
|
||||
<string name="pref_auto_folder_moves">Автоматично пересувати до папки DeltaChat</string>
|
||||
<string name="pref_only_fetch_mvbox_title">Збирати лише з теки DeltaChat.</string>
|
||||
@@ -847,7 +847,13 @@
|
||||
<string name="disable_imap_idle">Вимкнути IMAP IDLE</string>
|
||||
<string name="disable_imap_idle_explain">Не використовувати розширення IMAP IDLE навіть якщо сервер підтримує його. Увімкнення цієї опції затримає отримання повідомлень, вмикайте її лише для тестування.</string>
|
||||
<string name="send_stats_to_devs">Надсилати статистику розробникам Delta Chat</string>
|
||||
<string name="stats_msg_body">У вкладенні міститься анонімна статистика використання, яка допоможе нам покращити Delta Chat. Дякуємо!</string>
|
||||
<string name="stats_device_message">Хочете допомогти покращити Delta Chat та підтримати дослідження, надсилаючи щотижневу анонімну статистику використання?\n\n 👉 Тисніть сюди… 👈</string>
|
||||
<string name="stats_confirmation_dialog">Хочете допомогти покращити Delta Chat та підтримати дослідження, надсилаючи щотижневу анонімну статистику використання?</string>
|
||||
<string name="stats_thanks">Дякуємо! Ви завжди маєте змогу це вимкнути у розділі \"Налаштування > Додатково\"\n\n Чи маєте Ви 5 хвилин для участі в науковому дослідженні стосовно безпеки Delta Chat?</string>
|
||||
<string name="stats_disable_dialog">Надсилання статистики вже активне.\n\n Ви хочете її припинити?</string>
|
||||
<string name="disable">Припинити</string>
|
||||
<string name="stats_keep_sending">Продовжити</string>
|
||||
<string name="stats_msg_body">У вкладенні міститься анонімна статистика використання, яка допомагає нам покращити Delta Chat. Дивіться https://delta.чат/help#statssending для отримання додаткової інформації. Дякуємо!</string>
|
||||
|
||||
<!-- Emoji picker and categories -->
|
||||
<string name="emoji_search_results">Результати пошуку</string>
|
||||
@@ -878,7 +884,7 @@
|
||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||
<string name="autodel_device_ask">Ви хочете видалити %1$d повідомлень зараз і всі нові повідомлення \"%2$s\" у майбутньому?\n\n- Це включає всі медіа\n\n- Повідомлення буде видалено незалежно від того, чи були вони переглянуті чи ні\n\n- \"Збережені повідомлення\" буде пропущено при локальному видаленні</string>
|
||||
<!-- %1$d will be replaced by the number of messages, you can assume plural/lots here. %2$s will be replaced by a timespan option. -->
|
||||
<string name="autodel_server_ask">Ви хочете видалити %1$d повідмолень зараз і всі нові повідомлення \"%2$s\" в майбутньому?\n\n⚠️ Сюди входять електронні листи, медіа та \"Збережені повідомлення\" у всіх папках сервера\n\n⚠️ Не використовуйте цю функцію, якщо ви хочете зберегти дані на сервері або якщо ви також використовуєте класичні поштові клієнти</string>
|
||||
<string name="autodel_server_ask">Ви хочете видалити %1$d повідмолень зараз і всі нові повідомлення \"%2$s\" в майбутньому?\n\n⚠️ Сюди входять електронні листи, медіа та \"Збережені повідомлення\" у всіх теках сервера\n\n⚠️ Не використовуйте цю функцію, якщо ви хочете зберегти дані на сервері або якщо ви також використовуєте класичні поштові клієнти</string>
|
||||
<!-- shown below enabled autodel_server-option, should be a summary of autodel_server_ask and remind about the impact -->
|
||||
<string name="autodel_server_enabled_hint">Сюди входять електронні листи, медіафайли та \"Збережені повідомлення\" у всіх папках сервера. Не використовуйте цю функцію, якщо ви хочете зберігати дані на сервері або якщо ви використовуєте класичні поштові клієнти</string>
|
||||
<string name="autodel_server_warn_multi_device_title">Увімкнути одномоментне видалення</string>
|
||||
@@ -976,7 +982,7 @@
|
||||
|
||||
<string name="devicemsg_self_deleted">Ви видалили чат \"Збережені повідомлення\".\n\nℹ️ Аби використовувати функцію \"Збережені повідомлення\" знову, створіть новий чат самі із собою.</string>
|
||||
<!-- %1$s will be replaced by the amount of storage already used, sth. as '500 MB'. If you want to use a percentage sign, type in two of them, eg. %1$s %% -->
|
||||
<string name="devicemsg_storage_exceeding">⚠️ Сховище вашого провайдера електронної пошти майже заповнено, уже використовується %1$s%%.\n\nМожливо, Ви не зможете отримувати повідомлення, коли сховище буде заповнене.\n\n👉 Перевірте, чи можна видалити старі дані у веб-інтерфейсі провайдера та ввімкніть \"Налаштування / Видалити старі повідомлення\". Ви можете будь-коли перевірити своє поточне використання сховища в \"Налаштування / Підключення\". </string>
|
||||
<string name="devicemsg_storage_exceeding">⚠️ Сховище вашого провайдера електронної пошти майже заповнено, уже використовується %1$s%%.\n\nМожливо, Ви не зможете отримувати повідомлення, коли сховище буде заповнене.\n\n👉 Перевірте, чи можна видалити старі дані у веб-інтерфейсі провайдера та ввімкніть \"Налаштування / Видалити старі повідомлення\". Ви можете будь-коли перевірити своє поточне використання сховища в \"Налаштування / Зʼєднання\". </string>
|
||||
<!-- %1%s will be replaced by date and time in some human-readable format -->
|
||||
<string name="devicemsg_bad_time">⚠️ Дата й час на вашому пристрої видаються неточними (%1$s).\n\nНалаштуйте свій годинник ⏰🔧 для правильного отримання повідомлень.</string>
|
||||
<string name="devicemsg_update_reminder">⚠️ Ваша версія Delta Chat може бути застарілою.\n\nЦе може спричинити проблеми, оскільки Ваші співрозмовники в чаті використовують новіші версії, а Вам не вистачає найновіших функцій 😳 \nПеревірте оновлення на https://get.delta.chat або в магазині додатків. </string>
|
||||
@@ -1030,6 +1036,7 @@
|
||||
<string name="secure_join_replies">%1$s відповіли, очікуємо на додавання до групи…</string>
|
||||
<string name="secure_join_wait">Встановлення гарантованого наскрізного шифрування, будь ласка, зачекайте...</string>
|
||||
<string name="contact_verified">%1$s представлено!</string>
|
||||
<string name="contact_blocked">Ви заблокували контакт</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">Представни·ця: %1$s</string>
|
||||
<string name="verified_by_you">Представлено мною</string>
|
||||
@@ -1051,7 +1058,7 @@
|
||||
<string name="notify_name_only">Тільки ім\'я</string>
|
||||
<string name="notify_no_name_or_message">Без імені або повідомлення</string>
|
||||
<string name="notifications_disabled">Сповіщення вимкнено</string>
|
||||
<string name="unreliable_bg_notifications">Увімкніть \"Примусове фонове підключення\" для надійних сповіщень</string>
|
||||
<string name="unreliable_bg_notifications">Увімкніть \"Примусове фонове зʼєднання\" для надійних сповіщень</string>
|
||||
<string name="new_messages">Нові повідомлення</string>
|
||||
<!-- Body text for a generic "New messages" notification. Shown if we do not have more information about a new messages. Note, that the string is also referenced at https://github.com/deltachat/notifiers -->
|
||||
<string name="new_messages_body">У вас нові повідомлення</string>
|
||||
@@ -1115,8 +1122,8 @@
|
||||
<string name="name_desktop">Імʼя</string>
|
||||
<string name="select_group_image_desktop">Вибрати емблему групи</string>
|
||||
<string name="export_backup_desktop">Експорт резервної копії</string>
|
||||
<string name="message_detail_sent_desktop">надіслано</string>
|
||||
<string name="message_detail_received_desktop">отримано</string>
|
||||
<string name="message_detail_sent_desktop">Надіслано</string>
|
||||
<string name="message_detail_received_desktop">Отримано</string>
|
||||
<string name="menu.view.developer.open.log.folder">Відкрити папку журналів</string>
|
||||
<string name="menu.view.developer.open.current.log.file">Відкрити поточний файл журналу</string>
|
||||
<string name="explain_desktop_minimized_disabled_tray_pref" tools:ignore="TypographyDashes">Іконку в треї не можна вимкнути, оскільки Delta Chat було запущено за допомогою параметра --minimized.</string>
|
||||
|
||||
@@ -985,6 +985,7 @@
|
||||
<string name="secure_join_replies">%1$s 已回复,等待被加入群组…</string>
|
||||
<string name="secure_join_wait">正在建立连接,请稍候…</string>
|
||||
<string name="contact_verified">%1$s 已验证。</string>
|
||||
<string name="contact_blocked">您已屏蔽该联系人</string>
|
||||
<!-- Shown in contact profile. The placeholder will be replaced by the name of the contact that introduced the contact. -->
|
||||
<string name="verified_by">验证人 %1$s</string>
|
||||
<string name="verified_by_you">由您验证</string>
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user