aboutsummaryrefslogtreecommitdiffstats
path: root/src/main
diff options
context:
space:
mode:
authorChristian S <christian@pix-art.de>2015-10-16 21:48:33 +0200
committerChristian S <christian@pix-art.de>2015-10-16 21:48:33 +0200
commit662b9e60da4605d954c50d80f12e348723b5c61e (patch)
tree1588b44c16ef0aa7ffe26be9f93feb19b91bf906 /src/main
parent98c15fbc50f5f08a569355742e4d22b739151405 (diff)
parentc1716a35e359cf9b2e8d1b75cc4f0bac413bee5b (diff)
Merge remote-tracking branch 'siacs/master' into development
Diffstat (limited to 'src/main')
-rw-r--r--src/main/java/eu/siacs/conversations/Config.java4
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/XmppDomainVerifier.java127
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java114
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/axolotl/SQLiteAxolotlStore.java1
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/External.java29
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java2
-rw-r--r--src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java3
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Account.java16
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Conversation.java28
-rw-r--r--src/main/java/eu/siacs/conversations/entities/Message.java16
-rw-r--r--src/main/java/eu/siacs/conversations/generator/IqGenerator.java31
-rw-r--r--src/main/java/eu/siacs/conversations/parser/MessageParser.java2
-rw-r--r--src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java6
-rw-r--r--src/main/java/eu/siacs/conversations/services/NotificationService.java40
-rw-r--r--src/main/java/eu/siacs/conversations/services/XmppConnectionService.java185
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ConversationActivity.java3
-rw-r--r--src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java195
-rw-r--r--src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java45
-rw-r--r--src/main/java/eu/siacs/conversations/ui/UiCallback.java6
-rw-r--r--src/main/java/eu/siacs/conversations/ui/XmppActivity.java14
-rw-r--r--src/main/java/eu/siacs/conversations/ui/adapter/KnownHostsAdapter.java7
-rw-r--r--src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java2
-rw-r--r--src/main/java/eu/siacs/conversations/utils/CryptoHelper.java19
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java197
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jid/Jid.java4
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java3
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jingle/OnFileTransmissionStatusChanged.java4
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jingle/OnJinglePacketReceived.java2
-rw-r--r--src/main/java/eu/siacs/conversations/xmpp/jingle/OnPrimaryCandidateFound.java3
-rw-r--r--src/main/res/menu/editaccount.xml7
-rw-r--r--src/main/res/menu/manageaccounts.xml6
-rw-r--r--src/main/res/values-ar-rEG/strings.xml315
-rw-r--r--src/main/res/values-ar-rSY/strings.xml2
-rw-r--r--src/main/res/values-ar/strings.xml315
-rw-r--r--src/main/res/values-bg/strings.xml21
-rw-r--r--src/main/res/values-ca/strings.xml1
-rw-r--r--src/main/res/values-cs/strings.xml1
-rw-r--r--src/main/res/values-de/strings.xml152
-rw-r--r--src/main/res/values-el/strings.xml1
-rw-r--r--src/main/res/values-es/strings.xml20
-rw-r--r--src/main/res/values-eu/strings.xml1
-rw-r--r--src/main/res/values-fr/strings.xml1
-rw-r--r--src/main/res/values-gl/strings.xml1
-rw-r--r--src/main/res/values-id/strings.xml1
-rw-r--r--src/main/res/values-it/strings.xml1
-rw-r--r--src/main/res/values-iw/strings.xml406
-rw-r--r--src/main/res/values-ja/strings.xml1
-rw-r--r--src/main/res/values-ko/strings.xml1
-rw-r--r--src/main/res/values-nb-rNO/strings.xml182
-rw-r--r--src/main/res/values-nl/strings.xml1
-rw-r--r--src/main/res/values-pl/strings.xml16
-rw-r--r--src/main/res/values-pt/strings.xml1
-rw-r--r--src/main/res/values-ro-rRO/strings.xml1
-rw-r--r--src/main/res/values-ru/strings.xml1
-rw-r--r--src/main/res/values-sk/strings.xml1
-rw-r--r--src/main/res/values-sr/strings.xml1
-rw-r--r--src/main/res/values-sv/strings.xml1
-rw-r--r--src/main/res/values-zh-rCN/strings.xml1
-rw-r--r--src/main/res/values-zh-rTW/strings.xml1
-rw-r--r--src/main/res/values/strings.xml16
60 files changed, 1910 insertions, 675 deletions
diff --git a/src/main/java/eu/siacs/conversations/Config.java b/src/main/java/eu/siacs/conversations/Config.java
index 5468819d3..45be9e1b0 100644
--- a/src/main/java/eu/siacs/conversations/Config.java
+++ b/src/main/java/eu/siacs/conversations/Config.java
@@ -49,6 +49,10 @@ public final class Config {
public static final boolean SHOW_REGENERATE_AXOLOTL_KEYS_BUTTON = false;
+ public static final boolean X509_VERIFICATION = false; //use x509 certificates to verify OMEMO keys
+
+ public static final boolean IGNORE_ID_REWRITE_IN_MUC = true;
+
public static final long MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000;
public static final long MAM_MAX_CATCHUP = MILLISECONDS_IN_DAY / 2;
public static final int MAM_MAX_MESSAGES = 500;
diff --git a/src/main/java/eu/siacs/conversations/crypto/XmppDomainVerifier.java b/src/main/java/eu/siacs/conversations/crypto/XmppDomainVerifier.java
new file mode 100644
index 000000000..1fca865ed
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/crypto/XmppDomainVerifier.java
@@ -0,0 +1,127 @@
+package eu.siacs.conversations.crypto;
+
+import android.util.Log;
+import android.util.Pair;
+
+import org.bouncycastle.asn1.ASN1Primitive;
+import org.bouncycastle.asn1.DERIA5String;
+import org.bouncycastle.asn1.DERTaggedObject;
+import org.bouncycastle.asn1.DERUTF8String;
+import org.bouncycastle.asn1.DLSequence;
+import org.bouncycastle.asn1.x500.RDN;
+import org.bouncycastle.asn1.x500.X500Name;
+import org.bouncycastle.asn1.x500.style.BCStyle;
+import org.bouncycastle.asn1.x500.style.IETFUtils;
+import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
+
+import java.io.IOException;
+import java.security.cert.Certificate;
+import java.security.cert.X509Certificate;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.SSLSession;
+
+public class XmppDomainVerifier implements HostnameVerifier {
+
+ private static final String LOGTAG = "XmppDomainVerifier";
+
+ private final String SRVName = "1.3.6.1.5.5.7.8.7";
+ private final String xmppAddr = "1.3.6.1.5.5.7.8.5";
+
+ @Override
+ public boolean verify(String domain, SSLSession sslSession) {
+ try {
+ Certificate[] chain = sslSession.getPeerCertificates();
+ if (chain.length == 0 || !(chain[0] instanceof X509Certificate)) {
+ return false;
+ }
+ X509Certificate certificate = (X509Certificate) chain[0];
+ Collection<List<?>> alternativeNames = certificate.getSubjectAlternativeNames();
+ List<String> xmppAddrs = new ArrayList<>();
+ List<String> srvNames = new ArrayList<>();
+ List<String> domains = new ArrayList<>();
+ if (alternativeNames != null) {
+ for (List<?> san : alternativeNames) {
+ Integer type = (Integer) san.get(0);
+ if (type == 0) {
+ Pair<String, String> otherName = parseOtherName((byte[]) san.get(1));
+ if (otherName != null) {
+ switch (otherName.first) {
+ case SRVName:
+ srvNames.add(otherName.second);
+ break;
+ case xmppAddr:
+ xmppAddrs.add(otherName.second);
+ break;
+ default:
+ Log.d(LOGTAG, "oid: " + otherName.first + " value: " + otherName.second);
+ }
+ }
+ } else if (type == 2) {
+ Object value = san.get(1);
+ if (value instanceof String) {
+ domains.add((String) value);
+ }
+ }
+ }
+ }
+ if (srvNames.size() == 0 && xmppAddrs.size() == 0 && domains.size() == 0) {
+ X500Name x500name = new JcaX509CertificateHolder(certificate).getSubject();
+ RDN[] rdns = x500name.getRDNs(BCStyle.CN);
+ for (int i = 0; i < rdns.length; ++i) {
+ domains.add(IETFUtils.valueToString(x500name.getRDNs(BCStyle.CN)[i].getFirst().getValue()));
+ }
+ }
+ Log.d(LOGTAG, "searching for " + domain + " in srvNames: " + srvNames + " xmppAddrs: " + xmppAddrs + " domains:" + domains);
+ return xmppAddrs.contains(domain) || srvNames.contains("_xmpp-client." + domain) || matchDomain(domain, domains);
+ } catch (Exception e) {
+ return false;
+ }
+ }
+
+ private static Pair<String, String> parseOtherName(byte[] otherName) {
+ try {
+ ASN1Primitive asn1Primitive = ASN1Primitive.fromByteArray(otherName);
+ if (asn1Primitive instanceof DERTaggedObject) {
+ ASN1Primitive inner = ((DERTaggedObject) asn1Primitive).getObject();
+ if (inner instanceof DLSequence) {
+ DLSequence sequence = (DLSequence) inner;
+ if (sequence.size() >= 2 && sequence.getObjectAt(1) instanceof DERTaggedObject) {
+ String oid = sequence.getObjectAt(0).toString();
+ ASN1Primitive value = ((DERTaggedObject) sequence.getObjectAt(1)).getObject();
+ if (value instanceof DERUTF8String) {
+ return new Pair<>(oid, ((DERUTF8String) value).getString());
+ } else if (value instanceof DERIA5String) {
+ return new Pair<>(oid, ((DERIA5String) value).getString());
+ }
+ }
+ }
+ }
+ return null;
+ } catch (IOException e) {
+ return null;
+ }
+ }
+
+ private static boolean matchDomain(String needle, List<String> haystack) {
+ for (String entry : haystack) {
+ if (entry.startsWith("*.")) {
+ int i = needle.indexOf('.');
+ Log.d(LOGTAG, "comparing " + needle.substring(i) + " and " + entry.substring(1));
+ if (i != -1 && needle.substring(i).equals(entry.substring(1))) {
+ Log.d(LOGTAG, "domain " + needle + " matched " + entry);
+ return true;
+ }
+ } else {
+ if (entry.equals(needle)) {
+ Log.d(LOGTAG, "domain " + needle + " matched " + entry);
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java
index 70de2777d..58e5a0957 100644
--- a/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java
+++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/AxolotlService.java
@@ -1,5 +1,7 @@
package eu.siacs.conversations.crypto.axolotl;
+import android.security.KeyChain;
+import android.security.KeyChainException;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.util.Log;
@@ -18,7 +20,12 @@ import org.whispersystems.libaxolotl.state.PreKeyRecord;
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
import org.whispersystems.libaxolotl.util.KeyHelper;
+import java.security.NoSuchAlgorithmException;
+import java.security.PrivateKey;
import java.security.Security;
+import java.security.Signature;
+import java.security.SignatureException;
+import java.security.cert.X509Certificate;
import java.util.Arrays;
import java.util.HashMap;
import java.util.HashSet;
@@ -46,6 +53,7 @@ public class AxolotlService {
public static final String PEP_PREFIX = "eu.siacs.conversations.axolotl";
public static final String PEP_DEVICE_LIST = PEP_PREFIX + ".devicelist";
public static final String PEP_BUNDLES = PEP_PREFIX + ".bundles";
+ public static final String PEP_VERIFICATION = PEP_PREFIX + ".verification";
public static final String LOGPREFIX = "AxolotlService";
@@ -140,9 +148,6 @@ public class AxolotlService {
putDevicesForJid(account.getJid().toBareJid().toString(), deviceIds, store);
for (Contact contact : account.getRoster().getContacts()) {
Jid bareJid = contact.getJid().toBareJid();
- if (bareJid == null) {
- continue; // FIXME: handle this?
- }
String address = bareJid.toString();
deviceIds = store.getSubDeviceSessions(address);
putDevicesForJid(address, deviceIds, store);
@@ -162,7 +167,7 @@ public class AxolotlService {
}
}
- private static enum FetchStatus {
+ private enum FetchStatus {
PENDING,
SUCCESS,
ERROR
@@ -212,14 +217,12 @@ public class AxolotlService {
private Set<XmppAxolotlSession> findOwnSessions() {
AxolotlAddress ownAddress = getAddressForJid(account.getJid().toBareJid());
- Set<XmppAxolotlSession> ownDeviceSessions = new HashSet<>(this.sessions.getAll(ownAddress).values());
- return ownDeviceSessions;
+ return new HashSet<>(this.sessions.getAll(ownAddress).values());
}
private Set<XmppAxolotlSession> findSessionsforContact(Contact contact) {
AxolotlAddress contactAddress = getAddressForJid(contact.getJid());
- Set<XmppAxolotlSession> sessions = new HashSet<>(this.sessions.getAll(contactAddress).values());
- return sessions;
+ return new HashSet<>(this.sessions.getAll(contactAddress).values());
}
public Set<String> getFingerprintsForOwnSessions() {
@@ -247,11 +250,11 @@ public class AxolotlService {
return this.pepBroken;
}
- public void regenerateKeys() {
+ public void regenerateKeys(boolean wipeOther) {
axolotlStore.regenerate();
sessions.clear();
fetchStatusMap.clear();
- publishBundlesIfNeeded(true);
+ publishBundlesIfNeeded(true, wipeOther);
}
public int getOwnDeviceId() {
@@ -385,7 +388,33 @@ public class AxolotlService {
}
}
- public void publishBundlesIfNeeded(final boolean announceAfter) {
+ public void publishDeviceVerificationAndBundle(final SignedPreKeyRecord signedPreKeyRecord,
+ final Set<PreKeyRecord> preKeyRecords,
+ final boolean announceAfter,
+ final boolean wipe) {
+ try {
+ IdentityKey axolotlPublicKey = axolotlStore.getIdentityKeyPair().getPublicKey();
+ PrivateKey x509PrivateKey = KeyChain.getPrivateKey(mXmppConnectionService, account.getPrivateKeyAlias());
+ X509Certificate[] chain = KeyChain.getCertificateChain(mXmppConnectionService, account.getPrivateKeyAlias());
+ Signature verifier = Signature.getInstance("sha256WithRSA");
+ verifier.initSign(x509PrivateKey,mXmppConnectionService.getRNG());
+ verifier.update(axolotlPublicKey.serialize());
+ byte[] signature = verifier.sign();
+ IqPacket packet = mXmppConnectionService.getIqGenerator().publishVerification(signature, chain, getOwnDeviceId());
+ Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + ": publish verification for device "+getOwnDeviceId());
+ Log.d(Config.LOGTAG,"verification : "+packet.toString());
+ mXmppConnectionService.sendIqPacket(account, packet, new OnIqPacketReceived() {
+ @Override
+ public void onIqPacketReceived(Account account, IqPacket packet) {
+ publishDeviceBundle(signedPreKeyRecord, preKeyRecords, announceAfter, wipe);
+ }
+ });
+ } catch (Exception e) {
+ e.printStackTrace();
+ }
+ }
+
+ public void publishBundlesIfNeeded(final boolean announce, final boolean wipe) {
if (pepBroken) {
Log.d(Config.LOGTAG, getLogprefix(account) + "publishBundlesIfNeeded called, but PEP is broken. Ignoring... ");
return;
@@ -475,44 +504,56 @@ public class AxolotlService {
if (changed) {
- IqPacket publish = mXmppConnectionService.getIqGenerator().publishBundles(
- signedPreKeyRecord, axolotlStore.getIdentityKeyPair().getPublicKey(),
- preKeyRecords, getOwnDeviceId());
- Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + ": Bundle " + getOwnDeviceId() + " in PEP not current. Publishing: " + publish);
- mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
- @Override
- public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.getType() == IqPacket.TYPE.RESULT) {
- Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Successfully published bundle. ");
- if (announceAfter) {
- Log.d(Config.LOGTAG, getLogprefix(account) + "Announcing device " + getOwnDeviceId());
- publishOwnDeviceIdIfNeeded();
- }
- } else {
- Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing bundle: " + packet.findChild("error"));
- }
- }
- });
+ if (account.getPrivateKeyAlias() != null && Config.X509_VERIFICATION) {
+ publishDeviceVerificationAndBundle(signedPreKeyRecord, preKeyRecords, announce, wipe);
+ } else {
+ publishDeviceBundle(signedPreKeyRecord, preKeyRecords, announce, wipe);
+ }
} else {
Log.d(Config.LOGTAG, getLogprefix(account) + "Bundle " + getOwnDeviceId() + " in PEP was current");
- if (announceAfter) {
+ if (wipe) {
+ wipeOtherPepDevices();
+ } else if (announce) {
Log.d(Config.LOGTAG, getLogprefix(account) + "Announcing device " + getOwnDeviceId());
publishOwnDeviceIdIfNeeded();
}
}
} catch (InvalidKeyException e) {
Log.e(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Failed to publish bundle " + getOwnDeviceId() + ", reason: " + e.getMessage());
- return;
}
}
});
}
- public boolean isContactAxolotlCapable(Contact contact) {
+ private void publishDeviceBundle(SignedPreKeyRecord signedPreKeyRecord,
+ Set<PreKeyRecord> preKeyRecords,
+ final boolean announceAfter,
+ final boolean wipe) {
+ IqPacket publish = mXmppConnectionService.getIqGenerator().publishBundles(
+ signedPreKeyRecord, axolotlStore.getIdentityKeyPair().getPublicKey(),
+ preKeyRecords, getOwnDeviceId());
+ Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + ": Bundle " + getOwnDeviceId() + " in PEP not current. Publishing: " + publish);
+ mXmppConnectionService.sendIqPacket(account, publish, new OnIqPacketReceived() {
+ @Override
+ public void onIqPacketReceived(Account account, IqPacket packet) {
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ Log.d(Config.LOGTAG, AxolotlService.getLogprefix(account) + "Successfully published bundle. ");
+ if (wipe) {
+ wipeOtherPepDevices();
+ } else if (announceAfter) {
+ Log.d(Config.LOGTAG, getLogprefix(account) + "Announcing device " + getOwnDeviceId());
+ publishOwnDeviceIdIfNeeded();
+ }
+ } else {
+ Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while publishing bundle: " + packet.findChild("error"));
+ }
+ }
+ });
+ }
+ public boolean isContactAxolotlCapable(Contact contact) {
Jid jid = contact.getJid().toBareJid();
- AxolotlAddress address = new AxolotlAddress(jid.toString(), 0);
- return sessions.hasAny(address) ||
+ return hasAny(contact) ||
(deviceIds.containsKey(jid) && !deviceIds.get(jid).isEmpty());
}
@@ -587,7 +628,6 @@ public class AxolotlService {
fetchStatusMap.put(address, FetchStatus.ERROR);
Log.d(Config.LOGTAG, getLogprefix(account) + "Error received while building session:" + packet.findChild("error"));
finish();
- return;
}
}
});
@@ -781,7 +821,7 @@ public class AxolotlService {
plaintextMessage = message.decrypt(session, getOwnDeviceId());
Integer preKeyId = session.getPreKeyId();
if (preKeyId != null) {
- publishBundlesIfNeeded(false);
+ publishBundlesIfNeeded(false, false);
session.resetPreKeyId();
}
} catch (CryptoFailedException e) {
@@ -796,7 +836,7 @@ public class AxolotlService {
}
public XmppAxolotlMessage.XmppAxolotlKeyTransportMessage processReceivingKeyTransportMessage(XmppAxolotlMessage message) {
- XmppAxolotlMessage.XmppAxolotlKeyTransportMessage keyTransportMessage = null;
+ XmppAxolotlMessage.XmppAxolotlKeyTransportMessage keyTransportMessage;
XmppAxolotlSession session = getReceivingSession(message);
keyTransportMessage = message.getParameters(session, getOwnDeviceId());
diff --git a/src/main/java/eu/siacs/conversations/crypto/axolotl/SQLiteAxolotlStore.java b/src/main/java/eu/siacs/conversations/crypto/axolotl/SQLiteAxolotlStore.java
index 4d7793023..a78317183 100644
--- a/src/main/java/eu/siacs/conversations/crypto/axolotl/SQLiteAxolotlStore.java
+++ b/src/main/java/eu/siacs/conversations/crypto/axolotl/SQLiteAxolotlStore.java
@@ -88,7 +88,6 @@ public class SQLiteAxolotlStore implements AxolotlStore {
// --------------------------------------
private IdentityKeyPair loadIdentityKeyPair() {
- String ownName = account.getJid().toBareJid().toString();
IdentityKeyPair ownKey = mXmppConnectionService.databaseBackend.loadOwnIdentityKeyPair(account);
if (ownKey != null) {
diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/External.java b/src/main/java/eu/siacs/conversations/crypto/sasl/External.java
new file mode 100644
index 000000000..df92898c1
--- /dev/null
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/External.java
@@ -0,0 +1,29 @@
+package eu.siacs.conversations.crypto.sasl;
+
+import android.util.Base64;
+import java.security.SecureRandom;
+
+import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.xml.TagWriter;
+
+public class External extends SaslMechanism {
+
+ public External(TagWriter tagWriter, Account account, SecureRandom rng) {
+ super(tagWriter, account, rng);
+ }
+
+ @Override
+ public int getPriority() {
+ return 25;
+ }
+
+ @Override
+ public String getMechanism() {
+ return "EXTERNAL";
+ }
+
+ @Override
+ public String getClientFirstMessage() {
+ return Base64.encodeToString(account.getJid().toBareJid().toString().getBytes(),Base64.NO_WRAP);
+ }
+}
diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java b/src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java
index 14d8b944b..5b4b99efb 100644
--- a/src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/SaslMechanism.java
@@ -11,7 +11,7 @@ public abstract class SaslMechanism {
final protected Account account;
final protected SecureRandom rng;
- protected static enum State {
+ protected enum State {
INITIAL,
AUTH_TEXT_SENT,
RESPONSE_SENT,
diff --git a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java
index f47677f6e..3a05446c1 100644
--- a/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java
+++ b/src/main/java/eu/siacs/conversations/crypto/sasl/ScramSha1.java
@@ -21,7 +21,6 @@ public class ScramSha1 extends SaslMechanism {
// TODO: When channel binding (SCRAM-SHA1-PLUS) is supported in future, generalize this to indicate support and/or usage.
final private static String GS2_HEADER = "n,,";
private String clientFirstMessageBare;
- private byte[] serverFirstMessage;
final private String clientNonce;
private byte[] serverSignature = null;
private static HMac HMAC;
@@ -104,7 +103,7 @@ public class ScramSha1 extends SaslMechanism {
if (challenge == null) {
throw new AuthenticationException("challenge can not be null");
}
- serverFirstMessage = Base64.decode(challenge, Base64.DEFAULT);
+ byte[] serverFirstMessage = Base64.decode(challenge, Base64.DEFAULT);
final Tokenizer tokenizer = new Tokenizer(serverFirstMessage);
String nonce = "";
int iterationCount = -1;
diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java
index 002c276e2..0eb38c9fd 100644
--- a/src/main/java/eu/siacs/conversations/entities/Account.java
+++ b/src/main/java/eu/siacs/conversations/entities/Account.java
@@ -194,18 +194,14 @@ public class Account extends AbstractEntity {
return jid.getLocalpart();
}
- public void setUsername(final String username) throws InvalidJidException {
- jid = Jid.fromParts(username, jid.getDomainpart(), jid.getResourcepart());
+ public void setJid(final Jid jid) {
+ this.jid = jid;
}
public Jid getServer() {
return jid.toDomainJid();
}
- public void setServer(final String server) throws InvalidJidException {
- jid = Jid.fromParts(jid.getLocalpart(), server, jid.getResourcepart());
- }
-
public String getPassword() {
return password;
}
@@ -272,6 +268,14 @@ public class Account extends AbstractEntity {
}
}
+ public boolean setPrivateKeyAlias(String alias) {
+ return setKey("private_key_alias", alias);
+ }
+
+ public String getPrivateKeyAlias() {
+ return getKey("private_key_alias");
+ }
+
@Override
public ContentValues getContentValues() {
final ContentValues values = new ContentValues();
diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java
index 8ffc44141..c9cfb9b35 100644
--- a/src/main/java/eu/siacs/conversations/entities/Conversation.java
+++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java
@@ -112,6 +112,16 @@ public class Conversation extends AbstractEntity implements Blockable {
}
}
+ public void findUnreadMessages(OnMessageFound onMessageFound) {
+ synchronized (this.messages) {
+ for(Message message : this.messages) {
+ if (!message.isRead()) {
+ onMessageFound.onMessageFound(message);
+ }
+ }
+ }
+ }
+
public void findMessagesWithFiles(final OnMessageFound onMessageFound) {
synchronized (this.messages) {
for (final Message message : this.messages) {
@@ -267,9 +277,8 @@ public class Conversation extends AbstractEntity implements Blockable {
}
}
-
public interface OnMessageFound {
- public void onMessageFound(final Message message);
+ void onMessageFound(final Message message);
}
public Conversation(final String name, final Account account, final Jid contactJid,
@@ -302,13 +311,18 @@ public class Conversation extends AbstractEntity implements Blockable {
return (this.messages.size() == 0) || this.messages.get(this.messages.size() - 1).isRead();
}
- public void markRead() {
- for (int i = this.messages.size() - 1; i >= 0; --i) {
- if (messages.get(i).isRead()) {
- break;
+ public List<Message> markRead() {
+ final List<Message> unread = new ArrayList<>();
+ synchronized (this.messages) {
+ for (int i = this.messages.size() - 1; i >= 0; --i) {
+ if (this.messages.get(i).isRead()) {
+ break;
+ }
+ this.messages.get(i).markRead();
+ unread.add(this.messages.get(i));
}
- this.messages.get(i).markRead();
}
+ return unread;
}
public Message getLatestMarkableMessage() {
diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java
index bfb26446d..36cc0842f 100644
--- a/src/main/java/eu/siacs/conversations/entities/Message.java
+++ b/src/main/java/eu/siacs/conversations/entities/Message.java
@@ -56,6 +56,7 @@ public class Message extends AbstractEntity {
public static final String SERVER_MSG_ID = "serverMsgId";
public static final String RELATIVE_FILE_PATH = "relativeFilePath";
public static final String FINGERPRINT = "axolotl_fingerprint";
+ public static final String READ = "read";
public static final String ME_COMMAND = "/me ";
@@ -87,11 +88,8 @@ public class Message extends AbstractEntity {
public Message(Conversation conversation, String body, int encryption) {
this(conversation, body, encryption, STATUS_UNSEND);
}
- public Message(Conversation conversation, String body, int encryption, int status) {
- this(conversation, body, encryption, status, false);
- }
- public Message(Conversation conversation, String body, int encryption, int status, boolean carbon) {
+ public Message(Conversation conversation, String body, int encryption, int status) {
this(java.util.UUID.randomUUID().toString(),
conversation.getUuid(),
conversation.getJid() == null ? null : conversation.getJid().toBareJid(),
@@ -105,7 +103,8 @@ public class Message extends AbstractEntity {
null,
null,
null,
- null);
+ null,
+ true);
this.conversation = conversation;
}
@@ -113,7 +112,7 @@ public class Message extends AbstractEntity {
final Jid trueCounterpart, final String body, final long timeSent,
final int encryption, final int status, final int type, final boolean carbon,
final String remoteMsgId, final String relativeFilePath,
- final String serverMsgId, final String fingerprint) {
+ final String serverMsgId, final String fingerprint, final boolean read) {
this.uuid = uuid;
this.conversationUuid = conversationUUid;
this.counterpart = counterpart;
@@ -128,6 +127,7 @@ public class Message extends AbstractEntity {
this.relativeFilePath = relativeFilePath;
this.serverMsgId = serverMsgId;
this.axolotlFingerprint = fingerprint;
+ this.read = read;
}
public static Message fromCursor(Cursor cursor) {
@@ -166,7 +166,8 @@ public class Message extends AbstractEntity {
cursor.getString(cursor.getColumnIndex(REMOTE_MSG_ID)),
cursor.getString(cursor.getColumnIndex(RELATIVE_FILE_PATH)),
cursor.getString(cursor.getColumnIndex(SERVER_MSG_ID)),
- cursor.getString(cursor.getColumnIndex(FINGERPRINT)));
+ cursor.getString(cursor.getColumnIndex(FINGERPRINT)),
+ cursor.getInt(cursor.getColumnIndex(READ)) > 0);
}
public static Message createStatusMessage(Conversation conversation, String body) {
@@ -202,6 +203,7 @@ public class Message extends AbstractEntity {
values.put(RELATIVE_FILE_PATH, relativeFilePath);
values.put(SERVER_MSG_ID, serverMsgId);
values.put(FINGERPRINT, axolotlFingerprint);
+ values.put(READ,read);
return values;
}
diff --git a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java
index 42c57b24f..fb69860db 100644
--- a/src/main/java/eu/siacs/conversations/generator/IqGenerator.java
+++ b/src/main/java/eu/siacs/conversations/generator/IqGenerator.java
@@ -2,16 +2,20 @@ package eu.siacs.conversations.generator;
import android.util.Base64;
+import android.util.Log;
import org.whispersystems.libaxolotl.IdentityKey;
import org.whispersystems.libaxolotl.ecc.ECPublicKey;
import org.whispersystems.libaxolotl.state.PreKeyRecord;
import org.whispersystems.libaxolotl.state.SignedPreKeyRecord;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
+import eu.siacs.conversations.Config;
import eu.siacs.conversations.crypto.axolotl.AxolotlService;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
@@ -173,6 +177,23 @@ public class IqGenerator extends AbstractGenerator {
return publish(AxolotlService.PEP_BUNDLES+":"+deviceId, item);
}
+ public IqPacket publishVerification(byte[] signature, X509Certificate[] certificates, final int deviceId) {
+ final Element item = new Element("item");
+ final Element verification = item.addChild("verification", AxolotlService.PEP_PREFIX);
+ final Element chain = verification.addChild("chain");
+ for(int i = 0; i < certificates.length; ++i) {
+ try {
+ Element certificate = chain.addChild("certificate");
+ certificate.setContent(Base64.encodeToString(certificates[i].getEncoded(), Base64.DEFAULT));
+ certificate.setAttribute("index",i);
+ } catch (CertificateEncodingException e) {
+ Log.d(Config.LOGTAG, "could not encode certificate");
+ }
+ }
+ verification.addChild("signature").setContent(Base64.encodeToString(signature, Base64.DEFAULT));
+ return publish(AxolotlService.PEP_VERIFICATION+":"+deviceId, item);
+ }
+
public IqPacket queryMessageArchiveManagement(final MessageArchiveService.Query mam) {
final IqPacket packet = new IqPacket(IqPacket.TYPE.SET);
final Element query = packet.query("urn:xmpp:mam:0");
@@ -266,4 +287,14 @@ public class IqGenerator extends AbstractGenerator {
}
return packet;
}
+
+ public IqPacket generateCreateAccountWithCaptcha(Account account, String id, Data data) {
+ final IqPacket register = new IqPacket(IqPacket.TYPE.SET);
+
+ register.setTo(account.getServer());
+ register.setId(id);
+ register.query("jabber:iq:register").addChild(data);
+
+ return register;
+ }
}
diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
index 4d0577566..c53e50ac4 100644
--- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java
+++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java
@@ -315,7 +315,7 @@ public class MessageParser extends AbstractParser implements
status = Message.STATUS_SEND_RECEIVED;
if (mXmppConnectionService.markMessage(conversation, remoteMsgId, status)) {
return;
- } else if (remoteMsgId == null) {
+ } else if (remoteMsgId == null || Config.IGNORE_ID_REWRITE_IN_MUC) {
Message message = conversation.findSentMessageWithBody(packet.getBody());
if (message != null) {
mXmppConnectionService.markMessage(message, status);
diff --git a/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java b/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java
index be827929c..070713236 100644
--- a/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java
+++ b/src/main/java/eu/siacs/conversations/persistance/DatabaseBackend.java
@@ -43,7 +43,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
private static DatabaseBackend instance = null;
private static final String DATABASE_NAME = "history";
- private static final int DATABASE_VERSION = 17;
+ private static final int DATABASE_VERSION = 18;
private static String CREATE_CONTATCS_STATEMENT = "create table "
+ Contact.TABLENAME + "(" + Contact.ACCOUNT + " TEXT, "
@@ -143,6 +143,7 @@ public class DatabaseBackend extends SQLiteOpenHelper {
+ Message.SERVER_MSG_ID + " TEXT, "
+ Message.FINGERPRINT + " TEXT, "
+ Message.CARBON + " INTEGER, "
+ + Message.READ + " NUMBER DEFAULT 1, "
+ Message.REMOTE_MSG_ID + " TEXT, FOREIGN KEY("
+ Message.CONVERSATION + ") REFERENCES "
+ Conversation.TABLENAME + "(" + Conversation.UUID
@@ -320,6 +321,9 @@ public class DatabaseBackend extends SQLiteOpenHelper {
}
}
}
+ if (oldVersion < 18 && newVersion >= 18) {
+ db.execSQL("ALTER TABLE " + Message.TABLENAME + " ADD COLUMN "+ Message.READ+ " NUMBER DEFAULT 1");
+ }
}
public static synchronized DatabaseBackend getInstance(Context context) {
diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java
index b7c872d48..515e57c85 100644
--- a/src/main/java/eu/siacs/conversations/services/NotificationService.java
+++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java
@@ -1,6 +1,5 @@
package eu.siacs.conversations.services;
-import android.annotation.SuppressLint;
import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
@@ -10,7 +9,6 @@ import android.content.SharedPreferences;
import android.graphics.Bitmap;
import android.net.Uri;
import android.os.Build;
-import android.os.PowerManager;
import android.os.SystemClock;
import android.support.v4.app.NotificationCompat;
import android.support.v4.app.NotificationCompat.BigPictureStyle;
@@ -114,28 +112,42 @@ public class NotificationService {
public boolean conferenceNotificationsEnabled() {
return mXmppConnectionService.getPreferences().getBoolean("always_notify_in_conference", false);
}
-
+
+ public void pushFromBacklog(final Message message) {
+ if (notify(message)) {
+ pushToStack(message);
+ }
+ }
+
+ public void finishBacklog() {
+ synchronized (notifications) {
+ mXmppConnectionService.updateUnreadCountBadge();
+ updateNotification(false);
+ }
+ }
+
+ private void pushToStack(final Message message) {
+ final String conversationUuid = message.getConversationUuid();
+ if (notifications.containsKey(conversationUuid)) {
+ notifications.get(conversationUuid).add(message);
+ } else {
+ final ArrayList<Message> mList = new ArrayList<>();
+ mList.add(message);
+ notifications.put(conversationUuid, mList);
+ }
+ }
+
public void push(final Message message) {
mXmppConnectionService.updateUnreadCountBadge();
if (!notify(message)) {
return;
}
-
final boolean isScreenOn = mXmppConnectionService.isInteractive();
-
if (this.mIsInForeground && isScreenOn && this.mOpenConversation == message.getConversation()) {
return;
}
-
synchronized (notifications) {
- final String conversationUuid = message.getConversationUuid();
- if (notifications.containsKey(conversationUuid)) {
- notifications.get(conversationUuid).add(message);
- } else {
- final ArrayList<Message> mList = new ArrayList<>();
- mList.add(message);
- notifications.put(conversationUuid, mList);
- }
+ pushToStack(message);
final Account account = message.getConversation().getAccount();
final boolean doNotify = (!(this.mIsInForeground && this.mOpenConversation == null) || !isScreenOn)
&& !account.inGracePeriod()
diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
index ddc40d34e..f9f9b71e2 100644
--- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
+++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java
@@ -25,8 +25,12 @@ import android.os.PowerManager.WakeLock;
import android.os.SystemClock;
import android.preference.PreferenceManager;
import android.provider.ContactsContract;
+import android.security.KeyChain;
+import android.security.KeyChainException;
import android.util.Log;
import android.util.LruCache;
+import android.util.DisplayMetrics;
+import android.util.Pair;
import net.java.otr4j.OtrException;
import net.java.otr4j.session.Session;
@@ -34,11 +38,18 @@ import net.java.otr4j.session.SessionID;
import net.java.otr4j.session.SessionImpl;
import net.java.otr4j.session.SessionStatus;
+import org.bouncycastle.asn1.x500.X500Name;
+import org.bouncycastle.asn1.x500.style.BCStyle;
+import org.bouncycastle.asn1.x500.style.IETFUtils;
+import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
import org.openintents.openpgp.util.OpenPgpApi;
import org.openintents.openpgp.util.OpenPgpServiceConnection;
import java.math.BigInteger;
import java.security.SecureRandom;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.CertificateException;
+import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -161,7 +172,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
mMessageArchiveService.executePendingQueries(account);
mJingleConnectionManager.cancelInTransmission();
syncDirtyContacts(account);
- account.getAxolotlService().publishBundlesIfNeeded(true);
+ account.getAxolotlService().publishBundlesIfNeeded(true, false);
}
};
private final OnMessageAcknowledged mOnMessageAcknowledgedListener = new OnMessageAcknowledged() {
@@ -244,6 +255,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
private int showErrorToastListenerCount = 0;
private int unreadCount = -1;
private OnAccountUpdate mOnAccountUpdate = null;
+ private OnCaptchaRequested mOnCaptchaRequested = null;
private OnStatusChanged statusListener = new OnStatusChanged() {
@Override
@@ -302,6 +314,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
};
private int accountChangedListenerCount = 0;
+ private int captchaRequestedListenerCount = 0;
private OnRosterUpdate mOnRosterUpdate = null;
private OnUpdateBlocklist mOnUpdateBlocklist = null;
private int updateBlocklistListenerCount = 0;
@@ -661,6 +674,15 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
@Override
+ public void onTrimMemory(int level) {
+ super.onTrimMemory(level);
+ if (level >= TRIM_MEMORY_COMPLETE) {
+ Log.d(Config.LOGTAG,"clear cache due to low memory");
+ getBitmapCache().evictAll();
+ }
+ }
+
+ @Override
public void onDestroy() {
try {
unregisterReceiver(this.mEventReceiver);
@@ -1059,7 +1081,14 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
for (Conversation conversation : conversations) {
conversation.addAll(0, databaseBackend.getMessages(conversation, Config.PAGE_SIZE));
checkDeletedFiles(conversation);
+ conversation.findUnreadMessages(new Conversation.OnMessageFound() {
+ @Override
+ public void onMessageFound(Message message) {
+ mNotificationService.pushFromBacklog(message);
+ }
+ });
}
+ mNotificationService.finishBacklog();
mRestoredFromDatabase = true;
Log.d(Config.LOGTAG,"restored all messages");
updateConversationUi();
@@ -1285,6 +1314,67 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
updateAccountUi();
}
+ public void createAccountFromKey(final String alias, final OnAccountCreated callback) {
+ new Thread(new Runnable() {
+ @Override
+ public void run() {
+ try {
+ X509Certificate[] chain = KeyChain.getCertificateChain(XmppConnectionService.this, alias);
+ Pair<Jid,String> info = CryptoHelper.extractJidAndName(chain[0]);
+ if (findAccountByJid(info.first) == null) {
+ Account account = new Account(info.first, "");
+ account.setPrivateKeyAlias(alias);
+ account.setOption(Account.OPTION_DISABLED, true);
+ createAccount(account);
+ callback.onAccountCreated(account);
+ if (Config.X509_VERIFICATION) {
+ try {
+ getMemorizingTrustManager().getNonInteractive().checkClientTrusted(chain, "RSA");
+ } catch (CertificateException e) {
+ callback.informUser(R.string.certificate_chain_is_not_trusted);
+ }
+ }
+ } else {
+ callback.informUser(R.string.account_already_exists);
+ }
+ } catch (Exception e) {
+ callback.informUser(R.string.unable_to_parse_certificate);
+ }
+ }
+ }).start();
+
+ }
+
+ public void updateKeyInAccount(final Account account, final String alias) {
+ Log.d(Config.LOGTAG, "update key in account " + alias);
+ try {
+ X509Certificate[] chain = KeyChain.getCertificateChain(XmppConnectionService.this, alias);
+ Pair<Jid, String> info = CryptoHelper.extractJidAndName(chain[0]);
+ if (account.getJid().toBareJid().equals(info.first)) {
+ account.setPrivateKeyAlias(alias);
+ databaseBackend.updateAccount(account);
+ if (Config.X509_VERIFICATION) {
+ try {
+ getMemorizingTrustManager().getNonInteractive().checkClientTrusted(chain, "RSA");
+ } catch (CertificateException e) {
+ showErrorToastInUi(R.string.certificate_chain_is_not_trusted);
+ }
+ account.getAxolotlService().regenerateKeys(true);
+ }
+ } else {
+ showErrorToastInUi(R.string.jid_does_not_match_certificate);
+ }
+ } catch (InterruptedException e) {
+ e.printStackTrace();
+ } catch (KeyChainException e) {
+ e.printStackTrace();
+ } catch (InvalidJidException e) {
+ e.printStackTrace();
+ } catch (CertificateEncodingException e) {
+ e.printStackTrace();
+ }
+ }
+
public void updateAccount(final Account account) {
this.statusListener.onStatusChanged(account);
databaseBackend.updateAccount(account);
@@ -1409,6 +1499,31 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
}
+ public void setOnCaptchaRequestedListener(OnCaptchaRequested listener) {
+ synchronized (this) {
+ if (checkListeners()) {
+ switchToForeground();
+ }
+ this.mOnCaptchaRequested = listener;
+ if (this.captchaRequestedListenerCount < 2) {
+ this.captchaRequestedListenerCount++;
+ }
+ }
+ }
+
+ public void removeOnCaptchaRequestedListener() {
+ synchronized (this) {
+ this.captchaRequestedListenerCount--;
+ if (this.captchaRequestedListenerCount <= 0) {
+ this.mOnCaptchaRequested = null;
+ this.captchaRequestedListenerCount = 0;
+ if (checkListeners()) {
+ switchToBackground();
+ }
+ }
+ }
+ }
+
public void setOnRosterUpdateListener(final OnRosterUpdate listener) {
synchronized (this) {
if (checkListeners()) {
@@ -1513,6 +1628,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
return (this.mOnAccountUpdate == null
&& this.mOnConversationUpdate == null
&& this.mOnRosterUpdate == null
+ && this.mOnCaptchaRequested == null
&& this.mOnUpdateBlocklist == null
&& this.mOnShowErrorToast == null
&& this.mOnKeyStatusUpdated == null);
@@ -2414,6 +2530,20 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
}
+ public boolean displayCaptchaRequest(Account account, String id, Data data, Bitmap captcha) {
+ boolean rc = false;
+ if (mOnCaptchaRequested != null) {
+ DisplayMetrics metrics = getApplicationContext().getResources().getDisplayMetrics();
+ Bitmap scaled = Bitmap.createScaledBitmap(captcha, (int)(captcha.getWidth() * metrics.scaledDensity),
+ (int)(captcha.getHeight() * metrics.scaledDensity), false);
+
+ mOnCaptchaRequested.onCaptchaRequested(account, id, data, scaled);
+ rc = true;
+ }
+
+ return rc;
+ }
+
public void updateBlocklistUi(final OnUpdateBlocklist.Status status) {
if (mOnUpdateBlocklist != null) {
mOnUpdateBlocklist.OnUpdateBlocklist(status);
@@ -2452,7 +2582,9 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
public void markRead(final Conversation conversation) {
mNotificationService.clear(conversation);
- conversation.markRead();
+ for(Message message : conversation.markRead()) {
+ databaseBackend.updateMessage(message);
+ }
updateUnreadCountBadge();
}
@@ -2570,6 +2702,13 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
}
+ public void sendCreateAccountWithCaptchaPacket(Account account, String id, Data data) {
+ XmppConnection connection = account.getXmppConnection();
+ if (connection != null) {
+ connection.sendCaptchaRegistryRequest(id, data);
+ }
+ }
+
public void sendIqPacket(final Account account, final IqPacket packet, final OnIqPacketReceived callback) {
final XmppConnection connection = account.getXmppConnection();
if (connection != null) {
@@ -2699,54 +2838,66 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa
}
}
+ public interface OnAccountCreated {
+ void onAccountCreated(Account account);
+ void informUser(int r);
+ }
+
public interface OnMoreMessagesLoaded {
- public void onMoreMessagesLoaded(int count, Conversation conversation);
+ void onMoreMessagesLoaded(int count, Conversation conversation);
- public void informUser(int r);
+ void informUser(int r);
}
public interface OnAccountPasswordChanged {
- public void onPasswordChangeSucceeded();
+ void onPasswordChangeSucceeded();
- public void onPasswordChangeFailed();
+ void onPasswordChangeFailed();
}
public interface OnAffiliationChanged {
- public void onAffiliationChangedSuccessful(Jid jid);
+ void onAffiliationChangedSuccessful(Jid jid);
- public void onAffiliationChangeFailed(Jid jid, int resId);
+ void onAffiliationChangeFailed(Jid jid, int resId);
}
public interface OnRoleChanged {
- public void onRoleChangedSuccessful(String nick);
+ void onRoleChangedSuccessful(String nick);
- public void onRoleChangeFailed(String nick, int resid);
+ void onRoleChangeFailed(String nick, int resid);
}
public interface OnConversationUpdate {
- public void onConversationUpdate();
+ void onConversationUpdate();
}
public interface OnAccountUpdate {
- public void onAccountUpdate();
+ void onAccountUpdate();
+ }
+
+ public interface OnCaptchaRequested {
+ void onCaptchaRequested(Account account,
+ String id,
+ Data data,
+ Bitmap captcha);
}
public interface OnRosterUpdate {
- public void onRosterUpdate();
+ void onRosterUpdate();
}
public interface OnMucRosterUpdate {
- public void onMucRosterUpdate();
+ void onMucRosterUpdate();
}
public interface OnConferenceConfigurationFetched {
- public void onConferenceConfigurationFetched(Conversation conversation);
+ void onConferenceConfigurationFetched(Conversation conversation);
}
public interface OnConferenceOptionsPushed {
- public void onPushSucceeded();
+ void onPushSucceeded();
- public void onPushFailed();
+ void onPushFailed();
}
public interface OnShowErrorToast {
diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
index 8783216b3..b3765a080 100644
--- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java
@@ -220,8 +220,7 @@ public class ConversationActivity extends XmppActivity
return null;
}
listAdapter.remove(swipedConversation);
- swipedConversation.markRead();
- xmppConnectionService.getNotificationService().clear(swipedConversation);
+ xmppConnectionService.markRead(swipedConversation);
final boolean formerlySelected = (getSelectedConversation() == swipedConversation);
if (position == 0 && listAdapter.getCount() == 0) {
diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java
index dd5111b1b..2ab60800d 100644
--- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java
@@ -1,10 +1,14 @@
package eu.siacs.conversations.ui;
+import android.app.AlertDialog;
import android.app.AlertDialog.Builder;
import android.app.PendingIntent;
import android.content.DialogInterface;
import android.content.Intent;
+import android.graphics.Bitmap;
import android.os.Bundle;
+import android.security.KeyChain;
+import android.security.KeyChainAliasCallback;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
@@ -31,17 +35,21 @@ import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.crypto.axolotl.AxolotlService;
import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.services.XmppConnectionService.OnCaptchaRequested;
+import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
import eu.siacs.conversations.ui.adapter.KnownHostsAdapter;
import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.xmpp.OnKeyStatusUpdated;
import eu.siacs.conversations.xmpp.XmppConnection.Features;
+import eu.siacs.conversations.xmpp.forms.Data;
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
import eu.siacs.conversations.xmpp.pep.Avatar;
-public class EditAccountActivity extends XmppActivity implements OnAccountUpdate, OnKeyStatusUpdated {
+public class EditAccountActivity extends XmppActivity implements OnAccountUpdate,
+ OnKeyStatusUpdated, OnCaptchaRequested, KeyChainAliasCallback, XmppConnectionService.OnShowErrorToast {
private AutoCompleteTextView mAccountJid;
private EditText mPassword;
@@ -72,8 +80,10 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
private ImageButton mRegenerateAxolotlKeyButton;
private LinearLayout keys;
private LinearLayout keysCard;
+ private AlertDialog mCaptchaDialog = null;
private Jid jidToEdit;
+ private boolean mInitMode = false;
private Account mAccount;
private String messageFingerprint;
@@ -83,6 +93,9 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
@Override
public void onClick(final View v) {
+ if (mInitMode && mAccount != null) {
+ mAccount.setOption(Account.OPTION_DISABLED, false);
+ }
if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED && !accountInfoEdited()) {
mAccount.setOption(Account.OPTION_DISABLED, false);
xmppConnectionService.updateAccount(mAccount);
@@ -97,7 +110,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
final Jid jid;
try {
if (Config.DOMAIN_LOCK != null) {
- jid = Jid.fromParts(mAccountJid.getText().toString(),Config.DOMAIN_LOCK,null);
+ jid = Jid.fromParts(mAccountJid.getText().toString(), Config.DOMAIN_LOCK, null);
} else {
jid = Jid.fromString(mAccountJid.getText().toString());
}
@@ -129,12 +142,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
}
}
if (mAccount != null) {
- try {
- mAccount.setUsername(jid.hasLocalpart() ? jid.getLocalpart() : "");
- mAccount.setServer(jid.getDomainpart());
- } catch (final InvalidJidException ignored) {
- return;
- }
+ mAccount.setJid(jid);
mAccountJid.setError(null);
mPasswordConfirm.setError(null);
mAccount.setPassword(password);
@@ -152,9 +160,9 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
mAccount.setOption(Account.OPTION_REGISTER, registerNewAccount);
xmppConnectionService.createAccount(mAccount);
}
- if (jidToEdit != null
- && !mAccount.isOptionSet(Account.OPTION_DISABLED)
- && !registerNewAccount) {
+ if (!mAccount.isOptionSet(Account.OPTION_DISABLED)
+ && !registerNewAccount
+ && !mInitMode) {
finish();
} else {
updateSaveButton();
@@ -177,14 +185,12 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
&& mAccount.getStatus() != Account.State.ONLINE
&& mFetchingAvatar) {
startActivity(new Intent(getApplicationContext(),
- ManageAccountActivity.class));
+ ManageAccountActivity.class));
finish();
- } else if (jidToEdit == null && mAccount != null
- && mAccount.getStatus() == Account.State.ONLINE) {
+ } else if (mInitMode && mAccount != null && mAccount.getStatus() == Account.State.ONLINE) {
if (!mFetchingAvatar) {
mFetchingAvatar = true;
- xmppConnectionService.checkForAvatar(mAccount,
- mAvatarFetchCallback);
+ xmppConnectionService.checkForAvatar(mAccount, mAvatarFetchCallback);
}
} else {
updateSaveButton();
@@ -198,6 +204,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
public void onAccountUpdate() {
refreshUi();
}
+
private final UiCallback<Avatar> mAvatarFetchCallback = new UiCallback<Avatar>() {
@Override
@@ -236,8 +243,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
@Override
public void onClick(final View view) {
if (mAccount != null) {
- final Intent intent = new Intent(getApplicationContext(),
- PublishProfilePictureActivity.class);
+ final Intent intent = new Intent(getApplicationContext(), PublishProfilePictureActivity.class);
intent.putExtra("account", mAccount.getJid().toBareJid().toString());
startActivity(intent);
}
@@ -269,7 +275,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
}
protected void updateSaveButton() {
- if (accountInfoEdited() && jidToEdit != null) {
+ if (accountInfoEdited() && !mInitMode) {
this.mSaveButton.setText(R.string.save);
this.mSaveButton.setEnabled(true);
this.mSaveButton.setTextColor(getPrimaryTextColor());
@@ -277,14 +283,14 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
this.mSaveButton.setEnabled(false);
this.mSaveButton.setTextColor(getSecondaryTextColor());
this.mSaveButton.setText(R.string.account_status_connecting);
- } else if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED) {
+ } else if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED && !mInitMode) {
this.mSaveButton.setEnabled(true);
this.mSaveButton.setTextColor(getPrimaryTextColor());
this.mSaveButton.setText(R.string.enable);
} else {
this.mSaveButton.setEnabled(true);
this.mSaveButton.setTextColor(getPrimaryTextColor());
- if (jidToEdit != null) {
+ if (!mInitMode) {
if (mAccount != null && mAccount.isOnlineAndConnected()) {
this.mSaveButton.setText(R.string.save);
if (!accountInfoEdited()) {
@@ -316,7 +322,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
@Override
protected String getShareableUri() {
- if (mAccount!=null) {
+ if (mAccount != null) {
return mAccount.getShareableUri();
} else {
return "";
@@ -367,7 +373,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
final OnCheckedChangeListener OnCheckedShowConfirmPassword = new OnCheckedChangeListener() {
@Override
public void onCheckedChanged(final CompoundButton buttonView,
- final boolean isChecked) {
+ final boolean isChecked) {
if (isChecked) {
mPasswordConfirm.setVisibility(View.VISIBLE);
} else {
@@ -391,6 +397,10 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
final MenuItem showMoreInfo = menu.findItem(R.id.action_server_info_show_more);
final MenuItem changePassword = menu.findItem(R.id.action_change_password_on_server);
final MenuItem clearDevices = menu.findItem(R.id.action_clear_devices);
+ final MenuItem renewCertificate = menu.findItem(R.id.action_renew_certificate);
+
+ renewCertificate.setVisible(mAccount != null && mAccount.getPrivateKeyAlias() != null);
+
if (mAccount != null && mAccount.isOnlineAndConnected()) {
if (!mAccount.getXmppConnection().getFeatures().blocking()) {
showBlocklist.setVisible(false);
@@ -421,8 +431,9 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
} catch (final InvalidJidException | NullPointerException ignored) {
this.jidToEdit = null;
}
+ this.mInitMode = getIntent().getBooleanExtra("init", false) || this.jidToEdit == null;
this.messageFingerprint = getIntent().getStringExtra("fingerprint");
- if (this.jidToEdit != null) {
+ if (!mInitMode) {
this.mRegisterNew.setVisibility(View.GONE);
if (getActionBar() != null) {
getActionBar().setTitle(getString(R.string.account_details));
@@ -440,7 +451,15 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
protected void onBackendConnected() {
if (this.jidToEdit != null) {
this.mAccount = xmppConnectionService.findAccountByJid(jidToEdit);
- updateAccountInformation(true);
+ if (this.mAccount != null) {
+ if (this.mAccount.getPrivateKeyAlias() != null) {
+ this.mPassword.setHint(R.string.authenticate_with_certificate);
+ if (this.mInitMode) {
+ this.mPassword.requestFocus();
+ }
+ }
+ updateAccountInformation(true);
+ }
} else if (this.xmppConnectionService.getAccounts().size() == 0) {
if (getActionBar() != null) {
getActionBar().setDisplayHomeAsUpEnabled(false);
@@ -479,20 +498,35 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
case R.id.action_clear_devices:
showWipePepDialog();
break;
+ case R.id.action_renew_certificate:
+ renewCertificate();
+ break;
}
return super.onOptionsItemSelected(item);
}
+ private void renewCertificate() {
+ KeyChain.choosePrivateKeyAlias(this, this, null, null, null, -1, null);
+ }
+
+ @Override
+ public void alias(String alias) {
+ if (alias != null) {
+ xmppConnectionService.updateKeyInAccount(mAccount, alias);
+ }
+ }
+
private void updateAccountInformation(boolean init) {
if (init) {
+ this.mAccountJid.getEditableText().clear();
if (Config.DOMAIN_LOCK != null) {
- this.mAccountJid.setText(this.mAccount.getJid().getLocalpart());
+ this.mAccountJid.getEditableText().append(this.mAccount.getJid().getLocalpart());
} else {
- this.mAccountJid.setText(this.mAccount.getJid().toBareJid().toString());
+ this.mAccountJid.getEditableText().append(this.mAccount.getJid().toBareJid().toString());
}
this.mPassword.setText(this.mAccount.getPassword());
}
- if (this.jidToEdit != null) {
+ if (!mInitMode) {
this.mAvatar.setVisibility(View.VISIBLE);
this.mAvatar.setImageBitmap(avatarService().get(this.mAccount, getPixel(Config.AVATAR_SIZE)));
}
@@ -507,7 +541,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
if (this.mAccount.isOnlineAndConnected() && !this.mFetchingAvatar) {
this.mStats.setVisibility(View.VISIBLE);
this.mSessionEst.setText(UIHelper.readableTimeDifferenceFull(this, this.mAccount.getXmppConnection()
- .getLastSessionEstablished()));
+ .getLastSessionEstablished()));
Features features = this.mAccount.getXmppConnection().getFeatures();
if (features.rosterVersioning()) {
this.mServerInfoRosterVersion.setText(R.string.server_info_available);
@@ -518,7 +552,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
this.mServerInfoCarbons.setText(R.string.server_info_available);
} else {
this.mServerInfoCarbons
- .setText(R.string.server_info_unavailable);
+ .setText(R.string.server_info_unavailable);
}
if (features.mam()) {
this.mServerInfoMam.setText(R.string.server_info_available);
@@ -560,21 +594,21 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
this.mOtrFingerprintBox.setVisibility(View.VISIBLE);
this.mOtrFingerprint.setText(CryptoHelper.prettifyFingerprint(otrFingerprint));
this.mOtrFingerprintToClipboardButton
- .setVisibility(View.VISIBLE);
+ .setVisibility(View.VISIBLE);
this.mOtrFingerprintToClipboardButton
- .setOnClickListener(new View.OnClickListener() {
+ .setOnClickListener(new View.OnClickListener() {
- @Override
- public void onClick(final View v) {
+ @Override
+ public void onClick(final View v) {
- if (copyTextToClipboard(otrFingerprint, R.string.otr_fingerprint)) {
- Toast.makeText(
- EditAccountActivity.this,
- R.string.toast_message_otr_fingerprint,
- Toast.LENGTH_SHORT).show();
+ if (copyTextToClipboard(otrFingerprint, R.string.otr_fingerprint)) {
+ Toast.makeText(
+ EditAccountActivity.this,
+ R.string.toast_message_otr_fingerprint,
+ Toast.LENGTH_SHORT).show();
+ }
}
- }
- });
+ });
} else {
this.mOtrFingerprintBox.setVisibility(View.GONE);
}
@@ -617,7 +651,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
boolean hasKeys = false;
keys.removeAllViews();
for (final String fingerprint : mAccount.getAxolotlService().getFingerprintsForOwnSessions()) {
- if(ownFingerprint.equals(fingerprint)) {
+ if (ownFingerprint.equals(fingerprint)) {
continue;
}
boolean highlight = fingerprint.equals(messageFingerprint);
@@ -651,7 +685,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
- mAccount.getAxolotlService().regenerateKeys();
+ mAccount.getAxolotlService().regenerateKeys(false);
}
});
builder.create().show();
@@ -677,4 +711,79 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate
public void onKeyStatusUpdated() {
refreshUi();
}
+
+ @Override
+ public void onCaptchaRequested(final Account account, final String id, final Data data,
+ final Bitmap captcha) {
+ final AlertDialog.Builder builder = new AlertDialog.Builder(this);
+ final ImageView view = new ImageView(this);
+ final LinearLayout layout = new LinearLayout(this);
+ final EditText input = new EditText(this);
+
+ view.setImageBitmap(captcha);
+ view.setScaleType(ImageView.ScaleType.FIT_CENTER);
+
+ input.setHint(getString(R.string.captcha_hint));
+
+ layout.setOrientation(LinearLayout.VERTICAL);
+ layout.addView(view);
+ layout.addView(input);
+
+ builder.setTitle(getString(R.string.captcha_required));
+ builder.setView(layout);
+
+ builder.setPositiveButton(getString(R.string.ok),
+ new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ String rc = input.getText().toString();
+ data.put("username", account.getUsername());
+ data.put("password", account.getPassword());
+ data.put("ocr", rc);
+ data.submit();
+
+ if (xmppConnectionServiceBound) {
+ xmppConnectionService.sendCreateAccountWithCaptchaPacket(
+ account, id, data);
+ }
+ }
+ });
+ builder.setNegativeButton(getString(R.string.cancel), new DialogInterface.OnClickListener() {
+ @Override
+ public void onClick(DialogInterface dialog, int which) {
+ if (xmppConnectionService != null) {
+ xmppConnectionService.sendCreateAccountWithCaptchaPacket(account, null, null);
+ }
+ }
+ });
+
+ builder.setOnCancelListener(new DialogInterface.OnCancelListener() {
+ @Override
+ public void onCancel(DialogInterface dialog) {
+ if (xmppConnectionService != null) {
+ xmppConnectionService.sendCreateAccountWithCaptchaPacket(account, null, null);
+ }
+ }
+ });
+
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ if ((mCaptchaDialog != null) && mCaptchaDialog.isShowing()) {
+ mCaptchaDialog.dismiss();
+ }
+ mCaptchaDialog = builder.create();
+ mCaptchaDialog.show();
+ }
+ });
+ }
+
+ public void onShowErrorToast(final int resId) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(EditAccountActivity.this, resId, Toast.LENGTH_SHORT).show();
+ }
+ });
+ }
}
diff --git a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java
index 5b9b73550..6024177ae 100644
--- a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java
@@ -5,6 +5,8 @@ import android.content.DialogInterface;
import android.content.DialogInterface.OnClickListener;
import android.content.Intent;
import android.os.Bundle;
+import android.security.KeyChain;
+import android.security.KeyChainAliasCallback;
import android.view.ContextMenu;
import android.view.ContextMenu.ContextMenuInfo;
import android.view.Menu;
@@ -14,6 +16,7 @@ import android.widget.AdapterView;
import android.widget.AdapterView.AdapterContextMenuInfo;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
+import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
@@ -21,10 +24,11 @@ import java.util.List;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.Account;
+import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.services.XmppConnectionService.OnAccountUpdate;
import eu.siacs.conversations.ui.adapter.AccountAdapter;
-public class ManageAccountActivity extends XmppActivity implements OnAccountUpdate {
+public class ManageAccountActivity extends XmppActivity implements OnAccountUpdate, KeyChainAliasCallback, XmppConnectionService.OnAccountCreated {
protected Account selectedAccount = null;
@@ -61,7 +65,7 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
@Override
public void onItemClick(AdapterView<?> arg0, View view,
- int position, long arg3) {
+ int position, long arg3) {
switchToAccount(accountList.get(position));
}
});
@@ -98,6 +102,14 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.manageaccounts, menu);
MenuItem enableAll = menu.findItem(R.id.action_enable_all);
+ MenuItem addAccount = menu.findItem(R.id.action_add_account);
+ MenuItem addAccountWithCertificate = menu.findItem(R.id.action_add_account_with_cert);
+
+ if (Config.X509_VERIFICATION) {
+ addAccount.setVisible(false);
+ addAccountWithCertificate.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS);
+ }
+
if (!accountsLeftToEnable()) {
enableAll.setVisible(false);
}
@@ -144,6 +156,9 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
case R.id.action_enable_all:
enableAllAccounts();
break;
+ case R.id.action_add_account_with_cert:
+ addAccountFromKey();
+ break;
default:
break;
}
@@ -179,6 +194,10 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
}
}
+ private void addAccountFromKey() {
+ KeyChain.choosePrivateKeyAlias(this, this, null, null, null, -1, null);
+ }
+
private void publishAvatar(Account account) {
Intent intent = new Intent(getApplicationContext(),
PublishProfilePictureActivity.class);
@@ -281,4 +300,26 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda
}
}
}
+
+ @Override
+ public void alias(String alias) {
+ if (alias != null) {
+ xmppConnectionService.createAccountFromKey(alias, this);
+ }
+ }
+
+ @Override
+ public void onAccountCreated(Account account) {
+ switchToAccount(account, true);
+ }
+
+ @Override
+ public void informUser(final int r) {
+ runOnUiThread(new Runnable() {
+ @Override
+ public void run() {
+ Toast.makeText(ManageAccountActivity.this,r,Toast.LENGTH_LONG).show();
+ }
+ });
+ }
}
diff --git a/src/main/java/eu/siacs/conversations/ui/UiCallback.java b/src/main/java/eu/siacs/conversations/ui/UiCallback.java
index c80199e17..d056d6289 100644
--- a/src/main/java/eu/siacs/conversations/ui/UiCallback.java
+++ b/src/main/java/eu/siacs/conversations/ui/UiCallback.java
@@ -3,9 +3,9 @@ package eu.siacs.conversations.ui;
import android.app.PendingIntent;
public interface UiCallback<T> {
- public void success(T object);
+ void success(T object);
- public void error(int errorCode, T object);
+ void error(int errorCode, T object);
- public void userInputRequried(PendingIntent pi, T object);
+ void userInputRequried(PendingIntent pi, T object);
}
diff --git a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java
index ed460740b..de4d261c5 100644
--- a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java
+++ b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java
@@ -281,6 +281,9 @@ public abstract class XmppActivity extends Activity {
if (this instanceof XmppConnectionService.OnAccountUpdate) {
this.xmppConnectionService.setOnAccountListChangedListener((XmppConnectionService.OnAccountUpdate) this);
}
+ if (this instanceof XmppConnectionService.OnCaptchaRequested) {
+ this.xmppConnectionService.setOnCaptchaRequestedListener((XmppConnectionService.OnCaptchaRequested) this);
+ }
if (this instanceof XmppConnectionService.OnRosterUpdate) {
this.xmppConnectionService.setOnRosterUpdateListener((XmppConnectionService.OnRosterUpdate) this);
}
@@ -305,6 +308,9 @@ public abstract class XmppActivity extends Activity {
if (this instanceof XmppConnectionService.OnAccountUpdate) {
this.xmppConnectionService.removeOnAccountListChangedListener();
}
+ if (this instanceof XmppConnectionService.OnCaptchaRequested) {
+ this.xmppConnectionService.removeOnCaptchaRequestedListener();
+ }
if (this instanceof XmppConnectionService.OnRosterUpdate) {
this.xmppConnectionService.removeOnRosterUpdateListener();
}
@@ -438,8 +444,13 @@ public abstract class XmppActivity extends Activity {
}
public void switchToAccount(Account account) {
+ switchToAccount(account,false);
+ }
+
+ public void switchToAccount(Account account, boolean init) {
Intent intent = new Intent(this, EditAccountActivity.class);
intent.putExtra("jid", account.getJid().toBareJid().toString());
+ intent.putExtra("init", init);
startActivity(intent);
}
@@ -617,6 +628,9 @@ public abstract class XmppActivity extends Activity {
protected boolean addFingerprintRow(LinearLayout keys, final Account account, final String fingerprint, boolean highlight) {
final XmppAxolotlSession.Trust trust = account.getAxolotlService()
.getFingerprintTrust(fingerprint);
+ if (trust == null) {
+ return false;
+ }
return addFingerprintRowWithListeners(keys, account, fingerprint, highlight, trust, true,
new CompoundButton.OnCheckedChangeListener() {
@Override
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/KnownHostsAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/KnownHostsAdapter.java
index 471526afe..39bfc082e 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/KnownHostsAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/KnownHostsAdapter.java
@@ -15,7 +15,7 @@ public class KnownHostsAdapter extends ArrayAdapter<String> {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
if (constraint != null) {
- ArrayList<String> suggestions = new ArrayList<String>();
+ ArrayList<String> suggestions = new ArrayList<>();
final String[] split = constraint.toString().split("@");
if (split.length == 1) {
for (String domain : domains) {
@@ -58,10 +58,9 @@ public class KnownHostsAdapter extends ArrayAdapter<String> {
}
};
- public KnownHostsAdapter(Context context, int viewResourceId,
- List<String> mKnownHosts) {
+ public KnownHostsAdapter(Context context, int viewResourceId, List<String> mKnownHosts) {
super(context, viewResourceId, new ArrayList<String>());
- domains = new ArrayList<String>(mKnownHosts);
+ domains = new ArrayList<>(mKnownHosts);
}
@Override
diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java
index ad7d76224..4be4931f7 100644
--- a/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java
+++ b/src/main/java/eu/siacs/conversations/ui/adapter/ListItemAdapter.java
@@ -92,7 +92,7 @@ public class ListItemAdapter extends ArrayAdapter<ListItem> {
}
public interface OnTagClickedListener {
- public void onTagClicked(String tag);
+ void onTagClicked(String tag);
}
class BitmapWorkerTask extends AsyncTask<ListItem, Void, Bitmap> {
diff --git a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java
index c7c9ac423..e9ad71971 100644
--- a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java
+++ b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java
@@ -1,6 +1,15 @@
package eu.siacs.conversations.utils;
+import android.util.Pair;
+
+import org.bouncycastle.asn1.x500.X500Name;
+import org.bouncycastle.asn1.x500.style.BCStyle;
+import org.bouncycastle.asn1.x500.style.IETFUtils;
+import org.bouncycastle.cert.jcajce.JcaX509CertificateHolder;
+
import java.security.SecureRandom;
+import java.security.cert.CertificateEncodingException;
+import java.security.cert.X509Certificate;
import java.text.Normalizer;
import java.util.Arrays;
import java.util.Collection;
@@ -9,6 +18,8 @@ import java.util.LinkedHashSet;
import java.util.List;
import eu.siacs.conversations.Config;
+import eu.siacs.conversations.xmpp.jid.InvalidJidException;
+import eu.siacs.conversations.xmpp.jid.Jid;
public final class CryptoHelper {
public static final String FILETRANSFER = "?FILETRANSFERv1:";
@@ -125,4 +136,12 @@ public final class CryptoHelper {
}
}
}
+
+ public static Pair<Jid,String> extractJidAndName(X509Certificate certificate) throws CertificateEncodingException, InvalidJidException {
+ X500Name x500name = new JcaX509CertificateHolder(certificate).getSubject();
+ //String xmpp = IETFUtils.valueToString(x500name.getRDNs(new ASN1ObjectIdentifier("1.3.6.1.5.5.7.8.5"))[0].getFirst().getValue());
+ String email = IETFUtils.valueToString(x500name.getRDNs(BCStyle.EmailAddress)[0].getFirst().getValue());
+ String name = IETFUtils.valueToString(x500name.getRDNs(BCStyle.CN)[0].getFirst().getValue());
+ return new Pair<>(Jid.fromString(email),name);
+ }
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
index c41b69748..d21682a79 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java
@@ -1,10 +1,14 @@
package eu.siacs.conversations.xmpp;
+import android.graphics.Bitmap;
+import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Parcelable;
import android.os.PowerManager;
import android.os.PowerManager.WakeLock;
import android.os.SystemClock;
+import android.security.KeyChain;
+import android.util.Base64;
import android.util.Log;
import android.util.Pair;
import android.util.SparseArray;
@@ -14,6 +18,7 @@ import org.json.JSONException;
import org.json.JSONObject;
import org.xmlpull.v1.XmlPullParserException;
+import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
@@ -24,8 +29,12 @@ import java.net.InetAddress;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.UnknownHostException;
+import java.net.URL;
import java.security.KeyManagementException;
import java.security.NoSuchAlgorithmException;
+import java.security.Principal;
+import java.security.PrivateKey;
+import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@@ -37,14 +46,18 @@ import java.util.List;
import java.util.Map.Entry;
import javax.net.ssl.HostnameVerifier;
+import javax.net.ssl.KeyManager;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
+import javax.net.ssl.X509KeyManager;
import javax.net.ssl.X509TrustManager;
import de.duenndns.ssl.MemorizingTrustManager;
import eu.siacs.conversations.Config;
+import eu.siacs.conversations.crypto.XmppDomainVerifier;
import eu.siacs.conversations.crypto.sasl.DigestMd5;
+import eu.siacs.conversations.crypto.sasl.External;
import eu.siacs.conversations.crypto.sasl.Plain;
import eu.siacs.conversations.crypto.sasl.SaslMechanism;
import eu.siacs.conversations.crypto.sasl.ScramSha1;
@@ -59,6 +72,8 @@ import eu.siacs.conversations.xml.Element;
import eu.siacs.conversations.xml.Tag;
import eu.siacs.conversations.xml.TagWriter;
import eu.siacs.conversations.xml.XmlReader;
+import eu.siacs.conversations.xmpp.forms.Data;
+import eu.siacs.conversations.xmpp.forms.Field;
import eu.siacs.conversations.xmpp.jid.InvalidJidException;
import eu.siacs.conversations.xmpp.jid.Jid;
import eu.siacs.conversations.xmpp.jingle.OnJinglePacketReceived;
@@ -116,6 +131,67 @@ public class XmppConnection implements Runnable {
private SaslMechanism saslMechanism;
+ private X509KeyManager mKeyManager = new X509KeyManager() {
+ @Override
+ public String chooseClientAlias(String[] strings, Principal[] principals, Socket socket) {
+ return account.getPrivateKeyAlias();
+ }
+
+ @Override
+ public String chooseServerAlias(String s, Principal[] principals, Socket socket) {
+ return null;
+ }
+
+ @Override
+ public X509Certificate[] getCertificateChain(String alias) {
+ try {
+ return KeyChain.getCertificateChain(mXmppConnectionService, alias);
+ } catch (Exception e) {
+ return new X509Certificate[0];
+ }
+ }
+
+ @Override
+ public String[] getClientAliases(String s, Principal[] principals) {
+ return new String[0];
+ }
+
+ @Override
+ public String[] getServerAliases(String s, Principal[] principals) {
+ return new String[0];
+ }
+
+ @Override
+ public PrivateKey getPrivateKey(String alias) {
+ try {
+ return KeyChain.getPrivateKey(mXmppConnectionService, alias);
+ } catch (Exception e) {
+ return null;
+ }
+ }
+ };
+
+ private OnIqPacketReceived createPacketReceiveHandler() {
+ return new OnIqPacketReceived() {
+ @Override
+ public void onIqPacketReceived(Account account, IqPacket packet) {
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
+ account.setOption(Account.OPTION_REGISTER,
+ false);
+ changeStatus(Account.State.REGISTRATION_SUCCESSFUL);
+ } else if (packet.hasChild("error")
+ && (packet.findChild("error")
+ .hasChild("conflict"))) {
+ changeStatus(Account.State.REGISTRATION_CONFLICT);
+ } else {
+ changeStatus(Account.State.REGISTRATION_FAILED);
+ Log.d(Config.LOGTAG, packet.toString());
+ }
+ disconnect(true);
+ }
+ };
+ }
+
public XmppConnection(final Account account, final XmppConnectionService service) {
this.account = account;
this.wakeLock = service.getPowerManager().newWakeLock(
@@ -210,7 +286,7 @@ public class XmppConnection implements Runnable {
Tag nextTag;
while ((nextTag = tagReader.readTag()) != null) {
if (nextTag.isStart("stream")) {
- processStream(nextTag);
+ processStream();
break;
} else {
throw new IOException("unknown tag on connect");
@@ -262,11 +338,9 @@ public class XmppConnection implements Runnable {
connect();
}
- private void processStream(final Tag currentTag) throws XmlPullParserException,
- IOException, NoSuchAlgorithmException {
+ private void processStream() throws XmlPullParserException, IOException, NoSuchAlgorithmException {
Tag nextTag = tagReader.readTag();
-
- while ((nextTag != null) && (!nextTag.isEnd("stream"))) {
+ while (nextTag != null && !nextTag.isEnd("stream")) {
if (nextTag.isStart("error")) {
processStreamError(nextTag);
} else if (nextTag.isStart("features")) {
@@ -286,7 +360,11 @@ public class XmppConnection implements Runnable {
String.valueOf(saslMechanism.getPriority()));
tagReader.reset();
sendStartStream();
- processStream(tagReader.readTag());
+ if (tagReader.readTag().isStart("stream")) {
+ processStream();
+ } else {
+ throw new IOException("server didn't restart stream after successful auth");
+ }
break;
} else if (nextTag.isStart("failure")) {
throw new UnauthorizedException();
@@ -382,6 +460,7 @@ public class XmppConnection implements Runnable {
}
nextTag = tagReader.readTag();
}
+ Log.d(Config.LOGTAG,account.getJid().toBareJid()+": last tag was "+nextTag);
if (account.getStatus() == Account.State.ONLINE) {
account. setStatus(Account.State.OFFLINE);
if (statusListener != null) {
@@ -518,13 +597,19 @@ public class XmppConnection implements Runnable {
try {
final SSLContext sc = SSLContext.getInstance("TLS");
MemorizingTrustManager trustManager = this.mXmppConnectionService.getMemorizingTrustManager();
- sc.init(null,new X509TrustManager[]{mInteractive ? trustManager : trustManager.getNonInteractive()},mXmppConnectionService.getRNG());
+ KeyManager[] keyManager;
+ if (account.getPrivateKeyAlias() != null && account.getPassword().isEmpty()) {
+ keyManager = new KeyManager[]{ mKeyManager };
+ } else {
+ keyManager = null;
+ }
+ sc.init(keyManager,new X509TrustManager[]{mInteractive ? trustManager : trustManager.getNonInteractive()},mXmppConnectionService.getRNG());
final SSLSocketFactory factory = sc.getSocketFactory();
final HostnameVerifier verifier;
if (mInteractive) {
- verifier = trustManager.wrapHostnameVerifier(new StrictHostnameVerifier());
+ verifier = trustManager.wrapHostnameVerifier(new XmppDomainVerifier());
} else {
- verifier = trustManager.wrapHostnameVerifierNonInteractive(new StrictHostnameVerifier());
+ verifier = trustManager.wrapHostnameVerifierNonInteractive(new XmppDomainVerifier());
}
final InetAddress address = socket == null ? null : socket.getInetAddress();
@@ -562,10 +647,14 @@ public class XmppConnection implements Runnable {
sendStartStream();
Log.d(Config.LOGTAG, account.getJid().toBareJid()+ ": TLS connection established");
features.encryptionEnabled = true;
- processStream(tagReader.readTag());
+ if (tagReader.readTag().isStart("stream")) {
+ processStream();
+ } else {
+ throw new IOException("server didn't restart stream after STARTTLS");
+ }
sslSocket.close();
} catch (final NoSuchAlgorithmException | KeyManagementException e1) {
- Log.d(Config.LOGTAG,account.getJid().toBareJid()+": TLS certificate verification failed");
+ Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": TLS certificate verification failed");
throw new SecurityException();
}
}
@@ -589,7 +678,9 @@ public class XmppConnection implements Runnable {
.findChild("mechanisms"));
final Element auth = new Element("auth");
auth.setAttribute("xmlns", "urn:ietf:params:xml:ns:xmpp-sasl");
- if (mechanisms.contains("SCRAM-SHA-1")) {
+ if (mechanisms.contains("EXTERNAL")) {
+ saslMechanism = new External(tagWriter, account, mXmppConnectionService.getRNG());
+ } else if (mechanisms.contains("SCRAM-SHA-1")) {
saslMechanism = new ScramSha1(tagWriter, account, mXmppConnectionService.getRNG());
} else if (mechanisms.contains("PLAIN")) {
saslMechanism = new Plain(tagWriter, account);
@@ -643,6 +734,15 @@ public class XmppConnection implements Runnable {
return mechanisms;
}
+ public void sendCaptchaRegistryRequest(String id, Data data) {
+ if (data == null) {
+ setAccountCreationFailed("");
+ } else {
+ IqPacket request = getIqGenerator().generateCreateAccountWithCaptcha(account, id, data);
+ sendIqPacket(request, createPacketReceiveHandler());
+ }
+ }
+
private void sendRegistryRequest() {
final IqPacket register = new IqPacket(IqPacket.TYPE.GET);
register.query("jabber:iq:register");
@@ -651,6 +751,7 @@ public class XmppConnection implements Runnable {
@Override
public void onIqPacketReceived(final Account account, final IqPacket packet) {
+ boolean failed = false;
if (packet.getType() == IqPacket.TYPE.RESULT
&& packet.query().hasChild("username")
&& (packet.query().hasChild("password"))) {
@@ -659,37 +760,57 @@ public class XmppConnection implements Runnable {
final Element password = new Element("password").setContent(account.getPassword());
register.query("jabber:iq:register").addChild(username);
register.query().addChild(password);
- sendIqPacket(register, new OnIqPacketReceived() {
-
- @Override
- public void onIqPacketReceived(final Account account, final IqPacket packet) {
- if (packet.getType() == IqPacket.TYPE.RESULT) {
- account.setOption(Account.OPTION_REGISTER,
- false);
- changeStatus(Account.State.REGISTRATION_SUCCESSFUL);
- } else if (packet.hasChild("error")
- && (packet.findChild("error")
- .hasChild("conflict"))) {
- changeStatus(Account.State.REGISTRATION_CONFLICT);
- } else {
- changeStatus(Account.State.REGISTRATION_FAILED);
- Log.d(Config.LOGTAG, packet.toString());
- }
- disconnect(true);
+ sendIqPacket(register, createPacketReceiveHandler());
+ } else if (packet.getType() == IqPacket.TYPE.RESULT
+ && (packet.query().hasChild("x", "jabber:x:data"))) {
+ final Data data = Data.parse(packet.query().findChild("x", "jabber:x:data"));
+ final Element blob = packet.query().findChild("data", "urn:xmpp:bob");
+ final String id = packet.getId();
+
+ Bitmap captcha = null;
+ if (blob != null) {
+ try {
+ final String base64Blob = blob.getContent();
+ final byte[] strBlob = Base64.decode(base64Blob, Base64.DEFAULT);
+ InputStream stream = new ByteArrayInputStream(strBlob);
+ captcha = BitmapFactory.decodeStream(stream);
+ } catch (Exception e) {
+ //ignored
+ }
+ } else {
+ try {
+ Field url = data.getFieldByName("url");
+ String urlString = url.findChildContent("value");
+ URL uri = new URL(urlString);
+ captcha = BitmapFactory.decodeStream(uri.openConnection().getInputStream());
+ } catch(IOException e) {
+ Log.e(Config.LOGTAG, e.toString());
}
- });
+ }
+
+ if (captcha != null) {
+ failed = !mXmppConnectionService.displayCaptchaRequest(account, id, data, captcha);
+ }
} else {
+ failed = true;
+ }
+
+ if (failed) {
final Element instructions = packet.query().findChild("instructions");
- changeStatus(Account.State.REGISTRATION_FAILED);
- disconnect(true);
- Log.d(Config.LOGTAG, account.getJid().toBareJid()
- + ": could not register. instructions are"
- + (instructions != null ? instructions.getContent() : ""));
+ setAccountCreationFailed((instructions != null) ? instructions.getContent() : "");
}
}
});
}
+ private void setAccountCreationFailed(String instructions) {
+ changeStatus(Account.State.REGISTRATION_FAILED);
+ disconnect(true);
+ Log.d(Config.LOGTAG, account.getJid().toBareJid()
+ + ": could not register. instructions are"
+ + instructions);
+ }
+
private void sendBindRequest() {
while(!mXmppConnectionService.areMessagesInitialized()) {
try {
@@ -761,11 +882,9 @@ public class XmppConnection implements Runnable {
this.sendUnmodifiedIqPacket(startSession, new OnIqPacketReceived() {
@Override
public void onIqPacketReceived(Account account, IqPacket packet) {
- if (packet.getType() == IqPacket.TYPE.TIMEOUT) {
- return;
- } else if (packet.getType() == IqPacket.TYPE.RESULT) {
+ if (packet.getType() == IqPacket.TYPE.RESULT) {
sendPostBindInitialization();
- } else {
+ } else if (packet.getType() != IqPacket.TYPE.TIMEOUT){
Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": could not init sessions");
disconnect(true);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jid/Jid.java b/src/main/java/eu/siacs/conversations/xmpp/jid/Jid.java
index f989c0c25..a15abe14a 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jid/Jid.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jid/Jid.java
@@ -176,7 +176,7 @@ public final class Jid {
return resourcepart.isEmpty() ? this : fromParts(localpart, domainpart, "");
} catch (final InvalidJidException e) {
// This should never happen.
- return null;
+ throw new AssertionError("Jid " + this.toString() + " invalid");
}
}
@@ -185,7 +185,7 @@ public final class Jid {
return resourcepart.isEmpty() && localpart.isEmpty() ? this : fromString(getDomainpart());
} catch (final InvalidJidException e) {
// This should never happen.
- return null;
+ throw new AssertionError("Jid " + this.toString() + " invalid");
}
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
index 4f733b10e..388c5dec2 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java
@@ -737,8 +737,7 @@ public class JingleConnection implements Transferable {
JinglePacket answer = bootstrapPacket("transport-accept");
Content content = new Content("initiator", "a-file-offer");
content.setTransportId(this.transportId);
- content.ibbTransport().setAttribute("block-size",
- Integer.toString(this.ibbBlockSize));
+ content.ibbTransport().setAttribute("block-size",this.ibbBlockSize);
answer.setContent(content);
this.sendJinglePacket(answer);
return true;
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/OnFileTransmissionStatusChanged.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/OnFileTransmissionStatusChanged.java
index e45e7441d..91cba39f5 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/OnFileTransmissionStatusChanged.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/OnFileTransmissionStatusChanged.java
@@ -3,7 +3,7 @@ package eu.siacs.conversations.xmpp.jingle;
import eu.siacs.conversations.entities.DownloadableFile;
public interface OnFileTransmissionStatusChanged {
- public void onFileTransmitted(DownloadableFile file);
+ void onFileTransmitted(DownloadableFile file);
- public void onFileTransferAborted();
+ void onFileTransferAborted();
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/OnJinglePacketReceived.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/OnJinglePacketReceived.java
index 2aaf62a1b..9a60b3924 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/OnJinglePacketReceived.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/OnJinglePacketReceived.java
@@ -5,5 +5,5 @@ import eu.siacs.conversations.xmpp.PacketReceived;
import eu.siacs.conversations.xmpp.jingle.stanzas.JinglePacket;
public interface OnJinglePacketReceived extends PacketReceived {
- public void onJinglePacketReceived(Account account, JinglePacket packet);
+ void onJinglePacketReceived(Account account, JinglePacket packet);
}
diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/OnPrimaryCandidateFound.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/OnPrimaryCandidateFound.java
index 03a437b2b..76e337177 100644
--- a/src/main/java/eu/siacs/conversations/xmpp/jingle/OnPrimaryCandidateFound.java
+++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/OnPrimaryCandidateFound.java
@@ -1,6 +1,5 @@
package eu.siacs.conversations.xmpp.jingle;
public interface OnPrimaryCandidateFound {
- public void onPrimaryCandidateFound(boolean success,
- JingleCandidate canditate);
+ void onPrimaryCandidateFound(boolean success, JingleCandidate canditate);
}
diff --git a/src/main/res/menu/editaccount.xml b/src/main/res/menu/editaccount.xml
index 2076805ef..62981a454 100644
--- a/src/main/res/menu/editaccount.xml
+++ b/src/main/res/menu/editaccount.xml
@@ -11,6 +11,13 @@
android:showAsAction="never" />
<item
+ android:id="@+id/action_renew_certificate"
+ android:title="@string/action_renew_certificate"
+ android:visible="false"
+ android:showAsAction="never" />
+ />
+
+ <item
android:id="@+id/action_server_info_show_more"
android:title="@string/server_info_show_more"
android:checkable="true"
diff --git a/src/main/res/menu/manageaccounts.xml b/src/main/res/menu/manageaccounts.xml
index f8a30ff7b..ffa692a0b 100644
--- a/src/main/res/menu/manageaccounts.xml
+++ b/src/main/res/menu/manageaccounts.xml
@@ -7,6 +7,12 @@
android:showAsAction="always"
android:title="@string/action_add_account"/>
<item
+ android:id="@+id/action_add_account_with_cert"
+ android:showAsAction="never"
+ android:icon="?attr/icon_add_person"
+ android:title="@string/action_add_account_with_certificate"
+ android:visible="true"/>
+ <item
android:id="@+id/action_enable_all"
android:title="@string/enable_all_accounts"/>
<item
diff --git a/src/main/res/values-ar-rEG/strings.xml b/src/main/res/values-ar-rEG/strings.xml
deleted file mode 100644
index 55465f36e..000000000
--- a/src/main/res/values-ar-rEG/strings.xml
+++ /dev/null
@@ -1,315 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<resources>
- <string name="action_settings">إعدادات</string>
- <string name="action_add">محادثة جديدة</string>
- <string name="action_accounts">إدارة الحسابات</string>
- <string name="action_end_conversation">إنهاء المحادثة</string>
- <string name="action_contact_details">بيانات جهة الإتصال</string>
- <string name="action_muc_details">بيانات الغرفة</string>
- <string name="action_secure">تشفير المحادثة</string>
- <string name="action_add_account">إضافة حساب</string>
- <string name="action_edit_contact">تعديل الإسم</string>
- <string name="action_add_phone_book">إضافة لسجل الهاتف</string>
- <string name="action_delete_contact">حذف من الإضافات</string>
- <string name="action_block_contact">حجب جهة إتصال</string>
- <string name="action_unblock_contact">إنهاء حجب جهة اتصال</string>
- <string name="action_block_domain">حجب دومين</string>
- <string name="action_unblock_domain">إنهاء حجب دومين</string>
- <string name="title_activity_manage_accounts">إدارة الحسابات</string>
- <string name="title_activity_settings">إعدادات</string>
- <string name="title_activity_conference_details">بيانات الغرفه</string>
- <string name="title_activity_contact_details">بيانات جهة الإتصال</string>
- <string name="title_activity_sharewith">مشاركة مع محادثة</string>
- <string name="title_activity_start_conversation">بدأ محادثة</string>
- <string name="title_activity_choose_contact">إختيار جهة اتصال</string>
- <string name="title_activity_block_list">قائمة المحجوبين</string>
- <string name="just_now">الآن</string>
- <string name="minute_ago">منذ 1 دقيقة</string>
- <string name="minutes_ago">دقائق %d منذ</string>
- <string name="unread_conversations">محادثات غير مقروءة</string>
- <string name="sending">ارسال</string>
- <string name="encrypted_message">رسالة مشفّرة .. الرجاء الإنتظار</string>
- <string name="nick_in_use">اللقب مستخدم من قبل</string>
- <string name="admin">مدير</string>
- <string name="owner">مالك</string>
- <string name="moderator">مشرف</string>
- <string name="participant">مشترك</string>
- <string name="visitor">زائر</string>
- <string name="remove_contact_text">هل ترغب بحذف جهة الإتصال %s من اضافاتك? ستبقى محادثاتك معه محفوظه</string>
- <string name="block_contact_text">هل ترغب في حجب %s من ارسال الرسائل لك?</string>
- <string name="unblock_contact_text">هل ترغب في انهاء حجب %s والسماح له بمراسلتك?</string>
- <string name="block_domain_text">هل تريد حجب جميع جهات الإتصال من %s?</string>
- <string name="unblock_domain_text">الغاء حجب جميع جهات الإتصال من %s?</string>
- <string name="contact_blocked">جهة الاتصال محجوبه</string>
- <string name="remove_bookmark_text">هل ترغب في حذف %s من المفضلات? المحادثات المحفوظه ستبقى كما هي</string>
- <string name="register_account">تسجيل حساب جديد في سيرفر</string>
- <string name="change_password_on_server">تغيير كلمة المرور في سيرفر</string>
- <string name="share_with">مشاركة مع</string>
- <string name="start_conversation">بدأ محادثة</string>
- <string name="invite_contact">دعوة صديق</string>
- <string name="contacts">جهات الإتصال</string>
- <string name="cancel">الغاء</string>
- <string name="set">تعيين</string>
- <string name="add">اضافة</string>
- <string name="edit">تعديل</string>
- <string name="delete">حذف</string>
- <string name="block">حجب</string>
- <string name="unblock">الغاء حجب</string>
- <string name="save">حفظ</string>
- <string name="ok">موافق</string>
- <string name="crash_report_title">توقف التطبيق عن العمل</string>
- <string name="crash_report_message">بموافقتك على ارسال تقارير الأخطاء ستساعد مبرمجي التطبيق على تحسين جودة التطبيق\n<b>تنويه:</b> سيرسل تقارير الأخطاء ان وجدت بأحد الحسابات التي أضفتها.</string>
- <string name="send_now">ارسال الآن</string>
- <string name="send_never">لا تسألني ثانية</string>
- <string name="problem_connecting_to_account">لا يمكن تسجيل الدخول لحسابك</string>
- <string name="problem_connecting_to_accounts">لا يمكن تسجيل الدخول بحساباتك</string>
- <string name="touch_to_fix">المس الشاشه لعرض المحادثات</string>
- <string name="attach_file">ارفاق ملف</string>
- <string name="not_in_roster">جهة الاتصال ليست مضافه لديك هل ترغب في إضافتها ؟؟</string>
- <string name="add_contact">اضافة جهة اتصال</string>
- <string name="send_failed">فشل التسليم</string>
- <string name="send_rejected">مرفوض</string>
- <string name="preparing_image">اعداد صورة للإرسال</string>
- <string name="action_clear_history">حذف سجل المحفوظات</string>
- <string name="clear_conversation_history">حذف سجل المحفوظات للمحادثة</string>
- <string name="clear_histor_msg">هل ترغب بحذف جميع الرسائل في تلك المحادثة?\n\n<b>تنويه:</b> هذا لن يؤثر على الرسائل المخزنة على الأجهزة أو أي أماكن أخرى.</string>
- <string name="delete_messages">حذف الرسائل</string>
- <string name="also_end_conversation">انهاء هذه المحادثة بعد الكلمات</string>
- <string name="choose_presence">اختيار ظهورك لجهات الإتصال</string>
- <string name="send_otr_message">OTRارساله رساله مشفره عبر</string>
- <string name="send_pgp_message">OpenPGPارساله رساله مشفره عبر</string>
- <string name="your_nick_has_been_changed">تم تغيير لقبك بنجاح</string>
- <string name="send_unencrypted">إرسال بدون تشفير</string>
- <string name="decryption_failed">فشل فك التشفير. ربما لم يكن لديك المفتاح الخاص الصحيح.</string>
- <string name="openkeychain_required">OpenKeychain</string>
- <string name="openkeychain_required_long">Conversations :: يستخدم تطبيق آخر يسمى <b> OpenKeychain </b> لتشفير وفك تشفير الرسائل وإدارة المفاتيح العامة الخاصة بك \n\nOpenKeychain تحت الرخصة GPLv3 و لتحميل التطبيق من جوجل بلاي \n\n <small>(وأعد تشغيل التطبيق مرة أخرى)</small></string>
- <string name="restart">اعادة تشغيل</string>
- <string name="install">تثبيت</string>
- <string name="offering">عرض ..</string>
- <string name="waiting">انتظار ..</string>
- <string name="no_pgp_key">OpenPGP-لايوجد مفتاح</string>
- <string name="contact_has_no_pgp_key">Conversations::لا يستطيع تشفير الرساله\n\n<small>من فضلك أخبر صديقك بتنصيب تطبيق OpenPGP.</small></string>
- <string name="no_pgp_keys">OpenPGP-لايوجد مفاتيح</string>
- <string name="contacts_have_no_pgp_keys">Conversations::لا يستطيع تشفير الرساله\n\n<small>من فضلك أخبر صديقك بتنصيب تطبيق OpenPGP.</small></string>
- <string name="encrypted_message_received"><i>تلقيت رساله مشفّرة .. لمسه بأناملك لعرضها.</i></string>
- <string name="pref_general">عام</string>
- <string name="pref_xmpp_resource">الريسورس</string>
- <string name="pref_accept_files">ضبط استقبال الملفات</string>
- <string name="pref_accept_files_summary">اقبل تلقائيا الملفات أقل من</string>
- <string name="pref_notification_settings">اعدادات الإشعارات</string>
- <string name="pref_notifications">الإشعارات</string>
- <string name="pref_notifications_summary">أخبرني عندما تصل رساله جديده</string>
- <string name="pref_vibrate">إعداد الإهتزاز</string>
- <string name="pref_vibrate_summary">تفعيل الاهتزاز عندما تصل رساله جديده</string>
- <string name="pref_sound">التبيه الصوتي</string>
- <string name="pref_sound_summary">سماع صوت عندما تصل رساله</string>
- <string name="pref_advanced_options">اعدادات متقدمّة</string>
- <string name="pref_never_send_crash">لا ترسل تقارير أخطاء</string>
- <string name="pref_never_send_crash_summary">الغاء ارسال تقارير الأخطاء يقلل من فرص حل المشكلة سريعا فكن متعاون</string>
- <string name="pref_confirm_messages">تأكيد الرسالة</string>
- <string name="accept">قبول</string>
- <string name="error">حدث خطأ ما</string>
- <string name="pref_grant_presence_updates">منح تحديثات الظهور</string>
- <string name="pref_grant_presence_updates_summary">اسأل واقبل السؤال عن تحديثات الظهور</string>
- <string name="your_account">حسابك</string>
- <string name="keys">مفاتيح</string>
- <string name="send_presence_updates">ارسال تحديثات الظهور</string>
- <string name="attach_choose_picture">اختيار صورة</string>
- <string name="attach_take_picture">التقاط صورة</string>
- <string name="error_file_not_found">الملف غير موجود</string>
- <string name="account_status_unknown">غير معروف</string>
- <string name="account_status_online">متصل</string>
- <string name="account_status_offline">غير متصل</string>
- <string name="account_status_unauthorized">غير مصرح له</string>
- <string name="account_status_not_found">لا يمكن الاتصال بالسرفر</string>
- <string name="account_status_no_internet">تحقق من اتصالك بالانترنت</string>
- <string name="account_status_regis_fail">فشل تسجيل حساب بالسيرفر</string>
- <string name="account_status_regis_conflict">اسم المستخدم مستخدم من قبل</string>
- <string name="account_status_regis_success">تم تسجيل حسابك بنجاح</string>
- <string name="account_status_regis_not_sup">تسجيل الحسابات غير متاح على هذا السرفر</string>
- <string name="encryption_choice_otr">OTRرسالة مشفرة عبر</string>
- <string name="encryption_choice_pgp">OpenPGPرسالة مشفرة عبر</string>
- <string name="mgmt_account_edit">تعديل الحساب</string>
- <string name="mgmt_account_delete">حذف الحساب</string>
- <string name="mgmt_account_publish_avatar">نشر الصورة الرمزية</string>
- <string name="mgmt_account_enable">تفعيل الحساب</string>
- <string name="mgmt_account_are_you_sure">هل أنت متأكد ؟</string>
- <string name="mgmt_account_delete_confirm_text">اذا مسحت حسابك ستفقد جميع الرسائل المحفوظه !!</string>
- <string name="attach_record_voice">تسجيل صوت</string>
- <string name="account_settings_jabber_id">حساب جابر</string>
- <string name="account_settings_password">كلمة السر</string>
- <string name="account_settings_example_jabber_id">username@example.com</string>
- <string name="account_settings_confirm_password">تأكيد كلمة السر</string>
- <string name="password">كلمة السر</string>
- <string name="confirm_password">تأكيد كلمة السر</string>
- <string name="passwords_do_not_match">الكلمتان غير متطابقتان</string>
- <string name="invalid_jid">حساب جابر غير صالح</string>
- <string name="contact_status_online">متصل</string>
- <string name="contact_status_free_to_chat">متاح للدردشة</string>
- <string name="contact_status_away">بعيد</string>
- <string name="contact_status_extended_away">بعيد جدا</string>
- <string name="contact_status_do_not_disturb">مشغول</string>
- <string name="contact_status_offline">غير متصل</string>
- <string name="muc_details_conference">الغرف</string>
- <string name="muc_details_other_members">المشتركين</string>
- <string name="server_info_show_more">معلومات السرفر</string>
- <string name="server_info_available">متاح</string>
- <string name="server_info_unavailable">غير متاح</string>
- <string name="last_seen_now">آخر ظهور الآن</string>
- <string name="last_seen_min">آخر ظهور منذ 1 دقيقة</string>
- <string name="last_seen_mins">آخر ظهور منذ %d دقيقة</string>
- <string name="last_seen_hour">آخر ظهور منذ 1 ساعة</string>
- <string name="last_seen_hours">آخر ظهور منذ %d ساعة</string>
- <string name="last_seen_day">آخر ظهور منذ 1 يوم</string>
- <string name="last_seen_days">آخر ظهور منذ %d يوم</string>
- <string name="never_seen">لم يظهر متصلا حتى الآن</string>
- <string name="verify">تأكيد</string>
- <string name="conferences">الغرف</string>
- <string name="search">بحث</string>
- <string name="create_contact">اضافة جهة اتصال</string>
- <string name="join_conference">دخول الغرف</string>
- <string name="delete_contact">حذف جهة اتصال</string>
- <string name="view_contact_details">عرض بيانات جهة الاتصال</string>
- <string name="block_contact">حجب جهة اتصال</string>
- <string name="unblock_contact">الغاء حجب جهة اتصال</string>
- <string name="create">أضف</string>
- <string name="contact_already_exists">جهة الاتصال موجودة لديك مسبقا</string>
- <string name="join">دخول</string>
- <string name="conference_address">اسم الغرفة كامل</string>
- <string name="conference_address_example">room@conference.example.com</string>
- <string name="save_as_bookmark">حفظ بالمفضلة</string>
- <string name="delete_bookmark">حذف من المفضلة</string>
- <string name="bookmark_already_exists">موجوده بالمفضلة سابقا</string>
- <string name="you">انت</string>
- <string name="action_edit_subject">تعديل موضوع الغرفة</string>
- <string name="conference_not_found">الغرفة غير متاحه .. تأكد من عنوان الغرفة</string>
- <string name="leave">غادر</string>
- <string name="contact_added_you">جهة اتصال أضافتك </string>
- <string name="publish">نشر</string>
- <string name="publishing">نشر ...</string>
- <string name="private_message_to">الى %s</string>
- <string name="send_private_message_to">ارسال رسالة خاصة الى %s</string>
- <string name="connect">اتصال</string>
- <string name="account_already_exists">الحساب موجود من قبل</string>
- <string name="next">التالي</string>
- <string name="additional_information">معلومات اضافية</string>
- <string name="skip">تجاهل</string>
- <string name="disable_notifications">ايقاف التنبيهات</string>
- <string name="disable_notifications_for_this_conversation">ايقاف التنبيهات لتلك المحادثة</string>
- <string name="notifications_disabled">التنبيهات غير فعاله</string>
- <string name="enable">تفعيل</string>
- <string name="conference_requires_password">الغرفة تطلب كلمة مرور</string>
- <string name="enter_password">أدخل كلمة المرور</string>
- <string name="request_now">اطلب الآن</string>
- <string name="ignore">تجاهل</string>
- <string name="pref_expert_options_other">أخرى</string>
- <string name="pref_conference_name">اسم الغرفة</string>
- <string name="conference_banned">أنت مفصول في هذه الغرفة</string>
- <string name="conference_members_only">الغرفة للأعضاء فقط</string>
- <string name="conference_kicked">تم طردك من الغرفة</string>
- <string name="not_connected_try_again">انقطع الإتصال .. حاول مرة أخرى</string>
- <string name="message_options">خيارات الرساله</string>
- <string name="copy_text">نسخ النص</string>
- <string name="message_text">نص الرسالة</string>
- <string name="account_details">تفاصيل الحساب</string>
- <string name="scan">سكان</string>
- <string name="confirm">تأكيد</string>
- <string name="in_progress">جاري الاتصال</string>
- <string name="failed">فشل الاتصال</string>
- <string name="try_again">حاول مرة أخرى</string>
- <string name="finish">انهاء</string>
- <string name="verified">تأكيد!</string>
- <string name="conversations_foreground_service">Conversations</string>
- <string name="pref_keep_foreground_service">احتفظ بالتطبيق يعمل في المقدمة</string>
- <string name="pref_keep_foreground_service_summary">منع نظام التشغيل من انهاء اتصالك</string>
- <string name="choose_file">اختيار ملف</string>
- <string name="receiving_x_file">اكتمل الإستلام %1$s (%2$d%% بنسبة)</string>
- <string name="download_x_file">تنزيل %s</string>
- <string name="file">ملف</string>
- <string name="open_x_file">فتح %s</string>
- <string name="sending_file">إكتمل الإرسال (%1$d%% بنسبة)</string>
- <string name="preparing_file">إعداد ارسال الملفات</string>
- <string name="x_file_offered_for_download">%s عرض وتنزيل</string>
- <string name="cancel_transmission">الغاء الارسال</string>
- <string name="file_transmission_failed">تعذر ارسال الملف</string>
- <string name="file_deleted">تم مسح الملف</string>
- <string name="no_application_found_to_open_file">لا يوجد تطبيق متاح لعرض الملف</string>
- <string name="could_not_verify_fingerprint">لا يمكن التحقق من البصمة</string>
- <string name="manually_verify">تأكيد يدوي</string>
- <string name="are_you_sure_verify_fingerprint">هل ترغب في تأكيد بصمات OTR لجهات اتصالك ؟</string>
- <string name="pref_show_dynamic_tags">عرض العلامات التلقائية</string>
- <string name="pref_show_dynamic_tags_summary">عرض العلامات للقراءة فقط أسفل بيانات جهات الإتصال </string>
- <string name="enable_notifications">تفعيل الإشعارات</string>
- <string name="conference_with">انشاء غرفة بــ </string>
- <string name="no_conference_server_found">سيرفر الغرف غير موجود</string>
- <string name="conference_creation_failed">فشل انشاء الغرفة</string>
- <string name="conference_created">تم انشاء الرغرفة بنجاح</string>
- <string name="secret_accepted">الاجابة السريّة مقبولة</string>
- <string name="reset">إعادة تعيين</string>
- <string name="account_image_description">الصورة الرمزية للحساب</string>
- <string name="copy_otr_clipboard_description">نسخ OTR بصمات الأصابع إلى الحافظة</string>
- <string name="fetching_history_from_server">جلب المحفوظات من السرفر</string>
- <string name="no_more_history_on_server">لا مزيد من المحفوظات بالسرفر</string>
- <string name="updating">جاري التحديث..</string>
- <string name="password_changed">تم تغيير كلمة السر!</string>
- <string name="could_not_change_password">لايمكن تغيير كلمة السر</string>
- <string name="otr_session_not_started">ارسل رساله لبدأ محادثة مشفّرة</string>
- <string name="ask_question">أسال سؤال</string>
- <string name="smp_explain_answer">سترغب جهة الإتصال بتأكيد بصمتك عبر السر المشترك بينكما لذلك أخبره تلميحا أو إسأله سؤالا يذكره بالسر ليكتبه برده</string>
- <string name="shared_secret_hint_should_not_be_empty">التلميح الذي يراه صديقك لا يمكن ان يكون فارغ</string>
- <string name="shared_secret_can_not_be_empty">السر المشترك بينكما لا يمكن ان يترك فارغا !!</string>
- <string name="manual_verification_explanation">بعناية قارن بين بصمتك المعروضه أدناه وبصمة جهات اتصالك\n يمكنك استخدام أي شكل موثوق به للاتصال مثل بريد إلكتروني مشفر أو مكالمة هاتفية لتبادلها.</string>
- <string name="change_password">تغيير كلمة المرور</string>
- <string name="current_password">كلمة المرور الحالية</string>
- <string name="new_password">كلمة مرور جديدة</string>
- <string name="password_should_not_be_empty">كلمة المرور لا يمكن ان تبقى فارغة</string>
- <string name="enable_all_accounts">تفعيل كل الحسابات</string>
- <string name="disable_all_accounts">تعطيل كل الحسابات</string>
- <string name="perform_action_with">تنفيذ الإجراء مع</string>
- <string name="no_affiliation">زائر</string>
- <string name="no_role">لا دور</string>
- <string name="outcast">مفصول</string>
- <string name="member">عضو</string>
- <string name="advanced_mode">الوضع المتقدم</string>
- <string name="grant_membership">منح عضوية</string>
- <string name="remove_membership">إلغاء عضوية</string>
- <string name="grant_admin_privileges">منح امتيازات الإداره</string>
- <string name="remove_admin_privileges">إلغاء امتيازات الإدارة</string>
- <string name="remove_from_room">إزالة من الغرفة</string>
- <string name="could_not_change_affiliation">لا يمكن تغيير انتساب %s</string>
- <string name="ban_from_conference">حظر من الغرفة</string>
- <string name="removing_from_public_conference">تحاول انهاء تواجد %s الغرفه. سيتم فصله</string>
- <string name="ban_now">حظر الآن</string>
- <string name="could_not_change_role">لا يمكن تغيير دول %s</string>
- <string name="public_conference">الوصول العام للغرفة</string>
- <string name="private_conference">الخاص , اعضاء الغرفة فقط</string>
- <string name="conference_options">اعدادت المؤتمر</string>
- <string name="non_anonymous">لا تسمح للمجهولين بالدخول</string>
- <string name="modified_conference_options">تم تعديل اعدادات المؤتمر!</string>
- <string name="could_not_modify_conference_options">لا يمكن تعديل اعدادات المؤتمر</string>
- <string name="never">أبداً</string>
- <string name="thirty_minutes">30 دقيقة</string>
- <string name="one_hour">ساعة</string>
- <string name="two_hours">ساعتين</string>
- <string name="eight_hours">8 ساعات</string>
- <string name="until_further_notice">حتى إشعار آخر</string>
- <string name="pref_input_options">خيارات الادخال</string>
- <string name="pref_enter_is_send">أدخل للإرسال</string>
- <string name="pref_enter_is_send_summary">استخدام مفتاح الدخول لإرسال رسالة</string>
- <string name="pref_display_enter_key">عرض مفتاح الادخال</string>
- <string name="pref_display_enter_key_summary">تغيير مفتاح الرموز إلى مفتاح الدخول</string>
- <string name="audio">صوت</string>
- <string name="video">فيديو</string>
- <string name="image">صورة</string>
- <string name="pdf_document">مستند PDF</string>
- <string name="apk">تطبيق اندرويد</string>
- <string name="vcard">تواصل</string>
- <string name="received_x_file">تم التلقي %s</string>
- <string name="disable_foreground_service">ايقاف عرض تنويهات الخدمات على رئيسية الهاتف</string>
- <string name="touch_to_open_conversations">ألمس لفتح المحادثات</string>
- <string name="avatar_has_been_published">تم نشر الصورة!</string>
- <string name="sending_x_file">ارسال %s</string>
- <string name="offering_x_file">عرض %s</string>
- <string name="hide_offline">اخفاء غير المتصلين</string>
- <string name="disable_account">ايقاف الحساب</string>
-</resources>
diff --git a/src/main/res/values-ar-rSY/strings.xml b/src/main/res/values-ar-rSY/strings.xml
deleted file mode 100644
index c757504ac..000000000
--- a/src/main/res/values-ar-rSY/strings.xml
+++ /dev/null
@@ -1,2 +0,0 @@
-<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
diff --git a/src/main/res/values-ar/strings.xml b/src/main/res/values-ar/strings.xml
index c757504ac..586a58cf6 100644
--- a/src/main/res/values-ar/strings.xml
+++ b/src/main/res/values-ar/strings.xml
@@ -1,2 +1,315 @@
<?xml version='1.0' encoding='UTF-8'?>
-<resources/>
+<resources>
+ <string name="action_settings">إعدادات</string>
+ <string name="action_add">محادثة جديدة</string>
+ <string name="action_accounts">إدارة الحسابات</string>
+ <string name="action_end_conversation">إنهاء المحادثة</string>
+ <string name="action_contact_details">بيانات جهة الإتصال</string>
+ <string name="action_muc_details">بيانات الغرفة</string>
+ <string name="action_secure">تشفير المحادثة</string>
+ <string name="action_add_account">إضافة حساب</string>
+ <string name="action_edit_contact">تعديل الإسم</string>
+ <string name="action_add_phone_book">إضافة لسجل الهاتف</string>
+ <string name="action_delete_contact">حذف من الإضافات</string>
+ <string name="action_block_contact">حجب جهة إتصال</string>
+ <string name="action_unblock_contact">إنهاء حجب جهة اتصال</string>
+ <string name="action_block_domain">حجب دومين</string>
+ <string name="action_unblock_domain">إنهاء حجب دومين</string>
+ <string name="title_activity_manage_accounts">إدارة الحسابات</string>
+ <string name="title_activity_settings">إعدادات</string>
+ <string name="title_activity_conference_details">بيانات الغرفه</string>
+ <string name="title_activity_contact_details">بيانات جهة الإتصال</string>
+ <string name="title_activity_sharewith">مشاركة مع محادثة</string>
+ <string name="title_activity_start_conversation">بدأ محادثة</string>
+ <string name="title_activity_choose_contact">إختيار جهة اتصال</string>
+ <string name="title_activity_block_list">قائمة المحجوبين</string>
+ <string name="just_now">الآن</string>
+ <string name="minute_ago">منذ 1 دقيقة</string>
+ <string name="minutes_ago">دقائق %d منذ</string>
+ <string name="unread_conversations">محادثات غير مقروءة</string>
+ <string name="sending">ارسال</string>
+ <string name="encrypted_message">رسالة مشفّرة .. الرجاء الإنتظار</string>
+ <string name="nick_in_use">اللقب مستخدم من قبل</string>
+ <string name="admin">مدير</string>
+ <string name="owner">مالك</string>
+ <string name="moderator">مشرف</string>
+ <string name="participant">مشترك</string>
+ <string name="visitor">زائر</string>
+ <string name="remove_contact_text">هل ترغب بحذف جهة الإتصال %s من اضافاتك? ستبقى محادثاتك معه محفوظه</string>
+ <string name="block_contact_text">هل ترغب في حجب %s من ارسال الرسائل لك?</string>
+ <string name="unblock_contact_text">هل ترغب في انهاء حجب %s والسماح له بمراسلتك?</string>
+ <string name="block_domain_text">هل تريد حجب جميع جهات الإتصال من %s?</string>
+ <string name="unblock_domain_text">الغاء حجب جميع جهات الإتصال من %s?</string>
+ <string name="contact_blocked">جهة الاتصال محجوبه</string>
+ <string name="remove_bookmark_text">هل ترغب في حذف %s من المفضلات? المحادثات المحفوظه ستبقى كما هي</string>
+ <string name="register_account">تسجيل حساب جديد في سيرفر</string>
+ <string name="change_password_on_server">تغيير كلمة المرور في سيرفر</string>
+ <string name="share_with">مشاركة مع</string>
+ <string name="start_conversation">بدأ محادثة</string>
+ <string name="invite_contact">دعوة صديق</string>
+ <string name="contacts">جهات الإتصال</string>
+ <string name="cancel">الغاء</string>
+ <string name="set">تعيين</string>
+ <string name="add">اضافة</string>
+ <string name="edit">تعديل</string>
+ <string name="delete">حذف</string>
+ <string name="block">حجب</string>
+ <string name="unblock">الغاء حجب</string>
+ <string name="save">حفظ</string>
+ <string name="ok">موافق</string>
+ <string name="crash_report_title">توقف التطبيق عن العمل</string>
+ <string name="crash_report_message">بموافقتك على ارسال تقارير الأخطاء ستساعد مبرمجي التطبيق على تحسين جودة التطبيق\n<b>تنويه:</b> سيرسل تقارير الأخطاء ان وجدت بأحد الحسابات التي أضفتها.</string>
+ <string name="send_now">ارسال الآن</string>
+ <string name="send_never">لا تسألني ثانية</string>
+ <string name="problem_connecting_to_account">لا يمكن تسجيل الدخول لحسابك</string>
+ <string name="problem_connecting_to_accounts">لا يمكن تسجيل الدخول بحساباتك</string>
+ <string name="touch_to_fix">المس الشاشه لعرض المحادثات</string>
+ <string name="attach_file">ارفاق ملف</string>
+ <string name="not_in_roster">جهة الاتصال ليست مضافه لديك هل ترغب في إضافتها ؟؟</string>
+ <string name="add_contact">اضافة جهة اتصال</string>
+ <string name="send_failed">فشل التسليم</string>
+ <string name="send_rejected">مرفوض</string>
+ <string name="preparing_image">اعداد صورة للإرسال</string>
+ <string name="action_clear_history">حذف سجل المحفوظات</string>
+ <string name="clear_conversation_history">حذف سجل المحفوظات للمحادثة</string>
+ <string name="clear_histor_msg">هل ترغب بحذف جميع الرسائل في تلك المحادثة?\n\n<b>تنويه:</b> هذا لن يؤثر على الرسائل المخزنة على الأجهزة أو أي أماكن أخرى.</string>
+ <string name="delete_messages">حذف الرسائل</string>
+ <string name="choose_presence">اختيار ظهورك لجهات الإتصال</string>
+ <string name="send_otr_message">OTRارساله رساله مشفره عبر</string>
+ <string name="send_pgp_message">OpenPGPارساله رساله مشفره عبر</string>
+ <string name="your_nick_has_been_changed">تم تغيير لقبك بنجاح</string>
+ <string name="send_unencrypted">إرسال بدون تشفير</string>
+ <string name="decryption_failed">فشل فك التشفير. ربما لم يكن لديك المفتاح الخاص الصحيح.</string>
+ <string name="openkeychain_required">OpenKeychain</string>
+ <string name="openkeychain_required_long">Conversations :: يستخدم تطبيق آخر يسمى <b> OpenKeychain </b> لتشفير وفك تشفير الرسائل وإدارة المفاتيح العامة الخاصة بك \n\nOpenKeychain تحت الرخصة GPLv3 و لتحميل التطبيق من جوجل بلاي \n\n <small>(وأعد تشغيل التطبيق مرة أخرى)</small></string>
+ <string name="restart">اعادة تشغيل</string>
+ <string name="install">تثبيت</string>
+ <string name="offering">عرض ..</string>
+ <string name="waiting">انتظار ..</string>
+ <string name="no_pgp_key">OpenPGP-لايوجد مفتاح</string>
+ <string name="contact_has_no_pgp_key">Conversations::لا يستطيع تشفير الرساله\n\n<small>من فضلك أخبر صديقك بتنصيب تطبيق OpenPGP.</small></string>
+ <string name="no_pgp_keys">OpenPGP-لايوجد مفاتيح</string>
+ <string name="contacts_have_no_pgp_keys">Conversations::لا يستطيع تشفير الرساله\n\n<small>من فضلك أخبر صديقك بتنصيب تطبيق OpenPGP.</small></string>
+ <string name="encrypted_message_received"><i>تلقيت رساله مشفّرة .. لمسه بأناملك لعرضها.</i></string>
+ <string name="pref_general">عام</string>
+ <string name="pref_xmpp_resource">الريسورس</string>
+ <string name="pref_accept_files">ضبط استقبال الملفات</string>
+ <string name="pref_accept_files_summary">اقبل تلقائيا الملفات أقل من</string>
+ <string name="pref_notification_settings">اعدادات الإشعارات</string>
+ <string name="pref_notifications">الإشعارات</string>
+ <string name="pref_notifications_summary">أخبرني عندما تصل رساله جديده</string>
+ <string name="pref_vibrate">إعداد الإهتزاز</string>
+ <string name="pref_vibrate_summary">تفعيل الاهتزاز عندما تصل رساله جديده</string>
+ <string name="pref_sound">التبيه الصوتي</string>
+ <string name="pref_sound_summary">سماع صوت عندما تصل رساله</string>
+ <string name="pref_advanced_options">اعدادات متقدمّة</string>
+ <string name="pref_never_send_crash">لا ترسل تقارير أخطاء</string>
+ <string name="pref_never_send_crash_summary">الغاء ارسال تقارير الأخطاء يقلل من فرص حل المشكلة سريعا فكن متعاون</string>
+ <string name="pref_confirm_messages">تأكيد الرسالة</string>
+ <string name="accept">قبول</string>
+ <string name="error">حدث خطأ ما</string>
+ <string name="pref_grant_presence_updates">منح تحديثات الظهور</string>
+ <string name="pref_grant_presence_updates_summary">اسأل واقبل السؤال عن تحديثات الظهور</string>
+ <string name="your_account">حسابك</string>
+ <string name="keys">مفاتيح</string>
+ <string name="send_presence_updates">ارسال تحديثات الظهور</string>
+ <string name="attach_choose_picture">اختيار صورة</string>
+ <string name="attach_take_picture">التقاط صورة</string>
+ <string name="error_file_not_found">الملف غير موجود</string>
+ <string name="account_status_unknown">غير معروف</string>
+ <string name="account_status_online">متصل</string>
+ <string name="account_status_offline">غير متصل</string>
+ <string name="account_status_unauthorized">غير مصرح له</string>
+ <string name="account_status_not_found">لا يمكن الاتصال بالسرفر</string>
+ <string name="account_status_no_internet">تحقق من اتصالك بالانترنت</string>
+ <string name="account_status_regis_fail">فشل تسجيل حساب بالسيرفر</string>
+ <string name="account_status_regis_conflict">اسم المستخدم مستخدم من قبل</string>
+ <string name="account_status_regis_success">تم تسجيل حسابك بنجاح</string>
+ <string name="account_status_regis_not_sup">تسجيل الحسابات غير متاح على هذا السرفر</string>
+ <string name="encryption_choice_otr">OTRرسالة مشفرة عبر</string>
+ <string name="encryption_choice_pgp">OpenPGPرسالة مشفرة عبر</string>
+ <string name="mgmt_account_edit">تعديل الحساب</string>
+ <string name="mgmt_account_delete">حذف الحساب</string>
+ <string name="mgmt_account_publish_avatar">نشر الصورة الرمزية</string>
+ <string name="mgmt_account_enable">تفعيل الحساب</string>
+ <string name="mgmt_account_are_you_sure">هل أنت متأكد ؟</string>
+ <string name="mgmt_account_delete_confirm_text">اذا مسحت حسابك ستفقد جميع الرسائل المحفوظه !!</string>
+ <string name="attach_record_voice">تسجيل صوت</string>
+ <string name="account_settings_jabber_id">حساب جابر</string>
+ <string name="account_settings_password">كلمة السر</string>
+ <string name="account_settings_example_jabber_id">username@example.com</string>
+ <string name="account_settings_confirm_password">تأكيد كلمة السر</string>
+ <string name="password">كلمة السر</string>
+ <string name="confirm_password">تأكيد كلمة السر</string>
+ <string name="passwords_do_not_match">الكلمتان غير متطابقتان</string>
+ <string name="invalid_jid">حساب جابر غير صالح</string>
+ <string name="contact_status_online">متصل</string>
+ <string name="contact_status_free_to_chat">متاح للدردشة</string>
+ <string name="contact_status_away">بعيد</string>
+ <string name="contact_status_extended_away">بعيد جدا</string>
+ <string name="contact_status_do_not_disturb">مشغول</string>
+ <string name="contact_status_offline">غير متصل</string>
+ <string name="muc_details_conference">الغرف</string>
+ <string name="muc_details_other_members">المشتركين</string>
+ <string name="server_info_show_more">معلومات السرفر</string>
+ <string name="server_info_available">متاح</string>
+ <string name="server_info_unavailable">غير متاح</string>
+ <string name="last_seen_now">آخر ظهور الآن</string>
+ <string name="last_seen_min">آخر ظهور منذ 1 دقيقة</string>
+ <string name="last_seen_mins">آخر ظهور منذ %d دقيقة</string>
+ <string name="last_seen_hour">آخر ظهور منذ 1 ساعة</string>
+ <string name="last_seen_hours">آخر ظهور منذ %d ساعة</string>
+ <string name="last_seen_day">آخر ظهور منذ 1 يوم</string>
+ <string name="last_seen_days">آخر ظهور منذ %d يوم</string>
+ <string name="never_seen">لم يظهر متصلا حتى الآن</string>
+ <string name="verify">تأكيد</string>
+ <string name="conferences">الغرف</string>
+ <string name="search">بحث</string>
+ <string name="create_contact">اضافة جهة اتصال</string>
+ <string name="join_conference">دخول الغرف</string>
+ <string name="delete_contact">حذف جهة اتصال</string>
+ <string name="view_contact_details">عرض بيانات جهة الاتصال</string>
+ <string name="block_contact">حجب جهة اتصال</string>
+ <string name="unblock_contact">الغاء حجب جهة اتصال</string>
+ <string name="create">أضف</string>
+ <string name="contact_already_exists">جهة الاتصال موجودة لديك مسبقا</string>
+ <string name="join">دخول</string>
+ <string name="conference_address">اسم الغرفة كامل</string>
+ <string name="conference_address_example">room@conference.example.com</string>
+ <string name="save_as_bookmark">حفظ بالمفضلة</string>
+ <string name="delete_bookmark">حذف من المفضلة</string>
+ <string name="bookmark_already_exists">موجوده بالمفضلة سابقا</string>
+ <string name="you">انت</string>
+ <string name="action_edit_subject">تعديل موضوع الغرفة</string>
+ <string name="conference_not_found">الغرفة غير متاحه .. تأكد من عنوان الغرفة</string>
+ <string name="leave">غادر</string>
+ <string name="contact_added_you">جهة اتصال أضافتك </string>
+ <string name="publish">نشر</string>
+ <string name="publishing">نشر ...</string>
+ <string name="private_message_to">الى %s</string>
+ <string name="send_private_message_to">ارسال رسالة خاصة الى %s</string>
+ <string name="connect">اتصال</string>
+ <string name="account_already_exists">الحساب موجود من قبل</string>
+ <string name="next">التالي</string>
+ <string name="additional_information">معلومات اضافية</string>
+ <string name="skip">تجاهل</string>
+ <string name="disable_notifications">ايقاف التنبيهات</string>
+ <string name="disable_notifications_for_this_conversation">ايقاف التنبيهات لتلك المحادثة</string>
+ <string name="notifications_disabled">التنبيهات غير فعاله</string>
+ <string name="enable">تفعيل</string>
+ <string name="conference_requires_password">الغرفة تطلب كلمة مرور</string>
+ <string name="enter_password">أدخل كلمة المرور</string>
+ <string name="request_now">اطلب الآن</string>
+ <string name="ignore">تجاهل</string>
+ <string name="pref_expert_options_other">أخرى</string>
+ <string name="pref_conference_name">اسم الغرفة</string>
+ <string name="conference_banned">أنت مفصول في هذه الغرفة</string>
+ <string name="conference_members_only">الغرفة للأعضاء فقط</string>
+ <string name="conference_kicked">تم طردك من الغرفة</string>
+ <string name="not_connected_try_again">انقطع الإتصال .. حاول مرة أخرى</string>
+ <string name="message_options">خيارات الرساله</string>
+ <string name="copy_text">نسخ النص</string>
+ <string name="message_text">نص الرسالة</string>
+ <string name="account_details">تفاصيل الحساب</string>
+ <string name="scan">سكان</string>
+ <string name="confirm">تأكيد</string>
+ <string name="in_progress">جاري الاتصال</string>
+ <string name="failed">فشل الاتصال</string>
+ <string name="try_again">حاول مرة أخرى</string>
+ <string name="finish">انهاء</string>
+ <string name="verified">تأكيد!</string>
+ <string name="conversations_foreground_service">Conversations</string>
+ <string name="pref_keep_foreground_service">احتفظ بالتطبيق يعمل في المقدمة</string>
+ <string name="pref_keep_foreground_service_summary">منع نظام التشغيل من انهاء اتصالك</string>
+ <string name="choose_file">اختيار ملف</string>
+ <string name="receiving_x_file">اكتمل الإستلام %1$s (%2$d%% بنسبة)</string>
+ <string name="download_x_file">تنزيل %s</string>
+ <string name="file">ملف</string>
+ <string name="open_x_file">فتح %s</string>
+ <string name="sending_file">إكتمل الإرسال (%1$d%% بنسبة)</string>
+ <string name="preparing_file">إعداد ارسال الملفات</string>
+ <string name="x_file_offered_for_download">%s عرض وتنزيل</string>
+ <string name="cancel_transmission">الغاء الارسال</string>
+ <string name="file_transmission_failed">تعذر ارسال الملف</string>
+ <string name="file_deleted">تم مسح الملف</string>
+ <string name="no_application_found_to_open_file">لا يوجد تطبيق متاح لعرض الملف</string>
+ <string name="could_not_verify_fingerprint">لا يمكن التحقق من البصمة</string>
+ <string name="manually_verify">تأكيد يدوي</string>
+ <string name="are_you_sure_verify_fingerprint">هل ترغب في تأكيد بصمات OTR لجهات اتصالك ؟</string>
+ <string name="pref_show_dynamic_tags">عرض العلامات التلقائية</string>
+ <string name="pref_show_dynamic_tags_summary">عرض العلامات للقراءة فقط أسفل بيانات جهات الإتصال </string>
+ <string name="enable_notifications">تفعيل الإشعارات</string>
+ <string name="conference_with">انشاء غرفة بــ </string>
+ <string name="no_conference_server_found">سيرفر الغرف غير موجود</string>
+ <string name="conference_creation_failed">فشل انشاء الغرفة</string>
+ <string name="conference_created">تم انشاء الرغرفة بنجاح</string>
+ <string name="secret_accepted">الاجابة السريّة مقبولة</string>
+ <string name="reset">إعادة تعيين</string>
+ <string name="account_image_description">الصورة الرمزية للحساب</string>
+ <string name="copy_otr_clipboard_description">نسخ OTR بصمات الأصابع إلى الحافظة</string>
+ <string name="fetching_history_from_server">جلب المحفوظات من السرفر</string>
+ <string name="no_more_history_on_server">لا مزيد من المحفوظات بالسرفر</string>
+ <string name="updating">جاري التحديث..</string>
+ <string name="password_changed">تم تغيير كلمة السر!</string>
+ <string name="could_not_change_password">لايمكن تغيير كلمة السر</string>
+ <string name="otr_session_not_started">ارسل رساله لبدأ محادثة مشفّرة</string>
+ <string name="ask_question">أسال سؤال</string>
+ <string name="smp_explain_answer">سترغب جهة الإتصال بتأكيد بصمتك عبر السر المشترك بينكما لذلك أخبره تلميحا أو إسأله سؤالا يذكره بالسر ليكتبه برده</string>
+ <string name="shared_secret_hint_should_not_be_empty">التلميح الذي يراه صديقك لا يمكن ان يكون فارغ</string>
+ <string name="shared_secret_can_not_be_empty">السر المشترك بينكما لا يمكن ان يترك فارغا !!</string>
+ <string name="manual_verification_explanation">بعناية قارن بين بصمتك المعروضه أدناه وبصمة جهات اتصالك\n يمكنك استخدام أي شكل موثوق به للاتصال مثل بريد إلكتروني مشفر أو مكالمة هاتفية لتبادلها.</string>
+ <string name="change_password">تغيير كلمة المرور</string>
+ <string name="current_password">كلمة المرور الحالية</string>
+ <string name="new_password">كلمة مرور جديدة</string>
+ <string name="password_should_not_be_empty">كلمة المرور لا يمكن ان تبقى فارغة</string>
+ <string name="enable_all_accounts">تفعيل كل الحسابات</string>
+ <string name="disable_all_accounts">تعطيل كل الحسابات</string>
+ <string name="perform_action_with">تنفيذ الإجراء مع</string>
+ <string name="no_affiliation">زائر</string>
+ <string name="no_role">لا دور</string>
+ <string name="outcast">مفصول</string>
+ <string name="member">عضو</string>
+ <string name="advanced_mode">الوضع المتقدم</string>
+ <string name="grant_membership">منح عضوية</string>
+ <string name="remove_membership">إلغاء عضوية</string>
+ <string name="grant_admin_privileges">منح امتيازات الإداره</string>
+ <string name="remove_admin_privileges">إلغاء امتيازات الإدارة</string>
+ <string name="remove_from_room">إزالة من الغرفة</string>
+ <string name="could_not_change_affiliation">لا يمكن تغيير انتساب %s</string>
+ <string name="ban_from_conference">حظر من الغرفة</string>
+ <string name="removing_from_public_conference">تحاول انهاء تواجد %s الغرفه. سيتم فصله</string>
+ <string name="ban_now">حظر الآن</string>
+ <string name="could_not_change_role">لا يمكن تغيير دول %s</string>
+ <string name="public_conference">الوصول العام للغرفة</string>
+ <string name="private_conference">الخاص , اعضاء الغرفة فقط</string>
+ <string name="conference_options">اعدادت المؤتمر</string>
+ <string name="non_anonymous">لا تسمح للمجهولين بالدخول</string>
+ <string name="modified_conference_options">تم تعديل اعدادات المؤتمر!</string>
+ <string name="could_not_modify_conference_options">لا يمكن تعديل اعدادات المؤتمر</string>
+ <string name="never">أبداً</string>
+ <string name="thirty_minutes">30 دقيقة</string>
+ <string name="one_hour">ساعة</string>
+ <string name="two_hours">ساعتين</string>
+ <string name="eight_hours">8 ساعات</string>
+ <string name="until_further_notice">حتى إشعار آخر</string>
+ <string name="pref_input_options">خيارات الادخال</string>
+ <string name="pref_enter_is_send">أدخل للإرسال</string>
+ <string name="pref_enter_is_send_summary">استخدام مفتاح الدخول لإرسال رسالة</string>
+ <string name="pref_display_enter_key">عرض مفتاح الادخال</string>
+ <string name="pref_display_enter_key_summary">تغيير مفتاح الرموز إلى مفتاح الدخول</string>
+ <string name="audio">صوت</string>
+ <string name="video">فيديو</string>
+ <string name="image">صورة</string>
+ <string name="pdf_document">مستند PDF</string>
+ <string name="apk">تطبيق اندرويد</string>
+ <string name="vcard">تواصل</string>
+ <string name="received_x_file">تم التلقي %s</string>
+ <string name="disable_foreground_service">ايقاف عرض تنويهات الخدمات على رئيسية الهاتف</string>
+ <string name="touch_to_open_conversations">ألمس لفتح المحادثات</string>
+ <string name="avatar_has_been_published">تم نشر الصورة!</string>
+ <string name="sending_x_file">ارسال %s</string>
+ <string name="offering_x_file">عرض %s</string>
+ <string name="hide_offline">اخفاء غير المتصلين</string>
+ <string name="disable_account">ايقاف الحساب</string>
+ <string name="dialog_manage_certs_negativebutton">الغاء</string>
+</resources>
diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml
index 71a52669d..11c3446b9 100644
--- a/src/main/res/values-bg/strings.xml
+++ b/src/main/res/values-bg/strings.xml
@@ -74,7 +74,7 @@
<string name="clear_conversation_history">Изчистване на историята на разговорите</string>
<string name="clear_histor_msg">Искате ли да изтриете всички съобщения от този разговор?\n\n<b>Внимание:</b> Това няма да изтрие съобщенията, съхранявани на други устройства или на сървърите.</string>
<string name="delete_messages">Изтриване на съобщенията</string>
- <string name="also_end_conversation">Този разговор да приключи след това</string>
+ <string name="also_end_conversation">Приключване на този разговор след това</string>
<string name="choose_presence">Изберете присъствие за контакта</string>
<string name="send_unencrypted_message">Изпр. на нешифр. съобщение</string>
<string name="send_otr_message">Изпр. на съобщение, шифр. чрез OTP</string>
@@ -335,6 +335,9 @@
<string name="conversations_foreground_service">Conversations</string>
<string name="pref_keep_foreground_service">Услугата да е на преден план</string>
<string name="pref_keep_foreground_service_summary">Предотвратява прекъсването на връзката Ви от операционната система</string>
+ <string name="pref_export_logs">Изнасяне на журналите</string>
+ <string name="pref_export_logs_summary">Записване на журналите в картата с памет</string>
+ <string name="notification_export_logs_title">Записване на журналите в картата с памет</string>
<string name="choose_file">Изберете файл</string>
<string name="receiving_x_file">Получаване на %1$s (%2$d%% завършено)</string>
<string name="download_x_file">Сваляне на %s</string>
@@ -484,5 +487,19 @@
<string name="pref_use_white_background">Използване на бял фон</string>
<string name="pref_use_white_background_summary">Показване на получените съобщения с черен текст на бял фон</string>
<string name="account_status_dns_timeout">Време на изчакване на DNS</string>
- <string name="server_info_broken">Недостъпен</string>
+ <string name="server_info_broken">Повредено</string>
+ <string name="pref_presence_settings">Настройки за присъствието</string>
+ <string name="pref_away_when_screen_off">Отсъстващ, когато екранът е изключен</string>
+ <string name="pref_away_when_screen_off_summary">Преминава в състояние „отсъстващ“ когато екранът бъде изключен</string>
+ <string name="pref_xa_on_silent_mode">Недостъпен, в тих режим</string>
+ <string name="pref_xa_on_silent_mode_summary">Преминава в състояние „недостъпен“ когато телефонът е в тих режим</string>
+ <string name="action_add_account_with_certificate">Добавяне на профил със сертификат</string>
+ <string name="unable_to_parse_certificate">Неуспешно прочитане на сертификата</string>
+ <string name="authenticate_with_certificate">Оставете празно за удостоверяване със сертификат</string>
+ <string name="captcha_ocr">Текст за проверка</string>
+ <string name="captcha_required">Проверката е задължителна</string>
+ <string name="captcha_hint">въведете текста от изображението</string>
+ <string name="certificate_chain_is_not_trusted">Сертификатът не е потвърден</string>
+ <string name="jid_does_not_match_certificate">Jabber идентификатора не съответства на сертификата</string>
+ <string name="action_renew_certificate">Подновяване на сертификата</string>
</resources>
diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml
index 5eee38c88..43db6f5fb 100644
--- a/src/main/res/values-ca/strings.xml
+++ b/src/main/res/values-ca/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Netejar historial de conversa</string>
<string name="clear_histor_msg">Vols esborrar tots els missatges d\'aquesta conversa?\n\n<b>Avís:</b> Això no afectarà els missatges desats en altres dispositius o servidors.</string>
<string name="delete_messages">Esborrar missatges</string>
- <string name="also_end_conversation">Finalitzar aquesta conversa més tard</string>
<string name="choose_presence">Selecciona recurs del contacte</string>
<string name="send_otr_message">Enviar missatge xifrat amb OTR</string>
<string name="send_pgp_message">Enviar missatge xifrat amb OpenPGP</string>
diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml
index 666cb8651..57f93f5cd 100644
--- a/src/main/res/values-cs/strings.xml
+++ b/src/main/res/values-cs/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Smaže historii konverzací</string>
<string name="clear_histor_msg">Chcete smazat všechny zprávy v této konverzaci?\n\n<b>Varování:</b> Toto neovlivní zprávy uložené na jiných přístrojích nebo serverech.</string>
<string name="delete_messages">Smazat zprávy</string>
- <string name="also_end_conversation">Poté ukončit i tuto konverzaci</string>
<string name="choose_presence">Vybrat aktualizaci stavu pro kontakt</string>
<string name="send_unencrypted_message">Odeslat nešifrovanou zprávu</string>
<string name="send_otr_message">Poslat OTR šifrovanou zprávu</string>
diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml
index 32037dbe6..25d5d814b 100644
--- a/src/main/res/values-de/strings.xml
+++ b/src/main/res/values-de/strings.xml
@@ -20,7 +20,7 @@
<string name="title_activity_conference_details">Konferenz-Details</string>
<string name="title_activity_contact_details">Kontakt-Details</string>
<string name="title_activity_sharewith">Mit Unterhaltung teilen</string>
- <string name="title_activity_start_conversation">Beginne Unterhaltung</string>
+ <string name="title_activity_start_conversation">Unterhaltung beginnen</string>
<string name="title_activity_choose_contact">Kontakt auswählen</string>
<string name="title_activity_block_list">Sperrliste</string>
<string name="just_now">gerade</string>
@@ -28,7 +28,7 @@
<string name="minutes_ago">vor %d Minuten</string>
<string name="unread_conversations">ungelesene Unterhaltungen</string>
<string name="sending">senden…</string>
- <string name="encrypted_message">Entschlüssele Nachricht. Bitte warten…</string>
+ <string name="encrypted_message">Nachricht wird entschlüsselt. Bitte warten …</string>
<string name="nick_in_use">Nickname wird bereits verwendet</string>
<string name="admin">Administrator</string>
<string name="owner">Eigentümer</string>
@@ -38,14 +38,14 @@
<string name="remove_contact_text">Möchtest du %s von deiner Kontaktliste entfernen? Die Unterhaltung mit diesem Kontakt wird dabei nicht entfernt.</string>
<string name="block_contact_text">Möchtest du %s sperren und keine Nachrichten mehr erhalten?</string>
<string name="unblock_contact_text">Möchtest du %s entsperren und wieder Nachrichten empfangen?</string>
- <string name="block_domain_text">Sperre alle Kontakte von %s?</string>
- <string name="unblock_domain_text">Entsperre alle Kontakte %s?</string>
+ <string name="block_domain_text">Alle Kontakte von %s sperren?</string>
+ <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="change_password_on_server">Passwort ändern</string>
<string name="share_with">Teile mit…</string>
- <string name="start_conversation">Beginne Unterhaltung</string>
+ <string name="start_conversation">Unterhaltung beginnen</string>
<string name="invite_contact">Kontakt einladen</string>
<string name="contacts">Kontakte</string>
<string name="cancel">Abbrechen</string>
@@ -63,11 +63,11 @@
<string name="send_never">Nie mehr nachfragen</string>
<string name="problem_connecting_to_account">Es gibt Probleme beim Verbindungsaufbau mit einem Konto</string>
<string name="problem_connecting_to_accounts">Es gibt Probleme beim Verbindungsaufbau mit mehreren Konten</string>
- <string name="touch_to_fix">Drücke hier, um das Konto zu verwalten</string>
+ <string name="touch_to_fix">Hier antippen, um Ihre Konten zu verwalten</string>
<string name="attach_file">Datei anfügen</string>
<string name="not_in_roster">Der Kontakt ist nicht in deiner Kontaktliste. Möchtest du ihn hinzufügen?</string>
- <string name="add_contact">Zur Kontaktliste hinzufügen</string>
- <string name="send_failed">Zustellung nicht erfolgreich</string>
+ <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="action_clear_history">Verlauf löschen</string>
@@ -97,21 +97,21 @@
<string name="pref_general">Allgemeines</string>
<string name="pref_xmpp_resource">XMPP-Ressource</string>
<string name="pref_xmpp_resource_summary">Der Name, mit dem sich der Client selbst identifiziert</string>
- <string name="pref_accept_files">Dateiannahme</string>
- <string name="pref_accept_files_summary">Dateien, die kleiner sind als …, automatisch annehmen</string>
+ <string name="pref_accept_files">Dateien annehmen</string>
+ <string name="pref_accept_files_summary">Dateien automatisch annehmen, die kleiner sind als …</string>
<string name="pref_notification_settings">Benachrichtigungen</string>
<string name="pref_notifications">Benachrichtigungen</string>
- <string name="pref_notifications_summary">Benachrichtige mich, wenn eine neue Nachricht ankommt</string>
+ <string name="pref_notifications_summary">Benachrichtigen bei Erhalt einer neuen Nachricht</string>
<string name="pref_vibrate">Vibrieren</string>
- <string name="pref_vibrate_summary">Vibriere, wenn eine neue Nachricht ankommt</string>
- <string name="pref_sound">Klingelton</string>
- <string name="pref_sound_summary">Spiele Klingelton, wenn eine neue Nachricht ankommt</string>
- <string name="pref_conference_notifications">öffentliche Konferenz-Benachrichtigungen</string>
+ <string name="pref_vibrate_summary">Vibrieren bei Erhalt einer neuen Nachricht</string>
+ <string name="pref_sound">Benachrichtigungston</string>
+ <string name="pref_sound_summary">Benachrichtigungston wiedergeben</string>
+ <string name="pref_conference_notifications">Benachrichtigungen in öffentlichen Konferenzen</string>
<string name="pref_conference_notifications_summary">Bei jeder Nachricht in öffentlichen Konferenzen benachrichtigen und nicht nur, wenn ich angesprochen werde</string>
<string name="pref_notification_grace_period">Gnadenfrist</string>
<string name="pref_notification_grace_period_summary">Deaktiviere Benachrichtigungen für eine kurze Zeit nach Erhalt einer Nachricht, die von einem anderen deiner Clients kommt.</string>
<string name="pref_advanced_options">Erweiterte Optionen</string>
- <string name="pref_never_send_crash">Sende niemals Absturzberichte</string>
+ <string name="pref_never_send_crash">Niemals Absturzberichte senden</string>
<string name="pref_never_send_crash_summary">Wenn du Absturzberichte einschickst, hilfst du Conversations stetig zu verbessern</string>
<string name="pref_confirm_messages">Lese- und Empfangsbestätigung senden</string>
<string name="pref_confirm_messages_summary">Informiere deine Kontakte, wenn du eine Nachricht empfangen und gelesen hast</string>
@@ -130,7 +130,7 @@
<string name="ask_for_presence_updates">Online-Status anfragen</string>
<string name="attach_choose_picture">Bild auswählen</string>
<string name="attach_take_picture">Bild aufnehmen</string>
- <string name="preemptively_grant">Erlaube Statusanfrage vorab</string>
+ <string name="preemptively_grant">Statusanfragen vorab erlauben</string>
<string name="error_not_an_image_file">Die ausgewählte Datei ist kein Bild</string>
<string name="error_compressing_image">Fehler beim Umwandeln des Bildes</string>
<string name="error_file_not_found">Datei nicht gefunden</string>
@@ -174,14 +174,14 @@
<string name="error_out_of_memory">Zu wenig Speicher vorhanden. Das Bild ist zu groß</string>
<string name="add_phone_book_text">Möchtest du %s zum Telefonbuch hinzufügen?</string>
<string name="contact_status_online">online</string>
- <string name="contact_status_free_to_chat">Bereit</string>
- <string name="contact_status_away">Abwesend</string>
- <string name="contact_status_extended_away">Abwesend (erweitert)</string>
- <string name="contact_status_do_not_disturb">Nicht stören</string>
- <string name="contact_status_offline">Offline</string>
+ <string name="contact_status_free_to_chat">bereit</string>
+ <string name="contact_status_away">abwesend</string>
+ <string name="contact_status_extended_away">länger abwesend</string>
+ <string name="contact_status_do_not_disturb">nicht stören</string>
+ <string name="contact_status_offline">offline</string>
<string name="muc_details_conference">Konferenz</string>
<string name="muc_details_other_members">Andere Mitglieder</string>
- <string name="server_info_show_more">Server Info</string>
+ <string name="server_info_show_more">Server-Info</string>
<string name="server_info_mam">XEP-0313: MAM</string>
<string name="server_info_carbon_messages">XEP-0280: Message Carbons</string>
<string name="server_info_csi">XEP-0352: CSI</string>
@@ -204,7 +204,7 @@
<string name="install_openkeychain">Verschlüsselte Nachricht. Bitte installiere OpenKeychain zur Entschlüsselung.</string>
<string name="unknown_otr_fingerprint">Unbekannter OTR-Fingerabdruck</string>
<string name="openpgp_messages_found">Verschlüsselte OpenPGP-Nachricht gefunden</string>
- <string name="reception_failed">Empfang ist fehlgeschlagen</string>
+ <string name="reception_failed">Empfang fehlgeschlagen</string>
<string name="your_fingerprint">Dein Fingerabdruck</string>
<string name="otr_fingerprint">OTR-Fingerabdruck</string>
<string name="omemo_fingerprint">OMEMO-Fingerabdruck</string>
@@ -214,12 +214,12 @@
<string name="trust_omemo_fingerprints">OMEMO-Fingerabdruck vertrauen</string>
<string name="fetching_keys">Schlüssel abrufen…</string>
<string name="done">Erledigt</string>
- <string name="verify">Verifizieren</string>
+ <string name="verify">Überprüfen</string>
<string name="decrypt">Entschlüsseln</string>
<string name="conferences">Konferenzen</string>
- <string name="search">Suche</string>
+ <string name="search">Suchen</string>
<string name="create_contact">Kontakt erstellen</string>
- <string name="join_conference">Konferenz betreten</string>
+ <string name="join_conference">Konferenz beitreten</string>
<string name="delete_contact">Kontakt löschen</string>
<string name="view_contact_details">Kontakt-Details anzeigen</string>
<string name="block_contact">Kontakt sperren</string>
@@ -233,19 +233,19 @@
<string name="delete_bookmark">Von Kontaktliste entfernen</string>
<string name="bookmark_already_exists">Die Konferenz befindet sich bereits auf deiner Kontaktliste</string>
<string name="you">Du</string>
- <string name="action_edit_subject">Konferenz-Thema anpassen</string>
+ <string name="action_edit_subject">Konferenz-Thema bearbeiten</string>
<string name="conference_not_found">Konferenz nicht gefunden</string>
<string name="leave">Verlassen</string>
<string name="contact_added_you">Der Kontakt hat dich zur Kontaktliste hinzugefügt</string>
<string name="add_back">Auch hinzufügen</string>
<string name="contact_has_read_up_to_this_point">%s hat bis zu diesem Punkt gelesen</string>
<string name="publish">Veröffentlichen</string>
- <string name="touch_to_choose_picture">Hier klicken, um einen Avatar auszuwählen</string>
+ <string name="touch_to_choose_picture">Avatar anklicken, um ein Bild aus der Galerie auszuwählen</string>
<string name="publish_avatar_explanation">Achtung: Jeder, der deinen Status sehen darf, sieht auch deinen Avatar.</string>
<string name="publishing">Veröffentliche…</string>
<string name="error_publish_avatar_server_reject">Der Server hat die Veröffentlichung des Avatars abgelehnt.</string>
<string name="error_publish_avatar_converting">Bei der Konvertierung des Avatars lief etwas schief.</string>
- <string name="error_saving_avatar">Kann Avatar nicht speichern.</string>
+ <string name="error_saving_avatar">Avatar kann nicht gespeichert werden</string>
<string name="or_long_press_for_default">(Oder klicke lange, um Standard wiederherzustellen)</string>
<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>
@@ -263,13 +263,13 @@
<string name="enable">Aktivieren</string>
<string name="conference_requires_password">Konferenz ist passwortgeschützt</string>
<string name="enter_password">Passwort eingeben</string>
- <string name="missing_presence_updates">Fehlender Online-Status vom Kontakt</string>
+ <string name="missing_presence_updates">Fehlender Online-Status des Kontakts</string>
<string name="request_presence_updates">Bitte erst Online-Status vom Kontakt anfragen.\n\n<small>Dies wird verwendet, um festzustellen, welche Client(s) der Kontakt benutzt.</small></string>
<string name="request_now">Jetzt anfordern</string>
<string name="delete_fingerprint">Fingerabdruck löschen</string>
- <string name="sure_delete_fingerprint">Soll dieser Fingerabdruck gelöscht werden?</string>
+ <string name="sure_delete_fingerprint">Soll dieser Fingerabdruck wirklich gelöscht werden?</string>
<string name="ignore">Ignorieren</string>
- <string name="without_mutual_presence_updates"><b>Achtung:</b> Ohne gegenseitig den Online-Status zu kennen, kann es zu unerwarteten Problemen kommen.\n\n<small>Bitte die Einstellungen in den Kontakt-Details prüfen.</small></string>
+ <string name="without_mutual_presence_updates"><b>Achtung:</b> Ohne gegenseitige Kenntnis des Online-Status kann es zu unerwarteten Problemen kommen.\n\n<small>Bitte die Einstellungen in den Kontakt-Details prüfen.</small></string>
<string name="pref_encryption_settings">Verschlüsselungs-Einstellungen</string>
<string name="pref_force_encryption">Ende-zu-Ende-Verschlüsselung erzwingen</string>
<string name="pref_force_encryption_summary">Nachrichten immer verschlüsseln (außer für Konferenzen)</string>
@@ -282,14 +282,14 @@
<string name="title_pref_quiet_hours">Ruhige Stunden</string>
<string name="title_pref_quiet_hours_start_time">Beginn</string>
<string name="title_pref_quiet_hours_end_time">Ende</string>
- <string name="title_pref_enable_quiet_hours">Aktiviere ruhige Stunden</string>
+ <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_send_button_to_indicate_status">Absende-Knopf zeigt Online-Status an</string>
- <string name="pref_use_indicate_received">Anfrage für Nachrichtenempfang</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>
- <string name="pref_use_send_button_to_indicate_status_summary">Absende-Knopf einfärben, um den Online-Status des Kontakts zu signalisieren</string>
+ <string name="pref_use_send_button_to_indicate_status_summary">\"Senden\"-Schaltfläche einfärben, um den Online-Status des Kontakts anzuzeigen</string>
<string name="pref_expert_options_other">Sonstiges</string>
<string name="pref_conference_name">Konferenz-Name</string>
<string name="pref_conference_name_summary">Konferenz-Thema statt Raum-JID als Namen verwenden</string>
@@ -298,8 +298,8 @@
<string name="conference_banned">Du wurdest von der Konferenz ausgeschlossen</string>
<string name="conference_members_only">Die Konferenz ist nur für Mitglieder</string>
<string name="conference_kicked">Du wurdest aus der Konferenz geworfen</string>
- <string name="using_account">Verwende Konto %s</string>
- <string name="checking_x">%s wird auf HTTP-Host geprüft</string>
+ <string name="using_account">Verwendetes Konto: %s</string>
+ <string name="checking_x">%s auf HTTP-Host wird überprüft</string>
<string name="not_connected_try_again">Nicht verbunden, bitte später versuchen</string>
<string name="check_x_filesize">%s-Größe prüfen</string>
<string name="message_options">Nachrichtenoptionen</string>
@@ -311,18 +311,18 @@
<string name="url_copied_to_clipboard">URL in Zwischenablage kopiert</string>
<string name="message_copied_to_clipboard">Nachricht in Zwischenablage kopiert</string>
<string name="image_transmission_failed">Bild-Übertragung fehlgeschlagen</string>
- <string name="scan_qr_code">Scanne QR-Code</string>
- <string name="show_qr_code">Zeige QR-Code</string>
- <string name="show_block_list">Zeige Sperrliste</string>
+ <string name="scan_qr_code">QR-Code scannen</string>
+ <string name="show_qr_code">QR-Code anzeigen</string>
+ <string name="show_block_list">Sperrliste anzeigen</string>
<string name="account_details">Konto-Details</string>
- <string name="verify_otr">Prüfe OTR</string>
+ <string name="verify_otr">OTR prüfen</string>
<string name="remote_fingerprint">Fingerabdruck der Gegenseite</string>
- <string name="scan">Scanne</string>
+ <string name="scan">Scannen</string>
<string name="or_touch_phones">(oder Touch-Handys)</string>
<string name="smp">Socialist Millionaire Protocol</string>
<string name="shared_secret_hint">Hinweis oder Frage</string>
<string name="shared_secret_secret">Gemeinsamer Schlüssel</string>
- <string name="confirm">Bestätige</string>
+ <string name="confirm">Bestätigen</string>
<string name="in_progress">In Bearbeitung</string>
<string name="respond">Antworten</string>
<string name="failed">Fehlgeschlagen</string>
@@ -331,31 +331,34 @@
<string name="finish">Fertig</string>
<string name="verified">Überprüft!</string>
<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="no_otr_session_found">Keine gültige OTR-Sitzung gefunden!</string>
<string name="conversations_foreground_service">Conversations</string>
<string name="pref_keep_foreground_service">Den Dienst im Vordergrund ausführen.</string>
<string name="pref_keep_foreground_service_summary">Verhindert, dass Android Conversations 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 auf SD-Karte schreiben</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">Lade %s herunter</string>
+ <string name="download_x_file">%s wird heruntergeladen</string>
<string name="file">Datei</string>
- <string name="open_x_file">Öffne %s</string>
- <string name="sending_file">Sende (%1$d%% gesendet)</string>
- <string name="preparing_file">Bereite Datei für die Übertragung vor</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="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="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">Kann Fingerabdruck nicht überprüfen</string>
+ <string name="could_not_verify_fingerprint">Fingerabdruck konnte nicht überprüft werden</string>
<string name="manually_verify">Manuell überprüfen</string>
<string name="are_you_sure_verify_fingerprint">Bist du sicher, dass du den OTR-Fingerabdruck des Kontakts überprüfen willst?</string>
<string name="pref_show_dynamic_tags">Dynamische Tags anzeigen</string>
- <string name="pref_show_dynamic_tags_summary">Zeige schreibgeschützte Tags unterhalb der Kontakte</string>
- <string name="enable_notifications">Aktiviere Benachrichtigungen</string>
- <string name="conference_with">Beginne Konferenz mit…</string>
+ <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="conference_creation_failed">Beginnen der Konferenz fehlgeschlagen!</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>
<string name="reset">Zurücksetzen</string>
@@ -369,11 +372,11 @@
<string name="purge_key">Schlüssel löschen</string>
<string name="purge_key_desc_part1">Soll dieser Schlüssel gelöscht werden?</string>
<string name="purge_key_desc_part2">Dieser Vorgang kann nicht rückgängig gemacht werden und es kann nie wieder eine Verbindung mit diesem Schlüssel hergestellt werden.</string>
- <string name="error_no_keys_to_trust">Es sind keine Schlüssel für diesen Kontakt verfügbar. Falls diese gelöscht wurden, müssen diese neu erstellt werden.</string>
+ <string name="error_no_keys_to_trust">Es sind keine Schlüssel für diesen Kontakt verfügbar. Falls sie gelöscht wurden, müssen diese neu erstellt werden.</string>
<string name="error_trustkeys_title">Fehler</string>
<string name="fetching_history_from_server">Lade Chatverlauf…</string>
<string name="no_more_history_on_server">Keine weiteren Nachrichten vorhanden</string>
- <string name="updating">Aktualisiere…</string>
+ <string name="updating">Aktualisieren…</string>
<string name="password_changed">Passwort geändert.</string>
<string name="could_not_change_password">Passwort kann nicht geändert werden.</string>
<string name="otr_session_not_started">Sende eine Nachricht, um eine verschlüsselte Unterhaltung zu beginnen</string>
@@ -394,7 +397,7 @@
<string name="no_role">Keine Rolle</string>
<string name="outcast">Ausgeschlossen</string>
<string name="member">Mitglied</string>
- <string name="advanced_mode">Experten Modus</string>
+ <string name="advanced_mode">Erweiterter Modus</string>
<string name="grant_membership">Mitgliedschaft gewähren</string>
<string name="remove_membership">Mitgliedschaft entziehen</string>
<string name="grant_admin_privileges">Administratorrechte gewähren</string>
@@ -419,12 +422,12 @@
<string name="one_hour">1 Stunde</string>
<string name="two_hours">2 Stunden</string>
<string name="eight_hours">8 Stunden</string>
- <string name="until_further_notice">Bis auf weiters</string>
+ <string name="until_further_notice">Bis auf Weiteres</string>
<string name="pref_input_options">Eingabe-Optionen</string>
<string name="pref_enter_is_send">Eingabe-Taste (Enter) sendet Nachricht</string>
- <string name="pref_enter_is_send_summary">Benutze die Eingabe-Taste (Enter) zum Senden einer Nachricht</string>
+ <string name="pref_enter_is_send_summary">Eingabe-Taste (Enter) zum Versenden einer Nachricht verwenden</string>
<string name="pref_display_enter_key">Zeige Eingabe-Taste (Enter)</string>
- <string name="pref_display_enter_key_summary">Zeige die Eingabe-Taste (Enter) anstelle der Smiley-Taste</string>
+ <string name="pref_display_enter_key_summary">Emoji-Taste durch Eingabe-Taste ersetzen</string>
<string name="audio">Audio</string>
<string name="video">Video</string>
<string name="image">Bild</string>
@@ -433,11 +436,11 @@
<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">Tippen, um Conversations zu öffnen</string>
+ <string name="touch_to_open_conversations">Antippen, um Conversations zu öffnen</string>
<string name="avatar_has_been_published">Avatar wurde gespeichert</string>
- <string name="sending_x_file">Sende %s</string>
- <string name="offering_x_file">%s angeboten</string>
- <string name="hide_offline">verstecke offline</string>
+ <string name="sending_x_file">%s wird gesendet</string>
+ <string name="offering_x_file">%s wird angeboten</string>
+ <string name="hide_offline">Offline verstecken</string>
<string name="disable_account">Konto abschalten</string>
<string name="contact_is_typing">%s schreibt…</string>
<string name="is_typing">schreibt…</string>
@@ -451,7 +454,7 @@
<string name="received_location">Standort empfangen</string>
<string name="title_undo_swipe_out_conversation">Unterhaltung beendet</string>
<string name="title_undo_swipe_out_muc">Konferenz verlassen</string>
- <string name="pref_dont_trust_system_cas_title">Misstraue Zertifizierungsstellen</string>
+ <string name="pref_dont_trust_system_cas_title">Zertifizierungsstellen misstrauen</string>
<string name="pref_dont_trust_system_cas_summary">Alle Zertifikate müssen manuell bestätigt werden</string>
<string name="pref_remove_trusted_certificates_title">Zertifikate löschen</string>
<string name="pref_remove_trusted_certificates_summary">Als vertrauenswürdig bestätigte Zertifikate löschen</string>
@@ -496,6 +499,7 @@
<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="server_info_broken">Fehlerhaft</string>
+<<<<<<< HEAD
<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_away_when_screen_off">Abwesend</string>
@@ -505,4 +509,20 @@
<string name="pref_presence_settings">Status Einstellungen</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="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="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>
+ <string name="captcha_required">Captcha erforderlich</string>
+ <string name="captcha_hint">Text aus Captcha eintragen</string>
+ <string name="certificate_chain_is_not_trusted">Zertifikat wird nicht vertraut</string>
+ <string name="jid_does_not_match_certificate">Jabber-ID stimmt nicht dem Zertifikat überein</string>
+ <string name="action_renew_certificate">Zertifikat erneuern</string>
+>>>>>>> refs/remotes/siacs/master
</resources>
diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml
index 88c3f6d6d..ef1e9532b 100644
--- a/src/main/res/values-el/strings.xml
+++ b/src/main/res/values-el/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Καθαρισμός ιστορικού Συζήτησης</string>
<string name="clear_histor_msg">Θέλετε να σβήσετε όλα τα μηνύματα αυτής της Συζήτησης;\n\n<b>Προειδοποίηση:</b> Αυτό δεν θα επηρεάσει τα μηνύματα που είναι αποθηκευμένα σε άλλες συσκευές ή άλλους διακομιστές.</string>
<string name="delete_messages">Διαγραφή μηνυμάτων</string>
- <string name="also_end_conversation">Τερματισμός αυτής της συζήτησης αμέσως μετά</string>
<string name="choose_presence">Επιλέξτε παρουσία για επικοινωνία</string>
<string name="send_otr_message">Αποστολή κρυπτογραφημένου μηνύματος OTR</string>
<string name="send_pgp_message">Αποστολή κρυπτογραφημένου μηνύματος OpenPGP</string>
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml
index 2ffd15810..0494225cd 100644
--- a/src/main/res/values-es/strings.xml
+++ b/src/main/res/values-es/strings.xml
@@ -74,7 +74,7 @@
<string name="clear_conversation_history">Limpiar historial de conversación</string>
<string name="clear_histor_msg">¿Quieres borrar todos los mensajes de esta conversación?\n\n<b>Aviso:</b> Esto no afectará a los mensajes guardados en otros dispositivos o servidores.</string>
<string name="delete_messages">Borrar mensajes</string>
- <string name="also_end_conversation">Además, terminar esta conversación</string>
+ <string name="also_end_conversation">Terminar esta conversación después</string>
<string name="choose_presence">Selecciona recurso del contacto</string>
<string name="send_unencrypted_message">Enviar mensaje sin cifrar</string>
<string name="send_otr_message">Enviar mensaje cifrado con OTR</string>
@@ -335,6 +335,9 @@
<string name="conversations_foreground_service">Conversations</string>
<string name="pref_keep_foreground_service">Servicio en primer plano</string>
<string name="pref_keep_foreground_service_summary">Mantener el servicio en primer plano previene que el sistema cierre la conexión</string>
+ <string name="pref_export_logs">Exportar logs</string>
+ <string name="pref_export_logs_summary">Escribir logs en la tarjeta SD</string>
+ <string name="notification_export_logs_title">Escribiendo logs en la tarjeta SD</string>
<string name="choose_file">Seleccionar archivo</string>
<string name="receiving_x_file">Recibiendo %1$s (%2$d%% completado)</string>
<string name="download_x_file">Descargar %s</string>
@@ -484,4 +487,19 @@
<string name="pref_use_white_background">Usar fondo blanco</string>
<string name="pref_use_white_background_summary">Mostrar mensajes recibidos en texto negro con fondo blanco</string>
<string name="account_status_dns_timeout">Timeout en DNS</string>
+ <string name="server_info_broken">Error</string>
+ <string name="pref_presence_settings">Opciones de presencia</string>
+ <string name="pref_away_when_screen_off">Ausente con pantalla apagada</string>
+ <string name="pref_away_when_screen_off_summary">Cambia tu estado a ausente cuando la pantalla está apagada</string>
+ <string name="pref_xa_on_silent_mode">No disponible en modo silencio</string>
+ <string name="pref_xa_on_silent_mode_summary">Cambia tu estado a no disponible cuando el teléfono está en modo silencio</string>
+ <string name="action_add_account_with_certificate">Añadir cuenta con certificado</string>
+ <string name="unable_to_parse_certificate">No se ha podido leer el certificado</string>
+ <string name="authenticate_with_certificate">Dejar vacío para autenticar certificado w/ </string>
+ <string name="captcha_ocr">Texto captcha</string>
+ <string name="captcha_required">Captcha requerido</string>
+ <string name="captcha_hint">Introduce el texto de la imagen</string>
+ <string name="certificate_chain_is_not_trusted">La cadena de certificados no es de confianza</string>
+ <string name="jid_does_not_match_certificate">El identificador Jabber no coincide con el del certificado</string>
+ <string name="action_renew_certificate">Renovar certificado</string>
</resources>
diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml
index 0637c466b..d3dfa995f 100644
--- a/src/main/res/values-eu/strings.xml
+++ b/src/main/res/values-eu/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Elkarrizketa historia garbitu</string>
<string name="clear_histor_msg">Elkarrizketa honetako mezu guztiak ezabatu nahi al dituzu?\n\n<b>Abisua:</b> Honek ez du beste gailu edo zerbitzarietan gordetako mezuetan eraginik izango.</string>
<string name="delete_messages">Mezuak ezabatu</string>
- <string name="also_end_conversation">Elkarrizketa hau jarraian amaitu</string>
<string name="choose_presence">Hautatu agerpena kontaktuarentzat</string>
<string name="send_unencrypted_message">Enkriptatu gabeko mezua bidali</string>
<string name="send_otr_message">OTRz enkriptatutako mezua bidali</string>
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml
index e8cf4211c..90ce584db 100644
--- a/src/main/res/values-fr/strings.xml
+++ b/src/main/res/values-fr/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Vider l\'historique de la conversation</string>
<string name="clear_histor_msg">Voulez-vous supprimer tous les messages de cette conversation ?\n\n<b>Attention :</b> Les messages seront supprimés uniquement sur cet appareil.</string>
<string name="delete_messages">Supprimer les messages</string>
- <string name="also_end_conversation">Terminer cette conversation après</string>
<string name="choose_presence">Choisir le status de présence</string>
<string name="send_unencrypted_message">Envoyer un message non chiffré</string>
<string name="send_otr_message">Envoyer un message chiffré avec OTR</string>
diff --git a/src/main/res/values-gl/strings.xml b/src/main/res/values-gl/strings.xml
index 972a7bfea..019d4677f 100644
--- a/src/main/res/values-gl/strings.xml
+++ b/src/main/res/values-gl/strings.xml
@@ -42,7 +42,6 @@
<string name="clear_conversation_history">Limpar historial de conversa</string>
<string name="clear_histor_msg">¿Queres borrar todas as mensaxes desta conversa?\n\n<b>Ollo:</b> Isto non afectará ás mensaxes gardadas noutros dispositivos ou servidores.</string>
<string name="delete_messages">Borrar mensaxes</string>
- <string name="also_end_conversation">Terminar esta conversa máis tarde</string>
<string name="choose_presence">Selecciona recurso del contacto</string>
<string name="send_otr_message">Enviar mensaxe cifrado con OTR</string>
<string name="send_pgp_message">Enviar mensaxe cifrado con OpenPGP</string>
diff --git a/src/main/res/values-id/strings.xml b/src/main/res/values-id/strings.xml
index dde7c88d3..6c22c1323 100644
--- a/src/main/res/values-id/strings.xml
+++ b/src/main/res/values-id/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Hapus Riwayat Percakapan</string>
<string name="clear_histor_msg">Apakah Anda ingin menghapus semua pesan dalam Percakapan ini\n\n<b>Peringatan:</b>ini tidak akan mempengaruhi pesan yang disimpan pada perangkat atau server lain.</string>
<string name="delete_messages">Hapus pesan</string>
- <string name="also_end_conversation">Akhiri percakapan setelahnya</string>
<string name="choose_presence">Pilih kehadiran untuk kontak</string>
<string name="send_otr_message">Kirim pesan terenskripsi OTR</string>
<string name="send_pgp_message">Kirim pesan terenskripsi OpenPGP</string>
diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml
index 210e6e8ae..31d4a29ef 100644
--- a/src/main/res/values-it/strings.xml
+++ b/src/main/res/values-it/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Pulisci la cronologia della Conversazione</string>
<string name="clear_histor_msg">Vuoi cancellare tutti i messaggi di questa Conversazione?\n\n<b>Attenzione:</b> Questo non influenzerà i messaggi presenti su altri dispositivi o server.</string>
<string name="delete_messages">Elimina messaggi</string>
- <string name="also_end_conversation">Termina questa conversazione in seguito</string>
<string name="choose_presence">Choose presence to contact</string>
<string name="send_otr_message">Messaggio OTR</string>
<string name="send_pgp_message">Messaggio OpenPGP</string>
diff --git a/src/main/res/values-iw/strings.xml b/src/main/res/values-iw/strings.xml
index 68daf846e..d5fda1c23 100644
--- a/src/main/res/values-iw/strings.xml
+++ b/src/main/res/values-iw/strings.xml
@@ -1,16 +1,20 @@
<?xml version='1.0' encoding='UTF-8'?>
<resources>
<string name="action_settings">הגדרות</string>
- <string name="action_add">דיון חדש</string>
+ <string name="action_add">שיחה חדשה</string>
<string name="action_accounts">נהל חשבונות</string>
- <string name="action_end_conversation">סיים את דיון זה</string>
+ <string name="action_end_conversation">סיים שיחה זו</string>
<string name="action_contact_details">פרטי איש קשר</string>
<string name="action_muc_details">פרטי ועידה</string>
<string name="action_secure">דיון מאובטח</string>
<string name="action_add_account">הוסף חשבון</string>
<string name="action_edit_contact">ערוך שם</string>
<string name="action_add_phone_book">הוסף אל פנקס טלפונים</string>
- <string name="action_delete_contact">מחק מתוך רשימה</string>
+ <string name="action_delete_contact">מחק מרשימת אנשי הקשר</string>
+ <string name="action_block_contact">חסום איש קשר</string>
+ <string name="action_unblock_contact">בטל חסימת איש קשר</string>
+ <string name="action_block_domain">חסום דומיין</string>
+ <string name="action_unblock_domain">בטל חסימת דומיין</string>
<string name="title_activity_manage_accounts">נהל חשבונות</string>
<string name="title_activity_settings">הגדרות</string>
<string name="title_activity_conference_details">פרטי ועידה</string>
@@ -18,86 +22,99 @@
<string name="title_activity_sharewith">שתף בעזרת Conversations</string>
<string name="title_activity_start_conversation">התחל דיון</string>
<string name="title_activity_choose_contact">בחר איש קשר</string>
- <string name="just_now">רק כעת</string>
- <string name="minute_ago">לפני דקה 1</string>
+ <string name="title_activity_block_list">רשימת חסימה</string>
+ <string name="just_now">ממש עכשיו</string>
+ <string name="minute_ago">לפני דקה</string>
<string name="minutes_ago">לפני %d דקות</string>
- <string name="unread_conversations">דיונים שלא נקראו</string>
- <string name="sending">כעת שולח…</string>
- <string name="encrypted_message">כעת מפענח הודעה. אנא המתן…</string>
- <string name="nick_in_use">שם כינוי כבר מצוי בשימוש</string>
+ <string name="unread_conversations">שיחות שלא נקראו</string>
+ <string name="sending">שולח...</string>
+ <string name="encrypted_message">מפענח הודעה. אנא המתן…</string>
+ <string name="nick_in_use">שם כינוי כבר בשימוש</string>
<string name="admin">מנהל</string>
<string name="owner">בעלים</string>
- <string name="moderator">אחראי</string>
+ <string name="moderator">אחראי (Moderator)</string>
<string name="participant">משתתף</string>
<string name="visitor">מבקר</string>
- <string name="remove_contact_text">האם ברצונך להסיר את %s מתןך הרשימה שלך? הדיונים אשר משוייכים עם חשבון זה לא יוסרו.</string>
- <string name="remove_bookmark_text">האם ברצונך להסיר את %s בתוור סימנייה? הדיונים אשר משוייכים עם סימנייה זו לא יוסרו.</string>
- <string name="register_account">רשום חשבון חדש על שרת</string>
- <string name="share_with">שתף בעזרת</string>
- <string name="start_conversation">התחל דיון</string>
+ <string name="remove_contact_text">האם ברצונך להסיר את %s מתוך רשימת אנשי הקשר? השיחה המשוייכת עם איש קשר זה לא תוסר.</string>
+ <string name="block_contact_text">האם ברצונך לחסום קבלת הודעות מ- %s?</string>
+ <string name="unblock_contact_text">האם ברצונך לבטל את החסימה ולאפשר קבלת הודעות מ- %s?</string>
+ <string name="block_domain_text">לחסום את כל האנשים מ- %s?</string>
+ <string name="unblock_domain_text">לבטל את חסימת כל האנשים מ- %s?</string>
+ <string name="contact_blocked">איש קשר נחסם</string>
+ <string name="remove_bookmark_text">האם ברצונך להסיר את %s בתור סימנייה? הדיונים אשר משוייכים עם סימנייה זו לא יוסרו.</string>
+ <string name="register_account">צור חשבון חדש בשרת</string>
+ <string name="change_password_on_server">שינוי סיסמה בשרת</string>
+ <string name="share_with">שתף באמצעות...</string>
+ <string name="start_conversation">התחל שיחה</string>
<string name="invite_contact">הזמן איש קשר</string>
<string name="contacts">אנשי קשר</string>
<string name="cancel">ביטול</string>
<string name="add">הוסף</string>
<string name="edit">ערוך</string>
<string name="delete">מחק</string>
+ <string name="block">חסום</string>
+ <string name="unblock">בטל חסימה</string>
<string name="save">שמור</string>
<string name="ok">אישור</string>
<string name="crash_report_title">Conversations קרסה</string>
- <string name="crash_report_message">על ידי שליחת עקבות מחסנית אתה עוזר להתקדמות הפיתוח של Conversations\n<b>אזהרה:</b> זו תעשה שימוש בחשבון XMPP שלך כדי לשלוח עקבות מחסנית אל המפתח.</string>
+ <string name="crash_report_message">על ידי שליחת Stacktraces אתה עוזר להתקדמות הפיתוח של Conversations\n<b>אזהרה:</b> פעולה זו תעשה שימוש בחשבון ה- XMPP שלך כדי לשלוח עקבות מחסנית אל המפתח.</string>
<string name="send_now">שלח עכשיו</string>
<string name="send_never">לעולם אל תשאל שוב</string>
- <string name="problem_connecting_to_account">לא מסוגל להתחבר אל חשבון</string>
- <string name="problem_connecting_to_accounts">לא מסוגל להתחבר אל חשבונות מרובים</string>
+ <string name="problem_connecting_to_account">התחברות לחשבון נכשלה</string>
+ <string name="problem_connecting_to_accounts">התחברות למספר חשבונות נכשלה</string>
<string name="touch_to_fix">לחץ כאן כדי לנהל את החשבונות שלך</string>
<string name="attach_file">צרף קובץ</string>
- <string name="not_in_roster">איש קשר אינו מצוי בתוך הרשימה שלך. האם ברצונך להוסיפו?</string>
+ <string name="not_in_roster">איש קשר אינו מצוי בתוך רשימת אנשי הקשר שלך. האם ברצונך להוסיפו?</string>
<string name="add_contact">הוסף איש קשר</string>
<string name="send_failed">מסירה נכשלה</string>
<string name="send_rejected">סורב</string>
- <string name="preparing_image">כעת מכין תצלום לשם תמסורת</string>
- <string name="action_clear_history">טהר היסטוריה</string>
- <string name="clear_conversation_history">טהר היסטוריית דיונים</string>
- <string name="clear_histor_msg">האם ברצונך למחוק את כל ההודעות בתוך דיון זה?\n\n<b>אזהרה:</b> זו לא תשפיע על הודעות מאוחסנות על מכשירים או שרתים אחרים.</string>
+ <string name="preparing_image">מכין תמונה לשליחה</string>
+ <string name="action_clear_history">נקה היסטוריה</string>
+ <string name="clear_conversation_history">נקה היסטוריית שיחה</string>
+ <string name="clear_histor_msg">האם ברצונך למחוק את כל ההודעות בשיחה זאת?\n\n<b>אזהרה:</b> פעולה זו לא תשפיע על הודעות מאוחסנות על מכשירים או שרתים אחרים.</string>
<string name="delete_messages">מחק הודעות</string>
- <string name="also_end_conversation">סיים את דיון זה לאחר מכן</string>
<string name="choose_presence">בחר נוכחות לאיש קשר</string>
- <string name="send_otr_message">שלח הודעה מוצפנת OTR</string>
- <string name="send_pgp_message">שלח הודעה מוצפנת OpenPGP</string>
- <string name="your_nick_has_been_changed">שם כינוי שלך השתנה</string>
- <string name="send_unencrypted">שלח לא מוצפנת</string>
+ <string name="send_unencrypted_message">שלח הודעה בלתי מוצפנת</string>
+ <string name="send_otr_message">שלח הודעה בהצפנת OTR</string>
+ <string name="send_omemo_message">של הודעה בהצפנת OMEMO</string>
+ <string name="send_pgp_message">שלח הודעה בהצפנת OpenPGP</string>
+ <string name="your_nick_has_been_changed">שם הכינוי שלך השתנה</string>
+ <string name="send_unencrypted">שלח ללא הצפנה</string>
<string name="decryption_failed">פענוח נכשל. אולי אין לך את המפתח הפרטי המתאים.</string>
<string name="openkeychain_required">OpenKeychain</string>
- <string name="openkeychain_required_long">Conversations מפיקה תועלת מן אפליקציית צד-שלישי הקרויה <b>OpenKeychain</b> כדי להצפין ולפענח הודעות וגם כדי לנהל את המפתחות הפומביים שלך.\n\nOpenKeychain הינה רשויה תחת GPLv3 וזמינה אצל F-Droid וגם Google Play.\n\n<small>(אנא התחל מחדש את Conversations לאחר מכן.)</small></string>
+ <string name="openkeychain_required_long">Conversations מסתמכת על אפליקציית צד-שלישי הקרויה <b>OpenKeychain</b> כדי להצפין ולפענח הודעות וגם כדי לנהל את המפתחות הפומביים שלך.\n\nOpenKeychain הינה רשויה תחת GPLv3 וזמינה ב F-Droid וגם ב Google Play.\n\n<small>(אנא התחל מחדש את Conversations לאחר מכן.)</small></string>
<string name="restart">התחל מחדש</string>
<string name="install">התקן</string>
- <string name="offering">כעת מציע…</string>
- <string name="waiting">כעת ממתין…</string>
+ <string name="offering">מציע…</string>
+ <string name="waiting">ממתין…</string>
<string name="no_pgp_key">לא נמצא מפתח OpenPGP</string>
- <string name="contact_has_no_pgp_key">Conversations אינה מסוגלת להצפין את הודעותיך משום שאיש הקשר שלך אינו מכריז על המפתח הפומבי שלו או שלה.\n\n<small>אנא בקש מאיש הקשר שלך לארגן OpenPGP.</small></string>
+ <string name="contact_has_no_pgp_key">Conversations אינה מסוגלת להצפין את הודעותיך משום שאיש הקשר שלך אינו מכריז על המפתח הפומבי שלו או שלה.\n\n<small>אנא בקש מאיש הקשר שלך להגדיר את OpenPGP.</small></string>
<string name="no_pgp_keys">לא נמצאו מפתחות OpenPGP</string>
<string name="contacts_have_no_pgp_keys">Conversations אינה מסוגלת להצפין את הודעותיך משום שאנשי הקשר שלך אינם מכריזים על המפתח הפומבי שלהם.\n\n<small>אנא בקש מאנשי הקשר שלך לארגן OpenPGP.</small></string>
<string name="encrypted_message_received"><i>הודעה מוצפנת התקבלה. לחץ כדי לצפות ולפענח.</i></string>
- <string name="pref_xmpp_resource">משאב XMPP</string>
- <string name="pref_xmpp_resource_summary">השם שלקוח זה מזהה את עצמו עם</string>
+ <string name="pref_general">כללי</string>
+ <string name="pref_xmpp_resource">XMPP resource</string>
+ <string name="pref_xmpp_resource_summary">השם שאפליקציה זו שולחת לשרת</string>
<string name="pref_accept_files">קבל קבצים</string>
- <string name="pref_accept_files_summary">קבל אוטומטית קבצים קטנים יותר מאשר…</string>
- <string name="pref_notification_settings">הגדרות התראה</string>
+ <string name="pref_accept_files_summary">קבל אוטומטית קבצים שגודלם קטן מ…</string>
+ <string name="pref_notification_settings">הגדרות התראות</string>
<string name="pref_notifications">התראות</string>
<string name="pref_notifications_summary">תודיע כאשר הודעה חדשה מגיעה</string>
<string name="pref_vibrate">הרטט</string>
<string name="pref_vibrate_summary">הרטט גם כאשר הודעה חדשה מגיעה</string>
<string name="pref_sound">צליל</string>
- <string name="pref_sound_summary">נגן צלצול עם התראה</string>
- <string name="pref_notification_grace_period">משך ארכת התראה</string>
- <string name="pref_notification_grace_period_summary">נטרל התראות לזמן קצר לאחר שהודעת פחם התקבלה</string>
+ <string name="pref_sound_summary">נגן צלצול עם כל התראה</string>
+ <string name="pref_conference_notifications">התראות בועידות ציבוריות</string>
+ <string name="pref_conference_notifications_summary">תמיד </string>
+ <string name="pref_notification_grace_period">משך תקופת ארכה</string>
+ <string name="pref_notification_grace_period_summary">נטרל התראות לזמן קצר לאחר שהודעת Carbon Copy מתקבלת</string>
<string name="pref_advanced_options">אפשרויות מתקדמות</string>
<string name="pref_never_send_crash">לעולם אל תשלח דיווחי קריסה</string>
<string name="pref_never_send_crash_summary">על ידי שליחת עקבות מחסנית אתה עוזר להתקדמות הפיתוח של Conversations</string>
<string name="pref_confirm_messages">אשר הודעות</string>
<string name="pref_confirm_messages_summary">אפשר לאיש קשר שלך לדעת מתי קיבלת וקראת הודעה</string>
<string name="pref_ui_options">אפשרויות ממשק משתמש</string>
- <string name="openpgp_error">OpenKeychain דיווח שגיאה</string>
+ <string name="openpgp_error">אפליקציית OpenKeychain דיווחה על שגיאה</string>
<string name="error_decrypting_file">שגיאת I/O פענוח קובץ</string>
<string name="accept">קבל</string>
<string name="error">אירעה שגיאה</string>
@@ -110,32 +127,37 @@
<string name="receive_presence_updates">קבל עדכוני נוכחות</string>
<string name="ask_for_presence_updates">בקש עדכוני נוכחות</string>
<string name="attach_choose_picture">בחר תמונה</string>
- <string name="attach_take_picture">קח תמונה</string>
+ <string name="attach_take_picture">צלם תמונה</string>
<string name="preemptively_grant">הענק בקשת הרשמה מראש</string>
- <string name="error_not_an_image_file">הקובץ שבחרת אינו תצלום</string>
- <string name="error_compressing_image">שגיאה במהלך המרת קובץ תצלום</string>
+ <string name="error_not_an_image_file">הקובץ שבחרת אינו תמונה</string>
+ <string name="error_compressing_image">שגיאה במהלך המרת תמונה</string>
<string name="error_file_not_found">קובץ לא נמצא</string>
<string name="error_io_exception">שגיאת I/O כללית. אולי אזל לך נפח אחסון?</string>
- <string name="error_security_exception_during_image_copy">האפליקציה בה השתמשת כדי לבחור את תצלום זה לא סיפקה לנו מספיק הרשאות כדי לקרוא את הקובץ.\n\n<small>השתמש במנהל קבצים אחר כדי לבחור תצלום</small></string>
+ <string name="error_security_exception_during_image_copy">האפליקציה בה השתמשת כדי לבחור תמונה זו לא סיפקה לנו מספיק הרשאות כדי לקרוא את הקובץ.\n\n<small>השתמש במנהל קבצים אחר כדי לבחור תצלום</small></string>
<string name="account_status_unknown">לא ידוע</string>
<string name="account_status_disabled">מנוטרל זמנית</string>
<string name="account_status_online">מקוון</string>
- <string name="account_status_connecting">כעת מתחבר\u2026</string>
+ <string name="account_status_connecting">מתחבר\u2026</string>
<string name="account_status_offline">לא מקוון</string>
<string name="account_status_unauthorized">לא מורשה</string>
<string name="account_status_not_found">שרת לא נמצא</string>
<string name="account_status_no_internet">אין חיבוריות</string>
<string name="account_status_regis_fail">הרשמה נכשלה</string>
- <string name="account_status_regis_conflict">שם משתמש כבר מצוי בשימוש</string>
+ <string name="account_status_regis_conflict">שם משתמש כבר בשימוש</string>
<string name="account_status_regis_success">הרשמה הושלמה</string>
- <string name="account_status_regis_not_sup">שרת לא תומך הרשמה</string>
+ <string name="account_status_regis_not_sup">השרת לא תומך בהרשמת משתמשים חדשים</string>
+ <string name="account_status_security_error">שגיאת אבטחה</string>
+ <string name="account_status_incompatible_server">שרת לא מתאים</string>
+ <string name="encryption_choice_unencrypted">לא מוצפן</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
<string name="mgmt_account_edit">ערוך חשבון</string>
<string name="mgmt_account_delete">מחק</string>
<string name="mgmt_account_disable">נטרל זמנית</string>
- <string name="mgmt_account_publish_avatar">פרסם אווטאר</string>
- <string name="mgmt_account_enable">אפשר</string>
+ <string name="mgmt_account_publish_avatar">פרסם תמונת פרופיל</string>
+ <string name="mgmt_account_publish_pgp">פרסם מפתח ציבורי של OpenPGP</string>
+ <string name="mgmt_account_enable">הפעל חשבון</string>
<string name="mgmt_account_are_you_sure">האם אתה בטוח?</string>
<string name="mgmt_account_delete_confirm_text">אם אתה מוחק את חשבונך כל היסטוריית הדיון שלך תאבד</string>
<string name="attach_record_voice">הקלט קול</string>
@@ -146,34 +168,50 @@
<string name="password">סיסמה</string>
<string name="confirm_password">אמת סיסמה</string>
<string name="passwords_do_not_match">סיסמאות לא תואמות</string>
- <string name="invalid_jid">זה אינו מזהה Jabber תקף</string>
+ <string name="invalid_jid">מזהה ה Jabber אינו תקין</string>
<string name="error_out_of_memory">חסר זיכרון. תצלום גדול מדי</string>
<string name="add_phone_book_text">האם ברצונך להוסיף את %s אל רשימת קשר טלפונית?</string>
<string name="contact_status_online">מקוון</string>
<string name="contact_status_free_to_chat">חופשי לשיחה</string>
<string name="contact_status_away">נעדר</string>
- <string name="contact_status_extended_away">נעדר לזמן מה</string>
- <string name="contact_status_do_not_disturb">אל תפריעו</string>
+ <string name="contact_status_extended_away">נעדר לזמן ממושך</string>
+ <string name="contact_status_do_not_disturb">נא לא להפריע</string>
<string name="contact_status_offline">לא מקוון</string>
<string name="muc_details_conference">ועידה</string>
<string name="muc_details_other_members">חברים אחרים</string>
- <string name="server_info_carbon_messages">הודעות פחם</string>
- <string name="server_info_stream_management">ניהול זרם</string>
+ <string name="server_info_show_more">פרטי השרת</string>
+ <string name="server_info_mam">XEP-0313: MAM - היסטוריית שרת</string>
+ <string name="server_info_carbon_messages">XEP-0280: Message Carbons</string>
+ <string name="server_info_csi">XEP-0352: Client State Indication</string>
+ <string name="server_info_blocking">XEP-0191: Blocking Command - חסימת אנשי קשר</string>
+ <string name="server_info_roster_version">XEP-0237: Roster Versioning</string>
+ <string name="server_info_stream_management">XEP-0198: Stream Management</string>
+ <string name="server_info_pep">XEP-0163: PEP (Avatars / OMEMO) - תמונת פרופיל והצפנת OMEMO</string>
+ <string name="server_info_http_upload">XEP-0363: HTTP File Upload - שליחת קבצים דרך HTTP</string>
+ <string name="server_info_available">זמין</string>
+ <string name="server_info_unavailable">לא זמין</string>
<string name="missing_public_keys">הכרזות מפתח פומבי חסרות</string>
<string name="last_seen_now">נראה לאחרונה ממש עכשיו</string>
- <string name="last_seen_min">נראה לאחרונה לפני דקה 1</string>
+ <string name="last_seen_min">נראה לאחרונה לפני דקה</string>
<string name="last_seen_mins">נראה לאחרונה לפני %d דקות</string>
- <string name="last_seen_hour">נראה לאחרונה לפני שעה 1</string>
- <string name="last_seen_hours">נראה לאחרונה לפני %d שעות ago</string>
- <string name="last_seen_day">נראה לאחרונה לפני יום 1</string>
+ <string name="last_seen_hour">נראה לאחרונה לפני שעה</string>
+ <string name="last_seen_hours">נראה לאחרונה לפני %d שעות</string>
+ <string name="last_seen_day">נראה לאחרונה לפני יום אחד</string>
<string name="last_seen_days">נראה לאחרונה לפני %d ימים</string>
<string name="never_seen">לא נראה מעולם</string>
- <string name="install_openkeychain">הודעה מוצפנת. אנא התקן OpenKeychain כדי לפענח.</string>
+ <string name="install_openkeychain">הודעה מוצפנת. אנא התקן את OpenKeychain כדי לפענח.</string>
<string name="unknown_otr_fingerprint">טביעת אצבע OTR לא מוכרת</string>
<string name="openpgp_messages_found">הודעות מוצפנות OpenPGP נמצאו</string>
<string name="reception_failed">קבלה נכשלה</string>
<string name="your_fingerprint">טביעת אצבע שלך</string>
- <string name="otr_fingerprint">טביעת אצבע OTR</string>
+ <string name="otr_fingerprint">טביעת אצבע של OTR</string>
+ <string name="omemo_fingerprint">טביעת אצבע של OMEMO</string>
+ <string name="omemo_fingerprint_selected_message">טביעת אצבע OMEMO של ההודעה</string>
+ <string name="this_device_omemo_fingerprint">טביעת אצבע OMEMO שלי</string>
+ <string name="other_devices">מכשירים אחרים</string>
+ <string name="trust_omemo_fingerprints">סמוך על טביעות אצבע OMEMO</string>
+ <string name="fetching_keys">משיג מפתחות...</string>
+ <string name="done">בוצע</string>
<string name="verify">אמת</string>
<string name="decrypt">פענח</string>
<string name="conferences">ועידות</string>
@@ -182,6 +220,8 @@
<string name="join_conference">הצטרף לועידה</string>
<string name="delete_contact">מחק איש קשר</string>
<string name="view_contact_details">צפה בפרטי איש קשר</string>
+ <string name="block_contact">חסום איש קשר</string>
+ <string name="unblock_contact">בטל חסימת איש קשר</string>
<string name="create">צור</string>
<string name="contact_already_exists">איש קשר כבר קיים</string>
<string name="join">הצטרף</string>
@@ -197,15 +237,245 @@
<string name="contact_added_you">איש קשר הוסיף אותך אל רשימת קשר</string>
<string name="add_back">הוסף בחזרה</string>
<string name="contact_has_read_up_to_this_point">%s קרא עד לנקודה זו</string>
- <string name="touch_to_choose_picture">לחץ על אווטאר כדי לבחור תמונה מתוך גלריה</string>
- <string name="publish_avatar_explanation">לתשומת לבך: כל מי אשר רשום לעדכוני נוכחות שלך יורשה לראות את תמונה זו.</string>
- <string name="publishing">כעת מפרסם…</string>
- <string name="error_publish_avatar_server_reject">השרת פסל פרסום</string>
- <string name="error_publish_avatar_converting">משהו השתבש במהלך המרת תמונה</string>
- <string name="error_saving_avatar">לא היה מסוגל לשמור אווטאר אל כונן</string>
- <string name="or_long_press_for_default">(או לחיצה ארוכה כדי להחזיר לשגרה)</string>
- <string name="error_publish_avatar_no_server_support">שרתך לא תומך בפרסום של אווטארים</string>
+ <string name="publish">פרסם</string>
+ <string name="touch_to_choose_picture">לחץ על תמות הפרופיל כדי לבחור תמונה מתוך הגלריה</string>
+ <string name="publish_avatar_explanation">לתשומת לבך: כל מי שרשום לעדכוני נוכחות שלך יורשה לראות את תמונה זו.</string>
+ <string name="publishing">מעלה…</string>
+ <string name="error_publish_avatar_server_reject">השרת דחה את ההעלאה</string>
+ <string name="error_publish_avatar_converting">משהו השתבש במהלך המרת התמונה</string>
+ <string name="error_saving_avatar">שגיאה בעת שמירת תמונה לזיכרון</string>
+ <string name="or_long_press_for_default">(או לחיצה ארוכה כדי להחזיר לברירת מחדל)</string>
+ <string name="error_publish_avatar_no_server_support">השרת לא תומך בפרסום של אווטארים</string>
<string name="private_message">בפרטי</string>
<string name="private_message_to">בפרטי אל %s</string>
<string name="send_private_message_to">שלח הודעה פרטית אל %s</string>
+ <string name="connect">התחבר</string>
+ <string name="account_already_exists">חשבון זה כבר קיים</string>
+ <string name="next">הבא</string>
+ <string name="additional_information">מידע נוסף</string>
+ <string name="skip">דלג</string>
+ <string name="disable_notifications">השבת התראות</string>
+ <string name="disable_notifications_for_this_conversation">השבת התראות עבור השיחה הנוכחית</string>
+ <string name="notifications_disabled">ההתראות מושבתות</string>
+ <string name="enable">הפעל</string>
+ <string name="conference_requires_password">ועידה זאת דורשת סיסמא</string>
+ <string name="enter_password">הכנס סיסמא</string>
+ <string name="missing_presence_updates">עדכוני נוסחות חסרים מאיש הקשר</string>
+ <string name="request_presence_updates">נא לבקש עדכוני נוכחות מאיש הקשר קודם לכך<small>פעולה זו תשמש כדי לקבוע את אקפליקציה שאיש הקשר משתמש בה</small></string>
+ <string name="request_now">בקש/י כעת</string>
+ <string name="delete_fingerprint">מחק טביעת אצבע</string>
+ <string name="sure_delete_fingerprint">האם את/ה בטוח שברצונך למחוק טביעת אצבע זו?</string>
+ <string name="ignore">התעלם</string>
+ <string name="without_mutual_presence_updates"><b>אזהרה:</b>שליחה ללא הרשאות עדכוני נוכחות הדדיות עלולה לגרום לתוצאות בלתי צפויות.\n\n<small>השתמש בתפריט \"פרטי משתמש\" ואשר עדכוני נוכחות</small></string>
+ <string name="pref_encryption_settings">הגדרות הצפנה</string>
+ <string name="pref_force_encryption">אלץ הצפנת end-to-end</string>
+ <string name="pref_force_encryption_summary">תמיד שלח הודעות מוצפנות (חוץ מבועידות)</string>
+ <string name="pref_dont_save_encrypted">אל תשמור הודעות מוצפנות</string>
+ <string name="pref_dont_save_encrypted_summary">אזהרה: פעולה זו עלולה לגרום לאיבוד הודעות</string>
+ <string name="pref_expert_options">הגדרות מתקדמות</string>
+ <string name="pref_expert_options_summary">נא להיזהר!</string>
+ <string name="title_activity_about">אודות Conversations</string>
+ <string name="pref_about_conversations_summary">אודות גרסה ורישיון </string>
+ <string name="title_pref_quiet_hours">שעות שקטות</string>
+ <string name="title_pref_quiet_hours_start_time">זמן התחלה</string>
+ <string name="title_pref_quiet_hours_end_time">זמן סיום</string>
+ <string name="title_pref_enable_quiet_hours">הפעל \"שעות שקטות\"</string>
+ <string name="pref_quiet_hours_summary">ההתראות יושבתו במהלך שעות שקטות</string>
+ <string name="pref_use_larger_font">הגדל גופן</string>
+ <string name="pref_use_larger_font_summary">הגדל גופן בכל האפליקציה</string>
+ <string name="pref_use_send_button_to_indicate_status">לחצן השליחה מעיד על הסטטוס</string>
+ <string name="pref_use_indicate_received">בקש אימות הגעת הודעות</string>
+ <string name="pref_use_indicate_received_summary">יופיע סימן \"וי\" ליד כל הודעה שהתקבלה על ידי איש הקשר, במידה והפעולה נתמכת על ידי איש הקשר.</string>
+ <string name="pref_use_send_button_to_indicate_status_summary">צבעו של לחצן שליחת ההודעות יעיד על סטטוס איש הקשר.</string>
+ <string name="pref_expert_options_other">אחר</string>
+ <string name="pref_conference_name">שם ועידה</string>
+ <string name="pref_conference_name_summary">השתמש בכותרת הועידה ולא ב- JID כשם לועידה</string>
+ <string name="toast_message_otr_fingerprint">טביעת אצבע של OTR הועתקה</string>
+ <string name="toast_message_omemo_fingerprint">טביעת אצבע של OMEMO הועתקה</string>
+ <string name="conference_banned">אתה חסום מלהיכנס לועידה זו</string>
+ <string name="conference_members_only">ועידה זו אינה ציבורית</string>
+ <string name="conference_kicked">גורשת מועידה זו</string>
+ <string name="using_account">משתמש בחשבון: %s</string>
+ <string name="not_connected_try_again">אינך מחובר. נסה שוב אחר כך</string>
+ <string name="check_x_filesize">בדוק גודל %s</string>
+ <string name="message_options">הגדרות הודעה</string>
+ <string name="copy_text">העתק טקסט</string>
+ <string name="copy_original_url">העתק קישור</string>
+ <string name="send_again">שלח שוב</string>
+ <string name="file_url">קישור קובץ</string>
+ <string name="message_text">טקסט הודעה</string>
+ <string name="url_copied_to_clipboard">הקישור הועתק</string>
+ <string name="message_copied_to_clipboard">ההודעה הועתקה</string>
+ <string name="image_transmission_failed">שליחת התמונה נכשלה</string>
+ <string name="scan_qr_code">סרוק ברקוד QR</string>
+ <string name="show_qr_code">הראה ברקוד QR</string>
+ <string name="show_block_list">הראה רשימת חסומים</string>
+ <string name="account_details">פרטי חשבון</string>
+ <string name="verify_otr">אמת OTR</string>
+ <string name="remote_fingerprint">טביעת אצבע מרוחקת</string>
+ <string name="scan">סרוק</string>
+ <string name="or_touch_phones">(או קיים מגע בין הניידים)</string>
+ <string name="smp">Socialist Millionaire Protocol</string>
+ <string name="shared_secret_hint">שאלה או רמז</string>
+ <string name="shared_secret_secret">סוד משותף</string>
+ <string name="confirm">אמת</string>
+ <string name="in_progress">הפעולה מתבצעת</string>
+ <string name="respond">השב</string>
+ <string name="failed">נכשל</string>
+ <string name="secrets_do_not_match">הסודות אינם תואמים</string>
+ <string name="try_again">נסה שוב</string>
+ <string name="finish">סיים</string>
+ <string name="verified">אומת בהצלחה!</string>
+ <string name="smp_requested">איש הקשר ביקש אימות SMP</string>
+ <string name="no_otr_session_found">לא נמצא OTR Session תקין</string>
+ <string name="pref_keep_foreground_service">השאר שירות ב Foreground</string>
+ <string name="pref_keep_foreground_service_summary">מונע ממערכת ההפעלה לנתק את החיבור לשרת</string>
+ <string name="choose_file">בחר קובץ</string>
+ <string name="receiving_x_file">מקבל %1$s ( הושלם %2$d%% )</string>
+ <string name="download_x_file">הורד %s</string>
+ <string name="file">קובץ</string>
+ <string name="open_x_file">פתח %s</string>
+ <string name="sending_file">שולח ( %1$d%% הושלם )</string>
+ <string name="preparing_file">מכין קובץ לשליחה</string>
+ <string name="x_file_offered_for_download">הקובץ %s הוצע לאיש הקשר</string>
+ <string name="cancel_transmission">בטל שליחה</string>
+ <string name="file_transmission_failed">השליחה נכשלה</string>
+ <string name="file_deleted">הקובץ נמחק</string>
+ <string name="no_application_found_to_open_file">אין אפליקציה מתאימה לפתיחת הקובץ</string>
+ <string name="could_not_verify_fingerprint">אימות טביעת האצבע נכשל</string>
+ <string name="manually_verify">אימות ידני</string>
+ <string name="are_you_sure_verify_fingerprint">האם אתה בטוח שברצונך לאמת טביעת אצבע OTR זו?</string>
+ <string name="pref_show_dynamic_tags">הראה תגים דומיים</string>
+ <string name="pref_show_dynamic_tags_summary">הראה תגי read-only מתחת לאנשי הקשר</string>
+ <string name="enable_notifications">אפשר התראות</string>
+ <string name="conference_with">צור ועידה עם...</string>
+ <string name="no_conference_server_found">לא נמצא שרת ועידות</string>
+ <string name="conference_creation_failed">יצירת הועידה נכשלה!</string>
+ <string name="conference_created">הועידה נוצרה!</string>
+ <string name="secret_accepted">הסוד התקבל!</string>
+ <string name="reset">איפוס</string>
+ <string name="account_image_description">תמונת פרופיל</string>
+ <string name="copy_otr_clipboard_description">העתק טביעת אצבע OTR</string>
+ <string name="copy_omemo_clipboard_description">העתק טביעת אצבע OMEMO</string>
+ <string name="regenerate_omemo_key">צור מפתח OMEMO חדש</string>
+ <string name="wipe_omemo_pep">מחק מכשרים אחרים מ- PEP</string>
+ <string name="clear_other_devices">נקה מכשירים</string>
+ <string name="clear_other_devices_desc">האם אתה בטוח שברצונך לנקות את כל המכשירים מהכרזת ה OMEMO? בפעם הבאה שהמכשירים יתחברו, הם יכריזו שוב על עצמם, אך הם עלולים לאבד הודעות עד להכרזה זו.</string>
+ <string name="purge_key">מחק מפתח לצמיתות</string>
+ <string name="purge_key_desc_part1">האם אתה בטוח שברצונך למחוק מפתח זה לצמיתות?</string>
+ <string name="purge_key_desc_part2">הוא ייחשב ללא תקין לצמיתות, ולעולם לא תצליח להשתמש בו שוב.</string>
+ <string name="error_no_keys_to_trust">אין מפתחות שימושיים עבור איש קשר זה. אם מחקת אחד מהמפתחות שלהם, יהיה עליהם ליצר מפתח חדש.</string>
+ <string name="error_trustkeys_title">שגיאה</string>
+ <string name="fetching_history_from_server">הורדת היסטוריה מהשרת</string>
+ <string name="no_more_history_on_server">אין עוד היסטוריה בשרת</string>
+ <string name="updating">מעדכן...</string>
+ <string name="password_changed">הסיסמה שונתה!</string>
+ <string name="could_not_change_password">שינוי הסיסמה נכשל</string>
+ <string name="otr_session_not_started">שלח הודעה בכדי להתחיל בהצפנה</string>
+ <string name="ask_question">שאל שאלה</string>
+ <string name="smp_explain_question">במידה ויש לך ולאיש הקשר שלך סוד שרק שניכם יודעים (כמו למשל בדיחה פנימית, או מה אכלתם בפעם האחרונה שנפגשתם), ניתן להשתמש בסוד הנ\"ל על מנת לאמת את מפתחות ההצפנה של אחד את השני.\n\nאיש קשר יספק שאלה או רמז, ואיש הקשר השני יספק תשובה. המלל הוא case-sensitive.</string>
+ <string name="smp_explain_answer">איש הקשר רוצה לאמת את הזהות שלך על ידי סוד משותף. איש הקשר סיפק את הרמז הבא, עליך להזין סוד משותף.</string>
+ <string name="shared_secret_hint_should_not_be_empty">הרמז לא יכול להיות ריק</string>
+ <string name="shared_secret_can_not_be_empty">הסוד המשותף לא יכול להיות ריק</string>
+ <string name="manual_verification_explanation">יש להשוות בזהירות את הטביעת אצבע שמוצגת פה לבין זאת שמוצגת אצל החבר שלך.\nניתן לעשות זאת על ידי שימוש בכל צורת תקשורת שאתה סומך עליה, כמו שיחת טלפון או אימייל מוצפן.</string>
+ <string name="change_password">שינוי סיסמה</string>
+ <string name="current_password">סיסמה נוכחית</string>
+ <string name="new_password">סיסמה חדשה</string>
+ <string name="password_should_not_be_empty">הסיסמה לא יכולה להיות ריקה</string>
+ <string name="enable_all_accounts">הפעל את כל החשבונות</string>
+ <string name="disable_all_accounts">נטרל את כל החשבונות</string>
+ <string name="perform_action_with">בצע פעולה באמצעות</string>
+ <string name="no_affiliation">אין שיוך</string>
+ <string name="no_role">אין תפקיד</string>
+ <string name="member">חבר בקבוצה</string>
+ <string name="advanced_mode">מצב מתקדם</string>
+ <string name="grant_membership">הענק חברות בקבוצה</string>
+ <string name="remove_membership">בטל חברות בקבוצה</string>
+ <string name="grant_admin_privileges">הענק הרשאות מנהל</string>
+ <string name="remove_admin_privileges">שלול הרשאות מנהל</string>
+ <string name="remove_from_room">סלק מהועידה</string>
+ <string name="could_not_change_affiliation">לא ניתן לשנות את השיוך של %s</string>
+ <string name="ban_from_conference">סלק וחסום כניסה לועידה</string>
+ <string name="removing_from_public_conference">הינך מנסה למחוק את %s מועידה ציבורית. הדרך היחידה לעשות זאת היא חסימה לצמיתות.</string>
+ <string name="ban_now">חסום עכשיו</string>
+ <string name="could_not_change_role">לא ניתן לשנות את התפקיד של %s</string>
+ <string name="public_conference">ועידה ציבורית</string>
+ <string name="private_conference">ועידה פרטית, לחברים בלבד</string>
+ <string name="conference_options">הגדרות ועידה</string>
+ <string name="members_only">פרטי, חברים בלבד</string>
+ <string name="non_anonymous">לא-אנונימי</string>
+ <string name="moderated">Moderated</string>
+ <string name="you_are_not_participating">אינך משתתף</string>
+ <string name="modified_conference_options">הגדרות הועידה השתנו בצלחה!</string>
+ <string name="could_not_modify_conference_options">שינוי הגדרות הועידה נכשל</string>
+ <string name="never">לעולם לא</string>
+ <string name="thirty_minutes">30 דקות</string>
+ <string name="one_hour">שעה אחת</string>
+ <string name="two_hours">2 שעות</string>
+ <string name="eight_hours">8 שעות</string>
+ <string name="until_further_notice">עד אחרית הימים</string>
+ <string name="pref_input_options">הגדרות קלט</string>
+ <string name="pref_enter_is_send">לחצן Enter שולח את ההודעה</string>
+ <string name="pref_enter_is_send_summary">השתמש בלחצן ה-Enter כלחצן השליחה</string>
+ <string name="pref_display_enter_key">הראה את לחצן ה Enter</string>
+ <string name="pref_display_enter_key_summary">שנה את לחצן האימוג\'י ללחצן Enter</string>
+ <string name="audio">קול</string>
+ <string name="video">סרטון</string>
+ <string name="image">תמונה</string>
+ <string name="pdf_document">מסמך PDF</string>
+ <string name="apk">אפליקציית אנדרויד</string>
+ <string name="vcard">איש קשר</string>
+ <string name="received_x_file">התקבל %s</string>
+ <string name="disable_foreground_service">בטל שירות Foreground</string>
+ <string name="touch_to_open_conversations">לחץ כדי לפתוח את Conversations</string>
+ <string name="avatar_has_been_published">תמונת הפרופיל פורסמה!</string>
+ <string name="sending_x_file">שולח %s</string>
+ <string name="offering_x_file">מציע %s</string>
+ <string name="hide_offline">הסתר בלתי מקוונים</string>
+ <string name="disable_account">השבת חשבון</string>
+ <string name="contact_is_typing">%s מקליד...</string>
+ <string name="contact_has_stopped_typing">%s הפסיק/ה להקליד</string>
+ <string name="pref_chat_states">התראות הקלדה</string>
+ <string name="pref_chat_states_summary">אפשר לאנשי הקשר שלך לדעת כאשר אתה מקליד הודעה חדשה</string>
+ <string name="send_location">שלח מיקום</string>
+ <string name="show_location">הראה מיקום</string>
+ <string name="no_application_found_to_display_location">לא נמצאה אפליקציית המראה את המיקום</string>
+ <string name="location">מיקום</string>
+ <string name="received_location">מיקום שהתקבל</string>
+ <string name="title_undo_swipe_out_conversation">השיחה נסגרה</string>
+ <string name="title_undo_swipe_out_muc">עזבת את הועידה</string>
+ <string name="pref_dont_trust_system_cas_title">אל תסמוך על ה- CAs של המערכת</string>
+ <string name="pref_dont_trust_system_cas_summary">כל החתימות הדיגטליות יצטרכו לעבור אימות ידני</string>
+ <string name="pref_remove_trusted_certificates_title">מחק חתימות דיגטליות</string>
+ <string name="pref_remove_trusted_certificates_summary">מחק חתימות דיגטליות שאומתו באופן ידני</string>
+ <string name="toast_no_trusted_certs">אין חתימת דיגטליות שאושרו ידנית</string>
+ <string name="dialog_manage_certs_title">מחק חתימות דיגטליות</string>
+ <string name="dialog_manage_certs_positivebutton">מחק פריטים שנבחרו</string>
+ <string name="dialog_manage_certs_negativebutton">ביטול</string>
+ <plurals name="toast_delete_certificates">
+ <item quantity="one">%d חתימה נמחקה</item>
+ <item quantity="other">%d חתימות נמחקו</item>
+ </plurals>
+ <plurals name="select_contact">
+ <item quantity="one">בחר איש קשר %d</item>
+ <item quantity="other">בחר %d אנשי קשר</item>
+ </plurals>
+ <string name="pref_quick_action_summary">החלף לחצן שליחה בפעולה מהירה</string>
+ <string name="pref_quick_action">פעולה מהירה</string>
+ <string name="none">כלום</string>
+ <string name="recently_used">לפי השימוש האחרון</string>
+ <string name="choose_quick_action">בחר פעולה מהירה</string>
+ <string name="search_for_contacts_or_groups">חפש אנשי קשר או קבוצות</string>
+ <string name="send_private_message">שלח הודעה פרטית</string>
+ <string name="user_has_left_conference">%s עזב את הועידה</string>
+ <string name="username">שם משתמש</string>
+ <string name="username_hint">שם משתמש</string>
+ <string name="invalid_username">שם משתמש זה אינו חוקי</string>
+ <string name="download_failed_server_not_found">ההורדה נכשלה: שרת לא נמצא</string>
+ <string name="download_failed_file_not_found">ההורדה נכשלה: הקובץ לא נמצא</string>
+ <string name="download_failed_could_not_connect">ההורדה נכשלה: נכשל ביצוע חיבור לשרת</string>
+ <string name="pref_use_white_background">השתמש ברקע לבן</string>
+ <string name="pref_use_white_background_summary">הראה הודעות שהתקבלו בטקסט שחור על גבי רקע לבען</string>
+ <string name="account_status_dns_timeout">Timeout in DNS</string>
+ <string name="server_info_broken">לא עובד</string>
</resources>
diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml
index 1ce44da78..c30c87ff2 100644
--- a/src/main/res/values-ja/strings.xml
+++ b/src/main/res/values-ja/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">会話履歴をクリア</string>
<string name="clear_histor_msg">この会話のすべてのメッセージを削除しますか?\n\n<b>警告:</b> これは、他のデバイスやサーバーに保存されているメッセージには影響しません。</string>
<string name="delete_messages">メッセージを削除</string>
- <string name="also_end_conversation">その後、この会話を終了</string>
<string name="choose_presence">連絡する参加を選択</string>
<string name="send_unencrypted_message">暗号化されていないメッセージを送信</string>
<string name="send_otr_message">OTR 暗号化メッセージを送信</string>
diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml
index 89fb3874f..6566724b0 100644
--- a/src/main/res/values-ko/strings.xml
+++ b/src/main/res/values-ko/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">대화 기록 삭제 </string>
<string name="clear_histor_msg">이 대화의 모든 메세지를 삭제하시겠습니까? 경고: 이것은 다른 기기나 서버에 있는 메세지에는 영향을 미치지 않습니다. </string>
<string name="delete_messages">메세지 삭제 </string>
- <string name="also_end_conversation">나중에 이 대화 끝내기 </string>
<string name="choose_presence">연락할 프레즌스 선택 </string>
<string name="send_otr_message">OTR 암호화된 메세지 전송 </string>
<string name="send_pgp_message">OpenPGP 암호화된 메세지 전송 </string>
diff --git a/src/main/res/values-nb-rNO/strings.xml b/src/main/res/values-nb-rNO/strings.xml
new file mode 100644
index 000000000..dee41b7b4
--- /dev/null
+++ b/src/main/res/values-nb-rNO/strings.xml
@@ -0,0 +1,182 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<resources>
+ <string name="action_settings">Innstillinger</string>
+ <string name="action_add">Ny samtale</string>
+ <string name="action_accounts">Kontobehandling</string>
+ <string name="action_end_conversation">Avslutt denne samtalen</string>
+ <string name="action_contact_details">Kontaktdetaljer</string>
+ <string name="action_secure">Sikret samtale</string>
+ <string name="action_add_account">Legg til samtale</string>
+ <string name="action_edit_contact">Rediger navn</string>
+ <string name="action_add_phone_book">Legg til i telefonbok</string>
+ <string name="action_block_contact">Blokker kontakt</string>
+ <string name="action_unblock_contact">Avblokker kontakt</string>
+ <string name="action_block_domain">Blokker domene</string>
+ <string name="action_unblock_domain">Avblokker domene</string>
+ <string name="title_activity_manage_accounts">Kontobehandling</string>
+ <string name="title_activity_settings">Innstillinger</string>
+ <string name="title_activity_contact_details">Kontaktdetaljer</string>
+ <string name="title_activity_start_conversation">Start samtale</string>
+ <string name="title_activity_choose_contact">Velg kontakt</string>
+ <string name="title_activity_block_list">Blokkeringsliste</string>
+ <string name="just_now">akkurat nå</string>
+ <string name="minute_ago">1 minutt siden</string>
+ <string name="minutes_ago">%d minutter siden</string>
+ <string name="unread_conversations">uleste samtaler</string>
+ <string name="sending">sender...</string>
+ <string name="encrypted_message">Dekrypterer melding. Vent...</string>
+ <string name="nick_in_use">Kallenavn allerede i bruk</string>
+ <string name="admin">Admin</string>
+ <string name="owner">Eier</string>
+ <string name="moderator">Moderator</string>
+ <string name="participant">Deltager</string>
+ <string name="visitor">Besøkende</string>
+ <string name="block_contact_text">Vil du forhindre %s fra å sende deg meldinger?</string>
+ <string name="unblock_contact_text">Ønsker du å avblokkere %s og tillate dem å sende deg meldinger?</string>
+ <string name="block_domain_text">Blokker alle kontakter fra %s?</string>
+ <string name="unblock_domain_text">Avblokker alle kontakter fra %s?</string>
+ <string name="contact_blocked">Kontakt blokkert</string>
+ <string name="register_account">Registrer ny konto på tjeneren</string>
+ <string name="change_password_on_server">Endre passord på tjeneren</string>
+ <string name="share_with">Del med...</string>
+ <string name="start_conversation">Start samtale</string>
+ <string name="invite_contact">Inviter kontakt</string>
+ <string name="contacts">Kontakter</string>
+ <string name="cancel">Avbryt</string>
+ <string name="add">Legg til</string>
+ <string name="edit">Rediger</string>
+ <string name="delete">Slett</string>
+ <string name="block">Blokker</string>
+ <string name="unblock">Avblokker</string>
+ <string name="save">Lagre</string>
+ <string name="ok">OK</string>
+ <string name="send_now">Send nå</string>
+ <string name="send_never">Aldri spør igjen</string>
+ <string name="problem_connecting_to_account">Kunne ikke koble til konto</string>
+ <string name="problem_connecting_to_accounts">Kunne ikkekoble til flerforldige kontoer</string>
+ <string name="touch_to_fix">Trykk her for behandling av kontaktene dine</string>
+ <string name="attach_file">Legg til fil</string>
+ <string name="add_contact">Legg til kontakt</string>
+ <string name="send_failed">forsendelse feilet</string>
+ <string name="send_rejected">avslått</string>
+ <string name="preparing_image">Forbereder bilde for forsendelse</string>
+ <string name="action_clear_history">Tøm historikk</string>
+ <string name="clear_conversation_history">Tøm samtalehistorikk</string>
+ <string name="send_unencrypted_message">Send ukryptert melding</string>
+ <string name="send_otr_message">Send OTR-kryptert melding</string>
+ <string name="send_omemo_message">Send OMEMO-kryptert melding</string>
+ <string name="send_pgp_message">Send OpenPGP-kryptert melding</string>
+ <string name="your_nick_has_been_changed">Kallenavnet ditt har blitt endret</string>
+ <string name="send_unencrypted">Send ukryptert</string>
+ <string name="decryption_failed">Dekryptering feilet. Kanskje du ikke lenger har den rette private nøkkelen.</string>
+ <string name="restart">Omstart</string>
+ <string name="install">Installer</string>
+ <string name="offering">tilbyr...</string>
+ <string name="waiting">venter...</string>
+ <string name="no_pgp_key">Ingen OpenPGP-nøkkel funnet</string>
+ <string name="no_pgp_keys">Ingen OpenPGP-nøkler funnet</string>
+ <string name="encrypted_message_received"><i>Kryptert melding mottatt. Trykk for å se og dekrypterte.</i></string>
+ <string name="pref_xmpp_resource">XMPP-ressurs</string>
+ <string name="pref_accept_files">Godta filer</string>
+ <string name="pref_accept_files_summary">Automatisk godkjenning av filer mindre enn...</string>
+ <string name="pref_notification_settings">Merknadsinnstillinger</string>
+ <string name="pref_notifications">Merknader</string>
+ <string name="pref_notifications_summary">Merknad om nye meldinger</string>
+ <string name="pref_vibrate">Vibrer</string>
+ <string name="pref_vibrate_summary">Vibrer også når ny melding ankommer</string>
+ <string name="pref_sound">Lyd</string>
+ <string name="pref_sound_summary">Spill av ringetone med merknad</string>
+ <string name="pref_advanced_options">Avanserte valg</string>
+ <string name="pref_never_send_crash">Aldri send feilrettingsrapporter</string>
+ <string name="pref_confirm_messages">Bekreft meldinger</string>
+ <string name="pref_ui_options">Valg for grensesnitt</string>
+ <string name="openpgp_error">Feilmelding fra OpenKeychain</string>
+ <string name="accept">Godta</string>
+ <string name="error">En feil har inntruffet</string>
+ <string name="subscriptions">Abonnement</string>
+ <string name="your_account">Din konto</string>
+ <string name="keys">Nøkler</string>
+ <string name="attach_choose_picture">Velg bilde</string>
+ <string name="attach_take_picture">Ta bilde</string>
+ <string name="account_status_unknown">Ukjent</string>
+ <string name="account_status_disabled">Midlertidig avskrudd</string>
+ <string name="account_status_online">Pålogget</string>
+ <string name="account_status_connecting">Kobler til\u2026</string>
+ <string name="account_status_offline">Avlogget</string>
+ <string name="account_status_not_found">Fant ikke tjener</string>
+ <string name="account_status_regis_fail">Registrering feilet</string>
+ <string name="account_status_regis_conflict">Brukernavn allerede i bruk</string>
+ <string name="account_status_regis_success">Registrering fullført</string>
+ <string name="encryption_choice_unencrypted">Ukryptert</string>
+ <string name="encryption_choice_otr">OTR</string>
+ <string name="encryption_choice_pgp">OpenPGP</string>
+ <string name="encryption_choice_omemo">OMEMO</string>
+ <string name="mgmt_account_edit">Rediger konto</string>
+ <string name="mgmt_account_delete">Slett konto</string>
+ <string name="mgmt_account_disable">Skru av midlertidig</string>
+ <string name="mgmt_account_publish_avatar">Publiser avatar</string>
+ <string name="mgmt_account_publish_pgp">Publiser OpenPGP offentlig nøkkel</string>
+ <string name="mgmt_account_enable">Skru på konto</string>
+ <string name="mgmt_account_are_you_sure">Bekreft.</string>
+ <string name="mgmt_account_delete_confirm_text">Hvis du sletter din konto vil hele din konversasjonshistorikk gå tapt</string>
+ <string name="attach_record_voice">Ta opp stemme</string>
+ <string name="account_settings_jabber_id">Jabber-ID</string>
+ <string name="account_settings_password">Passord</string>
+ <string name="account_settings_confirm_password">Bekreft passord</string>
+ <string name="password">Passord</string>
+ <string name="confirm_password">Bekreft passord</string>
+ <string name="passwords_do_not_match">Passordene samsvarer ikke</string>
+ <string name="invalid_jid">Dette er ikke en gyldig Jabber-ID</string>
+ <string name="error_out_of_memory">Slapp opp for minne, bildet er for stort</string>
+ <string name="add_phone_book_text">Ønsker du å legge til %s til din telefons kontaktliste?</string>
+ <string name="contact_status_online">pålogget</string>
+ <string name="contact_status_free_to_chat">tilgjengelig for sludring</string>
+ <string name="contact_status_away">fraværende</string>
+ <string name="contact_status_extended_away">borte</string>
+ <string name="contact_status_do_not_disturb">ikke forstyrr</string>
+ <string name="contact_status_offline">avlogget</string>
+ <string name="muc_details_conference">Konferanse</string>
+ <string name="muc_details_other_members">Andre medlemmer</string>
+ <string name="server_info_show_more">Tjenerinfo</string>
+ <string name="server_info_available">tilgjengelig</string>
+ <string name="server_info_unavailable">utilgjengelig</string>
+ <string name="last_seen_now">i syne</string>
+ <string name="last_seen_min">sist sett for ett minutt siden</string>
+ <string name="last_seen_mins">sist sett for %d minutter siden</string>
+ <string name="last_seen_hour">sist sett én time siden</string>
+ <string name="last_seen_hours">sist sett %d timer siden</string>
+ <string name="last_seen_day">sist sett i går</string>
+ <string name="last_seen_days">sist sett for %d dager siden</string>
+ <string name="never_seen">aldri sett</string>
+ <string name="install_openkeychain">Kryptert melding. Installer OpenKeychain for å dekryptere.</string>
+ <string name="unknown_otr_fingerprint">Ukjent OTR-fingeravtrykk</string>
+ <string name="otr_fingerprint">OTR-fingeravtrykk</string>
+ <string name="fetching_keys">Henter nøkler...</string>
+ <string name="done">Ferdig</string>
+ <string name="decrypt">Dekrypter</string>
+ <string name="conferences">Konferanser</string>
+ <string name="search">Søk</string>
+ <string name="create_contact">Opprett kontakt</string>
+ <string name="join_conference">Ta del i konferanse</string>
+ <string name="delete_contact">Slett kontakt</string>
+ <string name="view_contact_details">Vis kontaktdetaljer</string>
+ <string name="block_contact">Blokker kontakt</string>
+ <string name="unblock_contact">Avblokker kontakt</string>
+ <string name="contact_already_exists">Kontakten finnes allerede</string>
+ <string name="conference_address">Konferanse-adresse</string>
+ <string name="conference_address_example">rom@konferanse.eksempel.no</string>
+ <string name="save_as_bookmark">Lagre som bokmerke</string>
+ <string name="delete_bookmark">Slett bokmerke</string>
+ <string name="bookmark_already_exists">Dette bokmerket finnes allerede</string>
+ <string name="you">Deg</string>
+ <string name="action_edit_subject">Rediger temaet for konferansen</string>
+ <string name="conference_not_found">Fant ikke konferansen</string>
+ <string name="audio">lyd</string>
+ <string name="video">film</string>
+ <string name="image">stillbilde</string>
+ <string name="pdf_document">PDF-dokument</string>
+ <string name="apk">Android-app</string>
+ <string name="sending_x_file">Sender %s</string>
+ <string name="offering_x_file">Tilbyr %s</string>
+ <string name="dialog_manage_certs_negativebutton">Avbryt</string>
+</resources>
diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml
index 265bc1978..1507865bf 100644
--- a/src/main/res/values-nl/strings.xml
+++ b/src/main/res/values-nl/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Gespreksgeschiedenis wissen</string>
<string name="clear_histor_msg">Wil je alle berichten in dit gesprek verwijderen?\n\n<b>Waarschuwing:</b> Dit zal geen invloed hebben op de berichten opgeslagen op andere apparaten of servers.</string>
<string name="delete_messages">Berichten verwijderen</string>
- <string name="also_end_conversation">Beëindig dit gesprek na afloop</string>
<string name="choose_presence">Kies aanwezigheid om te tonen aan contact</string>
<string name="send_unencrypted_message">Verstuur onversleuteld bericht</string>
<string name="send_otr_message">Verstuur OTR-versleuteld bericht</string>
diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml
index 0ea0ab577..16df1b3b3 100644
--- a/src/main/res/values-pl/strings.xml
+++ b/src/main/res/values-pl/strings.xml
@@ -74,10 +74,10 @@
<string name="clear_conversation_history">Wyczyść historię konwersacji</string>
<string name="clear_histor_msg">Czy na pewno usunąć wszystkie wiadomości powiązane z konwersacją?\n\n<b>Uwaga:</b> Działanie nie wpływa na wiadomości przechowywane na innych urządzeniach lub serwerach.</string>
<string name="delete_messages">Usuń wiadomości</string>
- <string name="also_end_conversation">Zakończ konwersację po usunięciu historii</string>
<string name="choose_presence">Wybierz widoczność dla kontaktu</string>
<string name="send_unencrypted_message">Wyślij wiadomość bez szyfrowania</string>
<string name="send_otr_message">Wyślij zaszyfrowaną wiadomość (OTR)</string>
+ <string name="send_omemo_message">Wyślij wiadomość zaszyfrowaną OMEMO</string>
<string name="send_pgp_message">Wyślij zaszyfrowaną wiadomość (OpenPGP)</string>
<string name="your_nick_has_been_changed">Twoja nazwa została zmieniona</string>
<string name="send_unencrypted">Wyślij bez szyfrowania</string>
@@ -106,6 +106,7 @@
<string name="pref_sound">Dźwięk</string>
<string name="pref_sound_summary">Odtwórz dźwięk z powiadomieniem</string>
<string name="pref_conference_notifications">Powiadomienia konfrencji</string>
+ <string name="pref_conference_notifications_summary">Zawsze powiadamiaj przy odebraniu wiadomości w publicznej konferencji, a nie tylko przy wywołaniu nicka.</string>
<string name="pref_notification_grace_period">Opóźnienie powiadomień</string>
<string name="pref_notification_grace_period_summary">Wyłącz powiadomienia przez krótki czas po otrzymaniu kopii wiadomości</string>
<string name="pref_advanced_options">Opcje zaawansowane</string>
@@ -205,7 +206,11 @@
<string name="reception_failed">Odbiór nieudany</string>
<string name="your_fingerprint">Twój odcisk klucza</string>
<string name="otr_fingerprint">Odcisk klucza OTR</string>
+ <string name="omemo_fingerprint">Odcisk OMEMO</string>
+ <string name="omemo_fingerprint_selected_message">Odcisk OMEMO wiadomości</string>
+ <string name="this_device_omemo_fingerprint">Własny odcisk OMEMO</string>
<string name="other_devices">Pozostałe urządzenia</string>
+ <string name="trust_omemo_fingerprints">Zaufane odciski OMEMO</string>
<string name="fetching_keys">Pobieranie kluczy...</string>
<string name="done">Ukończono</string>
<string name="verify">Weryfikuj</string>
@@ -357,9 +362,13 @@
<string name="copy_otr_clipboard_description">Skopiuj odcisk klucza OTR do schowka</string>
<string name="copy_omemo_clipboard_description">Skopiuj odcisk klucza OMEMO do schowka</string>
<string name="regenerate_omemo_key">Wygeneruj ponownie klucz OMEMO</string>
+ <string name="wipe_omemo_pep">Usuń inne urządzenia z PEP</string>
<string name="clear_other_devices">Wyczyść urządzenia</string>
+ <string name="clear_other_devices_desc">Czy na pewno chcesz usunąć wszystkie inne urządzenia z ogłoszenia OMEMO? Następnym razem gdy połączą się Twoje urdzącenia, ogłoszą się one ponownie, ale mogą nie otrzymać wiadomości wysłanych w międzyczasie.</string>
<string name="purge_key">Skasuj klucz</string>
<string name="purge_key_desc_part1">Czy na pewno chcesz skasować usunąć odcisk klucza?</string>
+ <string name="purge_key_desc_part2">Zostanie bez odwołania uznane za zdradzone, i nigdy więcej nie będzie można stworzyć z nim sesji.</string>
+ <string name="error_no_keys_to_trust">Nie ma dostępnych żadnych użytecznych kluczy dla tego kontaktu. Jeśli usunąłeś jakieś jego klucze, kontakt będzie musiał wygenerować nowe.</string>
<string name="error_trustkeys_title">Błąd</string>
<string name="fetching_history_from_server">Pobieranie historii z serwera</string>
<string name="no_more_history_on_server">Koniec historii na serwerze</string>
@@ -398,7 +407,10 @@
<string name="public_conference">Konferencja publiczna</string>
<string name="private_conference">Konferencja prywatna, dla zaakceptowanych uczestników</string>
<string name="conference_options">Opcje konferencji</string>
+ <string name="members_only">Prywatne, tylko dla członków.</string>
<string name="non_anonymous">Nieanonimowa</string>
+ <string name="moderated">Moderowany</string>
+ <string name="you_are_not_participating">Nie bierzesz udziału</string>
<string name="modified_conference_options">Opcje konferencji zostały zmienione!</string>
<string name="could_not_modify_conference_options">Nie udało się zmienić opcji konferencji</string>
<string name="never">Nigdy</string>
@@ -472,4 +484,6 @@
<string name="download_failed_could_not_connect">Pobieranie nieudane: Nie można połączyć z hostem</string>
<string name="pref_use_white_background">Białe tło</string>
<string name="pref_use_white_background_summary">Pokazuj otrzymane wiadomości jako czarny tekst na białym tle</string>
+ <string name="account_status_dns_timeout">DNS timeout</string>
+ <string name="server_info_broken">Zepsute</string>
</resources>
diff --git a/src/main/res/values-pt/strings.xml b/src/main/res/values-pt/strings.xml
index 6550d9ad0..c0614d88f 100644
--- a/src/main/res/values-pt/strings.xml
+++ b/src/main/res/values-pt/strings.xml
@@ -72,7 +72,6 @@
<string name="clear_conversation_history">Limpar o histórico de conversas</string>
<string name="clear_histor_msg">Você deseja remover todas as mensagens nessa conversa?\n\n&lt;b&gt;Atenção:&lt;b&gt; Isso não irá influenciar mensagens salvas em outros dispositivos ou servidores.</string>
<string name="delete_messages">Remover mensagens</string>
- <string name="also_end_conversation">Finalizar essa conversa ao final</string>
<string name="choose_presence">Escolha a presença do contato</string>
<string name="send_otr_message">Enviar mensagem criptografada com OTR</string>
<string name="send_pgp_message">Enviar mensagem criptografada com OpenPGP</string>
diff --git a/src/main/res/values-ro-rRO/strings.xml b/src/main/res/values-ro-rRO/strings.xml
index c70ce0520..991201e54 100644
--- a/src/main/res/values-ro-rRO/strings.xml
+++ b/src/main/res/values-ro-rRO/strings.xml
@@ -73,7 +73,6 @@
<string name="clear_conversation_history">Sterge istoria conversatiei</string>
<string name="clear_histor_msg">Doresti sa stergi toate mesajele din Conversatii?\n\n<b>Atentie:</b> Aceasta actiune nu va influenta mesajele aflate pe alte telefoane/tabelete/servere.</string>
<string name="delete_messages">Sterge mesajele</string>
- <string name="also_end_conversation">Termina conversatia aceasta dupa</string>
<string name="choose_presence">Alege prezenta pentru a contacta</string>
<string name="send_otr_message">Trimite mesaj criptat cu OTR</string>
<string name="send_pgp_message">Trimite mesaj criptat cu OpenPGP</string>
diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml
index 961078279..54ea80bc8 100644
--- a/src/main/res/values-ru/strings.xml
+++ b/src/main/res/values-ru/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Очистить историю</string>
<string name="clear_histor_msg">Вы хотите удалить все сообщения в этой беседе?\n\n<b>Предупреждение:</b> Данная операция не повлияет на сообщения, хранящиеся на других устройствах.</string>
<string name="delete_messages">Удалить сообщения</string>
- <string name="also_end_conversation">Завершить беседу</string>
<string name="choose_presence">Укажите статус для контакта</string>
<string name="send_unencrypted_message">Отправить незащифрованное сообщение</string>
<string name="send_otr_message">Отправить OTR защифрованное сообщение</string>
diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml
index 892374d77..b8a3993e0 100644
--- a/src/main/res/values-sk/strings.xml
+++ b/src/main/res/values-sk/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Vymazať históriu konverzácií</string>
<string name="clear_histor_msg">Chcete vymazať všetky správy v tejto konverzácii?\n\n<b>Varovanie:</b> Toto neovplyvní správy uložené v iných zariadeniach alebo serveroch.</string>
<string name="delete_messages">Vymazať správy</string>
- <string name="also_end_conversation">Následne ukončiť aj túto konverzáciu</string>
<string name="choose_presence">Vybrať aktualizáciu stavu pre kontakt</string>
<string name="send_otr_message">Poslať OTR šifrovanú správu</string>
<string name="send_pgp_message">Poslať OpenPGP šifrovanú správu</string>
diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml
index 452de3548..a251fbcd8 100644
--- a/src/main/res/values-sr/strings.xml
+++ b/src/main/res/values-sr/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Брисање историјата преписки</string>
<string name="clear_histor_msg">Желите ли да обришете све поруке ове преписке?\n\n<b>Упозорење:</b> Ово неће утицати на поруке складиштене на осталим уређајима или серверима.</string>
<string name="delete_messages">Обриши поруке</string>
- <string name="also_end_conversation">Окончај ову преписку након тога</string>
<string name="choose_presence">Избор присутности за контакта</string>
<string name="send_unencrypted_message">Пошаљи нешифровану поруку</string>
<string name="send_otr_message">Пошаљи ОТР шифровану поруку</string>
diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml
index de0073b57..34a11698c 100644
--- a/src/main/res/values-sv/strings.xml
+++ b/src/main/res/values-sv/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">Rensa konversationshistorik</string>
<string name="clear_histor_msg">Vill du ta bort alla meddelanden i denna konversation?\n\n<b>Varning:</b> Detta kommer inte påverka meddelanden lagrade på andra enheter eller servrar.</string>
<string name="delete_messages">Ta bort meddelanden</string>
- <string name="also_end_conversation">Avsluta sedan denna konversation</string>
<string name="choose_presence">Välj tillgänglighet till kontakt</string>
<string name="send_unencrypted_message">Skicka okrypterat meddelande</string>
<string name="send_otr_message">Skicka OTR-krypterat meddelande</string>
diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml
index 5b65d7bf7..8c41f1950 100644
--- a/src/main/res/values-zh-rCN/strings.xml
+++ b/src/main/res/values-zh-rCN/strings.xml
@@ -74,7 +74,6 @@
<string name="clear_conversation_history">清除会话记录</string>
<string name="clear_histor_msg">删除该会话中所有信息?\n\n<b>注:</b> 该操作不会影响其他设备或服务器保存的信息。</string>
<string name="delete_messages">删除消息</string>
- <string name="also_end_conversation">之后结束该会话</string>
<string name="choose_presence">添加在线用户至联系人</string>
<string name="send_otr_message">发送 OTR 加密信息</string>
<string name="send_pgp_message">发送 OpenPGP 加密信息</string>
diff --git a/src/main/res/values-zh-rTW/strings.xml b/src/main/res/values-zh-rTW/strings.xml
index 7c73b646f..161d49db2 100644
--- a/src/main/res/values-zh-rTW/strings.xml
+++ b/src/main/res/values-zh-rTW/strings.xml
@@ -58,7 +58,6 @@
<string name="clear_conversation_history">清除對話記錄</string>
<string name="clear_histor_msg">你確定要刪除該對話中所有訊息嗎?\n\n<b>警告:</b> 這將不會影響其他設備或伺服器儲存的訊息。</string>
<string name="delete_messages">刪除訊息</string>
- <string name="also_end_conversation">之後結束這對話</string>
<string name="choose_presence">選擇狀態訊息</string>
<string name="send_otr_message">發送 OTR 加密訊息</string>
<string name="send_pgp_message">發送 OpenPGP 加密訊息</string>
diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml
index a286ef283..e6cc222a4 100644
--- a/src/main/res/values/strings.xml
+++ b/src/main/res/values/strings.xml
@@ -76,7 +76,7 @@
<string name="clear_conversation_history">Clear Conversation History</string>
<string name="clear_histor_msg">Do you want to delete all messages within this Conversation?\n\n<b>Warning:</b> This will not influence messages stored on other devices or servers.</string>
<string name="delete_messages">Delete messages</string>
- <string name="also_end_conversation">End this conversations afterwards</string>
+ <string name="also_end_conversation">End this conversation afterwards</string>
<string name="choose_presence">Choose presence to contact</string>
<string name="send_unencrypted_message">Send unencrypted message</string>
<string name="send_otr_message">Send OTR encrypted message</string>
@@ -95,7 +95,7 @@
<string name="contact_has_no_pgp_key">Conversations is unable to encrypt your messages because your contact is not announcing his or hers public key.\n\n<small>Please ask your contact to setup OpenPGP.</small></string>
<string name="no_pgp_keys">No OpenPGP Keys found</string>
<string name="contacts_have_no_pgp_keys">Conversations is unable to encrypt your messages because your contacts are not announcing their public key.\n\n<small>Please ask your contacts to setup OpenPGP.</small></string>
- <string name="encrypted_message_received"><i>Encrypted message received. Touch to view and decrypt.</i></string>
+ <string name="encrypted_message_received"><i>Encrypted message received. Touch to decrypt.</i></string>
<string name="pref_general">General</string>
<string name="pref_xmpp_resource">XMPP resource</string>
<string name="pref_xmpp_resource_summary">The name this client identifies itself with</string>
@@ -174,7 +174,7 @@
<string name="passwords_do_not_match">Passwords do not match</string>
<string name="invalid_jid">This is not a valid Jabber ID</string>
<string name="error_out_of_memory">Out of memory. Image is too large</string>
- <string name="add_phone_book_text">Do you want to add %s to your phones contact list?</string>
+ <string name="add_phone_book_text">Do you want to add %s to your devices’s contact list?</string>
<string name="contact_status_online">online</string>
<string name="contact_status_free_to_chat">free to chat</string>
<string name="contact_status_away">away</string>
@@ -537,4 +537,14 @@
<string name="pref_xa_on_silent_mode">Not available in silent mode</string>
<string name="pref_xa_on_silent_mode_summary">Marks your resource as not available when phone is in silent mode</string>
<string name="update_info">Conversation is checking for an update. If an update is available you will be asked, if you want to update your version. The update process is downloading and installing the new version automatically.</string>
+ <string name="action_add_account_with_certificate">Add account with certificate</string>
+ <string name="unable_to_parse_certificate">Unable to parse certificate</string>
+ <string name="authenticate_with_certificate">Leave empty to authenticate w/ certificate</string>
+ <string name="captcha_ocr">Captcha text</string>
+ <string name="captcha_required">Captcha required</string>
+ <string name="captcha_hint">enter the text from the image</string>
+ <string name="certificate_chain_is_not_trusted">Certificate chain is not trusted</string>
+ <string name="jid_does_not_match_certificate">Jabber ID does not match certificate</string>
+ <string name="action_renew_certificate">Renew certificate</string>
+
</resources>