diff options
Diffstat (limited to 'src')
194 files changed, 2982 insertions, 434 deletions
diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index e4e91d80..9fe37017 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -122,6 +122,13 @@ <data android:mimeType="*/*" /> </intent-filter> + <intent-filter> + <action android:name="android.intent.action.SEND_MULTIPLE" /> + + <category android:name="android.intent.category.DEFAULT" /> + + <data android:mimeType="image/*" /> + </intent-filter> </activity> <activity android:name="de.duenndns.ssl.MemorizingActivity" diff --git a/src/main/java/eu/siacs/conversations/Config.java b/src/main/java/eu/siacs/conversations/Config.java index f38bcbfc..5cca6c0b 100644 --- a/src/main/java/eu/siacs/conversations/Config.java +++ b/src/main/java/eu/siacs/conversations/Config.java @@ -28,6 +28,7 @@ public final class Config { public static final boolean NO_PROXY_LOOKUP = false; //useful to debug ibb public static final boolean DISABLE_STRING_PREP = false; // setting to true might increase startup performance + public static final boolean EXTENDED_SM_LOGGING = false; // log stanza counts public static final long MILLISECONDS_IN_DAY = 24 * 60 * 60 * 1000; public static final long MAM_MAX_CATCHUP = MILLISECONDS_IN_DAY / 2; diff --git a/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java b/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java index 20427d7b..0dc7c37e 100644 --- a/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java +++ b/src/main/java/eu/siacs/conversations/crypto/OtrEngine.java @@ -182,7 +182,7 @@ public class OtrEngine extends OtrCryptoEngineImpl implements OtrEngineHost { packet.setBody(body); packet.addChild("private", "urn:xmpp:carbons:2"); packet.addChild("no-copy", "urn:xmpp:hints"); - packet.addChild("no-store", "urn:xmpp:hints"); + packet.addChild("no-permanent-store", "urn:xmpp:hints"); try { Jid jid = Jid.fromSessionID(session); @@ -202,20 +202,7 @@ public class OtrEngine extends OtrCryptoEngineImpl implements OtrEngineHost { @Override public void messageFromAnotherInstanceReceived(SessionID session) { - try { - Jid jid = Jid.fromSessionID(session); - Conversation conversation = mXmppConnectionService.find(account, jid); - String id = conversation == null ? null : conversation.getLastReceivedOtrMessageId(); - if (id != null) { - MessagePacket packet = mXmppConnectionService.getMessageGenerator().generateOtrError(jid,id); - packet.setFrom(account.getJid()); - mXmppConnectionService.sendMessagePacket(account,packet); - Log.d(Config.LOGTAG,packet.toString()); - Log.d(Config.LOGTAG,account.getJid().toBareJid().toString()+": unreadable OTR message in "+conversation.getName()); - } - } catch (InvalidJidException e) { - return; - } + sendOtrErrorMessage(session, "Message from another OTR-instance received"); } @Override @@ -267,9 +254,28 @@ public class OtrEngine extends OtrCryptoEngineImpl implements OtrEngineHost { } @Override - public void unreadableMessageReceived(SessionID arg0) throws OtrException { + public void unreadableMessageReceived(SessionID session) throws OtrException { Log.d(Config.LOGTAG,"unreadable message received"); - throw new OtrException(new Exception("unreadable message received")); + sendOtrErrorMessage(session, "You sent me an unreadable OTR-encrypted message"); + } + + public void sendOtrErrorMessage(SessionID session, String errorText) { + try { + Jid jid = Jid.fromSessionID(session); + Conversation conversation = mXmppConnectionService.find(account, jid); + String id = conversation == null ? null : conversation.getLastReceivedOtrMessageId(); + if (id != null) { + MessagePacket packet = mXmppConnectionService.getMessageGenerator() + .generateOtrError(jid, id, errorText); + packet.setFrom(account.getJid()); + mXmppConnectionService.sendMessagePacket(account,packet); + Log.d(Config.LOGTAG,packet.toString()); + Log.d(Config.LOGTAG,account.getJid().toBareJid().toString() + +": unreadable OTR message in "+conversation.getName()); + } + } catch (InvalidJidException e) { + return; + } } @Override diff --git a/src/main/java/eu/siacs/conversations/entities/Account.java b/src/main/java/eu/siacs/conversations/entities/Account.java index 2bc2c954..fe103094 100644 --- a/src/main/java/eu/siacs/conversations/entities/Account.java +++ b/src/main/java/eu/siacs/conversations/entities/Account.java @@ -229,11 +229,17 @@ public class Account extends AbstractEntity { return jid.getResourcepart(); } - public void setResource(final String resource) { - try { - jid = Jid.fromParts(jid.getLocalpart(), jid.getDomainpart(), resource); - } catch (final InvalidJidException ignored) { + public boolean setResource(final String resource) { + final String oldResource = jid.getResourcepart(); + if (oldResource == null || !oldResource.equals(resource)) { + try { + jid = Jid.fromParts(jid.getLocalpart(), jid.getDomainpart(), resource); + return true; + } catch (final InvalidJidException ignored) { + return true; + } } + return false; } public Jid getJid() { diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 8015eead..7ea3d60b 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -430,23 +430,31 @@ public class Message extends AbstractEntity { } public boolean bodyContainsDownloadable() { + /** + * there are a few cases where spaces result in an unwanted behavior, e.g. + * "http://example.com/image.jpg text that will not be shown /abc.png" + * or more than one image link in one message. + */ + if (body.contains(" ")) { + return false; + } try { - URL url = new URL(this.getBody()); + URL url = new URL(body); if (!url.getProtocol().equalsIgnoreCase("http") && !url.getProtocol().equalsIgnoreCase("https")) { return false; } - if (url.getPath() == null) { - return false; - } - String[] pathParts = url.getPath().split("/"); - String filename; - if (pathParts.length > 0) { - filename = pathParts[pathParts.length - 1].toLowerCase(); - } else { + + String sUrlPath = url.getPath(); + if (sUrlPath == null || sUrlPath.isEmpty()) { return false; } - String[] extensionParts = filename.split("\\."); + + int iSlashIndex = sUrlPath.lastIndexOf('/') + 1; + + String sLastUrlPath = sUrlPath.substring(iSlashIndex).toLowerCase(); + + String[] extensionParts = sLastUrlPath.split("\\."); if (extensionParts.length == 2 && Arrays.asList(Downloadable.VALID_IMAGE_EXTENSIONS).contains( extensionParts[extensionParts.length - 1])) { diff --git a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java index 8f6a90b9..474a3e1d 100644 --- a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java @@ -71,6 +71,7 @@ public class MessageGenerator extends AbstractGenerator { MessagePacket packet = preparePacket(message, addDelay); packet.addChild("private", "urn:xmpp:carbons:2"); packet.addChild("no-copy", "urn:xmpp:hints"); + packet.addChild("no-permanent-store", "urn:xmpp:hints"); try { packet.setBody(otrSession.transformSending(message.getBody())[0]); return packet; @@ -172,7 +173,7 @@ public class MessageGenerator extends AbstractGenerator { return receivedPacket; } - public MessagePacket generateOtrError(Jid to, String id) { + public MessagePacket generateOtrError(Jid to, String id, String errorText) { MessagePacket packet = new MessagePacket(); packet.setType(MessagePacket.TYPE_ERROR); packet.setAttribute("id",id); @@ -181,7 +182,7 @@ public class MessageGenerator extends AbstractGenerator { error.setAttribute("code","406"); error.setAttribute("type","modify"); error.addChild("not-acceptable","urn:ietf:params:xml:ns:xmpp-stanzas"); - error.addChild("text").setContent("unreadable OTR message received"); + error.addChild("text").setContent("?OTR Error:" + errorText); return packet; } } diff --git a/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java b/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java index 1e896724..526005f3 100644 --- a/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/PresenceGenerator.java @@ -54,4 +54,11 @@ public class PresenceGenerator extends AbstractGenerator { } return packet; } + + public PresencePacket sendOfflinePresence(Account account) { + PresencePacket packet = new PresencePacket(); + packet.setFrom(account.getJid()); + packet.setAttribute("type","unavailable"); + return packet; + } }
\ No newline at end of file diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 8ae9b642..76d01468 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -391,15 +391,17 @@ public class MessageParser extends AbstractParser implements private void parseNonMessage(Element packet, Account account) { final Jid from = packet.getAttributeAsJid("from"); + if (account.getJid().equals(from)) { + return; + } if (extractChatState(from == null ? null : mXmppConnectionService.find(account,from), packet)) { mXmppConnectionService.updateConversationUi(); } - Element invite = extractInvite(packet); - if (invite != null) { - Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, from, true); + Invite invite = extractInvite(packet); + if (invite != null && invite.jid != null) { + Conversation conversation = mXmppConnectionService.findOrCreateConversation(account, invite.jid, true); if (!conversation.getMucOptions().online()) { - Element password = invite.findChild("password"); - conversation.getMucOptions().setPassword(password == null ? null : password.getContent()); + conversation.getMucOptions().setPassword(invite.password); mXmppConnectionService.databaseBackend.updateConversation(conversation); mXmppConnectionService.joinMuc(conversation); mXmppConnectionService.updateConversationUi(); @@ -439,16 +441,30 @@ public class MessageParser extends AbstractParser implements } } - private Element extractInvite(Element message) { - Element x = message.findChild("x","http://jabber.org/protocol/muc#user"); - if (x == null) { - x = message.findChild("x","jabber:x:conference"); + private class Invite { + Jid jid; + String password; + Invite(Jid jid, String password) { + this.jid = jid; + this.password = password; } - if (x != null && x.hasChild("invite")) { - return x; + } + + private Invite extractInvite(Element message) { + Element x = message.findChild("x","http://jabber.org/protocol/muc#user"); + if (x != null) { + Element invite = x.findChild("invite"); + if (invite != null) { + Element pw = x.findChild("password"); + return new Invite(message.getAttributeAsJid("from"), pw != null ? pw.getContent(): null); + } } else { - return null; + x = message.findChild("x","jabber:x:conference"); + if (x != null) { + return new Invite(x.getAttributeAsJid("jid"),x.getAttribute("password")); + } } + return null; } private void parseEvent(final Element event, final Jid from, final Account account) { diff --git a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java index c499d499..e120adbd 100644 --- a/src/main/java/eu/siacs/conversations/persistance/FileBackend.java +++ b/src/main/java/eu/siacs/conversations/persistance/FileBackend.java @@ -1,6 +1,7 @@ package eu.siacs.conversations.persistance; import java.io.ByteArrayOutputStream; +import java.io.Closeable; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; @@ -42,8 +43,7 @@ public class FileBackend { private static int IMAGE_SIZE = 1920; - private SimpleDateFormat imageDateFormat = new SimpleDateFormat( - "yyyyMMdd_HHmmssSSS", Locale.US); + private final SimpleDateFormat imageDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmssSSS", Locale.US); private XmppConnectionService mXmppConnectionService; @@ -110,9 +110,7 @@ public class FileBackend { scalledW = size; scalledH = (int) (h / ((double) w / size)); } - Bitmap scalledBitmap = Bitmap.createScaledBitmap(originalBitmap, - scalledW, scalledH, true); - return scalledBitmap; + return Bitmap.createScaledBitmap(originalBitmap, scalledW, scalledH, true); } else { return originalBitmap; } @@ -148,31 +146,35 @@ public class FileBackend { } public DownloadableFile copyFileToPrivateStorage(Message message, Uri uri) throws FileCopyException { + Log.d(Config.LOGTAG, "copy " + uri.toString() + " to private storage"); + String mime = mXmppConnectionService.getContentResolver().getType(uri); + String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mime); + message.setRelativeFilePath(message.getUuid() + "." + extension); + DownloadableFile file = mXmppConnectionService.getFileBackend().getFile(message); + file.getParentFile().mkdirs(); + OutputStream os = null; + InputStream is = null; try { - Log.d(Config.LOGTAG, "copy " + uri.toString() + " to private storage"); - String mime = mXmppConnectionService.getContentResolver().getType(uri); - String extension = MimeTypeMap.getSingleton().getExtensionFromMimeType(mime); - message.setRelativeFilePath(message.getUuid() + "." + extension); - DownloadableFile file = mXmppConnectionService.getFileBackend().getFile(message); - file.getParentFile().mkdirs(); file.createNewFile(); - OutputStream os = new FileOutputStream(file); - InputStream is = mXmppConnectionService.getContentResolver().openInputStream(uri); + os = new FileOutputStream(file); + is = mXmppConnectionService.getContentResolver().openInputStream(uri); byte[] buffer = new byte[1024]; - int length; - while ((length = is.read(buffer)) > 0) { + int length; + while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); - } + } os.flush(); - os.close(); - is.close(); - Log.d(Config.LOGTAG, "output file name " + mXmppConnectionService.getFileBackend().getFile(message)); - return file; - } catch (FileNotFoundException e) { + } catch(FileNotFoundException e) { throw new FileCopyException(R.string.error_file_not_found); } catch (IOException e) { + e.printStackTrace(); throw new FileCopyException(R.string.error_io_exception); + } finally { + close(os); + close(is); } + Log.d(Config.LOGTAG, "output file name " + mXmppConnectionService.getFileBackend().getFile(message)); + return file; } public DownloadableFile copyImageToPrivateStorage(Message message, Uri image) @@ -182,49 +184,48 @@ public class FileBackend { private DownloadableFile copyImageToPrivateStorage(Message message, Uri image, int sampleSize) throws FileCopyException { + DownloadableFile file = getFile(message); + file.getParentFile().mkdirs(); + InputStream is = null; + OutputStream os = null; try { - InputStream is = mXmppConnectionService.getContentResolver() - .openInputStream(image); - DownloadableFile file = getFile(message); - file.getParentFile().mkdirs(); file.createNewFile(); + is = mXmppConnectionService.getContentResolver().openInputStream(image); + os = new FileOutputStream(file); + Bitmap originalBitmap; BitmapFactory.Options options = new BitmapFactory.Options(); int inSampleSize = (int) Math.pow(2, sampleSize); - Log.d(Config.LOGTAG, "reading bitmap with sample size " - + inSampleSize); + Log.d(Config.LOGTAG, "reading bitmap with sample size " + inSampleSize); options.inSampleSize = inSampleSize; originalBitmap = BitmapFactory.decodeStream(is, null, options); is.close(); if (originalBitmap == null) { throw new FileCopyException(R.string.error_not_an_image_file); } - Bitmap scalledBitmap = resize(originalBitmap, IMAGE_SIZE); - originalBitmap = null; + Bitmap scaledBitmap = resize(originalBitmap, IMAGE_SIZE); int rotation = getRotation(image); if (rotation > 0) { - scalledBitmap = rotate(scalledBitmap, rotation); + scaledBitmap = rotate(scaledBitmap, rotation); } - OutputStream os = new FileOutputStream(file); - boolean success = scalledBitmap.compress( - Bitmap.CompressFormat.WEBP, 75, os); + + boolean success = scaledBitmap.compress(Bitmap.CompressFormat.WEBP, 75, os); if (!success) { throw new FileCopyException(R.string.error_compressing_image); } os.flush(); - os.close(); long size = file.getSize(); - int width = scalledBitmap.getWidth(); - int height = scalledBitmap.getHeight(); + int width = scaledBitmap.getWidth(); + int height = scaledBitmap.getHeight(); message.setBody(Long.toString(size) + ',' + width + ',' + height); return file; } catch (FileNotFoundException e) { throw new FileCopyException(R.string.error_file_not_found); } catch (IOException e) { + e.printStackTrace(); throw new FileCopyException(R.string.error_io_exception); } catch (SecurityException e) { - throw new FileCopyException( - R.string.error_security_exception_during_image_copy); + throw new FileCopyException(R.string.error_security_exception_during_image_copy); } catch (OutOfMemoryError e) { ++sampleSize; if (sampleSize <= 3) { @@ -232,23 +233,24 @@ public class FileBackend { } else { throw new FileCopyException(R.string.error_out_of_memory); } + } finally { + close(os); + close(is); } } private int getRotation(Uri image) { + InputStream is = null; try { - InputStream is = mXmppConnectionService.getContentResolver() - .openInputStream(image); + is = mXmppConnectionService.getContentResolver().openInputStream(image); return ExifHelper.getOrientation(is); } catch (FileNotFoundException e) { return 0; + } finally { + close(is); } } - public Bitmap getImageFromMessage(Message message) { - return BitmapFactory.decodeFile(getFile(message).getAbsolutePath()); - } - public Bitmap getThumbnail(Message message, int size, boolean cacheOnly) throws FileNotFoundException { Bitmap thumbnail = mXmppConnectionService.getBitmapCache().get( @@ -257,8 +259,7 @@ public class FileBackend { File file = getFile(message); BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = calcSampleSize(file, size); - Bitmap fullsize = BitmapFactory.decodeFile(file.getAbsolutePath(), - options); + Bitmap fullsize = BitmapFactory.decodeFile(file.getAbsolutePath(),options); if (fullsize == null) { throw new FileNotFoundException(); } @@ -271,13 +272,11 @@ public class FileBackend { public Uri getTakePhotoUri() { StringBuilder pathBuilder = new StringBuilder(); - pathBuilder.append(Environment - .getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)); + pathBuilder.append(Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DCIM)); pathBuilder.append('/'); pathBuilder.append("Camera"); pathBuilder.append('/'); - pathBuilder.append("IMG_" + this.imageDateFormat.format(new Date()) - + ".jpg"); + pathBuilder.append("IMG_" + this.imageDateFormat.format(new Date()) + ".jpg"); Uri uri = Uri.parse("file://" + pathBuilder.toString()); File file = new File(uri.toString()); file.getParentFile().mkdirs(); @@ -325,13 +324,13 @@ public class FileBackend { String filename = getAvatarPath(avatar.getFilename()); file = new File(filename + ".tmp"); file.getParentFile().mkdirs(); + OutputStream os = null; try { file.createNewFile(); - FileOutputStream mFileOutputStream = new FileOutputStream(file); + os = new FileOutputStream(file); MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.reset(); - DigestOutputStream mDigestOutputStream = new DigestOutputStream( - mFileOutputStream, digest); + DigestOutputStream mDigestOutputStream = new DigestOutputStream(os, digest); mDigestOutputStream.write(avatar.getImageAsBytes()); mDigestOutputStream.flush(); mDigestOutputStream.close(); @@ -349,6 +348,8 @@ public class FileBackend { return false; } catch (NoSuchAlgorithmException e) { return false; + } finally { + close(os); } } avatar.size = file.length(); @@ -356,8 +357,7 @@ public class FileBackend { } public String getAvatarPath(String avatar) { - return mXmppConnectionService.getFilesDir().getAbsolutePath() - + "/avatars/" + avatar; + return mXmppConnectionService.getFilesDir().getAbsolutePath()+ "/avatars/" + avatar; } public Uri getAvatarUri(String avatar) { @@ -368,10 +368,11 @@ public class FileBackend { if (image == null) { return null; } + InputStream is = null; try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = calcSampleSize(image, size); - InputStream is = mXmppConnectionService.getContentResolver().openInputStream(image); + is = mXmppConnectionService.getContentResolver().openInputStream(image); Bitmap input = BitmapFactory.decodeStream(is, null, options); if (input == null) { return null; @@ -384,6 +385,8 @@ public class FileBackend { } } catch (FileNotFoundException e) { return null; + } finally { + close(is); } } @@ -391,12 +394,15 @@ public class FileBackend { if (image == null) { return null; } + InputStream is = null; try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = calcSampleSize(image,Math.max(newHeight, newWidth)); - InputStream is = mXmppConnectionService.getContentResolver().openInputStream(image); + is = mXmppConnectionService.getContentResolver().openInputStream(image); Bitmap source = BitmapFactory.decodeStream(is, null, options); - + if (source == null) { + return null; + } int sourceWidth = source.getWidth(); int sourceHeight = source.getHeight(); float xScale = (float) newWidth / sourceWidth; @@ -408,14 +414,15 @@ public class FileBackend { float top = (newHeight - scaledHeight) / 2; RectF targetRect = new RectF(left, top, left + scaledWidth, top + scaledHeight); - Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, source.getConfig()); + Bitmap dest = Bitmap.createBitmap(newWidth, newHeight, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(dest); canvas.drawBitmap(source, null, targetRect, null); return dest; } catch (FileNotFoundException e) { return null; + } finally { + close(is); } - } public Bitmap cropCenterSquare(Bitmap input, int size) { @@ -430,7 +437,7 @@ public class FileBackend { float top = (size - outHeight) / 2; RectF target = new RectF(left, top, left + outWidth, top + outHeight); - Bitmap output = Bitmap.createBitmap(size, size, input.getConfig()); + Bitmap output = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888); Canvas canvas = new Canvas(output); canvas.drawBitmap(input, null, target, null); return output; @@ -522,4 +529,13 @@ public class FileBackend { public boolean isFileAvailable(Message message) { return getFile(message).exists(); } + + public static void close(Closeable stream) { + if (stream != null) { + try { + stream.close(); + } catch (IOException e) { + } + } + } } diff --git a/src/main/java/eu/siacs/conversations/services/NotificationService.java b/src/main/java/eu/siacs/conversations/services/NotificationService.java index 7269a559..fc40ce75 100644 --- a/src/main/java/eu/siacs/conversations/services/NotificationService.java +++ b/src/main/java/eu/siacs/conversations/services/NotificationService.java @@ -454,7 +454,7 @@ public class NotificationService { // nick (matched in case-insensitive manner), followed by optional // punctuation (for example "bob: i disagree" or "how are you alice?"), // followed by another word boundary. - return Pattern.compile("\\b" + nick + "\\p{Punct}?\\b", + return Pattern.compile("\\b" + Pattern.quote(nick) + "\\p{Punct}?\\b", Pattern.CASE_INSENSITIVE | Pattern.UNICODE_CASE); } @@ -493,7 +493,7 @@ public class NotificationService { final int cancelIcon; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { mBuilder.setCategory(Notification.CATEGORY_SERVICE); - mBuilder.setSmallIcon(R.drawable.ic_import_export_white_48dp); + mBuilder.setSmallIcon(R.drawable.ic_import_export_white_24dp); cancelIcon = R.drawable.ic_cancel_white_24dp; } else { mBuilder.setSmallIcon(R.drawable.ic_stat_communication_import_export); @@ -540,7 +540,7 @@ public class NotificationService { mBuilder.setOngoing(true); //mBuilder.setLights(0xffffffff, 2000, 4000); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - mBuilder.setSmallIcon(R.drawable.ic_warning_white_36dp); + mBuilder.setSmallIcon(R.drawable.ic_warning_white_24dp); } else { mBuilder.setSmallIcon(R.drawable.ic_stat_alert_warning); } diff --git a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java index ca182867..ec0b3f92 100644 --- a/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java +++ b/src/main/java/eu/siacs/conversations/services/XmppConnectionService.java @@ -36,6 +36,7 @@ import org.openintents.openpgp.util.OpenPgpServiceConnection; import java.math.BigInteger; import java.security.SecureRandom; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; @@ -174,13 +175,22 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa public void onContactStatusChanged(Contact contact, boolean online) { Conversation conversation = find(getConversations(), contact); if (conversation != null) { - if (online && contact.getPresences().size() > 1) { + if (online) { conversation.endOtrIfNeeded(); + if (contact.getPresences().size() == 1) { + sendUnsentMessages(conversation); + } } else { - conversation.resetOtrSession(); - } - if (online && (contact.getPresences().size() == 1)) { - sendUnsentMessages(conversation); + if (contact.getPresences().size() >= 1) { + if (conversation.hasValidOtrSession()) { + String otrResource = conversation.getOtrSession().getSessionID().getUserID(); + if (!(Arrays.asList(contact.getPresences().asStringArray()).contains(otrResource))) { + conversation.endOtrIfNeeded(); + } + } + } else { + conversation.endOtrIfNeeded(); + } } } } @@ -532,9 +542,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa ExceptionHelper.init(getApplicationContext()); PRNGFixes.apply(); this.mRandom = new SecureRandom(); - this.mMemorizingTrustManager = new MemorizingTrustManager( - getApplicationContext()); - + updateMemorizingTrustmanager(); final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; this.mBitmapCache = new LruCache<String, Bitmap>(cacheSize) { @@ -1129,6 +1137,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } public void archiveConversation(Conversation conversation) { + getNotificationService().clear(conversation); conversation.setStatus(Conversation.STATUS_ARCHIVED); conversation.setNextEncryption(-1); synchronized (this.conversations) { @@ -1538,6 +1547,9 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa for (Jid invite : jids) { invite(conversation, invite); } + if (account.countPresences() > 1) { + directInvite(conversation, account.getJid().toBareJid()); + } if (callback != null) { callback.success(conversation); } @@ -1700,6 +1712,7 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa } } } + sendOfflinePresence(account); } account.getXmppConnection().disconnect(force); } @@ -2022,6 +2035,11 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa sendMessagePacket(conversation.getAccount(), packet); } + public void directInvite(Conversation conversation, Jid jid) { + MessagePacket packet = mMessageGenerator.directInvite(conversation,jid); + sendMessagePacket(conversation.getAccount(),packet); + } + public void resetSendingToWaiting(Account account) { for (Conversation conversation : getConversations()) { if (conversation.getAccount() == account) { @@ -2185,6 +2203,21 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa return this.mMemorizingTrustManager; } + public void setMemorizingTrustManager(MemorizingTrustManager trustManager) { + this.mMemorizingTrustManager = trustManager; + } + + public void updateMemorizingTrustmanager() { + final MemorizingTrustManager tm; + final boolean dontTrustSystemCAs = getPreferences().getBoolean("dont_trust_system_cas", false); + if (dontTrustSystemCAs) { + tm = new MemorizingTrustManager(getApplicationContext(), null); + } else { + tm = new MemorizingTrustManager(getApplicationContext()); + } + setMemorizingTrustManager(tm); + } + public PowerManager getPowerManager() { return this.pm; } @@ -2260,6 +2293,10 @@ public class XmppConnectionService extends Service implements OnPhoneContactsLoa sendPresencePacket(account, mPresenceGenerator.sendPresence(account)); } + public void sendOfflinePresence(final Account account) { + sendPresencePacket(account, mPresenceGenerator.sendOfflinePresence(account)); + } + public MessageGenerator getMessageGenerator() { return this.mMessageGenerator; } diff --git a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java index e4bfd6ff..8c4f6eaf 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConferenceDetailsActivity.java @@ -237,6 +237,9 @@ public class ConferenceDetailsActivity extends XmppActivity implements OnConvers MenuItem menuItemDeleteBookmark = menu.findItem(R.id.action_delete_bookmark); MenuItem menuItemAdvancedMode = menu.findItem(R.id.action_advanced_mode); menuItemAdvancedMode.setChecked(mAdvancedMode); + if (mConversation == null) { + return true; + } Account account = mConversation.getAccount(); if (account.hasBookmarkFor(mConversation.getJid().toBareJid())) { menuItemSaveBookmark.setVisible(false); diff --git a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java index 40a4587c..f7156d7a 100644 --- a/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ContactDetailsActivity.java @@ -256,16 +256,19 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd MenuItem unblock = menu.findItem(R.id.action_unblock); MenuItem edit = menu.findItem(R.id.action_edit_contact); MenuItem delete = menu.findItem(R.id.action_delete_contact); + if (contact == null) { + return true; + } final XmppConnection connection = contact.getAccount().getXmppConnection(); if (connection != null && connection.getFeatures().blocking()) { if (this.contact.isBlocked()) { - menu.findItem(R.id.action_block).setVisible(false); + block.setVisible(false); } else { - menu.findItem(R.id.action_unblock).setVisible(false); + unblock.setVisible(false); } } else { - menu.findItem(R.id.action_unblock).setVisible(false); - menu.findItem(R.id.action_block).setVisible(false); + unblock.setVisible(false); + block.setVisible(false); } if (!contact.showInRoster()) { edit.setVisible(false); @@ -275,6 +278,7 @@ public class ContactDetailsActivity extends XmppActivity implements OnAccountUpd } private void populateView() { + invalidateOptionsMenu(); setTitle(contact.getDisplayName()); if (contact.showInRoster()) { send.setVisibility(View.VISIBLE); diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java index 82afda07..aec755fc 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationActivity.java @@ -5,6 +5,7 @@ import android.app.ActionBar; import android.app.AlertDialog; import android.app.FragmentTransaction; import android.app.PendingIntent; +import android.content.ClipData; import android.content.DialogInterface; import android.content.DialogInterface.OnClickListener; import android.content.Intent; @@ -22,14 +23,15 @@ import android.widget.AdapterView; import android.widget.AdapterView.OnItemClickListener; import android.widget.ArrayAdapter; import android.widget.CheckBox; -import android.widget.ListView; import android.widget.PopupMenu; import android.widget.PopupMenu.OnMenuItemClickListener; import android.widget.Toast; import net.java.otr4j.session.SessionStatus; +import de.timroes.android.listview.EnhancedListView; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import eu.siacs.conversations.R; @@ -69,15 +71,16 @@ public class ConversationActivity extends XmppActivity private String mOpenConverstaion = null; private boolean mPanelOpen = true; - private Uri mPendingImageUri = null; - private Uri mPendingFileUri = null; + final private List<Uri> mPendingImageUris = new ArrayList<>(); + final private List<Uri> mPendingFileUris = new ArrayList<>(); private Uri mPendingGeoUri = null; private View mContentView; private List<Conversation> conversationList = new ArrayList<>(); + private Conversation swipedConversation = null; private Conversation mSelectedConversation = null; - private ListView listView; + private EnhancedListView listView; private ConversationFragment mConversationFragment; private ArrayAdapter<Conversation> listAdapter; @@ -140,13 +143,14 @@ public class ConversationActivity extends XmppActivity @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); - if (savedInstanceState != null) {mOpenConverstaion = savedInstanceState.getString( - STATE_OPEN_CONVERSATION, null); - mPanelOpen = savedInstanceState.getBoolean(STATE_PANEL_OPEN, true); - String pending = savedInstanceState.getString(STATE_PENDING_URI, null); - if (pending != null) { - mPendingImageUri = Uri.parse(pending); - } + if (savedInstanceState != null) { + mOpenConverstaion = savedInstanceState.getString(STATE_OPEN_CONVERSATION, null); + mPanelOpen = savedInstanceState.getBoolean(STATE_PANEL_OPEN, true); + String pending = savedInstanceState.getString(STATE_PENDING_URI, null); + if (pending != null) { + mPendingImageUris.clear(); + mPendingImageUris.add(Uri.parse(pending)); + } } setContentView(R.layout.fragment_conversations_overview); @@ -156,7 +160,7 @@ public class ConversationActivity extends XmppActivity transaction.replace(R.id.selected_conversation, this.mConversationFragment, "conversation"); transaction.commit(); - listView = (ListView) findViewById(R.id.list); + listView = (EnhancedListView) findViewById(R.id.list); this.listAdapter = new ConversationAdapter(this, conversationList); listView.setAdapter(this.listAdapter); @@ -178,6 +182,73 @@ public class ConversationActivity extends XmppActivity openConversation(); } }); + + listView.setDismissCallback(new EnhancedListView.OnDismissCallback() { + + @Override + public EnhancedListView.Undoable onDismiss(final EnhancedListView enhancedListView, final int position) { + + final int index = listView.getFirstVisiblePosition(); + View v = listView.getChildAt(0); + final int top = (v == null) ? 0 : (v.getTop() - listView.getPaddingTop()); + + swipedConversation = listAdapter.getItem(position); + listAdapter.remove(swipedConversation); + swipedConversation.markRead(); + xmppConnectionService.getNotificationService().clear(swipedConversation); + + final boolean formerlySelected = (getSelectedConversation() == swipedConversation); + if (position == 0 && listAdapter.getCount() == 0) { + endConversation(swipedConversation, false, true); + return null; + } else if (formerlySelected) { + setSelectedConversation(listAdapter.getItem(0)); + ConversationActivity.this.mConversationFragment + .reInit(getSelectedConversation()); + } + + return new EnhancedListView.Undoable() { + + @Override + public void undo() { + listAdapter.insert(swipedConversation, position); + if (formerlySelected) { + setSelectedConversation(swipedConversation); + ConversationActivity.this.mConversationFragment + .reInit(getSelectedConversation()); + } + swipedConversation = null; + listView.setSelectionFromTop(index + (listView.getChildCount() < position ? 1 : 0), top); + } + + @Override + public void discard() { + if (!swipedConversation.isRead() + && swipedConversation.getMode() == Conversation.MODE_SINGLE) { + swipedConversation = null; + return; + } + endConversation(swipedConversation, false, false); + swipedConversation = null; + } + + @Override + public String getTitle() { + if (swipedConversation.getMode() == Conversation.MODE_MULTI) { + return getResources().getString(R.string.title_undo_swipe_out_muc); + } else { + return getResources().getString(R.string.title_undo_swipe_out_conversation); + } + } + }; + } + }); + listView.enableSwipeToDismiss(); + listView.setSwipingLayout(R.id.swipeable_item); + listView.setUndoStyle(EnhancedListView.UndoStyle.SINGLE_POPUP); + listView.setUndoHideDelay(5000); + listView.setRequireTouchBeforeDismiss(false); + mContentView = findViewById(R.id.content_view_spl); if (mContentView == null) { mContentView = findViewById(R.id.content_view_ll); @@ -204,6 +275,7 @@ public class ConversationActivity extends XmppActivity @Override public void onPanelClosed(View arg0) { + listView.discardUndo(); openConversation(); } @@ -303,7 +375,7 @@ public class ConversationActivity extends XmppActivity if (this.getSelectedConversation().getLatestMessage() .getEncryption() != Message.ENCRYPTION_NONE) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { - menuSecure.setIcon(R.drawable.ic_lock_outline_white_48dp); + menuSecure.setIcon(R.drawable.ic_lock_white_24dp); } else { menuSecure.setIcon(R.drawable.ic_action_secure); } @@ -340,13 +412,18 @@ public class ConversationActivity extends XmppActivity switch (attachmentChoice) { case ATTACHMENT_CHOICE_CHOOSE_IMAGE: intent.setAction(Intent.ACTION_GET_CONTENT); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + intent.putExtra(Intent.EXTRA_ALLOW_MULTIPLE,true); + } intent.setType("image/*"); chooser = true; break; case ATTACHMENT_CHOICE_TAKE_PHOTO: - mPendingImageUri = xmppConnectionService.getFileBackend().getTakePhotoUri(); + Uri uri = xmppConnectionService.getFileBackend().getTakePhotoUri(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); - intent.putExtra(MediaStore.EXTRA_OUTPUT, mPendingImageUri); + intent.putExtra(MediaStore.EXTRA_OUTPUT, uri); + mPendingImageUris.clear(); + mPendingImageUris.add(uri); break; case ATTACHMENT_CHOICE_CHOOSE_FILE: chooser = true; @@ -485,13 +562,21 @@ public class ConversationActivity extends XmppActivity } public void endConversation(Conversation conversation) { - showConversationsOverview(); + endConversation(conversation, true, true); + } + + public void endConversation(Conversation conversation, boolean showOverview, boolean reinit) { + if (showOverview) { + showConversationsOverview(); + } xmppConnectionService.archiveConversation(conversation); - if (conversationList.size() > 0) { - setSelectedConversation(conversationList.get(0)); - this.mConversationFragment.reInit(getSelectedConversation()); - } else { - setSelectedConversation(null); + if (reinit) { + if (conversationList.size() > 0) { + setSelectedConversation(conversationList.get(0)); + this.mConversationFragment.reInit(getSelectedConversation()); + } else { + setSelectedConversation(null); + } } } @@ -744,6 +829,7 @@ public class ConversationActivity extends XmppActivity @Override public void onPause() { + listView.discardUndo(); super.onPause(); this.mActivityPaused = true; if (this.xmppConnectionServiceBound) { @@ -779,8 +865,8 @@ public class ConversationActivity extends XmppActivity } savedInstanceState.putBoolean(STATE_PANEL_OPEN, isConversationsOverviewVisable()); - if (this.mPendingImageUri != null) { - savedInstanceState.putString(STATE_PENDING_URI, this.mPendingImageUri.toString()); + if (this.mPendingImageUris.size() >= 1) { + savedInstanceState.putString(STATE_PENDING_URI, this.mPendingImageUris.get(0).toString()); } super.onSaveInstanceState(savedInstanceState); } @@ -819,21 +905,23 @@ public class ConversationActivity extends XmppActivity this.mConversationFragment.reInit(getSelectedConversation()); } else { showConversationsOverview(); - mPendingImageUri = null; - mPendingFileUri = null; + mPendingImageUris.clear(); + mPendingFileUris.clear(); mPendingGeoUri = null; setSelectedConversation(conversationList.get(0)); this.mConversationFragment.reInit(getSelectedConversation()); } - if (mPendingImageUri != null) { - attachImageToConversation(getSelectedConversation(),mPendingImageUri); - mPendingImageUri = null; - } else if (mPendingFileUri != null) { - attachFileToConversation(getSelectedConversation(),mPendingFileUri); - mPendingFileUri = null; - } else if (mPendingGeoUri != null) { - attachLocationToConversation(getSelectedConversation(),mPendingGeoUri); + for(Iterator<Uri> i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) { + attachImageToConversation(getSelectedConversation(),i.next()); + } + + for(Iterator<Uri> i = mPendingFileUris.iterator(); i.hasNext(); i.remove()) { + attachFileToConversation(getSelectedConversation(),i.next()); + } + + if (mPendingGeoUri != null) { + attachLocationToConversation(getSelectedConversation(), mPendingGeoUri); mPendingGeoUri = null; } ExceptionHelper.checkForCrash(this, this.xmppConnectionService); @@ -841,10 +929,10 @@ public class ConversationActivity extends XmppActivity } private void handleViewConversationIntent(final Intent intent) { - final String uuid = (String) intent.getExtras().get(CONVERSATION); - final String downloadUuid = (String) intent.getExtras().get(MESSAGE); - final String text = intent.getExtras().getString(TEXT, ""); - final String nick = intent.getExtras().getString(NICK, null); + final String uuid = intent.getStringExtra(CONVERSATION); + final String downloadUuid = intent.getStringExtra(MESSAGE); + final String text = intent.getStringExtra(TEXT); + final String nick = intent.getStringExtra(NICK); if (selectConversationByUuid(uuid)) { this.mConversationFragment.reInit(getSelectedConversation()); if (nick != null) { @@ -885,6 +973,21 @@ public class ConversationActivity extends XmppActivity xmppConnectionService.getNotificationService().setOpenConversation(null); } + @SuppressLint("NewApi") + private static List<Uri> extractUriFromIntent(final Intent intent) { + List<Uri> uris = new ArrayList<>(); + Uri uri = intent.getData(); + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2 && uri == null) { + ClipData clipData = intent.getClipData(); + for(int i = 0; i < clipData.getItemCount(); ++i) { + uris.add(clipData.getItemAt(i).getUri()); + } + } else { + uris.add(uri); + } + return uris; + } + @Override protected void onActivityResult(int requestCode, int resultCode, final Intent data) { @@ -894,25 +997,34 @@ public class ConversationActivity extends XmppActivity mConversationFragment.hideSnackbar(); mConversationFragment.updateMessages(); } else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_IMAGE) { - mPendingImageUri = data.getData(); + mPendingImageUris.clear(); + mPendingImageUris.addAll(extractUriFromIntent(data)); if (xmppConnectionServiceBound) { - attachImageToConversation(getSelectedConversation(),mPendingImageUri); - mPendingImageUri = null; + for(Iterator<Uri> i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) { + attachImageToConversation(getSelectedConversation(),i.next()); + } } } else if (requestCode == ATTACHMENT_CHOICE_CHOOSE_FILE || requestCode == ATTACHMENT_CHOICE_RECORD_VOICE) { - mPendingFileUri = data.getData(); + mPendingFileUris.clear(); + mPendingFileUris.addAll(extractUriFromIntent(data)); if (xmppConnectionServiceBound) { - attachFileToConversation(getSelectedConversation(),mPendingFileUri); - mPendingFileUri = null; + for(Iterator<Uri> i = mPendingImageUris.iterator(); i.hasNext(); i.remove()) { + attachFileToConversation(getSelectedConversation(), i.next()); + } } - } else if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO && mPendingImageUri != null) { - if (xmppConnectionServiceBound) { - attachImageToConversation(getSelectedConversation(),mPendingImageUri); - mPendingImageUri = null; + } else if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO) { + if (mPendingImageUris.size() == 1) { + Uri uri = mPendingImageUris.get(0); + if (xmppConnectionServiceBound) { + attachImageToConversation(getSelectedConversation(), uri); + mPendingImageUris.clear(); + } + Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); + intent.setData(uri); + sendBroadcast(intent); + } else { + mPendingImageUris.clear(); } - Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); - intent.setData(mPendingImageUri); - sendBroadcast(intent); } else if (requestCode == ATTACHMENT_CHOICE_LOCATION) { double latitude = data.getDoubleExtra("latitude",0); double longitude = data.getDoubleExtra("longitude",0); @@ -923,9 +1035,8 @@ public class ConversationActivity extends XmppActivity } } } else { - if (requestCode == ATTACHMENT_CHOICE_TAKE_PHOTO) { - mPendingImageUri = null; - } + mPendingImageUris.clear(); + mPendingFileUris.clear(); } } @@ -1013,6 +1124,13 @@ public class ConversationActivity extends XmppActivity public void updateConversationList() { xmppConnectionService .populateWithOrderedConversations(conversationList); + if (swipedConversation != null) { + if (swipedConversation.isRead()) { + conversationList.remove(swipedConversation); + } else { + listView.discardUndo(); + } + } listAdapter.notifyDataSetChanged(); } diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index d5f20e41..5b1e9b4d 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -8,7 +8,6 @@ import android.content.DialogInterface; import android.content.Intent; import android.content.IntentSender; import android.content.IntentSender.SendIntentException; -import android.net.Uri; import android.os.Bundle; import android.text.InputType; import android.view.ContextMenu; @@ -268,7 +267,6 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa if (conversation.getNextCounterpart() != null) { message.setCounterpart(conversation.getNextCounterpart()); message.setType(Message.TYPE_PRIVATE); - conversation.setNextCounterpart(null); } } if (conversation.getNextEncryption(activity.forceEncryption()) == Message.ENCRYPTION_OTR) { @@ -316,8 +314,8 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa @Override public View onCreateView(final LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { - final View view = inflater.inflate(R.layout.fragment_conversation, - container, false); + final View view = inflater.inflate(R.layout.fragment_conversation,container, false); + view.setOnClickListener(null); mEditMessage = (EditMessage) view.findViewById(R.id.textinput); setupIme(); mEditMessage.setOnClickListener(new OnClickListener() { @@ -720,21 +718,6 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa final ConversationActivity activity = (ConversationActivity) getActivity(); if (this.conversation != null) { updateSnackBar(this.conversation); - final Contact contact = this.conversation.getContact(); - if (this.conversation.isBlocked()) { - - } else if (!contact.showInRoster() - && contact - .getOption(Contact.Options.PENDING_SUBSCRIPTION_REQUEST)) { - - } else if (conversation.getMode() == Conversation.MODE_SINGLE) { - makeFingerprintWarning(); - } else if (!conversation.getMucOptions().online() - && conversation.getAccount().getStatus() == Account.State.ONLINE) { - - } else if (this.conversation.isMuted()) { - - } conversation.populateWithMessages(ConversationFragment.this.messageList); for (final Message message : this.messageList) { if (message.getEncryption() == Message.ENCRYPTION_PGP @@ -781,6 +764,7 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa } catch (final NoSuchElementException ignored) { } + askForPassphraseIntent = null; activity.xmppConnectionService.updateMessage(message); } @@ -880,10 +864,6 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa } } - protected void makeFingerprintWarning() { - - } - protected void showSnackbar(final int message, final int action, final OnClickListener clickListener) { snackbar.setVisibility(View.VISIBLE); @@ -1020,6 +1000,9 @@ public class ConversationFragment extends Fragment implements EditMessage.Keyboa } public void appendText(String text) { + if (text == null) { + return; + } String previous = this.mEditMessage.getText().toString(); if (previous.length() != 0 && !previous.endsWith(" ")) { text = " " + text; diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java index 27dfc492..7aa7b1c2 100644 --- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java @@ -67,7 +67,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate @Override public void onClick(final View v) { - if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED) { + if (mAccount != null && mAccount.getStatus() == Account.State.DISABLED && !accountInfoEdited()) { mAccount.setOption(Account.OPTION_DISABLED, false); xmppConnectionService.updateAccount(mAccount); return; @@ -237,7 +237,11 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate } protected void updateSaveButton() { - if (mAccount != null && (mAccount.getStatus() == Account.State.CONNECTING || mFetchingAvatar)) { + if (accountInfoEdited() && jidToEdit != null) { + this.mSaveButton.setText(R.string.save); + this.mSaveButton.setEnabled(true); + this.mSaveButton.setTextColor(getPrimaryTextColor()); + } else if (mAccount != null && (mAccount.getStatus() == Account.State.CONNECTING || mFetchingAvatar)) { this.mSaveButton.setEnabled(false); this.mSaveButton.setTextColor(getSecondaryTextColor()); this.mSaveButton.setText(R.string.account_status_connecting); @@ -265,9 +269,9 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate } protected boolean accountInfoEdited() { - return (!this.mAccount.getJid().toBareJid().toString().equals( - this.mAccountJid.getText().toString())) - || (!this.mAccount.getPassword().equals( + return this.mAccount != null && (!this.mAccount.getJid().toBareJid().toString().equals( + this.mAccountJid.getText().toString()) + || !this.mAccount.getPassword().equals( this.mPassword.getText().toString())); } @@ -464,7 +468,7 @@ public class EditAccountActivity extends XmppActivity implements OnAccountUpdate } else { this.mServerInfoSm.setText(R.string.server_info_unavailable); } - if (features.pubsub()) { + if (features.pep()) { this.mServerInfoPep.setText(R.string.server_info_available); } else { this.mServerInfoPep.setText(R.string.server_info_unavailable); diff --git a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java index b2d5ddfd..56dbc55e 100644 --- a/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ManageAccountActivity.java @@ -168,6 +168,14 @@ public class ManageAccountActivity extends XmppActivity implements OnAccountUpda } } + public void onClickTglAccountState(Account account, boolean enable) { + if (enable) { + enableAccount(account); + } else { + disableAccount(account); + } + } + private void publishAvatar(Account account) { Intent intent = new Intent(getApplicationContext(), PublishProfilePictureActivity.class); diff --git a/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java b/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java index 3f72b723..e8ab8dae 100644 --- a/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/PublishProfilePictureActivity.java @@ -163,8 +163,7 @@ public class PublishProfilePictureActivity extends XmppActivity { if (jid != null) { this.account = xmppConnectionService.findAccountByJid(jid); if (this.account.getXmppConnection() != null) { - this.support = this.account.getXmppConnection() - .getFeatures().pubsub(); + this.support = this.account.getXmppConnection().getFeatures().pep(); } if (this.avatarUri == null) { if (this.account.getAvatar() != null diff --git a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java index 39e215f2..eb5d9b2e 100644 --- a/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/SettingsActivity.java @@ -1,17 +1,29 @@ package eu.siacs.conversations.ui; +import java.security.KeyStoreException; import java.util.ArrayList; import java.util.Arrays; +import java.util.Collections; import java.util.Locale; +import de.duenndns.ssl.MemorizingTrustManager; + +import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; +import eu.siacs.conversations.xmpp.XmppConnection; +import android.app.AlertDialog; +import android.app.Fragment; +import android.app.FragmentManager; +import android.content.DialogInterface; import android.content.SharedPreferences; import android.content.SharedPreferences.OnSharedPreferenceChangeListener; import android.os.Build; import android.os.Bundle; import android.preference.ListPreference; +import android.preference.Preference; import android.preference.PreferenceManager; +import android.widget.Toast; public class SettingsActivity extends XmppActivity implements OnSharedPreferenceChangeListener { @@ -20,9 +32,12 @@ public class SettingsActivity extends XmppActivity implements @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - mSettingsFragment = new SettingsFragment(); - getFragmentManager().beginTransaction() - .replace(android.R.id.content, mSettingsFragment).commit(); + FragmentManager fm = getFragmentManager(); + mSettingsFragment = (SettingsFragment) fm.findFragmentById(android.R.id.content); + if (mSettingsFragment == null || !mSettingsFragment.getClass().equals(SettingsFragment.class)) { + mSettingsFragment = new SettingsFragment(); + fm.beginTransaction().replace(android.R.id.content, mSettingsFragment).commit(); + } } @Override @@ -33,19 +48,78 @@ public class SettingsActivity extends XmppActivity implements @Override public void onStart() { super.onStart(); - PreferenceManager.getDefaultSharedPreferences(this) - .registerOnSharedPreferenceChangeListener(this); - ListPreference resources = (ListPreference) mSettingsFragment - .findPreference("resource"); + PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this); + ListPreference resources = (ListPreference) mSettingsFragment.findPreference("resource"); if (resources != null) { - ArrayList<CharSequence> entries = new ArrayList<CharSequence>( - Arrays.asList(resources.getEntries())); - entries.add(0, Build.MODEL); - resources.setEntries(entries.toArray(new CharSequence[entries - .size()])); - resources.setEntryValues(entries.toArray(new CharSequence[entries - .size()])); + ArrayList<CharSequence> entries = new ArrayList<>(Arrays.asList(resources.getEntries())); + if (!entries.contains(Build.MODEL)) { + entries.add(0, Build.MODEL); + resources.setEntries(entries.toArray(new CharSequence[entries.size()])); + resources.setEntryValues(entries.toArray(new CharSequence[entries.size()])); + } } + + final Preference removeCertsPreference = mSettingsFragment.findPreference("remove_trusted_certificates"); + removeCertsPreference.setOnPreferenceClickListener(new Preference.OnPreferenceClickListener() { + @Override + public boolean onPreferenceClick(Preference preference) { + final MemorizingTrustManager mtm = xmppConnectionService.getMemorizingTrustManager(); + final ArrayList<String> aliases = Collections.list(mtm.getCertificates()); + if (aliases.size() == 0) { + displayToast(getString(R.string.toast_no_trusted_certs)); + return true; + } + final ArrayList selectedItems = new ArrayList<Integer>(); + final AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(SettingsActivity.this); + dialogBuilder.setTitle(getResources().getString(R.string.dialog_manage_certs_title)); + dialogBuilder.setMultiChoiceItems(aliases.toArray(new CharSequence[aliases.size()]), null, + new DialogInterface.OnMultiChoiceClickListener() { + @Override + public void onClick(DialogInterface dialog, int indexSelected, + boolean isChecked) { + if (isChecked) { + selectedItems.add(indexSelected); + } else if (selectedItems.contains(indexSelected)) { + selectedItems.remove(Integer.valueOf(indexSelected)); + } + if (selectedItems.size() > 0) + ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(true); + else { + ((AlertDialog) dialog).getButton(DialogInterface.BUTTON_POSITIVE).setEnabled(false); + } + } + }); + + dialogBuilder.setPositiveButton( + getResources().getString(R.string.dialog_manage_certs_positivebutton), new DialogInterface.OnClickListener() { + @Override + public void onClick(DialogInterface dialog, int which) { + int count = selectedItems.size(); + if (count > 0) { + for (int i = 0; i < count; i++) { + try { + Integer item = Integer.valueOf(selectedItems.get(i).toString()); + String alias = aliases.get(item); + mtm.deleteCertificate(alias); + } catch (KeyStoreException e) { + e.printStackTrace(); + displayToast("Error: " + e.getLocalizedMessage()); + } + } + if (xmppConnectionServiceBound) { + reconnectAccounts(); + } + displayToast(getResources().getQuantityString(R.plurals.toast_delete_certificates, count, count)); + } + } + }); + dialogBuilder.setNegativeButton(getResources().getString(R.string.dialog_manage_certs_negativebutton), null); + AlertDialog removeCertsDialog = dialogBuilder.create(); + removeCertsDialog.show(); + removeCertsDialog.getButton(AlertDialog.BUTTON_POSITIVE).setEnabled(false); + return true; + } + }); } @Override @@ -63,9 +137,14 @@ public class SettingsActivity extends XmppActivity implements .toLowerCase(Locale.US); if (xmppConnectionServiceBound) { for (Account account : xmppConnectionService.getAccounts()) { - account.setResource(resource); - if (!account.isOptionSet(Account.OPTION_DISABLED)) { - xmppConnectionService.reconnectAccountInBackground(account); + if (account.setResource(resource)) { + if (!account.isOptionSet(Account.OPTION_DISABLED)) { + XmppConnection connection = account.getXmppConnection(); + if (connection != null) { + connection.resetStreamId(); + } + xmppConnectionService.reconnectAccountInBackground(account); + } } } } @@ -79,6 +158,27 @@ public class SettingsActivity extends XmppActivity implements } } } + } else if (name.equals("dont_trust_system_cas")) { + xmppConnectionService.updateMemorizingTrustmanager(); + reconnectAccounts(); + } + + } + + private void displayToast(final String msg) { + runOnUiThread(new Runnable() { + @Override + public void run() { + Toast.makeText(SettingsActivity.this, msg, Toast.LENGTH_LONG).show(); + } + }); + } + + private void reconnectAccounts() { + for (Account account : xmppConnectionService.getAccounts()) { + if (!account.isOptionSet(Account.OPTION_DISABLED)) { + xmppConnectionService.reconnectAccountInBackground(account); + } } } diff --git a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java index 6be238dc..200a577e 100644 --- a/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/ShareWithActivity.java @@ -18,6 +18,7 @@ import java.net.URLConnection; import java.net.URLDecoder; import java.nio.charset.UnsupportedCharsetException; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import eu.siacs.conversations.Config; @@ -32,7 +33,7 @@ import eu.siacs.conversations.xmpp.jid.Jid; public class ShareWithActivity extends XmppActivity { private class Share { - public Uri uri; + public List<Uri> uris = new ArrayList<>(); public boolean image; public String account; public String contact; @@ -104,7 +105,7 @@ public class ShareWithActivity extends XmppActivity { int position, long arg3) { Conversation conversation = mConversations.get(position); if (conversation.getMode() == Conversation.MODE_SINGLE - || share.uri == null) { + || share.uris.size() == 0) { share(mConversations.get(position)); } } @@ -133,18 +134,32 @@ public class ShareWithActivity extends XmppActivity { @Override public void onStart() { - final String type = getIntent().getType(); - final Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM); - if (type != null && uri != null && !type.equalsIgnoreCase("text/plain")) { - this.share.uri = uri; - this.share.image = type.startsWith("image/") || isImage(uri); - } else { - this.share.text = getIntent().getStringExtra(Intent.EXTRA_TEXT); + super.onStart(); + Intent intent = getIntent(); + if (intent == null) { + return; + } + final String type = intent.getType(); + if (Intent.ACTION_SEND.equals(intent.getAction())) { + final Uri uri = getIntent().getParcelableExtra(Intent.EXTRA_STREAM); + if (type != null && uri != null && !type.equalsIgnoreCase("text/plain")) { + this.share.uris.add(uri); + this.share.image = type.startsWith("image/") || isImage(uri); + } else { + this.share.text = getIntent().getStringExtra(Intent.EXTRA_TEXT); + } + } else if (Intent.ACTION_SEND_MULTIPLE.equals(intent.getAction())) { + this.share.image = type != null && type.startsWith("image/"); + if (!this.share.image) { + return; + } + + this.share.uris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM); } if (xmppConnectionServiceBound) { - xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.uri == null); + xmppConnectionService.populateWithOrderedConversations(mConversations, this.share.image); } - super.onStart(); + } protected boolean isImage(Uri uri) { @@ -164,7 +179,7 @@ public class ShareWithActivity extends XmppActivity { return; } xmppConnectionService.populateWithOrderedConversations(mConversations, - this.share != null && this.share.uri == null); + this.share != null && this.share.uris.size() == 0); } private void share() { @@ -188,7 +203,7 @@ public class ShareWithActivity extends XmppActivity { } private void share(final Conversation conversation) { - if (share.uri != null) { + if (share.uris.size() != 0) { selectPresence(conversation, new OnPresenceSelected() { @Override public void onPresenceSelected() { @@ -196,22 +211,23 @@ public class ShareWithActivity extends XmppActivity { Toast.makeText(getApplicationContext(), getText(R.string.preparing_image), Toast.LENGTH_LONG).show(); - ShareWithActivity.this.xmppConnectionService - .attachImageToConversation(conversation, share.uri, - attachFileCallback); + for (Iterator<Uri> i = share.uris.iterator(); i.hasNext(); i.remove()) { + ShareWithActivity.this.xmppConnectionService + .attachImageToConversation(conversation, i.next(), + attachFileCallback); + } } else { Toast.makeText(getApplicationContext(), getText(R.string.preparing_file), Toast.LENGTH_LONG).show(); ShareWithActivity.this.xmppConnectionService - .attachFileToConversation(conversation, share.uri, - attachFileCallback); + .attachFileToConversation(conversation, share.uris.get(0), + attachFileCallback); } switchToConversation(conversation, null, true); finish(); } }); - } else { switchToConversation(conversation, this.share.text, true); finish(); diff --git a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java index 7eaec10c..392e57a7 100644 --- a/src/main/java/eu/siacs/conversations/ui/XmppActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/XmppActivity.java @@ -90,6 +90,7 @@ public abstract class XmppActivity extends Activity { protected int mPrimaryTextColor; protected int mSecondaryTextColor; + protected int mPrimaryBackgroundColor; protected int mSecondaryBackgroundColor; protected int mColorRed; protected int mColorOrange; @@ -331,6 +332,7 @@ public abstract class XmppActivity extends Activity { mColorOrange = getResources().getColor(R.color.orange); mColorGreen = getResources().getColor(R.color.green); mPrimaryColor = getResources().getColor(R.color.primary); + mPrimaryBackgroundColor = getResources().getColor(R.color.primarybackground); mSecondaryBackgroundColor = getResources().getColor(R.color.secondarybackground); this.mTheme = findTheme(); setTheme(this.mTheme); @@ -740,7 +742,11 @@ public abstract class XmppActivity extends Activity { public int getOnlineColor() { return this.mColorGreen; } - + + public int getPrimaryBackgroundColor() { + return this.mPrimaryBackgroundColor; + } + public int getSecondaryBackgroundColor() { return this.mSecondaryBackgroundColor; } diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java index 29730914..95c0524d 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/AccountAdapter.java @@ -5,13 +5,16 @@ import java.util.List; import eu.siacs.conversations.R; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.ui.XmppActivity; +import eu.siacs.conversations.ui.ManageAccountActivity; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.ArrayAdapter; +import android.widget.CompoundButton; import android.widget.ImageView; import android.widget.TextView; +import android.widget.Switch; public class AccountAdapter extends ArrayAdapter<Account> { @@ -24,7 +27,7 @@ public class AccountAdapter extends ArrayAdapter<Account> { @Override public View getView(int position, View view, ViewGroup parent) { - Account account = getItem(position); + final Account account = getItem(position); if (view == null) { LayoutInflater inflater = (LayoutInflater) getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); @@ -34,21 +37,32 @@ public class AccountAdapter extends ArrayAdapter<Account> { jid.setText(account.getJid().toBareJid().toString()); TextView statusView = (TextView) view.findViewById(R.id.account_status); ImageView imageView = (ImageView) view.findViewById(R.id.account_image); - imageView.setImageBitmap(activity.avatarService().get(account, - activity.getPixel(48))); - statusView.setText(getContext().getString(account.getStatus().getReadableId())); - switch (account.getStatus()) { - case ONLINE: - statusView.setTextColor(activity.getOnlineColor()); - break; - case DISABLED: - case CONNECTING: - statusView.setTextColor(activity.getSecondaryTextColor()); - break; - default: - statusView.setTextColor(activity.getWarningTextColor()); - break; - } + imageView.setImageBitmap(activity.avatarService().get(account, activity.getPixel(48))); + statusView.setText(getContext().getString(account.getStatus().getReadableId())); + switch (account.getStatus()) { + case ONLINE: + statusView.setTextColor(activity.getOnlineColor()); + break; + case DISABLED: + case CONNECTING: + statusView.setTextColor(activity.getSecondaryTextColor()); + break; + default: + statusView.setTextColor(activity.getWarningTextColor()); + break; + } + final Switch tglAccountState = (Switch) view.findViewById(R.id.tgl_account_status); + final boolean isDisabled = (account.getStatus() == Account.State.DISABLED) ? true : false; + tglAccountState.setOnCheckedChangeListener(null); + tglAccountState.setChecked(!isDisabled); + tglAccountState.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton compoundButton, boolean b) { + if (b == isDisabled && activity instanceof ManageAccountActivity) { + ((ManageAccountActivity) activity).onClickTglAccountState(account,b); + } + } + }); return view; } } diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java index a48f6ae4..d5b7e4c0 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/ConversationAdapter.java @@ -46,17 +46,10 @@ public class ConversationAdapter extends ArrayAdapter<Conversation> { } Conversation conversation = getItem(position); if (this.activity instanceof ConversationActivity) { - ConversationActivity activity = (ConversationActivity) this.activity; - if (!activity.isConversationsOverviewHideable()) { - if (conversation == activity.getSelectedConversation()) { - view.setBackgroundColor(activity - .getSecondaryBackgroundColor()); - } else { - view.setBackgroundColor(Color.TRANSPARENT); - } - } else { - view.setBackgroundColor(Color.TRANSPARENT); - } + View swipeableItem = view.findViewById(R.id.swipeable_item); + ConversationActivity a = (ConversationActivity) this.activity; + int c = !a.isConversationsOverviewHideable() && conversation == a.getSelectedConversation() ? a.getSecondaryBackgroundColor() : a.getPrimaryBackgroundColor(); + swipeableItem.setBackgroundColor(c); } TextView convName = (TextView) view.findViewById(R.id.conversation_name); if (conversation.getMode() == Conversation.MODE_SINGLE || activity.useSubjectToIdentifyConference()) { diff --git a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java index eb7e2c3c..466bc409 100644 --- a/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/CryptoHelper.java @@ -91,6 +91,9 @@ public final class CryptoHelper { } public static String prettifyFingerprint(String fingerprint) { + if (fingerprint.length() < 40) { + return fingerprint; + } StringBuilder builder = new StringBuilder(fingerprint); builder.insert(8, " "); builder.insert(17, " "); diff --git a/src/main/java/eu/siacs/conversations/utils/GeoHelper.java b/src/main/java/eu/siacs/conversations/utils/GeoHelper.java index f7dda936..b31b9018 100644 --- a/src/main/java/eu/siacs/conversations/utils/GeoHelper.java +++ b/src/main/java/eu/siacs/conversations/utils/GeoHelper.java @@ -20,7 +20,7 @@ public class GeoHelper { } public static ArrayList<Intent> createGeoIntentsFromMessage(Message message) { - final ArrayList<Intent> intents = new ArrayList(); + final ArrayList<Intent> intents = new ArrayList<>(); Matcher matcher = GEO_URI.matcher(message.getBody()); if (!matcher.matches()) { return intents; diff --git a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java index b8e25d4b..0b6bb15b 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/XmppConnection.java @@ -90,7 +90,7 @@ public class XmppConnection implements Runnable { private boolean shouldBind = true; private boolean shouldAuthenticate = true; private Element streamFeatures; - private final HashMap<String, List<String>> disco = new HashMap<>(); + private final HashMap<Jid, Info> disco = new HashMap<>(); private String streamId = null; private int smVersion = 3; @@ -334,16 +334,23 @@ public class XmppConnection implements Runnable { } catch (final NumberFormatException ignored) { } sendServiceDiscoveryInfo(account.getServer()); + sendServiceDiscoveryInfo(account.getJid().toBareJid()); sendServiceDiscoveryItems(account.getServer()); sendInitialPing(); } else if (nextTag.isStart("r")) { tagReader.readElement(nextTag); + if (Config.EXTENDED_SM_LOGGING) { + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": acknowledging stanza #" + this.stanzasReceived); + } final AckPacket ack = new AckPacket(this.stanzasReceived, smVersion); tagWriter.writeStanzaAsync(ack); } else if (nextTag.isStart("a")) { final Element ack = tagReader.readElement(nextTag); lastPacketReceived = SystemClock.elapsedRealtime(); final int serverSequence = Integer.parseInt(ack.getAttribute("h")); + if (Config.EXTENDED_SM_LOGGING) { + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": server acknowledged stanza #" + serverSequence); + } final String msgId = this.messageReceipts.get(serverSequence); if (msgId != null) { if (this.acknowledgedListener != null) { @@ -597,8 +604,10 @@ public class XmppConnection implements Runnable { } else if (this.streamFeatures.hasChild("sm", "urn:xmpp:sm:" + smVersion) && streamId != null) { - final ResumePacket resume = new ResumePacket(this.streamId, - stanzasReceived, smVersion); + if (Config.EXTENDED_SM_LOGGING) { + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": resuming after stanza #"+stanzasReceived); + } + final ResumePacket resume = new ResumePacket(this.streamId, stanzasReceived, smVersion); this.tagWriter.writeStanzaAsync(resume); } else if (this.streamFeatures.hasChild("bind") && shouldBind) { sendBindRequest(); @@ -734,6 +743,7 @@ public class XmppConnection implements Runnable { features.blockListRequested = false; disco.clear(); sendServiceDiscoveryInfo(account.getServer()); + sendServiceDiscoveryInfo(account.getJid().toBareJid()); sendServiceDiscoveryItems(account.getServer()); if (bindListener != null) { bindListener.onBind(account); @@ -741,34 +751,35 @@ public class XmppConnection implements Runnable { sendInitialPing(); } - private void sendServiceDiscoveryInfo(final Jid server) { - if (disco.containsKey(server.toDomainJid().toString())) { - if (account.getServer().equals(server.toDomainJid())) { + private void sendServiceDiscoveryInfo(final Jid jid) { + if (disco.containsKey(jid)) { + if (account.getServer().equals(jid)) { enableAdvancedStreamFeatures(); } } else { final IqPacket iq = new IqPacket(IqPacket.TYPE.GET); - iq.setTo(server.toDomainJid()); + iq.setTo(jid); iq.query("http://jabber.org/protocol/disco#info"); this.sendIqPacket(iq, new OnIqPacketReceived() { @Override public void onIqPacketReceived(final Account account, final IqPacket packet) { final List<Element> elements = packet.query().getChildren(); - final List<String> features = new ArrayList<>(); + final Info info = new Info(); for (final Element element : elements) { if (element.getName().equals("identity")) { - if ("irc".equals(element.getAttribute("type"))) { - //add fake feature to not confuse irc and real muc - features.add("siacs:no:muc"); + String type = element.getAttribute("type"); + String category = element.getAttribute("category"); + if (type != null && category != null) { + info.identities.add(new Pair<>(category,type)); } } else if (element.getName().equals("feature")) { - features.add(element.getAttribute("var")); + info.features.add(element.getAttribute("var")); } } - disco.put(server.toDomainJid().toString(), features); + disco.put(jid, info); - if (account.getServer().equals(server.toDomainJid())) { + if (account.getServer().equals(jid)) { enableAdvancedStreamFeatures(); for (final OnAdvancedStreamFeaturesLoaded listener : advancedStreamFeaturesLoadedListeners) { listener.onAdvancedStreamFeaturesAvailable(account); @@ -784,7 +795,7 @@ public class XmppConnection implements Runnable { sendEnableCarbons(); } if (getFeatures().blocking() && !features.blockListRequested) { - Log.d(Config.LOGTAG, "Requesting block list"); + Log.d(Config.LOGTAG,account.getJid().toBareJid()+": Requesting block list"); this.sendIqPacket(getIqGenerator().generateGetBlockList(), mXmppConnectionService.getIqParser()); } } @@ -891,7 +902,9 @@ public class XmppConnection implements Runnable { } tagWriter.writeStanzaAsync(packet); if (packet instanceof MessagePacket && packet.getId() != null && this.streamId != null) { - Log.d(Config.LOGTAG, "request delivery report for stanza " + stanzasSent); + if (Config.EXTENDED_SM_LOGGING) { + Log.d(Config.LOGTAG, account.getJid().toBareJid() + ": requesting ack for message stanza #" + stanzasSent); + } this.messageReceipts.put(stanzasSent, packet.getId()); tagWriter.writeStanzaAsync(new RequestPacket(this.smVersion)); } @@ -981,11 +994,15 @@ public class XmppConnection implements Runnable { } } + public void resetStreamId() { + this.streamId = null; + } + public List<String> findDiscoItemsByFeature(final String feature) { final List<String> items = new ArrayList<>(); - for (final Entry<String, List<String>> cursor : disco.entrySet()) { - if (cursor.getValue().contains(feature)) { - items.add(cursor.getKey()); + for (final Entry<Jid, Info> cursor : disco.entrySet()) { + if (cursor.getValue().features.contains(feature)) { + items.add(cursor.getKey().toString()); } } return items; @@ -1004,10 +1021,12 @@ public class XmppConnection implements Runnable { } public String getMucServer() { - for (final Entry<String, List<String>> cursor : disco.entrySet()) { - final List<String> value = cursor.getValue(); - if (value.contains("http://jabber.org/protocol/muc") && !value.contains("jabber:iq:gateway") && !value.contains("siacs:no:muc")) { - return cursor.getKey(); + for (final Entry<Jid, Info> cursor : disco.entrySet()) { + final Info value = cursor.getValue(); + if (value.features.contains("http://jabber.org/protocol/muc") + && !value.features.contains("jabber:iq:gateway") + && !value.identities.contains(new Pair<>("conference","irc"))) { + return cursor.getKey().toString(); } } return null; @@ -1062,6 +1081,11 @@ public class XmppConnection implements Runnable { this.lastConnect = 0; } + private class Info { + public final ArrayList<String> features = new ArrayList<>(); + public final ArrayList<Pair<String,String>> identities = new ArrayList<>(); + } + public class Features { XmppConnection connection; private boolean carbonsEnabled = false; @@ -1073,8 +1097,8 @@ public class XmppConnection implements Runnable { } private boolean hasDiscoFeature(final Jid server, final String feature) { - return connection.disco.containsKey(server.toDomainJid().toString()) && - connection.disco.get(server.toDomainJid().toString()).contains(feature); + return connection.disco.containsKey(server) && + connection.disco.get(server).features.contains(feature); } public boolean carbons() { @@ -1090,24 +1114,35 @@ public class XmppConnection implements Runnable { } public boolean sm() { - return streamId != null; + return streamId != null + || (connection.streamFeatures != null && connection.streamFeatures.hasChild("sm")); } public boolean csi() { return connection.streamFeatures != null && connection.streamFeatures.hasChild("csi", "urn:xmpp:csi:0"); } - public boolean pubsub() { - return hasDiscoFeature(account.getServer(), - "http://jabber.org/protocol/pubsub#publish"); + public boolean pep() { + final Pair<String,String> needle = new Pair<>("pubsub","pep"); + Info info = disco.get(account.getServer()); + if (info != null && info.identities.contains(needle)) { + return true; + } else { + info = disco.get(account.getJid().toBareJid()); + return info != null && info.identities.contains(needle); + } } public boolean mam() { - return hasDiscoFeature(account.getServer(), "urn:xmpp:mam:0"); + if (hasDiscoFeature(account.getJid().toBareJid(), "urn:xmpp:mam:0")) { + return true; + } else { + return hasDiscoFeature(account.getServer(), "urn:xmpp:mam:0"); + } } public boolean advancedStreamFeaturesLoaded() { - return disco.containsKey(account.getServer().toString()); + return disco.containsKey(account.getServer()); } public boolean rosterVersioning() { 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 2d949e21..e448f947 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleConnection.java @@ -192,7 +192,7 @@ public class JingleConnection implements Downloadable { } else { response = packet.generateResponse(IqPacket.TYPE.ERROR); } - account.getXmppConnection().sendIqPacket(response, null); + mXmppConnectionService.sendIqPacket(account,response,null); } public void init(Message message) { @@ -317,7 +317,7 @@ public class JingleConnection implements Downloadable { message.setBody(Long.toString(size)); conversation.add(message); mXmppConnectionService.updateConversationUi(); - if (size <= this.mJingleConnectionManager + if (size < this.mJingleConnectionManager .getAutoAcceptFileSize()) { Log.d(Config.LOGTAG, "auto accepting file from " + packet.getFrom()); @@ -459,11 +459,11 @@ public class JingleConnection implements Downloadable { } private void sendJinglePacket(JinglePacket packet) { - account.getXmppConnection().sendIqPacket(packet, responseListener); + mXmppConnectionService.sendIqPacket(account,packet,responseListener); } private void sendJinglePacket(JinglePacket packet, OnIqPacketReceived callback) { - account.getXmppConnection().sendIqPacket(packet,callback); + mXmppConnectionService.sendIqPacket(account,packet,callback); } private boolean receiveAccept(JinglePacket packet) { @@ -556,7 +556,7 @@ public class JingleConnection implements Downloadable { .setAttribute("sid", this.getSessionId()); activation.query().addChild("activate") .setContent(this.getCounterPart().toString()); - this.account.getXmppConnection().sendIqPacket(activation, + mXmppConnectionService.sendIqPacket(account,activation, new OnIqPacketReceived() { @Override diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java index 174f70fa..9866af03 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleInbandTransport.java @@ -11,6 +11,7 @@ import android.util.Base64; import eu.siacs.conversations.entities.Account; import eu.siacs.conversations.entities.DownloadableFile; +import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xmpp.OnIqPacketReceived; @@ -172,6 +173,7 @@ public class JingleInbandTransport extends JingleTransport { connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100)); } } catch (IOException e) { + FileBackend.close(fileInputStream); this.onFileTransmissionStatusChanged.onFileTransferAborted(); } } @@ -198,6 +200,7 @@ public class JingleInbandTransport extends JingleTransport { connection.updateProgress((int) ((((double) (this.fileSize - this.remainingSize)) / this.fileSize) * 100)); } } catch (IOException e) { + FileBackend.close(fileOutputStream); this.onFileTransmissionStatusChanged.onFileTransferAborted(); } } @@ -207,6 +210,7 @@ public class JingleInbandTransport extends JingleTransport { if (!established) { established = true; connected = true; + this.receiveNextBlock(""); this.account.getXmppConnection().sendIqPacket( packet.generateResponse(IqPacket.TYPE.RESULT), null); } else { diff --git a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java index c3419580..72015a05 100644 --- a/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java +++ b/src/main/java/eu/siacs/conversations/xmpp/jingle/JingleSocks5Transport.java @@ -11,6 +11,7 @@ import java.security.NoSuchAlgorithmException; import java.util.Arrays; import eu.siacs.conversations.entities.DownloadableFile; +import eu.siacs.conversations.persistance.FileBackend; import eu.siacs.conversations.utils.CryptoHelper; public class JingleSocks5Transport extends JingleTransport { @@ -126,25 +127,19 @@ public class JingleSocks5Transport extends JingleTransport { } catch (NoSuchAlgorithmException e) { callback.onFileTransferAborted(); } finally { - try { - if (fileInputStream != null) { - fileInputStream.close(); - } - } catch (IOException e) { - callback.onFileTransferAborted(); - } + FileBackend.close(fileInputStream); } } }).start(); } - public void receive(final DownloadableFile file, - final OnFileTransmissionStatusChanged callback) { + public void receive(final DownloadableFile file, final OnFileTransmissionStatusChanged callback) { new Thread(new Runnable() { @Override public void run() { + OutputStream fileOutputStream = null; try { MessageDigest digest = MessageDigest.getInstance("SHA-1"); digest.reset(); @@ -152,7 +147,7 @@ public class JingleSocks5Transport extends JingleTransport { socket.setSoTimeout(30000); file.getParentFile().mkdirs(); file.createNewFile(); - OutputStream fileOutputStream = file.createOutputStream(); + fileOutputStream = file.createOutputStream(); if (fileOutputStream == null) { callback.onFileTransferAborted(); return; @@ -183,6 +178,8 @@ public class JingleSocks5Transport extends JingleTransport { callback.onFileTransferAborted(); } catch (NoSuchAlgorithmException e) { callback.onFileTransferAborted(); + } finally { + FileBackend.close(fileOutputStream); } } }).start(); diff --git a/src/main/res/drawable-hdpi/ic_add_white_24dp.png b/src/main/res/drawable-hdpi/ic_add_white_24dp.png Binary files differnew file mode 100644 index 00000000..481643ec --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_add_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_attach_file_white_24dp.png b/src/main/res/drawable-hdpi/ic_attach_file_white_24dp.png Binary files differnew file mode 100644 index 00000000..66299b88 --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_attach_file_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_chat_white_48dp.png b/src/main/res/drawable-hdpi/ic_chat_white_48dp.png Binary files differdeleted file mode 100644 index 71cac75a..00000000 --- a/src/main/res/drawable-hdpi/ic_chat_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-mdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_content_copy_grey600_24dp.png Binary files differindex 5592d5c8..5592d5c8 100644 --- a/src/main/res/drawable-mdpi/ic_content_copy_grey600_36dp.png +++ b/src/main/res/drawable-hdpi/ic_content_copy_grey600_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_content_copy_grey600_36dp.png Binary files differdeleted file mode 100644 index bd2c60b8..00000000 --- a/src/main/res/drawable-hdpi/ic_content_copy_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..b72a9f3c --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_delete_grey600_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_delete_white_24dp.png b/src/main/res/drawable-hdpi/ic_delete_white_24dp.png Binary files differnew file mode 100644 index 00000000..a9eac0ca --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_delete_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_edit_grey600_24dp.png Binary files differindex b5f88c80..b5f88c80 100644 --- a/src/main/res/drawable-mdpi/ic_edit_grey600_36dp.png +++ b/src/main/res/drawable-hdpi/ic_edit_grey600_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_edit_grey600_36dp.png Binary files differdeleted file mode 100644 index f8970cb2..00000000 --- a/src/main/res/drawable-hdpi/ic_edit_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_edit_white_24dp.png b/src/main/res/drawable-hdpi/ic_edit_white_24dp.png Binary files differnew file mode 100644 index 00000000..730416c9 --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_edit_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_group_add_white_24dp.png b/src/main/res/drawable-hdpi/ic_group_add_white_24dp.png Binary files differnew file mode 100644 index 00000000..d96c584c --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_group_add_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_group_white_24dp.png b/src/main/res/drawable-hdpi/ic_group_white_24dp.png Binary files differnew file mode 100644 index 00000000..dada448f --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_group_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_import_export_white_24dp.png b/src/main/res/drawable-hdpi/ic_import_export_white_24dp.png Binary files differnew file mode 100644 index 00000000..705a4cc7 --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_import_export_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png b/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png Binary files differnew file mode 100644 index 00000000..1f582254 --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_lock_open_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-hdpi/ic_lock_outline_white_48dp.png Binary files differdeleted file mode 100644 index d0c25290..00000000 --- a/src/main/res/drawable-hdpi/ic_lock_outline_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_lock_white_24dp.png b/src/main/res/drawable-hdpi/ic_lock_white_24dp.png Binary files differnew file mode 100644 index 00000000..b94735ec --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_lock_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png b/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png Binary files differnew file mode 100644 index 00000000..53341908 --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_person_add_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-hdpi/ic_refresh_white_48dp.png Binary files differdeleted file mode 100644 index 72128fe6..00000000 --- a/src/main/res/drawable-hdpi/ic_refresh_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_remove_grey600_36dp.png Binary files differdeleted file mode 100644 index aeb1cea9..00000000 --- a/src/main/res/drawable-hdpi/ic_remove_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_search_white_24dp.png b/src/main/res/drawable-hdpi/ic_search_white_24dp.png Binary files differnew file mode 100644 index 00000000..a2fc5b2e --- /dev/null +++ b/src/main/res/drawable-hdpi/ic_search_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png Binary files differindex 20d2b66e..20d2b66e 100644 --- a/src/main/res/drawable-mdpi/ic_settings_grey600_36dp.png +++ b/src/main/res/drawable-hdpi/ic_settings_grey600_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-hdpi/ic_settings_grey600_36dp.png Binary files differdeleted file mode 100644 index cff84744..00000000 --- a/src/main/res/drawable-hdpi/ic_settings_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-mdpi/ic_warning_white_36dp.png b/src/main/res/drawable-hdpi/ic_warning_white_24dp.png Binary files differindex 30eee6c4..30eee6c4 100644 --- a/src/main/res/drawable-mdpi/ic_warning_white_36dp.png +++ b/src/main/res/drawable-hdpi/ic_warning_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_warning_white_36dp.png b/src/main/res/drawable-hdpi/ic_warning_white_36dp.png Binary files differdeleted file mode 100644 index c8b7140a..00000000 --- a/src/main/res/drawable-hdpi/ic_warning_white_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-mdpi/ic_add_white_24dp.png b/src/main/res/drawable-mdpi/ic_add_white_24dp.png Binary files differnew file mode 100644 index 00000000..977dd342 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_add_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_attach_file_white_24dp.png b/src/main/res/drawable-mdpi/ic_attach_file_white_24dp.png Binary files differnew file mode 100644 index 00000000..fc62a5bf --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_attach_file_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_chat_white_48dp.png b/src/main/res/drawable-mdpi/ic_chat_white_48dp.png Binary files differdeleted file mode 100644 index 526ebec6..00000000 --- a/src/main/res/drawable-mdpi/ic_chat_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-mdpi/ic_content_copy_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_content_copy_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..bab9b4d6 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_content_copy_grey600_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..e757fdb0 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_delete_grey600_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_delete_white_24dp.png b/src/main/res/drawable-mdpi/ic_delete_white_24dp.png Binary files differnew file mode 100644 index 00000000..e4ea52ef --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_delete_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_edit_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_edit_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..bae3480c --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_edit_grey600_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_edit_white_24dp.png b/src/main/res/drawable-mdpi/ic_edit_white_24dp.png Binary files differnew file mode 100644 index 00000000..85cff0b9 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_edit_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_group_add_white_24dp.png b/src/main/res/drawable-mdpi/ic_group_add_white_24dp.png Binary files differnew file mode 100644 index 00000000..d0ef7ee8 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_group_add_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_group_white_24dp.png b/src/main/res/drawable-mdpi/ic_group_white_24dp.png Binary files differnew file mode 100644 index 00000000..ff2a916b --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_group_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_import_export_white_24dp.png b/src/main/res/drawable-mdpi/ic_import_export_white_24dp.png Binary files differnew file mode 100644 index 00000000..5f6e11bc --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_import_export_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png b/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png Binary files differnew file mode 100644 index 00000000..ab9efde0 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_lock_open_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-mdpi/ic_lock_outline_white_48dp.png Binary files differdeleted file mode 100644 index 2d2c9417..00000000 --- a/src/main/res/drawable-mdpi/ic_lock_outline_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-mdpi/ic_lock_white_24dp.png b/src/main/res/drawable-mdpi/ic_lock_white_24dp.png Binary files differnew file mode 100644 index 00000000..381b6a11 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_lock_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png b/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png Binary files differnew file mode 100644 index 00000000..d0857a49 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_person_add_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-mdpi/ic_refresh_white_48dp.png Binary files differdeleted file mode 100644 index 5f89fc25..00000000 --- a/src/main/res/drawable-mdpi/ic_refresh_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-mdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-mdpi/ic_remove_grey600_36dp.png Binary files differdeleted file mode 100644 index efc9560e..00000000 --- a/src/main/res/drawable-mdpi/ic_remove_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-mdpi/ic_search_white_24dp.png b/src/main/res/drawable-mdpi/ic_search_white_24dp.png Binary files differnew file mode 100644 index 00000000..dff1e3a8 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_search_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_settings_grey600_24dp.png b/src/main/res/drawable-mdpi/ic_settings_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..5a1b41f0 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_settings_grey600_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_warning_white_24dp.png b/src/main/res/drawable-mdpi/ic_warning_white_24dp.png Binary files differnew file mode 100644 index 00000000..385c0f68 --- /dev/null +++ b/src/main/res/drawable-mdpi/ic_warning_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_add_white_48dp.png b/src/main/res/drawable-xhdpi/ic_add_white_24dp.png Binary files differindex 67042105..67042105 100644 --- a/src/main/res/drawable-mdpi/ic_add_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_add_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xhdpi/ic_attach_file_white_24dp.png Binary files differindex db23fd65..db23fd65 100644 --- a/src/main/res/drawable-mdpi/ic_attach_file_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_attach_file_white_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png b/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png Binary files differdeleted file mode 100644 index 1230ab39..00000000 --- a/src/main/res/drawable-xhdpi/ic_chat_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_content_copy_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_content_copy_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..68ccece6 --- /dev/null +++ b/src/main/res/drawable-xhdpi/ic_content_copy_grey600_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..c6bb43e8 --- /dev/null +++ b/src/main/res/drawable-xhdpi/ic_delete_grey600_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png Binary files differindex cdb230c2..cdb230c2 100644 --- a/src/main/res/drawable-mdpi/ic_delete_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_delete_white_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_edit_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_edit_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..4c95bd57 --- /dev/null +++ b/src/main/res/drawable-xhdpi/ic_edit_grey600_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xhdpi/ic_edit_white_24dp.png Binary files differindex 7f0ea51b..7f0ea51b 100644 --- a/src/main/res/drawable-mdpi/ic_edit_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_edit_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xhdpi/ic_group_add_white_24dp.png Binary files differindex 6055325e..6055325e 100644 --- a/src/main/res/drawable-mdpi/ic_group_add_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_group_add_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_group_white_48dp.png b/src/main/res/drawable-xhdpi/ic_group_white_24dp.png Binary files differindex 0c5fd333..0c5fd333 100644 --- a/src/main/res/drawable-mdpi/ic_group_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_group_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xhdpi/ic_import_export_white_24dp.png Binary files differindex fb82f420..fb82f420 100644 --- a/src/main/res/drawable-mdpi/ic_import_export_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_import_export_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png Binary files differindex 6e1321e4..6e1321e4 100644 --- a/src/main/res/drawable-mdpi/ic_lock_open_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_lock_open_white_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-xhdpi/ic_lock_outline_white_48dp.png Binary files differdeleted file mode 100644 index 3de35f9b..00000000 --- a/src/main/res/drawable-xhdpi/ic_lock_outline_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png b/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png Binary files differnew file mode 100644 index 00000000..c5e9d0b4 --- /dev/null +++ b/src/main/res/drawable-xhdpi/ic_lock_white_24dp.png diff --git a/src/main/res/drawable-mdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xhdpi/ic_person_add_white_24dp.png Binary files differindex c402e8f0..c402e8f0 100644 --- a/src/main/res/drawable-mdpi/ic_person_add_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_person_add_white_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-xhdpi/ic_refresh_white_48dp.png Binary files differdeleted file mode 100644 index d271d8e0..00000000 --- a/src/main/res/drawable-xhdpi/ic_refresh_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-xhdpi/ic_remove_grey600_36dp.png Binary files differdeleted file mode 100644 index 3d5136fe..00000000 --- a/src/main/res/drawable-xhdpi/ic_remove_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-mdpi/ic_search_white_48dp.png b/src/main/res/drawable-xhdpi/ic_search_white_24dp.png Binary files differindex 043759ac..043759ac 100644 --- a/src/main/res/drawable-mdpi/ic_search_white_48dp.png +++ b/src/main/res/drawable-xhdpi/ic_search_white_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png b/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..2251d2bb --- /dev/null +++ b/src/main/res/drawable-xhdpi/ic_settings_grey600_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_warning_white_24dp.png b/src/main/res/drawable-xhdpi/ic_warning_white_24dp.png Binary files differnew file mode 100644 index 00000000..6eb7943c --- /dev/null +++ b/src/main/res/drawable-xhdpi/ic_warning_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png Binary files differindex 72cedcad..72cedcad 100644 --- a/src/main/res/drawable-hdpi/ic_add_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_add_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_add_white_48dp.png Binary files differdeleted file mode 100644 index b12e040e..00000000 --- a/src/main/res/drawable-xxhdpi/ic_add_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_attach_file_white_24dp.png Binary files differindex 7256ca3d..7256ca3d 100644 --- a/src/main/res/drawable-hdpi/ic_attach_file_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_attach_file_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_attach_file_white_48dp.png Binary files differdeleted file mode 100644 index b50e5161..00000000 --- a/src/main/res/drawable-xxhdpi/ic_attach_file_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png Binary files differdeleted file mode 100644 index bb39d157..00000000 --- a/src/main/res/drawable-xxhdpi/ic_chat_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_24dp.png Binary files differindex 2fdbbea1..2fdbbea1 100644 --- a/src/main/res/drawable-xhdpi/ic_content_copy_grey600_36dp.png +++ b/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_36dp.png Binary files differdeleted file mode 100644 index 72b3474b..00000000 --- a/src/main/res/drawable-xxhdpi/ic_content_copy_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..4886ab1e --- /dev/null +++ b/src/main/res/drawable-xxhdpi/ic_delete_grey600_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png Binary files differindex 0e95e9b1..0e95e9b1 100644 --- a/src/main/res/drawable-hdpi/ic_delete_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_delete_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_delete_white_48dp.png Binary files differdeleted file mode 100644 index a8d8ca84..00000000 --- a/src/main/res/drawable-xxhdpi/ic_delete_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_edit_grey600_24dp.png Binary files differindex 6ed4351c..6ed4351c 100644 --- a/src/main/res/drawable-xhdpi/ic_edit_grey600_36dp.png +++ b/src/main/res/drawable-xxhdpi/ic_edit_grey600_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_edit_grey600_36dp.png Binary files differdeleted file mode 100644 index 21b617a9..00000000 --- a/src/main/res/drawable-xxhdpi/ic_edit_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_edit_white_24dp.png Binary files differindex 34ec7092..34ec7092 100644 --- a/src/main/res/drawable-hdpi/ic_edit_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_edit_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_edit_white_48dp.png Binary files differdeleted file mode 100644 index fe5bd13f..00000000 --- a/src/main/res/drawable-xxhdpi/ic_edit_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_group_add_white_24dp.png Binary files differindex a5ad0a29..a5ad0a29 100644 --- a/src/main/res/drawable-hdpi/ic_group_add_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_group_add_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_group_add_white_48dp.png Binary files differdeleted file mode 100644 index 7ff60d6f..00000000 --- a/src/main/res/drawable-xxhdpi/ic_group_add_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_group_white_24dp.png Binary files differindex a6ed594f..a6ed594f 100644 --- a/src/main/res/drawable-hdpi/ic_group_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_group_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_group_white_48dp.png Binary files differdeleted file mode 100644 index fffa6a6a..00000000 --- a/src/main/res/drawable-xxhdpi/ic_group_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_import_export_white_24dp.png Binary files differindex c3497037..c3497037 100644 --- a/src/main/res/drawable-hdpi/ic_import_export_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_import_export_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_import_export_white_48dp.png Binary files differdeleted file mode 100644 index cabd50c0..00000000 --- a/src/main/res/drawable-xxhdpi/ic_import_export_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png Binary files differindex b90a5980..b90a5980 100644 --- a/src/main/res/drawable-hdpi/ic_lock_open_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_lock_open_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_lock_open_white_48dp.png Binary files differdeleted file mode 100644 index 031eb06e..00000000 --- a/src/main/res/drawable-xxhdpi/ic_lock_open_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxhdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_lock_outline_white_48dp.png Binary files differdeleted file mode 100644 index f57082d8..00000000 --- a/src/main/res/drawable-xxhdpi/ic_lock_outline_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png b/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png Binary files differnew file mode 100644 index 00000000..0dcada81 --- /dev/null +++ b/src/main/res/drawable-xxhdpi/ic_lock_white_24dp.png diff --git a/src/main/res/drawable-hdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_person_add_white_24dp.png Binary files differindex 074db2d3..074db2d3 100644 --- a/src/main/res/drawable-hdpi/ic_person_add_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_person_add_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_person_add_white_48dp.png Binary files differdeleted file mode 100644 index ba242487..00000000 --- a/src/main/res/drawable-xxhdpi/ic_person_add_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxhdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_refresh_white_48dp.png Binary files differdeleted file mode 100644 index 87ab2d64..00000000 --- a/src/main/res/drawable-xxhdpi/ic_refresh_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxhdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_remove_grey600_36dp.png Binary files differdeleted file mode 100644 index 4b1003db..00000000 --- a/src/main/res/drawable-xxhdpi/ic_remove_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-hdpi/ic_search_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png Binary files differindex 0bbeab15..0bbeab15 100644 --- a/src/main/res/drawable-hdpi/ic_search_white_48dp.png +++ b/src/main/res/drawable-xxhdpi/ic_search_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_search_white_48dp.png b/src/main/res/drawable-xxhdpi/ic_search_white_48dp.png Binary files differdeleted file mode 100644 index 75d9aa69..00000000 --- a/src/main/res/drawable-xxhdpi/ic_search_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png Binary files differindex 6a70402b..6a70402b 100644 --- a/src/main/res/drawable-xhdpi/ic_settings_grey600_36dp.png +++ b/src/main/res/drawable-xxhdpi/ic_settings_grey600_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-xxhdpi/ic_settings_grey600_36dp.png Binary files differdeleted file mode 100644 index d47d042e..00000000 --- a/src/main/res/drawable-xxhdpi/ic_settings_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_warning_white_36dp.png b/src/main/res/drawable-xxhdpi/ic_warning_white_24dp.png Binary files differindex 3f401317..3f401317 100644 --- a/src/main/res/drawable-xhdpi/ic_warning_white_36dp.png +++ b/src/main/res/drawable-xxhdpi/ic_warning_white_24dp.png diff --git a/src/main/res/drawable-xxhdpi/ic_warning_white_36dp.png b/src/main/res/drawable-xxhdpi/ic_warning_white_36dp.png Binary files differdeleted file mode 100644 index a6e5788b..00000000 --- a/src/main/res/drawable-xxhdpi/ic_warning_white_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png Binary files differindex 2bef0595..2bef0595 100644 --- a/src/main/res/drawable-xhdpi/ic_add_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_add_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_add_white_48dp.png Binary files differdeleted file mode 100644 index cd32f0a8..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_add_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_attach_file_white_24dp.png Binary files differindex caaee37a..caaee37a 100644 --- a/src/main/res/drawable-xhdpi/ic_attach_file_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_attach_file_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_attach_file_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_attach_file_white_48dp.png Binary files differdeleted file mode 100644 index 55464b7e..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_attach_file_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png Binary files differdeleted file mode 100644 index 68f14af6..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_chat_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..1eb62d42 --- /dev/null +++ b/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_36dp.png Binary files differdeleted file mode 100644 index 435c087a..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_content_copy_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_delete_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_delete_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..e4e21812 --- /dev/null +++ b/src/main/res/drawable-xxxhdpi/ic_delete_grey600_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png Binary files differindex ccf8c716..ccf8c716 100644 --- a/src/main/res/drawable-xhdpi/ic_delete_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_delete_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_delete_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_delete_white_48dp.png Binary files differdeleted file mode 100644 index 47fef5aa..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_delete_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_edit_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..0c0fd76f --- /dev/null +++ b/src/main/res/drawable-xxxhdpi/ic_edit_grey600_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_edit_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_grey600_36dp.png Binary files differdeleted file mode 100644 index 1361eedc..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_edit_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_white_24dp.png Binary files differindex 9380370f..9380370f 100644 --- a/src/main/res/drawable-xhdpi/ic_edit_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_edit_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_edit_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_edit_white_48dp.png Binary files differdeleted file mode 100644 index 73680649..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_edit_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_add_white_24dp.png Binary files differindex 0ac3d4a8..0ac3d4a8 100644 --- a/src/main/res/drawable-xhdpi/ic_group_add_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_group_add_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_group_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_add_white_48dp.png Binary files differdeleted file mode 100644 index 7e9d67f6..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_group_add_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_white_24dp.png Binary files differindex a62b5677..a62b5677 100644 --- a/src/main/res/drawable-xhdpi/ic_group_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_group_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_group_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_group_white_48dp.png Binary files differdeleted file mode 100644 index 2a27316b..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_group_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_import_export_white_24dp.png Binary files differindex 06b27ea1..06b27ea1 100644 --- a/src/main/res/drawable-xhdpi/ic_import_export_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_import_export_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_import_export_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_import_export_white_48dp.png Binary files differdeleted file mode 100644 index ea80bc00..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_import_export_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png Binary files differindex 8f35034c..8f35034c 100644 --- a/src/main/res/drawable-xhdpi/ic_lock_open_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_lock_open_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_lock_open_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_open_white_48dp.png Binary files differdeleted file mode 100644 index f7652e60..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_lock_open_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_lock_outline_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_outline_white_48dp.png Binary files differdeleted file mode 100644 index 440070a1..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_lock_outline_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png b/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png Binary files differnew file mode 100644 index 00000000..a70c55b7 --- /dev/null +++ b/src/main/res/drawable-xxxhdpi/ic_lock_white_24dp.png diff --git a/src/main/res/drawable-xhdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png Binary files differindex 4e2121e5..4e2121e5 100644 --- a/src/main/res/drawable-xhdpi/ic_person_add_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_person_add_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_person_add_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_person_add_white_48dp.png Binary files differdeleted file mode 100644 index 89c1aef2..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_person_add_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_refresh_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_refresh_white_48dp.png Binary files differdeleted file mode 100644 index fe0ae13a..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_refresh_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_remove_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_remove_grey600_36dp.png Binary files differdeleted file mode 100644 index 524cc0a0..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_remove_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-xhdpi/ic_search_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png Binary files differindex 70c21baf..70c21baf 100644 --- a/src/main/res/drawable-xhdpi/ic_search_white_48dp.png +++ b/src/main/res/drawable-xxxhdpi/ic_search_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_search_white_48dp.png b/src/main/res/drawable-xxxhdpi/ic_search_white_48dp.png Binary files differdeleted file mode 100644 index 7caf6c9b..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_search_white_48dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_settings_grey600_24dp.png b/src/main/res/drawable-xxxhdpi/ic_settings_grey600_24dp.png Binary files differnew file mode 100644 index 00000000..5eba9e8e --- /dev/null +++ b/src/main/res/drawable-xxxhdpi/ic_settings_grey600_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_settings_grey600_36dp.png b/src/main/res/drawable-xxxhdpi/ic_settings_grey600_36dp.png Binary files differdeleted file mode 100644 index 8fea47f6..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_settings_grey600_36dp.png +++ /dev/null diff --git a/src/main/res/drawable-xxxhdpi/ic_warning_white_24dp.png b/src/main/res/drawable-xxxhdpi/ic_warning_white_24dp.png Binary files differnew file mode 100644 index 00000000..b80446e7 --- /dev/null +++ b/src/main/res/drawable-xxxhdpi/ic_warning_white_24dp.png diff --git a/src/main/res/drawable-xxxhdpi/ic_warning_white_36dp.png b/src/main/res/drawable-xxxhdpi/ic_warning_white_36dp.png Binary files differdeleted file mode 100644 index abc5c7a5..00000000 --- a/src/main/res/drawable-xxxhdpi/ic_warning_white_36dp.png +++ /dev/null diff --git a/src/main/res/layout-w960dp/fragment_conversations_overview.xml b/src/main/res/layout-w945dp/fragment_conversations_overview.xml index 2744f38e..50039c03 100644 --- a/src/main/res/layout-w960dp/fragment_conversations_overview.xml +++ b/src/main/res/layout-w945dp/fragment_conversations_overview.xml @@ -12,7 +12,7 @@ android:background="@color/primarybackground" android:orientation="vertical" > - <ListView + <de.timroes.android.listview.EnhancedListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" diff --git a/src/main/res/layout/account_row.xml b/src/main/res/layout/account_row.xml index 60b69090..0e73dd64 100644 --- a/src/main/res/layout/account_row.xml +++ b/src/main/res/layout/account_row.xml @@ -3,7 +3,9 @@ android:layout_width="match_parent" android:layout_height="wrap_content" android:background="?android:attr/activatedBackgroundIndicator" - android:padding="8dp" > + android:paddingLeft="8dp" + android:paddingBottom="8dp" + android:paddingTop="8dp"> <ImageView android:id="@+id/account_image" @@ -20,7 +22,9 @@ android:layout_centerVertical="true" android:layout_toRightOf="@+id/account_image" android:orientation="vertical" - android:paddingLeft="8dp" > + android:paddingLeft="8dp" + android:layout_toLeftOf="@+id/tgl_account_status" + android:layout_toStartOf="@+id/tgl_account_status"> <TextView android:id="@+id/account_jid" @@ -41,4 +45,13 @@ android:textStyle="bold" /> </LinearLayout> + <Switch + android:id="@+id/tgl_account_status" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignParentRight="true" + android:layout_centerVertical="true" + android:padding="8dp" + android:focusable="false"/> + </RelativeLayout>
\ No newline at end of file diff --git a/src/main/res/layout/activity_edit_account.xml b/src/main/res/layout/activity_edit_account.xml index 750c28e0..7d84a4af 100644 --- a/src/main/res/layout/activity_edit_account.xml +++ b/src/main/res/layout/activity_edit_account.xml @@ -337,7 +337,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="?android:selectableItemBackground" - android:padding="8dp" + android:padding="@dimen/image_button_padding" android:src="?attr/icon_copy" android:visibility="visible" android:contentDescription="@string/copy_otr_clipboard_description"/> diff --git a/src/main/res/layout/activity_muc_details.xml b/src/main/res/layout/activity_muc_details.xml index 36873654..11602651 100644 --- a/src/main/res/layout/activity_muc_details.xml +++ b/src/main/res/layout/activity_muc_details.xml @@ -75,7 +75,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="?android:selectableItemBackground" - android:padding="8dp" + android:padding="@dimen/image_button_padding" android:src="?attr/icon_edit_dark"/> </RelativeLayout> @@ -102,7 +102,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="?android:selectableItemBackground" - android:padding="8dp" + android:padding="@dimen/image_button_padding" android:src="?attr/icon_settings"/> </RelativeLayout> diff --git a/src/main/res/layout/contact_key.xml b/src/main/res/layout/contact_key.xml index 75572877..b7817b38 100644 --- a/src/main/res/layout/contact_key.xml +++ b/src/main/res/layout/contact_key.xml @@ -34,7 +34,7 @@ android:layout_alignParentRight="true" android:layout_centerVertical="true" android:background="?android:selectableItemBackground" - android:padding="8dp" + android:padding="@dimen/image_button_padding" android:src="?attr/icon_remove" android:visibility="invisible" /> diff --git a/src/main/res/layout/conversation_list_row.xml b/src/main/res/layout/conversation_list_row.xml index 21147b4a..69abb225 100644 --- a/src/main/res/layout/conversation_list_row.xml +++ b/src/main/res/layout/conversation_list_row.xml @@ -1,68 +1,86 @@ -<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:orientation="horizontal" - android:padding="8dp" > +<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:descendantFocusability="blocksDescendants"> - <ImageView - android:id="@+id/conversation_image" - android:layout_width="56dp" - android:layout_height="56dp" - android:layout_alignParentLeft="true" - android:scaleType="centerCrop" /> + <View + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:background="@color/primary"/> - <RelativeLayout - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:layout_centerVertical="true" - android:layout_toRightOf="@+id/conversation_image" - android:paddingLeft="8dp" > + <FrameLayout + android:id="@+id/swipeable_item" + android:layout_width="fill_parent" + android:layout_height="fill_parent" + android:background="@color/primarybackground"> - <TextView - android:id="@+id/conversation_name" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignLeft="@+id/conversation_lastwrapper" - android:layout_toLeftOf="@+id/conversation_lastupdate" - android:singleLine="true" - android:textColor="@color/primarytext" - android:textSize="?attr/TextSizeHeadline" - android:typeface="sans" /> + <RelativeLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:background="?android:selectableItemBackground" + android:orientation="horizontal" + android:padding="8dp" > - <LinearLayout - android:id="@+id/conversation_lastwrapper" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:layout_below="@id/conversation_name" - android:orientation="vertical" - android:paddingTop="3dp" > + <ImageView + android:id="@+id/conversation_image" + android:layout_width="56dp" + android:layout_height="56dp" + android:layout_alignParentLeft="true" + android:scaleType="centerCrop" /> - <TextView - android:id="@+id/conversation_lastmsg" - android:layout_width="fill_parent" - android:layout_height="wrap_content" - android:scrollHorizontally="false" - android:singleLine="true" - android:textColor="@color/primarytext" - android:textSize="?attr/TextSizeBody" /> + <RelativeLayout + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_centerVertical="true" + android:layout_toRightOf="@+id/conversation_image" + android:paddingLeft="8dp" > - <ImageView - android:id="@+id/conversation_lastimage" - android:layout_width="fill_parent" - android:layout_height="36dp" - android:background="@color/primarytext" - android:scaleType="centerCrop" /> - </LinearLayout> + <TextView + android:id="@+id/conversation_name" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignLeft="@+id/conversation_lastwrapper" + android:layout_toLeftOf="@+id/conversation_lastupdate" + android:singleLine="true" + android:textColor="@color/primarytext" + android:textSize="?attr/TextSizeHeadline" + android:typeface="sans" /> - <TextView - android:id="@+id/conversation_lastupdate" - android:layout_width="wrap_content" - android:layout_height="wrap_content" - android:layout_alignBaseline="@+id/conversation_name" - android:layout_alignParentRight="true" - android:gravity="right" - android:textColor="@color/secondarytext" - android:textSize="?attr/TextSizeInfo" /> - </RelativeLayout> + <LinearLayout + android:id="@+id/conversation_lastwrapper" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:layout_below="@id/conversation_name" + android:orientation="vertical" + android:paddingTop="3dp" > -</RelativeLayout>
\ No newline at end of file + <TextView + android:id="@+id/conversation_lastmsg" + android:layout_width="fill_parent" + android:layout_height="wrap_content" + android:scrollHorizontally="false" + android:singleLine="true" + android:textColor="@color/primarytext" + android:textSize="?attr/TextSizeBody" /> + + <ImageView + android:id="@+id/conversation_lastimage" + android:layout_width="fill_parent" + android:layout_height="36dp" + android:background="@color/primarytext" + android:scaleType="centerCrop" /> + </LinearLayout> + + <TextView + android:id="@+id/conversation_lastupdate" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_alignBaseline="@+id/conversation_name" + android:layout_alignParentRight="true" + android:gravity="right" + android:textColor="@color/secondarytext" + android:textSize="?attr/TextSizeInfo" /> + </RelativeLayout> + </RelativeLayout> + </FrameLayout> +</FrameLayout>
\ No newline at end of file diff --git a/src/main/res/layout/fragment_conversations_overview.xml b/src/main/res/layout/fragment_conversations_overview.xml index 69570028..24c653ae 100644 --- a/src/main/res/layout/fragment_conversations_overview.xml +++ b/src/main/res/layout/fragment_conversations_overview.xml @@ -10,7 +10,7 @@ android:background="@color/primarybackground" android:orientation="vertical" > - <ListView + <de.timroes.android.listview.EnhancedListView android:id="@+id/list" android:layout_width="fill_parent" android:layout_height="wrap_content" diff --git a/src/main/res/values-ar-rEG/strings.xml b/src/main/res/values-ar-rEG/strings.xml index 3acf8e54..35eff49f 100644 --- a/src/main/res/values-ar-rEG/strings.xml +++ b/src/main/res/values-ar-rEG/strings.xml @@ -260,7 +260,6 @@ <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 عليك توفير تلميحا أو سؤال لجهة الإتصال بك للحصول على تلك الإجابه وبدأ التواصل</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> diff --git a/src/main/res/values-bg/strings.xml b/src/main/res/values-bg/strings.xml index 2f89f3ae..b27481dd 100644 --- a/src/main/res/values-bg/strings.xml +++ b/src/main/res/values-bg/strings.xml @@ -359,7 +359,7 @@ <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Можете да подсигурите подсказка или въпрос, на който контакта Ви да отговори, като има предвид, че главните и малките букви се броят за различни.</string> + <string name="smp_explain_question">Ако Вие и контактът Ви имате някаква тайна информация, която никой друг не знае (като някаква шега или пък просто какво сте обядвали, когато сте се срещнали за последно), можете да я използвате, за да проверите отпечатъците си един на друг.\n\nМожете да подсигурите подсказка или въпрос, на който контактът Ви да отговори, като има предвид, че главните и малките букви се броят за различни.</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> @@ -427,6 +427,21 @@ <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">Conversation се затвори</string> + <string name="title_undo_swipe_out_muc">Напуснахте беседата</string> + <string name="pref_certificate_options">Настройки на сертификата</string> + <string name="pref_dont_trust_system_cas_title">Да не се вярва на системните сертификати</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> diff --git a/src/main/res/values-ca/strings.xml b/src/main/res/values-ca/strings.xml index e50fa740..a0861b16 100644 --- a/src/main/res/values-ca/strings.xml +++ b/src/main/res/values-ca/strings.xml @@ -359,7 +359,6 @@ <string name="could_not_change_password">No s\'ha pogut canviar la contrasenya</string> <string name="otr_session_not_started">Començar a enviar un missatge de conversació xifrat</string> <string name="ask_question">Fer una pregunta</string> - <string name="smp_explain_question">Si vosté i el seu contacte tenen un secret en comú que ningú més sap (com una broma o simplement el que tenia per dinar l\'última vegada que es va trobar) pot utilitzar aquest secret per comprovar les empremtes dactilars de cadascú. \ n\ n Proporcionarás una pista o una pregunta per a la seu contacte que respondrà amb una resposta entre majúscules i minúscules.</string> <string name="smp_explain_answer">El seu contacte l\'hi agradaria verificar la seva empremta digital per un repte amb un secret compartit.El seu contacte proporciona el següent suggeriment o pregunta per aquest secret.</string> <string name="shared_secret_hint_should_not_be_empty">El seu suggeriment no pot estar buit</string> <string name="shared_secret_can_not_be_empty">El teu secret compartit no pot estar buit</string> diff --git a/src/main/res/values-cs/strings.xml b/src/main/res/values-cs/strings.xml index 0c08fa7a..f49cb1b9 100644 --- a/src/main/res/values-cs/strings.xml +++ b/src/main/res/values-cs/strings.xml @@ -427,6 +427,22 @@ <string name="no_application_found_to_display_location">Nebyla nalezena aplikace pro zobrazení pozice</string> <string name="location">Pozice</string> <string name="received_location">Přijmout pozici</string> + <string name="title_undo_swipe_out_conversation">Conversation zavřena</string> + <string name="title_undo_swipe_out_muc">Opustil(a) konferenci</string> + <string name="pref_certificate_options">Nastavení certifikátu</string> + <string name="pref_dont_trust_system_cas_title">Nedůvěřovat systémovým CA</string> + <string name="pref_dont_trust_system_cas_summary">Všechny certifikáty musí být schváleny ručně</string> + <string name="pref_remove_trusted_certificates_title">Odstranit certifikáty</string> + <string name="pref_remove_trusted_certificates_summary">Smazat ručně povolené certifikáty</string> + <string name="toast_no_trusted_certs">Žádné ručně povolené certifikáty</string> + <string name="dialog_manage_certs_title">Odstranit certifikáty</string> + <string name="dialog_manage_certs_positivebutton">Smazat výběr</string> + <string name="dialog_manage_certs_negativebutton">Zrušit</string> + <plurals name="toast_delete_certificates"> + <item quantity="one">%d certifikát smazán</item> + <item quantity="few">%d certifikáty smazány</item> + <item quantity="other">%d certifikátů smazáno</item> + </plurals> <plurals name="select_contact"> <item quantity="one">Vybrat %d kontakt</item> <item quantity="few">Vybrat %d kontakty</item> diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 0dd9f401..08b0d4a5 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -121,13 +121,13 @@ <string name="accept">Annehmen</string> <string name="error">Ein unbekannter Fehler ist aufgetreten</string> <string name="pref_grant_presence_updates">Online-Status</string> - <string name="pref_grant_presence_updates_summary">Erlaube neu hinzugefügten Kontakten deinen online-Status zu sehen und frage um Erlaubnis, ihren sehen zu dürfen</string> + <string name="pref_grant_presence_updates_summary">Erlaube neu hinzugefügten Kontakten meinen Online-Status zu sehen und frage um Erlaubnis, ihren sehen zu dürfen</string> <string name="subscriptions">Abonnements</string> <string name="your_account">Dein Konto</string> <string name="keys">Schlüssel</string> - <string name="send_presence_updates">Anwesenheitsbenachrichtigungen senden</string> - <string name="receive_presence_updates">Empfange Anwesenheitsbenachrichtigungen</string> - <string name="ask_for_presence_updates">Frage um Erlaubnis, Anwesenheitsbenachrichtigungen sehen zu dürfen</string> + <string name="send_presence_updates">Online-Status senden</string> + <string name="receive_presence_updates">Online-Status empfangen</string> + <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> @@ -255,12 +255,12 @@ <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="request_presence_updates">Bitte erst Anwesenheitsbenachrichtigungen vom Kontakt anfordern.\n\n</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="ignore">Ignorieren</string> - <string name="without_mutual_presence_updates"><b>Achtung:</b> Es kann zu unerwarteten Problemen führen, dies ohne gegenseitige Anwesenheitsbenachrichtigungen abzusenden.\n\n<small>Bitte die Online-Status-Abonnements in den Kontaktdetails prüfen.</small></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="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> @@ -427,6 +427,21 @@ <string name="no_application_found_to_display_location">Keine App für die Standort-Anzeige gefunden</string> <string name="location">Standort</string> <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_certificate_options">Zertifikats-Optionen</string> + <string name="pref_dont_trust_system_cas_title">Misstraue Zertifizierungsstellen</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> + <string name="toast_no_trusted_certs">Keine manuell bestätigten Zertifikate</string> + <string name="dialog_manage_certs_title">Zertifikate löschen</string> + <string name="dialog_manage_certs_positivebutton">Auswahl löschen</string> + <string name="dialog_manage_certs_negativebutton">Abbrechen</string> + <plurals name="toast_delete_certificates"> + <item quantity="one">%d Zertifikat gelöscht</item> + <item quantity="other">%d Zertifikate gelöscht</item> + </plurals> <plurals name="select_contact"> <item quantity="one">%d Kontakt ausgewählt</item> <item quantity="other">%d Kontakte ausgewählt</item> diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 48dc4034..01b33908 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -359,7 +359,7 @@ <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Προσφέρετε έναν υπαινιγμό ή μια ερώτηση για την επαφή σας, που θα απαντήσει με μια φράση στην οποία έχουν διαφοροποίηση τα πεζά από τα κεφαλαία.</string> + <string name="smp_explain_question">Αν εσείς και η επαφή σας έχετε ένα κοινό μυστικό που κανείς άλλος δεν γνωρίζει (κάτι σαν δικό σας αστείο ή απλώς τι φάγατε την τελευταία φορά που συναντηθήκατε) μπορείτε να χρησιμοποιήσετε αυτό το μυστικό για να επαληθεύσετε τα αποτυπώματά σας.\n\nΠροσφέρετε έναν υπαινιγμό ή μια ερώτηση για την επαφή σας, που θα απαντήσει με μια φράση στην οποία έχουν διαφοροποίηση τα πεζά από τα κεφαλαία.</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> @@ -427,4 +427,23 @@ <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_certificate_options">Επιλογές πιστοποιητικών</string> + <string name="pref_dont_trust_system_cas_title">Μη έμπιστες αρχές πιστοποίησης συστήματος</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> </resources> diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 639eddfa..109715e3 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -359,7 +359,7 @@ <string name="could_not_change_password">No se puede cambiar la contraseña</string> <string name="otr_session_not_started">Enviar mensaje para empezar una conversación cifrada</string> <string name="ask_question">Haz una pregunta</string> - <string name="smp_explain_question">Si tu contacto y tú tenéis un secreto en común que nadie más sabe (como un pequeño juego o broma o simplemente lo que tomasteis para comer la última vez os visteis) podéis usar ese secreto para verificar la huella digital de cada uno.\n\nPuedes usar una sugerencia o pregunta para hacer a tu contacto que deberá responder distinguiendo mayúsculas y minúsculas.</string> + <string name="smp_explain_question">Si tu contacto y tú tenéis un secreto en común que nadie más sabe (como una broma o simplemente lo que tomasteis para comer la última vez que os visteis) podéis usar ese secreto para verificar la huella digital de cada uno.\n\nPuedes usar una sugerencia o pregunta para hacer a tu contacto que deberá responder distinguiendo mayúsculas y minúsculas.</string> <string name="smp_explain_answer">Tu contacto quiere verificar tu huella digital a través de un secreto compartido. Te hace la siguiente sugerencia o pregunta para ese secreto.</string> <string name="shared_secret_hint_should_not_be_empty">La pregunta no puede ser vacía</string> <string name="shared_secret_can_not_be_empty">El secreto compartido no puede ser vacío</string> @@ -427,4 +427,23 @@ <string name="no_application_found_to_display_location">No se ha encontrado ninguna aplicación para mostrar la ubicación</string> <string name="location">Ubicación</string> <string name="received_location">Ubicación recibida</string> + <string name="title_undo_swipe_out_conversation">Conversación cerrada</string> + <string name="title_undo_swipe_out_muc">Has salido de la conversación</string> + <string name="pref_certificate_options">Opciones de Certificados</string> + <string name="pref_dont_trust_system_cas_title">No confiar en los CAs del sistema</string> + <string name="pref_dont_trust_system_cas_summary">Todos los certificados deben ser aprobados manualmente</string> + <string name="pref_remove_trusted_certificates_title">Eliminar Certificados</string> + <string name="pref_remove_trusted_certificates_summary">Eliminar manualmente certificados aceptados</string> + <string name="toast_no_trusted_certs">No aceptar certificados manualmente</string> + <string name="dialog_manage_certs_title">Eliminar Certificados</string> + <string name="dialog_manage_certs_positivebutton">Eliminar seleccionados</string> + <string name="dialog_manage_certs_negativebutton">Cancelar</string> + <plurals name="toast_delete_certificates"> + <item quantity="one">%d certificado eliminado</item> + <item quantity="other">%d certificados eliminados</item> + </plurals> + <plurals name="select_contact"> + <item quantity="one">Seleccionado %d contacto</item> + <item quantity="other">Seleccionados %d contactos</item> + </plurals> </resources> diff --git a/src/main/res/values-eu/strings.xml b/src/main/res/values-eu/strings.xml index 4d81c1bf..ac66bfc1 100644 --- a/src/main/res/values-eu/strings.xml +++ b/src/main/res/values-eu/strings.xml @@ -427,4 +427,23 @@ <string name="no_application_found_to_display_location">Kokapena erakutsi dezakeen aplikaziorik ez da aurkitu</string> <string name="location">Kokapena</string> <string name="received_location">Kokapena jaso da</string> + <string name="title_undo_swipe_out_conversation">Elkarrizketa itxi egin da</string> + <string name="title_undo_swipe_out_muc">Konferentzia utzi egin da</string> + <string name="pref_certificate_options">Ziurtagirien aukerak</string> + <string name="pref_dont_trust_system_cas_title">Sistemaren CAtaz ez fidatu</string> + <string name="pref_dont_trust_system_cas_summary">Ziurtagiri guztiak eskuz onartu behar dira</string> + <string name="pref_remove_trusted_certificates_title">Ziurtagiriak kendu</string> + <string name="pref_remove_trusted_certificates_summary">Eskuz ezabatu onartutako ziurtagiriak</string> + <string name="toast_no_trusted_certs">Ez dago eskuz onartutako ziurtagiririk</string> + <string name="dialog_manage_certs_title">Ziurtagiriak kendu</string> + <string name="dialog_manage_certs_positivebutton">Aukeratutakoak ezabatu</string> + <string name="dialog_manage_certs_negativebutton">Utzi</string> + <plurals name="toast_delete_certificates"> + <item quantity="one">Ziurtagiri %d ezabatua</item> + <item quantity="other">%d ziurtagiri ezabatuak</item> + </plurals> + <plurals name="select_contact"> + <item quantity="one">Hautatu kontaktu %d</item> + <item quantity="other">Hautatu %d kontaktu</item> + </plurals> </resources> diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 69440362..4baef67f 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -359,7 +359,6 @@ <string name="could_not_change_password">Impossible de changer le mot de passe</string> <string name="otr_session_not_started">Envoyez un message pour commencer la conversation chiffrée</string> <string name="ask_question">Poser une question</string> - <string name="smp_explain_question">Si vous et votre contact avez un secret en commun connu par vous deux uniquement (comme une histoire personnelle ou même comme ce que vous avez mangé lors de votre dernière rencontre) vous pouvez utiliser ce secret pour vérifier vos empreintes respectives.\n\nVous envoyez un indice ou une question à votre contact qui devra répondre en faisant attention à la casse.</string> <string name="smp_explain_answer">Votre contact voudrait vous identifier de manière sûre grâce à un secret commun. Il vous envoie le message ou la question suivante.</string> <string name="shared_secret_hint_should_not_be_empty">Votre indice ne devrait pas être vide</string> <string name="shared_secret_can_not_be_empty">Votre secret ne peut être vide</string> @@ -427,4 +426,8 @@ <string name="no_application_found_to_display_location">Aucune application trouvée pour afficher la position</string> <string name="location">Position</string> <string name="received_location">Position reçue</string> + <plurals name="select_contact"> + <item quantity="one">%d contact séléctionné</item> + <item quantity="other">%d contacts séléctionnés</item> + </plurals> </resources> diff --git a/src/main/res/values-id/strings.xml b/src/main/res/values-id/strings.xml new file mode 100644 index 00000000..69bd0911 --- /dev/null +++ b/src/main/res/values-id/strings.xml @@ -0,0 +1,447 @@ +<?xml version='1.0' encoding='UTF-8'?> +<resources> + <string name="action_settings">Pengaturan</string> + <string name="action_add">Percakapan Baru</string> + <string name="action_accounts">Pengaturan Akun</string> + <string name="action_end_conversation">Akhiri Percakapan</string> + <string name="action_contact_details">Detil Kontak</string> + <string name="action_muc_details">Detil conference</string> + <string name="action_secure">Amankan Percakapan</string> + <string name="action_add_account">Tambah Akun</string> + <string name="action_edit_contact">Ubah Nama</string> + <string name="action_add_phone_book">Tambah ke buku telepon</string> + <string name="action_delete_contact">Hapus dari roster</string> + <string name="action_block_contact">Blokir kontak</string> + <string name="action_unblock_contact">Batal blokir kontak</string> + <string name="action_block_domain">Blokir domain</string> + <string name="action_unblock_domain">Batal blokir domain</string> + <string name="title_activity_manage_accounts">Pengaturan Akun</string> + <string name="title_activity_settings">Pengaturan</string> + <string name="title_activity_conference_details">Conference Detil</string> + <string name="title_activity_contact_details">Kontak Detil</string> + <string name="title_activity_sharewith">Bagikan dengan Conversation</string> + <string name="title_activity_start_conversation">Mulai Percakapan</string> + <string name="title_activity_choose_contact">Pilih kontak</string> + <string name="title_activity_block_list">Daftar blokir</string> + <string name="just_now">sekarang</string> + <string name="minute_ago">1 min lalu</string> + <string name="minutes_ago">%d min lalu</string> + <string name="unread_conversations">Percakapan belum dibaca</string> + <string name="sending">mengirim...</string> + <string name="encrypted_message">Menerjemahkan pesan. Tunggu sebentar...</string> + <string name="nick_in_use">Nick ini sudah digunakan</string> + <string name="admin">Administrator</string> + <string name="owner">Pemilik</string> + <string name="moderator">Moderator</string> + <string name="participant">Peserta</string> + <string name="visitor">Pengunjung</string> + <string name="remove_contact_text">Apakah Anda ingin menghapus %s dari roster Anda? Percakapan yang terkait dengan kontak ini tidak akan dihapus.</string> + <string name="block_contact_text">Apakah Anda ingin memblokir pesan dari %s?</string> + <string name="unblock_contact_text">Apakah Anda ingin membuka blokir %s dan membolehkannya untuk mengirim pesan?</string> + <string name="block_domain_text">Blokir semua kontak dari %s?</string> + <string name="unblock_domain_text">Batalkan blokir semua kontak dari %s?</string> + <string name="contact_blocked">Kontak terblokir</string> + <string name="remove_bookmark_text">Apakah Anda ingin menghapus %s dari bookmark? Percakapan yang terkait dengan bookmark ini tidak akan dihapus.</string> + <string name="register_account">Daftarkan akun baru di server</string> + <string name="change_password_on_server">Ganti password di server</string> + <string name="share_with">Bagikan dengan...</string> + <string name="start_conversation">Mulai Percakapan</string> + <string name="invite_contact">Undang Kontak</string> + <string name="contacts">Kontak</string> + <string name="cancel">Batal</string> + <string name="set">Atur</string> + <string name="add">Tambah</string> + <string name="edit">Ubah</string> + <string name="delete">Hapus</string> + <string name="block">Blokir</string> + <string name="unblock">Batalkan blokir</string> + <string name="save">Simpan</string> + <string name="ok">YA</string> + <string name="crash_report_title">Percakapan terhenti</string> + <string name="crash_report_message">Dengan mengirimkan laporan kesalahan Anda membantu pengembangan Conversations\n<b>Perhatian:</>Conversations akan menggunakan akun XMPP Anda untuk mengirim laporan kesalahan untuk pengembang.</string> + <string name="send_now">Kirim sekarang</string> + <string name="send_never">Jangan tanya lagi</string> + <string name="problem_connecting_to_account">Tidak terhubung ke akun</string> + <string name="problem_connecting_to_accounts">Tidak bisa terhubung ke banyak akun</string> + <string name="touch_to_fix">Sentuh untuk mengatur akun</string> + <string name="attach_file">Sisipkan berkas</string> + <string name="not_in_roster">Kontak tidak ada dalam roster Anda. Ingin menambahkannya?</string> + <string name="add_contact">Tambah kontak</string> + <string name="send_failed">pengiriman gagal</string> + <string name="send_rejected">ditolak</string> + <string name="preparing_image">Mempersiapkan gambar untuk transmisi</string> + <string name="action_clear_history">Bersihkan riwayat</string> + <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_plain_text_message">Kirim pesan teks biasa</string> + <string name="send_otr_message">Kirim pesan terenskripsi OTR</string> + <string name="send_pgp_message">Kirim pesan terenskripsi OpenPGP</string> + <string name="your_nick_has_been_changed">Nick kamu telah dirubah</string> + <string name="download_image">Unduh Gambar</string> + <string name="send_unencrypted">Kirim tidak terenkripsi</string> + <string name="decryption_failed">Dekripsi gagal. Mungkin Anda tidak memiliki kunci pribadi yang tepat.</string> + <string name="openkeychain_required">OpenKeychain</string> + <string name="openkeychain_required_long">Conversations menggunakan app pihak ke-3 bernama <b>OpenKeychain</b> untuk mengenkripsi dan menerjemahkan pesan dan mengorganisir kunci anda.\n\nOpenKeychain berlisensi GPLv3 dan tersedia fi F-Droid dan Google play.\n\n<small>(Silahkan mulai ulang Conversations setelah menginstall.)</small></string> + <string name="restart">Mulai ulang</string> + <string name="install">Pasang</string> + <string name="offering">menawarkan...</string> + <string name="waiting">menunggu...</string> + <string name="no_pgp_key">Tidak ada kunci OpenPGP ditemukan</string> + <string name="contact_has_no_pgp_key">Conversations tidak dapat mengenkripsi pesan Anda karena kontak tidak mengumumkan kunci publiknya.\n\n<small>Silakan meminta kontak Anda untuk menyetel OpenPGP</small></string> + <string name="no_pgp_keys">Tidak ada kunci OpenPGP ditemukan</string> + <string name="contacts_have_no_pgp_keys">Percakapan tidak dapat mengenkripsi pesan Anda karena kontak tidak mengumumkan kunci publik mereka.\n\n<small>Silakan meminta kontak Anda untuk setup OpenPGP.</small></string> + <string name="encrypted_message_received"><i>Pesan terenkripsi diterima. Sentuh untuk membongkar dan melihatnya.</i></string> + <string name="pref_general">Umum</string> + <string name="pref_xmpp_resource">XMPP resource</string> + <string name="pref_xmpp_resource_summary">Identifikasi nama klien ini dengan</string> + <string name="pref_accept_files">Terima berkas</string> + <string name="pref_accept_files_summary">Otomatis menerima berkas lebih kecil dari...</string> + <string name="pref_notification_settings">Pengaturan Notifikasi</string> + <string name="pref_notifications">Notifikasi</string> + <string name="pref_notifications_summary">Notifikasikan jika pesan baru tiba</string> + <string name="pref_vibrate">Getar</string> + <string name="pref_vibrate_summary">Juga aktifkan getaran bila pesan baru tiba</string> + <string name="pref_sound">Suara</string> + <string name="pref_sound_summary">mainkan suara saat menerima notifikasi</string> + <string name="pref_conference_notifications">Notifikasi Conference</string> + <string name="pref_conference_notifications_summary">Selalu memberitahukan bila pesan conference baru diterima daripada hanya dicetak tebal</string> + <string name="pref_notification_grace_period">Tenggang waktu pemberitahuan</string> + <string name="pref_notification_grace_period_summary">Nonaktifkan pemberitahuan untuk waktu yang singkat setelah salinan diterima</string> + <string name="pref_advanced_options">Opsi Lanjutan</string> + <string name="pref_never_send_crash">Jangan kirim laporan kerusakan</string> + <string name="pref_never_send_crash_summary">Dengan mengirimkan kesalahan Anda membantu pengembangan Aplikasi Conversations</string> + <string name="pref_confirm_messages">Konfirmasi Pesan</string> + <string name="pref_confirm_messages_summary">Biarkan kontak Anda tahu kapan Anda telah menerima dan membaca pesan</string> + <string name="pref_ui_options">Opsi Tampilan</string> + <string name="openpgp_error">OpenKeychain melaporkan kesalahan</string> + <string name="error_decrypting_file">I/O Error menerjemahkan berkas</string> + <string name="accept">Menerima</string> + <string name="error">Sebuah kesalahan terjadi</string> + <string name="pref_grant_presence_updates">Memberikan perubahan kehadiran</string> + <string name="pref_grant_presence_updates_summary">Terlebih dahulu meminta dan berlangganan kehadiran untuk kontak Anda buat</string> + <string name="subscriptions">Langganan</string> + <string name="your_account">Akun anda</string> + <string name="keys">Kunci</string> + <string name="send_presence_updates">Kirim pembaruan kehadiran</string> + <string name="receive_presence_updates">Terima pembaruan kehadiran</string> + <string name="ask_for_presence_updates">Tanya untuk pembaruan kehadiran</string> + <string name="attach_choose_picture">Pilih gambar</string> + <string name="attach_take_picture">Ambil gambar</string> + <string name="preemptively_grant">Ijinkan permintaan berlangganan</string> + <string name="error_not_an_image_file">Berkas yang anda pilih bukan gambar</string> + <string name="error_compressing_image">Terjadi kesalahan saat mengubah berkas gambar</string> + <string name="error_file_not_found">Berkas tidak ditemukan</string> + <string name="error_io_exception">Kesalahan Umum I/O. Mungkin Anda kehabisan ruang penyimpanan?</string> + <string name="error_security_exception_during_image_copy">Aplikasi yang digunakan untuk memilih gambar tidak memberikan izin untuk membaca file.\n\n <small>Gunakan file manager yang berbeda untuk memilih gambar</small></string> + <string name="account_status_unknown">Tidak diketahui</string> + <string name="account_status_disabled">Sementara dimatikan</string> + <string name="account_status_online">Online</string> + <string name="account_status_connecting">Menghubungkan\u2026</string> + <string name="account_status_offline">Offline</string> + <string name="account_status_unauthorized">Tidak mendapat izin</string> + <string name="account_status_not_found">Server tidak ditemukan</string> + <string name="account_status_no_internet">Tidak ada koneksi</string> + <string name="account_status_regis_fail">Registrasi gagal</string> + <string name="account_status_regis_conflict">Username telah digunakan</string> + <string name="account_status_regis_success">Registrasi berhasil</string> + <string name="account_status_regis_not_sup">Server tidak mendukung pendaftaran akun.</string> + <string name="account_status_security_error">Kesalahan keamanan</string> + <string name="account_status_incompatible_server">Server tidak cocok</string> + <string name="encryption_choice_none">Teks biasa</string> + <string name="encryption_choice_otr">OTR</string> + <string name="encryption_choice_pgp">OpenPGP</string> + <string name="mgmt_account_edit">Ubah akun</string> + <string name="mgmt_account_delete">Hapus akun</string> + <string name="mgmt_account_disable">Sementara dimatikan</string> + <string name="mgmt_account_publish_avatar">Publikasikan avatar</string> + <string name="mgmt_account_publish_pgp">Publikasikan kunci OpenPGP</string> + <string name="mgmt_account_enable">Aktifkan Akun</string> + <string name="mgmt_account_are_you_sure">Apakah Anda yakin.?</string> + <string name="mgmt_account_delete_confirm_text">Jika Anda menghapus akun, semua data percakapan Anda di Conversation akan hilang.</string> + <string name="attach_record_voice">Rekam suara</string> + <string name="account_settings_jabber_id">Jabber ID</string> + <string name="account_settings_password">Password</string> + <string name="account_settings_example_jabber_id">username@example.com</string> + <string name="account_settings_confirm_password">Ketik ulang password</string> + <string name="password">Password</string> + <string name="confirm_password">Ketik ulang password</string> + <string name="passwords_do_not_match">Password tidak sama</string> + <string name="invalid_jid">Jabber ID tidak valid</string> + <string name="error_out_of_memory">Memori habis. Gambar terlalu besar</string> + <string name="add_phone_book_text">Apakah anda ingin menambahkan %s ke daftar kontak anda?</string> + <string name="contact_status_online">online</string> + <string name="contact_status_free_to_chat">bebas untuk chatting</string> + <string name="contact_status_away">pergi</string> + <string name="contact_status_extended_away">pergi lama</string> + <string name="contact_status_do_not_disturb">jangan ganggu</string> + <string name="contact_status_offline">offline</string> + <string name="muc_details_conference">Conference</string> + <string name="muc_details_other_members">Member lainnya</string> + <string name="server_info_show_more">Info Server</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)</string> + <string name="server_info_available">tersedia</string> + <string name="server_info_unavailable">tidak tersedia</string> + <string name="missing_public_keys">Pemberitahuan kunci publik tidak ditemukan</string> + <string name="last_seen_now">terakhir terlihat sekarang</string> + <string name="last_seen_min">terakhir terlihat 1 menit lalu</string> + <string name="last_seen_mins">terlihat %d menit lalu</string> + <string name="last_seen_hour">terlihat 1 jam lalu</string> + <string name="last_seen_hours">terlihat %d jam lalu</string> + <string name="last_seen_day">terlihat 1 hari lalu</string> + <string name="last_seen_days">terlihat %d hari lalu</string> + <string name="never_seen">tidak pernah terlihat</string> + <string name="install_openkeychain">Pesan terenskripsi. Pasang OpenKeychain untuk menerjemahkan</string> + <string name="unknown_otr_fingerprint">Sidik OTR tidak diketahui</string> + <string name="openpgp_messages_found">pesan terkunci OpenPGP ditemukan</string> + <string name="reception_failed">Penerimaan gagal</string> + <string name="your_fingerprint">Fingerprint Anda</string> + <string name="otr_fingerprint">OTR fingerprint</string> + <string name="verify">Verifikasi</string> + <string name="decrypt">Deskripsi</string> + <string name="conferences">Conferences</string> + <string name="search">Cari</string> + <string name="create_contact">Buat Kontak</string> + <string name="join_conference">Gabung Conference</string> + <string name="delete_contact">Hapus Kontak</string> + <string name="view_contact_details">Lihat detil kontak</string> + <string name="block_contact">Blokir kontak</string> + <string name="unblock_contact">Lepas blokir kontak</string> + <string name="create">Buat</string> + <string name="contact_already_exists">Kontak ini sudah ada</string> + <string name="join">Gabung</string> + <string name="conference_address">Alamat conference</string> + <string name="conference_address_example">room@conference.example.com</string> + <string name="save_as_bookmark">Simpan sebagai bookmark</string> + <string name="delete_bookmark">Hapus bookmark</string> + <string name="bookmark_already_exists">Bookmark ini sudah ada</string> + <string name="you">Anda</string> + <string name="action_edit_subject">Ubah subjek conference</string> + <string name="conference_not_found">Conference tidak ditemukan</string> + <string name="leave">Tinggalkan</string> + <string name="contact_added_you">Kontak ditambahkan ke daftar anda</string> + <string name="add_back">Tambah kembali</string> + <string name="contact_has_read_up_to_this_point">%s telah membaca hingga disini</string> + <string name="publish">Publikasi</string> + <string name="touch_to_choose_picture">Sentuh Avatar untuk memilih gambar dari gallery</string> + <string name="publish_avatar_explanation">Harap dicatat: Setiap orang yang berlangganan update kehadiran Anda akan diizinkan untuk melihat gambar ini.</string> + <string name="publishing">Mempublikasi...</string> + <string name="error_publish_avatar_server_reject">Server tidak mengijinkan publikasi Anda</string> + <string name="error_publish_avatar_converting">Sesuatu yang salah terjadi ketika mengkonversi gambar anda</string> + <string name="error_saving_avatar">Tidak dapat menyimpan Avatar ke memori</string> + <string name="or_long_press_for_default">(Tekan yang lama untuk mengembalikan semula)</string> + <string name="error_publish_avatar_no_server_support">Server Anda tidak mendukung publikasi Avatar</string> + <string name="private_message">berbisik</string> + <string name="private_message_to">kepada %s</string> + <string name="send_private_message_to">Kirim pesan pribadi ke %s</string> + <string name="connect">Hubungkan</string> + <string name="account_already_exists">Akun ini sudah ada</string> + <string name="next">Selanjutnya</string> + <string name="server_info_session_established">Sesi saat didirikan</string> + <string name="additional_information">Informasi tambahan</string> + <string name="skip">Lewati</string> + <string name="disable_notifications">Nonaktifkan notifikasi</string> + <string name="disable_notifications_for_this_conversation">Nonaktifkan notifikasi untuk percakapan ini</string> + <string name="notifications_disabled">Notifikasi telah dimatikan</string> + <string name="enable">Aktifkan</string> + <string name="conference_requires_password">Conference membutuhkan password</string> + <string name="enter_password">Masukan password</string> + <string name="missing_presence_updates">Pembaruan kehadiran hilang dari kontak</string> + <string name="request_presence_updates">Silakan meminta pembaruan kehadiran dari kontak Anda lebih dulu.\n\n<small>Ini akan digunakan untuk menentukan (klien) mana yang digunakan dikontak Anda.</small></string> + <string name="request_now">Request sekarang</string> + <string name="delete_fingerprint">Hapus sidik jari</string> + <string name="sure_delete_fingerprint">Apakah anda yakin menghapus sidik jari?</string> + <string name="ignore">Abaikan</string> + <string name="without_mutual_presence_updates"><b>Perhatian</b> Mengirim ini tanpa kehadiran sesama pembaruan bisa menyebabkan masalah tak terduga.\n\n<small>Pergi ke kontak untuk memverifikasi langganan kehadiran anda.</small></string> + <string name="pref_encryption_settings">Pengaturan enskripsi</string> + <string name="pref_force_encryption">Paksa enskripsi end-to-end</string> + <string name="pref_force_encryption_summary">Selalu mengirim pesan terenkripsi (kecuali untuk conferences)</string> + <string name="pref_dont_save_encrypted">jangan simpan pesan terenskripsi</string> + <string name="pref_dont_save_encrypted_summary">Peringatan: Hal ini bisa mengakibatkan hilangnya pesan</string> + <string name="pref_expert_options">Pengaturan lanjutan</string> + <string name="pref_expert_options_summary">Harap berhati-hati dengan ini</string> + <string name="title_activity_about">Tentang Conversations</string> + <string name="pref_about_conversations_summary">Build dan informasi lisensi</string> + <string name="title_pref_quiet_hours">Waktu sunyi</string> + <string name="title_pref_quiet_hours_start_time">Waktu mulai</string> + <string name="title_pref_quiet_hours_end_time">Waktu selesai</string> + <string name="title_pref_enable_quiet_hours">Aktifkan waktu sunyi</string> + <string name="pref_quiet_hours_summary">Pemberitahuan akan disunyukan ketika jam sunyi.</string> + <string name="pref_use_larger_font">Perbesar ukuran huruf</string> + <string name="pref_use_larger_font_summary">Gunakan ukuran huruf lebih besar diseluruh aplikasi</string> + <string name="pref_use_send_button_to_indicate_status">Tombol kirim menunjukan statusnya</string> + <string name="pref_use_indicate_received">Permintaan penerimaan pesan</string> + <string name="pref_use_indicate_received_summary">Pesan yang diterima akan ditambahkan centang hijau jika didukung</string> + <string name="pref_use_send_button_to_indicate_status_summary">Warnai tombol kirim untuk mengindikasikan status kontak</string> + <string name="pref_expert_options_other">Lainnya</string> + <string name="pref_conference_name">nama Conference</string> + <string name="pref_conference_name_summary">Gunakan subjek \'room\' daripada JID untuk mengidentifikasi conferences</string> + <string name="toast_message_otr_fingerprint">sidik jari OTR disalin ke clipboard!</string> + <string name="conference_banned">Anda ditendang dari conference ini</string> + <string name="conference_members_only">Conference ini hanya untuk member terdaftar</string> + <string name="conference_kicked">Anda telah ditendang dari conference ini</string> + <string name="using_account">menggunakan akun %s</string> + <string name="checking_image">Mengecek gambar di host HTTP</string> + <string name="image_file_deleted">Berkas gambar telah dihapus</string> + <string name="not_connected_try_again">Anda tidak terhubung. Coba lagi nanti</string> + <string name="check_image_filesize">Cek ukuran berkas gambar</string> + <string name="message_options">Opsi pesan</string> + <string name="copy_text">Salin teks</string> + <string name="copy_original_url">Salin URL asli</string> + <string name="send_again">Kirim lagi</string> + <string name="image_url">URL gambar</string> + <string name="message_text">Pesan teks</string> + <string name="url_copied_to_clipboard">URL disalin ke clipboard</string> + <string name="message_copied_to_clipboard">Pesan disalin ke clipboard</string> + <string name="image_transmission_failed">pengiriman gambar gagal</string> + <string name="scan_qr_code">Pindai kode QR</string> + <string name="show_qr_code">Tampilkan kode QR</string> + <string name="show_block_list">Tampilkan daftar blokir</string> + <string name="account_details">Detil akun</string> + <string name="verify_otr">Verifikasi OTR</string> + <string name="remote_fingerprint">Remote Sidik jari</string> + <string name="scan">pindai</string> + <string name="or_touch_phones">(atau menyentuh telepon)</string> + <string name="smp">Socialist Millionaire Protocol</string> + <string name="shared_secret_hint">Petunjuk atau Pertanyaan</string> + <string name="shared_secret_secret">Rahasia bersama</string> + <string name="confirm">Konfirmasi</string> + <string name="in_progress">Sedang diproses</string> + <string name="respond">Menanggapi</string> + <string name="failed">Gagal</string> + <string name="secrets_do_not_match">Rahasia tidak match</string> + <string name="try_again">Coba lagi</string> + <string name="finish">Selesai</string> + <string name="verified">Terverifikasi!</string> + <string name="smp_requested">Kontak meminta verifikasi SMP</string> + <string name="no_otr_session_found">Tidak ada sesi OTR yang valid ditemukan!</string> + <string name="conversations_foreground_service">Percakapan</string> + <string name="pref_keep_foreground_service">Jaga layanan di latar depan</string> + <string name="pref_keep_foreground_service_summary">Cegah sistem operasi mematikan koneksi</string> + <string name="choose_file">Pilih berkas</string> + <string name="receiving_x_file">Menerima %1$s (%2$d%% terselesaikan)</string> + <string name="download_x_file">Mengunduh %s</string> + <string name="file">berkas</string> + <string name="open_x_file">Buka %s</string> + <string name="sending_file">mengirim (%1$d%% terselesaikan)</string> + <string name="preparing_file">Menyiapkan berkas untuk transmisi</string> + <string name="x_file_offered_for_download">%s ditawarkan untuk mengunduh</string> + <string name="cancel_transmission">batalkan pengiriman</string> + <string name="file_transmission_failed">pengiriman berkas gagal</string> + <string name="file_deleted">Berkas sudah dihapus</string> + <string name="no_application_found_to_open_file">Tidak ditemukan aplikasi untuk membuka berkas</string> + <string name="could_not_verify_fingerprint">Tidak dapat verifikasi fingerprint</string> + <string name="manually_verify">Verifikasi secara manual</string> + <string name="are_you_sure_verify_fingerprint">Yakin untuk memferifikasi OTR fingerprint kontak Anda?</string> + <string name="pref_show_dynamic_tags">Tampilkan tag dinamis</string> + <string name="pref_show_dynamic_tags_summary">Tampilan read-only tag di bawah kontak</string> + <string name="enable_notifications">Aktifkan notifikasi</string> + <string name="conference_with">Buat conference dengan...</string> + <string name="no_conference_server_found">Tidak ada server conference ditemukan</string> + <string name="conference_creation_failed">Pembuatan conference gagal!</string> + <string name="conference_created">Conference dibuat!</string> + <string name="secret_accepted">Rahasia disetujui!</string> + <string name="reset">Ulang</string> + <string name="account_image_description">Avatar akun</string> + <string name="copy_otr_clipboard_description">Salin OTR fingerprint ke clipboard</string> + <string name="fetching_history_from_server">Mengambil data dari server</string> + <string name="no_more_history_on_server">Tidak ada data lagi di server</string> + <string name="updating">Merubah...</string> + <string name="password_changed">Password diganti!</string> + <string name="could_not_change_password">Tidak dapat mengubah password</string> + <string name="otr_session_not_started">Kirim pesan untuk memulai obrolan dienkripsi</string> + <string name="ask_question">Bertanya</string> + <string name="smp_explain_question">Jika Anda dan kontak Anda memiliki rahasia yang sama yang tidak ada orang lain yang tahu (seperti sebuah lelucon atau hanya apa yang Anda punya untuk makan siang terakhir kali Anda bertemu) Anda dapat menggunakan rahasia itu untuk memverifikasi sidik jari masing-masing.\n\nAnda memberikan petunjuk atau pertanyaan untuk kontak yang akan merespon dengan jawaban case-sensitive.</string> + <string name="smp_explain_answer">Kontak Anda ingin memverifikasi sidik jari Anda dengan menantang Anda dengan rahasia bersama. Kontak Anda memberikan petunjuk berikut atau pertanyaan untuk rahasia itu.</string> + <string name="shared_secret_hint_should_not_be_empty">Petunjuk Anda tidak boleh kosong</string> + <string name="shared_secret_can_not_be_empty">Rahasia bersama Anda tidak boleh kosong</string> + <string name="manual_verification_explanation">Hati-hati membandingkan sidik jari yang ditunjukkan di bawah dengan sidik jari kontak Anda.\nAnda dapat mengunakan layanan komunikasi terpercaya seperti e-mail terenskripsi atau panggilan telepon untuk menukarkannya.</string> + <string name="change_password">Ubah password</string> + <string name="current_password">Password sekarang</string> + <string name="new_password">Password baru</string> + <string name="password_should_not_be_empty">Password tidak boleh kosong</string> + <string name="enable_all_accounts">Aktifkan semua akun</string> + <string name="disable_all_accounts">Menonaktifkan semua account</string> + <string name="perform_action_with">Lakukan aksi dengan</string> + <string name="no_affiliation">Tidak ada afiliasi</string> + <string name="no_role">Tidak ada peran</string> + <string name="outcast">Orang buangan</string> + <string name="member">Member</string> + <string name="advanced_mode">Mode lanjut</string> + <string name="grant_membership">Memberikan keanggotaan</string> + <string name="remove_membership">Cabut keanggotaan</string> + <string name="grant_admin_privileges">Memberikan hak istimewa admin</string> + <string name="remove_admin_privileges">Mencabut hak istimewa admin</string> + <string name="remove_from_room">Hapus dari conference</string> + <string name="could_not_change_affiliation">Tidak bisa mengubah afiliasi %s</string> + <string name="ban_from_conference">Tendang dari conference</string> + <string name="removing_from_public_conference">Anda mencoba untuk menghapus %s dari sebuah conference publik. Satu-satunya cara untuk melakukannya adalah untuk menendang pengguna ini selamanya.</string> + <string name="ban_now">Tendang sekarang</string> + <string name="could_not_change_role">Tidak dapat merumah role %s</string> + <string name="public_conference">Conference umum</string> + <string name="private_conference">Rahasia, hanya member conference</string> + <string name="conference_options">Opsi conference</string> + <string name="members_only">Rahasia (Hanya member)</string> + <string name="non_anonymous">Non Anonymous</string> + <string name="modified_conference_options">Opsi conference dimodifikasi!</string> + <string name="could_not_modify_conference_options">Tidak dapat merubah pengaturan conference</string> + <string name="never">Tidak pernah</string> + <string name="thirty_minutes">30 menit</string> + <string name="one_hour">1 jam</string> + <string name="two_hours">2 jam</string> + <string name="eight_hours">8 jam</string> + <string name="until_further_notice">Sampai pemberitahuan selanjutnya</string> + <string name="pref_input_options">Opsi input</string> + <string name="pref_enter_is_send">Enter untuk mengirim</string> + <string name="pref_enter_is_send_summary">Gunakan enter untuk mengrim pesan</string> + <string name="pref_display_enter_key">Tampilkan masukan kunci</string> + <string name="pref_display_enter_key_summary">Mengubah kunci emoji untuk memasukan kunci</string> + <string name="audio">audio</string> + <string name="video">video</string> + <string name="image">Gambar</string> + <string name="pdf_document">Berkas PDF</string> + <string name="apk">Apl Android</string> + <string name="vcard">Kontak</string> + <string name="received_x_file">Diterima %s</string> + <string name="disable_foreground_service">Nonaktifkan layanan latar belakang</string> + <string name="touch_to_open_conversations">Sentuh untuk membuka Conversations</string> + <string name="avatar_has_been_published">Avatar telah diterbitkan!</string> + <string name="sending_x_file">Mengirim %s</string> + <string name="offering_x_file">Menawarkan %s</string> + <string name="hide_offline">Sembunyikan Offline</string> + <string name="disable_account">Nonaktifkan Akun</string> + <string name="contact_is_typing">%s sedang mengetik...</string> + <string name="contact_has_stopped_typing">%s telah berhenti mengetik</string> + <string name="pref_chat_states">Notifikasi ketik pesan</string> + <string name="pref_chat_states_summary">Biarkan kontak Anda tahu ketika Anda sedang menulis pesan baru</string> + <string name="send_location">Kirim lokasi</string> + <string name="show_location">Tampilkan lokasi</string> + <string name="no_application_found_to_display_location">Tidak ada aplikasi ditemukan untuk menampilkan lokasi</string> + <string name="location">Lokasi</string> + <string name="received_location">Lokasi yang diterima</string> + <string name="title_undo_swipe_out_conversation">Percakapan tertutup</string> + <string name="title_undo_swipe_out_muc">Tinggalkan conference</string> + <string name="pref_certificate_options">Opsi Sertifikat</string> + <string name="pref_dont_trust_system_cas_title">Jangan percaya sistem CA</string> + <string name="pref_dont_trust_system_cas_summary">Semua sertifikat harus disetujui secara manual</string> + <string name="pref_remove_trusted_certificates_title">Hapus sertifikat</string> + <string name="pref_remove_trusted_certificates_summary">Hapus sertifikat yang disahkan secara manual</string> + <string name="toast_no_trusted_certs">Tidak ada sertifikat yang disahkan secara manual</string> + <string name="dialog_manage_certs_title">Hapus sertifikat</string> + <string name="dialog_manage_certs_positivebutton">Hapus seleksi</string> + <string name="dialog_manage_certs_negativebutton">Batal</string> + <plurals name="toast_delete_certificates"> + <item quantity="other">%d sertifikat dihapus</item> + </plurals> + <plurals name="select_contact"> + <item quantity="other">Pilih %d kontak</item> + </plurals> +</resources> diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index c32e9585..8960f60b 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -304,6 +304,7 @@ <string name="image_transmission_failed">Trasmissione dell’immagine fallita</string> <string name="scan_qr_code">Scansiona codice QR</string> <string name="show_qr_code">Mostra codice QR</string> + <string name="show_block_list">Mostra la black list</string> <string name="account_details">Dettagli utente</string> <string name="verify_otr">Verifica OTR</string> <string name="remote_fingerprint">Impronta remota</string> @@ -328,6 +329,7 @@ <string name="choose_file">Scegli file</string> <string name="receiving_x_file">Ricezione di %1$s file (%2$d%% completato)</string> <string name="download_x_file">Scarica %s</string> + <string name="file">file</string> <string name="open_x_file">Apri %s</string> <string name="sending_file">invio (%1$d%% completato)</string> <string name="preparing_file">Preparazione alla trasmissione del file</string> @@ -357,7 +359,7 @@ <string name="could_not_change_password">Impossibile cambiare la password</string> <string name="otr_session_not_started">Invia un messaggio per avviare una conversazione cifrata</string> <string name="ask_question">Fai una domanda</string> - <string name="smp_explain_question">Se tu ed il tuo contatto avete un segreto in comune che nessun’altro conosce (come uno scherzo o semplicemente ciò che avete mangiato a pranzo l’ultima volta che vi siete incontrati), potete usare quel segreto per dimostrare la vostra identità reciprocamente.\n\nFornisci un suggerimento o una domanda al tuo contatto che ti risponderà con una domanda Case Sensitive.</string> + <string name="smp_explain_question">Se condividi con il tuo contatto un segreto in comune non conosciuto da altri (come uno scherzo privato o semplicemente quel che avete mangiato l\'ultima volta insieme) potete usarlo per verificare le vostre fingerprint.\n\nInvia un suggerimento o una domanda al tuo contatto il quale dovrà rispondere con una risposta controllando le maiuscole.</string> <string name="smp_explain_answer">Il tuo contatto vorrebbe verificare la tua identità. Dovrai rispondere correttamente alla sua domanda con una risposta che condividete. Il tuo contatto ti ha fornito il suggerimento o la domanda seguente.</string> <string name="shared_secret_hint_should_not_be_empty">Il suggerimento non dovrebbe essere vuoto</string> <string name="shared_secret_can_not_be_empty">Il segreto condiviso non può essere vuoto</string> @@ -400,6 +402,46 @@ <string name="pref_input_options">Opzioni di ingresso</string> <string name="pref_enter_is_send">Invio invia</string> <string name="pref_enter_is_send_summary">Il tasto invio spedisce il messaggio</string> + <string name="pref_display_enter_key">Mostra il tasto invio</string> + <string name="pref_display_enter_key_summary">Cambia il tasto delle faccine nel tastodi invio</string> + <string name="audio">audio</string> + <string name="video">video</string> + <string name="image">immagine</string> <string name="pdf_document">Documento PDF</string> + <string name="apk">Applicazione Android</string> + <string name="vcard">Contatto</string> <string name="received_x_file">Ricevuto %s</string> + <string name="touch_to_open_conversations">Tocca per avviare Conversations</string> + <string name="avatar_has_been_published">Il tuo avatar è stato pubblicato!</string> + <string name="sending_x_file">Invio %s</string> + <string name="offering_x_file">Inviando %s</string> + <string name="hide_offline">Nascondi i contatti offline</string> + <string name="disable_account">Disabilita l\'account</string> + <string name="contact_is_typing">%s sta digitando...</string> + <string name="contact_has_stopped_typing">%s ha smesso di digitare</string> + <string name="pref_chat_states_summary">Permetti al tuo contatto di vedere quando stai digitando</string> + <string name="send_location">Invia la posizione</string> + <string name="show_location">Mostra la posizione</string> + <string name="no_application_found_to_display_location">Non è stata trovata alcuna applicazione per mostrare la posizione</string> + <string name="location">Posizione</string> + <string name="received_location">Posizione ricevuta</string> + <string name="title_undo_swipe_out_conversation">Conversazione interrotta</string> + <string name="title_undo_swipe_out_muc">Conferenza terminata</string> + <string name="pref_certificate_options">Opzioni per i certificati</string> + <string name="pref_dont_trust_system_cas_title">Non ti fidare delle CA di sistema</string> + <string name="pref_dont_trust_system_cas_summary">Tutti i certificati devono essere accettati manualmente</string> + <string name="pref_remove_trusted_certificates_title">Elimina i certificati</string> + <string name="pref_remove_trusted_certificates_summary">Cancella manualmente i certificati già accettati</string> + <string name="toast_no_trusted_certs">Non sono presenti certificati accettati manualmente</string> + <string name="dialog_manage_certs_title">Elimina i certificati</string> + <string name="dialog_manage_certs_positivebutton">Cancella la selezione</string> + <string name="dialog_manage_certs_negativebutton">Annulla</string> + <plurals name="toast_delete_certificates"> + <item quantity="one">Cancellato il %d certificato</item> + <item quantity="other">Cancellati %d certificati</item> + </plurals> + <plurals name="select_contact"> + <item quantity="one">Seleziona il %d contatto</item> + <item quantity="other">Selezionati %d contatti</item> + </plurals> </resources> diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml new file mode 100644 index 00000000..35fb5472 --- /dev/null +++ b/src/main/res/values-ja/strings.xml @@ -0,0 +1,447 @@ +<?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">OK</string> + <string name="crash_report_title">Conversations がクラッシュしました</string> + <string name="crash_report_message">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="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_plain_text_message">プレーンテキストを送信</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="download_image">画像のダウンロード</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="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">XMPP リソース</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_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_conference_notifications">会議通知</string> + <string name="pref_conference_notifications_summary">新しい会議メッセージが到着したとき、ハイライト表示ではなく、常に通知します</string> + <string name="pref_notification_grace_period">通知猶予期間</string> + <string name="pref_notification_grace_period_summary">カーボンコピーを受信した後、短時間、通知を無効にします</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">UI オプション</string> + <string name="openpgp_error">OpenKeychain がエラーを報告しました</string> + <string name="error_decrypting_file">ファイルの復号化中に I/O エラー</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="subscriptions">サブスクリプション</string> + <string name="your_account">あなたのアカウント</string> + <string name="keys">鍵</string> + <string name="send_presence_updates">参加アップデートを送信</string> + <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="preemptively_grant">事前にサブスクリプション要求を許可する</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="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_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="account_status_security_error">セキュリティ エラー</string> + <string name="account_status_incompatible_server">互換性のないサーバー</string> + <string name="encryption_choice_none">プレーンテキスト</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_disable">一時的に無効にする</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> + <string name="account_settings_jabber_id">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">これは有効な Jabber ID ではありません</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_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_mam">XEP-0313: メッセージ アーカイブ管理</string> + <string name="server_info_carbon_messages">XEP-0280: メッセージ カーボン</string> + <string name="server_info_csi">XEP-0352: クライアント状態表示</string> + <string name="server_info_blocking">XEP-0191: ブロッキング コマンド</string> + <string name="server_info_roster_version">XEP-0237: 名簿バージョニング</string> + <string name="server_info_stream_management">XEP-0198: ストリーム管理</string> + <string name="server_info_pep">XEP-0163: 個人イベントプロトコル (アバター)</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_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="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="verify">検証</string> + <string name="decrypt">復号化</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="add_back">戻りを追加</string> + <string name="contact_has_read_up_to_this_point">%s はここまで読みました</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="server_info_session_established">現在のセッションが確立</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">最初に連絡先から参加アップデートを要求してください。\n\n<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">強制的にエンドツーエンド暗号化を使用する</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="conference_banned">あなたはこの会議から禁止されています</string> + <string name="conference_members_only">この会議はメンバーのみです</string> + <string name="conference_kicked">あなたはこの会議からキックされました</string> + <string name="using_account">アカウント %s を使用</string> + <string name="checking_image">HTTP ホストの画像を確認中</string> + <string name="image_file_deleted">画像ファイルは削除されました</string> + <string name="not_connected_try_again">接続されていません。後でもう一度お試しください</string> + <string name="check_image_filesize">画像ファイルのサイズを確認</string> + <string name="message_options">メッセージオプション</string> + <string name="copy_text">テキストをコピー</string> + <string name="copy_original_url">元の URL をコピー</string> + <string name="send_again">再送</string> + <string name="image_url">画像 URL</string> + <string name="message_text">メッセージテキスト</string> + <string name="url_copied_to_clipboard">URL をクリップボードにコピーしました</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">ソーシャリスト ミリオネア プロトコル</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 セッションが見つかりません!</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_question">あなたと連絡先が、(内輪の冗談や、最後に会って食べた昼食などの) 他の誰も知らない共通の秘密を持っている場合、お互いのフィンガープリントを検証するために、その秘密を使用することができます。\n\nあなたはヒントまたは質問を提供して、連絡先は大文字と小文字を区別した答えで応答します。</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="members_only">プライベート (メンバーのみ)</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">1 時間</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">Android アプリ</string> + <string name="vcard">連絡先</string> + <string name="received_x_file">%s を受信しました</string> + <string name="disable_foreground_service">フォアグラウンド サービスを無効にする</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_certificate_options">証明書オプション</string> + <string name="pref_dont_trust_system_cas_title">システムの CA を信頼しない</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="other">%d 証明書を削除しました</item> + </plurals> + <plurals name="select_contact"> + <item quantity="other">%d 連絡先を選択</item> + </plurals> +</resources> diff --git a/src/main/res/values-ko/strings.xml b/src/main/res/values-ko/strings.xml new file mode 100644 index 00000000..d00ab0fd --- /dev/null +++ b/src/main/res/values-ko/strings.xml @@ -0,0 +1,447 @@ +<?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">Conversations가 작동 중지되었습니다 </string> + <string name="crash_report_message">Stack trace 정보를 보냄으로서 Conversations의 개발에 기여할 수 있습니다. 경고: 이것은 Stack trace 정보를 개발자에게 보내기 위해 당신의 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="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">이 대화의 모든 메세지를 삭제하시겠습니까? 경고: 이것은 다른 기기나 서버에 있는 메세지에는 영향을 미치지 않습니다. </string> + <string name="delete_messages">메세지 삭제 </string> + <string name="also_end_conversation">나중에 이 대화 끝내기 </string> + <string name="choose_presence">연락할 프레즌스 선택 </string> + <string name="send_plain_text_message">평문 메세지 전송 </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="download_image">이미지 다운로드 </string> + <string name="send_unencrypted">암호화하지 않고 전송 </string> + <string name="decryption_failed">복호화 실패. 올바른 개인 키를 가지고 있지 않은 것 같습니다. </string> + <string name="openkeychain_required">OpenKeychain </string> + <string name="openkeychain_required_long">Conversations는 메세지를 암호화 및 복호화하고 공개 키를 관리하기 위해 OpenKeychain이라는 제 3자 앱을 활용합니다. OpenKeychain은 GPLv3 라이센스를 사용하며 F-Droid와 Google Play에서 구하실 수 있습니다. (이후 Conversations를 재시작하세요) </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는 당신의 메세지를 암호화할 수 없습니다. OpenPGP를 설정하도록 당신의 연락처에게 물어보세요. </string> + <string name="no_pgp_keys">OpenPGP 키가 발견되지 않음 </string> + <string name="contacts_have_no_pgp_keys">당신의 연락처가 그들의 공개 키를 선언하지 않고 있기 때문에 Conversations는 당신의 메세지를 암호화할 수 없습니다. OpenPGP를 설정하도록 당신의 연락처에게 물어보세요. </string> + <string name="encrypted_message_received">암호화된 메세지 수신됨. 터치해서 복호화 및 열람하세요. </string> + <string name="pref_general">일반 </string> + <string name="pref_xmpp_resource">XMPP 자원 </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_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_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">Stack trace 정보를 보냄으로서 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="error_decrypting_file">파일 복호화 입출력 오류 </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="subscriptions">구독 </string> + <string name="your_account">당신의 계정 </string> + <string name="keys">키 </string> + <string name="send_presence_updates">프레즌스 업데이트 보내기 </string> + <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="preemptively_grant">구독 요청을 선제적으로 허가 </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">일반 입출력 오류. 저장소 공간이 부족한 것 같습니다.</string> + <string name="error_security_exception_during_image_copy">이 이미지를 선택하기 위해 사용한 앱이 이 파일을 읽는데 필요한 충분한 허가를 제공하지 않았습니다. 다른 파일 탐색기를 이용해 이미지를 선택하세요. </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_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="account_status_security_error">보안 오류 </string> + <string name="account_status_incompatible_server">호환되지 않는 서버 </string> + <string name="encryption_choice_none">평문 </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_disable">임시로 해제</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> + <string name="account_settings_jabber_id">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">올바른 Jabber ID가 아닙니다 </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_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_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) </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_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="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="verify">검증 </string> + <string name="decrypt">복호화 </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="add_back">Add back</string> + <string name="contact_has_read_up_to_this_point">%s 가 여기까지 읽었습니다 </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="server_info_session_established">현재 세션이 수립되었습니다 </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">먼저 연락처로부터 프레즌스 업데이트를 요청하세요. 이는 당신의 연락처가 어떤 클라이언트를 사용하는지 결정하는 데 사용됩니다. </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">경고: 상호간의 프레즌스 업데이트 없이 이것을 보내면 예기치 못한 문제를 발생시킬 수 있습니다. 당신의 프레즌스 구독을 검증하기 위해 연락처 상세 정보로 가세요. </string> + <string name="pref_encryption_settings">암호화 설정 </string> + <string name="pref_force_encryption">강제적인 종단간 암호화</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="conference_banned">당신은 이 회의에서 금지되었습니다 </string> + <string name="conference_members_only">이 회의는 멤버 전용입니다 </string> + <string name="conference_kicked">당신은 이 회의에서 추방되었습니다 </string> + <string name="using_account">using account %s</string> + <string name="checking_image">HTTP 호스트에서 이미지 확인중 </string> + <string name="image_file_deleted">이미지 파일이 삭제되었습니다 </string> + <string name="not_connected_try_again">접속중이 아닙니다. 다시 시도하세요. </string> + <string name="check_image_filesize">이미지 파일 크기 확인 </string> + <string name="message_options">메세지 설정 </string> + <string name="copy_text">텍스트 복사 </string> + <string name="copy_original_url">원본 URL 복사 </string> + <string name="send_again">다시 보내기 </string> + <string name="image_url">이미지 URL </string> + <string name="message_text">메세지 텍스트 </string> + <string name="url_copied_to_clipboard">URL이 클립보드에 복사되었습니다 </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">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 세션이 발견되지 않았습니다 </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_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">아래에 보이는 지문을 당신의 연락처의 지문과 세심하게 비교하세요. 당신은 암호화된 이메일이나 전화와 같은 믿을만한 통신수단으로 이것을 주고 받을 수 있습니다. </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="members_only">사설 (멤버 전용) </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">1시간 </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">엔터 키로 전송 </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">터치해서 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_certificate_options">인증 설정 </string> + <string name="pref_dont_trust_system_cas_title">시스템 CA를 신뢰하지 않음 </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="other">%d 인증서 삭제됨 </item> + </plurals> + <plurals name="select_contact"> + <item quantity="other">%d 연락처 선택 </item> + </plurals> +</resources> diff --git a/src/main/res/values-nl/strings.xml b/src/main/res/values-nl/strings.xml index 2b8c5501..2532130d 100644 --- a/src/main/res/values-nl/strings.xml +++ b/src/main/res/values-nl/strings.xml @@ -427,6 +427,21 @@ <string name="no_application_found_to_display_location">Geen applicatie gevonden om locatie weer te geven</string> <string name="location">Locatie</string> <string name="received_location">Locatie ontvangen</string> + <string name="title_undo_swipe_out_conversation">Gesprek gesloten</string> + <string name="title_undo_swipe_out_muc">Groepsgesprek verlaten</string> + <string name="pref_certificate_options">Certificaatopties</string> + <string name="pref_dont_trust_system_cas_title">Vertrouw geen systeem-CA\'s.</string> + <string name="pref_dont_trust_system_cas_summary">Alle certificaten moeten handmatig goedgekeurd worden</string> + <string name="pref_remove_trusted_certificates_title">Verwijder certificaten</string> + <string name="pref_remove_trusted_certificates_summary">Verwijder handmatig goedgekeurde certificaten</string> + <string name="toast_no_trusted_certs">Geen handmatig goedgekeurde certificaten</string> + <string name="dialog_manage_certs_title">Verwijder certificaten</string> + <string name="dialog_manage_certs_positivebutton">Verwijder selectie</string> + <string name="dialog_manage_certs_negativebutton">Annuleer</string> + <plurals name="toast_delete_certificates"> + <item quantity="one">%d certificaat verwijderd</item> + <item quantity="other">%d certificaten verwijderd</item> + </plurals> <plurals name="select_contact"> <item quantity="one">Selecteer %d contact</item> <item quantity="other">Selecteer %d contacten</item> diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 58dea13b..e1849357 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -5,8 +5,11 @@ <string name="action_accounts">Zarządzaj kontami</string> <string name="action_end_conversation">Zakończ konwersację</string> <string name="action_contact_details">Szczegóły kontaktu</string> - <string name="action_muc_details">Szczególy konferencji</string> + <string name="action_muc_details">Szczegóły konferencji</string> + <string name="action_secure">Konwersacja szyfrowana</string> <string name="action_add_account">Dodaj konto</string> + <string name="action_edit_contact">Edytuj nazwę</string> + <string name="action_add_phone_book">Dodaj do książki telefonicznej</string> <string name="action_delete_contact">Usuń z rostera</string> <string name="action_block_contact">Zablokuj kontakt</string> <string name="action_unblock_contact">Odblokuj kontakt</string> @@ -16,6 +19,7 @@ <string name="title_activity_settings">Ustawienia</string> <string name="title_activity_conference_details">Szczegóły konferencji</string> <string name="title_activity_contact_details">Szczegóły kontaktu</string> + <string name="title_activity_sharewith">Udostępnij w konwersacji</string> <string name="title_activity_start_conversation">Rozpocznij konwersację</string> <string name="title_activity_choose_contact">Wybierz kontakt</string> <string name="title_activity_block_list">Czarna lista</string> @@ -25,6 +29,7 @@ <string name="unread_conversations">nieprzeczytanych konwersacji</string> <string name="sending">wysyłanie...</string> <string name="encrypted_message">Deszyfrowanie wiadomości. Proszę czekać...</string> + <string name="nick_in_use">Nazwa jest już w użyciu</string> <string name="admin">Admin</string> <string name="owner">Właściciel</string> <string name="moderator">Moderator</string> @@ -36,12 +41,15 @@ <string name="block_domain_text">Zablokować wszystkie kontakty z %s?</string> <string name="unblock_domain_text">Odblokować wszystkie kontakty z %s?</string> <string name="contact_blocked">Kontakt zablokowany</string> + <string name="remove_bookmark_text">Czy usunąć zakładkę %s? Konwersacja powiązana z zakładką nie zostanie usunięta.</string> <string name="register_account">Zarejestruj nowe konto na serwerze</string> <string name="change_password_on_server">Zmień hasło na serwerze</string> + <string name="share_with">Udostępnij...</string> <string name="start_conversation">Rozpocznij konwersację</string> <string name="invite_contact">Zaproś kontakt</string> <string name="contacts">Kontakty</string> <string name="cancel">Anuluj</string> + <string name="set">Ustaw</string> <string name="add">Dodaj</string> <string name="edit">Edytuj</string> <string name="delete">Usuń</string> @@ -50,6 +58,7 @@ <string name="save">Zapisz</string> <string name="ok">Ok</string> <string name="crash_report_title">Conversations uległo awarii</string> + <string name="crash_report_message">Wysyłając ślady stosu pomagasz rozwijać Conversations\n<b>Uwaga:</b> Ślad stosu zostanie przesłany deweloperowi przy użyciu twojego konta XMPP.</string> <string name="send_now">Wyślij teraz</string> <string name="send_never">Nie pytaj ponownie</string> <string name="problem_connecting_to_account">Nie można połączyć się z kontem</string> @@ -60,30 +69,358 @@ <string name="add_contact">Dodaj kontakt</string> <string name="send_failed">wysyłanie nie powiodło się</string> <string name="send_rejected">odrzucono</string> + <string name="preparing_image">Przygotowywanie obrazu do wysłania</string> <string name="action_clear_history">Wyczyść historię</string> <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_plain_text_message">Wyślij wiadomość jawną</string> + <string name="send_otr_message">Wyślij zaszyfrowaną wiadomość (OTR)</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="download_image">Pobierz obraz</string> + <string name="send_unencrypted">Wyślij bez szyfrowania</string> + <string name="decryption_failed">Nie można odszyfrować. Sprawdź poprawność klucza prywatnego.</string> + <string name="openkeychain_required">OpenKeychain</string> + <string name="openkeychain_required_long">Conversations używa zewnętrznej aplikacji <b>OpenKeychain</b> do szyfrowania wiadomości i zarządzania kluczami publicznymi.\n\nOpenKeychain rozpowszechniany jest na licencji GPLv3 przez F-Droid lub Google Play.\n\n<small>(Zrestartuj Conversations po instalacji).</small></string> + <string name="restart">Zrestartuj</string> + <string name="install">Zainstaluj</string> + <string name="offering">oferowanie...</string> + <string name="waiting">oczekiwanie...</string> + <string name="no_pgp_key">Nie znaleziono klucza OpenPGP</string> + <string name="contact_has_no_pgp_key">Conversations nie może zaszyfrować wiadomości, ponieważ kontakt nie udostępnia klucza publicznego.\n\n<small>Zasugeruj rozmówcy instalację OpenPGP.</small></string> + <string name="no_pgp_keys">Nie znaleziono kluczy OpenPGP</string> + <string name="contacts_have_no_pgp_keys">Conversations nie może zaszyfrować wiadomości, ponieważ kontakty nie udostępniają kluczy publicznych.\n\n<small>Zasugeruj rozmówcom instalację OpenPGP.</small></string> + <string name="encrypted_message_received"><i>Otrzymano zaszyfrowaną wiadomość. Dotknij, aby odszyfrować i wyświetlić.</i></string> + <string name="pref_general">Główne</string> + <string name="pref_xmpp_resource">Zasób XMPP</string> + <string name="pref_xmpp_resource_summary">Nazwa identyfikująca urządzenie</string> + <string name="pref_accept_files">Akceptuj pliki</string> + <string name="pref_accept_files_summary">Automatycznie akceptuj pliki mniejsze niż...</string> + <string name="pref_notification_settings">Ustawienia powiadamiania</string> + <string name="pref_notifications">Powiadomienia</string> + <string name="pref_notifications_summary">Powiadamiaj, gdy nadejdzie wiadomość</string> + <string name="pref_vibrate">Wibracje</string> + <string name="pref_vibrate_summary">Wibruj, gdy nadejdzie wiadomość</string> + <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 konferencji</string> + <string name="pref_conference_notifications_summary">Zawsze powiadamiaj o nowej wiadomości w konferencji</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> + <string name="pref_never_send_crash">Nie wysyłaj raportów awarii</string> + <string name="pref_never_send_crash_summary">Wysyłając ślady stosu pomagasz rozwijać Conversations</string> + <string name="pref_confirm_messages">Potwierdzenia wiadomości</string> + <string name="pref_confirm_messages_summary">Powiadamiaj kontakty o otrzymaniu lub przeczytaniu wiadomości</string> + <string name="pref_ui_options">Ustawienia interfejsu</string> + <string name="openpgp_error">Wystąpił błąd OpenKeychain</string> + <string name="error_decrypting_file">Błąd podczas deszyfrowania pliku</string> + <string name="accept">Akceptuj</string> + <string name="error">Wystąpił błąd</string> + <string name="pref_grant_presence_updates">Zezwól na powiadomienia obecności</string> + <string name="pref_grant_presence_updates_summary">Automatycznie zezwalaj i pytaj o powiadomienia obecności, kiedy utworzysz kontakt</string> + <string name="subscriptions">Subskrypcje</string> + <string name="your_account">Twoje konto</string> + <string name="keys">Klucze</string> + <string name="send_presence_updates">Wysyłaj powiadomienia obecności</string> + <string name="receive_presence_updates">Otrzymuj powiadomienia obecności</string> + <string name="ask_for_presence_updates">Poproś o powiadomienia obecności</string> + <string name="attach_choose_picture">Wybierz obraz</string> + <string name="attach_take_picture">Zrób zdjęcie</string> + <string name="preemptively_grant">Automatyczne powiadomienia obecności</string> + <string name="error_not_an_image_file">Wybrany plik nie jest obrazem</string> + <string name="error_compressing_image">Błąd kompresji obrazu</string> + <string name="error_file_not_found">Nie odnaleziono pliku</string> + <string name="error_io_exception">Ogólny błąd wejścia/wyjścia</string> + <string name="error_security_exception_during_image_copy">Aplikacja użyta do wyboru obrazu nie zezwoliła na odczyt pliku.\n\n<small>Wybierz obraz przy użyciu innego menedżera plików</small></string> + <string name="account_status_unknown">nieznany</string> + <string name="account_status_disabled">Tymczasowo wyłączono</string> + <string name="account_status_online">Połączono</string> + <string name="account_status_connecting">Łączenie...</string> + <string name="account_status_offline">Rozłączono</string> + <string name="account_status_unauthorized">Błąd uwierzytelnienia</string> + <string name="account_status_not_found">Nie odnaleziono serwera</string> + <string name="account_status_no_internet">Brak połączenia</string> + <string name="account_status_regis_fail">Błąd rejestracji</string> + <string name="account_status_regis_conflict">Nazwa jest już w użyciu</string> + <string name="account_status_regis_success">Zarejestrowano pomyślnie</string> + <string name="account_status_regis_not_sup">Serwer nie umożliwia rejestracji</string> + <string name="account_status_security_error">Błąd zabezpieczeń</string> + <string name="account_status_incompatible_server">Serwer niekompatybilny</string> + <string name="encryption_choice_none">Tekst jawny</string> + <string name="encryption_choice_otr">OTR</string> + <string name="encryption_choice_pgp">OpenPGP</string> + <string name="mgmt_account_edit">Edytuj konto</string> + <string name="mgmt_account_delete">Usuń konto</string> + <string name="mgmt_account_disable">Wyłącz tymczasowo</string> + <string name="mgmt_account_publish_avatar">Publikuj awatar</string> + <string name="mgmt_account_publish_pgp">Udostępnij klucz publiczny OpenPGP</string> + <string name="mgmt_account_enable">Włącz konto</string> + <string name="mgmt_account_are_you_sure">Czy na pewno?</string> + <string name="mgmt_account_delete_confirm_text">Wraz z kontem zostanie nieodwracalnie usunięta powiązana historia konwersacji.</string> + <string name="attach_record_voice">Nagraj głos</string> + <string name="account_settings_jabber_id">Jabber ID</string> + <string name="account_settings_password">Hasło</string> + <string name="account_settings_example_jabber_id">username@example.com</string> + <string name="account_settings_confirm_password">Potwierdź hasło</string> + <string name="password">Hasło</string> + <string name="confirm_password">Potwierdź hasło</string> + <string name="passwords_do_not_match">Hasła są niezgodne</string> + <string name="invalid_jid">Wprowadzono niepoprawny Jabber ID</string> + <string name="error_out_of_memory">Brak pamięci, obraz jest za duży</string> + <string name="add_phone_book_text">Czy chcesz dodać kontakt %s do książki telefonicznej?</string> + <string name="contact_status_online">dostępny</string> + <string name="contact_status_free_to_chat">chętny do rozmowy</string> + <string name="contact_status_away">zaraz wracam</string> + <string name="contact_status_extended_away">będę później</string> + <string name="contact_status_do_not_disturb">nie przeszkadzać</string> + <string name="contact_status_offline">niedostępny</string> + <string name="muc_details_conference">Konferencja</string> + <string name="muc_details_other_members">Pozostali uczestnicy</string> + <string name="server_info_show_more">Informacje o serwerze</string> + <string name="server_info_mam">XEP-0313: MAM</string> + <string name="server_info_carbon_messages">XEP-0280: Kopie wiadomości</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)</string> + <string name="server_info_available">dostępny</string> + <string name="server_info_unavailable">niedostępny</string> + <string name="missing_public_keys">Brak informacji o kluczu publicznym</string> + <string name="last_seen_now">widziany chwilę temu</string> + <string name="last_seen_min">widziany minutę temu</string> + <string name="last_seen_mins">widziany %d minut(y) temu</string> + <string name="last_seen_hour">widziany godzinę temu</string> + <string name="last_seen_hours">widziany %d godzin(y) temu</string> + <string name="last_seen_day">widziany wczoraj</string> + <string name="last_seen_days">widziany %d dni temu</string> + <string name="never_seen">nigdy nie widziany</string> + <string name="install_openkeychain">Wiadomość zaszyfrowana. Zainstaluj OpenKeychain, żeby odszyfrować.</string> + <string name="unknown_otr_fingerprint">Nieznany odcisk klucza OTR</string> + <string name="openpgp_messages_found">Znaleziono wiadomości zaszyfrowane przez OpenPGP</string> + <string name="your_fingerprint">Twój odcisk klucza</string> + <string name="otr_fingerprint">Odcisk klucza OTR</string> + <string name="verify">Weryfikuj</string> + <string name="decrypt">Odszyfruj</string> + <string name="conferences">Konferencje</string> + <string name="search">Szukaj</string> + <string name="create_contact">Utwórz kontakt</string> + <string name="join_conference">Dołącz do konferencji</string> + <string name="delete_contact">Usuń kontakt</string> + <string name="view_contact_details">Szczegóły kontaktu</string> + <string name="block_contact">Zablokuj kontakt</string> + <string name="unblock_contact">Odblokuj kontakt</string> + <string name="create">Utwórz</string> + <string name="contact_already_exists">Kontakt już istnieje</string> + <string name="join">Dołącz</string> + <string name="conference_address">Adres konferencji</string> + <string name="conference_address_example">room@conference.example.com</string> + <string name="save_as_bookmark">Dodaj jako zakładkę</string> + <string name="delete_bookmark">Usuń zakładkę</string> + <string name="bookmark_already_exists">Zakładka już istnieje</string> + <string name="you">Ty</string> + <string name="action_edit_subject">Edytuj temat konferencji</string> + <string name="conference_not_found">Nie znaleziono konferencji</string> + <string name="leave">Opuść pokój</string> + <string name="contact_added_you">Kontakt został dodany do listy</string> + <string name="add_back">Dodaj ponownie</string> + <string name="contact_has_read_up_to_this_point">%s przeczytał do tego miejsca</string> + <string name="publish">Publikuj</string> + <string name="touch_to_choose_picture">Naciśnij awatar, żeby wybrać obraz z galerii</string> + <string name="publish_avatar_explanation">Uwaga: Obraz będzie widoczny dla wszystkich kontaktów, którym udostępniasz powiadomienia o obecności.</string> + <string name="publishing">Publikowanie...</string> + <string name="error_publish_avatar_server_reject">Serwer odrzucił żądanie publikacji</string> + <string name="error_publish_avatar_converting">Wystąpił błąd podczas konwersji obrazu</string> + <string name="error_saving_avatar">Nie udało się zapisać obrazu w pamięci urządzenia</string> + <string name="error_publish_avatar_no_server_support">Serwer nie udostępnia możliwości publikacji awatarów</string> + <string name="private_message_to">do %s</string> + <string name="send_private_message_to">Wyślij prywatną wiadomość do %s</string> + <string name="connect">Połącz</string> + <string name="account_already_exists">Konto już istnieje</string> + <string name="next">Dalej</string> + <string name="server_info_session_established">Połączono z serwerem</string> + <string name="additional_information">Dodatkowe informacje</string> + <string name="skip">Pomiń</string> + <string name="disable_notifications">Wyłącz powiadomienia</string> + <string name="disable_notifications_for_this_conversation">Wyłącz powiadomienia tej konwersacji</string> + <string name="notifications_disabled">Powiadomienia są wyłączone</string> + <string name="enable">Włącz</string> + <string name="conference_requires_password">Konferencja jest zabezpieczona hasłem</string> + <string name="enter_password">Wprowadź hasło</string> + <string name="missing_presence_updates">Kontakt nie udostępnia powiadomień o obecności</string> + <string name="request_now">Zażądaj teraz</string> + <string name="delete_fingerprint">Usuń odcisk klucza</string> + <string name="sure_delete_fingerprint">Czy na pewno chcesz usunąć odcisk klucza?</string> + <string name="ignore">Ignoruj</string> + <string name="pref_encryption_settings">Ustawienia szyfrowania</string> + <string name="pref_force_encryption">Wymuszaj szyfrowanie typu end-to-end</string> + <string name="pref_force_encryption_summary">Szyfruj wszystkie wiadomości (poza konferencjami)</string> + <string name="pref_dont_save_encrypted">Nie zapisuj zaszyfrowanych wiadomości</string> + <string name="pref_dont_save_encrypted_summary">Uwaga: Może powodować utratę wiadomości</string> + <string name="pref_expert_options">Ustawienia zaawansowane</string> + <string name="pref_expert_options_summary">Modyfikuj ustawienia ostrożnie</string> + <string name="title_activity_about">O Conversations</string> + <string name="pref_about_conversations_summary">Informacje o kompilacji i licencji</string> + <string name="title_pref_quiet_hours">Godziny ciszy</string> + <string name="title_pref_quiet_hours_start_time">Początek</string> + <string name="title_pref_quiet_hours_end_time">Koniec</string> + <string name="title_pref_enable_quiet_hours">Włącz godziny ciszy</string> + <string name="pref_quiet_hours_summary">Powiadomienia będą wyciszone w wybranym przedziale czasu</string> + <string name="pref_use_larger_font">Większy rozmiar czcionki</string> + <string name="pref_use_larger_font_summary">Używaj większego rozmiaru czcionki w aplikacji</string> + <string name="pref_use_send_button_to_indicate_status">Przycisk wysyłania wskazuje status</string> + <string name="pref_use_indicate_received">Raporty dostarczenia</string> + <string name="pref_use_indicate_received_summary">Jeżeli to możliwe, oznaczaj dostarczone wiadomości zielonym haczykiem</string> + <string name="pref_use_send_button_to_indicate_status_summary">Koloruj przycisk wysyłania w zależności od statusu kontaktu</string> + <string name="pref_expert_options_other">Inne opcje</string> + <string name="pref_conference_name">Nazwa konferencji</string> + <string name="pref_conference_name_summary">Nazywaj konferencję tematem zamiast Jabber ID</string> + <string name="toast_message_otr_fingerprint">Odcisk klucza OTR został skopiowany do schowka</string> + <string name="conference_banned">Zbanowano cię w konferencji</string> + <string name="conference_members_only">To jest zamknięty pokój</string> + <string name="conference_kicked">Wyrzucono cię z konferencji</string> + <string name="checking_image">Sprawdzanie obrazka na hoście HTTP</string> + <string name="image_file_deleted">Obraz został usunięty</string> + <string name="not_connected_try_again">Brak połączenia. Spróbuj ponownie później</string> + <string name="check_image_filesize">Sprawdź rozmiar pliku</string> + <string name="message_options">Opcje wiadomości</string> + <string name="copy_text">Skopiuj tekst</string> + <string name="copy_original_url">Skopiuj oryginalny URL</string> + <string name="send_again">Wyślij ponownie</string> + <string name="image_url">URL obrazu</string> + <string name="message_text">Treść wiadomości</string> + <string name="url_copied_to_clipboard">URL obrazu został skopiowany do schowka</string> + <string name="message_copied_to_clipboard">Wiadomość została skopiowana do schowka</string> + <string name="image_transmission_failed">Błąd podczas przesyłania obrazu</string> + <string name="scan_qr_code">Zeskanuj kod QR</string> + <string name="show_qr_code">Pokaż kod QR</string> + <string name="show_block_list">Wyświetl listę banów</string> + <string name="account_details">Szczegóły konta</string> + <string name="verify_otr">Weryfikuj OTR</string> + <string name="remote_fingerprint">Zdalny odcisk klucza</string> + <string name="or_touch_phones">(lub zetknij telefony)</string> + <string name="smp">Protokół socialist millionaire</string> + <string name="shared_secret_hint">Podpowiedź lub pytanie</string> + <string name="shared_secret_secret">Wspólny sekret</string> + <string name="confirm">Potwierdź</string> + <string name="in_progress">W toku</string> + <string name="respond">Odpowiedz</string> + <string name="secrets_do_not_match">Sekrety są niezgodne</string> + <string name="try_again">Spróbuj ponownie</string> + <string name="finish">Zakończ</string> + <string name="verified">Weryfikacja udana!</string> + <string name="smp_requested">Kontakt zażądał weryfikacji SMP</string> + <string name="no_otr_session_found">Brak ważnej sesji OTR!</string> + <string name="conversations_foreground_service">Conversations</string> + <string name="pref_keep_foreground_service">Usługa na pierwszym planie</string> + <string name="pref_keep_foreground_service_summary">Uniemożliwia systemowi przerwanie połączenia</string> + <string name="choose_file">Wybierz plik</string> + <string name="receiving_x_file">Odbieranie %1$s (ukończono %2$d%%)</string> + <string name="download_x_file">Pobierz %s</string> + <string name="file">plik</string> + <string name="open_x_file">Otwórz %s</string> + <string name="sending_file">Wysyłanie (ukończono %1$d%%)</string> + <string name="preparing_file">Przygotowywanie pliku do wysłania</string> + <string name="x_file_offered_for_download">Zaproponowano pobranie pliku %s</string> + <string name="cancel_transmission">Anuluj przesyłanie</string> + <string name="file_transmission_failed">Przesyłanie pliku nie powiodło się</string> + <string name="file_deleted">Plik został usunięty</string> + <string name="no_application_found_to_open_file">Nie odnaleziono aplikacji skojarzonej z typem pliku</string> + <string name="could_not_verify_fingerprint">Weryfikacja odcisku klucza nieudana</string> + <string name="manually_verify">Weryfikuj ręcznie</string> + <string name="are_you_sure_verify_fingerprint">Czy na pewno chcesz zweryfikować odcisk klucza OTR kontaktu?</string> + <string name="pref_show_dynamic_tags">Etykiety kontaktów</string> + <string name="pref_show_dynamic_tags_summary">Wyświetlaj etykiety pod kontaktami</string> + <string name="enable_notifications">Włącz powiadomienia</string> + <string name="conference_with">Utwórz konferencję...</string> + <string name="no_conference_server_found">Nie odnaleziono serwera konferencji</string> + <string name="conference_creation_failed">Nie udało się utworzyć konferencji!</string> + <string name="conference_created">Konferencja została utworzona!</string> + <string name="secret_accepted">Sekret został zaakceptowany!</string> + <string name="reset">Resetuj</string> + <string name="account_image_description">Awatar konta</string> + <string name="copy_otr_clipboard_description">Skopiuj odcisk klucza OTR do schowka</string> + <string name="fetching_history_from_server">Pobieranie historii z serwera</string> + <string name="no_more_history_on_server">Koniec historii na serwerze</string> + <string name="updating">Aktualizowanie...</string> + <string name="password_changed">Hasło zostało zmienione!</string> + <string name="could_not_change_password">Nie udało się zmienić hasła</string> + <string name="otr_session_not_started">Wyślij wiadomość, żeby rozpocząć szyfrowaną rozmowę</string> + <string name="ask_question">Zadaj pytanie</string> + <string name="smp_explain_question">Jeśli ty i twój kontakt macie jakiś wspólny sekret, którego nie zna nikt inny (żart znany tylko wam lub po prostu co jedliście ostatnim razem, gdy się widzieliście) możecie użyć tego sekretu by zweryfikować wzajemnie odciski swoich kluczy.\n\nPodasz podpowiedź lub pytanie dla twojego kontaktu i otrzymasz odpowiedź (wielkość liter ma znaczenie).</string> + <string name="smp_explain_answer">Twój kontakt chciałby zweryfikować odcisk Twojego klucza poprzez sprawdzenie znajomości wspólnego sekretu. Twój znajomy przedstawił następującą podpowiedź lub pytanie dotyczącego tego sekretu.</string> + <string name="shared_secret_hint_should_not_be_empty">Wskazówka nie powinna być pusta</string> + <string name="shared_secret_can_not_be_empty">Sekret nie może być pusty</string> + <string name="manual_verification_explanation">Ostrożnie porównaj odcisk klucza pokazany poniżej z odciskiem klucza twojego kontaktu.\nMożesz użyć bezpiecznego kanału komunikacji takiego, jak szyfrowany e-mail lub rozmowa telefoniczna, by wymienić odciski klucza.</string> <string name="change_password">Zmień hasło</string> <string name="current_password">Obecne hasło</string> <string name="new_password">Nowe hasło</string> <string name="password_should_not_be_empty">Hasło nie może być puste</string> <string name="enable_all_accounts">Aktywuj wszystkie konta</string> <string name="disable_all_accounts">Wyłącz wszystkie konta</string> + <string name="perform_action_with">Użyj</string> + <string name="no_affiliation">Brak stanowiska</string> + <string name="no_role">Brak funkcji</string> + <string name="outcast">Wykluczony</string> + <string name="member">Członek</string> + <string name="advanced_mode">Tryb zaawansowany</string> + <string name="grant_membership">Przyznaj członkostwo</string> + <string name="remove_membership">Cofnij członkostwo</string> + <string name="grant_admin_privileges">Przyznaj uprawnienia administratora</string> + <string name="remove_admin_privileges">Odbierz uprawnienia administratora</string> + <string name="remove_from_room">Usuń z konferencji</string> + <string name="could_not_change_affiliation">Nie udało się zmienić stanowiska dla %s</string> + <string name="ban_from_conference">Zbanuj uczestnika konferencji</string> + <string name="removing_from_public_conference">Próbujesz usunąć %s z publicznego pokoju. Jedyny sposób, by to zrobić, to wykluczyć tego użytkownika na zawsze.</string> + <string name="ban_now">Zbanuj teraz</string> + <string name="could_not_change_role">Nie udało się zmienić funkcji %s</string> + <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">Prywatna (tylko zaakceptowani)</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> <string name="thirty_minutes">30 minut</string> <string name="one_hour">1 godzina</string> <string name="two_hours">2 godziny</string> <string name="eight_hours">8 godzin</string> + <string name="until_further_notice">Ręcznie</string> + <string name="pref_input_options">Ustawienia wprowadzania</string> + <string name="pref_enter_is_send">Enter wysyła</string> <string name="pref_enter_is_send_summary">Używaj klawisza Enter do wysyłania wiadomości</string> <string name="pref_display_enter_key">Pokaż klawisz Enter</string> <string name="pref_display_enter_key_summary">Zamień klawisz emotikon na klawisz Enter</string> <string name="audio">plik audio</string> <string name="video">plik wideo</string> <string name="image">obraz</string> + <string name="pdf_document">Dokument PDF</string> + <string name="apk">Aplikacja Androida</string> <string name="vcard">Kontakt</string> <string name="received_x_file">Odebrano %s</string> + <string name="disable_foreground_service">Wyłącz podtrzymanie pierszego planu usługi</string> + <string name="touch_to_open_conversations">Dotknij, aby otworzyć Conversations</string> <string name="avatar_has_been_published">Avatar został pomyślnie opublikowany!</string> <string name="sending_x_file">Wysyłanie %s</string> <string name="offering_x_file">Oferowanie %s</string> <string name="hide_offline">Ukryj niedostępnych</string> + <string name="disable_account">Wyłącz konto</string> + <string name="contact_is_typing">%s pisze...</string> + <string name="contact_has_stopped_typing">%s przestał(a) pisać</string> + <string name="pref_chat_states">Powiadomienia pisania</string> + <string name="pref_chat_states_summary">Powiadamiaj rozmówcę, kiedy rozpoczynasz nową wiadomość</string> + <string name="send_location">Wyślij lokalizację</string> + <string name="show_location">Pokaż lokalizację</string> + <string name="no_application_found_to_display_location">Nie odnaleziono aplikacji do wyświetlenia lokalizacji</string> + <string name="location">Lokalizacja</string> + <string name="received_location">Otrzymano lokalizację</string> + <string name="title_undo_swipe_out_conversation">Zamknięto konwersację</string> + <string name="title_undo_swipe_out_muc">Opuszczono konferencję</string> + <string name="pref_dont_trust_system_cas_title">Nie ufaj certyfikatom systemowym</string> + <string name="pref_dont_trust_system_cas_summary">Wymagaj ręcznego potwierdzania certyfikatów</string> + <string name="dialog_manage_certs_negativebutton">Anuluj</string> </resources> diff --git a/src/main/res/values-ru/strings.xml b/src/main/res/values-ru/strings.xml index 4a96a7fe..2fc257f7 100644 --- a/src/main/res/values-ru/strings.xml +++ b/src/main/res/values-ru/strings.xml @@ -11,6 +11,10 @@ <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> @@ -18,6 +22,7 @@ <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> @@ -31,16 +36,25 @@ <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">Conversations был неожиданно остановлен</string> @@ -134,6 +148,8 @@ <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_security_error">Ошибка безопасности</string> + <string name="account_status_incompatible_server">Несовместимый сервер</string> <string name="encryption_choice_none">Без шифрования</string> <string name="encryption_choice_otr">OTR</string> <string name="encryption_choice_pgp">OpenPGP</string> @@ -164,8 +180,13 @@ <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_mam">XEP-0313: Сохранение сообщений в архив</string> <string name="server_info_carbon_messages">Дублирование сообщений</string> - <string name="server_info_stream_management">Управление потоками</string> + <string name="server_info_csi">XEP-0352: Индикатор Состояния Клиента</string> + <string name="server_info_blocking">XEP-0191: Команда Блокирования</string> + <string name="server_info_roster_version">XEP-0237: Управление версиями списков</string> + <string name="server_info_stream_management">XEP-0198: Управление потоками</string> <string name="server_info_pep">XEP-0163: PEP (Аватары)</string> <string name="server_info_available">доступен</string> <string name="server_info_unavailable">недоступен</string> @@ -192,6 +213,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> @@ -245,8 +268,184 @@ <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="conference_banned">Вы заблокированы в этой конференции</string> + <string name="conference_members_only">Эта конференция требует членства</string> + <string name="conference_kicked">Вы были удалены из конференции</string> + <string name="using_account">использовать учётную запись %s</string> + <string name="checking_image">Проверка изображения на узле HTTP</string> + <string name="image_file_deleted">Файл изображения был удалён</string> + <string name="not_connected_try_again">Вы неподключены. Попробуйте позже</string> + <string name="check_image_filesize">Проверить размер файла изображения</string> + <string name="message_options">Опции сообщения</string> + <string name="copy_text">Копировать текст</string> + <string name="copy_original_url">Копировать адрес ссылки</string> + <string name="send_again">Отправить ещё раз</string> + <string name="image_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-сессия не найдена!</string> + <string name="conversations_foreground_service">Диалоги</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_question">Если у вас и вашего собеседника есть общая тайна, о которой никто кроме вас не знает (например, шутка, понятная только \"своим\" или что вы ели на обед при последней вашей встрече) вы можете использовать эту тайну, чтобы подтвердить отпечаток друг друга.\n\nВы даёте подсказку или задаёте вопрос вашему контакту, а она даст регистрозависимый ответ.</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="members_only">Закрытый доступ (только для участников)</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">1 час</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">Показывать клавишу ввода</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">Приложение Android</string> + <string name="vcard">Контакт</string> + <string name="received_x_file">Получено %s</string> + <string name="disable_foreground_service">Отключить фоновую службу</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_certificate_options">Опции сертификата</string> + <string name="pref_dont_trust_system_cas_title">Не доверять системным УЦ</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="few">Удалено %d сертификатов</item> + <item quantity="other">Удалено %d сертификатов</item> + </plurals> + <plurals name="select_contact"> + <item quantity="one">Выбран %d контакт</item> + <item quantity="few">Выбрано %d контактов</item> + <item quantity="other">Выбрано %d контактов</item> + </plurals> </resources> diff --git a/src/main/res/values-sk/strings.xml b/src/main/res/values-sk/strings.xml index bca8d3d2..aa0fcff7 100644 --- a/src/main/res/values-sk/strings.xml +++ b/src/main/res/values-sk/strings.xml @@ -359,7 +359,7 @@ <string name="could_not_change_password">Nepodarilo sa zmeniť heslo</string> <string name="otr_session_not_started">Poslať správu pre spustenie šifrovaného chatu</string> <string name="ask_question">Položiť otázku</string> - <string name="smp_explain_question">Ak máte vy a váš kontakt spoločné tajomstvo, ktoré nikto iný nepozná (napríklad spoločný vtip alebo čo ste mali na obed na vašom poslednom stretnutí), môžete ho použiť na overenie vzájomných identifikátorov.\n\nZadáte pomôcku alebo otázku a kontakt na ňu správne odpovie. </string> + <string name="smp_explain_question">Ak máte vy a váš kontakt spoločné tajomstvo, ktoré nikto iný nepozná (napríklad nejaký spoločný vtip alebo len čo ste mali na obed, keď ste sa naposledy stretli), môžte použiť toto tajomstvo na overenie vzájomných identifikátorov. \n\nZadáte pomôcku alebo otázku pre váš kontakt, ktorý na ňu správne odpovie. </string> <string name="smp_explain_answer">Váš kontakt by chcel overiť váš identifikátor pomocou spoločného tajomstva. Váš kontakt zadal nasledujúcu pomôcku alebo otázku týkajúcu sa tajomstva. </string> <string name="shared_secret_hint_should_not_be_empty">Vaša pomôcka by nemala byť prázdna</string> <string name="shared_secret_can_not_be_empty">Vaše spoločné tajomstvo nemôže byť prázdne</string> @@ -422,4 +422,18 @@ <string name="contact_has_stopped_typing">%s prestal písať</string> <string name="pref_chat_states">Upozornenia pri písaní</string> <string name="pref_chat_states_summary">Upozorniť kontakt, keď píšete novú správu</string> + <string name="send_location">Poslať polohu</string> + <string name="show_location">Zobraziť polohu</string> + <string name="no_application_found_to_display_location">Nenašla sa aplikácia na zobrazenie polohy</string> + <string name="location">Poloha</string> + <string name="received_location">Prijatá poloha</string> + <string name="title_undo_swipe_out_conversation">Konverzácia zatvorená</string> + <string name="title_undo_swipe_out_muc">Opustil skupinovú konverzáciu</string> + <string name="pref_dont_trust_system_cas_title">Nedôverovať systému CAs</string> + <string name="pref_dont_trust_system_cas_summary">Všetky certifikáty musia byť ručne schválené</string> + <plurals name="select_contact"> + <item quantity="one">Vybrať %d kontaktu</item> + <item quantity="few">Vybrať %d kontaktu</item> + <item quantity="other">Vybrať %d kontaktov</item> + </plurals> </resources> diff --git a/src/main/res/values-sr/strings.xml b/src/main/res/values-sr/strings.xml index 479889b7..bcf420ba 100644 --- a/src/main/res/values-sr/strings.xml +++ b/src/main/res/values-sr/strings.xml @@ -302,8 +302,8 @@ <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">Очитај бар-код</string> - <string name="show_qr_code">Прикажи бар-код</string> + <string name="scan_qr_code">Очитај бар-кôд</string> + <string name="show_qr_code">Прикажи бар-кôд</string> <string name="show_block_list">Прикажи списак блокираних</string> <string name="account_details">Детаљи налога</string> <string name="verify_otr">Овери ОТР</string> @@ -427,4 +427,25 @@ <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_certificate_options">Опције сертификата</string> + <string name="pref_dont_trust_system_cas_title">Не веруј системским сертификационим телима</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="few">%d сертификата обрисана</item> + <item quantity="other">%d сертификата обрисано</item> + </plurals> + <plurals name="select_contact"> + <item quantity="one">Изабери %d контакт</item> + <item quantity="few">Изабери %d контакта</item> + <item quantity="other">Изабери %d контаката</item> + </plurals> </resources> diff --git a/src/main/res/values-sv/strings.xml b/src/main/res/values-sv/strings.xml index 69a66808..4f84110b 100644 --- a/src/main/res/values-sv/strings.xml +++ b/src/main/res/values-sv/strings.xml @@ -36,10 +36,10 @@ <string name="participant">Deltagare</string> <string name="visitor">Besökare</string> <string name="remove_contact_text">Vill du ta bort %s från din kontaktlista? Konversationer associerade med denna kontakt kommer inte tas bort.</string> - <string name="block_contact_text">Vill du blockera %s från att skicka dig meddelanden</string> + <string name="block_contact_text">Vill du blockera %s från att skicka dig meddelanden?</string> <string name="unblock_contact_text">Vill du avblockera %s och tillåta denne att skicka dig meddelanden?</string> - <string name="block_domain_text">Blockera alla kontakter från %s</string> - <string name="unblock_domain_text">Avblockera alla kontakter från %s</string> + <string name="block_domain_text">Blockera alla kontakter från %s?</string> + <string name="unblock_domain_text">Avblockera alla kontakter från %s?</string> <string name="contact_blocked">Kontakt blockerad</string> <string name="remove_bookmark_text">Vill du ta bort %s som bokmärke? Konversationer associerade med detta bokmärke kommer inte tas bort.</string> <string name="register_account">Registrera nytt konto på servern</string> @@ -74,7 +74,7 @@ <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 denna konversation efter</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_plain_text_message">Skicka meddelande i klartext</string> <string name="send_otr_message">Skicka OTR-krypterat meddelande</string> @@ -82,9 +82,9 @@ <string name="your_nick_has_been_changed">Ditt nick har ändrats</string> <string name="download_image">Ladda ner bild</string> <string name="send_unencrypted">Skicka okrypterat</string> - <string name="decryption_failed">Avkryptering gick fel. Du kanske inte har rätt privat nyckel.</string> + <string name="decryption_failed">Avkryptering misslyckades. Du har kanske kanske inte rätt privat nyckel.</string> <string name="openkeychain_required">OpenKeychain</string> - <string name="openkeychain_required_long">Conversations använder en tredjeparts applikation som heter <b>OpenKeychain</b> för att kryptera och avkryptera meddelanden och hantera dina publika nycklar.\n\nOpenKeychain är licensierat under GPLv3 och tillgängligt på F-Droid och Google Play.\n\n<small>(Starta om Conversations efter.)</small></string> + <string name="openkeychain_required_long">Conversations använder en tredjeparts-applikation som heter <b>OpenKeychain</b> för att kryptera och avkryptera meddelanden och hantera dina publika nycklar.\n\nOpenKeychain är licensierad under GPLv3 och tillgänglig på F-Droid och Google Play.\n\n<small>(Starta om Conversations efter installation.)</small></string> <string name="restart">Starta om</string> <string name="install">Installera</string> <string name="offering">erbjuder…</string> @@ -229,7 +229,7 @@ <string name="leave">Lämna</string> <string name="contact_added_you">Kontakten lade till dig i sin kontaktlista</string> <string name="add_back">Addera tillbaka</string> - <string name="contact_has_read_up_to_this_point">%s har läst fram hit</string> + <string name="contact_has_read_up_to_this_point">%s har läst hit</string> <string name="publish">Publicera</string> <string name="touch_to_choose_picture">Tryck på avatarbild för att välja en bild från bildgalleriet</string> <string name="publish_avatar_explanation">Notera: Alla som kan se dina tillgänglighetsuppdateringar kommer se denna bild.</string> @@ -427,6 +427,21 @@ <string name="no_application_found_to_display_location">Kunde inte hitta applikation för att visa position</string> <string name="location">Position</string> <string name="received_location">Mottog position</string> + <string name="title_undo_swipe_out_conversation">Konversation stängd</string> + <string name="title_undo_swipe_out_muc">Lämnade konferens</string> + <string name="pref_certificate_options">Certifikatalternativ</string> + <string name="pref_dont_trust_system_cas_title">Lita inte på systemets CAs</string> + <string name="pref_dont_trust_system_cas_summary">Alla certifikat måste manuellt godkännas</string> + <string name="pref_remove_trusted_certificates_title">Ta bort certifikat</string> + <string name="pref_remove_trusted_certificates_summary">Ta bort manuellt accepterade certifikat</string> + <string name="toast_no_trusted_certs">Inga manuellt accepterade certifikat</string> + <string name="dialog_manage_certs_title">Ta bort certifikat</string> + <string name="dialog_manage_certs_positivebutton">Ta bort val</string> + <string name="dialog_manage_certs_negativebutton">Avbryt</string> + <plurals name="toast_delete_certificates"> + <item quantity="one">%d certifikat borttaget</item> + <item quantity="other">%d certifikat borttagna</item> + </plurals> <plurals name="select_contact"> <item quantity="one">Välj %d kontakt</item> <item quantity="other">Välj %d kontakter</item> diff --git a/src/main/res/values-v21/dimens.xml b/src/main/res/values-v21/dimens.xml new file mode 100644 index 00000000..b689d100 --- /dev/null +++ b/src/main/res/values-v21/dimens.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <dimen name="elv_undo_bottom_offset">63dp</dimen> <!-- 48dp + 15dp --> + <dimen name="image_button_padding">12dp</dimen> +</resources>
\ No newline at end of file diff --git a/src/main/res/values-v21/themes.xml b/src/main/res/values-v21/themes.xml index 75539533..a1f3d0c5 100644 --- a/src/main/res/values-v21/themes.xml +++ b/src/main/res/values-v21/themes.xml @@ -10,25 +10,23 @@ <item name="TextSizeBody">14sp</item> <item name="TextSizeHeadline">20sp</item> - <item name="attr/icon_add_group">@drawable/ic_group_add_white_48dp</item> - <item name="attr/icon_add_person">@drawable/ic_person_add_white_48dp</item> + <item name="attr/icon_add_group">@drawable/ic_group_add_white_24dp</item> + <item name="attr/icon_add_person">@drawable/ic_person_add_white_24dp</item> <item name="attr/icon_cancel">@drawable/ic_cancel_white_24dp</item> - <item name="attr/icon_chat">@drawable/ic_chat_white_48dp</item> - <item name="attr/icon_copy">@drawable/ic_content_copy_grey600_36dp</item> - <item name="attr/icon_discard">@drawable/ic_delete_white_48dp</item> + <item name="attr/icon_copy">@drawable/ic_content_copy_grey600_24dp</item> + <item name="attr/icon_discard">@drawable/ic_delete_white_24dp</item> <item name="attr/icon_download">@drawable/ic_file_download_white_24dp</item> - <item name="attr/icon_edit">@drawable/ic_edit_white_48dp</item> - <item name="attr/icon_edit_dark">@drawable/ic_edit_grey600_36dp</item> - <item name="attr/icon_group">@drawable/ic_group_white_48dp</item> - <item name="attr/icon_new">@drawable/ic_add_white_48dp</item> - <item name="attr/icon_new_attachment">@drawable/ic_attach_file_white_48dp</item> - <item name="attr/icon_not_secure">@drawable/ic_lock_open_white_48dp</item> - <item name="attr/icon_refresh">@drawable/ic_refresh_white_48dp</item> - <item name="attr/icon_remove">@drawable/ic_remove_grey600_36dp</item> - <item name="attr/icon_search">@drawable/ic_search_white_48dp</item> - <item name="attr/icon_secure">@drawable/ic_lock_outline_white_48dp</item> - <item name="attr/icon_settings">@drawable/ic_settings_grey600_36dp</item> - <item name="attr/icon_import_export">@drawable/ic_import_export_white_48dp</item> + <item name="attr/icon_edit">@drawable/ic_edit_white_24dp</item> + <item name="attr/icon_edit_dark">@drawable/ic_edit_grey600_24dp</item> + <item name="attr/icon_group">@drawable/ic_group_white_24dp</item> + <item name="attr/icon_new">@drawable/ic_add_white_24dp</item> + <item name="attr/icon_new_attachment">@drawable/ic_attach_file_white_24dp</item> + <item name="attr/icon_not_secure">@drawable/ic_lock_open_white_24dp</item> + <item name="attr/icon_remove">@drawable/ic_delete_grey600_24dp</item> + <item name="attr/icon_search">@drawable/ic_search_white_24dp</item> + <item name="attr/icon_secure">@drawable/ic_lock_open_white_24dp</item> + <item name="attr/icon_settings">@drawable/ic_settings_grey600_24dp</item> + <item name="attr/icon_import_export">@drawable/ic_import_export_white_24dp</item> </style> diff --git a/src/main/res/values-w600dp/dimens.xml b/src/main/res/values-w585dp/dimens.xml index df6525e6..df6525e6 100644 --- a/src/main/res/values-w600dp/dimens.xml +++ b/src/main/res/values-w585dp/dimens.xml diff --git a/src/main/res/values-w960dp/dimens.xml b/src/main/res/values-w945dp/dimens.xml index 146c0e15..146c0e15 100644 --- a/src/main/res/values-w960dp/dimens.xml +++ b/src/main/res/values-w945dp/dimens.xml diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml index 79e920e9..95e80055 100644 --- a/src/main/res/values/dimens.xml +++ b/src/main/res/values/dimens.xml @@ -1,7 +1,8 @@ <resources> - <!-- Default screen margins, per the Android Design guidelines. --> - <dimen name="activity_horizontal_margin">8dp</dimen> - <dimen name="activity_vertical_margin">8dp</dimen> + <!-- Default screen margins, per the Android Design guidelines. --> + <dimen name="activity_horizontal_margin">8dp</dimen> + <dimen name="activity_vertical_margin">8dp</dimen> <dimen name="infocard_padding">16dp</dimen> <dimen name="conversations_overview_width">288dp</dimen> + <dimen name="image_button_padding">8dp</dimen> </resources> diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index af56c014..cc7727d2 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -296,6 +296,7 @@ \n\nhttps://developer.android.com/tools/support-library\n(Apache License, Version 2.0) \n\nhttps://github.com/zxing/zxing\n(Apache License, Version 2.0) \n\nhttps://github.com/google/material-design-icons\n(CC BY 4.0) + \n\nhttps://github.com/timroes/EnhancedListView\n(Apache License, Version 2.0) </string> <string name="title_pref_quiet_hours">Quiet Hours</string> <string name="title_pref_quiet_hours_start_time">Start time</string> @@ -386,7 +387,7 @@ <string name="could_not_change_password">Could not change password</string> <string name="otr_session_not_started">Send a message to start an encrypted chat</string> <string name="ask_question">Ask question</string> - <string name="smp_explain_question">If you and your contact have a secret in common that no one else knows (like an inside joke or simply what you had for lunch the last time you met) you can use that secret to verify each other\'s fingerprints.\n\nYou provide a hint or a question for your contact who will respond with a case-sensitive answer.</string> + <string name="smp_explain_question">If you and your contact have a secret in common that no one else knows (like an inside joke or simply what you had for lunch the last time you met) you can use that secret to verify each other’s fingerprints.\n\nYou provide a hint or a question for your contact who will respond with a case-sensitive answer.</string> <string name="smp_explain_answer">Your contact would like to verify your fingerprint by challenging you with a shared secret. Your contact provided the following hint or question for that secret.</string> <string name="shared_secret_hint_should_not_be_empty">Your hint should not be empty</string> <string name="shared_secret_can_not_be_empty">Your shared secret can not be empty</string> @@ -454,6 +455,21 @@ <string name="no_application_found_to_display_location">No application found to display location</string> <string name="location">Location</string> <string name="received_location">Received location</string> + <string name="title_undo_swipe_out_conversation">Conversation closed</string> + <string name="title_undo_swipe_out_muc">Left conference</string> + <string name="pref_certificate_options">Certificate options</string> + <string name="pref_dont_trust_system_cas_title">Don’t trust system CAs</string> + <string name="pref_dont_trust_system_cas_summary">All certificates must be manually approved</string> + <string name="pref_remove_trusted_certificates_title">Remove certificates</string> + <string name="pref_remove_trusted_certificates_summary">Delete manually approved certificates</string> + <string name="toast_no_trusted_certs">No manually approved certificates</string> + <string name="dialog_manage_certs_title">Remove certificates</string> + <string name="dialog_manage_certs_positivebutton">Delete selection</string> + <string name="dialog_manage_certs_negativebutton">Cancel</string> + <plurals name="toast_delete_certificates"> + <item quantity="one">%d certificate deleted</item> + <item quantity="other">%d certificates deleted</item> + </plurals> <plurals name="select_contact"> <item quantity="one">Select %d contact</item> <item quantity="other">Select %d contacts</item> diff --git a/src/main/res/xml/preferences.xml b/src/main/res/xml/preferences.xml index 8bf6eb87..417e60a4 100644 --- a/src/main/res/xml/preferences.xml +++ b/src/main/res/xml/preferences.xml @@ -36,7 +36,9 @@ android:title="@string/pref_chat_states" /> </PreferenceCategory> - <PreferenceCategory android:title="@string/pref_notification_settings" > + <PreferenceCategory + android:title="@string/pref_notification_settings" + android:key="notifications"> <CheckBoxPreference android:defaultValue="true" android:key="show_notification" @@ -45,7 +47,8 @@ <PreferenceScreen android:dependency="show_notification" android:summary="@string/pref_quiet_hours_summary" - android:title="@string/title_pref_quiet_hours"> + android:title="@string/title_pref_quiet_hours" + android:key="quiet_hours"> <CheckBoxPreference android:defaultValue="false" android:key="enable_quiet_hours" @@ -108,10 +111,13 @@ android:summary="@string/pref_show_dynamic_tags_summary" android:title="@string/pref_show_dynamic_tags" /> </PreferenceCategory> - <PreferenceCategory android:title="@string/pref_advanced_options" > + <PreferenceCategory + android:title="@string/pref_advanced_options" + android:key="advanced"> <PreferenceScreen android:summary="@string/pref_expert_options_summary" - android:title="@string/pref_expert_options" > + android:title="@string/pref_expert_options" + android:key="expert"> <PreferenceCategory android:title="@string/pref_encryption_settings" > <CheckBoxPreference android:defaultValue="false" @@ -136,6 +142,17 @@ android:title="@string/pref_display_enter_key" android:summary="@string/pref_display_enter_key_summary" /> </PreferenceCategory> + <PreferenceCategory android:title="@string/pref_certificate_options"> + <CheckBoxPreference + android:defaultValue="false" + android:key="dont_trust_system_cas" + android:title="@string/pref_dont_trust_system_cas_title" + android:summary="@string/pref_dont_trust_system_cas_summary" /> + <Preference + android:key="remove_trusted_certificates" + android:title="@string/pref_remove_trusted_certificates_title" + android:summary="@string/pref_remove_trusted_certificates_summary" /> + </PreferenceCategory> <PreferenceCategory android:title="@string/pref_expert_options_other" > <CheckBoxPreference android:defaultValue="false" |