mirror of
https://github.com/ArcaneChat/android.git
synced 2026-07-03 14:05:24 +02:00
Merge remote-tracking branch 'upstream/main'
This commit is contained in:
@@ -653,6 +653,14 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getMsgInfo(JNIEnv *env, jobj
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void Java_com_b44t_messenger_DcContext_sendEditRequest(JNIEnv *env, jobject obj, jint msg_id, jstring text)
|
||||
{
|
||||
CHAR_REF(text);
|
||||
dc_send_edit_request(get_dc_context(env, obj), msg_id, textPtr);
|
||||
CHAR_UNREF(text);
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jstring Java_com_b44t_messenger_DcContext_getMsgHtml(JNIEnv *env, jobject obj, jint msg_id)
|
||||
{
|
||||
char* temp = dc_get_msg_html(get_dc_context(env, obj), msg_id);
|
||||
@@ -1658,6 +1666,12 @@ JNIEXPORT jstring Java_com_b44t_messenger_DcMsg_getPOILocation(JNIEnv *env, jobj
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT jboolean Java_com_b44t_messenger_DcMsg_isEdited(JNIEnv *env, jobject obj)
|
||||
{
|
||||
return dc_msg_is_edited(get_dc_msg(env, obj));
|
||||
}
|
||||
|
||||
|
||||
JNIEXPORT void Java_com_b44t_messenger_DcMsg_setFileAndDeduplicate(JNIEnv *env, jobject obj, jstring file, jstring name, jstring filemime)
|
||||
{
|
||||
CHAR_REF(file);
|
||||
|
||||
+1
-1
Submodule jni/deltachat-core-rust updated: 46057af540...1252d38e04
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="cs"><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="#co-je-delta-chat">Co je Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#jak-najít-lidi-k-hovoru">Jak najít lidi k hovoru?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="de"><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="#was-ist-delta-chat">Was ist Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#wie-finde-ich-leute-mit-denen-ich-chatten-kann">Wie finde ich Leute, mit denen ich chatten kann?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="en"><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="#what-is-delta-chat">What is Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#how-can-i-find-people-to-chat-with">How can I find people to chat with?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="es"><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="#qué-es-delta-chat">¿Qué es Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#cómo-puedo-encontrar-personas-con-las-que-chatear">¿Cómo puedo encontrar personas con las que chatear?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="fr"><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="#quest-ce-que-delta-chat-">Qu’est-ce que Delta Chat ?</a>
|
||||
<ul>
|
||||
<li><a href="#comment-puis-je-trouver-des-gens-avec-qui-discuter-">Comment puis-je trouver des gens avec qui discuter ?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="id"><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="#apa-itu-delta-chat">Apa itu Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#bagaimana-saya-bisa-menemukan-orang-untuk-diajak-ngobrol">Bagaimana Saya bisa menemukan orang untuk diajak ngobrol?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="it"><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="#cosè-delta-chat">Cos’è Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#come-posso-trovare-persone-con-cui-messaggiare">Come posso trovare persone con cui messaggiare?</a></li>
|
||||
@@ -874,14 +874,13 @@ se l’intero messaggio è crittografato e firmato correttamente.
|
||||
Ad esempio, le “Firme distaccate” non sono considerate sicure.</p>
|
||||
|
||||
<p>OpenPGP non è insicuro di per sé.
|
||||
I problemi di sicurezza di OpenPGP più discussi pubblicamente
|
||||
in realtà derivano da una cattiva usabilità o da cattive implementazioni di strumenti o app (o entrambi).
|
||||
La maggior parte dei problemi di sicurezza di OpenPGP discussi pubblicamentederivano in realtà da una cattiva usabilità o da cattive implementazioni di strumenti o app (o entrambi).
|
||||
È particolarmente importante distinguere tra OpenPGP, lo standard di crittografia IETF,
|
||||
e GnuPG (GPG), uno strumento da riga di comando che implementa OpenPGP.
|
||||
Molte critiche pubbliche di OpenPGP in realtà discutono di GnuPG che Delta Chat non ha mai utilizzato.
|
||||
Delta Chat utilizza piuttosto l’implementazione OpenPGP Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>,
|
||||
Delta Chat utilizza piuttosto l’implementazione Rust di OpenPGP <a href="https://github.com/rpgp/rpgp">rPGP</a>,
|
||||
disponibile come <a href="https://crates.io/crates/pgp">un pacchetto “pgp” indipendente</a>,
|
||||
e <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">controllato sulla sicurezza nel 2019</a>.</p>
|
||||
e <a href="#security-audits">verificato per la sicurezza nel 2019 e nel 2024</a>.</p>
|
||||
|
||||
<p>Puntiamo, insieme ad altri implementatori di OpenPGP,
|
||||
per migliorare ulteriormente le caratteristiche di sicurezza implementando il
|
||||
@@ -1190,24 +1189,25 @@ Per altri programmi, dovresti essere in grado di trovare una soluzione online.</
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Yes, multiple times.
|
||||
The Delta Chat project continuously undergoes independent security audits and analysis,
|
||||
from most recent to older:</p>
|
||||
<p>Sì, più volte.
|
||||
Il progetto Delta Chat è sottoposto costantemente a verifiche e analisi di sicurezza indipendenti,
|
||||
dal più recente al più vecchio:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>2024 December, an <a href="https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf">NLNET-commissioned Evaluation of
|
||||
rPGP</a> by <a href="https://www.radicallyopensecurity.com/">Radically Open Security</a> took place.
|
||||
<p>Dicembre 2024, un <a href="https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf">Valutazione commissionata da NLNET di
|
||||
rPGP</a> di <a href="https://www.radicallyopensecurity.com/">Radically Open Security</a> ha preso parte.
|
||||
rPGP serves as the end-to-end encyption <a href="https://openpgp.org">OpenPGP</a> engine of Delta Chat.
|
||||
Two advisories were released related to the findings of this audit:</p>
|
||||
Sono stati rilasciati due avvisi relativi ai risultati di questa verifica:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-9rmp-2568-59rv">“Panics on Malformed Untrusted Input”</a> CVE-2024-53856</li>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-4grw-m28r-q285">“Potential Resource Exhaustion when handling Untrusted Messages”</a> CVE-2024-53857</li>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-9rmp-2568-59rv">“Panico per Input non Attendibili e Malformati”</a> CVE-2024-53856</li>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-4grw-m28r-q285">“Potenziale Esaurimento delle Risorse durante la gestione di Messaggi non Attendibili”</a> CVE-2024-53857</li>
|
||||
</ul>
|
||||
|
||||
<p>The issues outlined in these advisories have been fixed and are part of Delta Chat
|
||||
releases on all appstores since December 2024.</p>
|
||||
<p>I problemi descritti in questi avvisi sono stati risolti e fanno
|
||||
parte delle versioni di Delta Chat
|
||||
su tutti gli appstore da Dicembre 2024.</p>
|
||||
</li>
|
||||
<li>
|
||||
<p>Marzo 2024, abbiamo ricevuto un’analisi approfondita della sicurezza dalla Crittografia Applicata
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="nl"><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="#wat-is-delta-chat">Wat is Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#hoe-kan-ik-gesprekspartners-vinden">Hoe kan ik gesprekspartners vinden?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="pl"><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="#czym-jest-delta-chat">Czym jest Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#jak-mogę-znaleźć-ludzi-z-którymi-mogę-czatować">Jak mogę znaleźć ludzi, z którymi mogę czatować?</a></li>
|
||||
@@ -669,7 +669,7 @@ nadal będziesz mógł pisać, ale nie będziesz już powiadamiany o żadnych no
|
||||
|
||||
<p>Tak, Delta Chat korzysta z bezpiecznego podzbioru OpenPGP i wyświetla wskaźnik bezpieczeństwa kłódki na wiadomości tylko wtedy, gdy cała wiadomość jest prawidłowo zaszyfrowana i podpisana. Na przykład „Odłączone podpisy” nie są traktowane jako bezpieczne.</p>
|
||||
|
||||
<p>OpenPGP samo w sobie nie jest niebezpieczne. Większość publicznie omawianych problemów związanych z bezpieczeństwem OpenPGP tak naprawdę wynika ze złej użyteczności lub złej implementacji narzędzi, lub aplikacji (lub obu). Szczególnie ważne jest rozróżnienie pomiędzy OpenPGP, standardem szyfrowania IETF, a GnuPG (GPG), narzędziem wiersza poleceń implementującym OpenPGP. Wiele publicznych komentarzy krytycznych na temat OpenPGP tak naprawdę omawia GnuPG, którego Delta Chat nigdy nie używał. Delta Chat korzysta raczej z implementacji OpenPGP Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>, dostępnej jako <a href="https://crates.io/crates/pgp">niezależny pakiet „pgp”</a> i poddanej <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">audytowi bezpieczeństwa w 2019 roku</a>.</p>
|
||||
<p>OpenPGP samo w sobie nie jest niebezpieczne. Większość publicznie omawianych problemów związanych z bezpieczeństwem OpenPGP tak naprawdę wynika ze złej użyteczności lub złej implementacji narzędzi, lub aplikacji (lub obu). Szczególnie ważne jest rozróżnienie pomiędzy OpenPGP, standardem szyfrowania IETF, a GnuPG (GPG), narzędziem wiersza poleceń implementującym OpenPGP. Wiele publicznych komentarzy krytycznych na temat OpenPGP tak naprawdę omawia GnuPG, którego Delta Chat nigdy nie używał. Delta Chat korzysta raczej z implementacji OpenPGP Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>, dostępnej jako <a href="https://crates.io/crates/pgp">niezależny pakiet „pgp”</a> i poddanej <a href="#security-audits">audytowi bezpieczeństwa w 2019 i 2024 roku</a>.</p>
|
||||
|
||||
<p>Naszym celem, wraz z innymi wdrażającymi OpenPGP, jest dalsza poprawa parametrów bezpieczeństwa poprzez wdrożenie <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-crypto-refresh/">nowego IETF OpenPGP Crypto-Refresh</a>, który na szczęście został przyjęty latem 2023 roku.</p>
|
||||
|
||||
@@ -868,25 +868,20 @@ W przypadku innych programów można znaleźć rozwiązanie online.</p>
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Yes, multiple times.
|
||||
The Delta Chat project continuously undergoes independent security audits and analysis,
|
||||
from most recent to older:</p>
|
||||
<p>Tak, wielokrotnie.
|
||||
Projekt Delta Chat stale przechodzi niezależne audyty bezpieczeństwa i analizy,
|
||||
od najnowszych do najstarszych:</p>
|
||||
|
||||
<p>W grudniu 2024 r. <a href="https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf">NLNET</a> wykonała ocenę rPGP zleconą przez <a href="https://www.radicallyopensecurity.com/">Radically Open Security</a>. rPGP służy jako kompleksowy silnik szyfrowania <a href="https://openpgp.org">OpenPGP</a> w Delta Chat. Wydano dwa ostrzeżenia związane z wynikami tego audytu:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>2024 December, an <a href="https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf">NLNET-commissioned Evaluation of
|
||||
rPGP</a> by <a href="https://www.radicallyopensecurity.com/">Radically Open Security</a> took place.
|
||||
rPGP serves as the end-to-end encyption <a href="https://openpgp.org">OpenPGP</a> engine of Delta Chat.
|
||||
Two advisories were released related to the findings of this audit:</p>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-9rmp-2568-59rv">„Paniki przy nieprawidłowym wprowadzaniu niezaufanych danych wejściowych”</a> CVE-2024-53856</li>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-4grw-m28r-q285">„Potencjalne wyczerpanie zasobów podczas obsługi niezaufanych wiadomości”</a> CVE-2024-53857</li>
|
||||
</ul>
|
||||
|
||||
<ul>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-9rmp-2568-59rv">“Panics on Malformed Untrusted Input”</a> CVE-2024-53856</li>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-4grw-m28r-q285">“Potential Resource Exhaustion when handling Untrusted Messages”</a> CVE-2024-53857</li>
|
||||
</ul>
|
||||
<p>Problemy opisane w tych ostrzeżeniach zostały naprawione i są częścią wydań Delta Chat we wszystkich sklepach z aplikacjami od grudnia 2024 r.</p>
|
||||
|
||||
<p>The issues outlined in these advisories have been fixed and are part of Delta Chat
|
||||
releases on all appstores since December 2024.</p>
|
||||
</li>
|
||||
<ul>
|
||||
<li>
|
||||
<p>W marcu 2024 r. otrzymaliśmy dogłębną analizę bezpieczeństwa od grupy badawczej ds. kryptografii stosowanej w ETH Zuerich i zajęliśmy się wszystkimi poruszonymi kwestiami. Więcej szczegółowych informacji można znaleźć na naszym blogu na temat <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">szyfrowania typu End-to-End z gwarancją Hardening</a> oraz opublikowanym później artykule badawczym <a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>.</p>
|
||||
</li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<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="#como-encontro-as-pessoas-para-conversar">Como encontro as pessoas para conversar?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="ru"><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="#что-такое-delta-chat">Что такое Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#как-мне-найти-людей-для-общения">Как мне найти людей для общения?</a></li>
|
||||
@@ -891,7 +891,7 @@ Autocrypt использует ограниченное и <a href="#openpgp-sec
|
||||
Многие публичные критические замечания по OpenPGP фактически касаются GnuPG, который Delta Chat никогда не использовал.
|
||||
Delta Chat вместо этого использует реализацию OpenPGP на Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>,
|
||||
доступную как <a href="https://crates.io/crates/pgp">независимый пакет “pgp”</a>,
|
||||
и <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">проверенную на безопасность в 2019 году</a>.</p>
|
||||
и <a href="#security-audits">проверенную на безопасность в 2019 и 2024 годах</a>.</p>
|
||||
|
||||
<p>Вместе с другими разработчиками OpenPGP мы стремимся,
|
||||
повысить характеристики безопасности путём реализации
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="sk"><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-je-to-delta-chat">Čo je to Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#ako-nájdem-ľudí-s-ktorými-môžem-chatovať">Ako nájdem ľudí s ktorými môžem chatovať?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="sq"><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="#çështë-delta-chat-i">Ç’është Delta Chat-i?</a>
|
||||
<ul>
|
||||
<li><a href="#si-mund-të-gjej-persona-për-të-biseduar-me-ta">Si mund të gjej persona për të biseduar me ta?</a></li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="uk"><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="#що-таке-delta-chat">Що таке Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#як-мені-знайти-людей-для-спілкування">Як мені знайти людей для спілкування?</a></li>
|
||||
@@ -676,7 +676,10 @@ Autocrypt використовує обмежену і <a href="#openpgp-secure"
|
||||
|
||||
<p>Так, Delta Chat використовує безпечну підмножину OpenPGP і відображає індикатор безпеки у вигляді замка в повідомленні лише тоді, коли все повідомлення належним чином зашифровано і підписано. Наприклад, “Відокремлені підписи” не вважаються безпечними.</p>
|
||||
|
||||
<p>OpenPGP не є небезпечним сам по собі. Більшість публічно обговорюваних проблем безпеки OpenPGP насправді виникають через погане використання або погану реалізацію інструментів або програм (або і те, і інше). Особливо важливо розрізняти OpenPGP, стандарт шифрування IETF, і GnuPG (GPG), інструментом командного рядка, що реалізує OpenPGP. Багато публічних критиків OpenPGP насправді обговорюють GnuPG, який Delta Chat ніколи не використовував. Натомість Delta Chat використовує реалізацію OpenPGP на Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>, доступну як <a href="https://crates.io/crates/pgp">незалежний пакет “pgp”</a>, і <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">пройшов аудит безпеки у 2019 році</a>.</p>
|
||||
<p>OpenPGP сам по собі не є небезпечним. Більшість публічно обговорюваних проблем безпеки OpenPGP насправді виникають через недостатню зручність використання або погану реалізацію інструментів чи програм (або обох).
|
||||
Особливо важливо розрізняти OpenPGP, стандарт шифрування IETF, і GnuPG (GPG), інструмент командного рядка, що реалізує OpenPGP.
|
||||
Багато публічних критиків OpenPGP насправді обговорюють GnuPG, який Delta Chat ніколи не використовував.
|
||||
Delta Chat скоріше використовує реалізацію OpenPGP Rust <a href="https://github.com/rpgp/rpgp">rPGP</a>, доступну як <a href="https://crates.io/crates/pgp">незалежний пакет «pgp»</a> і <a href="#security-audits">перевірку безпеки в 2019 і 2024 роках</a>.</p>
|
||||
|
||||
<p>Ми прагнемо, разом з іншими розробниками OpenPGP, подальше покращення характеристик безпеки шляхом впровадження <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-crypto-refresh/">нового IETF OpenPGP Crypto-Refresh</a> який, на щастя, був прийнятий влітку 2023 року.</p>
|
||||
|
||||
@@ -872,25 +875,19 @@ Look for something like <strong>Start Autocrypt Setup Transfer</strong> in the s
|
||||
|
||||
</h3>
|
||||
|
||||
<p>Yes, multiple times.
|
||||
The Delta Chat project continuously undergoes independent security audits and analysis,
|
||||
from most recent to older:</p>
|
||||
<p>Так, багаторазово. Проект Delta Chat постійно проходить незалежні перевірки та аналіз безпеки, а саме, від останніх і закінчуючи старішими:</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>2024 December, an <a href="https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf">NLNET-commissioned Evaluation of
|
||||
rPGP</a> by <a href="https://www.radicallyopensecurity.com/">Radically Open Security</a> took place.
|
||||
rPGP serves as the end-to-end encyption <a href="https://openpgp.org">OpenPGP</a> engine of Delta Chat.
|
||||
Two advisories were released related to the findings of this audit:</p>
|
||||
|
||||
<ul>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-9rmp-2568-59rv">“Panics on Malformed Untrusted Input”</a> CVE-2024-53856</li>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-4grw-m28r-q285">“Potential Resource Exhaustion when handling Untrusted Messages”</a> CVE-2024-53857</li>
|
||||
</ul>
|
||||
|
||||
<p>The issues outlined in these advisories have been fixed and are part of Delta Chat
|
||||
releases on all appstores since December 2024.</p>
|
||||
<p>2024 грудня відбулася <a href="https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf">оцінка rPGP на замовлення NLNET</a> від <a href="https://www.radicallyopensecurity.com/">Radically Open Security</a>. rPGP слугує рушієм наскрізного шифрування <a href="https://openpgp.org">OpenPGP</a> для Delta Chat. За результатами цього аудиту було випущено дві рекомендації:</p>
|
||||
</li>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-9rmp-2568-59rv">“Паніка через неправильне ненадійне введення”</a> CVE-2024-53856</li>
|
||||
<li><a href="https://github.com/rpgp/rpgp/security/advisories/GHSA-4grw-m28r-q285">“Потенційне виснаження ресурсів під час обробки ненадійних повідомлень”</a> CVE-2024-53857</li>
|
||||
</ul>
|
||||
|
||||
<p>Проблеми, описані в цих рекомендаціях, виправлено, і вони є частиною випусків Delta Chat у всіх магазинах додатків з грудня 2024 року.</p>
|
||||
|
||||
<ul>
|
||||
<li>
|
||||
<p>2024 березня ми отримали глибокий аналіз безпеки від дослідницької групи Applied Cryptography дослідницької групи з прикладної криптографії в ETH Zuerich і вирішили всі порушені питання. Більш детальну інформацію можна знайти в нашому блозі в статті <a href="https://delta.chat/en/2024-03-25-crypto-analysis-securejoin">Hardening Guaranteed End-to-end encryption</a>, а також в дослідженні <a href="https://eprint.iacr.org/2024/918.pdf">Cryptographic Analysis of Delta Chat</a>, опублікованому пізніше.</p>
|
||||
</li>
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<!DOCTYPE html>
|
||||
<html><head><meta charset="UTF-8" /><meta name="viewport" content="initial-scale=1.0" /><link rel="stylesheet" href="../help.css" /></head><body><ul id="top">
|
||||
<html lang="zh_CN"><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="#什么是-delta-chat">什么是 Delta Chat?</a>
|
||||
<ul>
|
||||
<li><a href="#如何找到可以聊天的人">如何找到可以聊天的人?</a></li>
|
||||
@@ -835,15 +835,15 @@ Autocrypt 使用 OpenPGP 标准的有限且<a href="#openpgp-secure">安全子
|
||||
,前提是整个消息都已正确加密和签名。
|
||||
例如,“分离签名”不被视为安全。</p>
|
||||
|
||||
<p>OpenPGP 本身并不不安全。
|
||||
大多数公开讨论的 OpenPGP 安全问题
|
||||
实际上都源于工具或应用的糟糕可用性或糟糕实现(或两者兼而有之)。
|
||||
区分 OpenPGP(IETF 加密标准)
|
||||
和 GnuPG (GPG)(实现 OpenPGP 的命令行工具)尤为重要。
|
||||
许多对 OpenPGP 的公开批评实际上是在讨论 GnuPG,而 Delta Chat 从未使用过 GnuPG。
|
||||
Delta Chat 而是使用 OpenPGP Rust 实现 <a href="https://github.com/rpgp/rpgp">rPGP</a>,
|
||||
作为 <a href="https://crates.io/crates/pgp">独立的“pgp”软件包</a> 提供,
|
||||
并且 <a href="https://delta.chat/assets/blog/2019-first-security-review.pdf">在 2019 年进行了安全审计</a>。</p>
|
||||
<p>OpenPGP is not insecure by itself.
|
||||
Most publically discussed OpenPGP security problems
|
||||
actually stem from bad usability or bad implementations of tools or apps (or both).
|
||||
It is particularly important to distinguish between OpenPGP, the IETF encryption standard,
|
||||
and GnuPG (GPG), a command line tool implementing OpenPGP.
|
||||
Many public critiques of OpenPGP actually discuss GnuPG which Delta Chat has never used.
|
||||
Delta Chat rather uses the OpenPGP Rust implementation <a href="https://github.com/rpgp/rpgp">rPGP</a>,
|
||||
available as <a href="https://crates.io/crates/pgp">an independent “pgp” package</a>,
|
||||
and <a href="#security-audits">security-audited in 2019 and 2024</a>.</p>
|
||||
|
||||
<p>我们的目标是与其他 OpenPGP 实现者一起,
|
||||
通过实施 <a href="https://datatracker.ietf.org/doc/draft-ietf-openpgp-crypto-refresh/">新的 IETF OpenPGP Crypto-Refresh</a>
|
||||
|
||||
@@ -51,8 +51,8 @@ public class DcContext {
|
||||
public final static int DC_QR_FPR_MISMATCH = 220;
|
||||
public final static int DC_QR_FPR_WITHOUT_ADDR = 230;
|
||||
public final static int DC_QR_ACCOUNT = 250;
|
||||
public final static int DC_QR_BACKUP = 251;
|
||||
public final static int DC_QR_BACKUP2 = 252;
|
||||
public final static int DC_QR_BACKUP_TOO_NEW = 255;
|
||||
public final static int DC_QR_WEBRTC = 260;
|
||||
public final static int DC_QR_PROXY = 271;
|
||||
public final static int DC_QR_ADDR = 320;
|
||||
@@ -188,6 +188,7 @@ public class DcContext {
|
||||
public native void blockChat (int chat_id);
|
||||
public native void acceptChat (int chat_id);
|
||||
public DcMsg getMsg (int msg_id) { return new DcMsg(getMsgCPtr(msg_id)); }
|
||||
public native void sendEditRequest (int msg_id, String text);
|
||||
public native String getMsgInfo (int id);
|
||||
public native String getMsgHtml (int msg_id);
|
||||
public native void downloadFullMsg (int msg_id);
|
||||
|
||||
@@ -170,6 +170,7 @@ public class DcMsg {
|
||||
public native String getError ();
|
||||
public native String getOverrideSenderName();
|
||||
public native int getSenderColor();
|
||||
public native boolean isEdited ();
|
||||
|
||||
public String getSenderName(DcContact dcContact) {
|
||||
String overrideName = getOverrideSenderName();
|
||||
|
||||
@@ -195,6 +195,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
private boolean isDefaultSms = true;
|
||||
private boolean isSecurityInitialized = false;
|
||||
private boolean successfulForwardingAttempt = false;
|
||||
private boolean isEditing = false;
|
||||
|
||||
@Override
|
||||
protected void onCreate(Bundle state, boolean ready) {
|
||||
@@ -728,6 +729,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
* @return
|
||||
*/
|
||||
private ListenableFuture<Boolean> initializeDraft() {
|
||||
isEditing = false;
|
||||
final SettableFuture<Boolean> future = new SettableFuture<>();
|
||||
DcMsg draft = dcContext.getDraft(chatId);
|
||||
final String sharedText = RelayUtil.getSharedText(this);
|
||||
@@ -1013,6 +1015,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
DcMsg msg = null;
|
||||
Optional<QuoteModel> quote = inputPanel.getQuote();
|
||||
Integer recompress = 0;
|
||||
boolean editing = isEditing;
|
||||
|
||||
// for a quick ui feedback, we clear the related controls immediately on sending messages.
|
||||
// for drafts, however, we do not change the controls, the activity may be resumed.
|
||||
@@ -1021,6 +1024,18 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
inputPanel.clearQuote();
|
||||
}
|
||||
|
||||
if (editing) {
|
||||
int msgId = quote.get().getQuotedMsg().getId();
|
||||
Util.runOnAnyBackgroundThread(() -> {
|
||||
if (action == ACTION_SEND_OUT) {
|
||||
dcContext.sendEditRequest(msgId, body);
|
||||
} else {
|
||||
dcContext.setDraft(chatId, null);
|
||||
}
|
||||
});
|
||||
return future;
|
||||
}
|
||||
|
||||
if(slideDeck!=null) {
|
||||
|
||||
if (action==ACTION_SEND_OUT) {
|
||||
@@ -1159,7 +1174,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
return;
|
||||
}
|
||||
|
||||
if (composeText.getText().length() == 0 && !attachmentManager.isAttachmentPresent()) {
|
||||
if (!isEditing && composeText.getText().length() == 0 && !attachmentManager.isAttachmentPresent()) {
|
||||
buttonToggle.display(attachButton);
|
||||
quickAttachmentToggle.show();
|
||||
} else {
|
||||
@@ -1277,9 +1292,16 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onQuoteDismissed() {
|
||||
if (isEditing) composeText.setText("");
|
||||
isEditing = false;
|
||||
}
|
||||
|
||||
// media selected by the system keyboard
|
||||
@Override
|
||||
public void onMediaSelected(@NonNull Uri uri, String contentType) {
|
||||
if (isEditing) return;
|
||||
if (MediaUtil.isImageType(contentType)) {
|
||||
sendSticker(uri, contentType);
|
||||
} else if (MediaUtil.isVideoType(contentType)) {
|
||||
@@ -1411,6 +1433,8 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
|
||||
@Override
|
||||
public void handleReplyMessage(DcMsg msg) {
|
||||
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()));
|
||||
|
||||
@@ -1426,11 +1450,32 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
|
||||
msg.getTimestamp(),
|
||||
author,
|
||||
text,
|
||||
slideDeck);
|
||||
slideDeck,
|
||||
false);
|
||||
|
||||
inputPanel.clickOnComposeInput();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void handleEditMessage(DcMsg msg) {
|
||||
isEditing = true;
|
||||
Recipient author = new Recipient(this, dcContext.getContact(msg.getFromId()));
|
||||
|
||||
SlideDeck slideDeck = new SlideDeck();
|
||||
String text = msg.getSummarytext(500);
|
||||
|
||||
inputPanel.setQuote(GlideApp.with(this),
|
||||
msg,
|
||||
msg.getTimestamp(),
|
||||
author,
|
||||
text,
|
||||
slideDeck,
|
||||
true);
|
||||
|
||||
setDraftText(msg.getText());
|
||||
inputPanel.clickOnComposeInput();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onAttachmentChanged() {
|
||||
handleSecurityChange(isSecureText, isDefaultSms);
|
||||
|
||||
@@ -325,6 +325,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
menu.findItem(R.id.menu_context_details).setVisible(false);
|
||||
menu.findItem(R.id.menu_context_share).setVisible(false);
|
||||
menu.findItem(R.id.menu_context_reply).setVisible(false);
|
||||
menu.findItem(R.id.menu_context_edit).setVisible(false);
|
||||
menu.findItem(R.id.menu_context_reply_privately).setVisible(false);
|
||||
menu.findItem(R.id.menu_add_to_home_screen).setVisible(false);
|
||||
} else {
|
||||
@@ -334,6 +335,8 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
menu.findItem(R.id.menu_context_share).setVisible(messageRecord.hasFile());
|
||||
boolean canReply = canReplyToMsg(messageRecord);
|
||||
menu.findItem(R.id.menu_context_reply).setVisible(chat.canSend() && canReply);
|
||||
boolean canEdit = canEditMsg(messageRecord);
|
||||
menu.findItem(R.id.menu_context_edit).setVisible(chat.canSend() && canEdit);
|
||||
boolean showReplyPrivately = !dcContext.isCommunity() && chat.isMultiUser() && !messageRecord.isOutgoing() && canReply;
|
||||
menu.findItem(R.id.menu_context_reply_privately).setVisible(showReplyPrivately);
|
||||
menu.findItem(R.id.menu_add_to_home_screen).setVisible(messageRecord.getType() == DcMsg.DC_MSG_WEBXDC);
|
||||
@@ -377,6 +380,10 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
return canReply;
|
||||
}
|
||||
|
||||
static boolean canEditMsg(DcMsg dcMsg) {
|
||||
return dcMsg.isOutgoing() && !dcMsg.isInfo() && dcMsg.getType() != DcMsg.DC_MSG_VIDEOCHAT_INVITATION && !dcMsg.hasHtml() && !dcMsg.getText().isEmpty();
|
||||
}
|
||||
|
||||
public void handleClearChat() {
|
||||
handleDeleteMessages((int) chatId, getListAdapter().getMessageIds());
|
||||
}
|
||||
@@ -477,6 +484,16 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
listener.handleReplyMessage(message);
|
||||
}
|
||||
|
||||
@SuppressLint("RestrictedApi")
|
||||
private void handleEditMessage(final DcMsg message) {
|
||||
if (getActivity() != null) {
|
||||
//noinspection ConstantConditions
|
||||
((AppCompatActivity) getActivity()).getSupportActionBar().collapseActionView();
|
||||
}
|
||||
|
||||
listener.handleEditMessage(message);
|
||||
}
|
||||
|
||||
private void handleReplyMessagePrivately(final DcMsg msg) {
|
||||
|
||||
if (getActivity() != null) {
|
||||
@@ -607,6 +624,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
|
||||
public interface ConversationFragmentListener {
|
||||
void handleReplyMessage(DcMsg messageRecord);
|
||||
void handleEditMessage(DcMsg messageRecord);
|
||||
}
|
||||
|
||||
private class ConversationScrollListener extends OnScrollListener {
|
||||
@@ -926,6 +944,7 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
statusBarColor = window.getStatusBarColor();
|
||||
window.setStatusBarColor(getResources().getColor(R.color.action_mode_status_bar));
|
||||
|
||||
Util.redMenuItem(menu, R.id.menu_context_delete_message);
|
||||
setCorrectMenuVisibility(menu);
|
||||
ConversationAdaptiveActionsToolbar.adjustMenuActions(menu, 10, requireActivity().getWindow().getDecorView().getMeasuredWidth());
|
||||
return true;
|
||||
@@ -980,6 +999,10 @@ public class ConversationFragment extends MessageSelectorFragment
|
||||
handleReplyMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
|
||||
actionMode.finish();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_context_edit) {
|
||||
handleEditMessage(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
|
||||
actionMode.finish();
|
||||
return true;
|
||||
} else if (itemId == R.id.menu_context_reply_privately) {
|
||||
handleReplyMessagePrivately(getSelectedMessageRecord(getListAdapter().getSelectedItems()));
|
||||
return true;
|
||||
|
||||
@@ -720,7 +720,8 @@ public class ConversationItem extends BaseConversationItem
|
||||
author,
|
||||
quoteTxt,
|
||||
slideDeck,
|
||||
current.getType() == DcMsg.DC_MSG_STICKER);
|
||||
current.getType() == DcMsg.DC_MSG_STICKER,
|
||||
false);
|
||||
|
||||
quoteView.setVisibility(View.VISIBLE);
|
||||
quoteView.getLayoutParams().width = ViewGroup.LayoutParams.WRAP_CONTENT;
|
||||
|
||||
@@ -349,7 +349,6 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
}
|
||||
DcLot qrParsed = dcContext.checkQr(qrRaw);
|
||||
switch (qrParsed.getState()) {
|
||||
case DcContext.DC_QR_BACKUP:
|
||||
case DcContext.DC_QR_BACKUP2:
|
||||
final String finalQrRaw = qrRaw;
|
||||
new AlertDialog.Builder(this)
|
||||
@@ -361,6 +360,14 @@ public class WelcomeActivity extends BaseActionBarActivity implements DcEventCen
|
||||
.show();
|
||||
break;
|
||||
|
||||
case DcContext.DC_QR_BACKUP_TOO_NEW:
|
||||
new AlertDialog.Builder(this)
|
||||
.setTitle(R.string.multidevice_receiver_title)
|
||||
.setMessage(R.string.multidevice_receiver_needs_update)
|
||||
.setPositiveButton(R.string.ok, null)
|
||||
.show();
|
||||
break;
|
||||
|
||||
default:
|
||||
new AlertDialog.Builder(this)
|
||||
.setMessage(R.string.qraccount_qr_code_cannot_be_used)
|
||||
|
||||
@@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.util.DateUtils;
|
||||
public class ConversationItemFooter extends LinearLayout {
|
||||
|
||||
private TextView dateView;
|
||||
private TextView editedView;
|
||||
private ImageView bookmarkIndicatorView;
|
||||
private ImageView secureIndicatorView;
|
||||
private ImageView locationIndicatorView;
|
||||
@@ -45,6 +46,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
inflate(getContext(), R.layout.conversation_item_footer, this);
|
||||
|
||||
dateView = findViewById(R.id.footer_date);
|
||||
editedView = findViewById(R.id.footer_edited);
|
||||
bookmarkIndicatorView = findViewById(R.id.footer_bookmark_indicator);
|
||||
secureIndicatorView = findViewById(R.id.footer_secure_indicator);
|
||||
locationIndicatorView = findViewById(R.id.footer_location_indicator);
|
||||
@@ -62,6 +64,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
presentDate(messageRecord);
|
||||
boolean bookmark = messageRecord.getOriginalMsgId() != 0 || messageRecord.getSavedMsgId() != 0;
|
||||
bookmarkIndicatorView.setVisibility(bookmark ? View.VISIBLE : View.GONE);
|
||||
editedView.setVisibility(messageRecord.isEdited() ? View.VISIBLE : View.GONE);
|
||||
secureIndicatorView.setVisibility(messageRecord.isSecure() ? View.VISIBLE : View.GONE);
|
||||
locationIndicatorView.setVisibility(messageRecord.hasLocation() ? View.VISIBLE : View.GONE);
|
||||
presentDeliveryStatus(messageRecord);
|
||||
@@ -69,6 +72,7 @@ public class ConversationItemFooter extends LinearLayout {
|
||||
|
||||
private void setTextColor(int color) {
|
||||
dateView.setTextColor(color);
|
||||
editedView.setTextColor(color);
|
||||
bookmarkIndicatorView.setColorFilter(color);
|
||||
secureIndicatorView.setColorFilter(color);
|
||||
locationIndicatorView.setColorFilter(color);
|
||||
|
||||
@@ -120,9 +120,10 @@ public class InputPanel extends ConstraintLayout
|
||||
long id,
|
||||
@NonNull Recipient author,
|
||||
@NonNull CharSequence body,
|
||||
@NonNull SlideDeck attachments)
|
||||
@NonNull SlideDeck attachments,
|
||||
@NonNull boolean isEdit)
|
||||
{
|
||||
this.quoteView.setQuote(glideRequests, msg, author, body, attachments, false);
|
||||
this.quoteView.setQuote(glideRequests, msg, author, body, attachments, false, isEdit);
|
||||
|
||||
int originalHeight = this.quoteView.getVisibility() == VISIBLE ? this.quoteView.getMeasuredHeight()
|
||||
: 0;
|
||||
@@ -141,6 +142,7 @@ public class InputPanel extends ConstraintLayout
|
||||
|
||||
public void clearQuoteWithoutAnimation() {
|
||||
quoteView.dismiss();
|
||||
if (listener != null) listener.onQuoteDismissed();
|
||||
}
|
||||
|
||||
public void clearQuote() {
|
||||
@@ -152,6 +154,7 @@ public class InputPanel extends ConstraintLayout
|
||||
@Override
|
||||
public void onAnimationEnd(@NonNull Animator animation) {
|
||||
quoteView.dismiss();
|
||||
if (listener != null) listener.onQuoteDismissed();
|
||||
}
|
||||
});
|
||||
|
||||
@@ -329,6 +332,7 @@ public class InputPanel extends ConstraintLayout
|
||||
void onRecorderCanceled();
|
||||
void onRecorderPermissionRequired();
|
||||
void onEmojiToggle();
|
||||
void onQuoteDismissed();
|
||||
}
|
||||
|
||||
private static class SlideToCancel {
|
||||
|
||||
@@ -62,6 +62,7 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver {
|
||||
private SlideDeck attachments;
|
||||
private int messageType;
|
||||
private boolean hasSticker;
|
||||
private boolean isEdit;
|
||||
|
||||
public QuoteView(Context context) {
|
||||
super(context);
|
||||
@@ -116,13 +117,15 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver {
|
||||
@Nullable Recipient author,
|
||||
@Nullable CharSequence body,
|
||||
@NonNull SlideDeck attachments,
|
||||
boolean hasSticker)
|
||||
boolean hasSticker,
|
||||
boolean isEdit)
|
||||
{
|
||||
quotedMsg = msg;
|
||||
this.author = author != null ? author.getDcContact() : null;
|
||||
this.body = body;
|
||||
this.attachments = attachments;
|
||||
this.hasSticker = hasSticker;
|
||||
this.isEdit = isEdit;
|
||||
|
||||
if (hasSticker) {
|
||||
this.setBackgroundResource(R.drawable.conversation_item_update_background);
|
||||
@@ -146,7 +149,12 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver {
|
||||
}
|
||||
|
||||
private void setQuoteAuthor(@Nullable Recipient author) {
|
||||
if (author == null) {
|
||||
if (isEdit) {
|
||||
authorView.setVisibility(VISIBLE);
|
||||
authorView.setTextColor(getEditColor());
|
||||
quoteBarView.setBackgroundColor(getEditColor());
|
||||
authorView.setText(getContext().getString(R.string.edit_message));
|
||||
} else if (author == null) {
|
||||
authorView.setVisibility(GONE);
|
||||
quoteBarView.setBackgroundColor(getForwardedColor());
|
||||
} else if (quotedMsg.isForwarded()) {
|
||||
@@ -275,4 +283,8 @@ public class QuoteView extends FrameLayout implements RecipientForeverObserver {
|
||||
private int getForwardedColor() {
|
||||
return getResources().getColor(hasSticker? R.color.core_dark_05 : R.color.unknown_sender);
|
||||
}
|
||||
|
||||
private int getEditColor() {
|
||||
return getResources().getColor(R.color.delta_accent);
|
||||
}
|
||||
}
|
||||
|
||||
+11
-12
@@ -47,7 +47,7 @@ import java.util.Set;
|
||||
*
|
||||
* @author Jake McGinty
|
||||
*/
|
||||
public class ContactSelectionListAdapter extends RecyclerView.Adapter
|
||||
public class ContactSelectionListAdapter extends RecyclerView.Adapter<ContactSelectionListAdapter.ViewHolder>
|
||||
{
|
||||
private static final int VIEW_TYPE_CONTACT = 0;
|
||||
private static final int MAX_CACHE_SIZE = 100;
|
||||
@@ -157,7 +157,7 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter
|
||||
if (!longPressSelect) {
|
||||
return;
|
||||
}
|
||||
int adapterPosition = getAdapterPosition();
|
||||
int adapterPosition = getBindingAdapterPosition();
|
||||
if (adapterPosition < 0) return;
|
||||
int contactId = getContactId(adapterPosition);
|
||||
boolean enabled = actionModeSelection.indexOfKey(adapterPosition) > -1;
|
||||
@@ -244,8 +244,9 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter
|
||||
this.longPressSelect = longPressSelect;
|
||||
}
|
||||
|
||||
@NonNull
|
||||
@Override
|
||||
public ContactSelectionListAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
|
||||
public ContactSelectionListAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
|
||||
if (viewType == VIEW_TYPE_CONTACT) {
|
||||
return new ContactViewHolder(li.inflate(R.layout.contact_selection_list_item, parent, false), clickListener);
|
||||
} else {
|
||||
@@ -254,11 +255,10 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {
|
||||
public void onBindViewHolder(@NonNull ViewHolder viewHolder, int i) {
|
||||
|
||||
int id = dcContactList[i];
|
||||
DcContact dcContact = null;
|
||||
String label = null;
|
||||
String name;
|
||||
String addr = null;
|
||||
boolean itemMultiSelect = multiSelect;
|
||||
@@ -278,22 +278,21 @@ public class ContactSelectionListAdapter extends RecyclerView.Adapter
|
||||
addr = dcContact.getAddr();
|
||||
}
|
||||
|
||||
ViewHolder holder = (ViewHolder) viewHolder;
|
||||
holder.unbind(glideRequests);
|
||||
viewHolder.unbind(glideRequests);
|
||||
boolean enabled = true;
|
||||
if (dcContact == null) {
|
||||
holder.setSelected(false);
|
||||
holder.setEnabled(!isActionModeEnabled());
|
||||
viewHolder.setSelected(false);
|
||||
viewHolder.setEnabled(!isActionModeEnabled());
|
||||
if (isActionModeEnabled()) {
|
||||
enabled = false;
|
||||
}
|
||||
} else {
|
||||
boolean selected = actionModeSelection.indexOfValue(id) > -1;
|
||||
holder.setSelected(selected);
|
||||
viewHolder.setSelected(selected);
|
||||
enabled = !(dcContact.getId() == DcContact.DC_CONTACT_ID_SELF && itemMultiSelect);
|
||||
}
|
||||
holder.bind(glideRequests, id, dcContact, name, addr, label, itemMultiSelect, enabled);
|
||||
holder.setChecked(selectedContacts.contains(addr));
|
||||
viewHolder.bind(glideRequests, id, dcContact, name, addr, null, itemMultiSelect, enabled);
|
||||
viewHolder.setChecked(selectedContacts.contains(addr));
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -74,7 +74,6 @@ public class QrCodeHandler {
|
||||
builder.setCancelable(false);
|
||||
break;
|
||||
|
||||
case DcContext.DC_QR_BACKUP:
|
||||
case DcContext.DC_QR_BACKUP2:
|
||||
builder.setTitle(R.string.multidevice_receiver_title);
|
||||
builder.setMessage(activity.getString(R.string.multidevice_receiver_scanning_ask) + "\n\n" + activity.getString(R.string.multidevice_same_network_hint));
|
||||
@@ -89,6 +88,12 @@ public class QrCodeHandler {
|
||||
BackupTransferActivity.appendSSID(activity, alertDialog.findViewById(android.R.id.message));
|
||||
return;
|
||||
|
||||
case DcContext.DC_QR_BACKUP_TOO_NEW:
|
||||
builder.setTitle(R.string.multidevice_receiver_title);
|
||||
builder.setMessage(activity.getString(R.string.multidevice_receiver_needs_update));
|
||||
builder.setNegativeButton(R.string.ok, null);
|
||||
break;
|
||||
|
||||
case DcContext.DC_QR_PROXY:
|
||||
builder.setTitle(R.string.proxy_use_proxy);
|
||||
builder.setMessage(activity.getString(R.string.proxy_use_proxy_confirm, qrParsed.getText1()));
|
||||
|
||||
+9
-16
@@ -23,11 +23,10 @@ public class ConversationAdaptiveActionsToolbar extends Toolbar {
|
||||
private static final int ACTION_VIEW_WIDTH_DP = 48;
|
||||
private static final int OVERFLOW_VIEW_WIDTH_DP = 36;
|
||||
|
||||
private static final int ID_NEVER_SHOW_AS_ACTION_1 = R.id.menu_context_reply_privately;
|
||||
private static final int ID_NEVER_SHOW_AS_ACTION_2 = R.id.menu_context_save_attachment;
|
||||
private static final int ID_NEVER_SHOW_AS_ACTION_3 = R.id.menu_resend;
|
||||
private static final int ID_NEVER_SHOW_AS_ACTION_4 = R.id.menu_add_to_home_screen;
|
||||
private static final int ID_ALWAYS_SHOW_AS_ACTION = R.id.menu_context_forward;
|
||||
private static final int ID_ACTION_1 = R.id.menu_context_edit;
|
||||
private static final int ID_ACTION_2 = R.id.menu_context_copy;
|
||||
private static final int ID_ACTION_3 = R.id.menu_context_share;
|
||||
private static final int ID_ACTION_4 = R.id.menu_context_forward;
|
||||
|
||||
private final int maxShown;
|
||||
|
||||
@@ -74,21 +73,15 @@ public class ConversationAdaptiveActionsToolbar extends Toolbar {
|
||||
|
||||
nItemsToShow = Math.min(maxToShow, widthAllowed / ViewUtil.dpToPx(ACTION_VIEW_WIDTH_DP));
|
||||
|
||||
menu.findItem(ID_ALWAYS_SHOW_AS_ACTION).setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
||||
nItemsToShow--;
|
||||
|
||||
for (int i = 0; i < menu.size(); i++) {
|
||||
MenuItem item = menu.getItem(i);
|
||||
|
||||
boolean neverShowAsAction = item.getItemId() == ID_NEVER_SHOW_AS_ACTION_1
|
||||
|| item.getItemId() == ID_NEVER_SHOW_AS_ACTION_2
|
||||
|| item.getItemId() == ID_NEVER_SHOW_AS_ACTION_3
|
||||
|| item.getItemId() == ID_NEVER_SHOW_AS_ACTION_4;
|
||||
boolean alwaysShowAsAction = item.getItemId() == ID_ALWAYS_SHOW_AS_ACTION;
|
||||
boolean showAsAction = item.getItemId() == ID_ACTION_1
|
||||
|| item.getItemId() == ID_ACTION_2
|
||||
|| item.getItemId() == ID_ACTION_3
|
||||
|| item.getItemId() == ID_ACTION_4;
|
||||
|
||||
if (alwaysShowAsAction) continue;
|
||||
|
||||
if (item.isVisible() && nItemsToShow > 0 && !neverShowAsAction) {
|
||||
if (showAsAction && item.isVisible() && nItemsToShow > 0) {
|
||||
item.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
|
||||
nItemsToShow--;
|
||||
} else {
|
||||
|
||||
@@ -28,6 +28,19 @@
|
||||
android:importantForAccessibility="no"
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/footer_edited"
|
||||
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:text="@string/edited"
|
||||
android:paddingEnd="5dp"
|
||||
android:visibility="gone"
|
||||
tools:visibility="visible"/>
|
||||
|
||||
<TextView
|
||||
android:id="@+id/footer_date"
|
||||
android:autoLink="none"
|
||||
|
||||
@@ -1,54 +1,57 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto">
|
||||
<item android:title="@string/menu_reply"
|
||||
android:id="@+id/menu_context_reply"
|
||||
android:icon="?menu_reply_icon"
|
||||
app:showAsAction="always" />
|
||||
<item android:title="@string/edit_message"
|
||||
android:id="@+id/menu_context_edit"
|
||||
android:icon="@drawable/ic_create_white_24dp"
|
||||
app:showAsAction="ifRoom" />
|
||||
|
||||
<item android:title="@string/menu_message_details"
|
||||
android:id="@+id/menu_context_details"
|
||||
android:icon="?menu_info_icon"
|
||||
app:showAsAction="always" />
|
||||
<item android:title="@string/menu_copy_text_to_clipboard"
|
||||
android:id="@+id/menu_context_copy"
|
||||
android:icon="?menu_copy_icon"
|
||||
app:showAsAction="ifRoom" />
|
||||
|
||||
<item android:title="@string/menu_delete_messages"
|
||||
android:id="@+id/menu_context_delete_message"
|
||||
android:icon="?menu_trash_icon"
|
||||
app:showAsAction="always" />
|
||||
|
||||
<item android:title="@string/menu_share"
|
||||
<item android:title="@string/menu_share"
|
||||
android:id="@+id/menu_context_share"
|
||||
android:icon="@drawable/ic_share_white_24dp"
|
||||
app:showAsAction="always" />
|
||||
app:showAsAction="ifRoom" />
|
||||
|
||||
<item android:title="@string/add_to_home_screen"
|
||||
<item android:title="@string/menu_forward"
|
||||
android:id="@+id/menu_context_forward"
|
||||
android:icon="?menu_forward_icon"
|
||||
app:showAsAction="ifRoom" />
|
||||
|
||||
<item android:title="@string/add_to_home_screen"
|
||||
android:id="@+id/menu_add_to_home_screen"
|
||||
android:visible="false"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item android:title="@string/menu_copy_text_to_clipboard"
|
||||
android:id="@+id/menu_context_copy"
|
||||
android:icon="?menu_copy_icon"
|
||||
app:showAsAction="always" />
|
||||
|
||||
<item android:title="@string/menu_forward"
|
||||
android:id="@+id/menu_context_forward"
|
||||
android:icon="?menu_forward_icon"
|
||||
app:showAsAction="always" />
|
||||
|
||||
<item android:title="@string/menu_export_attachments"
|
||||
<item android:title="@string/menu_export_attachments"
|
||||
android:id="@+id/menu_context_save_attachment"
|
||||
android:visible="false"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item android:title="@string/reply_privately"
|
||||
<item android:title="@string/info"
|
||||
android:id="@+id/menu_context_details"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item android:title="@string/notify_reply_button"
|
||||
android:id="@+id/menu_context_reply"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item android:title="@string/reply_privately"
|
||||
android:id="@+id/menu_context_reply_privately"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<item android:title="@string/resend"
|
||||
<item android:title="@string/resend"
|
||||
android:id="@+id/menu_resend"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<!-- The `showAsAction` behaviors are managed by
|
||||
ConversationAdaptiveActionsToolbar. The `app:showAsAction`
|
||||
values set here don't actually make a difference.-->
|
||||
<item android:title="@string/delete"
|
||||
android:id="@+id/menu_context_delete_message"
|
||||
android:icon="?menu_trash_icon"
|
||||
app:showAsAction="never" />
|
||||
|
||||
<!-- The `showAsAction` behaviors are managed by
|
||||
ConversationAdaptiveActionsToolbar. The `app:showAsAction`
|
||||
values set here don't actually make a difference.-->
|
||||
</menu>
|
||||
|
||||
@@ -551,6 +551,7 @@
|
||||
<string name="multidevice_receiver_title">Als Zweitgerät hinzufügen</string>
|
||||
<string name="multidevice_open_settings_on_other_device">Auf dem ersten Gerät, gehe zu \"Einstellungen / Zweitgerät hinzufügen\" und scanne den dort angezeigten Code</string>
|
||||
<string name="multidevice_receiver_scanning_ask">Das Profil vom anderen Gerät auf dieses Gerät kopieren?</string>
|
||||
<string name="multidevice_receiver_needs_update">Das Profil, das Sie importieren möchten, stammt aus einer neueren Delta-Chat-Version.\n\nUm Fortzufahren, aktualisieren Sie dieses Gerät bitte auf die neueste Version von Delta Chat.</string>
|
||||
<string name="multidevice_abort">Einrichtung des Zweitgeräts beenden?</string>
|
||||
<string name="multidevice_abort_will_invalidate_copied_qr">Dadurch wird der auf die Zwischenablage kopierte QR-Code ungültig.</string>
|
||||
<string name="multidevice_experimental_hint">(experimentell, Version 1.36 erforderlich)</string>
|
||||
|
||||
@@ -7,6 +7,8 @@
|
||||
<string name="clear_search">Effacer la recherche</string>
|
||||
<!-- a noun, used on a button, short for "show link" -->
|
||||
<string name="link">Lien</string>
|
||||
<!-- "scan" in the meaning of "scan QR code" -->
|
||||
<string name="scan">Scanner</string>
|
||||
<string name="yes">Oui</string>
|
||||
<string name="no">Non</string>
|
||||
<string name="select">Sélectionner</string>
|
||||
@@ -26,6 +28,8 @@
|
||||
<string name="join">Rejoindre</string>
|
||||
<string name="rejoin">Réintégrer</string>
|
||||
<string name="delete">Supprimer</string>
|
||||
<string name="delete_for_me">Supprimer pour moi</string>
|
||||
<string name="delete_for_everyone">Supprimer pour tout le monde</string>
|
||||
<string name="info">Info</string>
|
||||
<string name="update">Mise à jour</string>
|
||||
<string name="emoji">Émoji</string>
|
||||
@@ -35,9 +39,12 @@
|
||||
<string name="close_window">Fermer la fenêtre</string>
|
||||
<string name="forward">Faire suivre</string>
|
||||
<string name="create">Créer</string>
|
||||
<string name="reset">Réinitialiser</string>
|
||||
<string name="later">Plus tard</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">Renvoyer</string>
|
||||
<string name="edited">Modifié</string>
|
||||
<string name="edit_message">Modifier le message</string>
|
||||
<!-- Verb "to archive", as in "put a chat in the archive", not a noun "The Archive". -->
|
||||
<string name="archive">Archiver</string>
|
||||
<!-- Verb "to unarchive", as in "remove a chat from the archive", opposite of the previous string -->
|
||||
@@ -193,6 +200,7 @@
|
||||
<string name="games">Jeux</string>
|
||||
<string name="tools">Outils</string>
|
||||
<string name="app_size">Taille</string>
|
||||
<string name="app_date_published">Publié</string>
|
||||
<string name="add_to_chat">Ajouter à la discussion</string>
|
||||
<!-- short for "Browse through the App Picker/Store/Catalogue"; could also be translated as "Discover" or "Search" -->
|
||||
<string name="browse">Explorer</string>
|
||||
@@ -291,6 +299,8 @@
|
||||
<string name="select_more">Sélectionner plus</string>
|
||||
<string name="menu_edit_name">Modifier le nom</string>
|
||||
<!-- The placeholder will be replaced by the name the contact gave themself (if any) or by an e-mail address. -->
|
||||
<string name="edit_name_explain">Choisir un surnom qui s\'affichera à la place de « %1$s ». Laisser cet espace vide pour utiliser le nom choisi par le contact.</string>
|
||||
<!-- The placeholder will be replaced by the name the contact gave themself (if any) or by an e-mail address. -->
|
||||
<string name="edit_name_placeholder">Surnom de \"%1$s\"</string>
|
||||
<string name="menu_settings">Paramètres</string>
|
||||
<string name="menu_advanced">Avancé</string>
|
||||
@@ -308,6 +318,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="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>
|
||||
@@ -369,6 +380,11 @@
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Voulez-vous vraiment supprimer « %1$s » ?</string>
|
||||
<string name="ask_delete_message">Voulez-vous vraiment supprimer ce message ?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="one">Effacer %d message ici et sur le serveur ?</item>
|
||||
<item quantity="many">Effacer %d messages ici et sur le serveur ?</item>
|
||||
<item quantity="other">Effacer %d messages ici et sur le serveur ?</item>
|
||||
</plurals>
|
||||
<!-- deprecated, use ask_delete_messages -->
|
||||
<plurals name="ask_delete_messages_simple">
|
||||
<item quantity="one">Supprimer %d message ?</item>
|
||||
@@ -461,6 +477,9 @@
|
||||
<string name="send_file_to">Envoyer \"%1$s\" à</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">Envoyer un message à</string>
|
||||
<string name="enable_realtime">Applications temps réel</string>
|
||||
<string name="enable_realtime_explain">Activez les connexions temps réel pour les applications partagées dans les discussions. Les interlocuteurs pourront voir votre adresse IP lorsque vous lancerez l\'app. </string>
|
||||
|
||||
<!-- map -->
|
||||
<string name="filter_map_on_time">Afficher les positions pour une période</string>
|
||||
<string name="show_location_traces">Afficher les traces</string>
|
||||
@@ -637,6 +656,7 @@
|
||||
<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_explain">Voulez-vous vraiment supprimer « %1$s » ?</string>
|
||||
<string name="proxy_share_explain">Vos amis peuvent ajouter ce proxy en scannant le code QR.</string>
|
||||
<string name="proxy_share_link">Partager le lien</string>
|
||||
|
||||
@@ -659,6 +679,8 @@
|
||||
<string name="profile_tag">Tag privé</string>
|
||||
<string name="profile_tag_hint">Travail ou famille par exemple</string>
|
||||
<string name="profile_tag_explain">Tag seulement visible par vous pour vous aider à différencier les profils.</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">Remonter l\'élément</string>
|
||||
<string name="delete_account">Supprimer le compte</string>
|
||||
<string name="delete_account_ask">Voulez-vous vraiment supprimer les données de votre compte ?</string>
|
||||
<string name="delete_account_explain_with_name">Toutes les données de compte de « %s » sur cet appareil seront effacées, y compris votre configuration de chiffrement de bout en bout, vos contacts, discussions, messages et médias. Cette action est irrévocable.</string>
|
||||
@@ -672,6 +694,8 @@
|
||||
<!-- share and forward messages -->
|
||||
<!-- Translators: shown above a chat/contact list when selecting recipients to forward messages -->
|
||||
<string name="forward_to">Transférer à …</string>
|
||||
<!-- first placeholder is replaced by the number of files (always 2 or more); second placeholder is replaced by a chat name -->
|
||||
<string name="ask_send_files_to_chat">Envoyer %1$d fichiers à « %2$s » ?</string>
|
||||
<string name="ask_send_files_to_selected_chats">Envoyer %1$d fichier(s) à %2$d discussions ?</string>
|
||||
<string name="share_text_multiple_chats">Envoyer ce texte à %1$d discussions ?\n\n« %2$s »</string>
|
||||
<string name="share_abort">Partage annulé en raison de permissions manquantes.</string>
|
||||
@@ -702,6 +726,7 @@
|
||||
<string name="pref_screen_security_please_restart_hint">Pour appliquer les paramètres de sécurité de l\'écran, veuillez redémarrer l\'application.</string>
|
||||
<string name="pref_notifications">Notifications</string>
|
||||
<string name="pref_mention_notifications">Mentions</string>
|
||||
<string name="pref_mention_notifications_explain">Dans les groupes passés en muet, des notifications vous sont envoyées, comme des réponses ou des réactions</string>
|
||||
<string name="pref_notifications_show">Afficher</string>
|
||||
<string name="pref_notifications_priority">Priorité</string>
|
||||
<string name="pref_notifications_explain">Activer les notifications système pour les nouveaux messages</string>
|
||||
@@ -719,6 +744,7 @@
|
||||
<string name="pref_appearance">Apparence</string>
|
||||
<string name="pref_theme">Thème</string>
|
||||
<string name="pref_language">Langue</string>
|
||||
<string name="pref_use_system_ui_font">Utiliser la police système</string>
|
||||
<string name="pref_incognito_keyboard">Clavier anonyme</string>
|
||||
<!-- Translators: Must indicate that there is no guarantee as the system may not honor our request. -->
|
||||
<string name="pref_incognito_keyboard_explain">Demander que le clavier désactive l\'apprentissage personnalisé</string>
|
||||
@@ -729,6 +755,8 @@
|
||||
<string name="pref_manage_keys">Gérer les clés</string>
|
||||
<string name="pref_use_system_emoji">Utiliser les émojis système</string>
|
||||
<string name="pref_use_system_emoji_explain">Désactiver la prise en charge des émojis intégrés de Delta Chat</string>
|
||||
<string name="pref_show_system_contacts">Lire le carnet d\'adresses du système</string>
|
||||
<string name="pref_show_system_contacts_explain">Permet de créer des conversations avec des contacts du carnet d\'adresse. Certains fournisseurs doivent d\'abord mettre en place un chiffrement de bout-en-bout.</string>
|
||||
<string name="pref_app_access">Accès à l\'application</string>
|
||||
<string name="pref_chats">Discussions</string>
|
||||
<string name="pref_in_chat_sounds">Sons de messages entrants</string>
|
||||
@@ -817,6 +845,9 @@
|
||||
<string name="reactions">Réactions</string>
|
||||
<!-- Verb, the action of adding a "Reaction" to a message. Used eg. in context menus, similar to "Reply" or "Forward" -->
|
||||
<string name="react">Réagir</string>
|
||||
<!-- %1$s will be replaced a name. %2$s will be replaced by an emoji. %3$s will be replaced by message summary (the summary is often long and whole string gets truncated; words after %3$s will often not being visible). Eg. 'Alice reacted 👍 to "Nice photos"'. Use less than 20 characters, otherwise the string will be truncated too soon and too few information are shown. Do not try to translate "reacted to" too strict. Depending on the language, "added 👍 to" or "gave 👍 to" or just "👍 to" may be shorter and/or clearer work as well. -->
|
||||
<string name="reaction_by_other">%1$s a réagi %2$s à « %3$s »</string>
|
||||
|
||||
<!-- automatically delete message -->
|
||||
<string name="delete_old_messages">Supprimer les anciens messages</string>
|
||||
<string name="autodel_device_title">Supprimer les messages de l\'appareil</string>
|
||||
@@ -827,6 +858,8 @@
|
||||
<string name="autodel_server_ask">Voulez-vous supprimer %1$d messages maintenant ainsi que tous les futurs nouveaux messages reçus « %2$s » ?\n\n⚠️ Cela inclut les courriels, les fichiers multimédia et les « Messages sauvegardés » dans tous les répertoires du serveur\n\n⚠️ N\'utilisez pas cette fonction si vous utilisez d\'autres clients de messagerie électronique en plus de Delta Chat</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">Cela inclus les courriels, médias et les « Messages sauvegardés » dans tous les répertoires du serveur. N\'utilisez pas cette fonction si vous voulez garder les données sur le serveur ou si vous utilisez d\'autres clients de messagerie électronique en plus de Delta Chat.</string>
|
||||
<string name="autodel_server_warn_multi_device_title">Activer la suppression immédiate</string>
|
||||
<string name="autodel_server_warn_multi_device">Si vous activez la suppression immédiate, vous ne pourrez pas utiliser plusieurs appareils sur ce profil.</string>
|
||||
<string name="autodel_confirm">J\'ai compris, supprimer tous ces messages</string>
|
||||
<!-- "At once" in the meaning of "Immediately", without any intervening time. -->
|
||||
<string name="autodel_at_once">Immédiatement</string>
|
||||
@@ -929,6 +962,7 @@
|
||||
<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="chat_protection_broken_tap_to_learn_more">%1$s a envoyé un message depuis un nouvel appareil. Appuyez pour en savoir plus.</string>
|
||||
<string name="chat_protection_broken_explanation">Le chiffrement de bout en bout ne peut plus être garanti, probablement parce que %1$s a réinstallé Delta Chat ou envoyé un message depuis un nouvel appareil.\n\nVous pouvez convenir d\'une rencontre physique afin de scanner à nouveau son code QR pour ré-instaurer la garantie du chiffrement de bout en bout.</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>
|
||||
<string name="invalid_unencrypted_explanation">Pour établir un chiffrement de bout en bout vous pouvez rencontrer vos contacts en personne et scanner leur code QR.</string>
|
||||
<string name="learn_more">En savoir plus</string>
|
||||
|
||||
@@ -1071,6 +1105,8 @@
|
||||
<string name="timestamp_format_m_desktop">MMM D</string>
|
||||
<string name="remove_desktop">Retirer</string>
|
||||
<string name="save_desktop">Sauvegardez</string>
|
||||
<!-- Opposite of "Save". Undo a "Save" action. Similar to "Unmute", "Unpin". Could also be worded as "Save no longer" or so. -->
|
||||
<string name="unsave">Annuler la sauvegarde</string>
|
||||
<string name="name_desktop">Nom</string>
|
||||
<string name="select_group_image_desktop">Choisir l\'image de groupe</string>
|
||||
<string name="export_backup_desktop">Exporter la sauvegarde</string>
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
<string name="join">Partecipa</string>
|
||||
<string name="rejoin">Ripartecipa</string>
|
||||
<string name="delete">Elimina</string>
|
||||
<string name="delete_for_me">Cancella per Me</string>
|
||||
<string name="delete_for_everyone">Cancella per Tutti</string>
|
||||
<string name="info">Informazioni</string>
|
||||
<string name="update">Aggiorna</string>
|
||||
<string name="emoji">Emoji</string>
|
||||
@@ -381,6 +383,11 @@
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Elimina chat \"%1$s\"?</string>
|
||||
<string name="ask_delete_message">Sei sicuro di voler eliminare questo messaggio?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="one">Cancella %d messaggio su tutti i tuoi dispositivi?</item>
|
||||
<item quantity="many">Cancella %d messaggi su tutti i tuoi dispositivi?</item>
|
||||
<item quantity="other">Cancella %d messaggi su tutti i tuoi dispositivi?</item>
|
||||
</plurals>
|
||||
<!-- deprecated, use ask_delete_messages -->
|
||||
<plurals name="ask_delete_messages_simple">
|
||||
<item quantity="one">Eliminare %d messaggio?</item>
|
||||
@@ -551,7 +558,7 @@
|
||||
<!-- "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">Aggiungi Secondo Dispositivo</string>
|
||||
<string name="multidevice_same_network_hint">Assicurati che entrambi i dispositivi siano sulla stessa rete o Wi-Fi.</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Questo crea un codice QR che il secondo dispositivo può scansionare per copiare il profilo.</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Questo crea un codice QR che il secondo dispositivo può scansionare per copiare il profilo.\n\nAssicurati che nessun osservatore o telecamera indesiderata possa vedere la schermata seguente.</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Installa Delta Chat sull\'altro tuo dispositivo (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">Avvia Delta Chat, tocca \"Ho già un Profilo / Aggiungi come Secondo Dispositivo\" e scansiona il codice mostrato qui</string>
|
||||
|
||||
@@ -541,7 +541,7 @@
|
||||
<!-- "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">Secundair apparaat toevoegen</string>
|
||||
<string name="multidevice_same_network_hint">Zorg ervoor dat beide apparaten verbonden zijn met hetzelfde (wifi)netwerk</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Hiermee wordt een QR-code samengesteld die door het tweede apparaat kan worden gescand om het account te kopiëren.</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Hiermee wordt een QR-code samengesteld die door het tweede apparaat kan worden gescand om het account te kopiëren.\n\nZorg dat er geen vreemden meekijken, al dan niet door een camera.</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Installeer Delta Chat op je andere apparaat (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">Start Delta Chat, druk op ‘Ik heb al een profiel → Toevoegen als secundair apparaat’ en scan de hier getoonde code</string>
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
<string name="join">Dołącz</string>
|
||||
<string name="rejoin">Dołącz ponownie</string>
|
||||
<string name="delete">Usuń</string>
|
||||
<string name="delete_for_me">Usuń u mnie</string>
|
||||
<string name="delete_for_everyone">Usuń u wszystkich</string>
|
||||
<string name="info">Informacje</string>
|
||||
<string name="update">Aktualizacja</string>
|
||||
<string name="emoji">Emoji</string>
|
||||
@@ -391,6 +393,12 @@
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Usunąć czat „%1$s”? Nie będzie on już wyświetlany na liście czatów. Jego wiadomości pozostaną na serwerze.</string>
|
||||
<string name="ask_delete_message">Czy na pewno chcesz 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>
|
||||
</plurals>
|
||||
<!-- deprecated, use ask_delete_messages -->
|
||||
<plurals name="ask_delete_messages_simple">
|
||||
<item quantity="one">Usunąć %d wiadomość?</item>
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
<string name="join">Присоединиться</string>
|
||||
<string name="rejoin">Присоединиться снова</string>
|
||||
<string name="delete">Удалить</string>
|
||||
<string name="delete_for_me">Удалить для меня</string>
|
||||
<string name="delete_for_everyone">Удалить для всех</string>
|
||||
<string name="info">Информация</string>
|
||||
<string name="update">Обновить</string>
|
||||
<string name="emoji">Эмодзи</string>
|
||||
@@ -391,6 +393,12 @@
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Удалить чат \"%1$s\"?</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>
|
||||
</plurals>
|
||||
<!-- deprecated, use ask_delete_messages -->
|
||||
<plurals name="ask_delete_messages_simple">
|
||||
<item quantity="one">Удалить %d сообщение?</item>
|
||||
@@ -565,7 +573,7 @@
|
||||
<!-- "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">Добавить второе устройство</string>
|
||||
<string name="multidevice_same_network_hint">Убедитесь, что оба устройства подключены к одной и той же локальной или Wi-Fi сети.</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Это создает QR-код, который можно отсканировать на втором устройстве, чтобы скопировать профиль.</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Это позволяет создать QR-код, который можно отсканировать на втором устройстве, чтобы скопировать профиль.\n\nУбедитесь, что посторонние люди или камера не видят следующий экран.</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Установите Delta Chat на другом устройстве (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">Запустите Delta Chat, выберите \"У меня уже есть профиль / Добавить как второе устройство\" и отсканируйте код, показанный здесь</string>
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
<string name="join">Hyni</string>
|
||||
<string name="rejoin">Rihyni</string>
|
||||
<string name="delete">Fshije</string>
|
||||
<string name="delete_for_me">Fshije për Mua</string>
|
||||
<string name="delete_for_everyone">Fshije për Gjithkënd</string>
|
||||
<string name="info">Hollësi</string>
|
||||
<string name="update">Përditësoje</string>
|
||||
<string name="emoji">Emoji</string>
|
||||
@@ -365,6 +367,10 @@
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">Jeni i sigurt se doni të fshihet “%1$s”?</string>
|
||||
<string name="ask_delete_message">Jeni i sigurt se doni të fshihet ky mesazh?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="one">Të fshihet %d mesazh në krejt pajisjet tuaja?</item>
|
||||
<item quantity="other">Të fshihen %d mesazhe në krejt pajisjet tuaja?</item>
|
||||
</plurals>
|
||||
<!-- deprecated, use ask_delete_messages -->
|
||||
<plurals name="ask_delete_messages_simple">
|
||||
<item quantity="one">Të fshihet %d mesazh?</item>
|
||||
|
||||
@@ -541,7 +541,7 @@
|
||||
<!-- "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">İkinci Aygıt Ekle</string>
|
||||
<string name="multidevice_same_network_hint">Her iki aygıtın da aynı Wi-Fi\'da ya da ağda olduğundan emin olun</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Bu, ikinci aygıtın profili kopyalamak için tarayabileceği bir QR kodu oluşturur.</string>
|
||||
<string name="multidevice_this_creates_a_qr_code">Bu, ikinci aygıtın profili kopyalamak için tarayabileceği bir QR kodu oluşturur.\n\nİstenmeyen gözlemcinin ya da kameranın aşağıdaki ekranı göremediğinden emin olun.</string>
|
||||
<string name="multidevice_install_dc_on_other_device">Delta Chat\'i diğer aygıtınıza kurun (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">Delta Chat\'i başlatın, “Zaten Bir Profilim Var / İkinci Aygıt Olarak Ekle”ye dokunun ve burada gösterilen kodu tarayın</string>
|
||||
|
||||
@@ -28,6 +28,8 @@
|
||||
<string name="join">加入</string>
|
||||
<string name="rejoin">重新加入</string>
|
||||
<string name="delete">删除</string>
|
||||
<string name="delete_for_me">为我删除</string>
|
||||
<string name="delete_for_everyone">为所有人删除</string>
|
||||
<string name="info">信息</string>
|
||||
<string name="update">更新</string>
|
||||
<string name="emoji">Emoji</string>
|
||||
@@ -358,6 +360,9 @@
|
||||
</plurals>
|
||||
<string name="ask_delete_named_chat">删除聊天“%1$s”?它将不再显示在聊天列表中,其消息将保留在服务器上。</string>
|
||||
<string name="ask_delete_message">您确定要删除这条消息吗?</string>
|
||||
<plurals name="ask_delete_messages">
|
||||
<item quantity="other">是否删除所有设备上的 %d 条消息?</item>
|
||||
</plurals>
|
||||
<!-- deprecated, use ask_delete_messages -->
|
||||
<plurals name="ask_delete_messages_simple">
|
||||
<item quantity="other">删除 %d 条消息吗?</item>
|
||||
|
||||
@@ -569,6 +569,7 @@
|
||||
<string name="multidevice_receiver_title">Add as Second Device</string>
|
||||
<string name="multidevice_open_settings_on_other_device">On the first device, go to “Settings / Add Second Device“ and scan the code shown there</string>
|
||||
<string name="multidevice_receiver_scanning_ask">Copy the profile from the other device to this device?</string>
|
||||
<string name="multidevice_receiver_needs_update">The profile you want to import is from a newer Delta Chat version.\n\nTo continue setting up second device, please update this device to the latest version of Delta Chat.</string>
|
||||
<string name="multidevice_abort">Abort setting up second device?</string>
|
||||
<string name="multidevice_abort_will_invalidate_copied_qr">This will invalidate the QR code copied to clipboard.</string>
|
||||
<string name="multidevice_experimental_hint">(experimental, version 1.36 required)</string>
|
||||
|
||||
Reference in New Issue
Block a user