From afffe0186865918f8ef637c0cdf2db92e45b4725 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 11 Sep 2020 15:57:34 +0200 Subject: [PATCH 01/37] add changelog for fastlane --- fastlane/metadata/android/en-US/changelogs/398.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 fastlane/metadata/android/en-US/changelogs/398.txt diff --git a/fastlane/metadata/android/en-US/changelogs/398.txt b/fastlane/metadata/android/en-US/changelogs/398.txt new file mode 100644 index 000000000..95280ea88 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/398.txt @@ -0,0 +1,4 @@ +* Search individual conversations +* Notify user if message delivery fails +* Remember display names (nicks) from Quicksy users across restarts +* Add button to start Orbot (Tor) from notification if necessary From b4805ac2c51574cd4486121950c4256af6398a43 Mon Sep 17 00:00:00 2001 From: eta Date: Sun, 4 Oct 2020 14:53:13 +0100 Subject: [PATCH 02/37] Remove the ListSelectionManager / message body selection (fixes memory leak!) - When the `viewHolder.messageBody` `TextView` created by a `MessageAdapter` is set to selectable, it leaks an `android.widget.Editor` (because that editor registers a view observer that never gets unregistered). - This memory leak is really quite problematic, as the message adapter is used a lot! - Having the text be selectable is useless anyway, though; there isn't any way to select it (because long pressing just opens the context menu anyway). - It looks like the ListSelectionManager was meant to track selections across multiple messages. However, I'm not sure this feature ever gets used. - Accordingly, this commit removes the entire feature, thus fixing the memory leak (since no `Editor` objects are ever created). - It should also reduce memory usage in general, since we aren't attaching an `Editor` to every single textview we create. - A `TextView` only allocates an `Editor` if you ask it to do certain things, like make the text selectable or register custom selection callbacks. --- .../ui/adapter/MessageAdapter.java | 13 -- .../ui/widget/ListSelectionManager.java | 211 ------------------ 2 files changed, 224 deletions(-) delete mode 100644 src/main/java/eu/siacs/conversations/ui/widget/ListSelectionManager.java diff --git a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java index 02e925f7d..c6287034c 100644 --- a/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java +++ b/src/main/java/eu/siacs/conversations/ui/adapter/MessageAdapter.java @@ -66,7 +66,6 @@ import eu.siacs.conversations.ui.util.MyLinkify; import eu.siacs.conversations.ui.util.ViewUtil; import eu.siacs.conversations.ui.widget.ClickableMovementMethod; import eu.siacs.conversations.ui.widget.CopyTextView; -import eu.siacs.conversations.ui.widget.ListSelectionManager; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.EmojiWrapper; import eu.siacs.conversations.utils.Emoticons; @@ -87,7 +86,6 @@ public class MessageAdapter extends ArrayAdapter implements CopyTextVie private static final int DATE_SEPARATOR = 3; private static final int RTP_SESSION = 4; private final XmppActivity activity; - private final ListSelectionManager listSelectionManager = new ListSelectionManager(); private final AudioPlayer audioPlayer; private List highlightedTerm = null; private DisplayMetrics metrics; @@ -503,9 +501,7 @@ public class MessageAdapter extends ArrayAdapter implements CopyTextVie MyLinkify.addLinks(body, true); viewHolder.messageBody.setAutoLinkMask(0); viewHolder.messageBody.setText(EmojiWrapper.transform(body)); - viewHolder.messageBody.setTextIsSelectable(true); viewHolder.messageBody.setMovementMethod(ClickableMovementMethod.getInstance()); - listSelectionManager.onUpdate(viewHolder.messageBody, message); } else { viewHolder.messageBody.setText(""); viewHolder.messageBody.setTextIsSelectable(false); @@ -676,8 +672,6 @@ public class MessageAdapter extends ArrayAdapter implements CopyTextVie throw new AssertionError("Unknown view type"); } if (viewHolder.messageBody != null) { - listSelectionManager.onCreate(viewHolder.messageBody, - new MessageBodyActionModeCallback(viewHolder.messageBody)); viewHolder.messageBody.setCopyHandler(this); } view.setTag(viewHolder); @@ -875,13 +869,6 @@ public class MessageAdapter extends ArrayAdapter implements CopyTextVie activity.showInstallPgpDialog(); } - @Override - public void notifyDataSetChanged() { - listSelectionManager.onBeforeNotifyDataSetChanged(); - super.notifyDataSetChanged(); - listSelectionManager.onAfterNotifyDataSetChanged(); - } - private String transformText(CharSequence text, int start, int end, boolean forCopy) { SpannableStringBuilder builder = new SpannableStringBuilder(text); Object copySpan = new Object(); diff --git a/src/main/java/eu/siacs/conversations/ui/widget/ListSelectionManager.java b/src/main/java/eu/siacs/conversations/ui/widget/ListSelectionManager.java deleted file mode 100644 index 24f1cac8d..000000000 --- a/src/main/java/eu/siacs/conversations/ui/widget/ListSelectionManager.java +++ /dev/null @@ -1,211 +0,0 @@ -package eu.siacs.conversations.ui.widget; - -import android.os.Handler; -import android.os.Looper; -import android.os.Message; -import android.text.Selection; -import android.text.Spannable; -import android.view.ActionMode; -import android.view.Menu; -import android.view.MenuItem; -import android.widget.TextView; - -import java.lang.reflect.Field; -import java.lang.reflect.Method; - -public class ListSelectionManager { - - private static final int MESSAGE_SEND_RESET = 1; - private static final int MESSAGE_RESET = 2; - private static final int MESSAGE_START_SELECTION = 3; - private static final Field FIELD_EDITOR; - private static final Method METHOD_START_SELECTION; - private static final boolean SUPPORTED; - private static final Handler HANDLER = new Handler(Looper.getMainLooper(), new Handler.Callback() { - - @Override - public boolean handleMessage(Message msg) { - switch (msg.what) { - case MESSAGE_SEND_RESET: { - // Skip one more message queue loop - HANDLER.obtainMessage(MESSAGE_RESET, msg.obj).sendToTarget(); - return true; - } - case MESSAGE_RESET: { - final ListSelectionManager listSelectionManager = (ListSelectionManager) msg.obj; - listSelectionManager.futureSelectionIdentifier = null; - return true; - } - case MESSAGE_START_SELECTION: { - final StartSelectionHolder holder = (StartSelectionHolder) msg.obj; - holder.listSelectionManager.futureSelectionIdentifier = null; - startSelection(holder.textView, holder.start, holder.end); - return true; - } - } - return false; - } - }); - - static { - Field editor; - try { - editor = TextView.class.getDeclaredField("mEditor"); - editor.setAccessible(true); - } catch (Exception e) { - editor = null; - } - FIELD_EDITOR = editor; - Method startSelection = null; - if (editor != null) { - String[] startSelectionNames = {"startSelectionActionMode", "startSelectionActionModeWithSelection"}; - for (String startSelectionName : startSelectionNames) { - try { - startSelection = editor.getType().getDeclaredMethod(startSelectionName); - startSelection.setAccessible(true); - break; - } catch (Exception e) { - startSelection = null; - } - } - } - METHOD_START_SELECTION = startSelection; - SUPPORTED = FIELD_EDITOR != null && METHOD_START_SELECTION != null; - } - - private ActionMode selectionActionMode; - private Object selectionIdentifier; - private TextView selectionTextView; - private Object futureSelectionIdentifier; - private int futureSelectionStart; - private int futureSelectionEnd; - - public static boolean isSupported() { - return SUPPORTED; - } - - private static void startSelection(TextView textView, int start, int end) { - final CharSequence text = textView.getText(); - if (SUPPORTED && start >= 0 && end > start && textView.isTextSelectable() && text instanceof Spannable) { - final Spannable spannable = (Spannable) text; - start = Math.min(start, spannable.length()); - end = Math.min(end, spannable.length()); - Selection.setSelection(spannable, start, end); - try { - final Object editor = FIELD_EDITOR != null ? FIELD_EDITOR.get(textView) : textView; - METHOD_START_SELECTION.invoke(editor); - } catch (Exception e) { - } - } - } - - public void onCreate(TextView textView, ActionMode.Callback additionalCallback) { - final CustomCallback callback = new CustomCallback(textView, additionalCallback); - textView.setCustomSelectionActionModeCallback(callback); - } - - public void onUpdate(TextView textView, Object identifier) { - if (SUPPORTED) { - final ActionMode.Callback callback = textView.getCustomSelectionActionModeCallback(); - if (callback instanceof CustomCallback) { - final CustomCallback customCallback = (CustomCallback) textView.getCustomSelectionActionModeCallback(); - customCallback.identifier = identifier; - if (futureSelectionIdentifier == identifier) { - HANDLER.obtainMessage(MESSAGE_START_SELECTION, new StartSelectionHolder(this, - textView, futureSelectionStart, futureSelectionEnd)).sendToTarget(); - } - } - } - } - - public void onBeforeNotifyDataSetChanged() { - if (SUPPORTED) { - HANDLER.removeMessages(MESSAGE_SEND_RESET); - HANDLER.removeMessages(MESSAGE_RESET); - HANDLER.removeMessages(MESSAGE_START_SELECTION); - if (selectionActionMode != null) { - final CharSequence text = selectionTextView.getText(); - futureSelectionIdentifier = selectionIdentifier; - futureSelectionStart = Selection.getSelectionStart(text); - futureSelectionEnd = Selection.getSelectionEnd(text); - selectionActionMode.finish(); - selectionActionMode = null; - selectionIdentifier = null; - selectionTextView = null; - } - } - } - - public void onAfterNotifyDataSetChanged() { - if (SUPPORTED && futureSelectionIdentifier != null) { - HANDLER.obtainMessage(MESSAGE_SEND_RESET, this).sendToTarget(); - } - } - - private static class StartSelectionHolder { - - final ListSelectionManager listSelectionManager; - final TextView textView; - public final int start; - public final int end; - - StartSelectionHolder(ListSelectionManager listSelectionManager, TextView textView, - int start, int end) { - this.listSelectionManager = listSelectionManager; - this.textView = textView; - this.start = start; - this.end = end; - } - } - - private class CustomCallback implements ActionMode.Callback { - - private final TextView textView; - private final ActionMode.Callback additionalCallback; - Object identifier; - - CustomCallback(TextView textView, ActionMode.Callback additionalCallback) { - this.textView = textView; - this.additionalCallback = additionalCallback; - } - - @Override - public boolean onCreateActionMode(ActionMode mode, Menu menu) { - selectionActionMode = mode; - selectionIdentifier = identifier; - selectionTextView = textView; - if (additionalCallback != null) { - additionalCallback.onCreateActionMode(mode, menu); - } - return true; - } - - @Override - public boolean onPrepareActionMode(ActionMode mode, Menu menu) { - if (additionalCallback != null) { - additionalCallback.onPrepareActionMode(mode, menu); - } - return true; - } - - @Override - public boolean onActionItemClicked(ActionMode mode, MenuItem item) { - if (additionalCallback != null && additionalCallback.onActionItemClicked(mode, item)) { - return true; - } - return false; - } - - @Override - public void onDestroyActionMode(ActionMode mode) { - if (additionalCallback != null) { - additionalCallback.onDestroyActionMode(mode); - } - if (selectionActionMode == mode) { - selectionActionMode = null; - selectionIdentifier = null; - selectionTextView = null; - } - } - } -} \ No newline at end of file From 364502d1a3def0e8895c463b72c8f48e45508214 Mon Sep 17 00:00:00 2001 From: eta Date: Sun, 4 Oct 2020 15:02:55 +0100 Subject: [PATCH 03/37] Fix various memory leaks reported by LeakCanary - In some places, we weren't nulling out references to destroyed objects. This fixes that. - (These were all discovered via LeakCanary instrumentation, and the fixes are hopefully rather straightforward-looking.) --- .../conversations/ui/ConversationFragment.java | 8 ++++++++ .../ui/ConversationsOverviewFragment.java | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 7b231f7bf..6ca868ba8 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1048,6 +1048,14 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke return binding.getRoot(); } + @Override + public void onDestroyView() { + super.onDestroyView(); + Log.d(Config.LOGTAG,"ConversationFragment.onDestroyView()"); + messageListAdapter.setOnContactPictureClicked(null); + messageListAdapter.setOnContactPictureLongClicked(null); + messageListAdapter.setOnQuoteListener(null); + } private void quoteText(String text) { if (binding.textinput.isEnabled()) { diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java index ffbf6f7d9..b76caaec7 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationsOverviewFragment.java @@ -192,7 +192,7 @@ public class ConversationsOverviewFragment extends XmppFragment { } }; - private ItemTouchHelper touchHelper = new ItemTouchHelper(callback); + private ItemTouchHelper touchHelper; public static Conversation getSuggestion(Activity activity) { final Conversation exception; @@ -242,7 +242,20 @@ public class ConversationsOverviewFragment extends XmppFragment { throw new IllegalStateException("Trying to attach fragment to activity that is not an XmppActivity"); } } + @Override + public void onDestroyView() { + Log.d(Config.LOGTAG,"ConversationsOverviewFragment.onDestroyView()"); + super.onDestroyView(); + this.binding = null; + this.conversationsAdapter = null; + this.touchHelper = null; + } + @Override + public void onDestroy() { + Log.d(Config.LOGTAG,"ConversationsOverviewFragment.onDestroy()"); + super.onDestroy(); + } @Override public void onPause() { Log.d(Config.LOGTAG,"ConversationsOverviewFragment.onPause()"); @@ -278,6 +291,7 @@ public class ConversationsOverviewFragment extends XmppFragment { }); this.binding.list.setAdapter(this.conversationsAdapter); this.binding.list.setLayoutManager(new LinearLayoutManager(getActivity(),LinearLayoutManager.VERTICAL,false)); + this.touchHelper = new ItemTouchHelper(this.callback); this.touchHelper.attachToRecyclerView(this.binding.list); return binding.getRoot(); } From fdfac102e28db6956ecb71f70695e5dde036f17a Mon Sep 17 00:00:00 2001 From: nico Date: Tue, 6 Oct 2020 14:15:16 +0200 Subject: [PATCH 04/37] spelling * various spelling fixes --- CHANGELOG.md | 13 ++++++------- README.md | 12 ++++++------ 2 files changed, 12 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 532d3c0b9..be92a9db7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -419,10 +419,9 @@ * Icons for attach menu ### Version 1.16.2 -* change mam catchup strategie. support mam:1 +* change mam catchup strategy. support mam:1 * bug fixes - ### Version 1.16.1 * UI performance fixes * bug fixes @@ -472,7 +471,7 @@ * bug fixes ### Version 1.14.6 -* make error notification dismissable +* make error notification dismissible * bug fixes @@ -496,7 +495,7 @@ * bug fixes ### Version 1.14.0 -* Improvments for N +* Improvements for N * Quick Reply to Notifications on N * Don't download avatars and files when data saver is on * bug fixes @@ -674,7 +673,7 @@ ### Version 1.7.0 * CAPTCHA support -* SASL EXTERNAL (client certifiates) +* SASL EXTERNAL (client certificates) * fetching MUC history via MAM * redownload deleted files from HTTP hosts * Expert setting to automatically set presence @@ -782,7 +781,7 @@ * accept more ciphers ### Version 1.0 -* MUC controls (Affiliaton changes) +* MUC controls (Affiliation changes) * Added download button to notification * Added check box to hide offline contacts * Use Material theme and icons on Android L @@ -888,7 +887,7 @@ * XEP-0333. Mark whether the other party has read your messages * Delayed messages are now tagged properly * Share images from the Gallery -* Infinit history scrolling +* Infinite history scrolling * Mark the last used presence in presence selection dialog ### Version 0.3 diff --git a/README.md b/README.md index c3d115eab..dab8c7b92 100644 --- a/README.md +++ b/README.md @@ -145,7 +145,7 @@ Maybe you attempted to use the Jabber ID `test@b.tld` because `a.tld` doesn’t ### I get 'Stream opening error'. What does that mean? -In most cases this error is caused by ejabberd advertising support for TLSv1.3 but not properly supporting it. This can happen if the openssl version on the server already supports TLSv1.3 but the fast\_tls wrapper library used by ejabberd not (properly) support it. Upgrading fast\_tls and ejabberd or - theoretically - downgrading openssl should fix the issue. A work around is to explicity disable TLSv1.3 support in the ejabberd configuration. More information can be found on [this issue on the ejabberd issue tracker](https://github.com/processone/ejabberd/issues/2614). +In most cases this error is caused by ejabberd advertising support for TLSv1.3 but not properly supporting it. This can happen if the OpenSSL version on the server already supports TLSv1.3 but the fast\_tls wrapper library used by ejabberd not (properly) support it. Upgrading fast\_tls and ejabberd or - theoretically - downgrading OpenSSL should fix the issue. A work around is to explicitly disable TLSv1.3 support in the ejabberd configuration. More information can be found on [this issue on the ejabberd issue tracker](https://github.com/processone/ejabberd/issues/2614). #### I’m getting this annoying permanent notification @@ -153,7 +153,7 @@ Starting with Conversations 2.3.6 Conversations releases distributed over the Go However you can disable the notification via settings of the operating system. (Not settings in Conversations.) -**The battery consumption and the entire behaviour of Conversations will remain the same (as good or as bad as it was before). Why is Google doing this to you? We have no idea.** +**The battery consumption and the entire behavior of Conversations will remain the same (as good or as bad as it was before). Why is Google doing this to you? We have no idea.** ##### Android <= 7.1 or Conversations from F-Droid (all Android versions) The foreground notification is still controlled over the expert settings within Conversations as it always has been. Whether or not you need to enable it depends on how aggressive the non-standard 'power saving' features are that your phone vendor has built into the operating system. @@ -177,7 +177,7 @@ You can find a detailed description of how your server, the app server and FCM a #### But why do I need a permanent notification if I use Google Push? -FCM (Google Push) allows an app to wake up from *Doze* which is (as the name suggests) a hibernation feature of the Android operating system that cuts the network connection and also reduces the number of times the app is allowed to wake up (to ping the server for example). The app can ask to be excluded from doze. Non push variants of the app (from F-Droid or if the server doesn’t support it) will do this on first start up. So if you get exemption from *Doze*, or if you get regular push events sent to you, Doze should not pose a threat to Conversatons working properly. But even with *Doze* the app is still open in the background (kept in memory); it is just limited in the actions it can do. Conversations needs to stay in memory to hold certain session state (online status of contacts, join status of group chats, …). However with Android 8 Google changed all of this again and now an App that wants to stay in memory needs to have a foreground service which is visible to the user via the annoying notification. But why does Conversations need to hold that state? XMPP is a stateful protocol that has a lot of per-session information; packets need to be counted, presence information needs to be held, some features like Message Carbons get activated once per session, MAM catchup happens once, service discovery happens only once; the list goes on. When Conversations was created in early 2014 none of this was a problem because apps were just allowed to stay in memory. Basically every XMPP client out there holds that information in memory because it would be a lot more complicated trying to persist it to disk. An entire rewrite of Conversations in the year 2019 would attempt to do that and would probably succeed however it would require exactly that; a complete rewrite which is not feasible right now. That’s by the way also the reason why it is difficult to write an XMPP client on iOS. Or more broadly put this is also the reason why other protocols are designed as or migrated to stateless protocols (often based on HTTP); take for example the migration of IMAP to [JMAP](https://jmap.io/). +FCM (Google Push) allows an app to wake up from *Doze* which is (as the name suggests) a hibernation feature of the Android operating system that cuts the network connection and also reduces the number of times the app is allowed to wake up (to ping the server for example). The app can ask to be excluded from doze. Non push variants of the app (from F-Droid or if the server doesn’t support it) will do this on first start up. So if you get exemption from *Doze*, or if you get regular push events sent to you, Doze should not pose a threat to Conversatons working properly. But even with *Doze* the app is still open in the background (kept in memory); it is just limited in the actions it can do. Conversations needs to stay in memory to hold certain session state (online status of contacts, join status of group chats, …). However with Android 8 Google changed all of this again and now an App that wants to stay in memory needs to have a foreground service which is visible to the user via the annoying notification. But why does Conversations need to hold that state? XMPP is a statefull protocol that has a lot of per-session information; packets need to be counted, presence information needs to be held, some features like Message Carbons get activated once per session, MAM catch-up happens once, service discovery happens only once; the list goes on. When Conversations was created in early 2014 none of this was a problem because apps were just allowed to stay in memory. Basically every XMPP client out there holds that information in memory because it would be a lot more complicated trying to persist it to disk. An entire rewrite of Conversations in the year 2019 would attempt to do that and would probably succeed however it would require exactly that; a complete rewrite which is not feasible right now. That’s by the way also the reason why it is difficult to write an XMPP client on iOS. Or more broadly put this is also the reason why other protocols are designed as or migrated to stateless protocols (often based on HTTP); take for example the migration of IMAP to [JMAP](https://jmap.io/). #### Conversations doesn’t work for me. Where can I get help? @@ -275,11 +275,11 @@ and introduce yourself to `iNPUTmice` so he can approve your join request. #### How do I backup / move Conversations to a new device? On the one hand Conversations supports Message Archive Management to keep a server side history of your messages so when migrating to a new device that device can display your entire history. However that does not work if you enable OMEMO due to its forward secrecy. (Read [The State of Mobile XMPP in 2016](https://gultsch.de/xmpp_2016.html) especially the section on encryption.) -As of version 2.4.0 an integrated Backup & Restore function will help with this, go to Settings and you’ll find a setting called Create backup. A notification will pop-up during the creation process that will announce you when it's ready. After the files, one for each account, are created, you can move the **Conversations** folder *(if you want your old media files too)* or only the **Conversations/Backup** folder *(for OMEMO keys and history only)* to your new device (or to a storage place) where a freshly installed Conversations can restore each account. Don't forget to enable the accounts after a succesful restore. +As of version 2.4.0 an integrated Backup & Restore function will help with this, go to Settings and you’ll find a setting called Create backup. A notification will pop-up during the creation process that will announce you when it's ready. After the files, one for each account, are created, you can move the **Conversations** folder *(if you want your old media files too)* or only the **Conversations/Backup** folder *(for OMEMO keys and history only)* to your new device (or to a storage place) where a freshly installed Conversations can restore each account. Don't forget to enable the accounts after a successfull restore. This backup method will include your OMEMO keys. Due to forward secrecy you will not be able to recover messages sent and received between creating the backup and restoring it. If you have a server side archive (MAM) those messages will be retrieved but displayed as *unable to decrypt*. For technical reasons you might also lose the first message you either sent or receive after the restore; for each conversation you have. This message will then also show up as *unable to decrypt*, but this will automatically recover itself as long as both participants are on Conversations 2.3.11+. Note that this doesn’t happen if you just transfer to a new phone and no messages have been exchanged between backup and restore. -In the vast, vast majority of cases you won’t have to manually delete OMEMO keys or do anything like that. Conversations only introduced the offical backup feature in 2.4.0 after making sure the *OMEMO self healing* mechanism introduced in 2.3.11 works fine. +In the vast, vast majority of cases you won’t have to manually delete OMEMO keys or do anything like that. Conversations only introduced the official backup feature in 2.4.0 after making sure the *OMEMO self healing* mechanism introduced in 2.3.11 works fine. **WARNING**: Be sure to know your accounts passwords or find ways to reset them **before** doing the backup as the files are encrypted using those passwords and the Restore process will ask for them. **WARNING**: Do not use the restore backup feature in an attempt to clone (run simultaneously) an installation. Restoring a backup is only meant for migrations or in case you’ve lost the original device. @@ -339,7 +339,7 @@ OMEMO has two requirements: Your server and the server of your contact need to s OMEMO encryption works only in private (members only) conferences that are non-anonymous. Non-anonymous (being able to discover the real JID of other participants) is a technical requirement to discover the key material. Members only is a sort of arbitrary requirement imposed by Conversations. (see 'OMEMO is grayed out') The server of all participants need to pass the OMEMO [Compliance Test](https://conversations.im/compliance/). -In other words they either need to run Ejabberd 18.01+ or Prosody 0.11+. +In other words they either need to run ejabberd 18.01+ or Prosody 0.11+. (Alternatively it would also work if all participants had each other in their contact list; But that rarely is the case in larger group chats.) From dc72bc5bc3383fac3a93ac2ecd5ce456669eb6cb Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 8 Oct 2020 20:21:53 +0200 Subject: [PATCH 05/37] extend logging for not finding query --- .../java/eu/siacs/conversations/parser/MessageParser.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 07541e7cb..7812faa91 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -367,7 +367,8 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece return; } final Element result = MessageArchiveService.Version.findResult(original); - final MessageArchiveService.Query query = result == null ? null : mXmppConnectionService.getMessageArchiveService().findQuery(result.getAttribute("queryid")); + final String queryId = result == null ? null : result.getAttribute("queryid"); + final MessageArchiveService.Query query = queryId == null ? null : mXmppConnectionService.getMessageArchiveService().findQuery(queryId); if (query != null && query.validFrom(original.getFrom())) { final Pair f = original.getForwardedMessagePacket("result", query.version.namespace); if (f == null) { @@ -381,7 +382,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece return; } } else if (query != null) { - Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received mam result from invalid sender"); + Log.d(Config.LOGTAG, account.getJid().asBareJid() + ": received mam result with invalid from ("+original.getFrom()+") or queryId ("+queryId+")"); return; } else if (original.fromServer(account)) { Pair f; From ff13cc27661ab4342d903287d152d344c5dc70e3 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 20 Oct 2020 10:20:58 +0200 Subject: [PATCH 06/37] extracting chat state for chat with self should not cause markRead event. fixes #3906 --- .../java/eu/siacs/conversations/parser/MessageParser.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 7812faa91..569425292 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -100,10 +100,13 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece ChatState state = ChatState.parse(packet); if (state != null && c != null) { final Account account = c.getAccount(); - Jid from = packet.getFrom(); + final Jid from = packet.getFrom(); if (from.asBareJid().equals(account.getJid().asBareJid())) { c.setOutgoingChatState(state); if (state == ChatState.ACTIVE || state == ChatState.COMPOSING) { + if (c.getContact().isSelf()) { + return false; + } mXmppConnectionService.markRead(c); activateGracePeriod(account); } From 5ad054617b503b0db1953b5c902eb2285b269905 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Thu, 12 Nov 2020 13:33:27 +0100 Subject: [PATCH 07/37] use instead of message id for receipt processing --- .../generator/MessageGenerator.java | 10 +++++----- .../conversations/parser/MessageParser.java | 17 +++++++++-------- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java index e05cbae71..5f5c8b967 100644 --- a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java @@ -223,13 +223,13 @@ public class MessageGenerator extends AbstractGenerator { return packet; } - public MessagePacket received(Account account, MessagePacket originalMessage, ArrayList namespaces, int type) { - MessagePacket receivedPacket = new MessagePacket(); + public MessagePacket received(Account account, final Jid from, final String id, ArrayList namespaces, int type) { + final MessagePacket receivedPacket = new MessagePacket(); receivedPacket.setType(type); - receivedPacket.setTo(originalMessage.getFrom()); + receivedPacket.setTo(from); receivedPacket.setFrom(account.getJid()); - for (String namespace : namespaces) { - receivedPacket.addChild("received", namespace).setAttribute("id", originalMessage.getId()); + for (final String namespace : namespaces) { + receivedPacket.addChild("received", namespace).setAttribute("id", id); } receivedPacket.addChild("store", "urn:xmpp:hints"); return receivedPacket; diff --git a/src/main/java/eu/siacs/conversations/parser/MessageParser.java b/src/main/java/eu/siacs/conversations/parser/MessageParser.java index 569425292..dd835134e 100644 --- a/src/main/java/eu/siacs/conversations/parser/MessageParser.java +++ b/src/main/java/eu/siacs/conversations/parser/MessageParser.java @@ -660,7 +660,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece && remoteMsgId != null && !selfAddressed && !isTypeGroupChat) { - processMessageReceipts(account, packet, query); + processMessageReceipts(account, packet, remoteMsgId, query); } if (replacedMessage.getEncryption() == Message.ENCRYPTION_PGP) { conversation.getAccount().getPgpDecryptionService().discard(replacedMessage); @@ -746,7 +746,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece && remoteMsgId != null && !selfAddressed && !isTypeGroupChat) { - processMessageReceipts(account, packet, query); + processMessageReceipts(account, packet, remoteMsgId, query); } mXmppConnectionService.databaseBackend.createMessage(message); @@ -859,8 +859,8 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece serverMsgId = extractStanzaId(account, packet); } mXmppConnectionService.getJingleConnectionManager().deliverMessage(account, packet.getTo(), packet.getFrom(), child, remoteMsgId, serverMsgId, timestamp); - if (!account.getJid().asBareJid().equals(from.asBareJid())) { - processMessageReceipts(account, packet, query); + if (!account.getJid().asBareJid().equals(from.asBareJid()) && remoteMsgId != null) { + processMessageReceipts(account, packet, remoteMsgId, query); } } else if (query.isCatchup()) { if ("propose".equals(action)) { @@ -1045,7 +1045,7 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece } } - private void processMessageReceipts(Account account, MessagePacket packet, MessageArchiveService.Query query) { + private void processMessageReceipts(final Account account, final MessagePacket packet, final String remoteMsgId, MessageArchiveService.Query query) { final boolean markable = packet.hasChild("markable", "urn:xmpp:chat-markers:0"); final boolean request = packet.hasChild("request", "urn:xmpp:receipts"); if (query == null) { @@ -1057,15 +1057,16 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece receiptsNamespaces.add("urn:xmpp:receipts"); } if (receiptsNamespaces.size() > 0) { - MessagePacket receipt = mXmppConnectionService.getMessageGenerator().received(account, - packet, + final MessagePacket receipt = mXmppConnectionService.getMessageGenerator().received(account, + packet.getFrom(), + remoteMsgId, receiptsNamespaces, packet.getType()); mXmppConnectionService.sendMessagePacket(account, receipt); } } else if (query.isCatchup()) { if (request) { - query.addPendingReceiptRequest(new ReceiptRequest(packet.getFrom(), packet.getId())); + query.addPendingReceiptRequest(new ReceiptRequest(packet.getFrom(), remoteMsgId)); } } } From aaebb3a536b905ae28e5967cef09f7314f09863d Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 13 Nov 2020 12:24:42 +0100 Subject: [PATCH 08/37] bump gradle and targetSdk --- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- src/main/AndroidManifest.xml | 7 +++++-- 3 files changed, 9 insertions(+), 6 deletions(-) diff --git a/build.gradle b/build.gradle index b769feef1..b88a0e779 100644 --- a/build.gradle +++ b/build.gradle @@ -8,7 +8,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:4.0.1' + classpath 'com.android.tools.build:gradle:4.1.1' } } @@ -94,7 +94,7 @@ android { defaultConfig { minSdkVersion 16 - targetSdkVersion 28 + targetSdkVersion 29 versionCode 398 versionName "2.9.0" archivesBaseName += "-$versionName" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 9ad8d1f7c..993c9a076 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Sun Jul 26 11:32:42 CEST 2020 +#Fri Nov 13 11:42:09 CET 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index ffd06ec0f..e89239bc8 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -7,7 +7,9 @@ - + @@ -58,9 +60,10 @@ android:icon="@mipmap/new_launcher" android:label="@string/app_name" android:networkSecurityConfig="@xml/network_security_configuration" + android:requestLegacyExternalStorage="true" android:theme="@style/ConversationsTheme" tools:replace="android:label" - tools:targetApi="o"> + tools:targetApi="q"> Date: Fri, 13 Nov 2020 12:50:05 +0100 Subject: [PATCH 09/37] show toast if no application found to attach --- .../siacs/conversations/ui/ConversationFragment.java | 10 ++++++++-- src/main/res/values/strings.xml | 1 + 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java index 6ca868ba8..f0c3bc181 100644 --- a/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java +++ b/src/main/java/eu/siacs/conversations/ui/ConversationFragment.java @@ -1048,10 +1048,11 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke return binding.getRoot(); } + @Override public void onDestroyView() { super.onDestroyView(); - Log.d(Config.LOGTAG,"ConversationFragment.onDestroyView()"); + Log.d(Config.LOGTAG, "ConversationFragment.onDestroyView()"); messageListAdapter.setOnContactPictureClicked(null); messageListAdapter.setOnContactPictureLongClicked(null); messageListAdapter.setOnQuoteListener(null); @@ -1729,7 +1730,10 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke break; } final Context context = getActivity(); - if (context != null && intent.resolveActivity(context.getPackageManager()) != null) { + if (context == null) { + return; + } + if (intent.resolveActivity(context.getPackageManager()) != null) { if (chooser) { startActivityForResult( Intent.createChooser(intent, getString(R.string.perform_action_with)), @@ -1737,6 +1741,8 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke } else { startActivityForResult(intent, attachmentChoice); } + } else { + Toast.makeText(context, R.string.no_application_found, Toast.LENGTH_LONG).show(); } } diff --git a/src/main/res/values/strings.xml b/src/main/res/values/strings.xml index 8362cc28c..f40317ea8 100644 --- a/src/main/res/values/strings.xml +++ b/src/main/res/values/strings.xml @@ -949,4 +949,5 @@ Failed deliveries More options + No application found From 501cdd5edf7962ee807e0b5ac139c74107a01130 Mon Sep 17 00:00:00 2001 From: Alexei Sorokin Date: Fri, 13 Nov 2020 12:50:04 +0300 Subject: [PATCH 10/37] do not prepend asterisks before words in search An asterisk is a special FTS4 operator when appended to a word but has no special meaning when prepended. --- src/main/java/eu/siacs/conversations/utils/FtsUtils.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/utils/FtsUtils.java b/src/main/java/eu/siacs/conversations/utils/FtsUtils.java index 4a6ccf399..88959c6b2 100644 --- a/src/main/java/eu/siacs/conversations/utils/FtsUtils.java +++ b/src/main/java/eu/siacs/conversations/utils/FtsUtils.java @@ -66,7 +66,7 @@ public class FtsUtils { } else if (term.contains("*") || term.startsWith("-")) { builder.append(term); } else { - builder.append('*').append(term).append('*'); + builder.append(term).append('*'); } } return builder.toString(); From 386b224123f4d0f0e058aa8075dbe3fa506a8859 Mon Sep 17 00:00:00 2001 From: Christoph Scholz Date: Mon, 9 Nov 2020 12:26:13 +0100 Subject: [PATCH 11/37] fix escapeing in local channel discovery --- src/main/java/eu/siacs/conversations/parser/IqParser.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/eu/siacs/conversations/parser/IqParser.java b/src/main/java/eu/siacs/conversations/parser/IqParser.java index 120c80b9a..537f36058 100644 --- a/src/main/java/eu/siacs/conversations/parser/IqParser.java +++ b/src/main/java/eu/siacs/conversations/parser/IqParser.java @@ -75,7 +75,7 @@ public class IqParser extends AbstractParser implements OnIqPacketReceived { } final Element identity = query.findChild("identity"); Data data = Data.parse(x); - String address = packet.getFrom().toEscapedString(); + String address = packet.getFrom().toString(); String name = identity == null ? null : identity.getAttribute("name"); String roomName = data.getValue("muc#roomconfig_roomname"); String description = data.getValue("muc#roominfo_description"); From 952387cb5af672414575ac70847703a88b8f4b78 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 13 Nov 2020 16:11:38 +0100 Subject: [PATCH 12/37] use lower margins on between in-call buttons on small displays hopefully fixes #3890 --- src/main/res/layout/activity_rtp_session.xml | 8 ++++---- src/main/res/values-w384dp/dimens.xml | 4 ++++ src/main/res/values/dimens.xml | 2 ++ 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/main/res/layout/activity_rtp_session.xml b/src/main/res/layout/activity_rtp_session.xml index cc4ea716e..121f712ce 100644 --- a/src/main/res/layout/activity_rtp_session.xml +++ b/src/main/res/layout/activity_rtp_session.xml @@ -174,7 +174,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_margin="12dp" + android:layout_margin="@dimen/in_call_fab_margin" android:layout_toStartOf="@+id/end_call" android:layout_toLeftOf="@+id/end_call" android:visibility="gone" @@ -188,7 +188,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerInParent="true" - android:layout_margin="16dp" + android:layout_margin="@dimen/in_call_fab_margin_center" android:src="@drawable/ic_call_end_white_48dp" android:visibility="visible" app:backgroundTint="@color/red700" @@ -201,7 +201,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_margin="12dp" + android:layout_margin="@dimen/in_call_fab_margin" android:layout_toEndOf="@+id/end_call" android:layout_toRightOf="@+id/end_call" android:visibility="gone" @@ -215,7 +215,7 @@ android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" - android:layout_margin="12dp" + android:layout_margin="@dimen/in_call_fab_margin" android:layout_toEndOf="@+id/in_call_action_right" android:layout_toRightOf="@+id/in_call_action_right" android:visibility="gone" diff --git a/src/main/res/values-w384dp/dimens.xml b/src/main/res/values-w384dp/dimens.xml index 4f3550ab5..3c5d3c6f2 100644 --- a/src/main/res/values-w384dp/dimens.xml +++ b/src/main/res/values-w384dp/dimens.xml @@ -1,6 +1,10 @@ + + 12dp + 16dp + 12sp 288dp 288dp diff --git a/src/main/res/values/dimens.xml b/src/main/res/values/dimens.xml index 069c19edc..fba306510 100644 --- a/src/main/res/values/dimens.xml +++ b/src/main/res/values/dimens.xml @@ -1,5 +1,7 @@ + 8dp + 12dp 8dp 8dp 16dp From afb2fb1326266b05dca272796db602ace8a644d4 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Fri, 13 Nov 2020 20:37:32 +0100 Subject: [PATCH 13/37] use CoW data structure for read markers. fixes #3904 --- .../siacs/conversations/entities/Message.java | 6 ++--- .../conversations/entities/ReadByMarker.java | 24 +++++++++---------- 2 files changed, 15 insertions(+), 15 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Message.java b/src/main/java/eu/siacs/conversations/entities/Message.java index 51a8438db..ab9c64940 100644 --- a/src/main/java/eu/siacs/conversations/entities/Message.java +++ b/src/main/java/eu/siacs/conversations/entities/Message.java @@ -15,10 +15,10 @@ import java.lang.ref.WeakReference; import java.net.MalformedURLException; import java.net.URL; import java.util.ArrayList; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; import eu.siacs.conversations.Config; import eu.siacs.conversations.crypto.axolotl.FingerprintStatus; @@ -113,7 +113,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable private Message mPreviousMessage = null; private String axolotlFingerprint = null; private String errorMessage = null; - private Set readByMarkers = new HashSet<>(); + private Set readByMarkers = new CopyOnWriteArraySet<>(); private Boolean isGeoUri = null; private Boolean isEmojisOnly = null; @@ -206,7 +206,7 @@ public class Message extends AbstractEntity implements AvatarService.Avatarable this.edits = Edit.fromJson(edited); this.oob = oob; this.errorMessage = errorMessage; - this.readByMarkers = readByMarkers == null ? new HashSet<>() : readByMarkers; + this.readByMarkers = readByMarkers == null ? new CopyOnWriteArraySet<>() : readByMarkers; this.markable = markable; this.deleted = deleted; this.bodyLanguage = bodyLanguage; diff --git a/src/main/java/eu/siacs/conversations/entities/ReadByMarker.java b/src/main/java/eu/siacs/conversations/entities/ReadByMarker.java index 9e1aaa5c7..4b1254f07 100644 --- a/src/main/java/eu/siacs/conversations/entities/ReadByMarker.java +++ b/src/main/java/eu/siacs/conversations/entities/ReadByMarker.java @@ -5,8 +5,8 @@ import org.json.JSONException; import org.json.JSONObject; import java.util.Collection; -import java.util.HashSet; import java.util.Set; +import java.util.concurrent.CopyOnWriteArraySet; import eu.siacs.conversations.xmpp.Jid; @@ -66,8 +66,8 @@ public class ReadByMarker { return jsonObject; } - public static Set fromJson(JSONArray jsonArray) { - HashSet readByMarkers = new HashSet<>(); + public static Set fromJson(final JSONArray jsonArray) { + final Set readByMarkers = new CopyOnWriteArraySet<>(); for(int i = 0; i < jsonArray.length(); ++i) { try { readByMarkers.add(fromJson(jsonArray.getJSONObject(i))); @@ -100,7 +100,7 @@ public class ReadByMarker { } public static Set from(Collection users) { - final HashSet markers = new HashSet<>(); + final Set markers = new CopyOnWriteArraySet<>(); for(MucOptions.User user : users) { markers.add(from(user)); } @@ -125,21 +125,21 @@ public class ReadByMarker { public static Set fromJsonString(String json) { try { return fromJson(new JSONArray(json)); - } catch (JSONException | NullPointerException e) { - return new HashSet<>(); + } catch (final JSONException | NullPointerException e) { + return new CopyOnWriteArraySet<>(); } } - public static JSONArray toJson(Set readByMarkers) { - JSONArray jsonArray = new JSONArray(); - for(ReadByMarker marker : readByMarkers) { + public static JSONArray toJson(final Set readByMarkers) { + final JSONArray jsonArray = new JSONArray(); + for(final ReadByMarker marker : readByMarkers) { jsonArray.put(marker.toJson()); } return jsonArray; } - public static boolean contains(ReadByMarker needle, Set readByMarkers) { - for(ReadByMarker marker : readByMarkers) { + public static boolean contains(ReadByMarker needle, final Set readByMarkers) { + for(final ReadByMarker marker : readByMarkers) { if (marker.realJid != null && needle.realJid != null) { if (marker.realJid.asBareJid().equals(needle.realJid.asBareJid())) { return true; @@ -163,7 +163,7 @@ public class ReadByMarker { } public static boolean allUsersRepresented(Collection users, Set markers, ReadByMarker marker) { - HashSet markersCopy = new HashSet<>(markers); + final Set markersCopy = new CopyOnWriteArraySet<>(markers); markersCopy.add(marker); return allUsersRepresented(users, markersCopy); } From 16c4e3eec7b5ff6b7895d0643966d832071ee8cd Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 14 Nov 2020 09:55:43 +0100 Subject: [PATCH 14/37] keep conversation bold (unread) after responding to a call. fixes #3926 --- .../conversations/entities/Conversation.java | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/Conversation.java b/src/main/java/eu/siacs/conversations/entities/Conversation.java index cdd891966..702873fe2 100644 --- a/src/main/java/eu/siacs/conversations/entities/Conversation.java +++ b/src/main/java/eu/siacs/conversations/entities/Conversation.java @@ -550,7 +550,15 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl } public boolean isRead() { - return (this.messages.size() == 0) || this.messages.get(this.messages.size() - 1).isRead(); + synchronized (this.messages) { + for(final Message message : Lists.reverse(this.messages)) { + if (message.isRead() && message.getType() == Message.TYPE_RTP_SESSION) { + continue; + } + return message.isRead(); + } + return true; + } } public List markRead(String upToUuid) { @@ -1010,8 +1018,11 @@ public class Conversation extends AbstractEntity implements Blockable, Comparabl public int unreadCount() { synchronized (this.messages) { int count = 0; - for (int i = this.messages.size() - 1; i >= 0; --i) { - if (this.messages.get(i).isRead()) { + for(final Message message : Lists.reverse(this.messages)) { + if (message.isRead()) { + if (message.getType() == Message.TYPE_RTP_SESSION) { + continue; + } return count; } ++count; From 1fafe4287da5cea6c306565d1586907c44257883 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 14 Nov 2020 11:59:35 +0100 Subject: [PATCH 15/37] =?UTF-8?q?don=E2=80=99t=20send=20origin-ids=20to=20?= =?UTF-8?q?rooms=20that=20support=20stable-ids.=20fixes=20#3905?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/eu/siacs/conversations/entities/MucOptions.java | 4 ++++ .../eu/siacs/conversations/generator/MessageGenerator.java | 6 ++++-- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/entities/MucOptions.java b/src/main/java/eu/siacs/conversations/entities/MucOptions.java index 10caa4620..1072eeeb9 100644 --- a/src/main/java/eu/siacs/conversations/entities/MucOptions.java +++ b/src/main/java/eu/siacs/conversations/entities/MucOptions.java @@ -211,6 +211,10 @@ public class MucOptions { return conversation.getBooleanAttribute(Conversation.ATTRIBUTE_MODERATED, false); } + public boolean stableId() { + return getFeatures().contains("http://jabber.org/protocol/muc#stable_id"); + } + public User deleteUser(Jid jid) { User user = findUserByFullJid(jid); if (user != null) { diff --git a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java index 5f5c8b967..3f1c5aa49 100644 --- a/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java +++ b/src/main/java/eu/siacs/conversations/generator/MessageGenerator.java @@ -18,12 +18,12 @@ import eu.siacs.conversations.http.P1S3UrlStreamHandler; import eu.siacs.conversations.services.XmppConnectionService; import eu.siacs.conversations.xml.Element; import eu.siacs.conversations.xml.Namespace; +import eu.siacs.conversations.xmpp.Jid; import eu.siacs.conversations.xmpp.chatstate.ChatState; import eu.siacs.conversations.xmpp.jingle.JingleConnectionManager; import eu.siacs.conversations.xmpp.jingle.JingleRtpConnection; import eu.siacs.conversations.xmpp.jingle.Media; import eu.siacs.conversations.xmpp.stanzas.MessagePacket; -import eu.siacs.conversations.xmpp.Jid; public class MessageGenerator extends AbstractGenerator { private static final String OMEMO_FALLBACK_MESSAGE = "I sent you an OMEMO encrypted message but your client doesn’t seem to support that. Find more information on https://conversations.im/omemo"; @@ -58,7 +58,9 @@ public class MessageGenerator extends AbstractGenerator { } packet.setFrom(account.getJid()); packet.setId(message.getUuid()); - packet.addChild("origin-id", Namespace.STANZA_IDS).setAttribute("id", message.getUuid()); + if (conversation.getMode() == Conversational.MODE_SINGLE || message.isPrivateMessage() || !conversation.getMucOptions().stableId()) { + packet.addChild("origin-id", Namespace.STANZA_IDS).setAttribute("id", message.getUuid()); + } if (message.edited()) { packet.addChild("replace", "urn:xmpp:message-correct:0").setAttribute("id", message.getEditedIdWireFormat()); } From 6485c77e094c4b576752c66938bb95521d4981e1 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 14 Nov 2020 12:01:28 +0100 Subject: [PATCH 16/37] pulled translations from transifex --- src/main/res/values-el/strings.xml | 362 +++++++++++++++++++------ src/main/res/values-es/strings.xml | 5 + src/main/res/values-fr/strings.xml | 32 +++ src/main/res/values-hu/strings.xml | 7 + src/main/res/values-it/strings.xml | 22 ++ src/main/res/values-ja/strings.xml | 31 +++ src/main/res/values-pt-rBR/strings.xml | 22 ++ src/main/res/values-zh-rCN/strings.xml | 21 ++ 8 files changed, 412 insertions(+), 90 deletions(-) diff --git a/src/main/res/values-el/strings.xml b/src/main/res/values-el/strings.xml index 640d82e2d..2f9c58e51 100644 --- a/src/main/res/values-el/strings.xml +++ b/src/main/res/values-el/strings.xml @@ -4,26 +4,27 @@ Νέα συζήτηση Διαχείριση λογαριασμών Διαχείριση λογαριασμού + Τερματισμός συζήτησης Λεπτομέρειες επαφής Λεπτομέρειες ομαδικής συζήτησης Λεπτομέρειες καναλιού Προσθήκη λογαριασμού Επεξεργασία ονόματος - Προσθήκη στην ατζέντα + Προσθήκη στο βιβλίο διευθύνσεων Διαγραφή από τη λίστα επαφών Αποκλεισμός επαφής Άρση αποκλεισμού επαφής Αποκλεισμός τομέα Άρση αποκλεισμού τομέα Αποκλεισμός συμμετέχοντα - Αναίρεση αποκλεισμού συμμετέχοντα + Άρση αποκλεισμού συμμετέχοντα Διαχείριση Λογαριασμών Ρυθμίσεις Διαμοιρασμός με Συζήτηση Έναρξη Συζήτησης - Επέλεξε επαφή + Επιλογή επαφής Επιλογή επαφών - Μοιράσου μέσω του λογαριασμού + Διαμοιρασμός μέσω λογαριασμού Αποκλεισμός λίστας μόλις τώρα πριν από 1 λεπτό @@ -31,25 +32,27 @@ %d αδιάβαστες συζητήσεις αποστολή... Αποκρυπτογράφηση μηνύματος. Παρακαλώ περιμένετε... - OpenPGP κρυπτογραφημένο μήνυμα + Κρυπτογραφημένο μήνυμα OpenPGP Το ψευδώνυμο είναι ήδη σε χρήση - Άκυρο όνομα + Μη έγκυρο ψευδώνυμο Διαχειριστής Κάτοχος Συντονιστής Συμμετέχων Επισκέπτης + Θα θέλατε να αφαιρέσετε τον/την %s από τη λίστα επαφών σας; Οι Συζητήσεις με αυτή την επαφή δεν θα αφαιρεθούν. Θέλετε να αποκλείσετε την επαφή %s από το να σας στέλνει μηνύματα; - Θέλετε να επιτρέψετε στην επαφή %s να σας στέλνει μηνύματα; + Θέλετε να κάνετε άρση αποκλεισμού και να επιτρέψετε στην επαφή %s να σας στέλνει μηνύματα; Αποκλεισμός όλων των επαφών από το %s; Άρση αποκλεισμού όλων των επαφών από το %s; Η επαφή αποκλείστηκε Αποκλεισμένος + Θέλετε να αφαιρέσετε το %s ως σελιδοδείκτη; Οι συζητήσεις που σχετίζονται με αυτόν τον σελιδοδείκτη δεν θα αφαιρεθούν. Εγγραφή νέου λογαριασμού στον διακομιστή Αλλαγή συνθηματικού στον διακομιστή Διαμοιρασμός με... Έναρξη συζήτησης - Προσκάλεσε επαφή + Πρόσκληση επαφής Πρόσκληση Επαφές Επαφή @@ -63,50 +66,68 @@ Αποθήκευση Εντάξει Το Conversations έκλεισε απροσδόκητα + Η χρήση του XMPP λογαριασμού σας για την αποστολή ίχνους στοίβας προωθεί την συνεχή ανάπτυξη του Conversations. Αποστολή τώρα Χωρίς ερώτηση την επόμενη φορά + Δεν ήταν δυνατή η σύνδεση στον λογαριασμό + Δεν ήταν δυνατή η σύνδεση σε πολλαπλούς λογαριασμούς + Επιλέξτε για διαχείριση των λογαριασμών σας Επισύναψη αρχείου + Προσθήκη της επαφής αυτής στη λίστα επαφών σας; Προσθήκη επαφής η αποστολή απέτυχε - Διαμοιρασμός φακέλων. Παρακαλώ περιμένετε... + Προετοιμασία εικόνας για αποστολή + Προετοιμασία εικόνων για μεταφορά + Διαμοιρασμός αρχείων. Παρακαλώ περιμένετε... Καθαρισμός ιστορικού Καθαρισμός ιστορικού Συζήτησης + Θέλετε να διαγράψετε όλα τα μηνύματα αυτής της συζήτησης;\n\nΠροσοχή: Αυτή η ενέργεια δεν θα επηρεάσει μηνύματα που είναι αποθηκευμένα σε άλλες συσκευές ή εξυπηρετητές. Διαγραφή αρχείου Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το αρχείο;\n\nΠροσοχή Αυτή η ενέργεια δεν θα διαγράψει αντίγραφα αυτού του αρχείου που είναι αποθηκευμένα σε άλλες συσκευές ή εξυπηρετητές. Κλείσιμο της συζήτησης αμέσως μετά Επιλογή συσκευής - Αποστολή κρυπτογραφημένου μηνύματος + Αποστολή μη κρυπτογραφημένου μηνύματος Αποστολή μηνύματος - Αποστολή μηνύματος %s - Αποστολή OMEMO κρυπτογραφημένου μηνύματος - Αποστολή v\\OMEMO κρυπτογραφημένου μηνύματος + Αποστολή μηνύματος στον/στην %s + Αποστολή κρυπτογραφημένου μηνύματος OMEMO + Αποστολή v\\κρυπτογραφημένου μηνύματος OMEMO Αποστολή κρυπτογραφημένου μηνύματος OpenPGP + Χρήση νέου ψευδωνύμου Αποστολή χωρίς κρυπτογράφηση Η αποκρυπτογράφηση απέτυχε. Ίσως δεν κατέχετε το σωστό ιδιωτικό κλειδί. OpenKeychain + Το Conversations χρησιμοποιεί το OpenKeychain για να κρυπτογραφεί και να αποκρυπτογραφεί μηνύματα και να διαχειρίζεται τα δημόσια κλειδιά σας.\n\nΕίναι δημοσιευμένο με άδεια GPLv3+ και είναι διαθέσιμο στο F-Droid και το Google Play.\n\n(Παρακαλώ επανεκκινήστε το Conversations αμέσως μετά.) Επανεκκίνηση Εγκατάσταση - Παρακαλώ εγκαταστήστε OpenKeychain + Παρακαλώ εγκαταστήστε το OpenKeychain προσφορά... αναμονή... Δεν βρέθηκε κλειδί OpenPGP + Δεν ήταν δυνατή η κρυπτογράφηση του μηνύματός σας γιατί η επαφή σας δεν ανακοινώνει το δημόσιο κλειδί της.\n\nΠαρακαλώ ζητήστε από την επαφή σας να ρυθμίσει το OpenPGP. Δεν βρέθηκαν κλειδιά OpenPGP + Δεν ήταν δυνατή η κρυπτογράφηση του μηνύματός σας γιατί οι επαφές σας δεν ανακοινώνουν το δημόσιο κλειδί τους.\n\nΠαρακαλώ ζητήστε από τις επαφές σας να εγκαταστήσουν το OpenPGP. Γενικά Αποδοχή αρχείων Αυτόματη αποδοχή αρχείων μικρότερα από... - Επισυναπτόμμενα + Συνημμένα Ειδοποίηση Δόνηση Δόνηση όταν δέχεστε νέο μήνυμα Ειδοποίηση LED - Ειδοποίηση μέσω αναβοσβήματος όταν δέχεστε νέο μήνυμα + Ειδοποίηση μέσω εναλλαγής LED κατά τη λήψη νέου μηνύματος + Κουδούνισμα + Ήχος ειδοποίησης + Ήχος ειδοποίησης για νέα μηνύματα + Κουδούνισμα για εισερχόμενη κλήση Περίοδος Χάριτος Ο χρόνος σίγασης ειδοποιήσεων αφότου ανιχνευθεί δραστηριότητα σε μια από τις άλλες συσκευές σας. - Προχωρημένος + Για προχωρημένους Να μην αποστέλλονται αναφορές λαθών + Στέλνοντας ίχνη στοίβας βοηθάτε την συνεχόμενη ανάπτυξη Επιβεβαίωση μηνυμάτων - Να επιτρέπεται οι επαφές σας να γνωρίζουν ότι δεχτήκατε διαβάσατε τα μηνύματα τους - Προφίλ χρήστη + Επιτρέψτε στις επαφές σας να γνωρίζουν όταν έχετε λάβει και διαβάσει τα μηνύματά τους + Διεπαφή χρήστη + Το OpenKeychain ανέφερε κάποιο σφάλμα. Σφάλμα στο κλειδί κρυπτογράφησης Αποδοχή Έχει συμβεί κάποιο σφάλμα @@ -119,11 +140,13 @@ Λήψη εικόνας Ερήμην χορήγηση αίτησης συνδρομής Το αρχείο που επιλέξατε δεν είναι εικόνα + Σφάλμα κατά τη μετατροπή του αρχείου εικόνας Το αρχείο δεν βρέθηκε Γενικό σφάλμα εισόδου/εξόδου. Ίσως δεν έχετε ελεύθερο χώρο αποθήκευσης; + Η εφαρμογή που χρησιμοποιήσατε για να επιλέξετε αυτή την εικόνα δεν παραχώρησε αρκετά δικαιώματα για την ανάγνωση του αρχείου.\n\nΧρησιμοποιήστε διαφορετικό διαχειριστή αρχείων για να επιλέξετε μια εικόνα Άγνωστο Προσωρινά απενεργοποιημένο - Συνδεμένος + Σε σύνδεση Σύνδεση\u2026 Εκτός σύνδεσης Χωρίς εξουσιοδότηση @@ -132,9 +155,10 @@ Η εγγραφή απέτυχε Το όνομα χρησιμοποιείται ήδη Ολοκλήρωση εγγραφής + Ο διακομιστής δεν υποστηρίζει εγγραφή Άκυρο κουπόνι εγγραφής - TLS αποτυχία επικοινωνίας - Πολιτική παραβίασης + Αποτυχία διαπραγμάτευσης TLS + Παραβίαση κανονισμού Μη συμβατός διακομιστής Σφάλμα μετάδοσης Σφάλμα στην εκκίνηση μετάδοσης @@ -143,21 +167,23 @@ OpenPGP OMEMO Διαγραφή λογαριασμού - Προσωρινά μη διαθέσιμο + Προσωρινή απενεργοποίηση Δημοσίευση εικόνας προφίλ Δημοσίευση του δημόσιου κλειδιού OpenPGP - Αφαίρεση OpenPGP δημόσιου κλειδιού - Είστε σίγουρος ότι θέλετε να αφαιρέσετε το OpenPGP δημόσιο κλειδί σας από την παρούσα ανακοίνωσή σας? -Οι επαφές σας δεν θα είναι πλέον δυνατόν να σας στείλουν OpenPGP κρυπτογραφημένα μηνύματα. + Διαγραφή δημόσιου κλειδιού OpenPGP + Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το δημόσιο κλειδί σας OpenPGP από την ανακοίνωση παρουσίας σας;\nΟι επαφές σας δεν θα είναι πλέον δυνατόν να σας στείλουν κρυπτογραφημένα μηνύματα με OpenPGP. + Το δημόσιο κλειδί OpenPGP έχει δημοσιευτεί. Ενεργοποίηση λογαριασμού Είστε βέβαιοι; + Η διαγραφή του λογαριασμού σας διαγράφει όλο το ιστορικό συζητήσεών σας Εγγραφή φωνής Διεύθυνση XMPP Αποκλεισμός διεύθυνσης XMPP username@example.com Συνθηματικό Μη έγκυρη διεύθυνση XMPP - Θέλετε να προσθέσετε %s στην ατζέντα σας? + Πλήρης μνήμη. Η εικόνα είναι πολύ μεγάλη + Θέλετε να προσθέσετε τον/την %s στο βιβλίο διευθύνσεών σας? Πληροφορίες διακομιστή XEP-0313: Διαχείριση αρχείου μηνυμάτων XEP-0280: Αντίγραφα μηνυμάτων @@ -165,29 +191,35 @@ XEP-0191: Εντολή αποκλεισμού XEP-0237: Διατήρηση εκδόσεων λίστας επαφών XEP-0198: Διαχείριση ροών + XEP-0215: Εύρεση εξωτερικών υπηρεσιών XEP-0163: Πρωτόκολλο προσωπικών συμβάντων (εικόνες προφίλ / ΟΜΕΜΟ) - XEP-0363: Ανέβασμα αρχείου με πρωτόκολλο HTTP + XEP-0363: Μεταφόρτωση αρχείου με πρωτόκολλο HTTP XEP-0357: Push διαθέσιμος μη διαθέσιμος Ελλειπείς ανακοινώσεις δημοσίων κλειδιών συνδέθηκε τελευταία φορά μόλις τώρα + τελευταία σύνδεση πριν από 1 λεπτό τελευταία σύνδεση πριν από %d λεπτά + τελευταία σύνδεση πριν από 1 ώρα τελευταία σύνδεση πριν από %d ώρες + τελευταία σύνδεση πριν από 1 μέρα τελευταία σύνδεση πριν από %d μέρες + Κρυπτογραφημένο μήνυμα. Παρακαλώ εγκαταστήστε το OpenKeychain για αποκρυπτογράφηση. + Βρέθηκαν νέα μηνύματα κρυπτογραφημένα με OpenPGP Ταυτότητα κλειδιού OpenPGP Αποτύπωμα OMEMO v\\Αποτύπωμα OMEMO Αποτύπωμα OMEMO μηνύματος v\\Αποτύπωμα OMEMO μηνύματος \'Αλλες συσκευές - Εμπιστευτίτε τα OMEMO αποτυπώματα - Ανάσυρση κλειδιών... + Επαλήθευση των αποτυπωμάτων OMEMO + Μεταφόρτωση κλειδιών... Έγινε Αποκρυπτογράφηση Σελιδοδείκτες Αναζήτηση - Πρόσθεσε επαφή + Εισαγωγή επαφής Διαγραφή επαφής Λεπτομέρειες επαφής Αποκλεισμός επαφής @@ -200,39 +232,46 @@ channel@conference.example.com Αποθήκευση σαν σελιδοδείκτη Διαγραφή σελιδοδείκτη - Καταστροφή ομαδικής συζήτησης - Καταστροφή καναλιού - Είστε βέβαιοι ότι θέλετε να καταστρέψετε αυτή την ομαδική συζήτηση;\n\nΠροσοχή:Η ομαδική συζήτηση θα διαγραφεί οριστικά από τον διακομιστή. + Διαγραφή ομαδικής συζήτησης + Διαγραφή καναλιού + Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτή την ομαδική συζήτηση;\n\nΠροσοχή:Η ομαδική συζήτηση θα διαγραφεί οριστικά από τον διακομιστή. Είστε βέβαιοι ότι θέλετε να καταστρέψετε αυτό το δημόσιο κανάλι;\n\nΠροσοχή:Το κανάλι θα διαγραφεί πλήρως από τον διακομιστή. - Δεν ήταν δυνατή η καταστροφή της ομαδικής συζήτησης - Δεν ήταν δυνατή η καταστροφή του καναλιού + Δεν ήταν δυνατή η διαγραφή της ομαδικής συζήτησης + Δεν ήταν δυνατή η διαγραφή του καναλιού Επεξεργασία θέματος ομαδικής συζήτησης Θέμα - Συμμετοχή σε ομαδική συζήτηση... + Εισαγωγή σε ομαδική συζήτηση... Έξοδος - Η επαφή σας πρόσθεσε στην λίστα επαφών + Η επαφή σάς πρόσθεσε στην λίστα επαφών Προσθήκη επίσης - Η επαφή %s έχει διαβάσει μέχρι αυτό το σημείο - %sέχει διαβαστεί μέχρι αυτό το σημείο + Ο/Η %s έχει διαβάσει μέχρι αυτό το σημείο + Οι χρήστες %s έχουν διαβάσει μέχρι αυτό το σημείο + Ο χρήστης %1$s +%2$d ακόμα έχουν διαβάσει μέχρι αυτό το σημείο Όλοι έχουν διαβάσει μέχρι αυτό το σημείο Δημοσίευση + Επιλέξτε την εικόνα προφίλ για να διαλέξετε εικόνα από την έκθεση Δημοσίευση... Ο διακομιστής απέρριψε την δημοσίευσή σας + Δεν ήταν δυνατή η μετατροπή της εικόνας σας Αδύνατη η αποθήκευση της εικόνας προφίλ στο δίσκο (Ή πατήστε παρατεταμένα για να επιστρέψετε στο αρχικό) + Ο διακομιστής σας δεν υποστηρίζει την δημοσίευση εικονών προφίλ ψιθύρισε στο %s Αποστολή ιδιωτικού μηνύματος στην επαφή %s Σύνδεση Αυτός ο λογαριασμός υπάρχει ήδη Επόμενος + Σύσταση συνεδρίας Παράλειψη Απενεργοποίηση ειδοποιήσεων Ενεργοποίηση - Η ομαδική συζήτηση απαιτεί κωδικό + Η ομαδική συζήτηση απαιτεί συνθηματικό Εισαγωγή συνθηματικού + Παρακαλώ αιτηθείτε ενημερώσεις παρουσίας από την επαφή σας πρώτα.\n\nΑυτό θα χρησιμοποιηθεί για να ταυτοποιηθεί το πρόγραμμα-πελάτης που χρησιμοποιεί η επαφή σας.. Αίτηση τώρα Αγνόηση + Προειδοποίηση: Η αποστολή αυτού χωρίς αμφίδρομες ενημερώσεις παρουσίας μπορεί να προκαλέσει απροσδόκητα προβλήματα.\n\nΠηγαίνετε στις \"Λεπτομέρειες επαφής\" για να επαληθεύσετε τις συνδρομές παρουσίας σας. Ασφάλεια Να επιτρέπεται η διόρθωση μηνυμάτων Να επιτρέπεται οι επαφές σας να διορθώνουν τα μηνύματά τους αναδρομικά @@ -246,13 +285,16 @@ Οι ειδοποιήσεις θα σιγαστούν κατά τις ώρες ησυχίας Άλλο Συγχρονισμός με σελιδοδείκτες - Είστε αποκλεισμένοι από αυτή την ομαδική συνδιάσκεψη + Συμμετοχή σε ομαδικές συζητήσεις αυτόματα αν ο σελιδοδείκτης αναφέρει αυτόματη συμμετοχή + Το αποτύπωμα OMEMO αντιγράφηκε στο πρόχειρο + Είστε αποκλεισμένοι από αυτή την ομαδική συζήτηση Αυτή η ομαδική συζήτηση είναι μόνο για μέλη Περιορισμός πόρων - Έχετε διωχθει από αυτή την ομαδική συζήτηση + Έχετε διωχθεί από αυτή την ομαδική συζήτηση Η ομαδική συζήτηση έχει τερματιστεί Δεν είστε πλέον μέλος αυτής της ομαδικής συζήτησης χρήση λογαριασμού %s + φιλοξενείται στο %s Έλεγχος %s στον διακομιστή HTTP Δεν είστε συνδεμένοι. Δοκιμάστε ξανά αργότερα Ελέγξτε το μέγεθος του %s @@ -264,23 +306,24 @@ Αποστολή ξανά Διεύθυνση URL αρχείου Η διεύθυνση URL αντιγράφηκε στο πρόχειρο - Αντιγραφή διεύθυνσης XMPP στο πρόχειρο + Η διεύθυνση XMPP αντιγράφηκε στο πρόχειρο Το μήνυμα λάθους αντιγράφηκε στο πρόχειρο διεύθυνση ιστού Σάρωση 2D γραμμοκώδικα Εμφάνιση 2D γραμμοκώδικα - Εμφάνιση λίστας αποκλεισμένων + Εμφάνιση λίστας αποκλεισμού Λεπτομέρειες λογαριασμού Επιβεβαίωση Επανάληψη + Υπηρεσία στο προσκήνιο Αποτρέπει τον τερματισμό της σύνδεσης από το λειτουργικό σύστημα Δημιουργία αντιγράφου ασφαλείας Τα αντίγραφα ασφαλείας θα αποθηκεύονται στο %s Δημιουργία αντιγράφων ασφαλείας Το αντίγραφο ασφαλείας σας έχει δημιουργηθεί - Τα αντίγραφα ασφαλείας έχουν αποθηκευτεί στο %s + Τα αρχεία του αντιγράφου ασφαλείας έχουν αποθηκευτεί στο %s Επαναφορά αντιγράφου ασφαλείας - Έχει γίνει επαναφορά του αντιγράφου ασφαλείας + Έχει γίνει επαναφορά του αντιγράφου ασφαλείας σας Μην παραλείψετε να ενεργοποιήσετε τον λογαριασμό. Επιλογή αρχείου Λήψη %1$s (ολοκληρώθηκε %2$d%%) @@ -289,26 +332,37 @@ αρχείο Άνοιγμα του %s αποστολή (ολοκλήρωση %1$d%%) - το %s προσφέρθηκε για μεταφόρτωση + Προετοιμασία του αρχείου για διαμοιρασμό + %s προσφέρθηκε για μεταφόρτωση Ακύρωση μετάδοσης + ο διαμοιρασμός του αρχείου απέτυχε η μεταφορά αρχείου ακυρώθηκε + Το αρχείο διαγράφηκε + Δεν βρέθηκε εφαρμογή για να ανοίξει το αρχείο + Δεν βρέθηκε εφαρμογή για να ανοίξει τον σύνδεσμο + Δεν βρέθηκε εφαρμογή για προβολή της επαφής Δυναμικές ετικέτες Εμφάνιση ετικετών μόνο για ανάγνωση κάτω από τις επαφές Ενεργοποίηση ειδοποιήσεων Δεν βρέθηκε διακομιστής ομαδικής συζήτησης + Η δημιουργία ομαδικής συζήτησης απέτυχε Εικόνα προφίλ λογαριασμού Αντιγραφή του αποτυπώματος OMEMO στο πρόχειρο Αναδημιουργία κλειδιού OMEMO Καθαρισμός συσκευών + Είστε βέβαιοι ότι θέλετε να αφαιρέσετε όλες τις άλλες συσκευές από την αναγγελία OMEMO; Την επόμενη φορά που θα συνδεθούν οι συσκευές σας θα αναγγείλουν την παρουσία τους ξανά, αλλά είναι πιθανό να μην λάβουν τυχόν μηνύματα που θα αποσταλούν στο ενδιάμεσο. + Δεν υπάρχουν διαθέσιμα χρήσιμα κλειδιά για αυτή την επαφή.\nΗ μεταφόρτωση νέων κλειδιών από τον διακομιστή ήταν ανεπιτυχής. Ίσως υπάρχει κάποιο πρόβλημα με τον διακομιστή της επαφής σας; + Δεν υπάρχουν διαθέσιμα χρήσιμα κλειδιά για αυτή την επαφή.\nΒεβαιωθείτε ότι έχετε συνδρομή αμοιβαίας παρουσίας. Κάτι πήγε στραβά Ανάκτηση ιστορικού από τον διακομιστή Δεν υπάρχει άλλο ιστορικό στον διακομιστή Ενημέρωση... - Επιτυχής αλλαγή συνθηματικου! + Επιτυχής αλλαγή συνθηματικού! Δεν ήταν δυνατή η αλλαγή του συνθηματικού Αλλαγή συνθηματικού Τρέχον συνθηματικό Νέο συνθηματικό + Το συνθηματικό δεν μπορεί να είναι κενό Ενεργοποίηση όλων των λογαριασμών Απενεργοποίηση όλων των λογαριασμών Εκτέλεση ενέργειας με @@ -322,12 +376,13 @@ Απόδοση δικαιωμάτων διαχειριστή Ανάκληση δικαιωμάτων διαχειριστή Απόδοση δικαιωμάτων ιδιοκτήτη - Ανάκληση δικαιωμάτων ιδιοκτήτη + Ανάκληση δικαιωμάτων κατόχου Αφαίρεση από την ομάδική συζήτηση Αφαίρεση από το κανάλι Δεν ήταν δυνατή η αλλαγή του δεσμού της επαφής %s Αποκλεισμός από την ομαδική συζήτηση - Απαγόρευση από το κανάλι + Αποκλεισμός από το κανάλι + Προσπαθείτε να αφαιρέσετε τον χρήστη %s από ένα δημόσιο κανάλι. Ο μόνος τρόπος να γίνει αυτό είναι να αποκλείσετε τον χρήστη για πάντα. Αποκλεισμός τώρα Δεν ήταν δυνατή η αλλαγή ρόλου της επαφής %s Ρύθμιση συζήτησης ιδιωτικής ομάδας @@ -345,6 +400,7 @@ Σημείωμα ως αναγνωσμένο Είσοδος Αποστολή με το πλήκτρο Enter + Χρήση του πλήκτρου Enter για την αποστολή μηνύματος. Μπορείτε πάντα να χρησιμοποιείτε τον συνδυασμό Ctrl+Enter για να στείλετε μήνυμα, ακόμα και αν αυτή η επιλογή είναι απενεργοποιημένη. Εμφάνιση του πλήκτρου Enter Αλλαγή του πλήκτρου emoticons σε πλήκτρο Enter ήχος @@ -358,13 +414,14 @@ Προσφορά του %s Απόκρυψη των εκτός σύνδεσης Η επαφή %s πληκτρολογεί... - Ο χρήστης %s σταμάτησε να γράφει + Η επαφή %s σταμάτησε να πληκτρολογεί Οι επαφές %s πληκτρολογούν... - Η επαφή %s σταμάτησε να πληκτρολογεί + Η επαφές %s σταμάτησαν να πληκτρολογούν Ειδοποιήσεις πληκτρολόγησης Επιτρέψτε στις επαφές σας να γνωρίζουν πότε γράφετε μηνύματα προς αυτές Αποστολή τοποθεσίας Εμφάνιση τοποθεσίας + Δεν βρέθηκε εφαρμογή για την απεικόνιση τοποθεσίας Τοποθεσία Η συζήτηση έκλεισε Αποχώρησε από την συζήτηση ιδιωτικής ομάδας @@ -372,15 +429,16 @@ Μη έμπιστες αρχές πιστοποίησης συστήματος Όλα τα πιστοποιητικά πρέπει να εγκριθούν χειροκίνητα Αφαίρεση πιστοποιητικών - Διαγραφή με μη αυτόματο τρόπο των αναγνωρισμένων πιστοποιητικών - Δεν υπάρχουν με μη αυτόματο τρόπο αναγνωρισμένα πιστοποιητικα + Διαγραφή των χειροκίνητα επιβεβαιωμένων πιστοποιητικών + Δεν υπάρχουν χειροκίνητα επιβεβαιωμένα πιστοποιητικα Αφαίρεση πιστοποιητικών Διαγραφή επιλογής Ακύρωση - %d πιστοποιητικο διαγραφθηκε - %d πιστοποιητικά διαγραφθηκαν + %d πιστοποιητικό διαγράφηκε + %d πιστοποιητικά διαγράφηκαν + Αντικατάσταση του κουμπιού \"Αποστολή\" με γρήγορη ενέργεια Γρήγορη Ενέργεια Κανένα Πιο πρόσφατα χρησιμοποιημένη @@ -388,26 +446,37 @@ Αναζήτηση επαφών Αναζήτηση σελιδοδεικτών Αποστολή ιδιωτικού μηνύματος + Η επαφή %1$s αποχώρησε από την ομαδική συζήτηση Όνομα χρήστη Όνομα χρήστη Αυτό δεν είναι έγκυρο όνομα χρήστη - Η μεταφόρτωση απέτυχε: Δεν βρέθηκε διακομιστής + Η μεταφόρτωση απέτυχε: Δεν βρέθηκε ο διακομιστής Η μεταφόρτωση απέτυχε: Δεν βρέθηκε το αρχείο - Η μεταφόρτωση απέτυχε: Η σύνδεση ήταν αδύνατη + Η μεταφόρτωση απέτυχε: Δεν ήταν δυνατή η σύνδεση Η μεταφόρτωση απέτυχε: Αποτυχία εγγραφής αρχείου Το δίκτυο Tor δεν είναι διαθέσιμο Αποτυχία διασύνδεσης + Ο διακομιστής δεν είναι υπεύθυνος για αυτόν τον τομέα Χαλασμένος Διαθεσιμότητα Εκτός χρήσης όταν η οθόνη είναι σβηστή + Εμφάνιση παρουσίας ως εκτός χρήσης όταν σβήνει η οθόνη + Απασχολημένος/η όταν βρίσκεται σε σιωπηρή λειτουργία + Σημειώνει την παρουσία σας ως Απασχολημένος/η όταν η συσκευή είναι σε κατάσταση σιωπής Χρήση της κατάστασης δόνησης ως σιωπηρή κατάσταση - Περισσότερες ρυθμίσεις σύνδεσης - Εμφάνιση ονόματος μηχανήματος και ρυθμίσεων πόρτας όταν δημιουργείται ένας νέος λογαριασμός + Σημειώνει την παρουσία σας ως Απασχολημένος/η όταν η συσκευή είναι σε κατάσταση δόνησης + Αναλυτικότερες ρυθμίσεις σύνδεσης + Εμφάνιση ονόματος μηχανήματος και ρυθμίσεων θύρας όταν ρυθμίζεται νέος λογαριασμός xmpp.example.com + Σύνδεση με πιστοποιητικό + Αδυναμία ανάγνωσης πιστοποιητικού Επιλογές αρχειοθέτησης Επιλογές αρχειοθέτησης στον διακομιστή Μεταφόρτωση επιλογών αρχειοθέτησης. Παρακαλώ περιμένετε... + Αδυναμία μεταφόρτωσης ρυθμίσεων αρχειοθέτησης + Απαραίτηση η χρήση CAPTCHA Εισάγετε το κείμενο από την παραπάνω εικόνα + Η αλυσίδα του πιστοποιητικού δεν είναι έμπιστη Η διεύθυνση XMPP δεν ταιριάζει με το πιστοποιητικό Ανανέωση πιστοποιητικού Σφάλμα μεταφόρτωσης κλειδιού OMEMO! @@ -417,34 +486,50 @@ Σύνδεση μέσω Tor Δρομολόγηση όλων των συνδέσεων μέσω του δικτύου Tor. Απαιτεί τη χρήση Orbot Όνομα μηχανήματος - Πόρτα - Ο αριθμός πόρτας δεν είναι έγκυρος - Αυτό δεν είναι έγκυρο όνομα μηχανήματος + Θύρα + Διεύθυνση διακομιστή ή .onion + Ο αριθμός θύρας δεν είναι έγκυρος + Μη έγκυρο όνομα μηχανήματος Συνδέθηκαν %1$d από %2$d λογαριασμοί %d μήνυμα %d μηνύματα Φόρτωση περισσότερων μηνυμάτων + Το αρχείο διαμοιράστηκε με την επαφή %s + Η εικόνα διαμοιράστηκε με την επαφή %s + Η εικόνες διαμοιράστηκαν με την επαφή %s + Το κείμενο διαμοιράστηκε με την επαφή %s + Απόδοση δικαιώματος πρόσβασης του Conversations στον εξωτερικό αποθηκευτικό χώρο + Απόδοση δικαιώματος πρόσβασης στην φωτογραφική μηχανή για το Conversations Συγχρονισμός με επαφές + Το Conversations χρειάζεται δικαίωμα πρόσβασης στις επαφές σας για να ταιριάξει τη λίστα επαφών σας στον διακομιστή με το τοπικό βιβλίο διευθύνσεών σας για να σας δείξει τα πλήρη ονόματα και εικόνες προφίλ των επαφών σας.\n\nΘα διαβάσει τις επαφές σας και θα τις ταιριάξει τοπικά χωρίς να τις μεταφορτώσει στον διακομιστή σας.
Δεν θα αποθηκευτεί αντίγραφο αυτών των τηλεφωνικών αριθμών.\n\nΓια περισσότερες πληροφορίες διαβάστε την πολιτική απορρήτου μας.

Θα σας ζητηθεί τώρα να δώσετε το δικαίωμα για πρόσβαση στις επαφές σας.]]>
Ειδοποίηση για όλα τα μηνύματα - Ειδοποίηση μόνο όταν κάποιος αναφέρεται σε εμένα - Απενεργοποίηση ειδοποιήσεων + Ειδοποίηση μόνο όταν αναφέρεται το όνομά μου + Οι ειδοποιήσεις απενεργοποιήθηκαν Παύση ειδοποιήσεων Συμπίεση εικόνας + Συμβουλή: Χρησιμοποιήστε \"Επιλογή αρχείου\" αντι για \"Επιλογή εικόνας\" για να στείλετε μεμονωμένες εικόνες χωρίς συμπίεση, άσχετα από αυτή τη ρύθμιση. Πάντα Μεγάλες εικόνες μόνο - Ενεργοποίηση βελτιστοποίησης χρήσης μπαταρίας + Η βελτιστοποίηση χρήσης μπαταρίας είναι ενεργοποιημένη + Η συσκευή σας χρησιμοποιεί έντονη βελτιστοποίηση στην χρήση μπαταρίας του Conversations που μπορεί να οδηγήσει σε αργοπορημένες ειδοποιήσεις ή ακόμα και σε απώλεια μηνυμάτων.\nΠροτείνεται να την απενεργοποιήσετε. + Η συσκευή σας χρησιμοποιεί έντονη βελτιστοποίηση στην χρήση μπαταρίας του Conversations που μπορεί να οδηγήσει σε αργοπορημένες ειδοποιήσεις ή ακόμα και σε απώλεια μηνυμάτων.\nΘα σας ζητηθεί να την απενεργοποιήσετε. Απενεργοποίηση - Η επιλεγμένη επιφάνεια είναι πολύ μεγάλη + Η επιλεγμένη περιοχή είναι πολύ μεγάλη (δεν υπάρχουν ενεργοί λογαριασμοί) Αυτό το πεδίο είναι υποχρεωτικό Διόρθωση μηνύματος Αποστολή διορθωμένου μηνύματος + Έχετε ήδη πιστοποιήσει με ασφάλεια το αποτύπωμα αυτού του ατόμου για να επιβεβαιώσετε την εμπιστοσύνη σας. Επιλέγοντας \"Τέλος\" απλά επιβεβαιώνετε ότι η επαφή %s είναι μέλος αυτής της ομαδικής συζήτησης. Έχετε απενεργοποιήσει αυτόν τον λογαριασμό + Σφάλμα ασφάλειας: Μη έγκυρη πρόσβαση σε αρχείο! + Δεν βρέθηκε εφαρμογή για να μοιραστείτε την διεύθυνση URI Διαμοιρασμός της διεύθυνσης URI με...
Εγγράφεστε με τον τηλεφωνικό σας αριθμό και το Quicksy αυτόματα — με βάση τους τηλεφωνικούς αριθμούς στο βιβλίο διευθύνσεών σας — προτείνει πιθανές επαφές για εσάς.

Με την εγγραφή σας συμφωνείτε με την πολιτική απορρήτου μας.]]>
+ Συμφωνώ και προχωρήστε + Θα καθοδηγηθείτε στη διαδικασία δημιουργίας ενός λογαριασμού στο conversations.im.¹\nΕπιλέγοντας το conversations.im ως πάροχο θα μπορείτε να επικοινωνείτε με χρήστες άλλων παρόχων δίνοντάς τους την πλήρη διεύθυνση XMPP σας. Η πλήρης ταυτότητα XMPP σας θα είναι: %s Δημιουργία λογαριασμού Χρήση του δικού μου παρόχου @@ -453,8 +538,8 @@ Ορίστε την διαθεσιμότητά σας όταν διορθώνετε το μήνυμα κατάστασής σας. Μήνυμα κατάστασης Ελεύθερος για συνομιλία - Συνδεμένος - Λείπω + Σε σύνδεση + Εκτός χρήσης Μη διαθέσιμος Απασχολημένος Ένα ασφαλές συνθηματικό έχει δημιουργηθεί @@ -468,12 +553,17 @@ Μικρός Μεσαίος Μεγάλος + Δημοσιοποίηση της τελευταίας χρήσης + Επιτρέψτε στις επαφές σας να γνωρίζουν πότε χρησιμοποιείτε το Conversations Ιδιωτικότητα Θέμα Επιλογή παλέτας χρωμάτων Αυτόματο + Ανοιχτόχρωμο + Σκουρόχρωμο Πράσινο φόντο Χρήση πράσινου φόντου για εισερχόμενα μηνύματα + Αδυναμία σύνδεσης στο OpenKeychain Αυτή η συσκευή δεν χρησιμοποιείται πλέον Υπολογιστής Κινητό τηλέφωνο @@ -481,30 +571,41 @@ Περιηγητής ιστού Κονσόλα Απαιτείται πληρωμή + Απόδοση δικαιώματος χρήσης Internet Εγώ Η επαφή ζητά συνδρομή σε υπηρεσία παρουσίας Επιτρέπω Δεν υπάρχει δικαίωμα για πρόσβαση στο %s Δεν βρέθηκε ο απομακρυσμένος διακομιστής Λήξη χρόνου για τον απομακρυσμένο διακομιστή + Αδυναμία ενημέρωσης λογαριασμού + Αναφέρετε για αυτή την ταυτότητα XMPP ότι στέλνει ανεπιθύμητα μηνύματα. Διαγραφή ταυτοτήτων OMEMO + Αναδημιουργία των κλειδιών OMEMO. Όλες οι επαφές σας θα πρέπει να σας επαληθεύσουν πάλι. Χρησιμοποιήστε το μόνο ως τελευταία λύση. Διαγραφή επιλεγμένων κλειδιών Πρέπει να είστε συνδεμένοι για να δημοσιεύσετε το avatar σας. Εμφάνιση μηνύματος λάθους Μήνυμα λάθους - Ενεργοποίηση μείωσης χρήσης δεδομένων κινητής - Η συσκευή σας δεν υποστηρίζει την απενεργοποίηση μείωσης χρήσης δεδομένων κινητής για το Conversations. + Ενεργοποίηση μείωσης χρήσης δεδομένων + Το λειτουργικό σας σύστημα περιορίζει το Conversations από το να συνδέεται στο Internet όταν βρίσκεται στο παρασκήνιο. Για να λαμβάνετε ειδοποιήσεις νέων μηνυμάτων πρέπει να επιτρέψετε στο Conversations να έχει απεριόριστη πρόσβαση όταν ενεργοποιείται η μείωση χρήσης δεδομένων.\nΤο Conversations θα προσπαθεί να περιορίσει τη χρήση δεδομένων όταν είναι δυνατό. + Η συσκευή σας δεν υποστηρίζει την απενεργοποίηση μείωσης χρήσης δεδομένων για το Conversations. + Αδυναμία δημιουργίας προσωρινού αρχείου Αυτή η συσκευή έχει επαληθευτεί Αντιγραφή αποτυπώματος + Έχετε επαληθεύσει όλα τα κλειδιά OMEMO που κατέχετε + Ο γραμμοκώδικας δεν περιέχει αποτυπώματα για την συζήτηση αυτή. Επαληθευμένα αποτυπώματα - Χρήση της φωτογραφικής μηχανής για την σάρωση του γραμμοκώδικα κάποιας επαφής + Χρήση της φωτογραφικής μηχανής για την σάρωση του γραμμοκώδικα της επαφής Παρακαλώ περιμένετε την μεταφόρτωση των κλειδιών Διαμοιρασμός ως γραμμοκώδικα Διαμοιρασμός ως διεύθυνση URI XMPP Διαμοιρασμός ως σύνδεσμος HTTP Τυφλή εμπιστοσύνη πριν την επαλήθευση + Αυτόματη εμπιστοσύνη σε όλες τις νέες συσκευές επαφών που δεν έχουν επαληθευτεί παλιότερα, και παροχή χειροκίνητης επιβεβαίωσης κάθε φορά που μια επαληθευμένη επαφή προσθέτει μια νέα συσκευή. + Κλειδιά OMEMO με τυφλή εμπιστοσύνη, που σημαίνει ότι μπορεί να είναι κάποιος άλλος ή κάποιος τρίτος μπορεί να έχει αποκτήσει πρόσβαση. Μη έμπιστος - Άκυρος 2D γραμμοκώδικας + Άκυρος γραμμοκώδικας 2D + Καθαρισμός κρυφού φακέλου (χρησιμοποείται από την εφαρμογή φωτογραφικής μηχανής) Καθαρισμός κρυφής μνήμης Καθαρισμός ιδιωτικής αποθήκευσης Καθαρισμός ιδιωτικού χώρου όπου αποθηκεύονται αρχεία (Μπορούν να μεταφορτωθούν ξανά από τον διακομιστή) @@ -514,6 +615,7 @@ Εμφάνιση ανενεργών Απόκρυψη ανενεργών Αναίρεση εμπιστοσύνης συσκευής + Είστε βέβαιοι ότι θέλετε να αφαιρέσετε την επαλήθευση για αυτή τη συσκευή;\nΑυτή η συσκευή και μηνύματα που έρχονται από αυτή τη συσκευή θα σημειωθούν ως μη έμπιστα. %d δευτερόλεπτο %d δευτερόλεπτα @@ -539,23 +641,26 @@ %d μήνες Αυτόματη διαγραφή μηνυμάτων - Αυτόματη διαγραφή μηνυμάτων από αυτή την συσκευή που είναι παλιότερα από την ρυθμισμένη χρονική περίοδο + Αυτόματη διαγραφή μηνυμάτων από αυτή την συσκευή που είναι παλιότερα από την ρυθμισμένη χρονική περίοδο. Κρυπτογράφηση μηνύματος Χωρίς μεταφόρτωση μηνυμάτων λόγω τοπικού χρόνου διατήρησης. Συμπίεση βίντεο Οι αντίστοιχες συζητήσεις έκλεισαν. Η επαφή αποκλείστηκε. Ειδοποιήσεις από άγνωστους + Ειδοποίηση για μηνύματα και κλήσεις που προέρχονται από άγνωστους. Λήψη μηνύματος από άγνωστο Αποκλεισμός αγνώστου Αποκλεισμός ολόκληρου τομέα - συνδεμένος αυτή τη στιγμή + Σε σύνδεση αυτή τη στιγμή Επανάληψη αποκρυπτογράφησης Σφάλμα συνεδρίας Υποβάθμιση του μηχανισμού SASL Ο διακομιστής απαιτεί εγγραφή σε ιστοσελίδα Άνοιγμα ιστοσελίδας + Δεν βρέθηκε εφαρμογή για να ανοίξει την ιστοσελίδα Αναδυόμενες ειδοποιήσεις + Εμφάνιση αναδυόμενων ειδοποιήσεων Σήμερα Χτες Επαλήθευση ονόματος μηχανήματος με χρήση DNSSEC @@ -570,7 +675,7 @@ Προστατευμένες εφαρμογές Για να συνεχίσετε να λαμβάνετε ειδοποιήσεις, ακόμα κι όταν η οθόνη είναι σβηστή, χρειάζεται να προσθέσετε το Conversations στον κατάλογο με τις προστατευμένες εφαρμογές. Αποδοχή άγνωστου πιστοποιητικού; - Το πιστοποιητικό του διακομιστή δεν είναι υπογεγραμμένο από κάποια γνωστή Αρχή Πιστοποίησης + Το πιστοποιητικό του διακομιστή δεν είναι υπογεγραμμένο από κάποια γνωστή Αρχή Πιστοποίησης. Αποδοχή αναντίστοιχου ονόματος διακομιστή; Ο διακομιστής δεν ταυτοποιείται ως \"%s\". Το πιστοποιητικό είναι έγκυρο μόνο για: Θέλετε να συνδεθείτε έτσι κι αλλιώς; @@ -583,8 +688,10 @@ Διόρθωση μηνύματος κατάστασης Απενεργοποίηση κρυπτογράφησης Το Conversations δεν είναι δυνατό να στείλει κρυπτογραφημένα μηνύματα στην επαφή %1$s. Αυτό μπορεί να συμβαίνει γιατί η επαφή σας χρησιμοποιεί παλιότερο διακομιστή ή πρόγραμμα που δε μπορεί να χειριστεί κρυπτογράφηση OMEMO. + Αδύναμια μεταφόρτωσης λίστας συσκευών + Αδυναμία ανάσυρσης κλειδιών κρυπτογράφησης Συμβουλή: Σε κάποιες περιπτώσεις αυτό μπορεί να διορθωθεί αν αμοιβαία προστεθείτε στους καταλόγους επαφών σας. - Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε την κρυπτογράφηση OMEMO για αυτή τη συζήτηση;\nΑυτή η ενέργεια θα επιτρέψει στον διαχειριστή του διακομιστή να αναγνώσει τα μηνύματά σας, αλλά ίσως είναι ο μόνος τρόπος να επικοινωνήστε με επαφές που χρησιμοποιούν παλιότερα προγράμματα. + Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε την κρυπτογράφηση OMEMO για αυτή τη συζήτηση;\nΑυτή η ενέργεια θα επιτρέψει στον διαχειριστή του διακομιστή να αναγνώσει τα μηνύματά σας, αλλά ίσως είναι ο μόνος τρόπος να επικοινωνήσετε με επαφές που χρησιμοποιούν παλιότερα προγράμματα. Απενεργοποίηση τώρα Πρόχειρο: Κρυπτογράφηση OMEMO @@ -594,8 +701,8 @@ Δημιουργία συντόμευσης Μέγεθος γραμματοσειράς Το σχετικό μέγεθος γραμματοσειράς που χρησιμοποιείται στην εφαρμογή. - Ενεργοποιημένο ερήμην - Απενεργοποιημένο ερήμην + Ενεργοποιημένο από προεπιλογή + Απενεργοποιημένο από προεπιλογή Μικρό Μεσαίο Μεγάλο @@ -611,7 +718,9 @@ Διαμοιρασμός τοποθεσίας Εμφάνιση τοποθεσίας Διαμοιρασμός + Αδυναμία έναρξης εγγραφής Παρακαλώ περιμένετε... + Απόδοση δικαιώματος πρόσβασης στο μικρόφωνο για το Conversations Αναζήτηση μηνυμάτων GIF Εμφάνιση συζήτησης @@ -626,20 +735,27 @@ Ο κεντρικός υπολογιστής δεν υποστηρίζει εικόνες προφίλ σε ομαδικές συζητήσεις Μόνο ο ιδιοκτήτης μπορεί να αλλάξει την εικόνα προφίλ μιας ομαδικής συζήτησης Όνομα επαφής - Παρατσούκλι + Ψευδώνυμο Όνομα Η παροχή ονόματος είναι προαιρετική Όνομα ομαδικής συζήτησης Αυτή η ομαδική συζήτηση έχει καταστραφεί + Αδυναμία αποθήκευσης εγγραφής Υπηρεσία στο προσκήνιο Αυτή η κατηγορία ειδοποιήσεων χρησιμοποιείται για την εμφάνιση μιας μόνιμης ειδοποίησης που δείχνει πως εκτελείται το Conversations. Πληροφορίες κατάστασης Προβλήματα συνδεσιμότητας Αυτή η κατηγορία ειδοποιήσεων χρησιμοποιείται για να εμφανίσει μια ειδοποίηση σε περίπτωση που υπάρχει πρόβλημα σύνδεσης σε κάποιον λογαριασμό. Μηνύματα + Κλήσεις Μηνύματα + Εισερχόμενες κλήσεις + Κλήσεις σε εξέλιξη Σιωπηρά μηνύματα Αυτή η κατηγορία ειδοποιήσεων χρησιμοποιείται για να εμφανίσει ειδοποιήσεις που δεν θα έπρεπε να παράγουν ήχο. Για παράδειγμα όταν κάποιος είναι ενεργός σε άλλη συσκευή (περίοδος χάριτος). + Αποτυχημένες διανομές + Ρυθμίσεις ειδοποίησης μηνυμάτων + Ρυθμίσεις ειδοποίησης εισερχόμενων κλήσεων Σημασία, Ήχος, Δόνηση Συμπίεση βίντεο Εμφάνιση μέσου @@ -681,7 +797,10 @@ Ο κωδικός που σας έχει σταλεί έχει λήξει. Άγνωστο σφάλμα δικτύου. Άγνωστη απάντηση από τον διακομιστή. - Κάτι πήγε στραβά κατά την εξυπηρέτηση της αίτησής σας. + Αδυναμία σύνδεσης στον διακομιστή. + Αδυναμία δημιουργίας ασφαλούς σύνδεσης. + Αδυναμία εύρεσης του διακομιστή. + Κάτι δεν πήγε καλά κατά την εξυπηρέτηση της αίτησής σας. Μη έγκυρη εισαγωγή Προσωρινά μη διαθέσιμο. Προσπαθήστε αργότερα. Χωρίς σύνδεση δικτύου. @@ -694,7 +813,7 @@ Παρακαλώ εισάγετε το όνομά σας για να επιτρέψετε σε χρήστες, που δεν σας έχουν καταγράψει στα βιβλία διευθύνσεών τους, να γνωρίζουν ποιος/α είστε. Το όνομά σας Εισάγετε το όνομά σας - Χρησιμποιήστε το κουμπί διόρθωσης για να ορίσετε το όνομά σας. + Χρησιμοποιήστε το κουμπί διόρθωσης για να ορίσετε το όνομά σας. Απόρριψη αίτησης Εγκατάσταση Orbot Εκκίνηση Orbot @@ -709,6 +828,8 @@ Επαναφορά Εισάγετε τον κωδικό σας για τον λογαριασμό %s για να επαναφέρετε το αντίγραφο ασφαλείας. Μην χρησιμοποιείτε τη λειτουργία επαναφοράς αντιγράφων ασφαλείας για να κλωνοποιήσετε (ταυτόχρονη εκτέλεση) μια εγκατάσταση. Η επαναφορά αντιγράφου ασφαλείας προσφέρεται μόνο για μεταφορές ή σε περίπτωση που έχετε χάσει την αρχική συσκευή. + Αδυναμία επαναφοράς αντιγράφου ασφαλείας. + Αδυναμία αποκρυπτογράφησης του αντιγράφου ασφαλείας. Είναι ο κωδικός σωστός; Δημιουργία & Επαναφορά αντιγράφων ασφαλείας Εισάγετε τη διεύθυνση XMPP Δημιουργία ομαδικής συζήτησης @@ -723,24 +844,26 @@ Δημιουργία δημόσιου καναλιού... Αυτό το κανάλι υπάρχει ήδη Έχετε εισέρθει σε ένα προϋπάρχον κανάλι + Αδυναμία ορισμού ρυθμίσεων καναλιού Αλλαγή θέματος από οποιονδήποτε Πρόσκληση άλλων χρηστών από οποιονδήποτε Οποιοσδήποτε μπορεί να αλλάξει το θέμα. - Οι ιδιοκτήτες μπορούν να διορθώσουν το θέμα. - Οι διαχειριστές μπορούν να διορθώσουν το θέμα. - Οι ιδιοκτήτες μπορούν να προσκαλούν άλλους χρήστες. + Οι ιδιοκτήτες μπορούν να αλλάξουν το θέμα. + Οι διαχειριστές μπορούν να αλλάξουν το θέμα. + Οι κάτοχοι μπορούν να προσκαλούν άλλους χρήστες. Οποιοσδήποτε μπορεί να προσκαλεί άλλους χρήστες. Οι διευθύνσεις XMPP είναι ορατές στους διαχειριστές. Οι διευθύνσεις XMPP είναι ορατές σε όλους. Αυτό το δημόσιο κανάλι δεν έχει συμμετέχοντες. Προσκαλέστε τις επαφές σας ή χρησιμοποιήστε το κουμπί διαμοιρασμού για να διαδώσετε τη διεύθυνση XMPP του. - Αυτή η συζήτησης ιδιωτικής ομάδας δεν έχει συμμετέχοντες. + Αυτή η συζήτηση ιδιωτικής ομάδας δεν έχει συμμετέχοντες. Διαχείριση δικαιωμάτων Αναζήτηση συμμετεχόντων Το αρχείο είναι πολύ μεγάλο Επισύναψη - Ανακάλυψη καναλιών + Εύρεση καναλιών Αναζήτηση καναλιών Πιθανή παραβίαση ιδιωτικότητας! + search.jabber.network.

Χρησιμοποιώντας αυτή τη λειτουργία θα μεταβιβαστεί η διεύθυνση IP σας και οι όροι αναζήτησης σε αυτή την υπηρεσία. Δείτε την Πολιτική Ιδιωτικότητας της για περισσότερες πληροφορίες.]]>
Έχω ήδη λογαριασμό Προσθήκη υπάρχοντος λογαριασμού Εγγραφή νέου λογαριασμού @@ -748,21 +871,80 @@ Προσθήκη έτσι κι αλλιώς Αυτό μοιάζει με διεύθυνση καναλιού Διαμοιρασμός αντιγράφων ασφαλείας - Αντίγραφο Conversations + Αντίγραφο ασφαλείας Conversations Γεγονός Άνοιγμα αντιγράφου ασφαλείας Το αρχείο που επιλέξατε δεν είναι αντίγραφο ασφαλείας του Conversations Αυτός ο λογαριασμός έχει προστεθεί ήδη Παρακαλώ εισάγετε τον κωδικό για αυτό το λογαριασμό + Αδυναμία εκτέλεσης αυτής της λειτουργίας Είσοδος σε δημόσιο κανάλι... + Η εφαρμογή από την οποία έγινε διαμοίραση δεν έδωσε δικαιώματα πρόσβασης στο αρχείο. + jabber.network Τοπικός διακομιστής Οι περισσότεροι χρήστες πρέπει να επιλέξουν ‘jabber.network’ για καλύτερες προτάσεις από το σύνολο του οικοσυστήματος XMPP. - Μέθοδος ανακάλυψης καναλιού + Μέθοδος εύρεσης καναλιού Αντίγραφο ασφαλείας Σχετικά με + Παρακαλώ ενεργοποιήστε έναν λογαριασμό + Νέα κλήση + Εισερχόμενη κλήση + Εισερχόμενη κλήση βίντεο + Σύνδεση + Συνδέθηκε + Αποδοχή κλήσης + Τερματισμός κλήσης + Απάντηση + Παράβλεψη + Εύρεση συσκευών + Κουδούνισμα + Απασχολημένος + Αδυναμία σύνδεσης κλήσης + Απώλεια σύνδεσης + Αποσυρμένη κλήση + Αποτυχία εφαρμογής + Τερματισμός κλήσης + Κλήση σε εξέλιξη + Κλήση βίντεο σε εξέλιξη + Απενεργοποίηστε το Tor για να κάνετε κλήσεις + Εισερχόμενη κλήση + Εισερχόμενη κλήση · %s + Εξερχόμενη κλήση + Εξερχόμενη κλήση · %s + Αναπάντηση κλήση + Κλήση ήχου + Κλήση βίντεο + Βοήθεια + Εναλλαγή στη συζήτηση + Το μικρόφωνο δεν είναι διαθέσιμο + Μπορείτε να κάνετε μόνο μια κλήση τη φορά. + Επιστροφή στην κλήση σε εξέλιξη + Αδυναμία εναλλαγής κάμερας + Καρφίτσωμα στην κορυφή + Ξεκαρφίτσωμα από την κορυφή + Ίχνος GPX + Αδυναμία διόρθωσης μηνύματος + Όλες οι συζητήσεις + Αυτή η συζήτηση + Η φωτογραφία προφίλ σας + Φωτογραφία προφίλ του/της %s + Κρυπτογραφημένη με OMEMO + Κρυπτογραφημένη με OpenPGP + Χωρίς κρυπτογράφηση + Έξοδος + Ηχογράφηση μηνύματος τηλεφωνητή + Αναπαραγωγή ήχου + Παύση ήχου + Προσθήκη επαφής, δημιουργία ή είσοδος σε ομαδική συζήτηση, ή εύρεση καναλιών Εμφάνιση %1$d συμμετέχοντα Εμφάνιση %1$d συμμετεχόντων + + Κάποιο μήνυμα δεν ήταν δυνατό να παραδοθεί + Κάποια μηνύματα δεν ήταν δυνατό να παραδοθούν + + Αποτυχημένες διανομές + Περισσότερες επιλογές
diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index 31301b574..e92d6451e 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -753,6 +753,7 @@ Llamadas salientes Mensajes sin sonido Este grupo de notificaciones se usa para mostrar notificaciones que no deberían emitir ningún sonido. Por ejemplo, cuando estás activo en otro dispositivo (periodo de gracia). + Envíos fallidos Ajustes de notificación de mensajes Ajustes de notificación de llamadas Importancia, Sonido, Vibración @@ -920,6 +921,8 @@ Solo puedes hacer una llamada a la vez Volver a la llamada en curso No se ha podido cambiar de cámara + Fijar en la parte superior + Desfijar de la parte superior Recorrido GPX No se pudo corregir el mensaje Todas las conversaciones @@ -938,4 +941,6 @@ Ver %1$d Participante Ver %1$d Participantes + Envíos fallidos + Más opciones
diff --git a/src/main/res/values-fr/strings.xml b/src/main/res/values-fr/strings.xml index 523ec019f..e8918029b 100644 --- a/src/main/res/values-fr/strings.xml +++ b/src/main/res/values-fr/strings.xml @@ -4,6 +4,7 @@ Nouvelle conversation Gérer les comptes Gérer le compte + Fermer la conversation Détails du contact Détails du groupe Détails du canal @@ -399,6 +400,7 @@ Marquer comme lu Saisie Touche Entrée pour envoyer + Utilisez la touche Entrée pour envoyer un message. Vous pourrez toujours utiliser la combinaison Ctrl+Entrée pour envoyer un message, même si cette option est désactivée. Afficher la touche Entrée Remplacer la touche Émoticônes par une touche Entrée. audio @@ -458,7 +460,11 @@ Détraqué Disponibilité Absent quand l\'écran est éteint + Absent quand l\'écran est éteint + Occupé en mode silence + Occupé lorsque l\'appareil est en mode silencieux Indisponible en mode vibreur + Occupé lorsque l\'appareil est en mode vibreur Paramètres de connexion avancés Montrer le nom d\'hôte et le port lors du paramétrage d\'un compte xmpp.example.com @@ -747,6 +753,7 @@ Appels sortants Messages silencieux Ce groupe de notifications est utilisé pour afficher les notifications qui ne doivent pas émettre de son. Par exemple, lorsque le son est activé sur un autre appareil (délai de grâce). + Échec lors de la livraison Paramètres de notification des messages Paramètres de notification d\'appels entrants Importance, son, vibration @@ -894,6 +901,7 @@ Ça sonne Occupé Impossible de connecter l\'appel + Connexion perdue Appel annulé Échec de l\'application Raccrocher @@ -907,12 +915,36 @@ Appel manqué Appel audio Appel vidéo + Aide + Basculer vers la conversation Votre micro n\'est pas disponible Vous ne pouvez prendre qu\'un appel à la fois. Reprendre l\'appel en cours Impossible de changer de caméra + Épingler en haut de la liste + Détacher du haut de la liste + Trace GPX + Impossible de corriger le message + Toutes les conversations + Cette conversation + Votre avatar + Avatar pour %s + Chiffré avec OMEMO + Chiffré avec OpenPGP + Non chiffré + Quitter + Enregistrer un message vocal + Lire l\'audio + Mettre en pause l\'audio + Ajouter un contact, créer ou joindre un groupe de discussion, ou découvrir les salons Voir %1$d participant Voir %1$d participants + + Certains messages n\'ont pas pu être distribués + Certains messages n\'ont pu être distribués + + Échec lors de la livraison + Plus d\'options diff --git a/src/main/res/values-hu/strings.xml b/src/main/res/values-hu/strings.xml index 2201a659f..d1c193856 100644 --- a/src/main/res/values-hu/strings.xml +++ b/src/main/res/values-hu/strings.xml @@ -4,6 +4,7 @@ Új beszélgetés Fiókok kezelése Fiók kezelése + Beszélgetés bezárása Partner részletei Csoportos csevegés részletei Csatorna részletei @@ -39,6 +40,7 @@ Moderátor Résztvevő Látogató + Szeretné eltávolítani %s partnerét a partnerlistájából? Beszélgetései ezzel a partnerrel nem lesznek eltávolítva. Szeretné tiltani %s partnert, hogy ne tudjon üzeneteket küldeni? Szeretné feloldani %s partner tiltását és lehetővé tenni számára az üzenetek küldését? %s összes partnerét tiltja? @@ -63,6 +65,7 @@ Mentés Rendben A Conversations összeomlott + Azzal, hogy az XMPP fiókja használatával beküldi a veremkiíratásokat, elősegítheti a Conversations alkalmazás folyamatos fejlesztését. Küldés most Sose kérdezzen újra Nem sikerült kapcsolódni a fiókhoz @@ -77,6 +80,7 @@ Fájlok megosztása. Kérem várjon… Előzmények törlése Beszélgetés előzményeinek törlése + Biztosan törölni szeretné az összes üzenetet a beszélgetésen belül?\n\nFigyelmeztetés: Ez nem fogja érinteni a más eszközökön vagy kiszolgálókon tárolt üzeneteket. Fájl törlése Biztosan törölni szeretné ezt a fájlt?\n\nFigyelmeztetés: Ez nem fogja törölni a fájlnak azon másolatait, amelyek más eszközökön vagy kiszolgálókon vannak tárolva. A beszélgetés bezárása azután @@ -91,13 +95,16 @@ Küldés titkosítatlanul A visszafejtés sikertelen. Talán nem rendelkezik a megfelelő személyes kulccsal. OpenKeychain + A Conversations az OpenKeychain-t használja az üzenetek titkosításához és visszafejtéséhez, valamint a személyes kulcsai kezeléséhez.\n\nEz GPLv3+ szerint licencelt, és elérhető az F-Droid és a Google Play szoftveráruházakban.\n\n(Ezután indítsa újra a Conversations alkalmazást.) Újraindítás Telepítés Telepítse az OpenKeychain alkalmazás felajánlás… várakozás… Nem található OpenPGP kulcs + Nem lehet titkosítani az üzenetét, mert a partnere nem közölte a nyilvános kulcsát.\n\nKérje meg a partnerét, hogy állítsa be az OpenPGP-t. Nem találhatók OpenPGP kulcsok + Nem lehet titkosítani az üzenetét, mert a partnerei nem közölték a nyilvános kulcsukat.\n\nKérje meg a partnereit, hogy állítsák be az OpenPGP-t. Általános Fájlok fogadása Fájlok automatikus fogadása, amelyek kisebbek mint… diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index b7b8e356a..b48df3b3c 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -4,6 +4,7 @@ Nuova conversazione Gestisci account Gestisci account + Chiudi conversazione Dettagli del contatto Dettagli chat di gruppo Dettagli canale @@ -752,6 +753,7 @@ Chiamate in uscita Messaggi silenziosi Questo gruppo di notifiche è usato per mostrare notifiche che non devono riprodurre alcun suono. Ad esempio mentre si è attivi su un altro dispositivo (Periodo di grazia). + Recapiti falliti Impostazioni di notifica dei messaggi Impostazioni di notifica delle chiamate in arrivo Importanza, suono, vibrazione @@ -919,10 +921,30 @@ Puoi fare solo una chiamata alla volta. Torna alla chiamata in corso Impossibile cambiare fotocamera + Fissa in alto + Rimuovi dall\'alto Traccia GPX Impossibile correggere il messaggio + Tutte le conversazioni + Questa conversazione + Il tuo avatar + Avatar di %s + Crittografato con OMEMO + Crittografato con OpenPGP + Non crittografato + Esci + Registra in segreteria + Riproduci audio + Pausa + Aggiungi un contatto, crea o visita una chat di gruppo, o scopri canali Vedi %1$d partecipante Vedi %1$d partecipanti + + Un messaggio non è stato recapitato + Alcuni messaggi non sono stati recapitati + + Recapiti falliti + Altre opzioni diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index 92bf10639..18032caf2 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -4,6 +4,7 @@ 新しい会話 アカウントの管理 アカウントの管理 + この会話を閉じる 連絡先の詳細 談話室の詳細 チャンネルの詳細 @@ -15,6 +16,8 @@ 連絡先のブロックを解除 ドメインをブロック ドメインのブロックを解除 + 参加者をブロック + 参加者のブロックを解除 アカウントの管理 設定 会話で共有 @@ -26,6 +29,7 @@ ちょうど今 1 分前 %d 分前 + 未読%d件 送信中… メッセージを復号化しています。しばらくお待ちください… OpenPGP 暗号化メッセージ @@ -36,17 +40,20 @@ モデレーター 参加者 ビジター + 連絡先リストから %s を削除しますか? この連絡先との会話は削除されません。 %s からあなたに送信されるメッセージをブロックしますか? %s のブロックを解除し、あなたにメッセージを送信できるようにしますか? %s からの連絡をすべてブロックしますか? %s からの連絡をすべてブロック解除しますか? 連絡先をブロックしました ブロックしました + %s のブックマークを削除しますか? このブックマークとの会話は削除されません。 サーバーに新しいアカウントを登録 サーバーのパスワードを変更 …で共有 会話を始める 連絡先を招待 + 招待 連絡先 連絡先 キャンセル @@ -61,12 +68,19 @@ Conversations がクラッシュしました 今すぐ送信 今後表示しない + アカウントに接続できません + 複数のアカウントに接続できません + タップしてアカウントを管理 添付ファイル + 連絡先が連絡先リストにありません。追加しますか? 連絡先を追加 配信に失敗しました + 転送用画像の準備中 + 転送用画像の準備中 フィルを共有しています。しばらくお待ちください… 履歴をクリア 会話履歴をクリア + この会話のすべてのメッセージを削除してもよろしいですか?\n\n警告: 他のデバイスやサーバーに保存されているメッセージのコピーには影響しません。 ファイルを削除 このファイルを削除してもよろしいですか?\n\n警告: これは、他のデバイスやサーバーに保存されているファイルのコピーは削除しません。 その後、この会話を閉じる @@ -77,16 +91,20 @@ OMEMO 暗号化メッセージを送信 v\\OMEMO 暗号化メッセージを送信 OpenPGP 暗号化メッセージを送信 + ニックネームが変更されました 暗号化されていない送信 復号化に失敗しました。おそらく秘密鍵が正しくないようです。 OpenKeychain + Conversations は OpenKeychain を利用して、メッセージの暗号化および復号化、そしてあなたの公開鍵を管理します。\n\nOpenKeychain は GPLv3+ ライセンスの下で、F-Droid および Google Play から利用可能です。\n\n(後で Conversations を再起動してください。) 再起動 インストール OpenKeychain をインストールしてください 依頼中… 待機中… OpenPGP の鍵はありません + 連絡先が公開鍵を通知しないため、あなたのメッセージを暗号化することができません。\n\n連絡先に OpenPGP をセットアップするように依頼してください。 OpenPGP の鍵はありません + 連絡先が公開鍵を通知しないため、あなたのメッセージを暗号化することができません。\n\n連絡先に OpenPGP をセットアップするように依頼してください。 全般 ファイルを受取 自動的に小さいファイルを受取… @@ -96,12 +114,19 @@ 新しいメッセージが届いたときに振動します LED 通知 新しいメッセージが届いたときに通知ライトを点滅します + 着信音 + 通知音 + 新着メッセージの通知音 + 音声通話の着信音 猶予期間 + 別のデバイスでの操作を検知した際に、通知を止める時間の長さ 詳細 クラッシュレポートを送信しない + スタックトレースを送信して、Conversations の継続的な開発を支援します メッセージの確認 あなたがメッセージを受信して読んだときに、連絡先に知らせます UI + OpenKeychain でエラーが発生しました。 暗号化の鍵が不正です。 受付 エラーが発生しました @@ -114,8 +139,10 @@ 写真の撮影 事前にサブスクリプション要求を許可する 選択したファイルは画像ではありません + 画像ファイルを変換できません ファイルが見つかりません 一般的な I/O エラー。おそらく空き容量がなくなっていませんか? + あなたが画像の選択のために使用したアプリは、読み取りに必要なアクセス権がありません。\n\n別のファイルマネージャを使用して、画像を選択してください。 不明 一時的に無効 オンライン @@ -127,6 +154,7 @@ 登録に失敗しました ユーザー名はすでに使用されています 登録が完了しました + サーバーが登録をサポートしていません TLS ネゴシエーションに失敗しました ポリシー違反 互換性のないサーバー @@ -142,14 +170,17 @@ OpenPGP 公開鍵を公開 OpenPGP 公開鍵を削除 在席通知から OpenPGP 公開鍵を削除してもよろしいですか?\n連絡先はあなたに OpenPGP 暗号化メッセージを送信できなくなります。 + OpenPGP 公開鍵を公開しました。 アカウントを有効にする よろしいですか? + アカウントを削除すると会話履歴がすべて消去されます 音声を録音 XMPP アドレス XMPP アドレスをブロック username@example.com パスワード 正しい XMPP アドレスではありません + メモリ不足です。画像が大きすぎます %s をお使いのアドレス帳に追加しますか? サーバー情報 XEP-0313: メッセージ アーカイブ管理 diff --git a/src/main/res/values-pt-rBR/strings.xml b/src/main/res/values-pt-rBR/strings.xml index 9e92acd65..8c0f8518a 100644 --- a/src/main/res/values-pt-rBR/strings.xml +++ b/src/main/res/values-pt-rBR/strings.xml @@ -4,6 +4,7 @@ Nova conversa Gerenciar contas Gerenciar conta + Encerrar a conversa Detalhes do contato Detalhes da conversa em grupo Detalhes do canal @@ -752,6 +753,7 @@ Chamadas em andamento Silenciar mensagens Essa categoria de notificação é utilizada para exibir notificações que não deveriam gerar nenhum som. Por exemplo, quando estiver ativo em outro dispositivo (Período de Espera). + Entregas não efetuadas Configurações das notificações de mensagens configurações das notificações de chamadas recebidas Importância, som, vibração. @@ -919,10 +921,30 @@ Você só pode ter uma chamada de cada vez Retornar para a chamada em andamento Não foi possível trocar a câmera + Fixar no topo + Desafixar do topo Trilha GPX Não foi possível corrigir a mensagem + Todas as conversas + Essa conversa + Seu avatar + Avatar para %s + Criptografada com OMEMO + Criptografada com OpenPGP + Não criptografada + Sair + Gravar mensagem de voz + Tocar áudio + Pausar áudio + Adicionar contato, criar ou associar-se a uma conversa em grupo ou descobrir canais Ver %1$d participante Ver %1$d participantes + + Não foi possível enviar a mensagem + Não foi possível enviar algumas mensagens + + Entregas não efetuadas + Mais opções diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index 0e44707be..dd01117d9 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -4,6 +4,7 @@ 新对话 管理账户 管理账户 + 关闭 Conversation 联系人详情 群聊详情 频道详情 @@ -744,6 +745,7 @@ 正在进行的通话 无声消息 此通知组用于显示不应触发任何声音的通知。 例如,当在另一个设备上激活时(宽限期)。 + 发送失败 消息通知设置 来电通知设置 重要程度、声音、振动 @@ -911,9 +913,28 @@ 只能同时打一通电话 返回正在进行的通话 无法切换摄像头 + 置顶 + 取消置顶 GPX轨迹 无法更正消息 + 所有会话 + 该会话 + 你的头像 + %s的头像 + 用OMEMO加密 + 用OpenPGP加密 + 未加密 + 退出 + 语音邮件录音 + 播放音频 + 暂停音频播放 + 添加联系人、创建或加入群组会话,或发现频道 查看%1$d成员 + + 一些消息无法发送 + + 发送失败 + 更多选项 From fc532712121c0113702c40f4c9e9da48efbf5277 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sat, 14 Nov 2020 12:01:43 +0100 Subject: [PATCH 17/37] bump version to 2.9.1-beta --- build.gradle | 4 ++-- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index b88a0e779..55708fa9c 100644 --- a/build.gradle +++ b/build.gradle @@ -95,8 +95,8 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 29 - versionCode 398 - versionName "2.9.0" + versionCode 399 + versionName "2.9.1-beta" archivesBaseName += "-$versionName" applicationId "eu.siacs.conversations" resValue "string", "applicationId", applicationId diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 993c9a076..02d7d70dd 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Fri Nov 13 11:42:09 CET 2020 +#Sat Nov 14 09:59:55 CET 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip From 0c563134daf0c69f877960e8e9087b5193a9a183 Mon Sep 17 00:00:00 2001 From: eta Date: Sun, 4 Oct 2020 14:48:08 +0100 Subject: [PATCH 18/37] Enable the android:largeHeap flag - With large accounts (such as mine), Conversations starts hitting up against the default heap limit pretty quickly, at which point it grinds to a halt as GC pause times increase. - Furthermore, it's impossible to complete a backup with such an account, since Conversations will just run out of memory before the backup can complete. - Enabling the `android:largeHeap` flag asks the OS for a bit more memory, which hopefully alleviates the problem for larger accounts. --- src/main/AndroidManifest.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/AndroidManifest.xml b/src/main/AndroidManifest.xml index e89239bc8..16731574e 100644 --- a/src/main/AndroidManifest.xml +++ b/src/main/AndroidManifest.xml @@ -59,6 +59,7 @@ android:hardwareAccelerated="true" android:icon="@mipmap/new_launcher" android:label="@string/app_name" + android:largeHeap="true" android:networkSecurityConfig="@xml/network_security_configuration" android:requestLegacyExternalStorage="true" android:theme="@style/ConversationsTheme" From c7ec6a9dae2b1aa058daa1cc478c57ee6106adef Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Sun, 15 Nov 2020 10:43:19 +0100 Subject: [PATCH 19/37] let media scanner scan backup file. fixes #3913 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit note that the ROMs I tested this on don’t require scanning for it to appear on MTP. However it certainly don’t hurt either. --- .../services/ExportBackupService.java | 21 ++++++++++++------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/services/ExportBackupService.java b/src/main/java/eu/siacs/conversations/services/ExportBackupService.java index 7c98db35d..1c6a53878 100644 --- a/src/main/java/eu/siacs/conversations/services/ExportBackupService.java +++ b/src/main/java/eu/siacs/conversations/services/ExportBackupService.java @@ -58,7 +58,7 @@ public class ExportBackupService extends Service { private static final int NOTIFICATION_ID = 19; private static final int PAGE_SIZE = 20; - private static AtomicBoolean running = new AtomicBoolean(false); + private static final AtomicBoolean RUNNING = new AtomicBoolean(false); private DatabaseBackend mDatabaseBackend; private List mAccounts; private NotificationManager notificationManager; @@ -67,7 +67,7 @@ public class ExportBackupService extends Service { //http://www.openintents.org/action/android-intent-action-view/file-directory //do not use 'vnd.android.document/directory' since this will trigger system file manager - Intent openIntent = new Intent(Intent.ACTION_VIEW); + final Intent openIntent = new Intent(Intent.ACTION_VIEW); openIntent.addCategory(Intent.CATEGORY_DEFAULT); if (Compatibility.runsAndTargetsTwentyFour(context)) { openIntent.setType("resource/folder"); @@ -76,17 +76,15 @@ public class ExportBackupService extends Service { } openIntent.putExtra("org.openintents.extra.ABSOLUTE_PATH", path); - Intent amazeIntent = new Intent(Intent.ACTION_VIEW); + final Intent amazeIntent = new Intent(Intent.ACTION_VIEW); amazeIntent.setDataAndType(Uri.parse("com.amaze.filemanager:" + path), "resource/folder"); //will open a file manager at root and user can navigate themselves - Intent systemFallBack = new Intent(Intent.ACTION_VIEW); + final Intent systemFallBack = new Intent(Intent.ACTION_VIEW); systemFallBack.addCategory(Intent.CATEGORY_DEFAULT); systemFallBack.setData(Uri.parse("content://com.android.externalstorage.documents/root/primary")); return Arrays.asList(openIntent, amazeIntent, systemFallBack); - - } private static void accountExport(final SQLiteDatabase db, final String uuid, final PrintWriter writer) { @@ -218,7 +216,7 @@ public class ExportBackupService extends Service { @Override public int onStartCommand(Intent intent, int flags, int startId) { - if (running.compareAndSet(false, true)) { + if (RUNNING.compareAndSet(false, true)) { new Thread(() -> { boolean success; List files; @@ -231,7 +229,7 @@ public class ExportBackupService extends Service { files = Collections.emptyList(); } stopForeground(true); - running.set(false); + RUNNING.set(false); if (success) { notifySuccess(files); } @@ -322,12 +320,19 @@ public class ExportBackupService extends Service { } writer.flush(); writer.close(); + mediaScannerScanFile(file); Log.d(Config.LOGTAG, "written backup to " + file.getAbsoluteFile()); count++; } return files; } + private void mediaScannerScanFile(final File file) { + final Intent intent = new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE); + intent.setData(Uri.fromFile(file)); + sendBroadcast(intent); + } + private void notifySuccess(final List files) { final String path = FileBackend.getBackupDirectory(this); From 36f5f77c30b9c51c15f1f6bb56ca11b8a64788a3 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 16 Nov 2020 12:08:07 +0100 Subject: [PATCH 20/37] disable autofill for password field when not in init mode maybe fixes #3924 --- .../eu/siacs/conversations/ui/EditAccountActivity.java | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java index dcccec104..d7eff28ec 100644 --- a/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java +++ b/src/main/java/eu/siacs/conversations/ui/EditAccountActivity.java @@ -9,6 +9,7 @@ import android.content.SharedPreferences; import android.databinding.DataBindingUtil; import android.graphics.Bitmap; import android.net.Uri; +import android.os.Build; import android.os.Bundle; import android.os.Handler; import android.preference.PreferenceManager; @@ -64,6 +65,7 @@ import eu.siacs.conversations.ui.util.AvatarWorkerTask; import eu.siacs.conversations.ui.util.MenuDoubleTabUtil; import eu.siacs.conversations.ui.util.PendingItem; import eu.siacs.conversations.ui.util.SoftKeyboardUtils; +import eu.siacs.conversations.utils.CharSequenceUtils; import eu.siacs.conversations.utils.CryptoHelper; import eu.siacs.conversations.utils.Resolver; import eu.siacs.conversations.utils.SignupUtils; @@ -964,6 +966,10 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat } + if (!mInitMode && Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { + this.binding.accountPassword.setImportantForAutofill(View.IMPORTANT_FOR_AUTOFILL_NO); + } + final boolean editable = !mAccount.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY) && !mAccount.isOptionSet(Account.OPTION_FIXED_USERNAME) && QuickConversationsService.isConversations(); this.binding.accountJid.setEnabled(editable); this.binding.accountJid.setFocusable(editable); @@ -975,10 +981,10 @@ public class EditAccountActivity extends OmemoActivity implements OnAccountUpdat updateDisplayName(displayName); - final boolean tooglePassword = mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) || !mAccount.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY); + final boolean togglePassword = mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) || !mAccount.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY); final boolean editPassword = !mAccount.isOptionSet(Account.OPTION_MAGIC_CREATE) || (!mAccount.isOptionSet(Account.OPTION_LOGGED_IN_SUCCESSFULLY) && QuickConversationsService.isConversations()) || mAccount.getLastErrorStatus() == Account.State.UNAUTHORIZED; - this.binding.accountPasswordLayout.setPasswordVisibilityToggleEnabled(tooglePassword); + this.binding.accountPasswordLayout.setPasswordVisibilityToggleEnabled(togglePassword); this.binding.accountPassword.setFocusable(editPassword); this.binding.accountPassword.setFocusableInTouchMode(editPassword); From 600f2437979dd1fb779fb830eb2830b5e73caacc Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 16 Nov 2020 12:22:50 +0100 Subject: [PATCH 21/37] pulled translations from transifex --- src/main/res/values-de/strings.xml | 1 + src/main/res/values-es/strings.xml | 5 ++++ src/main/res/values-gl/strings.xml | 1 + src/main/res/values-ja/strings.xml | 39 ++++++++++++++++++++++++++ src/main/res/values-ro-rRO/strings.xml | 1 + src/main/res/values-zh-rCN/strings.xml | 1 + 6 files changed, 48 insertions(+) diff --git a/src/main/res/values-de/strings.xml b/src/main/res/values-de/strings.xml index 7fb86bfea..74985fea3 100644 --- a/src/main/res/values-de/strings.xml +++ b/src/main/res/values-de/strings.xml @@ -947,4 +947,5 @@ Fehlgeschlagene Zustellungen Weitere Optionen + Keine Anwendung gefunden diff --git a/src/main/res/values-es/strings.xml b/src/main/res/values-es/strings.xml index e92d6451e..2a70dccea 100644 --- a/src/main/res/values-es/strings.xml +++ b/src/main/res/values-es/strings.xml @@ -941,6 +941,11 @@ Ver %1$d Participante Ver %1$d Participantes + + Un mensaje no se ha podido entregar + Algunos mensajes no se han podido entregar + Envíos fallidos Más opciones + No se ha encontrado aplicación diff --git a/src/main/res/values-gl/strings.xml b/src/main/res/values-gl/strings.xml index f90e61f10..baa9ffb8d 100644 --- a/src/main/res/values-gl/strings.xml +++ b/src/main/res/values-gl/strings.xml @@ -947,4 +947,5 @@ Entregas fallidas Máis opcións + Non se atopa unha aplicación diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index 18032caf2..b8353fb63 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -196,9 +196,14 @@ 利用不可 公開鍵の通知がありません ちょうど今会いました + 1 分前に会いました %d 分前に会いました + 1 時間前に会いました %d 時間前に会いました + 1 日前に会いました %d 日前に会いました + 暗号化されたメッセージです。復号化するには OpenKeychain をインストールしてください。 + 新しい OpenPGP 暗号化されたメッセージが見つかりました OpenPGP 鍵 ID OMEMO フィンガープリント v\\OMEMO フィンガープリント @@ -209,6 +214,7 @@ 鍵の取得中… 完了 復号化 + ブックマーク 検索 連絡先を入力 連絡先を削除 @@ -224,8 +230,11 @@ ブックマークとして保存 ブックマークを削除 グループチャットを破棄する + チャンネルを破棄する このグループチャットを破棄してもよろしいですか?\n\n警告: グループチャットはサーバーから完全に削除されます。 + このチャンネルを破棄してもよろしいですか?\n\n警告: チャンネルはサーバーから完全に削除されます。 グループチャットを削除できません + チャンネルを削除できません 談話室の題を編集 トピック 談話室に参加しています… @@ -234,25 +243,32 @@ 戻りを追加 %s はここまで読みました %s はここまで読みました + %1$s +%2$d 全員ここまで読みました 全員ここまで読みました 公開 + アバターをタップしてギャラリーから画像を選択します 公開中… サーバーがあなたの公開を拒否しました + 画像を変換できません ディスクにアバターを保存できませんでした (または長押しするとデフォルトに戻します) + ご利用のサーバーは、アバターの公開をサポートしていません ささやいた %s へ プライベートメッセージを %s に送信 接続 このアカウントはすでに存在します 次へ + セッションが確立 スキップ 通知を無効にする 有効 談話室にはパスワードが必要 パスワードを入力してください + 最初に連絡先から参加アップデートを要求してください。\n\nこれは、連絡先が何のクライアントを使用しているかを決めるために使用されます。 今すぐ要求 無視 + 警告: 相互の参加アップデートなしにこれを送信すると、予期しない問題が発生する可能性があります。\n\nあなたの参加サブスクリプションを検証するために、連絡先の詳細に移動します。 セキュリティ メッセージの修正を許可 連絡先が、遡及的に自分のメッセージを編集することを許可します @@ -266,6 +282,8 @@ 消音時間の間、通知は無音になります その他 ブックマークと同期 + ブックマークに従って、グループチャットに自動参加します。 + OMEMO フィンガープリントをクリップボードにコピーしました この談話室から締め出されています この談話室はメンバー制です リソース制約 @@ -284,6 +302,7 @@ 再送 ファイル URL URL をクリップボードにコピーしました + XMPP アドレスをクリップボードにコピーしました エラーメッセージをクリップボードにコピーしました ウェブアドレス 2D バーコードをスキャン @@ -292,7 +311,16 @@ アカウントの詳細 確認 再度実行してください + フォアグラウンドサービス オペレーティングシステムが接続を切断するのを防止します + バックアップを作成 + バックアップファイルは %s に保存されます + バックアップを作成しています + バックアップを作成しました + バックアップファイルは %s に保存されました + バックアップを復元 + バックアップを復元しました + アカウントを有効にしてください。 ファイルの選択 %1$s 受信中 (%2$d%% 完了) %s のダウンロード @@ -300,16 +328,25 @@ ファイル %s を開く 送信中 (%1$d%% 完了) + 転送用ファイルの準備中 %s ダウンロード依頼中 転送をキャンセル + ファイル転送に失敗しました + 転送をキャンセルしました + ファイルを削除しました + ファイルを開くアプリケーションが見つかりません + リンクを開くアプリケーションが見つかりません + 連絡先を表示するアプリケーションが見つかりません ダイナミック タグ 連絡先の下に、読み取り専用タグを表示します 通知を有効にする 談話室のサーバーが見つかりませんでした + グループチャットを作成できません アカウント アバター OMEMO フィンガープリントをクリップボードにコピー OMEMO 鍵を再生成 デバイスをクリア + この連絡先で使用可能な鍵がありません。\nサーバーから新しい鍵を取得できませんでした。連絡先のサーバーに問題がある可能性があります。 何か問題が発生しました。 サーバーから履歴を取得中 サーバーにこれ以上履歴はありません @@ -319,6 +356,7 @@ パスワードの変更 現在のパスワード 新しいパスワード + パスワードは空にできません すべてのアカウントを有効にする すべてのアカウントを無効にする アクションを実行... @@ -332,6 +370,7 @@ グループチャットから削除 %s の所属を変更できません 談話室から蹴り出す + チャンネルから追い出す 今すぐ禁止 %s の役割を変更できません プライベート、メンバーのみ diff --git a/src/main/res/values-ro-rRO/strings.xml b/src/main/res/values-ro-rRO/strings.xml index aeaecbeac..1309e6dce 100644 --- a/src/main/res/values-ro-rRO/strings.xml +++ b/src/main/res/values-ro-rRO/strings.xml @@ -957,4 +957,5 @@ Trimiteri eșuate Mai multe + Nu s-a găsit nici o aplicație diff --git a/src/main/res/values-zh-rCN/strings.xml b/src/main/res/values-zh-rCN/strings.xml index dd01117d9..414919b34 100644 --- a/src/main/res/values-zh-rCN/strings.xml +++ b/src/main/res/values-zh-rCN/strings.xml @@ -937,4 +937,5 @@ 发送失败 更多选项 + 没有找到应用程序 From 3c7ac2524f51d9a523d4eea4cb7c5a3d518f1fa4 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Mon, 16 Nov 2020 12:54:40 +0100 Subject: [PATCH 22/37] update changelog file in preparation for 2.9.1 release --- CHANGELOG.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index be92a9db7..718d5bcd4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,10 @@ # Changelog +### Version 2.9.1 + +* fixed search on Android <= 5 +* optimize memory consumption + ### Version 2.9.0 * Search individual conversations From 35316ad93a83f6f5cdbe6ea78b1a40443db4c48d Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 25 Nov 2020 07:43:47 +0100 Subject: [PATCH 23/37] pulled translations from transifex --- src/conversations/res/values-el/strings.xml | 5 +- src/conversations/res/values-hu/strings.xml | 3 +- src/conversations/res/values-ja/strings.xml | 12 + src/conversations/res/values-sr/strings.xml | 9 + .../res/values-tr-rTR/strings.xml | 12 + src/main/res/values-it/strings.xml | 1 + src/main/res/values-ja/strings.xml | 2 + src/main/res/values-pl/strings.xml | 1 + src/main/res/values-tr-rTR/strings.xml | 544 ++++++++++++++++++ src/quicksy/res/values-el/strings.xml | 14 +- src/quicksy/res/values-tr-rTR/strings.xml | 26 + 11 files changed, 620 insertions(+), 9 deletions(-) create mode 100644 src/conversations/res/values-ja/strings.xml create mode 100644 src/conversations/res/values-sr/strings.xml create mode 100644 src/conversations/res/values-tr-rTR/strings.xml create mode 100644 src/quicksy/res/values-tr-rTR/strings.xml diff --git a/src/conversations/res/values-el/strings.xml b/src/conversations/res/values-el/strings.xml index 8850f9d73..cf50ea530 100644 --- a/src/conversations/res/values-el/strings.xml +++ b/src/conversations/res/values-el/strings.xml @@ -5,7 +5,8 @@ Δημιουργία νέου λογαριασμού Έχετε ήδη λογαριασμό XMPP; Αυτό μπορεί να συμβαίνει αν ήδη χρησιμοποιείτε ένα άλλο πρόγραμμα XMPP ή έχετε χρησιμοποιήσει το Conversations παλιότερα. Αν όχι, μπορείτε να δημιουργήσετε ένα νέο λογαριασμό XMPP τώρα.\nΧρήσιμη πληροφορία: Κάποιοι πάροχοι e-mail παρέχουν επίσης και λογαριασμούς XMPP. Το XMPP είναι ένα δίκτυο άμεσης ανταλλαγής μηνυμάτων ανεξάρτητο παρόχου. Μπορείτε να χρησιμοποιήσετε αυτό το πρόγραμμα με όποιον διακομιστή XMPP επιθυμείτε.\nΓια διευκόλυνση πάντως μπορείτε να δημιουργήσετε έναν λογαριασμό στο conversations.im¹, έναν πάροχο ειδικά σχεδιασμένο για χρήση με το Conversations. - Έχετε προσκληθεί στο %1$s. Ένα όνομα χρήστη έχει ήδη επιλεγεί για εσάς. Θα σας καθοδηγήσουμε στη διαδικασία δημιουργίας λογαριασμού.\nΕπιλέγοντας τον %1$s ως πάροχο θα μπορείτε να επικοινωνείτε με χρήστες άλλων παρόχων δίνοντάς τους την πλήρη διεύθυνση XMPP σας. + Έχετε προσκληθεί στο %1$s. Θα σας καθοδηγήσουμε στη διαδικασία δημιουργίας λογαριασμού.\nΕπιλέγοντας τον %1$s ως πάροχο θα μπορείτε να επικοινωνείτε με χρήστες άλλων παρόχων δίνοντάς τους την πλήρη διεύθυνση XMPP σας. Έχετε προσκληθεί στο %1$s. Ένα όνομα χρήστη έχει ήδη επιλεγεί για εσάς. Θα σας καθοδηγήσουμε στη διαδικασία δημιουργίας λογαριασμού.\nΘα μπορείτε να επικοινωνείτε με χρήστες άλλων παρόχων δίνοντάς τους την πλήρη διεύθυνση XMPP σας. Η πρόσκλησή σας στον διακομιστή - \ No newline at end of file + Λάθος μορφοποίηση κώδικα παροχής + \ No newline at end of file diff --git a/src/conversations/res/values-hu/strings.xml b/src/conversations/res/values-hu/strings.xml index 28438fe16..39e3f00a9 100644 --- a/src/conversations/res/values-hu/strings.xml +++ b/src/conversations/res/values-hu/strings.xml @@ -8,4 +8,5 @@ Meghívást kapott a(z) %1$s kiszolgálóra. Végig fogjuk vezetni egy fiók létrehozásának folyamatán.\nHa a(z) %1$s kiszolgálót választja szolgáltatóként, akkor képes lesz más szolgáltatók felhasználóival is kommunikálni, ha megadja nekik a teljes XMPP-címét. Meghívást kapott a(z) %1$s kiszolgálóra. Már kiválasztottak Önnek egy felhasználónevet. Végig fogjuk vezetni egy fiók létrehozásának folyamatán.\nKépes lesz más szolgáltatók felhasználóival is kommunikálni, ha megadja nekik a teljes XMPP-címét. Az Ön kiszolgálómeghívása - \ No newline at end of file + Helytelenül formázott kiépítési kód + \ No newline at end of file diff --git a/src/conversations/res/values-ja/strings.xml b/src/conversations/res/values-ja/strings.xml new file mode 100644 index 000000000..656bd7c80 --- /dev/null +++ b/src/conversations/res/values-ja/strings.xml @@ -0,0 +1,12 @@ + + + XMPPプロバイダーを選択してください + conversations.imを利用する + アカウントを作成 + XMPPアカウントをお持ちですか?既にほかのXMPPクライアントを利用しているか、Conversationsを利用したことがある場合はこちら。初めての方は、今すぐ新しいXMPPアカウントを作成できます。\nヒント: eメールのプロバイダーがXMPPアカウントも提供している場合があります。 + XMPPは、プロバイダーに依存しないインスタントメッセージのプロトコルです。XMPPサーバーならどこでも、このクライアントを使用することができます。\nよろしければ、Conversationsに最適化されたプロバイダーconversations.im¹で簡単にアカウントを作成することもできます。 + %1$sへ招待されました。アカウント作成手順をご案内します。 \n%1$sをプロバイダーに選択してほかのプロバイダーのユーザーと会話するには、XMPPのフルアドレスを相手にお知らせください。 + %1$sへ招待されました。ユーザーネームは既に選択されています。アカウント作成手順をご案内します。 \nほかのプロバイダーのユーザーと会話するには、XMPPのフルアドレスを相手にお知らせください。 + サーバーの招待 + 仮コードの書式が不正です + \ No newline at end of file diff --git a/src/conversations/res/values-sr/strings.xml b/src/conversations/res/values-sr/strings.xml new file mode 100644 index 000000000..b9e417ed4 --- /dev/null +++ b/src/conversations/res/values-sr/strings.xml @@ -0,0 +1,9 @@ + + + Одаберите вашег ИксМПП провајдера + Користи conversations.im + Направи нови налог + Да ли већ имате ИксМПП налог? Извесно је да га имате ако користите неки ИксМПП клијент или сте раније користили Конверзацију. Ако немате, сада можете направити нови ИксМПП налог.\nСавет: неки поштански провајдери такође омогућавају и ИксМПП налоге. + ИксМПП је мрежа брзих порука, независна од провајдера. Овај клијент можете користити уз било који сервер по вашем избору.\nДа бисмо вам олакшали, омогућили смо креирање налога на conversations.im¹; провајдеру специјално прилаг.ођеном за коришћење уз Конверзацију + Ваша серверска позивница + \ No newline at end of file diff --git a/src/conversations/res/values-tr-rTR/strings.xml b/src/conversations/res/values-tr-rTR/strings.xml new file mode 100644 index 000000000..2d5e35236 --- /dev/null +++ b/src/conversations/res/values-tr-rTR/strings.xml @@ -0,0 +1,12 @@ + + + XMPP sağlayıcınızı seçin + conversations.im kullan + Yeni hesap oluştur + Zaten bir XMPP hesabınız var mı? Bunun sebebi, zaten başka bir XMPP istemcisi kullanıyor oluşunuz veya Conversations\'ı önceden kullanmış olmanız olabilir. Eğer durum bu değilse şimdi yeni bir XMPP hesabı oluşturabilirsiniz.\nİpucu: Bağzı e-posta sağlayıcıları da XMPP hesapları kullanabilir. + XMPP; anlık yazışmalar için bağımsız bir sağlayıcıdır. Bu istemciyi istediğiniz herhangi bir XMPP sunucusu ile birlikte kullanabilirsiniz.\nAncak kullanım rahatlığı adına sizin için conversations.im¹; Conversations için özellikle tasarlanmış bir sağlayıcıda hesap açmanızı kolaylaştırdık. + %1$s sağlayıcısına davet edildiniz. Sizi hesap oluşturulması konusunda yönlendireceğiz.\n%1$s bir sağlayıcı olark seçildiğinde, başka sağlayıcılar kullanan kullanıcılarla, onlara tam XMPP adresinizi vererek iletişim kurabileceksiniz. + %1$s sağlayıcısına davet edildiniz. Sizin için zaten bir kullanıcı adı seçildi. Sizi hesap oluşturulması konusunda yönlendireceğiz.\nBaşka sağlayıcılar kullanan kullanıcılarla, onlara tam XMPP adresinizi vererek iletişim kurabileceksiniz. + Sunucu davetiyeniz + Yanlış ayarlanmış düzenleme kodu + \ No newline at end of file diff --git a/src/main/res/values-it/strings.xml b/src/main/res/values-it/strings.xml index b48df3b3c..600cc0d19 100644 --- a/src/main/res/values-it/strings.xml +++ b/src/main/res/values-it/strings.xml @@ -947,4 +947,5 @@ Recapiti falliti Altre opzioni + Nessuna applicazione trovata diff --git a/src/main/res/values-ja/strings.xml b/src/main/res/values-ja/strings.xml index b8353fb63..f4a6a59dd 100644 --- a/src/main/res/values-ja/strings.xml +++ b/src/main/res/values-ja/strings.xml @@ -155,6 +155,7 @@ ユーザー名はすでに使用されています 登録が完了しました サーバーが登録をサポートしていません + トークンが無効です TLS ネゴシエーションに失敗しました ポリシー違反 互換性のないサーバー @@ -404,6 +405,7 @@ あなたがメッセージを書いているときに、連絡先に知らせます 位置を送信 位置を表示 + 位置を表示するアプリケーションが見つかりません 位置 会話が閉じられました システムの CA を信頼しない diff --git a/src/main/res/values-pl/strings.xml b/src/main/res/values-pl/strings.xml index 51a24e4c7..51ad53d0e 100644 --- a/src/main/res/values-pl/strings.xml +++ b/src/main/res/values-pl/strings.xml @@ -969,4 +969,5 @@ Administrator twojego serwera będzie mógł czytać twoje wiadomości, ale moż Nie dostarczone wiadomości Więcej ustawień + Nie znaleziono żadnej aplikacji diff --git a/src/main/res/values-tr-rTR/strings.xml b/src/main/res/values-tr-rTR/strings.xml index bc6abddaf..f50687617 100644 --- a/src/main/res/values-tr-rTR/strings.xml +++ b/src/main/res/values-tr-rTR/strings.xml @@ -4,6 +4,7 @@ Yeni konuşma Hesapları yönet Hesabı yönet + Konuşmayı kapat Kişi bilgileri Küme konuşması ayrıntıları Kanal ayrıntıları @@ -33,22 +34,26 @@ İleti deşifre ediliyor. Lütfen bekleyin… OpenPGP şifreli ileti Rumuz kullanılıyor + Geçersiz rumuz Yönetici Sahip Moderatör Katılımcı Ziyaretçi + %s adlı kişiyi listenizden çıkarmak ister misiniz? Bu kişi ile olan konuşmalar silinmeyecektir. %s kişisinin size ileti göndermesini engellemek istiyor musunuz? % kişisinin size ileti göndermesine koyduğunuz engellemeyi kaldırmak ve size ileti göndermesine izin vermek istiyor musunuz? %s üzerinden gelen tüm kişileri engellemek istiyor musunuz? %s üzerinden gelen kişilerdeki engellemeyi kaldırmak istiyor musunuz? Kişi engellendi Engellendi + %s kişisini yer imlerinden çıkarmak ister misiniz? Bu yer imi ile kayıtlı konuşmalar silinmeyecektir. Sunucuda yeni bir hesap oluştur Sunucudaki şifreni değiştir Paylaş... Konuşma başlat Kişi davet et + Davet et Kişiler Kişi İptal et @@ -61,30 +66,46 @@ Kaydet Tamam Conversations çöktü + XMPP hesabınız ile yığın izleri göndermeniz Conversations\'ın devam eden gelişimine yardımcı oluyor. Şimdi gönder Bir daha sorma + Hesaba bağlanılamadı + Birden fazla hesaba bağlanılamadı. + Hesaplarınızı yönetmek için dokununuz. Dosya ekle + Eksik olan bu kişiyi listenize eklemek ister misiniz? Kişi ekle ulaştırılamadı + Görüntü gönderilmeye hazırlanılıyor. + Görüntüler gönderilmeye hazırlanılıyor. Dosyalar Paylaşılıyor. Lütfen bekleyin... Geçmişi sil Konuşma geçmişini sil + Bu konuşmadaki tüm mesajları silmek istiyor musunuz? \n\nUyarı: Bu eylem, diğer aygıt ve sunucularda kayıtlı mesajları etkilemeyecektir. + Dosyayı sil + Bu dosyayı silmek istediğinizden emin misiniz? \n\nUyarı: Bu eylem, bu dosyanın diğer aygıt ve sunucularda kayıtlı kopyalarını silmeyecektir. + Devamında bu konuşmayı kapat Aygıt seç Şifrelenmemiş ileti gönder + Mesajı gönder %s kişisine ileti gönder OMEMO ile şifrelenmiş ileti gönder v\\OMEMO ile şifrelenmiş ileti gönder OpenPGP ile şifrelenmiş ileti gönder + Yeni rumuz kullanımda Şifrelenmemiş gönder Deşifre edilemedi. Uygun bir özel anahtarınız olmayabilir. OpenKeychain + Conversations mesajları şifrelemek ve çözmek ve genel anahtarlarınızı yönetmek için OpenKeychain kullanmaktadır. \n\nlt GPLv3+ altında lisanslıdır ve F-Droid ve Google Play\'de mevcuttur. \n\n(Lütfen devamında Conversations\'ı yeniden başlatın.) Yeniden başlat Kur Lütfen OpenKeychain’i kur sunuluyor… bekliyor… Herhangi bir OpenPGP anahtarı bulunamadı + Bağlantınız genel anahtarını açıklamadığı için bağlanılamadı.\n\nLütfen bağlantızdan OpenPGP kurmasını isteyin. Herhangi bir OpenPGP anahtarı bulunamadı + Bağlantılarınız genel anahtarılarını açıklamadığı için bağlanılamadı.\n\nLütfen bağlantılarınızdan OpenPGP kurmaslarını isteyin. Genel Dosyaları kabul et …‘den küçük olan dosyaları kendiliğinden kabul et @@ -94,14 +115,23 @@ Yeni ileti geldiğinde titret LED Bildirimi Yeni bir ileti geldiğinde bildirim ışığı yanıp sönsün + Zil sesi + Bildirim sesi + Yeni mesajlar için bildirim sesi + Gelen çağrılar için zil sesi Mühlet + Cihazlarınızın birinde faaliyet tespit edilmesinden sonra zaman hatırlatmalarının susturulma uzunluğu. Gelişmiş Asla çöküş raporu gönderme + Yığın izi göndererek gelişime yardımcı oluyorsunuz. İletileri onayla Onların iletilerini aldığınızda ve okuduğunuzda, kişilerinizin bunu bilmesini sağlayın Arabirim + OpenKeychain bir hata verdi. + Kötü anahar şifrelemesi. Kabul et Bir hata oluştu + Hata Hesabınız Çevrim içi durum bildirimi gönder Çevrim içi durum bildirimi al @@ -110,8 +140,10 @@ Resim çek Abonelik isteğini peşinen kabul et Seçtiğiniz dosya bir görüntü dosyası değil + Görüntü dosyası dönüştürülemedi. Dosya bulunamadı Genel G/Ç hatası. Depolama yeri kalmamış olabilir mi? + Bu görüntüyü seçmekte kullandığınız uygulama, dosyanın okunması için yeterli izinleri sağlayamadı. Görüntüyü seçmek için farklı bir dosya yöneticisi kullan. Bilinmeyen Geçici olarak devre dışı Çevrim içi @@ -123,9 +155,13 @@ Hesap oluşturulamadı Kullanıcı adı kullanılıyor Hesap oluşturuldu + Hesap, sunucu tarafından desteklenmiyor. + Geçersiz hesak simgesi + TLS uzlaşması başarısız Politika ihlali Sunucu uyuşmazlığı Akış hatası + Akış açılım hatası Şifrelenmemiş OTR OpenPGP @@ -134,11 +170,19 @@ Geçici olarak devre dışı bırak Avatar yayımla OpenPGP genel anahtarını yayımla + OpenPGP genel anahtarını kaldır + OpenPGP genel anahtarınız Çevrim içi durum anonsunuzdan kaldırmak istediğinizden emin misiniz?\nArtık kişileriniz size şifrelenmiş OpenPGP mesajları gönderemeyecek. + OpenPGP genel anahtarı yayınlandı. Hesabı etkinleştir Emin misiniz? + Hesabınızın silinmesi bütün konuşma geçmişinizi siler Ses kaydet + XMPP adresi + XMPP adresini engelle kullanıcıadı@ornek.com parola + Bu geçerli bir XMPP adresi değil + Yetersiz bellek. Görüntü çok büyük. %s kişisini listenize eklemek ister misiniz? Sunucu bilgisi XEP-0313: MAM @@ -147,6 +191,7 @@ XEP-0191: Blocking Command XEP-0237: Roster Versioning XEP-0198: Stream Management + XEP-0215: Dış Hizmet Keşfi XEP-0163: PEP (Avatars / OMEMO) XEP-0363: HTTP File Upload XEP-0357: Push @@ -154,9 +199,14 @@ mevcut değil Kayıp genel anahtar bildirimleri en son şimdi görüldü + en son bir dakika önce görüldü en son %d dakika önce görüldü + en son bir saat önce görüldü en son %d saat önce görüldü + en son bir saat önce görüldü en son %d gün önce görüldü + Şifrelenmiş mesaj. Çözmek için lütfen OpenKeychain yükleyin. + Yeni şifrelenmiş OpenPGP mesajları bulundu OpenPGP Anahtar ID OMEMO parmak izi v\\OMEMO parmak izi @@ -167,8 +217,10 @@ Anahtarları alıyor… Tamam Şifreyi çöz + Yer imleri Ara Kişi Girin + Kişiyi sil Kişi bilgilerini görüntüle Kişiyi engelle Kişiyi engellemeyi kaldır @@ -176,57 +228,103 @@ Seç Kişi zaten mevcut Katıl + channel@cnoference.example.com/nick + channel@conference.example.com Yer imi olarak kaydet Yer imini sil + Grup konuşmasını yoket + Kanalı yoket + Bu grup konuşmasını yoketmek istediğinizden emin misiniz?\n\nUyarı: Grup konuşması sunucudan tamamen kaldırlacaktır. + Bu genel kanalı yoketmek istediğnizden emin misiniz?\n\nUyarı: Kanal sunucudan tamamen kaldırılacaktır. + Grup konuşması yokedilemedi + Kanal yokedilemedi + Grup konuşma konusunu düzenle + Başlık + Grup konuşmasına bağlanılıyor... Ayrıl Kişi sizi listesine ekledi Siz de ekleyin %s buraya kadar okudu + %sburaya kadar okudu + %1$s+%2$dkişi buraya kadar okudu + Buraya kadar herkes okudu Yayımla + Galeriden resim seçmek için avatara dokunun Yayımlanıyor… Sunucu yayımladığınızı reddetti + Resminiz dönüştürülemedi vatar diske kaydedilemedi (Veya varsayılan değerlere dönmek için uzun süre basılı tutun) + Sunucunuz avatarların tanıtılmasını desteklemiyor. fısıldandı %s kişisine %s kişisine özel ileti gönder Bağlan Bu hesap zaten mevcut Sonraki + Oturum oluşturuldu Atla Bildirimleri kapat Etkinleştir + Grup konuşması şifre talep ediyor Parolayı gir + Lütfen bağlantınızdan önce çevrim içi durum bildirimi talep edin. \n\nBu, bağlantınızın hangi konuşma uygulamasını kullandığını belirlemekte kullanılacak. Şimdi iste Yok say + Uyarı: Bu mesajı karşılıklı çevrim içi durum bildirimleri olmadan göndermek, beklenmeyen problemlere neden olabilir. \n\n Çevrim içi durum aboneliklerini doğrulamak için \"Kişi Bilgileri\" kısmına gidin. Güvenlik İleti düzeltmeye izin ver Kişilerinizin geçmiş iletilerini düzeltmelerine izin ver Uzman seçenekleri Lütfen dikkatli olun + %sHakkında Sessiz Saatler Başlangıç zamanı Bitiş zamanı Sessiz saatleri etkinleştir Bildirimler sessiz saatler boyunca sessize alınacaktır Diğer + Yer imleri ile senkronize et. + Yer imleri öyle belirtmişse grup konuşmalarına otomatik olarak katıl. + OMEMO parmak izi panoya kopyalandı + Bu grup konuşmasından menedildiniz + Bu grup konuşması yalnızca üyeleri içindir + Kaynak sınırlaması + Bu grup konuşmasından atıldınız + Grup konuşması kapatıldı + Artık bu grup konuşmasında değilsiniz %s hesabını kullanarak + %sev sahipliğinde HTTP sunucusundaki %s denetleniyor Bağlı değilsiniz. Daha sonra yeniden deneyin %s boyutunu denetle %2$s üzerindeki %1$s boyutunu denetle İleti seçenekleri Alıntı + Alıntı olarak yapıştır Orijinal URL\'i kopyala Yeniden gönder Dosya URL + URL panoya kopyalandı + XMPP adresi panoya kopyalandı + Hata mesajı panoya kopyalandı + web adresi 2B Barkod Tara 2B Barkod Göster Engellenenler listesini göster Hesap bilgileri Doğrula Yeniden deneyin + Ön planda çalışması İşletim sisteminin bağlantınızı koparmasına engel olur + Yedek oluştur + Yedekleme dosyaları %s\'da depolanacak + Yedekleme dosyaları oluşturuluyor + Yedeklemeniz oluşturuldu + Yedekleme dosyaları %s\'da depolandı + Yedekleme yükleniyor + Yedekleminiz yüklendi + Hesabı etkinleştirmeyi unutmayın Dosya seç %1$s alıyor/(%2$d%% tamamlandı) %s indir @@ -234,14 +332,28 @@ dosya %s aç gönderiyor (%1$d%% tamamlandı) + Dosya paylaşılmaya hazırlanılıyor %s indirme işlemi için sunuldu Aktarmayı iptal et + Dosya paylaşılanamadı + Dosya aktarma iptal edildi + Dosya silindi + Dosyayı açacak bir uygulama bulunamadı + Linki açacak bir uygulama bulunamadı + Kişiyi görüntüleyecek bir uygulama bulunamadı + Dinamik etiketler Kişilerin görünmeyen salt okunur etiketlerini göster Bildirimleri etkinleştir + Grup konuşma sunucusu bulunamadı + Grup konuşması oluşturulamadı Hesap avatarı OMEMO parmak izini panoya kopyala OMEMO anahtarını yeniden oluştur Aygıtları sil + OMEMO bildirimindeki diğer aygıtların hepsini silmek istediğinizden emin misiniz? Aygıtlarınız yeniden bağlandıklarında kendilerini yeniden bildirecekler ama bu süre zarfındaki iletileri alamayabilirler. + Bu kişi için kullanılabilecek bir anahtar bulunmuyor.\nSunucudan yeni anahtarlar alınamıyor. Belki bağlantınızın sunucusunda bir sorun vardır? + Bu kişi için kullanılabilir bir anahtar yok.\İkinizin de çevrim içi durum aboneliği oldudğundan emin olun. + Bir şeyler ters gitti Sunucudan geçmiş alınıyor Sunucuda başka geçmiş kalmadı Güncelleniyor… @@ -250,6 +362,7 @@ Parolayı değiştirin Mevcut parola Yeni parola + Şifre boş olamaz Tüm hesapları etkinleştir Tüm hesapları devre dışı bırak Kullanarak tamamla @@ -258,17 +371,36 @@ Bağlantısız Üye Gelişmiş kip + Üye imtiyazları tanı + Üye imtiyazlarını kaldır Yönetici imtiyazlarını kabul et Yönetici imtiyazlarını geri çevir + Sahip imtiyazları tanı + Sahip imtiyazlarını kaldır + Grup konuşmasından çıkar + Kanaldan çıkar %s kişisinin ortaklığı değiştirilemedi + Grup konuşmasından men et + Kanaldan men et + %s kişisini ortak kanaldan çıkarmaya çalışıyorsunuz. Bunu yapmanın tek yolu kişiyi tamamen men etmektir. Şimdi men et %s kişisinin rolü değiştirilemedi + Özel grup konuşması ayarları + Ortak kanal ayarları Özel, yalnızca üyeler + XMPP adreslerini herkes için görünür yap + Kanalı denetimli hale getir Katılımcı değilsiniz + Düzenlenmiş grup konuşması seçenekleri! + Grup konuşma seçenekleri düzenlenemedi Hiçbir zaman İkinci bildirime kadar + Ertele + Cevapla + Okundu olarak işaretle Girdi Enter=gönder + Mesaj yollamak için Enter tuşunu kullanın. Bu seçenek devre dışı olsa da her zaman Ctrl+Enter ile mesaj yollayabilirsiniz. \"Enter\" tuşunu göster İfade simgesi tuşunu \"enter\" tuşu olarak değiştir ses @@ -289,8 +421,11 @@ Siz onlara ileti yazarken kişilerinizin bunu bilmesini sağlayın Yer bildirimi gönder Yer bildirimi göster + Konum göstermek için uygulama bulunamadı Yer Konuşma sonlandı + Özel grup konuşmasından ayrıldı + Ortak kanaldan ayrıldı Sistem sertifikalarına güvenmeyin Tüm sertifikalar bizzat onaylanmalıdır Sertifikaları kaldır @@ -303,11 +438,15 @@ %d sertifikaları silindi %d sertifikaları silindi + \"Gönder\" tuşunu kısayol ile değiştir Kısayol Hiçbiri En son kullanılanlar Kısayolu seç + Kişilerde ara + Yer imleri ara Özel ileti gönder + %1$s grup konuşmasından ayrıldı Kullanıcı adı Kullanıcı adı Kullanıcı adı geçerli değil @@ -317,16 +456,28 @@ İndirme başarısız: Dosya yazılamıyor Tor ağına erişilemiyor Bağlantı başarısız + Sunucu bu alan adı için sorumlu değil Bozuk + Mevcudiyet Ekran kapandığında uzakta + Ekran kapalı olduğund Uzakta olarak göster + Müsait değilken sessiz kipte olur + Telefonunuz sessizdeyken, durum bildiriminizi müsait değil olarak gösterir. Titreşim kipini sessiz kip olarak değerlendir + Telefonunuz titreşimdeyken, durum bildiriminizi müsait değil olarak gösterir. Genişletilmiş bağlantı seçenekleri Hesap oluştururken sunucu adıyla bağlantı noktası seçeneğini göster xmpp.ornek.com + Sertifika ile giriş yap + Sertifika çözümlenemedi Arşivleme tercihleri Sunucu tarafı arşivleme tercihleri Arşivleme tercihleri alınıyor. Lütfen bekleyin... + Arşivleme tercihleri alınamadı + CAPTCHA gerekli Resimdeki yazıyı girin + Güvenilmeyen sertifika zinciri + XMPP adresi sertifika ile uyuşmuyor Sertifikayı yenile OMEMO anahtarı alınırken hata oluştu! Sertifikalı OMEMO anahtarı onaylandı! @@ -336,6 +487,7 @@ Tüm bağlantıları Tor ağı üzerinden aktar. Orbot gerekir. Sunucu adı Bağlantı noktası + Sunucu- veya .onion- adresi Bu bağlantı noktası geçerli değil Bu sunucu geçerli değil %2$d hesabın %1$d kadarı bağlandı @@ -344,23 +496,69 @@ %d ileti Daha fazla ileti yükle + Dosya %s ile paylaşıldı + Resim %sile paylaşıldı + Resimler %s ile paylaşıldı + Metin %s ile paylaşıldı + Conversations\'ın haricii depolama erişimine izin ver + Conversations\'ın kamera erişimine izin ver Kişilerle senkronize et + Conversations XMPP listenizi kişi listesi ile eşleştirmek ve kişileri tam isimleri ve avatarları ile görüntülemek için listenize erişim izni istiyor. \n\nlt kişilerinizi sadece yerel olarak okuyup eşleştirmekte olup sunucunuza yüklemeyecektir. +
Bu telefon numaralarının herhangi bir kopyasını depolamayacağız. \n\nDaha fazla bilgi için gizlilik sözleşmemizi okuyun.

Şimdi kişilerinize ulaşılması için sizden izin istenecek.
+ Tüm iletilerde uyar + Yalnızca bahsedilğinde haber ver + Uyarılar devre dışı + Uyarılar geçici olarak durduruldu + Görüntü sıkıştırma + İpucu: ayarladan bağımsız olarak sıkışktırılmamış resimleri ayrı ayrı göndermek için \'Resim seç\' yerine \'Dosya seç\' tuşunu kullanın. + Her zaman + Sadece büyük resimler + Pil optimizasyonu devrede + Telefonunuz Conversations için ağır pil optimizasyonları yürütüyor. Bu gecikmiş bildirimlere ve hatta mesaj kaybına neden olabilir.\nlt Optimizasyonların devre dış bırakılması tavsiye edilir. + Telefonunuz Conversations için ağır pil optimizasyonları yürütüyor. Bu gecikmiş bildirimlere ve hatta mesaj kaybına neden olabilir.\n\nSizden şimdi onları devre dışı bırakmanız istenilecek. + Devre dışı + Seçilen alan çok büyük + (Etkin hesap bulunmuyor) + Bu alan zorunludur + ileti düzelt + Düzeltilmiş iletiyi gönder + Bu kişinin güvenini doğrulamak için parmak izini zaten güvenle onayladınız. \"Tamam\"ı seçerek sadece%s kişisinin, grup konuşmasının bir parçası olduğunu doğruluyorsunuz. + Bu hesabı devre dışı bıraktınız + Güvenlik hatası: Geçersiz dosya erişimi! + URL paylaşacak uygulama bulunamadı + URI paylaş ile... +
Telefon numarası ile kayıt olursunuz ve Quicksy -adres defterinizdeki numaraları baz alarak- otomatik olarak size olası yeni kişiler önerir.

Kayıt olarak gizlilik sözleşmemizi onaylamış oluyorsunuz.]]>
Tüm iletilerde uyar + Yalnızca bahsedilğinde haber ver Uyarılar devre dışı Uyarılar geçici olarak durduruldu + Görüntü sıkıştırma + İpucu: ayarladan bağımsız olarak sıkışktırılmamış resimleri ayrı ayrı göndermek için \'Resim seç\' yerine \'Dosya seç\' tuşunu kullanın. Her zaman + Sadece büyük resimler Pil optimizasyonu devrede + Telefonunuz Conversations için ağır pil optimizasyonları yürütüyor. Bu gecikmiş bildirimlere ve hatta mesaj kaybına neden olabilir.\nlt Optimizasyonların devre dış bırakılması tavsiye edilir. + Telefonunuz Conversations için ağır pil optimizasyonları yürütüyor. Bu gecikmiş bildirimlere ve hatta mesaj kaybına neden olabilir.\n\nSizden şimdi onları devre dışı bırakmanız istenilecek. Devre dışı Seçilen alan çok büyük (Etkin hesap bulunmuyor) Bu alan zorunludur ileti düzelt Düzeltilmiş iletiyi gönder + Bu kişinin güvenini doğrulamak için parmak izini zaten güvenle onayladınız. \"Tamam\"ı seçerek sadece%s kişisinin, grup konuşmasının bir parçası olduğunu doğruluyorsunuz. Bu hesabı devre dışı bıraktınız + Güvenlik hatası: Geçersiz dosya erişimi! + URL paylaşacak uygulama bulunamadı URI paylaş ile... +
Telefon numarası ile kayıt olursunuz ve Quicksy -adres defterinizdeki numaraları baz alarak- otomatik olarak size olası yeni kişiler önerir.

Kayıt olarak gizlilik sözleşmemizi onaylamış oluyorsunuz.]]>
+ Kabul et ve devam et + Conversations\'da hesap kurulum için bir rehber hazırlanmıştır.¹\nConversations.im\'i bir sağlayıcı olarak seçtikten sonra başka sağlayıcılar kullanan kullanıcılarla onlara tam XMPP adresinizi vererek iletişim kurabilirsiniz. + Tam XMPP adresiniz %s olacak Hesap Oluştur Kendi sağlayıcımı kullan Kullanıcı adınızı seçin + Mevcudiyet durumunu elle yönet + Durumunuzu düzenlerken mevcudiyetinizi kaydedin Durum iletisi Konuşmak için uygun Çevrim içi @@ -372,15 +570,23 @@ Hesap oluşturulamadı: Sonra yeniden deneyin Kayıt Başarısız: Parola çok zayıf Katılımcıları seç + Grup konuşması oluşturuluyor... Yeniden davet et + Devre dışı bırak Kısa Orta Uzun + Kullanımı yayınla + Kişiler Conversations\'ı kullandığınız zaman bundan haberdar olur. Gizlilik Gövde Renk paletini seçin + Otomatik + Aydınlık + Karanlık Yeşil arka plan Gelen iletiler için yeşil arka plan kullan + OpenKeychain\'e bağlanılamadı Bu aygıt artık kullanılmıyor Bilgisayar Mobil telefon @@ -388,20 +594,29 @@ Web tarayıcı Konsol Ödeme gerekli + Internet kullanıma izin ver Ben Kişi sizi eklemek istiyor İzin ver %s e erişim hakkınız yok Uzak sunucu bulunamadı + Uzak sunucu zaman aşımına uğradı + Hesap güncellenemedi + Bu XMPP adresini spam mesajlardan dolayı rapor et OMEMO kimliğini sil + OMEMO anahtarını yeniden oluştur. Tüm kişilerinizin sizi yeniden doğrulaması gerekecek. Bunu yalnızca son çare olarak kullanın. Seçilen anahtarları sil Avatarınızı yayımlamak için bağlı olmalısınız. Hata iletisini göster Hata İletisi Veri tasarrufu etkin + İşletim sisteminiz Conversations arka planda çalışırken İnternet erişimini sınırlıyor. Yeni ileti alındığında uyarı gelmesi için Conversations\'a veri tasarrufu etkin durumdayken sınırsız erişim vermeniz gerekiyor.\nConversations mümkün olan durumlarda veri tasarrufu için çaba harcar. Aygıtınız Conversations için Veri tasarrufunu devre dışı bırakmayı desteklemiyor + Geçici dosya oluşturulamadı Bu aygıt doğrulandı Parmak izini kopyala + Sahip olduğunuz bütün OMEMO anahtarlarını doğruladınız + Barkod bu konuşmanın parmak izlerlerini içermiyor Doğrulanmış parmak izleri Bir kişinin barkodunu taramak için kamerayı kullan Anahtarların alınması için lütfen bekle @@ -409,21 +624,350 @@ XMPP URI\'si olarak paylaş HTTP bağlantısı olarak paylaş Doğrulamadan Önce Kör Güven + Doğrulanmamış kişilerin tüm yani aygıtlarına güven, ama doğrulanmış kişilerden aygıtlarını onaylamalarını iste. + OMEMO anahtarlarına körlemisne güvenildi, yani bu kişi bir başkası olabilir veya biri konuşmayı dinleyebilir. Güvenilmeyen Geçersiz 2D barkod + Önbellek dizinini temizle (Kamera uygulamasının kullandığı) Önbelleği temizle Özel depolama alanını temizle Dosyaların tutulduğu özel depolama alanını temizle (Sunucu üzerinden tekrar indirilebilir) Bu bağlantıyı güvenilir bir kaynaktan takip ettim Bir bağlantıyı tıkladıktan sonra %1$s in OMEMO anahtarını doğrulamış olacaksınız. Bu yalnızca bağlantının %2$s tarafından yayınladığından eminseniz güvenlidir. OMEMO anahtarlarını doğrula + Aktif olmayanları göster + Aktif olmayanları sakla Güvensiz aygıt + Bu cihazın doğrulamasını kaldırmak istediğinizden emin misiniz? \ Bu cihaz ve cihazdan gelen mesajlar güvenilmez olarak işaretlenecektir. + + %d saniye + %d saniye + + + %d dakika + %d dakika + + + %d saat + %d saat + + + %d gün + %d gün + + + %d hafta + %d hafta + + + %d ay + %d ay + Otomatik ileti silmek Bu cihazdan, ayarlanmış zaman aralığından eski olan mesajları otomatik olarak silin. İletiyi şifrelemek Yerel saklama süresi nedeniyle ileti getirilmiyor. + Video sıkıştırılıyor Konuşma sonlandı Kişi engellendi. Yabancılardan bildirimler + Yabancılardan alınan ileti ve aramaları bildir. Yabancıdan alınmış ileti + Yabancıyı blokla + Bütün alan adını engelle + Şu anda çevrimiçi + Tekrar şifrelemeyi dene + Oturum başarısız + SASL mekanizması downgrade edildi + Sunucu web sitesinden oturum açılmasını istiyor + Açık web sitesi + Web sitesini aç + Uyarı bildirimleri + Uyarı bildirimlerini göster + Bugün + Dün + Sunucu adını DNSSEC ile doğrula + Doğrulanmış sunucu adına sahip sunucu sertifikaları onaylanmış kabul edilir + Sertifika bir XMPP adresi içermiyor + kısmi + Video kaydet + Panoya kopyala + İleti panoya kopyalandı + İleti + Özel iletiler devre dışı bırakıldı + Korunan uygulamalar + Ekranınız kapalıyken bile bildirim almak için Conversations\'ı korunan uygulamalara eklemelisiniz. + Bilinmeyen sertifikayı kabul et? + Sunucu sertifikası bilinen bir Sertifika Yetkilisi tarafından imzalanmamış. + Uyuşmayan Sunucu isimlerini kabul et? + Sunucu \"%s\" olarak doğrulayamad. Bu sertifika sadece bunun için geçerlidir: + Yine de bağlanmak istiyor musunuz? + Sertifika detayları: + Bir kez + QR kod tarayıcısın kameraya erişmesi gerek + En alta in + İleti gönderdikten sonra alta in + Durum mesajını düzenle + Durum mesajını düzenle + Şifrelemeyi devre dışı bırak + Conversations %1$skişisine şifrelenmiş ileti gönderemiyor. Bunun sebebi, kişinizin tarihi geçmiş bir sunucu veya OMEMO çalıştıramayan bir istemci kullanıyor olması olabilir. + Aygıt listesi alınamadı + Şifreleme anahtarları alınamadı + İpucu: Kimi durumlarda bu sorun, birbirinizi kişi listenize eklemenizle çözülebilir. + Bu konuşma için OMEMO şifrelemesini devre dışı bırakmak istediğinizden emin misiniz?\nBu, sunucu yöneticinizin mesajlarınızı okumasını mümkün kılsa da, tarihi geçmiş istemcileri kullanan insanlarla iletişim kurmanın tek yolu olabilir. + Şimdi devre dışı bırak + Taslak: + OMEMO Şifrelemesi + Bire bir ve grup konuşmalarında her zaman OMEMO kullanılacak. + Yeni konuşmalarda OMEMO varsayılan olarak kullanılacak. + Özellikle yeni konuşmalarda OMEMO aktif hale getirilecek. + Kısayol oluştur + Yazı tipi boyutu + Uygulamaya kıyasla kullanılan yazı tipi boyutu. + Varsayılan olarak aktif + Varsayılan olarak devre dışı + Küçük + Orta + Büyük + İleti bu cihaz için şifrelenmedi + OMEMO mesajı çözümlenemedi + geri al + Konum paylaşımı devre dışı bırakıldı + Konumu sabitle + Konumu ayır + Konumu Kopyala + Konumu paylaş + Yol tarifi + Konumu paylaş + Konumu göster + Paylaş + Kayıt başlatılamadı + Lütfen bekleyin... + Conversations\'ın mikrofon erişimine izin ver + İleti ara + GIF + Konuşma görüntüle + Konum Eklentisini Paylaş + Varolan harita yerine Konum Eklentisini Paylaş\'ı kullan + Web adresini kopyala + XMPP adresini kopyala + S3 için HTTP Dosya Paylaşımı + Doğrudan arama + \'Konuşma Başlat\" ekranında klavyeyi aç ve arama kısmına imleci getir + Grup konuşması avatarı + Yönetici grup konuşması avatarlarını desteklemiyor + Yalnızca yönetici grup konuşması avatarını değiştirebilir + Kişi ismi + Rumuz + İsim + İsim vermek isteğe bağlıdır + Grup konuşması ismi + Bu grup konuşması yokedildi + Kayıt kaydedilemedi + Ön planda çalışması + Bu bildirim kategorisi Conversations\'ın çalıştığını sürekli belirtmekte kullanmaktadır. + Durum bilgisi + Bağlantı Sorunları + Bu bildirim kategorisi, bir hesaba bağlanmakta sorun olduğunu belirtmekte kullanılır + İletiler + Aramalar + İletiler + Gelen aramalar + Yapılan aramalar + Sessiz iletiler + Bu bildirim grubu, bildirimlerin herhangi bir ses çıkarmaması gerektiğini belirtmekte kullanılır. Mesela başka bir cihazda aktif olunduğunda (Mühlet) + Başarısız gönderiler + İleti bildirim ayarları + Gelen arama bildirimleri ayarları + Önem, Ses, Titreş + Video sıkıştırma + Medyayı görüntüle + Katılımcılar + Medya tarayıcısı + Dosya güvenlik ihlalinden dolayı dahil edilmedi + Video kalitesi + Daha düşük kalite, daha ufak dosya anlamına gelir + Orta (360P) + Yüksek (720p) + iptal edildi + Zaten taslak halinde bir iletiniz var + Özellik uygulanmadı + Geçersiz ülke kodu + Bir ülke seçin + telefon numarası + Telefon numaranızı doğrulayın + Quicksy, telefon numaranızı doğrulamak için bir SMS iletisi yollayacak (operatör fiyatlandırmaları uygulanabilir). Ülke kodunuzu ve telefon numaranızı giriniz: +
%s

telefon numarasını doğrulayacağız. Bu numara doğru mudur, yoksa numarayı değiştirmek mi istersiniz?]]>
+ %s geçerli bir telefon numarası değil. + Lütfen telefon numaranızı girin. + Ülkelerde ara + %s doğrula + %s telefonunuza bir SMS gönderdik.]]> + Size 6 haneli kodun olduğu başka bir SMS gönderdik. + Lüfen aşağıya 6 haneli kodu girin. + Tekrar sms gönder + Tekrar sms gönder (%s) + Lütfen bekleyin (%s) + geri + Olası kod, otomatik olarak panodan yapıştırıldı + Lütfen 6 haneli kodu girin. + Kayıt sürecini iptal etmek istediğinizden emin misiniz? + Evet + Hayır + Doğrulanıyor... + SMS talep ediliyor... + Girdiğiniz kod yanlış + Girdiğiniz kodun tarihi geçmiş + Bilinmeyen ağ hatası + Sunucudan bilinmeyen cevap + Sunucuya bağlanılamadı + Güvenli bağlantı oluşturulamadı + Sunucu bulunamadı + Talebinizin işlenmesinde bir hata meydana geldi + Geçersiz kullanıcı girişi + Geçici olarak ulaşılamıyor. Daha sonra tekrar deneyiniz. + Ağ bağlantısı yok + Lütfen %s içerisinde tekrar deneyiniz. + Çok fazla girişim + Bu uygulamamının tarihi geçmiş bir versiyonunu kullanıyorsunuz. + Güncelle + Bu telefon numarası şu anda başka bir cihazla giriş yapmış durumda. + Adres defterlerinde sizin kim olduğunuzu bilmeyen kişilerin sizi tanıması için lütfen isminizi girin. + Adınız + Adınızı girin + Adınızı belirlemek için düzenle tuşunu kullanın + Talebi reddet + Orbot\'u yükle + Orbot\'u başlat + Herhangi bir mağaza uygulaması yüklenmedi + Bu kanal XMPP adresinizi herkese açık hale getirecek. + e-kitap + Orijinal (sıkıştırılmamış) + Şununla aç... + Conversations profil resmi + Hesap seç + Yedekleri yükle + Geri getir + Yedekleri geri getirmek için %s hesabının şifrenizi girin. + Herhangi bir yüklemeyi klonlama (aynı anda çalışan) girişiminde yedekleri geri yükleme özelliğini kullanmayın. Yedeklerin geri yüklenmesi sadece hesap aktarımları veya asıl cihazı kaybetmeniz durumu için kullanılmalıdır. + Yedekler geri yüklenemedi + Yedekleme çözülemedi. Şifre doğru mu? + Yedekleme & Geri yükle + XMPP adresini girin + Grup konuşması oluştur + Ortak kanala katıl + Özel grup konuşması oluştur + Ortak kanal oluştur + Kanal ismi + XMPP adresi + Lütfen kanal için bir isim belirleyin + Lütfen bir XMPP adresi sağlayın + Bu bir XMPP adresi. Lütfen bir isim belirleyin. + Ortak kanal oluşturuluyor... + Bu kanal zaten var + Varolan bir kanala katıldınız + Kanal ayarları kaydedilemedi + Herhangi birinin başlığı düzenlemesine izin ver + Herhangi birinin davet etmesine izin ver + Herhangi biri başlığı düzenleyebilir. + Yöneticiler başlığı düzenleyebilir + Yöneticiler başlığı düzenleyebilir + Yöneticiler başkalarını davet edebilir. + Herhangi biri başkalarını davet edebilir. + XMPP adresleri yöneticelere görünür. + XMPP adresleri herkese görünür. + Bu ortak kanalın herhangi bir katılımcısı yok. Kişilerinizi davat edin veya paylaş düğmesi ile XMPP adresini paylaşın. + Bu özel grup konuşmasının herhangi bir katılımcısı yok. + İmtiyazları düzenle + Katılımcı ara + Dosya çok büyük + Ekle + Kanal keşfet + Kanal ara + Olası gizlilik ihlali! + search.jabber.network isimli bir üçüncü parti hizmeti kullanıyor.

Bu özelliği kullandığınız zaman IP adresiniz ve arama tercihleriniz bu hizmete aktarılacak. Daha fazla bilgi için Gizlilik Politikasını inceleyiniz.]]>
+ Zaten bir hesabım var + Varolan bir hesap ekle + Yeni hesap oluştur + Bu bir alan adı adresine benziyor + Yine de ekle + Bu bir kanal adresine benziyor + Yedekleme dosyalarını paylaş + Conversations yedeklemesi + Faaliyet + Yedeklemeyi aç + Seçtioiniz dosya bir Conversations yedekleme dosyası değildir + Bu hesap zaten kurulu vaziyette + Lütfen bu hesabın şifresini girin + Eylem gerçekleştirilemedi + Ortak kanala katılınıyor + Paylaşımda bulunan uygulama dosya erişimi için yetki sağlamıyor + + jabber.network + Yerel sunucu + XMPP ortamının genelinde daha iyi öneriler almak için çoğu kullanıcı \'jabber.network\'\'ü seçmelidir. + Kanal keşif yöntemi + Yedekle + Hakkında + Lütfen bir hesabı etkinleştirin + Arama yap + Gelen arama + Gelen görüntülü arama + Bağlanıyor + Bağlandı + Arama kabül ediliyor + Arama sonlandırılıyor + Cevapla + Reddet + Cihazlar keşfediliyor + Çaldırılıyor + Meşgul + Arama bağlanılamadı + Bağlantı kesildi + Geri çekilmiş arama + Uygulama hatası + Çağrıyı sonlandır + Devam eden arama + Deaam eden görüntülü arama + Arama yapmak için Tor\'u devre dışı bırak + Gelen arama + Gelen arama. %s + Yapılan arama + Yapılan arama. %s + Cevapsız arama + Sesli arama + Görüntülü arama + Yardım + Konuşmaya geç + Mikrofonunuza erişilemiyor + Bir seferde yalnızca tek bir aramanız olabilir. + Devam eden aramaya dön + Kamera açılamadı + En başa iliştir + En baştan kaldır + GPX izi + İleti düzeltilemedi + Bütün konuşmalar + Bu konuşma + Avatarınız + %s avatarı + OMEMO ile şifrelendi + OpenPGP ile şifrelendi + Şifrelenmedi + Çıkış + Sesli ileti kaydet + Sesi oynat + Sesi durdur + Kişi ekle, grup konuşması oluştur veya katıl, veya kanal keşfet + + %1$d + %1$d Katılımcılarını görüntüle + + + aaa + Bağzı iletiler gönderilemedi + + Başarısız gönderiler + Daha fazla seçenek + Herhangi bir uygulama bulunamadı diff --git a/src/quicksy/res/values-el/strings.xml b/src/quicksy/res/values-el/strings.xml index e699767ef..cd750c262 100644 --- a/src/quicksy/res/values-el/strings.xml +++ b/src/quicksy/res/values-el/strings.xml @@ -5,19 +5,21 @@ Το Quicksy χρησιμοποιεί μια τρίτη εφαρμογή που ονομάζεται OpenKeychain για να κρυπτογραφεί και να αποκρυπτογραφεί μηνύματα και να διαχειρίζεται τα δημόσια κλειδιά σας.\n\nΤο OpenKeychain δημοσιεύεται με την άδεια GPLv3 και είναι διαθέσιμο στο F-Droid και το Google Play.\n\n(Παρακαλώ επανεκκινήστε το Quicksy αμέσως μετά.) Το Quicksy αδυνατεί να κρυπτογραφήσει τα μηνύματά σας γιατί η επαφή σας δεν ανακοινώνει το δημόσιο κλειδί της.\n\nΠαρακαλώ ζητήστε από την επαφή σας να εγκαταστήσει το OpenPGP. Το Quicksy αδυνατεί να κρυπτογραφήσει τα μηνύματά σας γιατί οι επαφές σας δεν ανακοινώνουν το δημόσιο κλειδί τους.\n\nΠαρακαλώ ζητήστε από τις επαφές σας να εγκαταστήσουν το OpenPGP. - Η διάρκεια του χρόνου που το Quicksy σταματάει τη λειτουργία του καθώς ανιχνεύθηκε δραστηριόητα σε άλλη συσκευή - Στέλνοντας ίχνη στοίβας βοηθάτε την συνεχόμενη ανάπτυξη του Quicksy + Ο χρόνος σίγασης ειδοποιήσεων του Quicksy αφότου ανιχνευθεί δραστηριότητα σε μια από τις άλλες συσκευές σας. + Στέλνοντας ίχνη στοίβας προωθείτε την συνεχόμενη ανάπτυξη του Quicksy Το Quicksy χρειάζεται πρόσβαση στον εξωτερικό αποθηκευτικό χώρο Το Quicksy χρειάζεται πρόσβαση στην φωτογραφική μηχανή + Η συσκευή σας χρησιμοποιεί έντονη βελτιστοποίηση στην χρήση μπαταρίας του Quicksy που μπορεί να οδηγήσει σε αργοπορημένες ειδοποιήσεις ή ακόμα και σε απώλεια μηνυμάτων.\nΠροτείνεται να την απενεργοποιήσετε. + Η συσκευή σας χρησιμοποιεί έντονη βελτιστοποίηση στην χρήση μπαταρίας του Quicksy που μπορεί να οδηγήσει σε αργοπορημένες ειδοποιήσεις ή ακόμα και σε απώλεια μηνυμάτων.\nΘα σας ζητηθεί να την απενεργοποιήσετε. Επιτρέψτε στις επαφές σας να γνωρίζουν πότε χρησιμοποιείτε το Quicksy - Το λειτουργικό σας σύστημα περιορίζει το Quicksy από το να συνδέεται στο Internet όταν βρίσκεται στο παρασκήνιο. Για να λαμβάνετε ειδοποιήσεις νέων μηνυμάτων πρέπει να επιτρέψετε στο Quicksy να έχει απεριόριστη πρόσβαση όταν ενεργοποιείται η μείωση χρήσης δεδομένων κινητής.\nΤο Quicksy θα προσπαθεί να περιορίσει τη χρήση δεδομένων όταν είναι δυνατό. - Η συσκευή σας δεν υποστηρίζει την απενεργοποίηση μείωσης χρήσης δεδομένων κινητής για το Quicksy. + Το λειτουργικό σας σύστημα περιορίζει το Quicksy από το να συνδέεται στο Internet όταν βρίσκεται στο παρασκήνιο. Για να λαμβάνετε ειδοποιήσεις νέων μηνυμάτων πρέπει να επιτρέψετε στο Quicksy να έχει απεριόριστη πρόσβαση όταν ενεργοποιείται η μείωση χρήσης δεδομένων.\nΤο Quicksy θα προσπαθεί να περιορίσει τη χρήση δεδομένων όταν είναι δυνατό. + Η συσκευή σας δεν υποστηρίζει την απενεργοποίηση μείωσης χρήσης δεδομένων για το Quicksy. Για να συνεχίσετε να λαμβάνετε ειδοποιήσεις, ακόμα κι όταν η οθόνη είναι σβηστή, χρειάζεται να προσθέσετε το Quicksy στον κατάλογο με τις προστατευμένες εφαρμογές. Το Quicksy αδυνατεί να στείλει κρυπτογραφημένα μηνύματα στην επαφή %1$s. Αυτό μπορεί να συμβαίνει γιατί η επαφή σας χρησιμοποιεί παλιότερο διακομιστή ή πρόγραμμα που δε μπορεί να χειριστεί κρυπτογράφηση OMEMO. Το Quicksy χρειάζεται πρόσβαση στο μικρόφωνο Αυτή η κατηγορία ειδοποιήσεων χρησιμοποιείται για την εμφάνιση μιας μόνιμης ειδοποίησης που δείχνει πως εκτελείται το Quicksy. - Φωτογραφία προφίλ του quicksy - Το quicksy δεν είναι διαθέσιμο στην χώρα σας. + Φωτογραφία προφίλ του Quicksy + Το Quicksy δεν είναι διαθέσιμο στην χώρα σας. Αδυναμία επαλήθευσης της ταυτότητας του διακομιστή. Άγνωστο σφάλμα ασφάλειας. Λήξη χρονικού ορίου κατά τη σύνδεση στον διακομιστή. diff --git a/src/quicksy/res/values-tr-rTR/strings.xml b/src/quicksy/res/values-tr-rTR/strings.xml new file mode 100644 index 000000000..d2fe31568 --- /dev/null +++ b/src/quicksy/res/values-tr-rTR/strings.xml @@ -0,0 +1,26 @@ + + + Quicksy çalışmayı durdurdu + Çöküş raporu yollayarak Quicksy\'nin halihazırda devam eden gelişimine katkıda bulunuyorsunuz.\Uyarı:Çöküş raporları geliştiricilere gönderiminde XMPP hesabınız kullanılacak. + Quicksy; iletileri şifrelemek ve herkese açık anahtarlarınızı yönetmek içinOpenKeychain isimli bir üçüncü parti uygulaması kullanmaktadır.\n\nOpenKeychain GPLv3 altında lisanslıdır ve F-Droid ile Google Play üzerinden indirilebilir.\n\n (Lütfen sonrasında Quicksy\'i tekrar başlatın + Bağlantınız ortak anahatarını paylaşmıyor olduğu için Quicksy iletilerinizi şifreliyemiyor.\n\nLütfen bağlantınızdan OpenPGP kurmasını isteyin. + Kişileriniz ortak anahtarlarını yayımlamadığı için Conversations iletilerinizi şifreleyemiyor.\n\nLütfen kişilerden OpenPGP’yi ayarlamalarını isteyin. + Başka bir aygıt üstünde etkinlik algılandığında Quicksy\'nin sessiz kalma süresi + Çöküş raporu göndermeniz Quicksy\'nin geliştirlmesinde katkıda bulunacaktır. + Quicksy\'nin haricii depolamaya erişmesi gerekiyor + Quicksy\'nin kameraya erişmesi gerekiyor + Telefonunuz Quicksy için ağır pil optimizasyonları yürütüyor. Bu gecikmiş bildirimlere ve hatta mesaj kaybına neden olabilir.\nlt Optimizasyonların devre dış bırakılması tavsiye edilir. + Telefonunuz Quicksy için ağır pil optimizasyonları yürütüyor. Bu gecikmiş bildirimlere ve hatta mesaj kaybına neden olabilir.\n\nSizden şimdi onları devre dışı bırakmanız istenilecek. + Tüm kişileriniz ne zaman Quicksy kullandığınızı görsün + İşletim sisteminiz Quicksy arka planda çalışırken İnternet erişimini sınırlıyor. Yeni ileti alındığında uyarı gelmesi için Quicksy\'e veri tasarrufu etkin durumdayken sınırsız erişim vermeniz gerekiyor.\nQuicksy mümkün olan durumlarda veri tasarrufu için çaba harcar. + Aygıtınız Quicksy için Veri tasarrufunu devre dışı bırakmayı desteklemiyor + Ekranınız kapalıyken bile bildirim almak için Quicksy\'i korunan uygulamalara eklemelisiniz. + Quicksy %1$skişisine şifrelenmiş ileti gönderemiyor. Bunun sebebi, kişinizin tarihi geçmiş bir sunucu veya OMEMO çalıştıramayan bir istemci kullanıyor olması olabilir. + Quicksy\'nin mikrofona erişmesi gerekiyor + Bu bildirim kategorisi Quicksy\'nin çalıştığını sürekli belirtmekte kullanmaktadır. + Quicksy profil resmi + Quicksy ülkenizde kullanılamıyor. + Sunucu kimliği belirlenemiyor. + Bilinmeyen güvenlik hatası. + Sunucuya bağlanılırken zaman aşımına uğrandı. + From 92083fec83d6dda988ae98f012308db62fe7bcdc Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Wed, 25 Nov 2020 08:47:21 +0100 Subject: [PATCH 24/37] version bump to 2.9.1 --- build.gradle | 4 ++-- fastlane/metadata/android/en-US/changelogs/401.txt | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) create mode 100644 fastlane/metadata/android/en-US/changelogs/401.txt diff --git a/build.gradle b/build.gradle index 55708fa9c..12b601caf 100644 --- a/build.gradle +++ b/build.gradle @@ -95,8 +95,8 @@ android { defaultConfig { minSdkVersion 16 targetSdkVersion 29 - versionCode 399 - versionName "2.9.1-beta" + versionCode 401 + versionName "2.9.1" archivesBaseName += "-$versionName" applicationId "eu.siacs.conversations" resValue "string", "applicationId", applicationId diff --git a/fastlane/metadata/android/en-US/changelogs/401.txt b/fastlane/metadata/android/en-US/changelogs/401.txt new file mode 100644 index 000000000..0fba861d3 --- /dev/null +++ b/fastlane/metadata/android/en-US/changelogs/401.txt @@ -0,0 +1,3 @@ +* fixed search on Android <= 5 +* optimize memory consumption + From 1f392a688d1439fdf163cc767e3630d566726d83 Mon Sep 17 00:00:00 2001 From: Daniel Gultsch Date: Tue, 1 Dec 2020 20:31:30 +0100 Subject: [PATCH 25/37] initial (untested) support for easy onboarding invites --- src/conversations/AndroidManifest.xml | 4 + .../ui/EasyOnboardingInviteActivity.java | 157 ++++++++++++++++++ .../res/layout/activity_easy_invite.xml | 83 +++++++++ .../res/menu/easy_onboarding_invite.xml | 10 ++ src/conversations/res/values/strings.xml | 4 + .../services/XmppConnectionService.java | 38 +++++ .../ui/ConversationFragment.java | 2 +- .../ui/ConversationsActivity.java | 1 + .../ui/ConversationsOverviewFragment.java | 31 ++++ .../utils/EasyOnboardingInvite.java | 94 +++++++++++ .../eu/siacs/conversations/xml/Namespace.java | 1 + .../conversations/xmpp/XmppConnection.java | 52 ++++++ .../menu/fragment_conversations_overview.xml | 4 + src/main/res/values/strings.xml | 3 + 14 files changed, 483 insertions(+), 1 deletion(-) create mode 100644 src/conversations/java/eu/siacs/conversations/ui/EasyOnboardingInviteActivity.java create mode 100644 src/conversations/res/layout/activity_easy_invite.xml create mode 100644 src/conversations/res/menu/easy_onboarding_invite.xml create mode 100644 src/main/java/eu/siacs/conversations/utils/EasyOnboardingInvite.java diff --git a/src/conversations/AndroidManifest.xml b/src/conversations/AndroidManifest.xml index 90b78ed4c..62396bed1 100644 --- a/src/conversations/AndroidManifest.xml +++ b/src/conversations/AndroidManifest.xml @@ -20,6 +20,10 @@ android:name=".ui.MagicCreateActivity" android:label="@string/create_new_account" android:launchMode="singleTask" /> + share()); + if (bundle != null && bundle.containsKey("invite")) { + this.easyOnboardingInvite = bundle.getParcelable("invite"); + if (this.easyOnboardingInvite != null) { + showInvite(this.easyOnboardingInvite); + return; + } + } + this.showLoading(); + } + + @Override + public boolean onCreateOptionsMenu(Menu menu) { + getMenuInflater().inflate(R.menu.easy_onboarding_invite, menu); + final MenuItem share = menu.findItem(R.id.action_share); + share.setVisible(easyOnboardingInvite != null); + return super.onCreateOptionsMenu(menu); + } + + public boolean onOptionsItemSelected(MenuItem menuItem) { + if (menuItem.getItemId() == R.id.action_share) { + share(); + return true; + } else { + return super.onOptionsItemSelected(menuItem); + } + } + + private void share() { + final String shareText = getString( + R.string.easy_invite_share_text, + easyOnboardingInvite.getDomain(), + easyOnboardingInvite.getLandingUrl() + ); + final Intent sendIntent = new Intent(); + sendIntent.setAction(Intent.ACTION_SEND); + sendIntent.putExtra(Intent.EXTRA_TEXT, shareText); + sendIntent.setType("text/plain"); + startActivity(Intent.createChooser(sendIntent, getString(R.string.share_invite_with))); + } + + @Override + protected void refreshUiReal() { + invalidateOptionsMenu(); + if (easyOnboardingInvite != null) { + showInvite(easyOnboardingInvite); + } else { + showLoading(); + } + } + + private void showLoading() { + this.binding.inProgress.setVisibility(View.VISIBLE); + this.binding.invite.setVisibility(View.GONE); + } + + private void showInvite(final EasyOnboardingInvite invite) { + this.binding.inProgress.setVisibility(View.GONE); + this.binding.invite.setVisibility(View.VISIBLE); + this.binding.tapToShare.setText(getString(R.string.tap_share_button_send_invite, invite.getDomain())); + final Point size = new Point(); + getWindowManager().getDefaultDisplay().getSize(size); + final int width = Math.min(size.x, size.y); + final String content; + if (Strings.isNullOrEmpty(invite.getLandingUrl())) { + content = invite.getUri(); + } else { + content = invite.getLandingUrl(); + } + final Bitmap bitmap = BarcodeProvider.create2dBarcodeBitmap(content, width); + binding.qrCode.setImageBitmap(bitmap); + } + + @Override + public void onSaveInstanceState(Bundle bundle) { + super.onSaveInstanceState(bundle); + if (easyOnboardingInvite != null) { + bundle.putParcelable("invite", easyOnboardingInvite); + } + } + + @Override + void onBackendConnected() { + if (easyOnboardingInvite != null) { + return; + } + final Intent launchIntent = getIntent(); + final String accountExtra = launchIntent.getStringExtra(EXTRA_ACCOUNT); + final Jid jid = accountExtra == null ? null : Jid.ofEscaped(accountExtra); + if (jid == null) { + return; + } + final Account account = xmppConnectionService.findAccountByJid(jid); + xmppConnectionService.requestEasyOnboardingInvite(account, this); + } + + public static void launch(final Account account, final Activity context) { + final Intent intent = new Intent(context, EasyOnboardingInviteActivity.class); + intent.putExtra(EXTRA_ACCOUNT, account.getJid().asBareJid().toEscapedString()); + context.startActivity(intent); + } + + @Override + public void inviteRequested(EasyOnboardingInvite invite) { + this.easyOnboardingInvite = invite; + Log.d(Config.LOGTAG, "invite requested"); + refreshUi(); + } + + @Override + public void inviteRequestFailed(final String message) { + runOnUiThread(() -> { + if (!Strings.isNullOrEmpty(message)) { + Toast.makeText(this, message, Toast.LENGTH_LONG).show(); + } + finish(); + }); + } +} diff --git a/src/conversations/res/layout/activity_easy_invite.xml b/src/conversations/res/layout/activity_easy_invite.xml new file mode 100644 index 000000000..8bbf11c03 --- /dev/null +++ b/src/conversations/res/layout/activity_easy_invite.xml @@ -0,0 +1,83 @@ + + + + + + + + + + + + + + + + + + + + + +