diff options
12 files changed, 116 insertions, 43 deletions
diff --git a/src/main/java/eu/siacs/conversations/Config.java b/src/main/java/eu/siacs/conversations/Config.java index 8173c05d7..430980a20 100644 --- a/src/main/java/eu/siacs/conversations/Config.java +++ b/src/main/java/eu/siacs/conversations/Config.java @@ -14,7 +14,10 @@ public final class Config { public static final boolean HIDE_PGP_IN_UI = false; //some more consumer focused clients might want to disable OpenPGP public static final boolean HIDE_ENCRYPTION_IN_UI = false; //completely hide encryption options in menu bar - public static final boolean PARANOID_MODE = false; //disables ability to send unencrypted 1-on-1 chats and forces TOR + + public static final boolean FORCE_ENCRYPTION = false; //disables ability to send unencrypted 1-on-1 + public static final boolean FORCE_ORBOT = false; // always use TOR + public static final boolean HIDE_MESSAGE_TEXT_IN_NOTIFICATION = false; public static final boolean SHOW_CONNECTED_ACCOUNTS = false; //show number of connected accounts in foreground notification @@ -25,6 +28,8 @@ public final class Config { public static final int PING_TIMEOUT = 15; public static final int SOCKET_TIMEOUT = 15; public static final int CONNECT_TIMEOUT = 60; + public static final int CONNECT_DISCO_TIMEOUT = 20; + public static final int CARBON_GRACE_PERIOD = 90; public static final int MINI_GRACE_PERIOD = 750; diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index bef1e5bc8..81f789f8d 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -630,7 +630,7 @@ public class Conversation extends AbstractEntity implements Blockable { next = outgoing; } } - if (Config.PARANOID_MODE && mode == MODE_SINGLE && next <= 0) { + if (Config.FORCE_ENCRYPTION && mode == MODE_SINGLE && next <= 0) { if (getAccount().getAxolotlService().isContactAxolotlCapable(getContact())) { return Message.ENCRYPTION_AXOLOTL; } else { diff --git a/src/main/java/eu/siacs/conversations/services/AvatarService.java b/src/main/java/eu/siacs/conversations/services/AvatarService.java index bdeab06a8..8f9b26ab4 100644 --- a/src/main/java/eu/siacs/conversations/services/AvatarService.java +++ b/src/main/java/eu/siacs/conversations/services/AvatarService.java @@ -351,6 +351,11 @@ public class AvatarService { if (drawTile(canvas, uri, left, top, right, bottom)) { return true; } + } else if (user.getAvatar() != null) { + Uri uri = mXmppConnectionService.getFileBackend().getAvatarUri(user.getAvatar()); + if (drawTile(canvas, uri, left, top, right, bottom)) { + return true; + } } String name = contact != null ? contact.getDisplayName() : user.getName(); drawTile(canvas, name, left, top, right, bottom); diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 7e6919581..b69e5f79e 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -234,7 +234,7 @@ public class NotificationService { if (messages.size() > 0) { conversation = messages.get(0).getConversation(); final String name = conversation.getName(); - if (Config.PARANOID_MODE) { + if (Config.HIDE_MESSAGE_TEXT_IN_NOTIFICATION) { int count = messages.size(); style.addLine(Html.fromHtml("<b>"+name+"</b> "+mXmppConnectionService.getResources().getQuantityString(R.plurals.x_messages,count,count))); } else { @@ -269,7 +269,7 @@ public class NotificationService { mBuilder.setLargeIcon(mXmppConnectionService.getAvatarService() .get(conversation, getPixel(64))); mBuilder.setContentTitle(conversation.getName()); - if (Config.PARANOID_MODE) { + if (Config.HIDE_MESSAGE_TEXT_IN_NOTIFICATION) { int count = messages.size(); mBuilder.setContentText(mXmppConnectionService.getResources().getQuantityString(R.plurals.x_messages,count,count)); } else { diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index 9ecdf6ae8..649ddacd8 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -547,12 +547,18 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } else if (account.getStatus() == Account.State.OFFLINE) { reconnectAccount(account, true, interactive); } else if (account.getStatus() == Account.State.CONNECTING) { - long timeout = Config.CONNECT_TIMEOUT - ((SystemClock.elapsedRealtime() - account.getXmppConnection().getLastConnect()) / 1000); + long secondsSinceLastConnect = (SystemClock.elapsedRealtime() - account.getXmppConnection().getLastConnect()) / 1000; + long secondsSinceLastDisco = (SystemClock.elapsedRealtime() - account.getXmppConnection().getLastDiscoStarted()) / 1000; + long discoTimeout = Config.CONNECT_DISCO_TIMEOUT - secondsSinceLastDisco; + long timeout = Config.CONNECT_TIMEOUT - secondsSinceLastConnect; if (timeout < 0) { Log.d(Config.LOGTAG, account.getJid() + ": time out during connect reconnecting"); reconnectAccount(account, true, interactive); + } else if (discoTimeout < 0) { + account.getXmppConnection().sendDiscoTimeout(); + scheduleWakeUpCall((int) Math.min(timeout,discoTimeout), account.getUuid().hashCode()); } else { - scheduleWakeUpCall((int) timeout, account.getUuid().hashCode()); + scheduleWakeUpCall((int) Math.min(timeout,discoTimeout), account.getUuid().hashCode()); } } else { if (account.getXmppConnection().getTimeToNextAttempt() <= 0) { @@ -748,7 +754,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa stopSelf(); } - protected void scheduleWakeUpCall(int seconds, int requestCode) { + public void scheduleWakeUpCall(int seconds, int requestCode) { final long timeToWake = SystemClock.elapsedRealtime() + (seconds < 0 ? 1 : seconds + 1) * 1000; Context context = getApplicationContext(); @@ -2568,7 +2574,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } public boolean useTorToConnect() { - return Config.PARANOID_MODE || getPreferences().getBoolean("use_tor", false); + return Config.FORCE_ORBOT || getPreferences().getBoolean("use_tor", false); } public int unreadCount() { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 547f977ba..47edd1a42 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -923,7 +923,7 @@ public class ConversationActivity extends XmppActivity MenuItem pgp = popup.getMenu().findItem(R.id.encryption_choice_pgp); MenuItem axolotl = popup.getMenu().findItem(R.id.encryption_choice_axolotl); pgp.setVisible(!Config.HIDE_PGP_IN_UI); - none.setVisible(!Config.PARANOID_MODE); + none.setVisible(!Config.FORCE_ENCRYPTION); if (conversation.getMode() == Conversation.MODE_MULTI) { otr.setVisible(false); axolotl.setVisible(false); diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java index c1c8d75cf..439ada3a6 100644 --- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java @@ -491,7 +491,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate } } } - this.mUseTor = Config.PARANOID_MODE || getPreferences().getBoolean("use_tor", false); + this.mUseTor = Config.FORCE_ORBOT || getPreferences().getBoolean("use_tor", false); this.mNamePort.setVisibility(mUseTor ? View.VISIBLE : View.GONE); } diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java index da9738ab5..aa23e36db 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java @@ -61,7 +61,7 @@ public class SettingsActivity extends XmppActivity implements } } - if (Config.PARANOID_MODE) { + if (Config.FORCE_ORBOT) { PreferenceCategory connectionOptions = (PreferenceCategory) mSettingsFragment.findPreference("connection_options"); PreferenceScreen expert = (PreferenceScreen) mSettingsFragment.findPreference("expert"); if (connectionOptions != null) { diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 2325187ec..a3cea867f 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -246,7 +246,6 @@ public class MessageAdapter extends ArrayAdapter<Message> { viewHolder.messageBody.setText(text); viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false)); viewHolder.messageBody.setTypeface(null, Typeface.ITALIC); - viewHolder.messageBody.setTextIsSelectable(false); } private void displayDecryptionFailed(ViewHolder viewHolder, boolean darkBackground) { @@ -259,7 +258,6 @@ public class MessageAdapter extends ArrayAdapter<Message> { R.string.decryption_failed)); viewHolder.messageBody.setTextColor(getMessageTextColor(darkBackground, false)); viewHolder.messageBody.setTypeface(null, Typeface.NORMAL); - viewHolder.messageBody.setTextIsSelectable(false); } private void displayHeartMessage(final ViewHolder viewHolder, final String body) { @@ -341,7 +339,6 @@ public class MessageAdapter extends ArrayAdapter<Message> { viewHolder.messageBody.setLinkTextColor(this.getMessageTextColor(darkBackground, true)); viewHolder.messageBody.setHighlightColor(activity.getResources().getColor(darkBackground ? R.color.grey800 : R.color.grey500)); viewHolder.messageBody.setTypeface(null, Typeface.NORMAL); - viewHolder.messageBody.setTextIsSelectable(true); } private void displayDownloadableMessage(ViewHolder viewHolder, diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index 7455ff8d3..978f9f60b 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -116,7 +116,9 @@ public class XmppConnection implements Runnable { private long lastPingSent = 0; private long lastConnect = 0; private long lastSessionStarted = 0; + private long lastDiscoStarted = 0; private int mPendingServiceDiscoveries = 0; + private final ArrayList<String> mPendingServiceDiscoveriesIds = new ArrayList<>(); private boolean mInteractive = false; private int attempt = 0; private final Hashtable<String, Pair<IqPacket, OnIqPacketReceived>> packetCallbacks = new Hashtable<>(); @@ -225,6 +227,7 @@ public class XmppConnection implements Runnable { features.encryptionEnabled = false; lastConnect = SystemClock.elapsedRealtime(); lastPingSent = SystemClock.elapsedRealtime(); + lastDiscoStarted = Long.MAX_VALUE; this.attempt++; if (account.getJid().getDomainpart().equals("chat.facebook.com")) { mServerIdentity = Identity.FACEBOOK; @@ -893,6 +896,29 @@ public class XmppConnection implements Runnable { Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": done clearing iq callbacks. " + this.packetCallbacks.size() + " left"); } + public void sendDiscoTimeout() { + final IqPacket failurePacket = new IqPacket(IqPacket.TYPE.ERROR); //don't use timeout + final ArrayList<OnIqPacketReceived> callbacks = new ArrayList<>(); + synchronized (this.mPendingServiceDiscoveriesIds) { + for(String id : mPendingServiceDiscoveriesIds) { + synchronized (this.packetCallbacks) { + Pair<IqPacket, OnIqPacketReceived> pair = this.packetCallbacks.remove(id); + if (pair != null) { + callbacks.add(pair.second); + } + } + } + this.mPendingServiceDiscoveriesIds.clear(); + } + if (callbacks.size() > 0) { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": sending disco timeout"); + resetStreamId(); //we don't want to live with this for ever + } + for(OnIqPacketReceived callback : callbacks) { + callback.onIqPacketReceived(account,failurePacket); + } + } + private void sendStartSession() { final IqPacket startSession = new IqPacket(IqPacket.TYPE.SET); startSession.addChild("session", "urn:ietf:params:xml:ns:xmpp-session"); @@ -928,10 +954,12 @@ public class XmppConnection implements Runnable { this.disco.clear(); } mPendingServiceDiscoveries = 0; + lastDiscoStarted = SystemClock.elapsedRealtime(); + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": starting service discovery"); + mXmppConnectionService.scheduleWakeUpCall(Config.CONNECT_DISCO_TIMEOUT, account.getUuid().hashCode()); sendServiceDiscoveryItems(account.getServer()); sendServiceDiscoveryInfo(account.getServer()); sendServiceDiscoveryInfo(account.getJid().toBareJid()); - Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": online with resource " + account.getResource()); this.lastSessionStarted = SystemClock.elapsedRealtime(); } @@ -940,7 +968,7 @@ public class XmppConnection implements Runnable { final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); iq.setTo(jid); iq.query("http://jabber.org/protocol/disco#info"); - this.sendIqPacket(iq, new OnIqPacketReceived() { + String id = this.sendIqPacket(iq, new OnIqPacketReceived() { @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { @@ -990,7 +1018,8 @@ public class XmppConnection implements Runnable { if (packet.getType() != IqPacket.TYPE.TIMEOUT) { mPendingServiceDiscoveries--; if (mPendingServiceDiscoveries <= 0) { - Log.d(Config.LOGTAG,account.getJid().toBareJid()+": done with service discovery"); + Log.d(Config.LOGTAG, account.getJid().toBareJid()+": done with service discovery"); + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": online with resource " + account.getResource()); changeStatus(Account.State.ONLINE); if (bindListener != null) { bindListener.onBind(account); @@ -999,6 +1028,9 @@ public class XmppConnection implements Runnable { } } }); + synchronized (this.mPendingServiceDiscoveriesIds) { + this.mPendingServiceDiscoveriesIds.add(id); + } } private void enableAdvancedStreamFeatures() { @@ -1033,7 +1065,7 @@ public class XmppConnection implements Runnable { } } } else { - Log.d(Config.LOGTAG,account.getJid().toBareJid()+": could not query disco items of "+server); + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": could not query disco items of " + server); } } }); @@ -1086,13 +1118,12 @@ public class XmppConnection implements Runnable { return new BigInteger(50, mXmppConnectionService.getRNG()).toString(32); } - public void sendIqPacket(final IqPacket packet, final OnIqPacketReceived callback) { + public String sendIqPacket(final IqPacket packet, final OnIqPacketReceived callback) { packet.setFrom(account.getJid()); - this.sendUnmodifiedIqPacket(packet, callback); - + return this.sendUnmodifiedIqPacket(packet, callback); } - private synchronized void sendUnmodifiedIqPacket(final IqPacket packet, final OnIqPacketReceived callback) { + private synchronized String sendUnmodifiedIqPacket(final IqPacket packet, final OnIqPacketReceived callback) { if (packet.getId() == null) { final String id = nextRandomId(); packet.setAttribute("id", id); @@ -1103,6 +1134,7 @@ public class XmppConnection implements Runnable { } } this.sendPacket(packet); + return packet.getId(); } public void sendMessagePacket(final MessagePacket packet) { @@ -1293,6 +1325,9 @@ public class XmppConnection implements Runnable { return this.lastPingSent; } + public long getLastDiscoStarted() { + return this.lastDiscoStarted; + } public long getLastPacketReceived() { return this.lastPacketReceived; } diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 1f35910a0..7c4ac3036 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -28,6 +28,8 @@ <string name="minutes_ago">vor %d Minuten</string> <string name="unread_conversations">ungelesene Unterhaltungen</string> <string name="sending">senden…</string> + <string name="message_decrypting">Nachricht wird entschlüsselt. Bitte warten …</string> + <string name="pgp_message">OpenPGP-verschlüsselte Nachricht</string> <string name="nick_in_use">Nickname wird bereits verwendet</string> <string name="admin">Administrator</string> <string name="owner">Eigentümer</string> @@ -41,9 +43,9 @@ <string name="unblock_domain_text">Alle Kontakte von %s entsperren?</string> <string name="contact_blocked">Kontakt gesperrt</string> <string name="remove_bookmark_text">Möchtest du %s von deiner Kontaktliste entfernen? Die Unterhaltung mit dieser Konferenz wird dabei nicht entfernt.</string> - <string name="register_account">Neues Konto auf dem Server erstellen</string> + <string name="register_account">Neues Konto auf Server erstellen</string> <string name="change_password_on_server">Passwort ändern</string> - <string name="share_with">Teile mit…</string> + <string name="share_with">Teilen mit…</string> <string name="start_conversation">Unterhaltung beginnen</string> <string name="invite_contact">Kontakt einladen</string> <string name="contacts">Kontakte</string> @@ -68,7 +70,7 @@ <string name="add_contact">Kontakt hinzufügen</string> <string name="send_failed">Zustellung fehlgeschlagen</string> <string name="send_rejected">abgelehnt</string> - <string name="preparing_image">Bereite Bild für die Übertragung vor</string> + <string name="preparing_image">Bild wird für Übertragung vorbereitet</string> <string name="action_clear_history">Verlauf löschen</string> <string name="clear_conversation_history">Verlauf löschen</string> <string name="clear_histor_msg">Möchtest du alle Nachrichten in dieser Unterhaltung löschen?\n\n<b>Achtung:</b> Dies beeinflusst nicht Nachrichten, die auf anderen Geräten oder Servern gespeichert sind.</string> @@ -78,6 +80,7 @@ <string name="send_unencrypted_message">Normal schreiben…</string> <string name="send_otr_message">OTR-verschlüsselt schreiben…</string> <string name="send_omemo_message">OMEMO-verschlüsselt schreiben…</string> + <string name="send_omemo_x509_message">v\\OMEMO-verschlüsselte Nachricht senden</string> <string name="send_pgp_message">OpenPGP-verschlüsselt schreiben…</string> <string name="your_nick_has_been_changed">Dein Nickname wurde geändert</string> <string name="send_unencrypted">Normal verschicken</string> @@ -118,7 +121,7 @@ <string name="openpgp_error">Fehler mit OpenKeychain</string> <string name="error_decrypting_file">Fehler beim Entschlüsseln der Datei</string> <string name="accept">Annehmen</string> - <string name="error">Ein unbekannter Fehler ist aufgetreten</string> + <string name="error">Ein Fehler ist aufgetreten</string> <string name="pref_grant_presence_updates">Online-Status</string> <string name="pref_grant_presence_updates_summary">Erlaube neu hinzugefügten Kontakten meinen Online-Status zu sehen und frage um Erlaubnis, ihren sehen zu dürfen</string> <string name="subscriptions">Abonnements</string> @@ -207,11 +210,13 @@ <string name="your_fingerprint">Dein Fingerabdruck</string> <string name="otr_fingerprint">OTR-Fingerabdruck</string> <string name="omemo_fingerprint">OMEMO-Fingerabdruck</string> + <string name="omemo_fingerprint_x509">v\\OMEMO-Fingerabdruck</string> <string name="omemo_fingerprint_selected_message">OMEMO-Fingerabdruck der Nachricht</string> + <string name="omemo_fingerprint_x509_selected_message">v\\OMEMO-Fingerabdruck der Nachricht</string> <string name="this_device_omemo_fingerprint">Eigener OMEMO-Fingerabdruck</string> <string name="other_devices">Andere Geräte</string> <string name="trust_omemo_fingerprints">OMEMO-Fingerabdruck vertrauen</string> - <string name="fetching_keys">Schlüssel abrufen…</string> + <string name="fetching_keys">Schlüssel empfangen…</string> <string name="done">Erledigt</string> <string name="verify">Überprüfen</string> <string name="decrypt">Entschlüsseln</string> @@ -249,7 +254,7 @@ <string name="error_publish_avatar_no_server_support">Dein Server unterstützt die Veröffentlichung von Avataren nicht.</string> <string name="private_message">private Nachricht:</string> <string name="private_message_to">privat an %s:</string> - <string name="send_private_message_to">Sende private Nachricht an %s…</string> + <string name="send_private_message_to">Private Nachricht an %s senden…</string> <string name="connect">Verbinden</string> <string name="account_already_exists">Das Konto existiert bereits</string> <string name="next">Weiter</string> @@ -284,7 +289,7 @@ <string name="title_pref_enable_quiet_hours">Ruhige Stunden aktivieren</string> <string name="pref_quiet_hours_summary">Benachrichtigungen sind während der ruhigen Stunden stumm.</string> <string name="pref_use_larger_font">Schrift vergrößern</string> - <string name="pref_use_larger_font_summary">Größere Schrift verwenden</string> + <string name="pref_use_larger_font_summary">Größere Schriften für die gesamte App verwenden</string> <string name="pref_use_send_button_to_indicate_status">\"Senden\"-Schaltfläche zeigt Online-Status an</string> <string name="pref_use_indicate_received">Empfangsbestätigungen anfragen</string> <string name="pref_use_indicate_received_summary">Empfangene Nachrichten werden mit einem grünen Häkchen markiert. Bitte beachte, dass dies nicht in allen Fällen funktioniert.</string> @@ -332,18 +337,21 @@ <string name="smp_requested">Kontakt fordert eine Überprüfung an</string> <string name="no_otr_session_found">Keine gültige OTR-Sitzung gefunden!</string> <string name="conversations_foreground_service">Pix-Art Messenger</string> - <string name="pref_keep_foreground_service">Den Dienst im Vordergrund ausführen.</string> + <string name="pref_keep_foreground_service">Dienst im Vordergrund ausführen.</string> <string name="pref_keep_foreground_service_summary">Verhindert, dass Android Pix-Art Messenger beendet und die Verbindung unterbricht</string> + <string name="pref_export_logs">Chats exportieren</string> + <string name="pref_export_logs_summary">Chats auf SD-Karte schreiben</string> + <string name="notification_export_logs_title">Chats werden auf SD-Karte geschrieben</string> <string name="choose_file">Datei auswählen</string> <string name="receiving_x_file">Empfange %1$s (%2$d%% abgeschlossen)</string> <string name="download_x_file">%s herunterladen</string> <string name="file">Datei</string> <string name="open_x_file">%s öffnen</string> <string name="sending_file">Senden (%1$d%% abgeschlossen)</string> - <string name="preparing_file">Datei wird für den Versand vorbereitet</string> + <string name="preparing_file">Datei wird für die Übertragung vorbereitet</string> <string name="x_file_offered_for_download">%s zum Herunterladen angeboten</string> - <string name="cancel_transmission">Datei-Übertragung abbrechen</string> - <string name="file_transmission_failed">Datei-Übertragung fehlgeschlagen</string> + <string name="cancel_transmission">Übertragung abbrechen</string> + <string name="file_transmission_failed">Übertragung fehlgeschlagen</string> <string name="file_deleted">Datei wurde gelöscht</string> <string name="no_application_found_to_open_file">Keine Anwendung zum Öffnen der Datei gefunden</string> <string name="could_not_verify_fingerprint">Fingerabdruck konnte nicht überprüft werden</string> @@ -353,7 +361,7 @@ <string name="pref_show_dynamic_tags_summary">Schreibgeschütze Tags unterhalb der Kontakte anzeigen</string> <string name="enable_notifications">Benachrichtigungen aktivieren</string> <string name="conference_with">Konferenz erstellen mit…</string> - <string name="no_conference_server_found">Konferenz-Server kann nicht gefunden werden</string> + <string name="no_conference_server_found">Kein Konferenz-Server gefunden</string> <string name="conference_creation_failed">Erstellen der Konferenz fehlgeschlagen!</string> <string name="conference_created">Konferenz erstellt!</string> <string name="secret_accepted">Schlüssel akzeptiert!</string> @@ -431,8 +439,8 @@ <string name="apk">Android App</string> <string name="vcard">Kontakt</string> <string name="received_x_file">%s empfangen</string> - <string name="disable_foreground_service">Vordergrund-Dienst beenden</string> <string name="touch_to_open_conversations">Antippen, um Pix-Art Messenger zu öffnen</string> + <string name="disable_foreground_service">Vordergrund-Dienst deaktivieren</string> <string name="avatar_has_been_published">Avatar wurde gespeichert</string> <string name="sending_x_file">%s wird gesendet</string> <string name="offering_x_file">%s wird angeboten</string> @@ -494,17 +502,18 @@ <string name="download_started">Download gestartet</string> <string name="no_update_available">Kein Update verfügbar</string> <string name="account_status_dns_timeout">Zeitüberschreitung bei der Namensauflösung</string> + <string name="account_status_tor_unavailable">TOR-Netzwerk nicht verfügbar</string> <string name="server_info_broken">Fehlerhaft</string> <string name="update_info">Conversation prüft auf eine neuere Version. Wenn ein Update verfügbar ist, wirst du gefragt, ob du deine Version aktualisieren möchtest. Der Update Dienst lädt und installiert die neue Version automatisch.</string> <string name="notification_export_logs_title">Schreibe Chats auf SD Karte</string> <string name="pref_export_logs">Exportiere Chats</string> <string name="pref_export_logs_summary">Schreibe Chats auf SD Karte</string> <string name="pref_presence_settings">Status Einstellungen</string> - <string name="pref_away_when_screen_off">Abwesend</string> - <string name="pref_away_when_screen_off_summary">Setze deinen Status auf abwesend, wenn dein Bildschirm abgeschaltet ist</string> - <string name="pref_xa_on_silent_mode">Nicht verfügbar</string> - <string name="pref_xa_on_silent_mode_summary">Setze deinen Status auf nicht verfügbar, wenn dein Gerät stumm geschaltet ist</string> - <string name="action_add_account_with_certificate">Kontakt mit Zertifikat hinzufügen</string> + <string name="pref_away_when_screen_off">Abwesend bei abgeschaltetem Bildschirm</string> + <string name="pref_away_when_screen_off_summary">Setzt deinen Status auf \"abwesend\", solange dein Bildschirm abgeschaltet ist</string> + <string name="pref_xa_on_silent_mode">Nicht verfügbar bei Stummschaltung</string> + <string name="pref_xa_on_silent_mode_summary">Setzt deinen Status auf \"nicht verfügbar\", solange dein Gerät stummgeschaltet ist</string> + <string name="action_add_account_with_certificate">Konto mit Zertifikat hinzufügen</string> <string name="unable_to_parse_certificate">Zertifikat kann nicht gelesen werden</string> <string name="authenticate_with_certificate">Leer lassen, um mit Zertifikat anzumelden</string> <string name="captcha_ocr">Captcha Text</string> @@ -547,5 +556,20 @@ <string name="shared_image_with_x">Mit %s geteiltes Bild</string> <string name="sync_with_contacts">Mit Kontakten synchronisieren</string> <string name="sync_with_contacts_long">Pix-Art Messenger möchte deine Chat-Kontaktliste mit deinem Telefon-Kontakten abgleichen, um vollständige Namen und Avatare anzuzeigen.\n\nPix-Art Messenger wird deine Kontakte nur lokal lesen und abgleichen und benötigt keinen Abgleich mit dem Server.\n\nDu wirst gefragt, ob du den Zugriff auf deine Kontakte erlauben möchtest.</string> - + <string name="error_fetching_omemo_key">Kann OMEMO Schlüssel nicht empfangen!</string> + <string name="verified_omemo_key_with_certificate">OMEMO Schlüssel mit Zertifikat bestätigt!</string> + <string name="device_does_not_support_certificates">Dein Gerät unterstützt das Auswählen von Client-Zertifikaten nicht!</string> + <string name="pref_connection_options">Verbindungs-Optionen</string> + <string name="pref_use_tor">Mit TOR verbinden</string> + <string name="pref_use_tor_summary">Alle Verbindungen über das TOR-Netzwerk tunneln. Benötigt Orbot</string> + <string name="account_settings_hostname">Hostname</string> + <string name="account_settings_port">Port</string> + <string name="hostname_or_onion">Server- oder .onion-Adresse</string> + <string name="not_a_valid_port">Dies ist keine gültige Port-Nummer</string> + <string name="not_valid_hostname">Dies ist kein gültiger Hostname</string> + <string name="connected_accounts">%1$d von %2$d Konten verbunden</string> + <plurals name="x_messages"> + <item quantity="one">%d Nachricht</item> + <item quantity="other">%d Nachrichten</item> + </plurals> </resources> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 8146b8349..e2d4e6a0c 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -316,7 +316,8 @@ \n\nhttps://github.com/kyleduo/SwitchButton\n(Apache License, Version 2.0) \n\nhttps://github.com/WhisperSystems/libaxolotl-java\n(GPLv3) \n\nhttps://github.com/vinc3m1/RoundedImageView\n(Apache License, Version 2.0) - \n\nhttps://github.com/jdamcd/android-crop\n(Apache License, Version 2.0)</string> + \n\nhttps://github.com/jdamcd/android-crop\n(Apache License, Version 2.0) + </string> <string name="title_pref_quiet_hours">Quiet Hours</string> <string name="title_pref_quiet_hours_start_time">Start time</string> <string name="title_pref_quiet_hours_end_time">End time</string> @@ -578,5 +579,5 @@ <string name="shared_image_with_x">Shared image with %s</string> <string name="no_storage_permission">Pix-Art Messenger needs access to external storage</string> <string name="sync_with_contacts">Synchronize with contacts</string> - <string name="sync_with_contacts_long">Conversations wants to match your XMPP roster with your contacts to show their full names and avatars.\n\nConversations will only read your contacts and match them locally without uploading them to your server.\n\nYou will now be asked to grant permission to access your contacts.</string> + <string name="sync_with_contacts_long">Pix-Art Messenger wants to match your XMPP roster with your contacts to show their full names and avatars.\n\nPix-Art Messenger will only read your contacts and match them locally without uploading them to your server.\n\nYou will now be asked to grant permission to access your contacts.</string> </resources> |