Compare commits

...

39 Commits

Author SHA1 Message Date
Geno 1257ad8509 metadata: add changelog 2.9.2 2020-12-24 13:41:16 +01:00
Geno 1a0b4b441d Merge tag '2.9.2' into develop 2020-12-24 13:39:02 +01:00
Daniel Gultsch 00bc7a4b06 version bump to 2.9.2 + changelog 2020-12-10 19:32:40 +01:00
Daniel Gultsch f584179f2f store avatars in cache folder 2020-12-10 19:05:04 +01:00
Daniel Gultsch 07e965f8f3 pulled translations from transifex 2020-12-10 18:47:23 +01:00
Daniel Gultsch 9c67e8fec2 fix long pressing on a textview with link 2020-12-08 07:10:54 +01:00
Daniel Gultsch 849968107e remove unused CopyTextView
after removing the ability to select and copy text the transformation methods
provided by CopyTextView are no longer necessary.
2020-12-08 07:08:59 +01:00
Daniel Gultsch 7179d72f7e pulled translations from transifex 2020-12-07 16:14:25 +01:00
Daniel Gultsch 261207a4c0 ignore whitespace when trying to detect provisioning json
fixes #3940
2020-12-07 09:03:05 +01:00
Daniel Gultsch 303e205276 if file extension doesn’t exist. try to guess from content type. fixes #3939 2020-12-06 19:22:36 +01:00
Daniel Gultsch 99cb23fe14 share xmpp uri if landing url is not available 2020-12-06 17:57:55 +01:00
Daniel Gultsch 528f192f76 stop parsing random strings as xmpp addresses when scanning uris 2020-12-02 08:19:06 +01:00
Daniel Gultsch 778cfa846b implement stub easy onboarding activity for quicksy 2020-12-02 07:21:50 +01:00
Daniel Gultsch 00e1a93014 fixed typo in easy invites request code 2020-12-01 22:39:56 +01:00
Daniel Gultsch 1f392a688d initial (untested) support for easy onboarding invites 2020-12-01 20:31:30 +01:00
Daniel Gultsch 92083fec83 version bump to 2.9.1 2020-11-25 08:47:21 +01:00
Daniel Gultsch 35316ad93a pulled translations from transifex 2020-11-25 07:43:47 +01:00
Daniel Gultsch 3c7ac2524f update changelog file in preparation for 2.9.1 release 2020-11-16 12:54:40 +01:00
Daniel Gultsch 600f243797 pulled translations from transifex 2020-11-16 12:22:50 +01:00
Daniel Gultsch 36f5f77c30 disable autofill for password field when not in init mode
maybe fixes #3924
2020-11-16 12:08:10 +01:00
Daniel Gultsch c7ec6a9dae let media scanner scan backup file. fixes #3913
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.
2020-11-15 10:43:21 +01:00
eta 0c563134da 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.
2020-11-14 12:55:30 +00:00
Daniel Gultsch fc53271212 bump version to 2.9.1-beta 2020-11-14 12:01:43 +01:00
Daniel Gultsch 6485c77e09 pulled translations from transifex 2020-11-14 12:01:28 +01:00
Daniel Gultsch 1fafe4287d don’t send origin-ids to rooms that support stable-ids. fixes #3905 2020-11-14 11:59:35 +01:00
Daniel Gultsch 16c4e3eec7 keep conversation bold (unread) after responding to a call. fixes #3926 2020-11-14 09:55:43 +01:00
Daniel Gultsch afb2fb1326 use CoW data structure for read markers. fixes #3904 2020-11-13 20:37:32 +01:00
Daniel Gultsch 952387cb5a use lower margins on between in-call buttons on small displays
hopefully fixes #3890
2020-11-13 16:11:41 +01:00
Christoph Scholz 386b224123 fix escapeing in local channel discovery 2020-11-13 13:35:46 +00:00
Alexei Sorokin 501cdd5edf 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.
2020-11-13 12:43:18 +00:00
Daniel Gultsch b327548c85 show toast if no application found to attach 2020-11-13 12:50:05 +01:00
Daniel Gultsch aaebb3a536 bump gradle and targetSdk 2020-11-13 12:24:42 +01:00
Daniel Gultsch 5ad054617b use instead of message id for receipt processing 2020-11-12 13:33:27 +01:00
Daniel Gultsch ff13cc2766 extracting chat state for chat with self should not cause markRead event. fixes #3906 2020-10-20 10:20:58 +02:00
Daniel Gultsch dc72bc5bc3 extend logging for not finding query 2020-10-08 20:21:53 +02:00
nico fdfac102e2 spelling
* various spelling fixes
2020-10-06 13:15:51 +00:00
eta 364502d1a3 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.)
2020-10-05 11:33:29 +00:00
eta b4805ac2c5 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.
2020-10-05 11:33:12 +00:00
Daniel Gultsch afffe01868 add changelog for fastlane 2020-09-11 15:57:34 +02:00
80 changed files with 2485 additions and 1196 deletions

View File

@ -1,5 +1,16 @@
# Changelog
### Version 2.9.2
* Offer Easy Invite generation on supporting servers
* Display GIFs send from Movim
* store avatars in cache
### Version 2.9.1
* fixed search on Android <= 5
* optimize memory consumption
### Version 2.9.0
* Search individual conversations
@ -419,10 +430,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 +482,7 @@
* bug fixes
### Version 1.14.6
* make error notification dismissable
* make error notification dismissible
* bug fixes
@ -496,7 +506,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 +684,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 +792,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 +898,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

View File

@ -141,7 +141,7 @@ Maybe you attempted to use the Jabber ID `test@b.tld` because `a.tld` doesnt
### 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).
#### Im getting this annoying permanent notification
@ -149,7 +149,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 &lt;= 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.
@ -173,7 +173,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 doesnt 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. Thats 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 doesnt 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. Thats 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 doesnt work for me. Where can I get help?
@ -267,11 +267,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 youll 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 youll 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 doesnt 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 wont 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 wont 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 youve lost the original device.
@ -327,7 +327,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.)

View File

@ -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'
}
}
@ -95,9 +95,9 @@ android {
defaultConfig {
minSdkVersion 21
targetSdkVersion 28
versionCode 399
versionName "2.9.0"
targetSdkVersion 29
versionCode 402
versionName "2.9.2"
archivesBaseName += "-$versionName"
applicationId "eu.sum7.conversations"
resValue "string", "applicationId", applicationId

View File

@ -1,6 +1,6 @@
#Sun Jul 26 11:32:42 CEST 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.1.1-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-6.5-all.zip

View File

@ -0,0 +1,3 @@
• Offer Easy Invite generation on supporting servers
• Display GIFs send from Movim
• store avatars in cache

View File

@ -20,6 +20,10 @@
android:name=".ui.MagicCreateActivity"
android:label="@string/create_new_account"
android:launchMode="singleTask" />
<activity
android:name=".ui.EasyOnboardingInviteActivity"
android:label="@string/invite_to_app"
android:launchMode="singleTask" />
<activity
android:name=".ui.ImportBackupActivity"
android:label="@string/restore_backup"

View File

@ -0,0 +1,151 @@
package eu.siacs.conversations.ui;
import android.app.Activity;
import android.content.Intent;
import android.databinding.DataBindingUtil;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.os.Bundle;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Toast;
import com.google.common.base.Strings;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.databinding.ActivityEasyInviteBinding;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.services.BarcodeProvider;
import eu.siacs.conversations.utils.EasyOnboardingInvite;
import eu.siacs.conversations.xmpp.Jid;
public class EasyOnboardingInviteActivity extends XmppActivity implements EasyOnboardingInvite.OnInviteRequested {
private ActivityEasyInviteBinding binding;
private EasyOnboardingInvite easyOnboardingInvite;
@Override
public void onCreate(final Bundle bundle) {
super.onCreate(bundle);
this.binding = DataBindingUtil.setContentView(this, R.layout.activity_easy_invite);
setSupportActionBar((Toolbar) binding.toolbar);
configureActionBar(getSupportActionBar(), true);
this.binding.shareButton.setOnClickListener(v -> 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.getShareableLink()
);
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 Bitmap bitmap = BarcodeProvider.create2dBarcodeBitmap(invite.getShareableLink(), 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();
});
}
}

View File

@ -0,0 +1,83 @@
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:background="?attr/color_background_primary"
android:orientation="vertical">
<include
android:id="@+id/toolbar"
layout="@layout/toolbar" />
<LinearLayout
android:id="@+id/in_progress"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center"
android:visibility="gone">
<ProgressBar
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center" />
</LinearLayout>
<RelativeLayout
android:id="@+id/invite"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:layout_marginBottom="@dimen/activity_vertical_margin"
android:visibility="visible">
<TextView
android:id="@+id/tap_to_share"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/tap_share_button_send_invite"
android:textAppearance="@style/TextAppearance.Conversations.Body1" />
<TextView
android:id="@+id/scan_the_code"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@+id/tap_to_share"
android:layout_marginTop="24sp"
android:text="@string/if_contact_is_nearby_use_qr"
android:textAppearance="@style/TextAppearance.Conversations.Body1" />
<ImageView
android:id="@+id/qr_code"
android:layout_width="0dp"
android:layout_height="0dp"
android:layout_above="@+id/share_button"
android:layout_below="@id/scan_the_code"
android:layout_alignParentStart="true"
android:layout_alignParentRight="true"
android:layout_centerHorizontal="true"
android:layout_margin="24sp"
android:scaleType="fitCenter" />
<Button
android:id="@+id/share_button"
style="@style/Widget.Conversations.Button.Borderless"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:minWidth="0dp"
android:paddingLeft="16dp"
android:paddingRight="16dp"
android:text="@string/share"
android:layout_centerHorizontal="true"
android:textColor="?attr/colorAccent" />
</RelativeLayout>
</LinearLayout>
</layout>

View File

@ -0,0 +1,10 @@
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item
android:id="@+id/action_share"
android:icon="?attr/icon_share"
android:title="@string/invite"
app:showAsAction="always" />
</menu>

View File

@ -9,4 +9,8 @@
<string name="magic_create_text_fixed">Du wurdest zu %1$seingeladen. Ein Benutzername ist bereits für dich ausgewählt worden. Wir führen dich durch den Prozess der Kontoerstellung.\nDu kannst mit Nutzern anderer Anbieter kommunizieren, indem du ihnen deine vollständige XMPP-Adresse gibst.</string>
<string name="your_server_invitation">Deine Einladung für den Server</string>
<string name="improperly_formatted_provisioning">Falsch formatierter Provisionierungscode</string>
<string name="tap_share_button_send_invite">Tippe auf die \"Teilen\"-Schaltfläche, um deinem Kontakt eine Einladung an %1$s zu senden.</string>
<string name="if_contact_is_nearby_use_qr">Wenn dein Kontakt in der Nähe ist, kann er auch den untenstehenden Code einscannen, um deine Einladung anzunehmen.</string>
<string name="easy_invite_share_text">Komme zu %1$s und chatte mit mir: %2$s</string>
<string name="share_invite_with">Einladung teilen mit…</string>
</resources>

View File

@ -5,7 +5,8 @@
<string name="create_new_account">Δημιουργία νέου λογαριασμού</string>
<string name="do_you_have_an_account">Έχετε ήδη λογαριασμό XMPP; Αυτό μπορεί να συμβαίνει αν ήδη χρησιμοποιείτε ένα άλλο πρόγραμμα XMPP ή έχετε χρησιμοποιήσει το Conversations παλιότερα. Αν όχι, μπορείτε να δημιουργήσετε ένα νέο λογαριασμό XMPP τώρα.\nΧρήσιμη πληροφορία: Κάποιοι πάροχοι e-mail παρέχουν επίσης και λογαριασμούς XMPP.</string>
<string name="server_select_text">Το XMPP είναι ένα δίκτυο άμεσης ανταλλαγής μηνυμάτων ανεξάρτητο παρόχου. Μπορείτε να χρησιμοποιήσετε αυτό το πρόγραμμα με όποιον διακομιστή XMPP επιθυμείτε.\nΓια διευκόλυνση πάντως μπορείτε να δημιουργήσετε έναν λογαριασμό στο chat.sum7.eu, έναν πάροχο ειδικά σχεδιασμένο για χρήση με το Conversations.</string>
<string name="magic_create_text_on_x">Έχετε προσκληθεί στο %1$s. Ένα όνομα χρήστη έχει ήδη επιλεγεί για εσάς. Θα σας καθοδηγήσουμε στη διαδικασία δημιουργίας λογαριασμού.\nΕπιλέγοντας τον %1$s ως πάροχο θα μπορείτε να επικοινωνείτε με χρήστες άλλων παρόχων δίνοντάς τους την πλήρη διεύθυνση XMPP σας.</string>
<string name="magic_create_text_on_x">Έχετε προσκληθεί στο %1$s. Θα σας καθοδηγήσουμε στη διαδικασία δημιουργίας λογαριασμού.\nΕπιλέγοντας τον %1$s ως πάροχο θα μπορείτε να επικοινωνείτε με χρήστες άλλων παρόχων δίνοντάς τους την πλήρη διεύθυνση XMPP σας.</string>
<string name="magic_create_text_fixed">Έχετε προσκληθεί στο %1$s. Ένα όνομα χρήστη έχει ήδη επιλεγεί για εσάς. Θα σας καθοδηγήσουμε στη διαδικασία δημιουργίας λογαριασμού.\nΘα μπορείτε να επικοινωνείτε με χρήστες άλλων παρόχων δίνοντάς τους την πλήρη διεύθυνση XMPP σας.</string>
<string name="your_server_invitation">Η πρόσκλησή σας στον διακομιστή</string>
<string name="improperly_formatted_provisioning">Λάθος μορφοποίηση κώδικα παροχής</string>
</resources>

View File

@ -9,4 +9,4 @@
<string name="magic_create_text_fixed">Has sido invitado a %1$s. Un nombre de usuario ya ha sido escogido para ti. Te guiaremos durante el proceso de creación de la cuenta.\nPodrás comunicarte con otros usuarios de otros servidores proporcionándoles tu dirección XMPP completa. </string>
<string name="your_server_invitation">Tu invitación al servidor</string>
<string name="improperly_formatted_provisioning">Código de abastecimiento formateado incorrectamente</string>
</resources>
</resources>

View File

@ -9,4 +9,4 @@
<string name="magic_create_text_fixed">Vous avez été invité à %1$s. Un nom dutilisateur a déjà été choisi pour vous. Nous allons vous guider à travers le processus de création dun compte.\nVous pourrez communiquer avec les utilisateurs des autres fournisseurs en leur donnant votre adresse XMPP complète.</string>
<string name="your_server_invitation">Votre invitation au serveur</string>
<string name="improperly_formatted_provisioning">Code de provisionnement mal formaté</string>
</resources>
</resources>

View File

@ -9,4 +9,8 @@
<string name="magic_create_text_fixed">Convidáronte a %1$s. Escollemos un nome de usuaria por ti. Guiarémoste no proceso de crear unha conta.\nPoderás comunicarte con usuarias de outros provedores cando lles digas o teu enderezo XMPP completo.</string>
<string name="your_server_invitation">O convite do teu servidor</string>
<string name="improperly_formatted_provisioning">Código de aprovisionamento con formato non válido</string>
<string name="tap_share_button_send_invite">Toca no botón compartir para convidar ó teu contacto a %1$s.</string>
<string name="if_contact_is_nearby_use_qr">Se o contacto está preto de ti, pode escanear o código inferior para aceptar o teu convite.</string>
<string name="easy_invite_share_text">Únete a %1$s e conversa conmigo: %2$s</string>
<string name="share_invite_with">Enviar convite a...</string>
</resources>

View File

@ -8,4 +8,5 @@
<string name="magic_create_text_on_x">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.</string>
<string name="magic_create_text_fixed">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.</string>
<string name="your_server_invitation">Az Ön kiszolgálómeghívása</string>
<string name="improperly_formatted_provisioning">Helytelenül formázott kiépítési kód</string>
</resources>

View File

@ -11,4 +11,4 @@ In ogni caso per facilitare puoi creare facilmente un account su chat.sum7.eu, u
<string name="magic_create_text_fixed">Sei stato invitato su %1$s. È già stato scelto un nome utente per te. Ti guideremo nel procedimento per creare un account.\nSarai in grado di comunicare con utenti di altri fornitori dando loro l\'indirizzo XMPP completo.</string>
<string name="your_server_invitation">Il tuo invito al server</string>
<string name="improperly_formatted_provisioning">Codice di approvvigionamento formattato male</string>
</resources>
</resources>

View File

@ -0,0 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pick_a_server">XMPPプロバイダーを選択してください</string>
<string name="use_conversations.im">conversations.imを利用する</string>
<string name="create_new_account">アカウントを作成</string>
<string name="do_you_have_an_account">XMPPアカウントをお持ちですか既にほかのXMPPクライアントを利用しているか、Conversationsを利用したことがある場合はこちら。初めての方は、今すぐ新しいXMPPアカウントを作成できます。\nヒント: eメールのプロバイダーがXMPPアカウントも提供している場合があります。</string>
<string name="server_select_text">XMPPは、プロバイダーに依存しないインスタントメッセージのプロトコルです。XMPPサーバーならどこでも、このクライアントを使用することができます。\nよろしければ、Conversationsに最適化されたプロバイダーconversations.im¹で簡単にアカウントを作成することもできます。</string>
<string name="magic_create_text_on_x">%1$sへ招待されました。アカウント作成手順をご案内します。 \n%1$sをプロバイダーに選択してほかのプロバイダーのユーザーと会話するには、XMPPのフルアドレスを相手にお知らせください。</string>
<string name="magic_create_text_fixed">%1$sへ招待されました。ユーザーネームは既に選択されています。アカウント作成手順をご案内します。 \nほかのプロバイダーのユーザーと会話するには、XMPPのフルアドレスを相手にお知らせください。</string>
<string name="your_server_invitation">サーバーの招待</string>
<string name="improperly_formatted_provisioning">仮コードの書式が不正です</string>
</resources>

View File

@ -9,4 +9,4 @@
<string name="magic_create_text_fixed">Zostałeś zaproszony do %1$s. Nazwa użytkownika została już dla ciebie wybrana. Poprowadzimy ciebie przez proces tworzenia konta.\nBęziesz mógł komunikować się z innymi użytkownikami podając swój adres XMPP.</string>
<string name="your_server_invitation">Zaproszenie twojego serwera</string>
<string name="improperly_formatted_provisioning">Niepoprawnie sformatowany kod zaopatrywania</string>
</resources>
</resources>

View File

@ -9,4 +9,4 @@
<string name="magic_create_text_fixed">Você foi convidado para %1$s. Um nome de usuário já foi escolhido para você. Nós iremos guiá-lo ao longo do processo de criação de uma conta.\nVocê conseguirá se comunicar com usuários de outros provedores dando a eles seu endereço XMPP completo.</string>
<string name="your_server_invitation">Seu convite do servidor</string>
<string name="improperly_formatted_provisioning">Código de provisionamento formatado de maneira imprópria</string>
</resources>
</resources>

View File

@ -9,4 +9,8 @@
<string name="magic_create_text_fixed">Ați fost invitați la %1$s. Un nume de utilizator a fost deja ales pentru dumneavoastră. Vă vom ghida prin procesul de creare al unui cont.\nVeți putea comunica cu utilizatorii altor furnizori oferindu-le adresa dumneavoastră completă XMPP.</string>
<string name="your_server_invitation">Invitația serverului dumneavoastră</string>
<string name="improperly_formatted_provisioning">Cod de acces formatat necorespunzător</string>
<string name="tap_share_button_send_invite">Atingeți butonul de partajare pentru a trimite contactului o invitație la %1$s.</string>
<string name="if_contact_is_nearby_use_qr">Dacă e în apropiere, contactul poate scana codul de mai jos pentru a vă accepta invitația.</string>
<string name="easy_invite_share_text">Alătură-te %1$s și discută cu mine: %2$s</string>
<string name="share_invite_with">Partajează invitația cu…</string>
</resources>

View File

@ -9,4 +9,4 @@
<string name="magic_create_text_fixed">Вас пригласили на %1$s. Вам уже назначили имя пользователя. Мы проведём вас через процесс создания аккаунта. Этот аккаунт позволит вам общаться с пользователями и на этом, и на других серверах, используя ваш полный XMPP-адрес.</string>
<string name="your_server_invitation">Ваше приглашение</string>
<string name="improperly_formatted_provisioning">Неправильный формат кода</string>
</resources>
</resources>

View File

@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pick_a_server">Одаберите вашег ИксМПП провајдера</string>
<string name="use_conversations.im">Користи conversations.im</string>
<string name="create_new_account">Направи нови налог</string>
<string name="do_you_have_an_account">Да ли већ имате ИксМПП налог? Извесно је да га имате ако користите неки ИксМПП клијент или сте раније користили Конверзацију. Ако немате, сада можете направити нови ИксМПП налог.\nСавет: неки поштански провајдери такође омогућавају и ИксМПП налоге.</string>
<string name="server_select_text">ИксМПП је мрежа брзих порука, независна од провајдера. Овај клијент можете користити уз било који сервер по вашем избору.\nДа бисмо вам олакшали, омогућили смо креирање налога на conversations.im¹; провајдеру специјално прилаг.ођеном за коришћење уз Конверзацију</string>
<string name="your_server_invitation">Ваша серверска позивница</string>
</resources>

View File

@ -0,0 +1,16 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="pick_a_server">XMPP sağlayıcınızı seçin</string>
<string name="use_conversations.im">conversations.im kullan</string>
<string name="create_new_account">Yeni hesap oluştur</string>
<string name="do_you_have_an_account">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.</string>
<string name="server_select_text">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.</string>
<string name="magic_create_text_on_x">%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.</string>
<string name="magic_create_text_fixed">%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.</string>
<string name="your_server_invitation">Sunucu davetiyeniz</string>
<string name="improperly_formatted_provisioning">Yanlış ayarlanmış düzenleme kodu</string>
<string name="tap_share_button_send_invite">Kişinize, %1$s grubuna davet etmek için Paylaş düğmesine basın.</string>
<string name="if_contact_is_nearby_use_qr">Kişiniz yakınınızda ise, aşağıdaki kodu tarayak daveti kabul edebilirler.</string>
<string name="easy_invite_share_text">%1$s grubuna katıl ve benimle sohpet et: %2$s</string>
<string name="share_invite_with">Daveti şununla paylaş...</string>
</resources>

View File

@ -9,4 +9,4 @@
<string name="magic_create_text_fixed">Вас запросили до %1$s. Для вас створено ім\'я користувача. Ми проведемо вас крок за кроком, щоб створити обліковий запис.\nВи зможете спілкуватися з користувачами інших постачальників, для цього повідомите їм свою повну адресу XMPP.</string>
<string name="your_server_invitation">Ваше запрошення до сервера</string>
<string name="improperly_formatted_provisioning">Неправильно відформатований код забезпечення</string>
</resources>
</resources>

View File

@ -9,4 +9,8 @@
<string name="magic_create_text_fixed">您已受邀参加%1$s。 已经为您选择了一个用户名。 我们将指导您完成创建帐户的过程。\n您可以通过向其他提供商的用户提供完整的XMPP地址来与他们进行交流。</string>
<string name="your_server_invitation">你的服务器邀请</string>
<string name="improperly_formatted_provisioning">格式不正确的配置代码</string>
<string name="tap_share_button_send_invite">点击分享按钮向您的联系人发送加入 %1$s 的邀请。</string>
<string name="if_contact_is_nearby_use_qr">如果你的联系人在附近,他们也可以扫描下面的代码来接受你的邀请。</string>
<string name="easy_invite_share_text">加入 %1$s 和我聊天:%2$s</string>
<string name="share_invite_with">分享邀请</string>
</resources>

View File

@ -9,4 +9,8 @@
<string name="magic_create_text_fixed">You have been invited to %1$s. A username has already been picked for you. We will guide you through the process of creating an account.\nYou will be able to communicate with users of other providers by giving them your full XMPP address.</string>
<string name="your_server_invitation">Your server invitation</string>
<string name="improperly_formatted_provisioning">Improperly formatted provisioning code</string>
<string name="tap_share_button_send_invite">Tap the share button to send your contact an invitation to %1$s.</string>
<string name="if_contact_is_nearby_use_qr">If your contact is nearby, they can also scan the code below to accept your invitation.</string>
<string name="easy_invite_share_text">Join %1$s and chat with me: %2$s</string>
<string name="share_invite_with">Share invite with…</string>
</resources>

View File

@ -7,7 +7,9 @@
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
<uses-permission android:name="android.permission.READ_PROFILE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" android:maxSdkVersion="22" />
<uses-permission
android:name="android.permission.READ_PHONE_STATE"
android:maxSdkVersion="22" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />
@ -57,10 +59,12 @@
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"
tools:replace="android:label"
tools:targetApi="o">
tools:targetApi="q">
<meta-data
android:name="com.google.android.gms.car.application"

File diff suppressed because it is too large Load Diff

View File

@ -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<Message> 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;

View File

@ -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<ReadByMarker> readByMarkers = new HashSet<>();
private Set<ReadByMarker> 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;

View File

@ -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) {

View File

@ -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<ReadByMarker> fromJson(JSONArray jsonArray) {
HashSet<ReadByMarker> readByMarkers = new HashSet<>();
public static Set<ReadByMarker> fromJson(final JSONArray jsonArray) {
final Set<ReadByMarker> 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<ReadByMarker> from(Collection<MucOptions.User> users) {
final HashSet<ReadByMarker> markers = new HashSet<>();
final Set<ReadByMarker> markers = new CopyOnWriteArraySet<>();
for(MucOptions.User user : users) {
markers.add(from(user));
}
@ -125,21 +125,21 @@ public class ReadByMarker {
public static Set<ReadByMarker> 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<ReadByMarker> readByMarkers) {
JSONArray jsonArray = new JSONArray();
for(ReadByMarker marker : readByMarkers) {
public static JSONArray toJson(final Set<ReadByMarker> readByMarkers) {
final JSONArray jsonArray = new JSONArray();
for(final ReadByMarker marker : readByMarkers) {
jsonArray.put(marker.toJson());
}
return jsonArray;
}
public static boolean contains(ReadByMarker needle, Set<ReadByMarker> readByMarkers) {
for(ReadByMarker marker : readByMarkers) {
public static boolean contains(ReadByMarker needle, final Set<ReadByMarker> 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<MucOptions.User> users, Set<ReadByMarker> markers, ReadByMarker marker) {
HashSet<ReadByMarker> markersCopy = new HashSet<>(markers);
final Set<ReadByMarker> markersCopy = new CopyOnWriteArraySet<>(markers);
markersCopy.add(marker);
return allUsersRepresented(users, markersCopy);
}

View File

@ -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 doesnt 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());
}
@ -223,13 +225,13 @@ public class MessageGenerator extends AbstractGenerator {
return packet;
}
public MessagePacket received(Account account, MessagePacket originalMessage, ArrayList<String> namespaces, int type) {
MessagePacket receivedPacket = new MessagePacket();
public MessagePacket received(Account account, final Jid from, final String id, ArrayList<String> 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;

View File

@ -4,6 +4,7 @@ import android.os.PowerManager;
import android.support.annotation.Nullable;
import android.util.Log;
import com.google.common.base.Strings;
import com.google.common.io.ByteStreams;
import java.io.BufferedInputStream;
@ -30,16 +31,16 @@ import eu.siacs.conversations.services.AbstractConnectionManager;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.utils.FileWriterException;
import eu.siacs.conversations.utils.MimeUtils;
import eu.siacs.conversations.utils.WakeLockHelper;
import eu.siacs.conversations.xmpp.stanzas.IqPacket;
import eu.siacs.conversations.xmpp.Jid;
public class HttpDownloadConnection implements Transferable {
private final Message message;
private final boolean mUseTor;
private HttpConnectionManager mHttpConnectionManager;
private XmppConnectionService mXmppConnectionService;
private final HttpConnectionManager mHttpConnectionManager;
private final XmppConnectionService mXmppConnectionService;
private URL mUrl;
private DownloadableFile file;
private int mStatus = Transferable.STATUS_UNKNOWN;
@ -97,23 +98,13 @@ public class HttpDownloadConnection implements Transferable {
&& message.getEncryption() != Message.ENCRYPTION_AXOLOTL) {
this.message.setEncryption(Message.ENCRYPTION_NONE);
}
final String ext;
if (VALID_CRYPTO_EXTENSIONS.contains(extension.main)) {
ext = extension.secondary;
} else {
ext = extension.main;
final String ext = extension.getExtension();
if (ext != null) {
message.setRelativeFilePath(String.format("%s.%s", message.getUuid(), ext));
} else if (Strings.isNullOrEmpty(message.getRelativeFilePath())) {
message.setRelativeFilePath(message.getUuid());
}
message.setRelativeFilePath(message.getUuid() + (ext != null ? ("." + ext) : ""));
final String reference = mUrl.getRef();
if (reference != null && AesGcmURLStreamHandler.IV_KEY.matcher(reference).matches()) {
this.file = new DownloadableFile(mXmppConnectionService.getCacheDir().getAbsolutePath() + "/" + message.getUuid());
this.file.setKeyAndIv(CryptoHelper.hexToBytes(reference));
Log.d(Config.LOGTAG, "create temporary OMEMO encrypted file: " + this.file.getAbsolutePath() + "(" + message.getMimeType() + ")");
} else {
this.file = mXmppConnectionService.getFileBackend().getFile(message, false);
}
setupFile();
if (this.message.getEncryption() == Message.ENCRYPTION_AXOLOTL && this.file.getKey() == null) {
this.message.setEncryption(Message.ENCRYPTION_NONE);
}
@ -130,6 +121,17 @@ public class HttpDownloadConnection implements Transferable {
}
}
private void setupFile() {
final String reference = mUrl.getRef();
if (reference != null && AesGcmURLStreamHandler.IV_KEY.matcher(reference).matches()) {
this.file = new DownloadableFile(mXmppConnectionService.getCacheDir().getAbsolutePath() + "/" + message.getUuid());
this.file.setKeyAndIv(CryptoHelper.hexToBytes(reference));
Log.d(Config.LOGTAG, "create temporary OMEMO encrypted file: " + this.file.getAbsolutePath() + "(" + message.getMimeType() + ")");
} else {
this.file = mXmppConnectionService.getFileBackend().getFile(message, false);
}
}
private void download(boolean interactive) {
new Thread(new FileDownloader(interactive)).start();
}
@ -363,6 +365,16 @@ public class HttpDownloadConnection implements Transferable {
} else {
contentLength = connection.getHeaderField("Content-Length");
}
final String contentType = connection.getContentType();
final AbstractConnectionManager.Extension extension = AbstractConnectionManager.Extension.of(mUrl.getPath());
if (Strings.isNullOrEmpty(extension.getExtension()) && contentType != null) {
final String fileExtension = MimeUtils.guessExtensionFromMimeType(contentType);
if (fileExtension != null) {
message.setRelativeFilePath(String.format("%s.%s", message.getUuid(), fileExtension));
Log.d(Config.LOGTAG, "rewriting name after not finding extension in url but in content type");
setupFile();
}
}
connection.disconnect();
if (contentLength == null) {
throw new IOException("no content-length found in HEAD response");

View File

@ -141,6 +141,20 @@ public abstract class AbstractParser {
return null;
}
public static String errorMessage(Element packet) {
final Element error = packet.findChild("error");
if (error != null && error.getChildren().size() > 0) {
final List<String> errorNames = orderedElementNames(error.getChildren());
final String text = error.findChildContent("text");
if (text != null && !text.trim().isEmpty()) {
return text;
} else if (errorNames.size() > 0){
return errorNames.get(0).replace("-"," ");
}
}
return null;
}
private static String prefixError(List<String> errorNames) {
if (errorNames.size() > 0) {
return errorNames.get(0)+'\u001f';

View File

@ -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");

View File

@ -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);
}
@ -211,13 +214,12 @@ public class MessageParser extends AbstractParser implements OnMessagePacketRece
mXmppConnectionService.updateConversationUi();
mXmppConnectionService.updateAccountUi();
} else {
Contact contact = account.getRoster().getContact(from);
if (contact.setAvatar(avatar)) {
mXmppConnectionService.syncRoster(account);
mXmppConnectionService.getAvatarService().clear(contact);
mXmppConnectionService.updateConversationUi();
mXmppConnectionService.updateRosterUi();
}
final Contact contact = account.getRoster().getContact(from);
contact.setAvatar(avatar);
mXmppConnectionService.syncRoster(account);
mXmppConnectionService.getAvatarService().clear(contact);
mXmppConnectionService.updateConversationUi();
mXmppConnectionService.updateRosterUi();
}
} else if (mXmppConnectionService.isDataSaverDisabled()) {
mXmppConnectionService.fetchAvatar(account, avatar);
@ -367,7 +369,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<MessagePacket, Long> f = original.getForwardedMessagePacket("result", query.version.namespace);
if (f == null) {
@ -381,7 +384,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<MessagePacket, Long> f;
@ -656,7 +659,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);
@ -742,7 +745,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);
@ -855,8 +858,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)) {
@ -1041,7 +1044,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) {
@ -1053,15 +1056,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));
}
}
}

View File

@ -118,12 +118,11 @@ public class PresenceParser extends AbstractParser implements
mXmppConnectionService.getAvatarService().clear(user);
}
if (user.getRealJid() != null) {
Contact c = conversation.getAccount().getRoster().getContact(user.getRealJid());
if (c.setAvatar(avatar)) {
mXmppConnectionService.syncRoster(conversation.getAccount());
mXmppConnectionService.getAvatarService().clear(c);
mXmppConnectionService.updateRosterUi();
}
final Contact c = conversation.getAccount().getRoster().getContact(user.getRealJid());
c.setAvatar(avatar);
mXmppConnectionService.syncRoster(conversation.getAccount());
mXmppConnectionService.getAvatarService().clear(c);
mXmppConnectionService.updateRosterUi();
}
} else if (mXmppConnectionService.isDataSaverDisabled()) {
mXmppConnectionService.fetchAvatar(mucOptions.getAccount(), avatar);
@ -268,7 +267,8 @@ public class PresenceParser extends AbstractParser implements
mXmppConnectionService.getAvatarService().clear(account);
mXmppConnectionService.updateConversationUi();
mXmppConnectionService.updateAccountUi();
} else if (contact.setAvatar(avatar)) {
} else {
contact.setAvatar(avatar);
mXmppConnectionService.syncRoster(account);
mXmppConnectionService.getAvatarService().clear(contact);
mXmppConnectionService.updateConversationUi();

View File

@ -1071,7 +1071,7 @@ public class FileBackend {
return null;
}
Avatar avatar = new Avatar();
File file = new File(getAvatarPath(hash));
final File file = getAvatarFile(hash);
FileInputStream is = null;
try {
avatar.size = file.length();
@ -1104,14 +1104,14 @@ public class FileBackend {
}
public boolean isAvatarCached(Avatar avatar) {
File file = new File(getAvatarPath(avatar.getFilename()));
final File file = getAvatarFile(avatar.getFilename());
return file.exists();
}
public boolean save(final Avatar avatar) {
File file;
if (isAvatarCached(avatar)) {
file = new File(getAvatarPath(avatar.getFilename()));
file = getAvatarFile(avatar.getFilename());
avatar.size = file.length();
} else {
file = new File(mXmppConnectionService.getCacheDir().getAbsolutePath() + "/" + UUID.randomUUID().toString());
@ -1133,12 +1133,12 @@ public class FileBackend {
mDigestOutputStream.close();
String sha1sum = CryptoHelper.bytesToHex(digest.digest());
if (sha1sum.equals(avatar.sha1sum)) {
File outputFile = new File(getAvatarPath(avatar.getFilename()));
final File outputFile = getAvatarFile(avatar.getFilename());
if (outputFile.getParentFile().mkdirs()) {
Log.d(Config.LOGTAG, "created avatar directory");
}
String filename = getAvatarPath(avatar.getFilename());
if (!file.renameTo(new File(filename))) {
final File avatarFile = getAvatarFile(avatar.getFilename());
if (!file.renameTo(avatarFile)) {
Log.d(Config.LOGTAG, "unable to rename " + file.getAbsolutePath() + " to " + outputFile);
return false;
}
@ -1159,12 +1159,34 @@ public class FileBackend {
return true;
}
private String getAvatarPath(String avatar) {
return mXmppConnectionService.getFilesDir().getAbsolutePath() + "/avatars/" + avatar;
public void deleteHistoricAvatarPath() {
delete(getHistoricAvatarPath());
}
private void delete(final File file) {
if (file.isDirectory()) {
final File[] files = file.listFiles();
if (files != null) {
for (final File f : files) {
delete(f);
}
}
}
if (file.delete()) {
Log.d(Config.LOGTAG,"deleted "+file.getAbsolutePath());
}
}
private File getHistoricAvatarPath() {
return new File(mXmppConnectionService.getFilesDir(), "/avatars/");
}
private File getAvatarFile(String avatar) {
return new File(mXmppConnectionService.getCacheDir(), "/avatars/" + avatar);
}
public Uri getAvatarUri(String avatar) {
return Uri.parse("file:" + getAvatarPath(avatar));
return Uri.fromFile(getAvatarFile(avatar));
}
public Bitmap cropCenterSquare(Uri image, int size) {

View File

@ -30,6 +30,8 @@ import eu.siacs.conversations.R;
import eu.siacs.conversations.entities.DownloadableFile;
import eu.siacs.conversations.utils.Compatibility;
import static eu.siacs.conversations.entities.Transferable.VALID_CRYPTO_EXTENSIONS;
public class AbstractConnectionManager {
private static final int UI_REFRESH_THRESHOLD = 250;
@ -106,6 +108,14 @@ public class AbstractConnectionManager {
this.secondary = secondary;
}
public String getExtension() {
if (VALID_CRYPTO_EXTENSIONS.contains(main)) {
return secondary;
} else {
return main;
}
}
public static Extension of(String path) {
final int pos = path.lastIndexOf('/');
final String filename = path.substring(pos + 1).toLowerCase();

View File

@ -59,7 +59,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
private static final String CHANNEL_SYMBOL = "#";
final private ArrayList<Integer> sizes = new ArrayList<>();
final private Set<Integer> sizes = new HashSet<>();
final private HashMap<String, Set<String>> conversationDependentKeys = new HashMap<>();
protected XmppConnectionService mXmppConnectionService = null;
@ -224,9 +224,8 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
public void clear(Contact contact) {
synchronized (this.sizes) {
for (Integer size : sizes) {
this.mXmppConnectionService.getBitmapCache().remove(
key(contact, size));
for (final Integer size : sizes) {
this.mXmppConnectionService.getBitmapCache().remove(key(contact, size));
}
}
for (Conversation conversation : mXmppConnectionService.findAllConferencesWith(contact)) {
@ -240,9 +239,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
private String key(Contact contact, int size) {
synchronized (this.sizes) {
if (!this.sizes.contains(size)) {
this.sizes.add(size);
}
this.sizes.add(size);
}
return PREFIX_CONTACT +
'\0' +
@ -255,9 +252,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
private String key(MucOptions.User user, int size) {
synchronized (this.sizes) {
if (!this.sizes.contains(size)) {
this.sizes.add(size);
}
this.sizes.add(size);
}
return PREFIX_CONTACT +
'\0' +
@ -416,12 +411,9 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
private String key(final MucOptions options, int size) {
synchronized (this.sizes) {
if (!this.sizes.contains(size)) {
this.sizes.add(size);
}
this.sizes.add(size);
}
return PREFIX_CONVERSATION + "_" + options.getConversation().getUuid()
+ "_" + String.valueOf(size);
return PREFIX_CONVERSATION + "_" + options.getConversation().getUuid() + "_" + size;
}
private String key(List<MucOptions.User> users, int size) {
@ -524,9 +516,7 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
private String key(Account account, int size) {
synchronized (this.sizes) {
if (!this.sizes.contains(size)) {
this.sizes.add(size);
}
this.sizes.add(size);
}
return PREFIX_ACCOUNT + "_" + account.getUuid() + "_"
+ String.valueOf(size);
@ -561,11 +551,9 @@ public class AvatarService implements OnAdvancedStreamFeaturesLoaded {
private String key(String name, int size) {
synchronized (this.sizes) {
if (!this.sizes.contains(size)) {
this.sizes.add(size);
}
this.sizes.add(size);
}
return PREFIX_GENERIC + "_" + name + "_" + String.valueOf(size);
return PREFIX_GENERIC + "_" + name + "_" + size;
}
private static boolean drawTile(Canvas canvas, String letter, int tileColor, int left, int top, int right, int bottom) {

View File

@ -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<Account> 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<File> 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<File> files) {
final String path = FileBackend.getBackupDirectory(this);

View File

@ -120,6 +120,7 @@ import eu.siacs.conversations.ui.interfaces.OnSearchResultsAvailable;
import eu.siacs.conversations.utils.Compatibility;
import eu.siacs.conversations.utils.ConversationsFileObserver;
import eu.siacs.conversations.utils.CryptoHelper;
import eu.siacs.conversations.utils.EasyOnboardingInvite;
import eu.siacs.conversations.utils.ExceptionHelper;
import eu.siacs.conversations.utils.MimeUtils;
import eu.siacs.conversations.utils.PhoneHelper;
@ -1126,6 +1127,7 @@ public class XmppConnectionService extends Service {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M || ContextCompat.checkSelfPermission(this, Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED) {
startContactObserver();
}
mFileAddingExecutor.execute(fileBackend::deleteHistoricAvatarPath);
if (Compatibility.hasStoragePermission(this)) {
Log.d(Config.LOGTAG, "starting file observer");
mFileAddingExecutor.execute(this.fileObserver::startWatching);
@ -1619,6 +1621,43 @@ public class XmppConnectionService extends Service {
sendMessage(message, true, delay);
}
public void requestEasyOnboardingInvite(final Account account, final EasyOnboardingInvite.OnInviteRequested callback) {
final XmppConnection connection = account.getXmppConnection();
final Jid jid = connection == null ? null : connection.getJidForCommand(Namespace.EASY_ONBOARDING_INVITE);
if (jid == null) {
callback.inviteRequestFailed(getString(R.string.server_does_not_support_easy_onboarding_invites));
return;
}
final IqPacket request = new IqPacket(IqPacket.TYPE.SET);
request.setTo(jid);
final Element command = request.addChild("command", Namespace.COMMANDS);
command.setAttribute("node", Namespace.EASY_ONBOARDING_INVITE);
command.setAttribute("action", "execute");
sendIqPacket(account, request, (a, response) -> {
if (response.getType() == IqPacket.TYPE.RESULT) {
final Element resultCommand = response.findChild("command", Namespace.COMMANDS);
final Element x = resultCommand == null ? null : resultCommand.findChild("x", Namespace.DATA);
if (x != null) {
final Data data = Data.parse(x);
final String uri = data.getValue("uri");
final String landingUrl = data.getValue("landing-url");
if (uri != null) {
final EasyOnboardingInvite invite = new EasyOnboardingInvite(jid.getDomain().toEscapedString(), uri, landingUrl);
callback.inviteRequested(invite);
return;
}
}
callback.inviteRequestFailed(getString(R.string.unable_to_parse_invite));
Log.d(Config.LOGTAG, response.toString());
} else if (response.getType() == IqPacket.TYPE.ERROR) {
callback.inviteRequestFailed(IqParser.errorMessage(response));
} else {
callback.inviteRequestFailed(getString(R.string.remote_server_timeout));
}
});
}
public void fetchRosterFromServer(final Account account) {
final IqPacket iqPacket = new IqPacket(IqPacket.TYPE.GET);
if (!"".equals(account.getRosterVersion())) {
@ -3658,19 +3697,17 @@ public class XmppConnectionService extends Service {
updateConversationUi();
updateAccountUi();
} else {
Contact contact = a.getRoster().getContact(avatar.owner);
if (contact.setAvatar(avatar)) {
syncRoster(account);
getAvatarService().clear(contact);
updateConversationUi();
updateRosterUi();
}
final Contact contact = a.getRoster().getContact(avatar.owner);
contact.setAvatar(avatar);
syncRoster(account);
getAvatarService().clear(contact);
updateConversationUi();
updateRosterUi();
}
if (callback != null) {
callback.success(avatar);
}
Log.d(Config.LOGTAG, a.getJid().asBareJid()
+ ": successfully fetched pep avatar for " + avatar.owner);
Log.d(Config.LOGTAG, a.getJid().asBareJid() + ": successfully fetched pep avatar for " + avatar.owner);
return;
}
} else {
@ -3720,12 +3757,11 @@ public class XmppConnectionService extends Service {
getAvatarService().clear(account);
updateAccountUi();
} else {
Contact contact = account.getRoster().getContact(avatar.owner);
if (contact.setAvatar(avatar, previouslyOmittedPepFetch)) {
syncRoster(account);
getAvatarService().clear(contact);
updateRosterUi();
}
final Contact contact = account.getRoster().getContact(avatar.owner);
contact.setAvatar(avatar, previouslyOmittedPepFetch);
syncRoster(account);
getAvatarService().clear(contact);
updateRosterUi();
}
updateConversationUi();
} else {
@ -3740,11 +3776,10 @@ public class XmppConnectionService extends Service {
}
if (user.getRealJid() != null) {
Contact contact = account.getRoster().getContact(user.getRealJid());
if (contact.setAvatar(avatar)) {
syncRoster(account);
getAvatarService().clear(contact);
updateRosterUi();
}
contact.setAvatar(avatar);
syncRoster(account);
getAvatarService().clear(contact);
updateRosterUi();
}
}
}

View File

@ -21,6 +21,8 @@ import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.TextView;
import com.google.common.base.Strings;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
@ -347,7 +349,7 @@ public class ChooseContactActivity extends AbstractSearchableListItemActivity im
private void handleActivityResult(ActivityResult activityResult) {
if (activityResult.resultCode == RESULT_OK && activityResult.requestCode == ScanActivity.REQUEST_SCAN_QR_CODE) {
String result = activityResult.data.getStringExtra(ScanActivity.INTENT_EXTRA_RESULT);
XmppUri uri = new XmppUri(result == null ? "" : result);
XmppUri uri = new XmppUri(Strings.nullToEmpty(result));
if (uri.isValidJid()) {
showEnterJidDialog(uri);
}

View File

@ -1049,6 +1049,15 @@ 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()) {
binding.textinput.insertAsQuote(text);
@ -1066,6 +1075,8 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
//This should cancel any remaining click events that would otherwise trigger links
v.dispatchTouchEvent(MotionEvent.obtain(0, 0, MotionEvent.ACTION_CANCEL, 0f, 0f, 0));
synchronized (this.messageList) {
super.onCreateContextMenu(menu, v, menuInfo);
AdapterView.AdapterContextMenuInfo acmi = (AdapterContextMenuInfo) menuInfo;
@ -1721,7 +1732,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)),
@ -1729,6 +1743,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();
}
}
@ -2102,6 +2118,7 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
}
this.binding.textinput.setKeyboardListener(this);
refresh(false);
activity.invalidateOptionsMenu();
this.conversation.messagesLoaded.set(true);
Log.d(Config.LOGTAG, "scrolledToBottomAndNoPending=" + Boolean.toString(scrolledToBottomAndNoPending));
@ -2382,7 +2399,6 @@ public class ConversationFragment extends XmppFragment implements EditMessage.Ke
}
updateSendButton();
updateEditablity();
activity.invalidateOptionsMenu();
}
}
}

View File

@ -131,6 +131,7 @@ public class ConversationsActivity extends XmppActivity implements OnConversatio
@Override
protected void refreshUiReal() {
invalidateOptionsMenu();
for (@IdRes int id : FRAGMENT_ID_NOTIFICATION_ORDER) {
refreshFragment(id);
}

View File

@ -30,6 +30,7 @@
package eu.siacs.conversations.ui;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Fragment;
import android.content.Intent;
import android.databinding.DataBindingUtil;
@ -48,12 +49,16 @@ import android.view.MenuItem;
import android.view.View;
import android.view.ViewGroup;
import com.google.common.collect.Collections2;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.atomic.AtomicReference;
import eu.siacs.conversations.Config;
import eu.siacs.conversations.R;
import eu.siacs.conversations.databinding.FragmentConversationsOverviewBinding;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.entities.Conversation;
import eu.siacs.conversations.entities.Conversational;
import eu.siacs.conversations.ui.adapter.ConversationAdapter;
@ -65,6 +70,7 @@ import eu.siacs.conversations.ui.util.PendingItem;
import eu.siacs.conversations.ui.util.ScrollState;
import eu.siacs.conversations.ui.util.StyledAttributes;
import eu.siacs.conversations.utils.AccountUtils;
import eu.siacs.conversations.utils.EasyOnboardingInvite;
import eu.siacs.conversations.utils.ThemeHelper;
import static android.support.v7.widget.helper.ItemTouchHelper.LEFT;
@ -192,7 +198,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 +248,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 +297,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();
}
@ -286,6 +306,8 @@ public class ConversationsOverviewFragment extends XmppFragment {
public void onCreateOptionsMenu(Menu menu, MenuInflater menuInflater) {
menuInflater.inflate(R.menu.fragment_conversations_overview, menu);
AccountUtils.showHideMenuItems(menu);
final MenuItem easyOnboardInvite = menu.findItem(R.id.action_easy_invite);
easyOnboardInvite.setVisible(EasyOnboardingInvite.anyHasSupport(activity == null ? null : activity.xmppConnectionService));
}
@Override
@ -340,10 +362,33 @@ public class ConversationsOverviewFragment extends XmppFragment {
case R.id.action_search:
startActivity(new Intent(getActivity(), SearchActivity.class));
return true;
case R.id.action_easy_invite:
selectAccountToStartEasyInvite();
return true;
}
return super.onOptionsItemSelected(item);
}
private void selectAccountToStartEasyInvite() {
final List<Account> accounts = EasyOnboardingInvite.getSupportingAccounts(activity.xmppConnectionService);
if (accounts.size() == 1) {
openEasyInviteScreen(accounts.get(0));
} else {
final AtomicReference<Account> selectedAccount = new AtomicReference<>(accounts.get(0));
final AlertDialog.Builder alertDialogBuilder = new AlertDialog.Builder(activity);
alertDialogBuilder.setTitle(R.string.choose_account);
final String[] asStrings = Collections2.transform(accounts, a -> a.getJid().asBareJid().toEscapedString()).toArray(new String[0]);
alertDialogBuilder.setSingleChoiceItems(asStrings, 0, (dialog, which) -> selectedAccount.set(accounts.get(which)));
alertDialogBuilder.setNegativeButton(R.string.cancel, null);
alertDialogBuilder.setPositiveButton(R.string.ok, (dialog, which) -> openEasyInviteScreen(selectedAccount.get()));
alertDialogBuilder.create().show();
}
}
private void openEasyInviteScreen(final Account account) {
EasyOnboardingInviteActivity.launch(account, activity);
}
@Override
void refresh() {
if (this.binding == null || this.activity == null) {

View File

@ -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);

View File

@ -246,6 +246,7 @@ public class UriHandlerActivity extends AppCompatActivity {
}
private static boolean looksLikeJsonObject(final String input) {
return input.charAt(0) == '{' && input.charAt(input.length() - 1) == '}';
final String trimmed = Strings.emptyToNull(input).trim();
return trimmed.charAt(0) == '{' && trimmed.charAt(trimmed.length() - 1) == '}';
}
}

View File

@ -65,8 +65,6 @@ import eu.siacs.conversations.ui.util.AvatarWorkerTask;
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;
@ -78,7 +76,7 @@ import eu.siacs.conversations.utils.UIHelper;
import eu.siacs.conversations.xmpp.Jid;
import eu.siacs.conversations.xmpp.mam.MamReference;
public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextView.CopyHandler {
public class MessageAdapter extends ArrayAdapter<Message> {
public static final String DATE_SEPARATOR_BODY = "DATE_SEPARATOR";
private static final int SENT = 0;
@ -87,7 +85,6 @@ public class MessageAdapter extends ArrayAdapter<Message> 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<String> highlightedTerm = null;
private DisplayMetrics metrics;
@ -501,9 +498,7 @@ public class MessageAdapter extends ArrayAdapter<Message> 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);
@ -673,11 +668,6 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
default:
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);
} else {
viewHolder = (ViewHolder) view.getTag();
@ -866,45 +856,7 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
private void promptOpenKeychainInstall(View view) {
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();
builder.setSpan(copySpan, start, end, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
DividerSpan[] dividerSpans = builder.getSpans(0, builder.length(), DividerSpan.class);
for (DividerSpan dividerSpan : dividerSpans) {
builder.replace(builder.getSpanStart(dividerSpan), builder.getSpanEnd(dividerSpan),
dividerSpan.isLarge() ? "\n\n" : "\n");
}
start = builder.getSpanStart(copySpan);
end = builder.getSpanEnd(copySpan);
if (start == -1 || end == -1) return "";
builder = new SpannableStringBuilder(builder, start, end);
if (forCopy) {
QuoteSpan[] quoteSpans = builder.getSpans(0, builder.length(), QuoteSpan.class);
for (QuoteSpan quoteSpan : quoteSpans) {
builder.insert(builder.getSpanStart(quoteSpan), "> ");
}
}
return builder.toString();
}
@Override
public String transformTextForCopy(CharSequence text, int start, int end) {
if (text instanceof Spanned) {
return transformText(text, start, end, true);
} else {
return text.toString().substring(start, end);
}
}
public FileBackend getFileBackend() {
return activity.xmppConnectionService.getFileBackend();
}
@ -969,56 +921,9 @@ public class MessageAdapter extends ArrayAdapter<Message> implements CopyTextVie
protected ImageView indicator;
protected ImageView indicatorReceived;
protected TextView time;
protected CopyTextView messageBody;
protected TextView messageBody;
protected ImageView contact_picture;
protected TextView status_message;
protected TextView encryption;
}
private class MessageBodyActionModeCallback implements ActionMode.Callback {
private final TextView textView;
public MessageBodyActionModeCallback(TextView textView) {
this.textView = textView;
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
if (onQuoteListener != null) {
int quoteResId = activity.getThemeResource(R.attr.icon_quote, R.drawable.ic_action_reply);
// 3rd item is placed after "copy" item
menu.add(0, android.R.id.button1, 3, R.string.quote).setIcon(quoteResId)
.setShowAsAction(MenuItem.SHOW_AS_ACTION_ALWAYS | MenuItem.SHOW_AS_ACTION_WITH_TEXT);
}
return false;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
if (item.getItemId() == android.R.id.button1) {
int start = textView.getSelectionStart();
int end = textView.getSelectionEnd();
if (end > start) {
String text = transformText(textView.getText(), start, end, false);
if (onQuoteListener != null) {
onQuoteListener.onQuote(text);
}
mode.finish();
}
return true;
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
}
}

View File

@ -1,58 +0,0 @@
package eu.siacs.conversations.ui.widget;
import android.content.ClipData;
import android.content.ClipboardManager;
import android.content.Context;
import android.support.v7.widget.AppCompatTextView;
import android.util.AttributeSet;
public class CopyTextView extends AppCompatTextView {
public CopyTextView(Context context) {
super(context);
}
public CopyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public CopyTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
public interface CopyHandler {
String transformTextForCopy(CharSequence text, int start, int end);
}
private CopyHandler copyHandler;
public void setCopyHandler(CopyHandler copyHandler) {
this.copyHandler = copyHandler;
}
@Override
public boolean onTextContextMenuItem(int id) {
final CharSequence text = getText();
int min = 0;
int max = text.length();
if (isFocused()) {
final int selStart = getSelectionStart();
final int selEnd = getSelectionEnd();
min = Math.max(0, Math.min(selStart, selEnd));
max = Math.max(0, Math.max(selStart, selEnd));
}
String textForCopy = null;
if (id == android.R.id.copy && copyHandler != null) {
textForCopy = copyHandler.transformTextForCopy(getText(), min, max);
}
try {
return super.onTextContextMenuItem(id);
} finally {
if (textForCopy != null) {
ClipboardManager clipboard = (ClipboardManager) getContext().
getSystemService(Context.CLIPBOARD_SERVICE);
clipboard.setPrimaryClip(ClipData.newPlainText(null, textForCopy));
}
}
}
}

View File

@ -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;
}
}
}
}

View File

@ -0,0 +1,93 @@
package eu.siacs.conversations.utils;
import android.os.Parcel;
import android.os.Parcelable;
import com.google.common.base.Strings;
import com.google.common.collect.ImmutableList;
import java.util.Collections;
import java.util.List;
import eu.siacs.conversations.entities.Account;
import eu.siacs.conversations.services.QuickConversationsService;
import eu.siacs.conversations.services.XmppConnectionService;
import eu.siacs.conversations.xmpp.XmppConnection;
public class EasyOnboardingInvite implements Parcelable {
private String domain;
private String uri;
private String landingUrl;
protected EasyOnboardingInvite(Parcel in) {
domain = in.readString();
uri = in.readString();
landingUrl = in.readString();
}
public EasyOnboardingInvite(String domain, String uri, String landingUrl) {
this.domain = domain;
this.uri = uri;
this.landingUrl = landingUrl;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(domain);
dest.writeString(uri);
dest.writeString(landingUrl);
}
@Override
public int describeContents() {
return 0;
}
public static final Creator<EasyOnboardingInvite> CREATOR = new Creator<EasyOnboardingInvite>() {
@Override
public EasyOnboardingInvite createFromParcel(Parcel in) {
return new EasyOnboardingInvite(in);
}
@Override
public EasyOnboardingInvite[] newArray(int size) {
return new EasyOnboardingInvite[size];
}
};
public static boolean anyHasSupport(final XmppConnectionService service) {
if (QuickConversationsService.isQuicksy()) {
return false;
}
return getSupportingAccounts(service).size() > 0;
}
public static List<Account> getSupportingAccounts(final XmppConnectionService service) {
final ImmutableList.Builder<Account> supportingAccountsBuilder = new ImmutableList.Builder<>();
final List<Account> accounts = service == null ? Collections.emptyList() : service.getAccounts();
for(Account account : accounts) {
final XmppConnection xmppConnection = account.getXmppConnection();
if (xmppConnection != null && xmppConnection.getFeatures().easyOnboardingInvites()) {
supportingAccountsBuilder.add(account);
}
}
return supportingAccountsBuilder.build();
}
public String getShareableLink() {
return Strings.isNullOrEmpty(landingUrl) ? uri : landingUrl;
}
public String getDomain() {
return domain;
}
public interface OnInviteRequested {
void inviteRequested(EasyOnboardingInvite invite);
void inviteRequestFailed(String message);
}
}

View File

@ -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();

View File

@ -174,11 +174,7 @@ public class XmppUri {
jid = null;
}
} else {
try {
jid = Jid.ofEscaped(uri.toString()).asBareJid().toEscapedString();
} catch (final IllegalArgumentException ignored) {
jid = null;
}
jid = null;
}
}

View File

@ -52,4 +52,5 @@ public final class Namespace {
public static final String BOOKMARKS2_COMPAT = BOOKMARKS2 + "#compat";
public static final String INVITE = "urn:xmpp:invite";
public static final String PARS = "urn:xmpp:pars:0";
public static final String EASY_ONBOARDING_INVITE = "urn:xmpp:invite#invite";
}

View File

@ -137,6 +137,7 @@ public class XmppConnection implements Runnable {
protected final Account account;
private final Features features = new Features(this);
private final HashMap<Jid, ServiceDiscoveryResult> disco = new HashMap<>();
private final HashMap<String, Jid> commands = new HashMap<>();
private final SparseArray<AbstractAcknowledgeableStanza> mStanzaQueue = new SparseArray<>();
private final Hashtable<String, Pair<IqPacket, OnIqPacketReceived>> packetCallbacks = new Hashtable<>();
private final Set<OnAdvancedStreamFeaturesLoaded> advancedStreamFeaturesLoadedListeners = new HashSet<>();
@ -228,6 +229,12 @@ public class XmppConnection implements Runnable {
}
}
public Jid getJidForCommand(final String node) {
synchronized (this.commands) {
return this.commands.get(node);
}
}
public void prepareNewConnection() {
this.lastConnect = SystemClock.elapsedRealtime();
this.lastPingSent = SystemClock.elapsedRealtime();
@ -1001,6 +1008,9 @@ public class XmppConnection implements Runnable {
synchronized (this.disco) {
disco.clear();
}
synchronized (this.commands) {
this.commands.clear();
}
}
private void sendBindRequest() {
@ -1223,6 +1233,35 @@ public class XmppConnection implements Runnable {
});
}
private void discoverCommands() {
final IqPacket request = new IqPacket(IqPacket.TYPE.GET);
request.setTo(account.getDomain());
request.addChild("query", Namespace.DISCO_ITEMS).setAttribute("node", Namespace.COMMANDS);
sendIqPacket(request, (account, response) -> {
if (response.getType() == IqPacket.TYPE.RESULT) {
final Element query = response.findChild("query",Namespace.DISCO_ITEMS);
if (query == null) {
return;
}
final HashMap<String, Jid> commands = new HashMap<>();
for(final Element child : query.getChildren()) {
if ("item".equals(child.getName())) {
final String node = child.getAttribute("node");
final Jid jid = child.getAttributeAsJid("jid");
if (node != null && jid != null) {
commands.put(node, jid);
}
}
}
Log.d(Config.LOGTAG,commands.toString());
synchronized (this.commands) {
this.commands.clear();
this.commands.putAll(commands);
}
}
});
}
public boolean isMamPreferenceAlways() {
return isMamPreferenceAlways;
}
@ -1246,6 +1285,9 @@ public class XmppConnection implements Runnable {
if (getFeatures().carbons() && !features.carbonsEnabled) {
sendEnableCarbons();
}
if (getFeatures().commands()) {
discoverCommands();
}
}
private void sendServiceDiscoveryItems(final Jid server) {
@ -1761,6 +1803,16 @@ public class XmppConnection implements Runnable {
return hasDiscoFeature(account.getDomain(), "urn:xmpp:carbons:2");
}
public boolean commands() {
return hasDiscoFeature(account.getDomain(), Namespace.COMMANDS);
}
public boolean easyOnboardingInvites() {
synchronized (commands) {
return commands.containsKey(Namespace.EASY_ONBOARDING_INVITE);
}
}
public boolean bookmarksConversion() {
return hasDiscoFeature(account.getJid().asBareJid(), Namespace.BOOKMARKS_CONVERSION) && pepPublishOptions();
}

View File

@ -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"

View File

@ -1,12 +1,12 @@
<?xml version="1.0" encoding="utf-8"?>
<merge xmlns:android="http://schemas.android.com/apk/res/android">
<eu.siacs.conversations.ui.widget.CopyTextView
<TextView
android:id="@+id/message_body"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:autoLink="web"
android:longClickable="true"
android:longClickable="false"
android:textAppearance="@style/TextAppearance.Conversations.Body1"/>
<ImageView

View File

@ -35,6 +35,10 @@
android:title="@string/search_messages"
android:visible="@bool/show_individual_search_options"
app:showAsAction="never" />
<item
android:id="@+id/action_easy_invite"
android:orderInCategory="89"
android:title="@string/invite_to_app" />
<item
android:id="@+id/action_accounts"
android:orderInCategory="90"

View File

@ -947,4 +947,8 @@
</plurals>
<string name="failed_deliveries">Fehlgeschlagene Zustellungen</string>
<string name="more_options">Weitere Optionen</string>
<string name="no_application_found">Keine Anwendung gefunden</string>
<string name="invite_to_app">Einladung zu Conversations</string>
<string name="unable_to_parse_invite">Einladung kann nicht gelesen werden</string>
<string name="server_does_not_support_easy_onboarding_invites">Server unterstützt keine Generierung von Einladungen</string>
</resources>

View File

@ -4,26 +4,27 @@
<string name="action_add">Νέα συζήτηση</string>
<string name="action_accounts">Διαχείριση λογαριασμών</string>
<string name="action_account">Διαχείριση λογαριασμού</string>
<string name="action_end_conversation">Τερματισμός συζήτησης</string>
<string name="action_contact_details">Λεπτομέρειες επαφής</string>
<string name="action_muc_details">Λεπτομέρειες ομαδικής συζήτησης</string>
<string name="channel_details">Λεπτομέρειες καναλιού</string>
<string name="action_add_account">Προσθήκη λογαριασμού</string>
<string name="action_edit_contact">Επεξεργασία ονόματος</string>
<string name="action_add_phone_book">Προσθήκη στην ατζέντα</string>
<string name="action_add_phone_book">Προσθήκη στο βιβλίο διευθύνσεων</string>
<string name="action_delete_contact">Διαγραφή από τη λίστα επαφών</string>
<string name="action_block_contact">Αποκλεισμός επαφής</string>
<string name="action_unblock_contact">Άρση αποκλεισμού επαφής</string>
<string name="action_block_domain">Αποκλεισμός τομέα</string>
<string name="action_unblock_domain">Άρση αποκλεισμού τομέα</string>
<string name="action_block_participant">Αποκλεισμός συμμετέχοντα</string>
<string name="action_unblock_participant">Αναίρεση αποκλεισμού συμμετέχοντα</string>
<string name="action_unblock_participant">Άρση αποκλεισμού συμμετέχοντα</string>
<string name="title_activity_manage_accounts">Διαχείριση Λογαριασμών</string>
<string name="title_activity_settings">Ρυθμίσεις</string>
<string name="title_activity_sharewith">Διαμοιρασμός με Συζήτηση</string>
<string name="title_activity_start_conversation">Έναρξη Συζήτησης</string>
<string name="title_activity_choose_contact">Επέλεξε επαφή</string>
<string name="title_activity_choose_contact">Επιλογή επαφής</string>
<string name="title_activity_choose_contacts">Επιλογή επαφών</string>
<string name="title_activity_share_via_account">Μοιράσου μέσω του λογαριασμού</string>
<string name="title_activity_share_via_account">Διαμοιρασμός μέσω λογαριασμού</string>
<string name="title_activity_block_list">Αποκλεισμός λίστας</string>
<string name="just_now">μόλις τώρα</string>
<string name="minute_ago">πριν από 1 λεπτό</string>
@ -31,25 +32,27 @@
<string name="x_unread_conversations">%d αδιάβαστες συζητήσεις</string>
<string name="sending">αποστολή...</string>
<string name="message_decrypting">Αποκρυπτογράφηση μηνύματος. Παρακαλώ περιμένετε...</string>
<string name="pgp_message">OpenPGP κρυπτογραφημένο μήνυμα</string>
<string name="pgp_message">Κρυπτογραφημένο μήνυμα OpenPGP</string>
<string name="nick_in_use">Το ψευδώνυμο είναι ήδη σε χρήση</string>
<string name="invalid_muc_nick">Άκυρο όνομα</string>
<string name="invalid_muc_nick">Μη έγκυρο ψευδώνυμο</string>
<string name="admin">Διαχειριστής</string>
<string name="owner">Κάτοχος</string>
<string name="moderator">Συντονιστής</string>
<string name="participant">Συμμετέχων</string>
<string name="visitor">Επισκέπτης</string>
<string name="remove_contact_text">Θα θέλατε να αφαιρέσετε τον/την %s από τη λίστα επαφών σας; Οι Συζητήσεις με αυτή την επαφή δεν θα αφαιρεθούν.</string>
<string name="block_contact_text">Θέλετε να αποκλείσετε την επαφή %s από το να σας στέλνει μηνύματα;</string>
<string name="unblock_contact_text">Θέλετε να επιτρέψετε στην επαφή %s να σας στέλνει μηνύματα;</string>
<string name="unblock_contact_text">Θέλετε να κάνετε άρση αποκλεισμού και να επιτρέψετε στην επαφή %s να σας στέλνει μηνύματα;</string>
<string name="block_domain_text">Αποκλεισμός όλων των επαφών από το %s;</string>
<string name="unblock_domain_text">Άρση αποκλεισμού όλων των επαφών από το %s;</string>
<string name="contact_blocked">Η επαφή αποκλείστηκε</string>
<string name="blocked">Αποκλεισμένος</string>
<string name="remove_bookmark_text">Θέλετε να αφαιρέσετε το %s ως σελιδοδείκτη; Οι συζητήσεις που σχετίζονται με αυτόν τον σελιδοδείκτη δεν θα αφαιρεθούν.</string>
<string name="register_account">Εγγραφή νέου λογαριασμού στον διακομιστή</string>
<string name="change_password_on_server">Αλλαγή συνθηματικού στον διακομιστή</string>
<string name="share_with">Διαμοιρασμός με...</string>
<string name="start_conversation">Έναρξη συζήτησης</string>
<string name="invite_contact">Προσκάλεσε επαφή</string>
<string name="invite_contact">Πρόσκληση επαφής</string>
<string name="invite">Πρόσκληση</string>
<string name="contacts">Επαφές</string>
<string name="contact">Επαφή</string>
@ -63,50 +66,68 @@
<string name="save">Αποθήκευση</string>
<string name="ok">Εντάξει</string>
<string name="crash_report_title">Το Conversations έκλεισε απροσδόκητα</string>
<string name="crash_report_message">Η χρήση του XMPP λογαριασμού σας για την αποστολή ίχνους στοίβας προωθεί την συνεχή ανάπτυξη του Conversations.</string>
<string name="send_now">Αποστολή τώρα</string>
<string name="send_never">Χωρίς ερώτηση την επόμενη φορά</string>
<string name="problem_connecting_to_account">Δεν ήταν δυνατή η σύνδεση στον λογαριασμό</string>
<string name="problem_connecting_to_accounts">Δεν ήταν δυνατή η σύνδεση σε πολλαπλούς λογαριασμούς</string>
<string name="touch_to_fix">Επιλέξτε για διαχείριση των λογαριασμών σας</string>
<string name="attach_file">Επισύναψη αρχείου</string>
<string name="not_in_roster">Προσθήκη της επαφής αυτής στη λίστα επαφών σας;</string>
<string name="add_contact">Προσθήκη επαφής</string>
<string name="send_failed">η αποστολή απέτυχε</string>
<string name="sharing_files_please_wait">Διαμοιρασμός φακέλων. Παρακαλώ περιμένετε...</string>
<string name="preparing_image">Προετοιμασία εικόνας για αποστολή</string>
<string name="preparing_images">Προετοιμασία εικόνων για μεταφορά</string>
<string name="sharing_files_please_wait">Διαμοιρασμός αρχείων. Παρακαλώ περιμένετε...</string>
<string name="action_clear_history">Καθαρισμός ιστορικού</string>
<string name="clear_conversation_history">Καθαρισμός ιστορικού Συζήτησης</string>
<string name="clear_histor_msg">Θέλετε να διαγράψετε όλα τα μηνύματα αυτής της συζήτησης;\n\n<b>Προσοχή:</b> Αυτή η ενέργεια δεν θα επηρεάσει μηνύματα που είναι αποθηκευμένα σε άλλες συσκευές ή εξυπηρετητές.</string>
<string name="delete_file_dialog">Διαγραφή αρχείου</string>
<string name="delete_file_dialog_msg">Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτό το αρχείο;\n\n<b>Προσοχή</b> Αυτή η ενέργεια δεν θα διαγράψει αντίγραφα αυτού του αρχείου που είναι αποθηκευμένα σε άλλες συσκευές ή εξυπηρετητές.</string>
<string name="also_end_conversation">Κλείσιμο της συζήτησης αμέσως μετά</string>
<string name="choose_presence">Επιλογή συσκευής</string>
<string name="send_unencrypted_message">Αποστολή κρυπτογραφημένου μηνύματος</string>
<string name="send_unencrypted_message">Αποστολή μη κρυπτογραφημένου μηνύματος</string>
<string name="send_message">Αποστολή μηνύματος</string>
<string name="send_message_to_x">Αποστολή μηνύματος %s</string>
<string name="send_omemo_message">Αποστολή OMEMO κρυπτογραφημένου μηνύματος</string>
<string name="send_omemo_x509_message">Αποστολή v\\OMEMO κρυπτογραφημένου μηνύματος</string>
<string name="send_message_to_x">Αποστολή μηνύματος στον/στην %s</string>
<string name="send_omemo_message">Αποστολή κρυπτογραφημένου μηνύματος OMEMO</string>
<string name="send_omemo_x509_message">Αποστολή v\\κρυπτογραφημένου μηνύματος OMEMO</string>
<string name="send_pgp_message">Αποστολή κρυπτογραφημένου μηνύματος OpenPGP</string>
<string name="your_nick_has_been_changed">Χρήση νέου ψευδωνύμου</string>
<string name="send_unencrypted">Αποστολή χωρίς κρυπτογράφηση</string>
<string name="decryption_failed">Η αποκρυπτογράφηση απέτυχε. Ίσως δεν κατέχετε το σωστό ιδιωτικό κλειδί.</string>
<string name="openkeychain_required">OpenKeychain</string>
<string name="openkeychain_required_long">Το Conversations χρησιμοποιεί το <b>OpenKeychain</b> για να κρυπτογραφεί και να αποκρυπτογραφεί μηνύματα και να διαχειρίζεται τα δημόσια κλειδιά σας.\n\nΕίναι δημοσιευμένο με άδεια GPLv3+ και είναι διαθέσιμο στο F-Droid και το Google Play.\n\n<small>(Παρακαλώ επανεκκινήστε το Conversations αμέσως μετά.)</small></string>
<string name="restart">Επανεκκίνηση</string>
<string name="install">Εγκατάσταση</string>
<string name="openkeychain_not_installed">Παρακαλώ εγκαταστήστε OpenKeychain</string>
<string name="openkeychain_not_installed">Παρακαλώ εγκαταστήστε το OpenKeychain</string>
<string name="offering">προσφορά...</string>
<string name="waiting">αναμονή...</string>
<string name="no_pgp_key">Δεν βρέθηκε κλειδί OpenPGP</string>
<string name="contact_has_no_pgp_key">Δεν ήταν δυνατή η κρυπτογράφηση του μηνύματός σας γιατί η επαφή σας δεν ανακοινώνει το δημόσιο κλειδί της.\n\n<small>Παρακαλώ ζητήστε από την επαφή σας να ρυθμίσει το OpenPGP.</small></string>
<string name="no_pgp_keys">Δεν βρέθηκαν κλειδιά OpenPGP</string>
<string name="contacts_have_no_pgp_keys">Δεν ήταν δυνατή η κρυπτογράφηση του μηνύματός σας γιατί οι επαφές σας δεν ανακοινώνουν το δημόσιο κλειδί τους.\n\n<small>Παρακαλώ ζητήστε από τις επαφές σας να εγκαταστήσουν το OpenPGP.</small></string>
<string name="pref_general">Γενικά</string>
<string name="pref_accept_files">Αποδοχή αρχείων</string>
<string name="pref_accept_files_summary">Αυτόματη αποδοχή αρχείων μικρότερα από...</string>
<string name="pref_attachments">Επισυναπτόμμενα</string>
<string name="pref_attachments">Συνημμένα</string>
<string name="pref_notification_settings">Ειδοποίηση</string>
<string name="pref_vibrate">Δόνηση</string>
<string name="pref_vibrate_summary">Δόνηση όταν δέχεστε νέο μήνυμα</string>
<string name="pref_led">Ειδοποίηση LED</string>
<string name="pref_led_summary">Ειδοποίηση μέσω αναβοσβήματος όταν δέχεστε νέο μήνυμα</string>
<string name="pref_led_summary">Ειδοποίηση μέσω εναλλαγής LED κατά τη λήψη νέου μηνύματος</string>
<string name="pref_ringtone">Κουδούνισμα</string>
<string name="pref_notification_sound">Ήχος ειδοποίησης</string>
<string name="pref_notification_sound_summary">Ήχος ειδοποίησης για νέα μηνύματα</string>
<string name="pref_call_ringtone_summary">Κουδούνισμα για εισερχόμενη κλήση</string>
<string name="pref_notification_grace_period">Περίοδος Χάριτος</string>
<string name="pref_notification_grace_period_summary">Ο χρόνος σίγασης ειδοποιήσεων αφότου ανιχνευθεί δραστηριότητα σε μια από τις άλλες συσκευές σας.</string>
<string name="pref_advanced_options">Προχωρημένος</string>
<string name="pref_advanced_options">Για προχωρημένους</string>
<string name="pref_never_send_crash">Να μην αποστέλλονται αναφορές λαθών</string>
<string name="pref_never_send_crash_summary">Στέλνοντας ίχνη στοίβας βοηθάτε την συνεχόμενη ανάπτυξη</string>
<string name="pref_confirm_messages">Επιβεβαίωση μηνυμάτων</string>
<string name="pref_confirm_messages_summary">Να επιτρέπεται οι επαφές σας να γνωρίζουν ότι δεχτήκατε διαβάσατε τα μηνύματα τους </string>
<string name="pref_ui_options">Προφίλ χρήστη</string>
<string name="pref_confirm_messages_summary">Επιτρέψτε στις επαφές σας να γνωρίζουν όταν έχετε λάβει και διαβάσει τα μηνύματά τους</string>
<string name="pref_ui_options">Διεπαφή χρήστη</string>
<string name="openpgp_error">Το OpenKeychain ανέφερε κάποιο σφάλμα.</string>
<string name="bad_key_for_encryption">Σφάλμα στο κλειδί κρυπτογράφησης</string>
<string name="accept">Αποδοχή</string>
<string name="error">Έχει συμβεί κάποιο σφάλμα</string>
@ -119,11 +140,13 @@
<string name="attach_take_picture">Λήψη εικόνας</string>
<string name="preemptively_grant">Ερήμην χορήγηση αίτησης συνδρομής</string>
<string name="error_not_an_image_file">Το αρχείο που επιλέξατε δεν είναι εικόνα</string>
<string name="error_compressing_image">Σφάλμα κατά τη μετατροπή του αρχείου εικόνας</string>
<string name="error_file_not_found">Το αρχείο δεν βρέθηκε</string>
<string name="error_io_exception">Γενικό σφάλμα εισόδου/εξόδου. Ίσως δεν έχετε ελεύθερο χώρο αποθήκευσης;</string>
<string name="error_security_exception_during_image_copy">Η εφαρμογή που χρησιμοποιήσατε για να επιλέξετε αυτή την εικόνα δεν παραχώρησε αρκετά δικαιώματα για την ανάγνωση του αρχείου.\n\n<small>Χρησιμοποιήστε διαφορετικό διαχειριστή αρχείων για να επιλέξετε μια εικόνα</small></string>
<string name="account_status_unknown">Άγνωστο</string>
<string name="account_status_disabled">Προσωρινά απενεργοποιημένο</string>
<string name="account_status_online">Συνδεμένος</string>
<string name="account_status_online">Σε σύνδεση</string>
<string name="account_status_connecting">Σύνδεση\u2026</string>
<string name="account_status_offline">Εκτός σύνδεσης</string>
<string name="account_status_unauthorized">Χωρίς εξουσιοδότηση</string>
@ -132,9 +155,10 @@
<string name="account_status_regis_fail">Η εγγραφή απέτυχε</string>
<string name="account_status_regis_conflict">Το όνομα χρησιμοποιείται ήδη</string>
<string name="account_status_regis_success">Ολοκλήρωση εγγραφής</string>
<string name="account_status_regis_not_sup">Ο διακομιστής δεν υποστηρίζει εγγραφή</string>
<string name="account_status_regis_invalid_token">Άκυρο κουπόνι εγγραφής</string>
<string name="account_status_tls_error">TLS αποτυχία επικοινωνίας</string>
<string name="account_status_policy_violation">Πολιτική παραβίασης</string>
<string name="account_status_tls_error">Αποτυχία διαπραγμάτευσης TLS</string>
<string name="account_status_policy_violation">Παραβίαση κανονισμού</string>
<string name="account_status_incompatible_server">Μη συμβατός διακομιστής</string>
<string name="account_status_stream_error">Σφάλμα μετάδοσης</string>
<string name="account_status_stream_opening_error">Σφάλμα στην εκκίνηση μετάδοσης</string>
@ -143,21 +167,23 @@
<string name="encryption_choice_pgp">OpenPGP</string>
<string name="encryption_choice_omemo">OMEMO</string>
<string name="mgmt_account_delete">Διαγραφή λογαριασμού</string>
<string name="mgmt_account_disable">Προσωρινά μη διαθέσιμο</string>
<string name="mgmt_account_disable">Προσωρινή απενεργοποίηση</string>
<string name="mgmt_account_publish_avatar">Δημοσίευση εικόνας προφίλ</string>
<string name="mgmt_account_publish_pgp">Δημοσίευση του δημόσιου κλειδιού OpenPGP</string>
<string name="unpublish_pgp">Αφαίρεση OpenPGP δημόσιου κλειδιού</string>
<string name="unpublish_pgp_message">Είστε σίγουρος ότι θέλετε να αφαιρέσετε το OpenPGP δημόσιο κλειδί σας από την παρούσα ανακοίνωσή σας?
Οι επαφές σας δεν θα είναι πλέον δυνατόν να σας στείλουν OpenPGP κρυπτογραφημένα μηνύματα.</string>
<string name="unpublish_pgp">Διαγραφή δημόσιου κλειδιού OpenPGP</string>
<string name="unpublish_pgp_message">Είστε βέβαιοι ότι θέλετε να αφαιρέσετε το δημόσιο κλειδί σας OpenPGP από την ανακοίνωση παρουσίας σας;\nΟι επαφές σας δεν θα είναι πλέον δυνατόν να σας στείλουν κρυπτογραφημένα μηνύματα με OpenPGP.</string>
<string name="openpgp_has_been_published">Το δημόσιο κλειδί OpenPGP έχει δημοσιευτεί.</string>
<string name="mgmt_account_enable">Ενεργοποίηση λογαριασμού</string>
<string name="mgmt_account_are_you_sure">Είστε βέβαιοι;</string>
<string name="mgmt_account_delete_confirm_text">Η διαγραφή του λογαριασμού σας διαγράφει όλο το ιστορικό συζητήσεών σας</string>
<string name="attach_record_voice">Εγγραφή φωνής</string>
<string name="account_settings_jabber_id">Διεύθυνση XMPP</string>
<string name="block_jabber_id">Αποκλεισμός διεύθυνσης XMPP</string>
<string name="account_settings_example_jabber_id">username@example.com</string>
<string name="password">Συνθηματικό</string>
<string name="invalid_jid">Μη έγκυρη διεύθυνση XMPP</string>
<string name="add_phone_book_text">Θέλετε να προσθέσετε %s στην ατζέντα σας?</string>
<string name="error_out_of_memory">Πλήρης μνήμη. Η εικόνα είναι πολύ μεγάλη</string>
<string name="add_phone_book_text">Θέλετε να προσθέσετε τον/την %s στο βιβλίο διευθύνσεών σας?</string>
<string name="server_info_show_more">Πληροφορίες διακομιστή</string>
<string name="server_info_mam">XEP-0313: Διαχείριση αρχείου μηνυμάτων</string>
<string name="server_info_carbon_messages">XEP-0280: Αντίγραφα μηνυμάτων</string>
@ -165,29 +191,35 @@
<string name="server_info_blocking">XEP-0191: Εντολή αποκλεισμού</string>
<string name="server_info_roster_version">XEP-0237: Διατήρηση εκδόσεων λίστας επαφών</string>
<string name="server_info_stream_management">XEP-0198: Διαχείριση ροών</string>
<string name="server_info_external_service_discovery">XEP-0215: Εύρεση εξωτερικών υπηρεσιών</string>
<string name="server_info_pep">XEP-0163: Πρωτόκολλο προσωπικών συμβάντων (εικόνες προφίλ / ΟΜΕΜΟ)</string>
<string name="server_info_http_upload">XEP-0363: Ανέβασμα αρχείου με πρωτόκολλο HTTP</string>
<string name="server_info_http_upload">XEP-0363: Μεταφόρτωση αρχείου με πρωτόκολλο HTTP</string>
<string name="server_info_push">XEP-0357: Push</string>
<string name="server_info_available">διαθέσιμος</string>
<string name="server_info_unavailable">μη διαθέσιμος</string>
<string name="missing_public_keys">Ελλειπείς ανακοινώσεις δημοσίων κλειδιών</string>
<string name="last_seen_now">συνδέθηκε τελευταία φορά μόλις τώρα</string>
<string name="last_seen_min">τελευταία σύνδεση πριν από 1 λεπτό</string>
<string name="last_seen_mins">τελευταία σύνδεση πριν από %d λεπτά</string>
<string name="last_seen_hour">τελευταία σύνδεση πριν από 1 ώρα</string>
<string name="last_seen_hours">τελευταία σύνδεση πριν από %d ώρες</string>
<string name="last_seen_day">τελευταία σύνδεση πριν από 1 μέρα</string>
<string name="last_seen_days">τελευταία σύνδεση πριν από %d μέρες</string>
<string name="install_openkeychain">Κρυπτογραφημένο μήνυμα. Παρακαλώ εγκαταστήστε το OpenKeychain για αποκρυπτογράφηση.</string>
<string name="openpgp_messages_found">Βρέθηκαν νέα μηνύματα κρυπτογραφημένα με OpenPGP</string>
<string name="openpgp_key_id">Ταυτότητα κλειδιού OpenPGP</string>
<string name="omemo_fingerprint">Αποτύπωμα OMEMO</string>
<string name="omemo_fingerprint_x509">v\\Αποτύπωμα OMEMO</string>
<string name="omemo_fingerprint_selected_message">Αποτύπωμα OMEMO μηνύματος</string>
<string name="omemo_fingerprint_x509_selected_message">v\\Αποτύπωμα OMEMO μηνύματος</string>
<string name="other_devices">\'Αλλες συσκευές</string>
<string name="trust_omemo_fingerprints">Εμπιστευτίτε τα OMEMO αποτυπώματα</string>
<string name="fetching_keys">Ανάσυρση κλειδιών...</string>
<string name="trust_omemo_fingerprints">Επαλήθευση των αποτυπωμάτων OMEMO</string>
<string name="fetching_keys">Μεταφόρτωση κλειδιών...</string>
<string name="done">Έγινε</string>
<string name="decrypt">Αποκρυπτογράφηση</string>
<string name="bookmarks">Σελιδοδείκτες</string>
<string name="search">Αναζήτηση</string>
<string name="enter_contact">Πρόσθεσε επαφή</string>
<string name="enter_contact">Εισαγωγή επαφής</string>
<string name="delete_contact">Διαγραφή επαφής</string>
<string name="view_contact_details">Λεπτομέρειες επαφής</string>
<string name="block_contact">Αποκλεισμός επαφής</string>
@ -200,39 +232,46 @@
<string name="channel_bare_jid_example">channel@conference.example.com</string>
<string name="save_as_bookmark">Αποθήκευση σαν σελιδοδείκτη</string>
<string name="delete_bookmark">Διαγραφή σελιδοδείκτη</string>
<string name="destroy_room">Καταστροφή ομαδικής συζήτησης</string>
<string name="destroy_channel">Καταστροφή καναλιού</string>
<string name="destroy_room_dialog">Είστε βέβαιοι ότι θέλετε να καταστρέψετε αυτή την ομαδική συζήτηση;\n\n<b>Προσοχή:</b>Η ομαδική συζήτηση θα διαγραφεί οριστικά από τον διακομιστή.</string>
<string name="destroy_room">Διαγραφή ομαδικής συζήτησης</string>
<string name="destroy_channel">Διαγραφή καναλιού</string>
<string name="destroy_room_dialog">Είστε βέβαιοι ότι θέλετε να διαγράψετε αυτή την ομαδική συζήτηση;\n\n<b>Προσοχή:</b>Η ομαδική συζήτηση θα διαγραφεί οριστικά από τον διακομιστή.</string>
<string name="destroy_channel_dialog">Είστε βέβαιοι ότι θέλετε να καταστρέψετε αυτό το δημόσιο κανάλι;\n\n<b>Προσοχή:</b>Το κανάλι θα διαγραφεί πλήρως από τον διακομιστή.</string>
<string name="could_not_destroy_room">Δεν ήταν δυνατή η καταστροφή της ομαδικής συζήτησης</string>
<string name="could_not_destroy_channel">Δεν ήταν δυνατή η καταστροφή του καναλιού</string>
<string name="could_not_destroy_room">Δεν ήταν δυνατή η διαγραφή της ομαδικής συζήτησης</string>
<string name="could_not_destroy_channel">Δεν ήταν δυνατή η διαγραφή του καναλιού</string>
<string name="action_edit_subject">Επεξεργασία θέματος ομαδικής συζήτησης</string>
<string name="topic">Θέμα</string>
<string name="joining_conference">Συμμετοχή σε ομαδική συζήτηση...</string>
<string name="joining_conference">Εισαγωγή σε ομαδική συζήτηση...</string>
<string name="leave">Έξοδος</string>
<string name="contact_added_you">Η επαφή σας πρόσθεσε στην λίστα επαφών</string>
<string name="contact_added_you">Η επαφή σάς πρόσθεσε στην λίστα επαφών</string>
<string name="add_back">Προσθήκη επίσης</string>
<string name="contact_has_read_up_to_this_point">Η επαφή %s έχει διαβάσει μέχρι αυτό το σημείο</string>
<string name="contacts_have_read_up_to_this_point">%sέχει διαβαστεί μέχρι αυτό το σημείο</string>
<string name="contact_has_read_up_to_this_point">Ο/Η %s έχει διαβάσει μέχρι αυτό το σημείο</string>
<string name="contacts_have_read_up_to_this_point">Οι χρήστες %s έχουν διαβάσει μέχρι αυτό το σημείο</string>
<string name="contacts_and_n_more_have_read_up_to_this_point">Ο χρήστης %1$s +%2$d ακόμα έχουν διαβάσει μέχρι αυτό το σημείο</string>
<string name="everyone_has_read_up_to_this_point">Όλοι έχουν διαβάσει μέχρι αυτό το σημείο</string>
<string name="publish">Δημοσίευση</string>
<string name="touch_to_choose_picture">Επιλέξτε την εικόνα προφίλ για να διαλέξετε εικόνα από την έκθεση</string>
<string name="publishing">Δημοσίευση...</string>
<string name="error_publish_avatar_server_reject">Ο διακομιστής απέρριψε την δημοσίευσή σας</string>
<string name="error_publish_avatar_converting">Δεν ήταν δυνατή η μετατροπή της εικόνας σας</string>
<string name="error_saving_avatar">Αδύνατη η αποθήκευση της εικόνας προφίλ στο δίσκο</string>
<string name="or_long_press_for_default">(Ή πατήστε παρατεταμένα για να επιστρέψετε στο αρχικό)</string>
<string name="error_publish_avatar_no_server_support">Ο διακομιστής σας δεν υποστηρίζει την δημοσίευση εικονών προφίλ</string>
<string name="private_message">ψιθύρισε</string>
<string name="private_message_to">στο %s</string>
<string name="send_private_message_to">Αποστολή ιδιωτικού μηνύματος στην επαφή %s</string>
<string name="connect">Σύνδεση</string>
<string name="account_already_exists">Αυτός ο λογαριασμός υπάρχει ήδη</string>
<string name="next">Επόμενος</string>
<string name="server_info_session_established">Σύσταση συνεδρίας</string>
<string name="skip">Παράλειψη</string>
<string name="disable_notifications">Απενεργοποίηση ειδοποιήσεων</string>
<string name="enable">Ενεργοποίηση</string>
<string name="conference_requires_password">Η ομαδική συζήτηση απαιτεί κωδικό</string>
<string name="conference_requires_password">Η ομαδική συζήτηση απαιτεί συνθηματικό</string>
<string name="enter_password">Εισαγωγή συνθηματικού</string>
<string name="request_presence_updates">Παρακαλώ αιτηθείτε ενημερώσεις παρουσίας από την επαφή σας πρώτα.\n\n<small>Αυτό θα χρησιμοποιηθεί για να ταυτοποιηθεί το πρόγραμμα-πελάτης που χρησιμοποιεί η επαφή σας.</small>.</string>
<string name="request_now">Αίτηση τώρα</string>
<string name="ignore">Αγνόηση</string>
<string name="without_mutual_presence_updates"><b>Προειδοποίηση:</b> Η αποστολή αυτού χωρίς αμφίδρομες ενημερώσεις παρουσίας μπορεί να προκαλέσει απροσδόκητα προβλήματα.\n\n<small>Πηγαίνετε στις \"Λεπτομέρειες επαφής\" για να επαληθεύσετε τις συνδρομές παρουσίας σας.</small></string>
<string name="pref_security_settings">Ασφάλεια</string>
<string name="pref_allow_message_correction">Να επιτρέπεται η διόρθωση μηνυμάτων</string>
<string name="pref_allow_message_correction_summary">Να επιτρέπεται οι επαφές σας να διορθώνουν τα μηνύματά τους αναδρομικά</string>
@ -246,13 +285,16 @@
<string name="pref_quiet_hours_summary">Οι ειδοποιήσεις θα σιγαστούν κατά τις ώρες ησυχίας</string>
<string name="pref_expert_options_other">Άλλο</string>
<string name="pref_autojoin">Συγχρονισμός με σελιδοδείκτες</string>
<string name="conference_banned">Είστε αποκλεισμένοι από αυτή την ομαδική συνδιάσκεψη</string>
<string name="pref_autojoin_summary">Συμμετοχή σε ομαδικές συζητήσεις αυτόματα αν ο σελιδοδείκτης αναφέρει αυτόματη συμμετοχή</string>
<string name="toast_message_omemo_fingerprint">Το αποτύπωμα OMEMO αντιγράφηκε στο πρόχειρο</string>
<string name="conference_banned">Είστε αποκλεισμένοι από αυτή την ομαδική συζήτηση</string>
<string name="conference_members_only">Αυτή η ομαδική συζήτηση είναι μόνο για μέλη</string>
<string name="conference_resource_constraint">Περιορισμός πόρων</string>
<string name="conference_kicked">Έχετε διωχθει από αυτή την ομαδική συζήτηση</string>
<string name="conference_kicked">Έχετε διωχθεί από αυτή την ομαδική συζήτηση</string>
<string name="conference_shutdown">Η ομαδική συζήτηση έχει τερματιστεί</string>
<string name="conference_unknown_error">Δεν είστε πλέον μέλος αυτής της ομαδικής συζήτησης</string>
<string name="using_account">χρήση λογαριασμού %s</string>
<string name="hosted_on">φιλοξενείται στο %s</string>
<string name="checking_x">Έλεγχος %s στον διακομιστή HTTP</string>
<string name="not_connected_try_again">Δεν είστε συνδεμένοι. Δοκιμάστε ξανά αργότερα</string>
<string name="check_x_filesize">Ελέγξτε το μέγεθος του %s</string>
@ -264,23 +306,24 @@
<string name="send_again">Αποστολή ξανά</string>
<string name="file_url">Διεύθυνση URL αρχείου</string>
<string name="url_copied_to_clipboard">Η διεύθυνση URL αντιγράφηκε στο πρόχειρο</string>
<string name="jabber_id_copied_to_clipboard">Αντιγραφή διεύθυνσης XMPP στο πρόχειρο</string>
<string name="jabber_id_copied_to_clipboard">Η διεύθυνση XMPP αντιγράφηκε στο πρόχειρο</string>
<string name="error_message_copied_to_clipboard">Το μήνυμα λάθους αντιγράφηκε στο πρόχειρο</string>
<string name="web_address">διεύθυνση ιστού</string>
<string name="scan_qr_code">Σάρωση 2D γραμμοκώδικα</string>
<string name="show_qr_code">Εμφάνιση 2D γραμμοκώδικα</string>
<string name="show_block_list">Εμφάνιση λίστας αποκλεισμένων</string>
<string name="show_block_list">Εμφάνιση λίστας αποκλεισμού</string>
<string name="account_details">Λεπτομέρειες λογαριασμού</string>
<string name="confirm">Επιβεβαίωση</string>
<string name="try_again">Επανάληψη</string>
<string name="pref_keep_foreground_service">Υπηρεσία στο προσκήνιο</string>
<string name="pref_keep_foreground_service_summary">Αποτρέπει τον τερματισμό της σύνδεσης από το λειτουργικό σύστημα</string>
<string name="pref_create_backup">Δημιουργία αντιγράφου ασφαλείας</string>
<string name="pref_create_backup_summary">Τα αντίγραφα ασφαλείας θα αποθηκεύονται στο %s</string>
<string name="notification_create_backup_title">Δημιουργία αντιγράφων ασφαλείας</string>
<string name="notification_backup_created_title">Το αντίγραφο ασφαλείας σας έχει δημιουργηθεί</string>
<string name="notification_backup_created_subtitle">Τα αντίγραφα ασφαλείας έχουν αποθηκευτεί στο %s</string>
<string name="notification_backup_created_subtitle">Τα αρχεία του αντιγράφου ασφαλείας έχουν αποθηκευτεί στο %s</string>
<string name="restoring_backup">Επαναφορά αντιγράφου ασφαλείας</string>
<string name="notification_restored_backup_title">Έχει γίνει επαναφορά του αντιγράφου ασφαλείας</string>
<string name="notification_restored_backup_title">Έχει γίνει επαναφορά του αντιγράφου ασφαλείας σας</string>
<string name="notification_restored_backup_subtitle">Μην παραλείψετε να ενεργοποιήσετε τον λογαριασμό.</string>
<string name="choose_file">Επιλογή αρχείου</string>
<string name="receiving_x_file">Λήψη %1$s (ολοκληρώθηκε %2$d%%)</string>
@ -289,26 +332,37 @@
<string name="file">αρχείο</string>
<string name="open_x_file">Άνοιγμα του %s</string>
<string name="sending_file">αποστολή (ολοκλήρωση %1$d%%)</string>
<string name="x_file_offered_for_download">το %s προσφέρθηκε για μεταφόρτωση</string>
<string name="preparing_file">Προετοιμασία του αρχείου για διαμοιρασμό</string>
<string name="x_file_offered_for_download">%s προσφέρθηκε για μεταφόρτωση</string>
<string name="cancel_transmission">Ακύρωση μετάδοσης</string>
<string name="file_transmission_failed">ο διαμοιρασμός του αρχείου απέτυχε</string>
<string name="file_transmission_cancelled">η μεταφορά αρχείου ακυρώθηκε</string>
<string name="file_deleted">Το αρχείο διαγράφηκε</string>
<string name="no_application_found_to_open_file">Δεν βρέθηκε εφαρμογή για να ανοίξει το αρχείο</string>
<string name="no_application_found_to_open_link">Δεν βρέθηκε εφαρμογή για να ανοίξει τον σύνδεσμο</string>
<string name="no_application_found_to_view_contact">Δεν βρέθηκε εφαρμογή για προβολή της επαφής</string>
<string name="pref_show_dynamic_tags">Δυναμικές ετικέτες</string>
<string name="pref_show_dynamic_tags_summary">Εμφάνιση ετικετών μόνο για ανάγνωση κάτω από τις επαφές</string>
<string name="enable_notifications">Ενεργοποίηση ειδοποιήσεων</string>
<string name="no_conference_server_found">Δεν βρέθηκε διακομιστής ομαδικής συζήτησης</string>
<string name="conference_creation_failed">Η δημιουργία ομαδικής συζήτησης απέτυχε</string>
<string name="account_image_description">Εικόνα προφίλ λογαριασμού</string>
<string name="copy_omemo_clipboard_description">Αντιγραφή του αποτυπώματος OMEMO στο πρόχειρο</string>
<string name="regenerate_omemo_key">Αναδημιουργία κλειδιού OMEMO</string>
<string name="clear_other_devices">Καθαρισμός συσκευών</string>
<string name="clear_other_devices_desc">Είστε βέβαιοι ότι θέλετε να αφαιρέσετε όλες τις άλλες συσκευές από την αναγγελία OMEMO; Την επόμενη φορά που θα συνδεθούν οι συσκευές σας θα αναγγείλουν την παρουσία τους ξανά, αλλά είναι πιθανό να μην λάβουν τυχόν μηνύματα που θα αποσταλούν στο ενδιάμεσο.</string>
<string name="error_no_keys_to_trust_server_error">Δεν υπάρχουν διαθέσιμα χρήσιμα κλειδιά για αυτή την επαφή.\nΗ μεταφόρτωση νέων κλειδιών από τον διακομιστή ήταν ανεπιτυχής. Ίσως υπάρχει κάποιο πρόβλημα με τον διακομιστή της επαφής σας;</string>
<string name="error_no_keys_to_trust_presence">Δεν υπάρχουν διαθέσιμα χρήσιμα κλειδιά για αυτή την επαφή.\nΒεβαιωθείτε ότι έχετε συνδρομή αμοιβαίας παρουσίας.</string>
<string name="error_trustkeys_title">Κάτι πήγε στραβά</string>
<string name="fetching_history_from_server">Ανάκτηση ιστορικού από τον διακομιστή</string>
<string name="no_more_history_on_server">Δεν υπάρχει άλλο ιστορικό στον διακομιστή</string>
<string name="updating">Ενημέρωση...</string>
<string name="password_changed">Επιτυχής αλλαγή συνθηματικου!</string>
<string name="password_changed">Επιτυχής αλλαγή συνθηματικού!</string>
<string name="could_not_change_password">Δεν ήταν δυνατή η αλλαγή του συνθηματικού</string>
<string name="change_password">Αλλαγή συνθηματικού</string>
<string name="current_password">Τρέχον συνθηματικό</string>
<string name="new_password">Νέο συνθηματικό</string>
<string name="password_should_not_be_empty">Το συνθηματικό δεν μπορεί να είναι κενό</string>
<string name="enable_all_accounts">Ενεργοποίηση όλων των λογαριασμών</string>
<string name="disable_all_accounts">Απενεργοποίηση όλων των λογαριασμών</string>
<string name="perform_action_with">Εκτέλεση ενέργειας με</string>
@ -322,12 +376,13 @@
<string name="grant_admin_privileges">Απόδοση δικαιωμάτων διαχειριστή</string>
<string name="remove_admin_privileges">Ανάκληση δικαιωμάτων διαχειριστή</string>
<string name="grant_owner_privileges">Απόδοση δικαιωμάτων ιδιοκτήτη</string>
<string name="remove_owner_privileges">Ανάκληση δικαιωμάτων ιδιοκτήτη</string>
<string name="remove_owner_privileges">Ανάκληση δικαιωμάτων κατόχου</string>
<string name="remove_from_room">Αφαίρεση από την ομάδική συζήτηση</string>
<string name="remove_from_channel">Αφαίρεση από το κανάλι</string>
<string name="could_not_change_affiliation">Δεν ήταν δυνατή η αλλαγή του δεσμού της επαφής %s</string>
<string name="ban_from_conference">Αποκλεισμός από την ομαδική συζήτηση</string>
<string name="ban_from_channel">Απαγόρευση από το κανάλι</string>
<string name="ban_from_channel">Αποκλεισμός από το κανάλι</string>
<string name="removing_from_public_conference">Προσπαθείτε να αφαιρέσετε τον χρήστη %s από ένα δημόσιο κανάλι. Ο μόνος τρόπος να γίνει αυτό είναι να αποκλείσετε τον χρήστη για πάντα.</string>
<string name="ban_now">Αποκλεισμός τώρα</string>
<string name="could_not_change_role">Δεν ήταν δυνατή η αλλαγή ρόλου της επαφής %s</string>
<string name="conference_options">Ρύθμιση συζήτησης ιδιωτικής ομάδας</string>
@ -345,6 +400,7 @@
<string name="mark_as_read">Σημείωμα ως αναγνωσμένο</string>
<string name="pref_input_options">Είσοδος</string>
<string name="pref_enter_is_send">Αποστολή με το πλήκτρο Enter</string>
<string name="pref_enter_is_send_summary">Χρήση του πλήκτρου Enter για την αποστολή μηνύματος. Μπορείτε πάντα να χρησιμοποιείτε τον συνδυασμό Ctrl+Enter για να στείλετε μήνυμα, ακόμα και αν αυτή η επιλογή είναι απενεργοποιημένη.</string>
<string name="pref_display_enter_key">Εμφάνιση του πλήκτρου Enter</string>
<string name="pref_display_enter_key_summary">Αλλαγή του πλήκτρου emoticons σε πλήκτρο Enter</string>
<string name="audio">ήχος</string>
@ -358,13 +414,14 @@
<string name="offering_x_file">Προσφορά του %s</string>
<string name="hide_offline">Απόκρυψη των εκτός σύνδεσης</string>
<string name="contact_is_typing">Η επαφή %s πληκτρολογεί...</string>
<string name="contact_has_stopped_typing">Ο χρήστης %s σταμάτησε να γράφει</string>
<string name="contact_has_stopped_typing">Η επαφή %s σταμάτησε να πληκτρολογεί</string>
<string name="contacts_are_typing">Οι επαφές %s πληκτρολογούν...</string>
<string name="contacts_have_stopped_typing">Η επαφή %s σταμάτησε να πληκτρολογεί</string>
<string name="contacts_have_stopped_typing">Η επαφές %s σταμάτησαν να πληκτρολογούν</string>
<string name="pref_chat_states">Ειδοποιήσεις πληκτρολόγησης</string>
<string name="pref_chat_states_summary">Επιτρέψτε στις επαφές σας να γνωρίζουν πότε γράφετε μηνύματα προς αυτές</string>
<string name="send_location">Αποστολή τοποθεσίας</string>
<string name="show_location">Εμφάνιση τοποθεσίας</string>
<string name="no_application_found_to_display_location">Δεν βρέθηκε εφαρμογή για την απεικόνιση τοποθεσίας</string>
<string name="location">Τοποθεσία</string>
<string name="title_undo_swipe_out_conversation">Η συζήτηση έκλεισε</string>
<string name="title_undo_swipe_out_group_chat">Αποχώρησε από την συζήτηση ιδιωτικής ομάδας</string>
@ -372,15 +429,16 @@
<string name="pref_dont_trust_system_cas_title">Μη έμπιστες αρχές πιστοποίησης συστήματος</string>
<string name="pref_dont_trust_system_cas_summary">Όλα τα πιστοποιητικά πρέπει να εγκριθούν χειροκίνητα</string>
<string name="pref_remove_trusted_certificates_title">Αφαίρεση πιστοποιητικών</string>
<string name="pref_remove_trusted_certificates_summary">Διαγραφή με μη αυτόματο τρόπο των αναγνωρισμένων πιστοποιητικών</string>
<string name="toast_no_trusted_certs">Δεν υπάρχουν με μη αυτόματο τρόπο αναγνωρισμένα πιστοποιητικα</string>
<string name="pref_remove_trusted_certificates_summary">Διαγραφή των χειροκίνητα επιβεβαιωμένων πιστοποιητικών</string>
<string name="toast_no_trusted_certs">Δεν υπάρχουν χειροκίνητα επιβεβαιωμένα πιστοποιητικα</string>
<string name="dialog_manage_certs_title">Αφαίρεση πιστοποιητικών</string>
<string name="dialog_manage_certs_positivebutton">Διαγραφή επιλογής</string>
<string name="dialog_manage_certs_negativebutton">Ακύρωση</string>
<plurals name="toast_delete_certificates">
<item quantity="one">%d πιστοποιητικο διαγραφθηκε</item>
<item quantity="other">%d πιστοποιητικά διαγραφθηκαν</item>
<item quantity="one">%d πιστοποιητικό διαγράφηκε</item>
<item quantity="other">%d πιστοποιητικά διαγράφηκαν</item>
</plurals>
<string name="pref_quick_action_summary">Αντικατάσταση του κουμπιού \"Αποστολή\" με γρήγορη ενέργεια</string>
<string name="pref_quick_action">Γρήγορη Ενέργεια</string>
<string name="none">Κανένα</string>
<string name="recently_used">Πιο πρόσφατα χρησιμοποιημένη</string>
@ -388,26 +446,37 @@
<string name="search_contacts">Αναζήτηση επαφών</string>
<string name="search_bookmarks">Αναζήτηση σελιδοδεικτών</string>
<string name="send_private_message">Αποστολή ιδιωτικού μηνύματος</string>
<string name="user_has_left_conference">Η επαφή %1$s αποχώρησε από την ομαδική συζήτηση</string>
<string name="username">Όνομα χρήστη</string>
<string name="username_hint">Όνομα χρήστη</string>
<string name="invalid_username">Αυτό δεν είναι έγκυρο όνομα χρήστη</string>
<string name="download_failed_server_not_found">Η μεταφόρτωση απέτυχε: Δεν βρέθηκε διακομιστής</string>
<string name="download_failed_server_not_found">Η μεταφόρτωση απέτυχε: Δεν βρέθηκε ο διακομιστής</string>
<string name="download_failed_file_not_found">Η μεταφόρτωση απέτυχε: Δεν βρέθηκε το αρχείο</string>
<string name="download_failed_could_not_connect">Η μεταφόρτωση απέτυχε: Η σύνδεση ήταν αδύνατη</string>
<string name="download_failed_could_not_connect">Η μεταφόρτωση απέτυχε: Δεν ήταν δυνατή η σύνδεση</string>
<string name="download_failed_could_not_write_file">Η μεταφόρτωση απέτυχε: Αποτυχία εγγραφής αρχείου</string>
<string name="account_status_tor_unavailable">Το δίκτυο Tor δεν είναι διαθέσιμο</string>
<string name="account_status_bind_failure">Αποτυχία διασύνδεσης</string>
<string name="account_status_host_unknown">Ο διακομιστής δεν είναι υπεύθυνος για αυτόν τον τομέα</string>
<string name="server_info_broken">Χαλασμένος</string>
<string name="pref_presence_settings">Διαθεσιμότητα</string>
<string name="pref_away_when_screen_off">Εκτός χρήσης όταν η οθόνη είναι σβηστή</string>
<string name="pref_away_when_screen_off_summary">Εμφάνιση παρουσίας ως εκτός χρήσης όταν σβήνει η οθόνη</string>
<string name="pref_dnd_on_silent_mode">Απασχολημένος/η όταν βρίσκεται σε σιωπηρή λειτουργία</string>
<string name="pref_dnd_on_silent_mode_summary">Σημειώνει την παρουσία σας ως Απασχολημένος/η όταν η συσκευή είναι σε κατάσταση σιωπής</string>
<string name="pref_treat_vibrate_as_silent">Χρήση της κατάστασης δόνησης ως σιωπηρή κατάσταση</string>
<string name="pref_show_connection_options">Περισσότερες ρυθμίσεις σύνδεσης</string>
<string name="pref_show_connection_options_summary">Εμφάνιση ονόματος μηχανήματος και ρυθμίσεων πόρτας όταν δημιουργείται ένας νέος λογαριασμός</string>
<string name="pref_treat_vibrate_as_dnd_summary">Σημειώνει την παρουσία σας ως Απασχολημένος/η όταν η συσκευή είναι σε κατάσταση δόνησης</string>
<string name="pref_show_connection_options">Αναλυτικότερες ρυθμίσεις σύνδεσης</string>
<string name="pref_show_connection_options_summary">Εμφάνιση ονόματος μηχανήματος και ρυθμίσεων θύρας όταν ρυθμίζεται νέος λογαριασμός</string>
<string name="hostname_example">xmpp.example.com</string>
<string name="action_add_account_with_certificate">Σύνδεση με πιστοποιητικό</string>
<string name="unable_to_parse_certificate">Αδυναμία ανάγνωσης πιστοποιητικού</string>
<string name="mam_prefs">Επιλογές αρχειοθέτησης</string>
<string name="server_side_mam_prefs">Επιλογές αρχειοθέτησης στον διακομιστή</string>
<string name="fetching_mam_prefs">Μεταφόρτωση επιλογών αρχειοθέτησης. Παρακαλώ περιμένετε...</string>
<string name="unable_to_fetch_mam_prefs">Αδυναμία μεταφόρτωσης ρυθμίσεων αρχειοθέτησης</string>
<string name="captcha_required">Απαραίτηση η χρήση CAPTCHA</string>
<string name="captcha_hint">Εισάγετε το κείμενο από την παραπάνω εικόνα</string>
<string name="certificate_chain_is_not_trusted">Η αλυσίδα του πιστοποιητικού δεν είναι έμπιστη</string>
<string name="jid_does_not_match_certificate">Η διεύθυνση XMPP δεν ταιριάζει με το πιστοποιητικό</string>
<string name="action_renew_certificate">Ανανέωση πιστοποιητικού</string>
<string name="error_fetching_omemo_key">Σφάλμα μεταφόρτωσης κλειδιού OMEMO!</string>
@ -417,34 +486,50 @@
<string name="pref_use_tor">Σύνδεση μέσω Tor</string>
<string name="pref_use_tor_summary">Δρομολόγηση όλων των συνδέσεων μέσω του δικτύου Tor. Απαιτεί τη χρήση Orbot</string>
<string name="account_settings_hostname">Όνομα μηχανήματος</string>
<string name="account_settings_port">Πόρτα</string>
<string name="not_a_valid_port">Ο αριθμός πόρτας δεν είναι έγκυρος</string>
<string name="not_valid_hostname">Αυτό δεν είναι έγκυρο όνομα μηχανήματος</string>
<string name="account_settings_port">Θύρα</string>
<string name="hostname_or_onion">Διεύθυνση διακομιστή ή .onion</string>
<string name="not_a_valid_port">Ο αριθμός θύρας δεν είναι έγκυρος</string>
<string name="not_valid_hostname">Μη έγκυρο όνομα μηχανήματος</string>
<string name="connected_accounts">Συνδέθηκαν %1$d από %2$d λογαριασμοί</string>
<plurals name="x_messages">
<item quantity="one">%d μήνυμα</item>
<item quantity="other">%d μηνύματα</item>
</plurals>
<string name="load_more_messages">Φόρτωση περισσότερων μηνυμάτων</string>
<string name="shared_file_with_x">Το αρχείο διαμοιράστηκε με την επαφή %s</string>
<string name="shared_image_with_x">Η εικόνα διαμοιράστηκε με την επαφή %s</string>
<string name="shared_images_with_x">Η εικόνες διαμοιράστηκαν με την επαφή %s</string>
<string name="shared_text_with_x">Το κείμενο διαμοιράστηκε με την επαφή %s</string>
<string name="no_storage_permission">Απόδοση δικαιώματος πρόσβασης του Conversations στον εξωτερικό αποθηκευτικό χώρο</string>
<string name="no_camera_permission">Απόδοση δικαιώματος πρόσβασης στην φωτογραφική μηχανή για το Conversations</string>
<string name="sync_with_contacts">Συγχρονισμός με επαφές</string>
<string name="sync_with_contacts_long">Το Conversations χρειάζεται δικαίωμα πρόσβασης στις επαφές σας για να ταιριάξει τη λίστα επαφών σας στον διακομιστή με το τοπικό βιβλίο διευθύνσεών σας για να σας δείξει τα πλήρη ονόματα και εικόνες προφίλ των επαφών σας.\n\nΘα διαβάσει τις επαφές σας και θα τις ταιριάξει τοπικά χωρίς να τις μεταφορτώσει στον διακομιστή σας.</string>
<string name="sync_with_contacts_quicksy"><![CDATA[Το Quicksy χρειάζεται να έχει πρόσβαση στους τηλεφωνικούς αριθμούς των επαφών σας για να προτείνει πιθανές επαφές που χρησιμοποιούν ήδη το Quicksy.<br><br>Δεν θα αποθηκευτεί αντίγραφο αυτών των τηλεφωνικών αριθμών.\n\nΓια περισσότερες πληροφορίες διαβάστε την <a href="https://quicksy.im/#privacy">πολιτική απορρήτου</a> μας.<br><br>Θα σας ζητηθεί τώρα να δώσετε το δικαίωμα για πρόσβαση στις επαφές σας.]]></string>
<string name="notify_on_all_messages">Ειδοποίηση για όλα τα μηνύματα</string>
<string name="notify_only_when_highlighted">Ειδοποίηση μόνο όταν κάποιος αναφέρεται σε εμένα</string>
<string name="notify_never">Απενεργοποίηση ειδοποιήσεων</string>
<string name="notify_only_when_highlighted">Ειδοποίηση μόνο όταν αναφέρεται το όνομά μου</string>
<string name="notify_never">Οι ειδοποιήσεις απενεργοποιήθηκαν</string>
<string name="notify_paused">Παύση ειδοποιήσεων</string>
<string name="pref_picture_compression">Συμπίεση εικόνας</string>
<string name="pref_picture_compression_summary">Συμβουλή: Χρησιμοποιήστε \"Επιλογή αρχείου\" αντι για \"Επιλογή εικόνας\" για να στείλετε μεμονωμένες εικόνες χωρίς συμπίεση, άσχετα από αυτή τη ρύθμιση.</string>
<string name="always">Πάντα</string>
<string name="large_images_only">Μεγάλες εικόνες μόνο</string>
<string name="battery_optimizations_enabled">Ενεργοποίηση βελτιστοποίησης χρήσης μπαταρίας</string>
<string name="battery_optimizations_enabled">Η βελτιστοποίηση χρήσης μπαταρίας είναι ενεργοποιημένη</string>
<string name="battery_optimizations_enabled_explained">Η συσκευή σας χρησιμοποιεί έντονη βελτιστοποίηση στην χρήση μπαταρίας του Conversations που μπορεί να οδηγήσει σε αργοπορημένες ειδοποιήσεις ή ακόμα και σε απώλεια μηνυμάτων.\nΠροτείνεται να την απενεργοποιήσετε.</string>
<string name="battery_optimizations_enabled_dialog">Η συσκευή σας χρησιμοποιεί έντονη βελτιστοποίηση στην χρήση μπαταρίας του Conversations που μπορεί να οδηγήσει σε αργοπορημένες ειδοποιήσεις ή ακόμα και σε απώλεια μηνυμάτων.\nΘα σας ζητηθεί να την απενεργοποιήσετε.</string>
<string name="disable">Απενεργοποίηση</string>
<string name="selection_too_large">Η επιλεγμένη επιφάνεια είναι πολύ μεγάλη</string>
<string name="selection_too_large">Η επιλεγμένη περιοχή είναι πολύ μεγάλη</string>
<string name="no_accounts">(δεν υπάρχουν ενεργοί λογαριασμοί)</string>
<string name="this_field_is_required">Αυτό το πεδίο είναι υποχρεωτικό</string>
<string name="correct_message">Διόρθωση μηνύματος</string>
<string name="send_corrected_message">Αποστολή διορθωμένου μηνύματος</string>
<string name="no_keys_just_confirm">Έχετε ήδη πιστοποιήσει με ασφάλεια το αποτύπωμα αυτού του ατόμου για να επιβεβαιώσετε την εμπιστοσύνη σας. Επιλέγοντας \"Τέλος\" απλά επιβεβαιώνετε ότι η επαφή %s είναι μέλος αυτής της ομαδικής συζήτησης.</string>
<string name="this_account_is_disabled">Έχετε απενεργοποιήσει αυτόν τον λογαριασμό</string>
<string name="security_error_invalid_file_access">Σφάλμα ασφάλειας: Μη έγκυρη πρόσβαση σε αρχείο!</string>
<string name="no_application_to_share_uri">Δεν βρέθηκε εφαρμογή για να μοιραστείτε την διεύθυνση URI</string>
<string name="share_uri_with">Διαμοιρασμός της διεύθυνσης URI με...</string>
<string name="welcome_text_quicksy"><![CDATA[Το Quicksy είναι ένα παρακλάδι του δημοφιλούς προγράμματος XMPP Conversations με αυτόματη εύρεση επαφών.<br><br>Εγγράφεστε με τον τηλεφωνικό σας αριθμό και το Quicksy αυτόματα — με βάση τους τηλεφωνικούς αριθμούς στο βιβλίο διευθύνσεών σας — προτείνει πιθανές επαφές για εσάς.<br><br>Με την εγγραφή σας συμφωνείτε με την <a href="https://quicksy.im/#privacy">πολιτική απορρήτου</a> μας.]]></string>
<string name="agree_and_continue">Συμφωνώ και προχωρήστε</string>
<string name="magic_create_text">Θα καθοδηγηθείτε στη διαδικασία δημιουργίας ενός λογαριασμού στο conversations.im.¹\nΕπιλέγοντας το conversations.im ως πάροχο θα μπορείτε να επικοινωνείτε με χρήστες άλλων παρόχων δίνοντάς τους την πλήρη διεύθυνση XMPP σας.</string>
<string name="your_full_jid_will_be">Η πλήρης ταυτότητα XMPP σας θα είναι: %s</string>
<string name="create_account">Δημιουργία λογαριασμού</string>
<string name="use_own_provider">Χρήση του δικού μου παρόχου</string>
@ -453,8 +538,8 @@
<string name="pref_manually_change_presence_summary">Ορίστε την διαθεσιμότητά σας όταν διορθώνετε το μήνυμα κατάστασής σας.</string>
<string name="status_message">Μήνυμα κατάστασης</string>
<string name="presence_chat">Ελεύθερος για συνομιλία</string>
<string name="presence_online">Συνδεμένος</string>
<string name="presence_away">Λείπω</string>
<string name="presence_online">Σε σύνδεση</string>
<string name="presence_away">Εκτός χρήσης</string>
<string name="presence_xa">Μη διαθέσιμος</string>
<string name="presence_dnd">Απασχολημένος</string>
<string name="secure_password_generated">Ένα ασφαλές συνθηματικό έχει δημιουργηθεί</string>
@ -468,12 +553,17 @@
<string name="gp_short">Μικρός</string>
<string name="gp_medium">Μεσαίος</string>
<string name="gp_long">Μεγάλος</string>
<string name="pref_broadcast_last_activity">Δημοσιοποίηση της τελευταίας χρήσης</string>
<string name="pref_broadcast_last_activity_summary">Επιτρέψτε στις επαφές σας να γνωρίζουν πότε χρησιμοποιείτε το Conversations</string>
<string name="pref_privacy">Ιδιωτικότητα</string>
<string name="pref_theme_options">Θέμα</string>
<string name="pref_theme_options_summary">Επιλογή παλέτας χρωμάτων</string>
<string name="pref_theme_automatic">Αυτόματο</string>
<string name="pref_theme_light">Ανοιχτόχρωμο</string>
<string name="pref_theme_dark">Σκουρόχρωμο</string>
<string name="pref_use_green_background">Πράσινο φόντο</string>
<string name="pref_use_green_background_summary">Χρήση πράσινου φόντου για εισερχόμενα μηνύματα</string>
<string name="unable_to_connect_to_keychain">Αδυναμία σύνδεσης στο OpenKeychain</string>
<string name="this_device_is_no_longer_in_use">Αυτή η συσκευή δεν χρησιμοποιείται πλέον</string>
<string name="type_pc">Υπολογιστής</string>
<string name="type_phone">Κινητό τηλέφωνο</string>
@ -481,30 +571,41 @@
<string name="type_web">Περιηγητής ιστού</string>
<string name="type_console">Κονσόλα</string>
<string name="payment_required">Απαιτείται πληρωμή</string>
<string name="missing_internet_permission">Απόδοση δικαιώματος χρήσης Internet</string>
<string name="me">Εγώ</string>
<string name="contact_asks_for_presence_subscription">Η επαφή ζητά συνδρομή σε υπηρεσία παρουσίας</string>
<string name="allow">Επιτρέπω</string>
<string name="no_permission_to_access_x">Δεν υπάρχει δικαίωμα για πρόσβαση στο %s</string>
<string name="remote_server_not_found">Δεν βρέθηκε ο απομακρυσμένος διακομιστής</string>
<string name="remote_server_timeout">Λήξη χρόνου για τον απομακρυσμένο διακομιστή</string>
<string name="unable_to_update_account">Αδυναμία ενημέρωσης λογαριασμού</string>
<string name="report_jid_as_spammer">Αναφέρετε για αυτή την ταυτότητα XMPP ότι στέλνει ανεπιθύμητα μηνύματα.</string>
<string name="pref_delete_omemo_identities">Διαγραφή ταυτοτήτων OMEMO</string>
<string name="pref_delete_omemo_identities_summary">Αναδημιουργία των κλειδιών OMEMO. Όλες οι επαφές σας θα πρέπει να σας επαληθεύσουν πάλι. Χρησιμοποιήστε το μόνο ως τελευταία λύση.</string>
<string name="delete_selected_keys">Διαγραφή επιλεγμένων κλειδιών</string>
<string name="error_publish_avatar_offline">Πρέπει να είστε συνδεμένοι για να δημοσιεύσετε το avatar σας.</string>
<string name="show_error_message">Εμφάνιση μηνύματος λάθους</string>
<string name="error_message">Μήνυμα λάθους</string>
<string name="data_saver_enabled">Ενεργοποίηση μείωσης χρήσης δεδομένων κινητής</string>
<string name="device_does_not_support_data_saver">Η συσκευή σας δεν υποστηρίζει την απενεργοποίηση μείωσης χρήσης δεδομένων κινητής για το Conversations.</string>
<string name="data_saver_enabled">Ενεργοποίηση μείωσης χρήσης δεδομένων</string>
<string name="data_saver_enabled_explained">Το λειτουργικό σας σύστημα περιορίζει το Conversations από το να συνδέεται στο Internet όταν βρίσκεται στο παρασκήνιο. Για να λαμβάνετε ειδοποιήσεις νέων μηνυμάτων πρέπει να επιτρέψετε στο Conversations να έχει απεριόριστη πρόσβαση όταν ενεργοποιείται η μείωση χρήσης δεδομένων.\nΤο Conversations θα προσπαθεί να περιορίσει τη χρήση δεδομένων όταν είναι δυνατό.</string>
<string name="device_does_not_support_data_saver">Η συσκευή σας δεν υποστηρίζει την απενεργοποίηση μείωσης χρήσης δεδομένων για το Conversations.</string>
<string name="error_unable_to_create_temporary_file">Αδυναμία δημιουργίας προσωρινού αρχείου</string>
<string name="this_device_has_been_verified">Αυτή η συσκευή έχει επαληθευτεί</string>
<string name="copy_fingerprint">Αντιγραφή αποτυπώματος</string>
<string name="all_omemo_keys_have_been_verified">Έχετε επαληθεύσει όλα τα κλειδιά OMEMO που κατέχετε</string>
<string name="barcode_does_not_contain_fingerprints_for_this_conversation">Ο γραμμοκώδικας δεν περιέχει αποτυπώματα για την συζήτηση αυτή.</string>
<string name="verified_fingerprints">Επαληθευμένα αποτυπώματα</string>
<string name="use_camera_icon_to_scan_barcode">Χρήση της φωτογραφικής μηχανής για την σάρωση του γραμμοκώδικα κάποιας επαφής</string>
<string name="use_camera_icon_to_scan_barcode">Χρήση της φωτογραφικής μηχανής για την σάρωση του γραμμοκώδικα της επαφής</string>
<string name="please_wait_for_keys_to_be_fetched">Παρακαλώ περιμένετε την μεταφόρτωση των κλειδιών</string>
<string name="share_as_barcode">Διαμοιρασμός ως γραμμοκώδικα</string>
<string name="share_as_uri">Διαμοιρασμός ως διεύθυνση URI XMPP</string>
<string name="share_as_http">Διαμοιρασμός ως σύνδεσμος HTTP</string>
<string name="pref_blind_trust_before_verification">Τυφλή εμπιστοσύνη πριν την επαλήθευση</string>
<string name="pref_blind_trust_before_verification_summary">Αυτόματη εμπιστοσύνη σε όλες τις νέες συσκευές επαφών που δεν έχουν επαληθευτεί παλιότερα, και παροχή χειροκίνητης επιβεβαίωσης κάθε φορά που μια επαληθευμένη επαφή προσθέτει μια νέα συσκευή.</string>
<string name="blindly_trusted_omemo_keys">Κλειδιά OMEMO με τυφλή εμπιστοσύνη, που σημαίνει ότι μπορεί να είναι κάποιος άλλος ή κάποιος τρίτος μπορεί να έχει αποκτήσει πρόσβαση. </string>
<string name="not_trusted">Μη έμπιστος</string>
<string name="invalid_barcode">Άκυρος 2D γραμμοκώδικας</string>
<string name="invalid_barcode">Άκυρος γραμμοκώδικας 2D</string>
<string name="pref_clean_cache_summary">Καθαρισμός κρυφού φακέλου (χρησιμοποείται από την εφαρμογή φωτογραφικής μηχανής)</string>
<string name="pref_clean_cache">Καθαρισμός κρυφής μνήμης</string>
<string name="pref_clean_private_storage">Καθαρισμός ιδιωτικής αποθήκευσης</string>
<string name="pref_clean_private_storage_summary">Καθαρισμός ιδιωτικού χώρου όπου αποθηκεύονται αρχεία (Μπορούν να μεταφορτωθούν ξανά από τον διακομιστή)</string>
@ -514,6 +615,7 @@
<string name="show_inactive_devices">Εμφάνιση ανενεργών</string>
<string name="hide_inactive_devices">Απόκρυψη ανενεργών</string>
<string name="distrust_omemo_key">Αναίρεση εμπιστοσύνης συσκευής</string>
<string name="distrust_omemo_key_text">Είστε βέβαιοι ότι θέλετε να αφαιρέσετε την επαλήθευση για αυτή τη συσκευή;\nΑυτή η συσκευή και μηνύματα που έρχονται από αυτή τη συσκευή θα σημειωθούν ως μη έμπιστα.</string>
<plurals name="seconds">
<item quantity="one">%d δευτερόλεπτο</item>
<item quantity="other">%d δευτερόλεπτα</item>
@ -539,23 +641,26 @@
<item quantity="other">%d μήνες</item>
</plurals>
<string name="pref_automatically_delete_messages">Αυτόματη διαγραφή μηνυμάτων</string>
<string name="pref_automatically_delete_messages_description">Αυτόματη διαγραφή μηνυμάτων από αυτή την συσκευή που είναι παλιότερα από την ρυθμισμένη χρονική περίοδο</string>
<string name="pref_automatically_delete_messages_description">Αυτόματη διαγραφή μηνυμάτων από αυτή την συσκευή που είναι παλιότερα από την ρυθμισμένη χρονική περίοδο.</string>
<string name="encrypting_message">Κρυπτογράφηση μηνύματος</string>
<string name="not_fetching_history_retention_period">Χωρίς μεταφόρτωση μηνυμάτων λόγω τοπικού χρόνου διατήρησης.</string>
<string name="transcoding_video">Συμπίεση βίντεο</string>
<string name="corresponding_conversations_closed">Οι αντίστοιχες συζητήσεις έκλεισαν.</string>
<string name="contact_blocked_past_tense">Η επαφή αποκλείστηκε.</string>
<string name="pref_notifications_from_strangers">Ειδοποιήσεις από άγνωστους</string>
<string name="pref_notifications_from_strangers_summary">Ειδοποίηση για μηνύματα και κλήσεις που προέρχονται από άγνωστους.</string>
<string name="received_message_from_stranger">Λήψη μηνύματος από άγνωστο</string>
<string name="block_stranger">Αποκλεισμός αγνώστου</string>
<string name="block_entire_domain">Αποκλεισμός ολόκληρου τομέα</string>
<string name="online_right_now">συνδεμένος αυτή τη στιγμή</string>
<string name="online_right_now">Σε σύνδεση αυτή τη στιγμή</string>
<string name="retry_decryption">Επανάληψη αποκρυπτογράφησης</string>
<string name="session_failure">Σφάλμα συνεδρίας</string>
<string name="sasl_downgrade">Υποβάθμιση του μηχανισμού SASL</string>
<string name="account_status_regis_web">Ο διακομιστής απαιτεί εγγραφή σε ιστοσελίδα</string>
<string name="open_website">Άνοιγμα ιστοσελίδας</string>
<string name="application_found_to_open_website">Δεν βρέθηκε εφαρμογή για να ανοίξει την ιστοσελίδα</string>
<string name="pref_headsup_notifications">Αναδυόμενες ειδοποιήσεις</string>
<string name="pref_headsup_notifications_summary">Εμφάνιση αναδυόμενων ειδοποιήσεων</string>
<string name="today">Σήμερα</string>
<string name="yesterday">Χτες</string>
<string name="pref_validate_hostname">Επαλήθευση ονόματος μηχανήματος με χρήση DNSSEC</string>
@ -570,7 +675,7 @@
<string name="huawei_protected_apps">Προστατευμένες εφαρμογές</string>
<string name="huawei_protected_apps_summary">Για να συνεχίσετε να λαμβάνετε ειδοποιήσεις, ακόμα κι όταν η οθόνη είναι σβηστή, χρειάζεται να προσθέσετε το Conversations στον κατάλογο με τις προστατευμένες εφαρμογές.</string>
<string name="mtm_accept_cert">Αποδοχή άγνωστου πιστοποιητικού;</string>
<string name="mtm_trust_anchor">Το πιστοποιητικό του διακομιστή δεν είναι υπογεγραμμένο από κάποια γνωστή Αρχή Πιστοποίησης</string>
<string name="mtm_trust_anchor">Το πιστοποιητικό του διακομιστή δεν είναι υπογεγραμμένο από κάποια γνωστή Αρχή Πιστοποίησης.</string>
<string name="mtm_accept_servername">Αποδοχή αναντίστοιχου ονόματος διακομιστή;</string>
<string name="mtm_hostname_mismatch">Ο διακομιστής δεν ταυτοποιείται ως \"%s\". Το πιστοποιητικό είναι έγκυρο μόνο για:</string>
<string name="mtm_connect_anyway">Θέλετε να συνδεθείτε έτσι κι αλλιώς;</string>
@ -583,8 +688,10 @@
<string name="edit_status_message">Διόρθωση μηνύματος κατάστασης</string>
<string name="disable_encryption">Απενεργοποίηση κρυπτογράφησης</string>
<string name="error_trustkey_general">Το Conversations δεν είναι δυνατό να στείλει κρυπτογραφημένα μηνύματα στην επαφή %1$s. Αυτό μπορεί να συμβαίνει γιατί η επαφή σας χρησιμοποιεί παλιότερο διακομιστή ή πρόγραμμα που δε μπορεί να χειριστεί κρυπτογράφηση OMEMO.</string>
<string name="error_trustkey_device_list">Αδύναμια μεταφόρτωσης λίστας συσκευών</string>
<string name="error_trustkey_bundle">Αδυναμία ανάσυρσης κλειδιών κρυπτογράφησης</string>
<string name="error_trustkey_hint_mutual">Συμβουλή: Σε κάποιες περιπτώσεις αυτό μπορεί να διορθωθεί αν αμοιβαία προστεθείτε στους καταλόγους επαφών σας.</string>
<string name="disable_encryption_message">Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε την κρυπτογράφηση OMEMO για αυτή τη συζήτηση;\nΑυτή η ενέργεια θα επιτρέψει στον διαχειριστή του διακομιστή να αναγνώσει τα μηνύματά σας, αλλά ίσως είναι ο μόνος τρόπος να επικοινωνήστε με επαφές που χρησιμοποιούν παλιότερα προγράμματα.</string>
<string name="disable_encryption_message">Είστε βέβαιοι ότι θέλετε να απενεργοποιήσετε την κρυπτογράφηση OMEMO για αυτή τη συζήτηση;\nΑυτή η ενέργεια θα επιτρέψει στον διαχειριστή του διακομιστή να αναγνώσει τα μηνύματά σας, αλλά ίσως είναι ο μόνος τρόπος να επικοινωνήσετε με επαφές που χρησιμοποιούν παλιότερα προγράμματα.</string>
<string name="disable_now">Απενεργοποίηση τώρα</string>
<string name="draft">Πρόχειρο:</string>
<string name="pref_omemo_setting">Κρυπτογράφηση OMEMO</string>
@ -594,8 +701,8 @@
<string name="create_shortcut">Δημιουργία συντόμευσης</string>
<string name="pref_font_size">Μέγεθος γραμματοσειράς</string>
<string name="pref_font_size_summary">Το σχετικό μέγεθος γραμματοσειράς που χρησιμοποιείται στην εφαρμογή.</string>
<string name="default_on">Ενεργοποιημένο ερήμην</string>
<string name="default_off">Απενεργοποιημένο ερήμην</string>
<string name="default_on">Ενεργοποιημένο από προεπιλογή</string>
<string name="default_off">Απενεργοποιημένο από προεπιλογή</string>
<string name="small">Μικρό</string>
<string name="medium">Μεσαίο</string>
<string name="large">Μεγάλο</string>
@ -611,7 +718,9 @@
<string name="title_activity_share_location">Διαμοιρασμός τοποθεσίας</string>
<string name="title_activity_show_location">Εμφάνιση τοποθεσίας</string>
<string name="share">Διαμοιρασμός</string>
<string name="unable_to_start_recording">Αδυναμία έναρξης εγγραφής</string>
<string name="please_wait">Παρακαλώ περιμένετε...</string>
<string name="no_microphone_permission">Απόδοση δικαιώματος πρόσβασης στο μικρόφωνο για το Conversations</string>
<string name="search_messages">Αναζήτηση μηνυμάτων</string>
<string name="gif">GIF</string>
<string name="view_conversation">Εμφάνιση συζήτησης</string>
@ -626,20 +735,27 @@
<string name="host_does_not_support_group_chat_avatars">Ο κεντρικός υπολογιστής δεν υποστηρίζει εικόνες προφίλ σε ομαδικές συζητήσεις</string>
<string name="only_the_owner_can_change_group_chat_avatar">Μόνο ο ιδιοκτήτης μπορεί να αλλάξει την εικόνα προφίλ μιας ομαδικής συζήτησης</string>
<string name="contact_name">Όνομα επαφής</string>
<string name="nickname">Παρατσούκλι</string>
<string name="nickname">Ψευδώνυμο</string>
<string name="group_chat_name">Όνομα</string>
<string name="providing_a_name_is_optional">Η παροχή ονόματος είναι προαιρετική</string>
<string name="create_dialog_group_chat_name">Όνομα ομαδικής συζήτησης</string>
<string name="conference_destroyed">Αυτή η ομαδική συζήτηση έχει καταστραφεί</string>
<string name="unable_to_save_recording">Αδυναμία αποθήκευσης εγγραφής</string>
<string name="foreground_service_channel_name">Υπηρεσία στο προσκήνιο</string>
<string name="foreground_service_channel_description">Αυτή η κατηγορία ειδοποιήσεων χρησιμοποιείται για την εμφάνιση μιας μόνιμης ειδοποίησης που δείχνει πως εκτελείται το Conversations.</string>
<string name="notification_group_status_information">Πληροφορίες κατάστασης</string>
<string name="error_channel_name">Προβλήματα συνδεσιμότητας</string>
<string name="error_channel_description">Αυτή η κατηγορία ειδοποιήσεων χρησιμοποιείται για να εμφανίσει μια ειδοποίηση σε περίπτωση που υπάρχει πρόβλημα σύνδεσης σε κάποιον λογαριασμό.</string>
<string name="notification_group_messages">Μηνύματα</string>
<string name="notification_group_calls">Κλήσεις</string>
<string name="messages_channel_name">Μηνύματα</string>
<string name="incoming_calls_channel_name">Εισερχόμενες κλήσεις</string>
<string name="ongoing_calls_channel_name">Κλήσεις σε εξέλιξη</string>
<string name="silent_messages_channel_name">Σιωπηρά μηνύματα</string>
<string name="silent_messages_channel_description">Αυτή η κατηγορία ειδοποιήσεων χρησιμοποιείται για να εμφανίσει ειδοποιήσεις που δεν θα έπρεπε να παράγουν ήχο. Για παράδειγμα όταν κάποιος είναι ενεργός σε άλλη συσκευή (περίοδος χάριτος).</string>
<string name="delivery_failed_channel_name">Αποτυχημένες διανομές</string>
<string name="pref_message_notification_settings">Ρυθμίσεις ειδοποίησης μηνυμάτων</string>
<string name="pref_incoming_call_notification_settings">Ρυθμίσεις ειδοποίησης εισερχόμενων κλήσεων</string>
<string name="pref_more_notification_settings_summary">Σημασία, Ήχος, Δόνηση</string>
<string name="video_compression_channel_name">Συμπίεση βίντεο</string>
<string name="view_media">Εμφάνιση μέσου</string>
@ -681,7 +797,10 @@
<string name="pin_expired">Ο κωδικός που σας έχει σταλεί έχει λήξει.</string>
<string name="unknown_api_error_network">Άγνωστο σφάλμα δικτύου.</string>
<string name="unknown_api_error_response">Άγνωστη απάντηση από τον διακομιστή.</string>
<string name="something_went_wrong_processing_your_request">Κάτι πήγε στραβά κατά την εξυπηρέτηση της αίτησής σας.</string>
<string name="unable_to_connect_to_server">Αδυναμία σύνδεσης στον διακομιστή.</string>
<string name="unable_to_establish_secure_connection">Αδυναμία δημιουργίας ασφαλούς σύνδεσης.</string>
<string name="unable_to_find_server">Αδυναμία εύρεσης του διακομιστή.</string>
<string name="something_went_wrong_processing_your_request">Κάτι δεν πήγε καλά κατά την εξυπηρέτηση της αίτησής σας.</string>
<string name="invalid_user_input">Μη έγκυρη εισαγωγή</string>
<string name="temporarily_unavailable">Προσωρινά μη διαθέσιμο. Προσπαθήστε αργότερα.</string>
<string name="no_network_connection">Χωρίς σύνδεση δικτύου.</string>
@ -694,7 +813,7 @@
<string name="enter_your_name_instructions">Παρακαλώ εισάγετε το όνομά σας για να επιτρέψετε σε χρήστες, που δεν σας έχουν καταγράψει στα βιβλία διευθύνσεών τους, να γνωρίζουν ποιος/α είστε.</string>
<string name="your_name">Το όνομά σας</string>
<string name="enter_your_name">Εισάγετε το όνομά σας</string>
<string name="no_name_set_instructions">Χρησιμποιήστε το κουμπί διόρθωσης για να ορίσετε το όνομά σας.</string>
<string name="no_name_set_instructions">Χρησιμοποιήστε το κουμπί διόρθωσης για να ορίσετε το όνομά σας.</string>
<string name="reject_request">Απόρριψη αίτησης</string>
<string name="install_orbot">Εγκατάσταση Orbot</string>
<string name="start_orbot">Εκκίνηση Orbot</string>
@ -709,6 +828,8 @@
<string name="restore">Επαναφορά</string>
<string name="enter_password_to_restore">Εισάγετε τον κωδικό σας για τον λογαριασμό %s για να επαναφέρετε το αντίγραφο ασφαλείας.</string>
<string name="restore_warning">Μην χρησιμοποιείτε τη λειτουργία επαναφοράς αντιγράφων ασφαλείας για να κλωνοποιήσετε (ταυτόχρονη εκτέλεση) μια εγκατάσταση. Η επαναφορά αντιγράφου ασφαλείας προσφέρεται μόνο για μεταφορές ή σε περίπτωση που έχετε χάσει την αρχική συσκευή.</string>
<string name="unable_to_restore_backup">Αδυναμία επαναφοράς αντιγράφου ασφαλείας.</string>
<string name="unable_to_decrypt_backup">Αδυναμία αποκρυπτογράφησης του αντιγράφου ασφαλείας. Είναι ο κωδικός σωστός;</string>
<string name="backup_channel_name">Δημιουργία &amp; Επαναφορά αντιγράφων ασφαλείας</string>
<string name="enter_jabber_id">Εισάγετε τη διεύθυνση XMPP</string>
<string name="create_group_chat">Δημιουργία ομαδικής συζήτησης</string>
@ -723,24 +844,26 @@
<string name="creating_channel">Δημιουργία δημόσιου καναλιού...</string>
<string name="channel_already_exists">Αυτό το κανάλι υπάρχει ήδη</string>
<string name="joined_an_existing_channel">Έχετε εισέρθει σε ένα προϋπάρχον κανάλι</string>
<string name="unable_to_set_channel_configuration">Αδυναμία ορισμού ρυθμίσεων καναλιού</string>
<string name="allow_participants_to_edit_subject">Αλλαγή θέματος από οποιονδήποτε</string>
<string name="allow_participants_to_invite_others">Πρόσκληση άλλων χρηστών από οποιονδήποτε</string>
<string name="anyone_can_edit_subject">Οποιοσδήποτε μπορεί να αλλάξει το θέμα.</string>
<string name="owners_can_edit_subject">Οι ιδιοκτήτες μπορούν να διορθώσουν το θέμα.</string>
<string name="admins_can_edit_subject">Οι διαχειριστές μπορούν να διορθώσουν το θέμα.</string>
<string name="owners_can_invite_others">Οι ιδιοκτήτες μπορούν να προσκαλούν άλλους χρήστες.</string>
<string name="owners_can_edit_subject">Οι ιδιοκτήτες μπορούν να αλλάξουν το θέμα.</string>
<string name="admins_can_edit_subject">Οι διαχειριστές μπορούν να αλλάξουν το θέμα.</string>
<string name="owners_can_invite_others">Οι κάτοχοι μπορούν να προσκαλούν άλλους χρήστες.</string>
<string name="anyone_can_invite_others">Οποιοσδήποτε μπορεί να προσκαλεί άλλους χρήστες.</string>
<string name="jabber_ids_are_visible_to_admins">Οι διευθύνσεις XMPP είναι ορατές στους διαχειριστές.</string>
<string name="jabber_ids_are_visible_to_anyone">Οι διευθύνσεις XMPP είναι ορατές σε όλους.</string>
<string name="no_users_hint_channel">Αυτό το δημόσιο κανάλι δεν έχει συμμετέχοντες. Προσκαλέστε τις επαφές σας ή χρησιμοποιήστε το κουμπί διαμοιρασμού για να διαδώσετε τη διεύθυνση XMPP του.</string>
<string name="no_users_hint_group_chat">Αυτή η συζήτησης ιδιωτικής ομάδας δεν έχει συμμετέχοντες.</string>
<string name="no_users_hint_group_chat">Αυτή η συζήτηση ιδιωτικής ομάδας δεν έχει συμμετέχοντες.</string>
<string name="manage_permission">Διαχείριση δικαιωμάτων</string>
<string name="search_participants">Αναζήτηση συμμετεχόντων</string>
<string name="file_too_large">Το αρχείο είναι πολύ μεγάλο</string>
<string name="attach">Επισύναψη</string>
<string name="discover_channels">Ανακάλυψη καναλιών</string>
<string name="discover_channels">Εύρεση καναλιών</string>
<string name="search_channels">Αναζήτηση καναλιών</string>
<string name="channel_discovery_opt_in_title">Πιθανή παραβίαση ιδιωτικότητας!</string>
<string name="channel_discover_opt_in_message"><![CDATA[Η εύρεση καναλιού χρησιμοποιεί μια τρίτη υπηρεσία που λέγεται <a href="https://search.jabber.network">search.jabber.network</a>.<br><br>Χρησιμοποιώντας αυτή τη λειτουργία θα μεταβιβαστεί η διεύθυνση IP σας και οι όροι αναζήτησης σε αυτή την υπηρεσία. Δείτε την <a href="https://search.jabber.network/privacy">Πολιτική Ιδιωτικότητας</a> της για περισσότερες πληροφορίες.]]></string>
<string name="i_already_have_an_account">Έχω ήδη λογαριασμό</string>
<string name="add_existing_account">Προσθήκη υπάρχοντος λογαριασμού</string>
<string name="register_new_account">Εγγραφή νέου λογαριασμού</string>
@ -748,21 +871,80 @@
<string name="add_anway">Προσθήκη έτσι κι αλλιώς</string>
<string name="this_looks_like_channel">Αυτό μοιάζει με διεύθυνση καναλιού</string>
<string name="share_backup_files">Διαμοιρασμός αντιγράφων ασφαλείας</string>
<string name="conversations_backup">Αντίγραφο Conversations</string>
<string name="conversations_backup">Αντίγραφο ασφαλείας Conversations</string>
<string name="event">Γεγονός</string>
<string name="open_backup">Άνοιγμα αντιγράφου ασφαλείας</string>
<string name="not_a_backup_file">Το αρχείο που επιλέξατε δεν είναι αντίγραφο ασφαλείας του Conversations</string>
<string name="account_already_setup">Αυτός ο λογαριασμός έχει προστεθεί ήδη</string>
<string name="please_enter_password">Παρακαλώ εισάγετε τον κωδικό για αυτό το λογαριασμό</string>
<string name="unable_to_perform_this_action">Αδυναμία εκτέλεσης αυτής της λειτουργίας</string>
<string name="open_join_dialog">Είσοδος σε δημόσιο κανάλι...</string>
<string name="sharing_application_not_grant_permission">Η εφαρμογή από την οποία έγινε διαμοίραση δεν έδωσε δικαιώματα πρόσβασης στο αρχείο.</string>
<string name="group_chats_and_channels"><![CDATA[Ομαδικές συνομιλίες & Κανάλια]]></string>
<string name="jabber_network">jabber.network</string>
<string name="local_server">Τοπικός διακομιστής</string>
<string name="pref_channel_discovery_summary">Οι περισσότεροι χρήστες πρέπει να επιλέξουν jabber.network για καλύτερες προτάσεις από το σύνολο του οικοσυστήματος XMPP.</string>
<string name="pref_channel_discovery">Μέθοδος ανακάλυψης καναλιού</string>
<string name="pref_channel_discovery">Μέθοδος εύρεσης καναλιού</string>
<string name="backup">Αντίγραφο ασφαλείας</string>
<string name="category_about">Σχετικά με</string>
<string name="please_enable_an_account">Παρακαλώ ενεργοποιήστε έναν λογαριασμό</string>
<string name="make_call">Νέα κλήση</string>
<string name="rtp_state_incoming_call">Εισερχόμενη κλήση</string>
<string name="rtp_state_incoming_video_call">Εισερχόμενη κλήση βίντεο</string>
<string name="rtp_state_connecting">Σύνδεση</string>
<string name="rtp_state_connected">Συνδέθηκε</string>
<string name="rtp_state_accepting_call">Αποδοχή κλήσης</string>
<string name="rtp_state_ending_call">Τερματισμός κλήσης</string>
<string name="answer_call">Απάντηση</string>
<string name="dismiss_call">Παράβλεψη</string>
<string name="rtp_state_finding_device">Εύρεση συσκευών</string>
<string name="rtp_state_ringing">Κουδούνισμα</string>
<string name="rtp_state_declined_or_busy">Απασχολημένος</string>
<string name="rtp_state_connectivity_error">Αδυναμία σύνδεσης κλήσης</string>
<string name="rtp_state_connectivity_lost_error">Απώλεια σύνδεσης</string>
<string name="rtp_state_retracted">Αποσυρμένη κλήση</string>
<string name="rtp_state_application_failure">Αποτυχία εφαρμογής</string>
<string name="hang_up">Τερματισμός κλήσης</string>
<string name="ongoing_call">Κλήση σε εξέλιξη</string>
<string name="ongoing_video_call">Κλήση βίντεο σε εξέλιξη</string>
<string name="disable_tor_to_make_call">Απενεργοποίηστε το Tor για να κάνετε κλήσεις</string>
<string name="incoming_call">Εισερχόμενη κλήση</string>
<string name="incoming_call_duration">Εισερχόμενη κλήση · %s</string>
<string name="outgoing_call">Εξερχόμενη κλήση</string>
<string name="outgoing_call_duration">Εξερχόμενη κλήση · %s</string>
<string name="missed_call">Αναπάντηση κλήση</string>
<string name="audio_call">Κλήση ήχου</string>
<string name="video_call">Κλήση βίντεο</string>
<string name="help">Βοήθεια</string>
<string name="switch_to_conversation">Εναλλαγή στη συζήτηση</string>
<string name="microphone_unavailable">Το μικρόφωνο δεν είναι διαθέσιμο</string>
<string name="only_one_call_at_a_time">Μπορείτε να κάνετε μόνο μια κλήση τη φορά.</string>
<string name="return_to_ongoing_call">Επιστροφή στην κλήση σε εξέλιξη</string>
<string name="could_not_switch_camera">Αδυναμία εναλλαγής κάμερας</string>
<string name="add_to_favorites">Καρφίτσωμα στην κορυφή</string>
<string name="remove_from_favorites">Ξεκαρφίτσωμα από την κορυφή</string>
<string name="gpx_track">Ίχνος GPX</string>
<string name="could_not_correct_message">Αδυναμία διόρθωσης μηνύματος</string>
<string name="search_all_conversations">Όλες οι συζητήσεις</string>
<string name="search_this_conversation">Αυτή η συζήτηση</string>
<string name="your_avatar">Η φωτογραφία προφίλ σας</string>
<string name="avatar_for_x">Φωτογραφία προφίλ του/της %s</string>
<string name="encrypted_with_omemo">Κρυπτογραφημένη με OMEMO</string>
<string name="encrypted_with_openpgp">Κρυπτογραφημένη με OpenPGP</string>
<string name="not_encrypted">Χωρίς κρυπτογράφηση</string>
<string name="exit">Έξοδος</string>
<string name="record_voice_mail">Ηχογράφηση μηνύματος τηλεφωνητή</string>
<string name="play_audio">Αναπαραγωγή ήχου</string>
<string name="pause_audio">Παύση ήχου</string>
<string name="add_contact_or_create_or_join_group_chat">Προσθήκη επαφής, δημιουργία ή είσοδος σε ομαδική συζήτηση, ή εύρεση καναλιών</string>
<plurals name="view_users">
<item quantity="one">Εμφάνιση %1$d συμμετέχοντα</item>
<item quantity="other">Εμφάνιση %1$d συμμετεχόντων</item>
</plurals>
<plurals name="some_messages_could_not_be_delivered">
<item quantity="one">Κάποιο μήνυμα δεν ήταν δυνατό να παραδοθεί</item>
<item quantity="other">Κάποια μηνύματα δεν ήταν δυνατό να παραδοθούν</item>
</plurals>
<string name="failed_deliveries">Αποτυχημένες διανομές</string>
<string name="more_options">Περισσότερες επιλογές</string>
</resources>

View File

@ -753,6 +753,7 @@
<string name="ongoing_calls_channel_name">Llamadas salientes</string>
<string name="silent_messages_channel_name">Mensajes sin sonido</string>
<string name="silent_messages_channel_description">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).</string>
<string name="delivery_failed_channel_name">Envíos fallidos</string>
<string name="pref_message_notification_settings">Ajustes de notificación de mensajes</string>
<string name="pref_incoming_call_notification_settings">Ajustes de notificación de llamadas</string>
<string name="pref_more_notification_settings_summary">Importancia, Sonido, Vibración</string>
@ -920,6 +921,8 @@
<string name="only_one_call_at_a_time">Solo puedes hacer una llamada a la vez</string>
<string name="return_to_ongoing_call">Volver a la llamada en curso</string>
<string name="could_not_switch_camera">No se ha podido cambiar de cámara</string>
<string name="add_to_favorites">Fijar en la parte superior</string>
<string name="remove_from_favorites">Desfijar de la parte superior</string>
<string name="gpx_track">Recorrido GPX</string>
<string name="could_not_correct_message">No se pudo corregir el mensaje</string>
<string name="search_all_conversations">Todas las conversaciones</string>
@ -938,4 +941,11 @@
<item quantity="one">Ver %1$d Participante</item>
<item quantity="other">Ver %1$d Participantes</item>
</plurals>
<plurals name="some_messages_could_not_be_delivered">
<item quantity="one">Un mensaje no se ha podido entregar</item>
<item quantity="other">Algunos mensajes no se han podido entregar</item>
</plurals>
<string name="failed_deliveries">Envíos fallidos</string>
<string name="more_options">Más opciones</string>
<string name="no_application_found">No se ha encontrado aplicación</string>
</resources>

View File

@ -4,6 +4,7 @@
<string name="action_add">Nouvelle conversation</string>
<string name="action_accounts">Gérer les comptes</string>
<string name="action_account">Gérer le compte</string>
<string name="action_end_conversation">Fermer la conversation</string>
<string name="action_contact_details">Détails du contact</string>
<string name="action_muc_details">Détails du groupe</string>
<string name="channel_details">Détails du canal</string>
@ -399,6 +400,7 @@
<string name="mark_as_read">Marquer comme lu</string>
<string name="pref_input_options">Saisie</string>
<string name="pref_enter_is_send">Touche Entrée pour envoyer</string>
<string name="pref_enter_is_send_summary">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.</string>
<string name="pref_display_enter_key">Afficher la touche Entrée</string>
<string name="pref_display_enter_key_summary">Remplacer la touche Émoticônes par une touche Entrée.</string>
<string name="audio">audio</string>
@ -458,7 +460,11 @@
<string name="server_info_broken">Détraqué</string>
<string name="pref_presence_settings">Disponibilité</string>
<string name="pref_away_when_screen_off">Absent quand l\'écran est éteint</string>
<string name="pref_away_when_screen_off_summary">Absent quand l\'écran est éteint</string>
<string name="pref_dnd_on_silent_mode">Occupé en mode silence</string>
<string name="pref_dnd_on_silent_mode_summary">Occupé lorsque l\'appareil est en mode silencieux</string>
<string name="pref_treat_vibrate_as_silent">Indisponible en mode vibreur</string>
<string name="pref_treat_vibrate_as_dnd_summary">Occupé lorsque l\'appareil est en mode vibreur</string>
<string name="pref_show_connection_options">Paramètres de connexion avancés</string>
<string name="pref_show_connection_options_summary">Montrer le nom d\'hôte et le port lors du paramétrage d\'un compte</string>
<string name="hostname_example">xmpp.example.com</string>
@ -747,6 +753,7 @@
<string name="ongoing_calls_channel_name">Appels sortants</string>
<string name="silent_messages_channel_name">Messages silencieux</string>
<string name="silent_messages_channel_description">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).</string>
<string name="delivery_failed_channel_name">Échec lors de la livraison</string>
<string name="pref_message_notification_settings">Paramètres de notification des messages</string>
<string name="pref_incoming_call_notification_settings">Paramètres de notification d\'appels entrants</string>
<string name="pref_more_notification_settings_summary">Importance, son, vibration</string>
@ -894,6 +901,7 @@
<string name="rtp_state_ringing">Ça sonne</string>
<string name="rtp_state_declined_or_busy">Occupé</string>
<string name="rtp_state_connectivity_error">Impossible de connecter l\'appel</string>
<string name="rtp_state_connectivity_lost_error">Connexion perdue</string>
<string name="rtp_state_retracted">Appel annulé</string>
<string name="rtp_state_application_failure">Échec de l\'application</string>
<string name="hang_up">Raccrocher</string>
@ -907,12 +915,36 @@
<string name="missed_call">Appel manqué</string>
<string name="audio_call">Appel audio</string>
<string name="video_call">Appel vidéo</string>
<string name="help">Aide</string>
<string name="switch_to_conversation">Basculer vers la conversation</string>
<string name="microphone_unavailable">Votre micro n\'est pas disponible</string>
<string name="only_one_call_at_a_time">Vous ne pouvez prendre qu\'un appel à la fois.</string>
<string name="return_to_ongoing_call">Reprendre l\'appel en cours</string>
<string name="could_not_switch_camera">Impossible de changer de caméra</string>
<string name="add_to_favorites">Épingler en haut de la liste</string>
<string name="remove_from_favorites">Détacher du haut de la liste</string>
<string name="gpx_track">Trace GPX</string>
<string name="could_not_correct_message">Impossible de corriger le message</string>
<string name="search_all_conversations">Toutes les conversations</string>
<string name="search_this_conversation">Cette conversation</string>
<string name="your_avatar">Votre avatar</string>
<string name="avatar_for_x">Avatar pour %s</string>
<string name="encrypted_with_omemo">Chiffré avec OMEMO</string>
<string name="encrypted_with_openpgp">Chiffré avec OpenPGP</string>
<string name="not_encrypted">Non chiffré</string>
<string name="exit">Quitter</string>
<string name="record_voice_mail">Enregistrer un message vocal</string>
<string name="play_audio">Lire l\'audio</string>
<string name="pause_audio">Mettre en pause l\'audio</string>
<string name="add_contact_or_create_or_join_group_chat">Ajouter un contact, créer ou joindre un groupe de discussion, ou découvrir les salons</string>
<plurals name="view_users">
<item quantity="one">Voir %1$d participant</item>
<item quantity="other">Voir %1$d participants</item>
</plurals>
<plurals name="some_messages_could_not_be_delivered">
<item quantity="one">Certains messages n\'ont pas pu être distribués</item>
<item quantity="other">Certains messages n\'ont pu être distribués</item>
</plurals>
<string name="failed_deliveries">Échec lors de la livraison</string>
<string name="more_options">Plus d\'options</string>
</resources>

View File

@ -550,7 +550,7 @@
<string name="creating_conference">Creando unha conversa en grupo...</string>
<string name="invite_again">Invitar de novo</string>
<string name="gp_disable">Desactivar</string>
<string name="gp_short">Corto</string>
<string name="gp_short">Breve</string>
<string name="gp_medium">Medio</string>
<string name="gp_long">Longo</string>
<string name="pref_broadcast_last_activity">Publicar utilización</string>
@ -947,4 +947,8 @@
</plurals>
<string name="failed_deliveries">Entregas fallidas</string>
<string name="more_options">Máis opcións</string>
<string name="no_application_found">Non se atopa unha aplicación</string>
<string name="invite_to_app">Convida a Conversations</string>
<string name="unable_to_parse_invite">Non se puido enviar o convite</string>
<string name="server_does_not_support_easy_onboarding_invites">O servidor non soporta a creación de convites</string>
</resources>

View File

@ -4,6 +4,7 @@
<string name="action_add">Új beszélgetés</string>
<string name="action_accounts">Fiókok kezelése</string>
<string name="action_account">Fiók kezelése</string>
<string name="action_end_conversation">Beszélgetés bezárása</string>
<string name="action_contact_details">Partner részletei</string>
<string name="action_muc_details">Csoportos csevegés részletei</string>
<string name="channel_details">Csatorna részletei</string>
@ -39,6 +40,7 @@
<string name="moderator">Moderátor</string>
<string name="participant">Résztvevő</string>
<string name="visitor">Látogató</string>
<string name="remove_contact_text">Szeretné eltávolítani %s partnerét a partnerlistájából? Beszélgetései ezzel a partnerrel nem lesznek eltávolítva.</string>
<string name="block_contact_text">Szeretné tiltani %s partnert, hogy ne tudjon üzeneteket küldeni?</string>
<string name="unblock_contact_text">Szeretné feloldani %s partner tiltását és lehetővé tenni számára az üzenetek küldését?</string>
<string name="block_domain_text">%s összes partnerét tiltja?</string>
@ -63,6 +65,7 @@
<string name="save">Mentés</string>
<string name="ok">Rendben</string>
<string name="crash_report_title">A Conversations összeomlott</string>
<string name="crash_report_message">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.</string>
<string name="send_now">Küldés most</string>
<string name="send_never">Sose kérdezzen újra</string>
<string name="problem_connecting_to_account">Nem sikerült kapcsolódni a fiókhoz</string>
@ -77,6 +80,7 @@
<string name="sharing_files_please_wait">Fájlok megosztása. Kérem várjon…</string>
<string name="action_clear_history">Előzmények törlése</string>
<string name="clear_conversation_history">Beszélgetés előzményeinek törlése</string>
<string name="clear_histor_msg">Biztosan törölni szeretné az összes üzenetet a beszélgetésen belül?\n\n<b>Figyelmeztetés:</b> Ez nem fogja érinteni a más eszközökön vagy kiszolgálókon tárolt üzeneteket.</string>
<string name="delete_file_dialog">Fájl törlése</string>
<string name="delete_file_dialog_msg">Biztosan törölni szeretné ezt a fájlt?\n\n<b>Figyelmeztetés:</b> 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.</string>
<string name="also_end_conversation">A beszélgetés bezárása azután</string>
@ -91,13 +95,16 @@
<string name="send_unencrypted">Küldés titkosítatlanul</string>
<string name="decryption_failed">A visszafejtés sikertelen. Talán nem rendelkezik a megfelelő személyes kulccsal.</string>
<string name="openkeychain_required">OpenKeychain</string>
<string name="openkeychain_required_long">A Conversations az <b>OpenKeychain</b>-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<small>(Ezután indítsa újra a Conversations alkalmazást.)</small></string>
<string name="restart">Újraindítás</string>
<string name="install">Telepítés</string>
<string name="openkeychain_not_installed">Telepítse az OpenKeychain alkalmazás</string>
<string name="offering">felajánlás…</string>
<string name="waiting">várakozás…</string>
<string name="no_pgp_key">Nem található OpenPGP kulcs</string>
<string name="contact_has_no_pgp_key">Nem lehet titkosítani az üzenetét, mert a partnere nem közölte a nyilvános kulcsát.\n\n<small>Kérje meg a partnerét, hogy állítsa be az OpenPGP-t.</small></string>
<string name="no_pgp_keys">Nem találhatók OpenPGP kulcsok</string>
<string name="contacts_have_no_pgp_keys">Nem lehet titkosítani az üzenetét, mert a partnerei nem közölték a nyilvános kulcsukat.\n\n<small>Kérje meg a partnereit, hogy állítsák be az OpenPGP-t.</small></string>
<string name="pref_general">Általános</string>
<string name="pref_accept_files">Fájlok fogadása</string>
<string name="pref_accept_files_summary">Fájlok automatikus fogadása, amelyek kisebbek mint…</string>

View File

@ -4,6 +4,7 @@
<string name="action_add">Nuova conversazione</string>
<string name="action_accounts">Gestisci account</string>
<string name="action_account">Gestisci account</string>
<string name="action_end_conversation">Chiudi conversazione</string>
<string name="action_contact_details">Dettagli del contatto</string>
<string name="action_muc_details">Dettagli chat di gruppo</string>
<string name="channel_details">Dettagli canale</string>
@ -752,6 +753,7 @@
<string name="ongoing_calls_channel_name">Chiamate in uscita</string>
<string name="silent_messages_channel_name">Messaggi silenziosi</string>
<string name="silent_messages_channel_description">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).</string>
<string name="delivery_failed_channel_name">Recapiti falliti</string>
<string name="pref_message_notification_settings">Impostazioni di notifica dei messaggi</string>
<string name="pref_incoming_call_notification_settings">Impostazioni di notifica delle chiamate in arrivo</string>
<string name="pref_more_notification_settings_summary">Importanza, suono, vibrazione</string>
@ -919,10 +921,31 @@
<string name="only_one_call_at_a_time">Puoi fare solo una chiamata alla volta.</string>
<string name="return_to_ongoing_call">Torna alla chiamata in corso</string>
<string name="could_not_switch_camera">Impossibile cambiare fotocamera</string>
<string name="add_to_favorites">Fissa in alto</string>
<string name="remove_from_favorites">Rimuovi dall\'alto</string>
<string name="gpx_track">Traccia GPX</string>
<string name="could_not_correct_message">Impossibile correggere il messaggio</string>
<string name="search_all_conversations">Tutte le conversazioni</string>
<string name="search_this_conversation">Questa conversazione</string>
<string name="your_avatar">Il tuo avatar</string>
<string name="avatar_for_x">Avatar di %s</string>
<string name="encrypted_with_omemo">Crittografato con OMEMO</string>
<string name="encrypted_with_openpgp">Crittografato con OpenPGP</string>
<string name="not_encrypted">Non crittografato</string>
<string name="exit">Esci</string>
<string name="record_voice_mail">Registra in segreteria</string>
<string name="play_audio">Riproduci audio</string>
<string name="pause_audio">Pausa</string>
<string name="add_contact_or_create_or_join_group_chat">Aggiungi un contatto, crea o visita una chat di gruppo, o scopri canali</string>
<plurals name="view_users">
<item quantity="one">Vedi %1$d partecipante</item>
<item quantity="other">Vedi %1$d partecipanti</item>
</plurals>
<plurals name="some_messages_could_not_be_delivered">
<item quantity="one">Un messaggio non è stato recapitato</item>
<item quantity="other">Alcuni messaggi non sono stati recapitati</item>
</plurals>
<string name="failed_deliveries">Recapiti falliti</string>
<string name="more_options">Altre opzioni</string>
<string name="no_application_found">Nessuna applicazione trovata</string>
</resources>

View File

@ -4,6 +4,7 @@
<string name="action_add">新しい会話</string>
<string name="action_accounts">アカウントの管理</string>
<string name="action_account">アカウントの管理</string>
<string name="action_end_conversation">この会話を閉じる</string>
<string name="action_contact_details">連絡先の詳細</string>
<string name="action_muc_details">談話室の詳細</string>
<string name="channel_details">チャンネルの詳細</string>
@ -15,6 +16,8 @@
<string name="action_unblock_contact">連絡先のブロックを解除</string>
<string name="action_block_domain">ドメインをブロック</string>
<string name="action_unblock_domain">ドメインのブロックを解除</string>
<string name="action_block_participant">参加者をブロック</string>
<string name="action_unblock_participant">参加者のブロックを解除</string>
<string name="title_activity_manage_accounts">アカウントの管理</string>
<string name="title_activity_settings">設定</string>
<string name="title_activity_sharewith">会話で共有</string>
@ -26,6 +29,7 @@
<string name="just_now">ちょうど今</string>
<string name="minute_ago">1 分前</string>
<string name="minutes_ago">%d 分前</string>
<string name="x_unread_conversations">未読%d件</string>
<string name="sending">送信中…</string>
<string name="message_decrypting">メッセージを復号化しています。しばらくお待ちください…</string>
<string name="pgp_message">OpenPGP 暗号化メッセージ</string>
@ -36,17 +40,20 @@
<string name="moderator">モデレーター</string>
<string name="participant">参加者</string>
<string name="visitor">ビジター</string>
<string name="remove_contact_text">連絡先リストから %s を削除しますか? この連絡先との会話は削除されません。</string>
<string name="block_contact_text">%s からあなたに送信されるメッセージをブロックしますか?</string>
<string name="unblock_contact_text">%s のブロックを解除し、あなたにメッセージを送信できるようにしますか?</string>
<string name="block_domain_text">%s からの連絡をすべてブロックしますか?</string>
<string name="unblock_domain_text">%s からの連絡をすべてブロック解除しますか?</string>
<string name="contact_blocked">連絡先をブロックしました</string>
<string name="blocked">ブロックしました</string>
<string name="remove_bookmark_text">%s のブックマークを削除しますか? このブックマークとの会話は削除されません。</string>
<string name="register_account">サーバーに新しいアカウントを登録</string>
<string name="change_password_on_server">サーバーのパスワードを変更</string>
<string name="share_with">…で共有</string>
<string name="start_conversation">会話を始める</string>
<string name="invite_contact">連絡先を招待</string>
<string name="invite">招待</string>
<string name="contacts">連絡先</string>
<string name="contact">連絡先</string>
<string name="cancel">キャンセル</string>
@ -61,12 +68,19 @@
<string name="crash_report_title">Conversations がクラッシュしました</string>
<string name="send_now">今すぐ送信</string>
<string name="send_never">今後表示しない</string>
<string name="problem_connecting_to_account">アカウントに接続できません</string>
<string name="problem_connecting_to_accounts">複数のアカウントに接続できません</string>
<string name="touch_to_fix">タップしてアカウントを管理</string>
<string name="attach_file">添付ファイル</string>
<string name="not_in_roster">連絡先が連絡先リストにありません。追加しますか?</string>
<string name="add_contact">連絡先を追加</string>
<string name="send_failed">配信に失敗しました</string>
<string name="preparing_image">転送用画像の準備中</string>
<string name="preparing_images">転送用画像の準備中</string>
<string name="sharing_files_please_wait">フィルを共有しています。しばらくお待ちください…</string>
<string name="action_clear_history">履歴をクリア</string>
<string name="clear_conversation_history">会話履歴をクリア</string>
<string name="clear_histor_msg">この会話のすべてのメッセージを削除してもよろしいですか?\n\n<b>警告:</b> 他のデバイスやサーバーに保存されているメッセージのコピーには影響しません。</string>
<string name="delete_file_dialog">ファイルを削除</string>
<string name="delete_file_dialog_msg">このファイルを削除してもよろしいですか?\n\n<b>警告:</b> これは、他のデバイスやサーバーに保存されているファイルのコピーは削除しません。</string>
<string name="also_end_conversation">その後、この会話を閉じる</string>
@ -77,16 +91,20 @@
<string name="send_omemo_message">OMEMO 暗号化メッセージを送信</string>
<string name="send_omemo_x509_message">v\\OMEMO 暗号化メッセージを送信</string>
<string name="send_pgp_message">OpenPGP 暗号化メッセージを送信</string>
<string name="your_nick_has_been_changed">ニックネームが変更されました</string>
<string name="send_unencrypted">暗号化されていない送信</string>
<string name="decryption_failed">復号化に失敗しました。おそらく秘密鍵が正しくないようです。</string>
<string name="openkeychain_required">OpenKeychain</string>
<string name="openkeychain_required_long">Conversations は <b>OpenKeychain</b> を利用して、メッセージの暗号化および復号化、そしてあなたの公開鍵を管理します。\n\nOpenKeychain は GPLv3+ ライセンスの下で、F-Droid および Google Play から利用可能です。\n\n<small>(後で Conversations を再起動してください。)</small></string>
<string name="restart">再起動</string>
<string name="install">インストール</string>
<string name="openkeychain_not_installed">OpenKeychain をインストールしてください</string>
<string name="offering">依頼中…</string>
<string name="waiting">待機中…</string>
<string name="no_pgp_key">OpenPGP の鍵はありません</string>
<string name="contact_has_no_pgp_key">連絡先が公開鍵を通知しないため、あなたのメッセージを暗号化することができません。\n\n<small>連絡先に OpenPGP をセットアップするように依頼してください。</small></string>
<string name="no_pgp_keys">OpenPGP の鍵はありません</string>
<string name="contacts_have_no_pgp_keys">連絡先が公開鍵を通知しないため、あなたのメッセージを暗号化することができません。\n\n<small>連絡先に OpenPGP をセットアップするように依頼してください。</small></string>
<string name="pref_general">全般</string>
<string name="pref_accept_files">ファイルを受取</string>
<string name="pref_accept_files_summary">自動的に小さいファイルを受取…</string>
@ -96,12 +114,19 @@
<string name="pref_vibrate_summary">新しいメッセージが届いたときに振動します</string>
<string name="pref_led">LED 通知</string>
<string name="pref_led_summary">新しいメッセージが届いたときに通知ライトを点滅します</string>
<string name="pref_ringtone">着信音</string>
<string name="pref_notification_sound">通知音</string>
<string name="pref_notification_sound_summary">新着メッセージの通知音</string>
<string name="pref_call_ringtone_summary">音声通話の着信音</string>
<string name="pref_notification_grace_period">猶予期間</string>
<string name="pref_notification_grace_period_summary">別のデバイスでの操作を検知した際に、通知を止める時間の長さ</string>
<string name="pref_advanced_options">詳細</string>
<string name="pref_never_send_crash">クラッシュレポートを送信しない</string>
<string name="pref_never_send_crash_summary">スタックトレースを送信して、Conversations の継続的な開発を支援します</string>
<string name="pref_confirm_messages">メッセージの確認</string>
<string name="pref_confirm_messages_summary">あなたがメッセージを受信して読んだときに、連絡先に知らせます</string>
<string name="pref_ui_options">UI</string>
<string name="openpgp_error">OpenKeychain でエラーが発生しました。</string>
<string name="bad_key_for_encryption">暗号化の鍵が不正です。</string>
<string name="accept">受付</string>
<string name="error">エラーが発生しました</string>
@ -114,8 +139,10 @@
<string name="attach_take_picture">写真の撮影</string>
<string name="preemptively_grant">事前にサブスクリプション要求を許可する</string>
<string name="error_not_an_image_file">選択したファイルは画像ではありません</string>
<string name="error_compressing_image">画像ファイルを変換できません</string>
<string name="error_file_not_found">ファイルが見つかりません</string>
<string name="error_io_exception">一般的な I/O エラー。おそらく空き容量がなくなっていませんか?</string>
<string name="error_security_exception_during_image_copy">あなたが画像の選択のために使用したアプリは、読み取りに必要なアクセス権がありません。\n\n<small>別のファイルマネージャを使用して、画像を選択してください。</small></string>
<string name="account_status_unknown">不明</string>
<string name="account_status_disabled">一時的に無効</string>
<string name="account_status_online">オンライン</string>
@ -127,6 +154,8 @@
<string name="account_status_regis_fail">登録に失敗しました</string>
<string name="account_status_regis_conflict">ユーザー名はすでに使用されています</string>
<string name="account_status_regis_success">登録が完了しました</string>
<string name="account_status_regis_not_sup">サーバーが登録をサポートしていません</string>
<string name="account_status_regis_invalid_token">トークンが無効です</string>
<string name="account_status_tls_error">TLS ネゴシエーションに失敗しました</string>
<string name="account_status_policy_violation">ポリシー違反</string>
<string name="account_status_incompatible_server">互換性のないサーバー</string>
@ -142,14 +171,17 @@
<string name="mgmt_account_publish_pgp">OpenPGP 公開鍵を公開</string>
<string name="unpublish_pgp">OpenPGP 公開鍵を削除</string>
<string name="unpublish_pgp_message">在席通知から OpenPGP 公開鍵を削除してもよろしいですか?\n連絡先はあなたに OpenPGP 暗号化メッセージを送信できなくなります。</string>
<string name="openpgp_has_been_published">OpenPGP 公開鍵を公開しました。</string>
<string name="mgmt_account_enable">アカウントを有効にする</string>
<string name="mgmt_account_are_you_sure">よろしいですか?</string>
<string name="mgmt_account_delete_confirm_text">アカウントを削除すると会話履歴がすべて消去されます</string>
<string name="attach_record_voice">音声を録音</string>
<string name="account_settings_jabber_id">XMPP アドレス</string>
<string name="block_jabber_id">XMPP アドレスをブロック</string>
<string name="account_settings_example_jabber_id">username@example.com</string>
<string name="password">パスワード</string>
<string name="invalid_jid">正しい XMPP アドレスではありません</string>
<string name="error_out_of_memory">メモリ不足です。画像が大きすぎます</string>
<string name="add_phone_book_text">%s をお使いのアドレス帳に追加しますか?</string>
<string name="server_info_show_more">サーバー情報</string>
<string name="server_info_mam">XEP-0313: メッセージ アーカイブ管理</string>
@ -165,9 +197,14 @@
<string name="server_info_unavailable">利用不可</string>
<string name="missing_public_keys">公開鍵の通知がありません</string>
<string name="last_seen_now">ちょうど今会いました</string>
<string name="last_seen_min">1 分前に会いました</string>
<string name="last_seen_mins">%d 分前に会いました</string>
<string name="last_seen_hour">1 時間前に会いました</string>
<string name="last_seen_hours">%d 時間前に会いました</string>
<string name="last_seen_day">1 日前に会いました</string>
<string name="last_seen_days">%d 日前に会いました</string>
<string name="install_openkeychain">暗号化されたメッセージです。復号化するには OpenKeychain をインストールしてください。</string>
<string name="openpgp_messages_found">新しい OpenPGP 暗号化されたメッセージが見つかりました</string>
<string name="openpgp_key_id">OpenPGP 鍵 ID</string>
<string name="omemo_fingerprint">OMEMO フィンガープリント</string>
<string name="omemo_fingerprint_x509">v\\OMEMO フィンガープリント</string>
@ -178,6 +215,7 @@
<string name="fetching_keys">鍵の取得中…</string>
<string name="done">完了</string>
<string name="decrypt">復号化</string>
<string name="bookmarks">ブックマーク</string>
<string name="search">検索</string>
<string name="enter_contact">連絡先を入力</string>
<string name="delete_contact">連絡先を削除</string>
@ -193,8 +231,11 @@
<string name="save_as_bookmark">ブックマークとして保存</string>
<string name="delete_bookmark">ブックマークを削除</string>
<string name="destroy_room">グループチャットを破棄する</string>
<string name="destroy_channel">チャンネルを破棄する</string>
<string name="destroy_room_dialog">このグループチャットを破棄してもよろしいですか?\n\n<b>警告:</b> グループチャットはサーバーから完全に削除されます。</string>
<string name="destroy_channel_dialog">このチャンネルを破棄してもよろしいですか?\n\n<b>警告:</b> チャンネルはサーバーから完全に削除されます。</string>
<string name="could_not_destroy_room">グループチャットを削除できません</string>
<string name="could_not_destroy_channel">チャンネルを削除できません</string>
<string name="action_edit_subject">談話室の題を編集</string>
<string name="topic">トピック</string>
<string name="joining_conference">談話室に参加しています…</string>
@ -203,25 +244,32 @@
<string name="add_back">戻りを追加</string>
<string name="contact_has_read_up_to_this_point">%s はここまで読みました</string>
<string name="contacts_have_read_up_to_this_point">%s はここまで読みました</string>
<string name="contacts_and_n_more_have_read_up_to_this_point">%1$s +%2$d 全員ここまで読みました</string>
<string name="everyone_has_read_up_to_this_point">全員ここまで読みました</string>
<string name="publish">公開</string>
<string name="touch_to_choose_picture">アバターをタップしてギャラリーから画像を選択します</string>
<string name="publishing">公開中…</string>
<string name="error_publish_avatar_server_reject">サーバーがあなたの公開を拒否しました</string>
<string name="error_publish_avatar_converting">画像を変換できません</string>
<string name="error_saving_avatar">ディスクにアバターを保存できませんでした</string>
<string name="or_long_press_for_default">(または長押しするとデフォルトに戻します)</string>
<string name="error_publish_avatar_no_server_support">ご利用のサーバーは、アバターの公開をサポートしていません</string>
<string name="private_message">ささやいた</string>
<string name="private_message_to">%s へ</string>
<string name="send_private_message_to">プライベートメッセージを %s に送信</string>
<string name="connect">接続</string>
<string name="account_already_exists">このアカウントはすでに存在します</string>
<string name="next">次へ</string>
<string name="server_info_session_established">セッションが確立</string>
<string name="skip">スキップ</string>
<string name="disable_notifications">通知を無効にする</string>
<string name="enable">有効</string>
<string name="conference_requires_password">談話室にはパスワードが必要</string>
<string name="enter_password">パスワードを入力してください</string>
<string name="request_presence_updates">最初に連絡先から参加アップデートを要求してください。\n\n<small>これは、連絡先が何のクライアントを使用しているかを決めるために使用されます。</small></string>
<string name="request_now">今すぐ要求</string>
<string name="ignore">無視</string>
<string name="without_mutual_presence_updates"><b>警告:</b> 相互の参加アップデートなしにこれを送信すると、予期しない問題が発生する可能性があります。\n\n<small>あなたの参加サブスクリプションを検証するために、連絡先の詳細に移動します。</small></string>
<string name="pref_security_settings">セキュリティ</string>
<string name="pref_allow_message_correction">メッセージの修正を許可</string>
<string name="pref_allow_message_correction_summary">連絡先が、遡及的に自分のメッセージを編集することを許可します</string>
@ -235,6 +283,8 @@
<string name="pref_quiet_hours_summary">消音時間の間、通知は無音になります</string>
<string name="pref_expert_options_other">その他</string>
<string name="pref_autojoin">ブックマークと同期</string>
<string name="pref_autojoin_summary">ブックマークに従って、グループチャットに自動参加します。</string>
<string name="toast_message_omemo_fingerprint">OMEMO フィンガープリントをクリップボードにコピーしました</string>
<string name="conference_banned">この談話室から締め出されています</string>
<string name="conference_members_only">この談話室はメンバー制です</string>
<string name="conference_resource_constraint">リソース制約</string>
@ -253,6 +303,7 @@
<string name="send_again">再送</string>
<string name="file_url">ファイル URL</string>
<string name="url_copied_to_clipboard">URL をクリップボードにコピーしました</string>
<string name="jabber_id_copied_to_clipboard">XMPP アドレスをクリップボードにコピーしました</string>
<string name="error_message_copied_to_clipboard">エラーメッセージをクリップボードにコピーしました</string>
<string name="web_address">ウェブアドレス</string>
<string name="scan_qr_code">2D バーコードをスキャン</string>
@ -261,7 +312,16 @@
<string name="account_details">アカウントの詳細</string>
<string name="confirm">確認</string>
<string name="try_again">再度実行してください</string>
<string name="pref_keep_foreground_service">フォアグラウンドサービス</string>
<string name="pref_keep_foreground_service_summary">オペレーティングシステムが接続を切断するのを防止します</string>
<string name="pref_create_backup">バックアップを作成</string>
<string name="pref_create_backup_summary">バックアップファイルは %s に保存されます </string>
<string name="notification_create_backup_title">バックアップを作成しています</string>
<string name="notification_backup_created_title">バックアップを作成しました</string>
<string name="notification_backup_created_subtitle">バックアップファイルは %s に保存されました</string>
<string name="restoring_backup">バックアップを復元</string>
<string name="notification_restored_backup_title">バックアップを復元しました</string>
<string name="notification_restored_backup_subtitle">アカウントを有効にしてください。</string>
<string name="choose_file">ファイルの選択</string>
<string name="receiving_x_file">%1$s 受信中 (%2$d%% 完了)</string>
<string name="download_x_file">%s のダウンロード</string>
@ -269,16 +329,25 @@
<string name="file">ファイル</string>
<string name="open_x_file">%s を開く</string>
<string name="sending_file">送信中 (%1$d%% 完了)</string>
<string name="preparing_file">転送用ファイルの準備中</string>
<string name="x_file_offered_for_download">%s ダウンロード依頼中</string>
<string name="cancel_transmission">転送をキャンセル</string>
<string name="file_transmission_failed">ファイル転送に失敗しました</string>
<string name="file_transmission_cancelled">転送をキャンセルしました</string>
<string name="file_deleted">ファイルを削除しました</string>
<string name="no_application_found_to_open_file">ファイルを開くアプリケーションが見つかりません</string>
<string name="no_application_found_to_open_link">リンクを開くアプリケーションが見つかりません</string>
<string name="no_application_found_to_view_contact">連絡先を表示するアプリケーションが見つかりません</string>
<string name="pref_show_dynamic_tags">ダイナミック タグ</string>
<string name="pref_show_dynamic_tags_summary">連絡先の下に、読み取り専用タグを表示します</string>
<string name="enable_notifications">通知を有効にする</string>
<string name="no_conference_server_found">談話室のサーバーが見つかりませんでした</string>
<string name="conference_creation_failed">グループチャットを作成できません</string>
<string name="account_image_description">アカウント アバター</string>
<string name="copy_omemo_clipboard_description">OMEMO フィンガープリントをクリップボードにコピー</string>
<string name="regenerate_omemo_key">OMEMO 鍵を再生成</string>
<string name="clear_other_devices">デバイスをクリア</string>
<string name="error_no_keys_to_trust_server_error">この連絡先で使用可能な鍵がありません。\nサーバーから新しい鍵を取得できませんでした。連絡先のサーバーに問題がある可能性があります。</string>
<string name="error_trustkeys_title">何か問題が発生しました。</string>
<string name="fetching_history_from_server">サーバーから履歴を取得中</string>
<string name="no_more_history_on_server">サーバーにこれ以上履歴はありません</string>
@ -288,6 +357,7 @@
<string name="change_password">パスワードの変更</string>
<string name="current_password">現在のパスワード</string>
<string name="new_password">新しいパスワード</string>
<string name="password_should_not_be_empty">パスワードは空にできません</string>
<string name="enable_all_accounts">すべてのアカウントを有効にする</string>
<string name="disable_all_accounts">すべてのアカウントを無効にする</string>
<string name="perform_action_with">アクションを実行...</string>
@ -301,6 +371,7 @@
<string name="remove_from_room">グループチャットから削除</string>
<string name="could_not_change_affiliation">%s の所属を変更できません</string>
<string name="ban_from_conference">談話室から蹴り出す</string>
<string name="ban_from_channel">チャンネルから追い出す</string>
<string name="ban_now">今すぐ禁止</string>
<string name="could_not_change_role">%s の役割を変更できません</string>
<string name="members_only">プライベート、メンバーのみ</string>
@ -334,6 +405,7 @@
<string name="pref_chat_states_summary">あなたがメッセージを書いているときに、連絡先に知らせます</string>
<string name="send_location">位置を送信</string>
<string name="show_location">位置を表示</string>
<string name="no_application_found_to_display_location">位置を表示するアプリケーションが見つかりません</string>
<string name="location">位置</string>
<string name="title_undo_swipe_out_conversation">会話が閉じられました</string>
<string name="pref_dont_trust_system_cas_title">システムの CA を信頼しない</string>

View File

@ -969,4 +969,5 @@ Administrator twojego serwera będzie mógł czytać twoje wiadomości, ale moż
</plurals>
<string name="failed_deliveries">Nie dostarczone wiadomości</string>
<string name="more_options">Więcej ustawień</string>
<string name="no_application_found">Nie znaleziono żadnej aplikacji</string>
</resources>

View File

@ -4,6 +4,7 @@
<string name="action_add">Nova conversa</string>
<string name="action_accounts">Gerenciar contas</string>
<string name="action_account">Gerenciar conta</string>
<string name="action_end_conversation">Encerrar a conversa</string>
<string name="action_contact_details">Detalhes do contato</string>
<string name="action_muc_details">Detalhes da conversa em grupo</string>
<string name="channel_details">Detalhes do canal</string>
@ -752,6 +753,7 @@
<string name="ongoing_calls_channel_name">Chamadas em andamento</string>
<string name="silent_messages_channel_name">Silenciar mensagens</string>
<string name="silent_messages_channel_description">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).</string>
<string name="delivery_failed_channel_name">Entregas não efetuadas</string>
<string name="pref_message_notification_settings">Configurações das notificações de mensagens</string>
<string name="pref_incoming_call_notification_settings">configurações das notificações de chamadas recebidas</string>
<string name="pref_more_notification_settings_summary">Importância, som, vibração.</string>
@ -919,10 +921,30 @@
<string name="only_one_call_at_a_time">Você só pode ter uma chamada de cada vez</string>
<string name="return_to_ongoing_call">Retornar para a chamada em andamento</string>
<string name="could_not_switch_camera">Não foi possível trocar a câmera</string>
<string name="add_to_favorites">Fixar no topo</string>
<string name="remove_from_favorites">Desafixar do topo</string>
<string name="gpx_track">Trilha GPX</string>
<string name="could_not_correct_message">Não foi possível corrigir a mensagem</string>
<string name="search_all_conversations">Todas as conversas</string>
<string name="search_this_conversation">Essa conversa</string>
<string name="your_avatar">Seu avatar</string>
<string name="avatar_for_x">Avatar para %s</string>
<string name="encrypted_with_omemo">Criptografada com OMEMO</string>
<string name="encrypted_with_openpgp">Criptografada com OpenPGP</string>
<string name="not_encrypted">Não criptografada</string>
<string name="exit">Sair</string>
<string name="record_voice_mail">Gravar mensagem de voz</string>
<string name="play_audio">Tocar áudio</string>
<string name="pause_audio">Pausar áudio</string>
<string name="add_contact_or_create_or_join_group_chat">Adicionar contato, criar ou associar-se a uma conversa em grupo ou descobrir canais</string>
<plurals name="view_users">
<item quantity="one">Ver %1$d participante</item>
<item quantity="other">Ver %1$d participantes</item>
</plurals>
<plurals name="some_messages_could_not_be_delivered">
<item quantity="one">Não foi possível enviar a mensagem</item>
<item quantity="other">Não foi possível enviar algumas mensagens</item>
</plurals>
<string name="failed_deliveries">Entregas não efetuadas</string>
<string name="more_options">Mais opções</string>
</resources>

View File

@ -957,4 +957,8 @@
</plurals>
<string name="failed_deliveries">Trimiteri eșuate</string>
<string name="more_options">Mai multe</string>
<string name="no_application_found">Nu s-a găsit nici o aplicație</string>
<string name="invite_to_app">Invitați la Conversations</string>
<string name="unable_to_parse_invite">Nu s-a putut procesa invitația</string>
<string name="server_does_not_support_easy_onboarding_invites">Serverul nu suportă generarea de invitații</string>
</resources>

View File

@ -4,6 +4,7 @@
<string name="action_add">Новая беседа</string>
<string name="action_accounts">Управление аккаунтами</string>
<string name="action_account">Управление аккаунтом</string>
<string name="action_end_conversation">Закрыть беседу</string>
<string name="action_contact_details">Сведения о контакте</string>
<string name="action_muc_details">Подробности конференции</string>
<string name="channel_details">Сведения о канале</string>
@ -296,8 +297,8 @@
<string name="hosted_on">размещено на %s</string>
<string name="checking_x">Проверка %s на сервере HTTP</string>
<string name="not_connected_try_again">Вы неподключены. Попробуйте позже</string>
<string name="check_x_filesize">Проверить размер %s</string>
<string name="check_x_filesize_on_host">Проверить размер %1$s на %2$s</string>
<string name="check_x_filesize">Проверить размер (%s)</string>
<string name="check_x_filesize_on_host">Проверить размер на %2$s (%1$s)</string>
<string name="message_options">Опции сообщения</string>
<string name="quote">Цитировать</string>
<string name="paste_as_quote">Вставить как цитату</string>
@ -764,6 +765,7 @@
<string name="ongoing_calls_channel_name">Активные вызовы</string>
<string name="silent_messages_channel_name">Тихие сообщения</string>
<string name="silent_messages_channel_description">Эта группа уведомлений используется для отображения беззвучных оповещений. Например, при активности на другом устройстве (Грейс-период).</string>
<string name="delivery_failed_channel_name">Недоставленные сообщения</string>
<string name="pref_message_notification_settings">Настройки уведомлений о сообщениях</string>
<string name="pref_incoming_call_notification_settings">Настройки уведомлений о входящих вызовах</string>
<string name="pref_more_notification_settings_summary">Приоритет, звук, вибрация</string>
@ -931,10 +933,35 @@
<string name="only_one_call_at_a_time">Нельзя одновременно совершать больше одного звонка.</string>
<string name="return_to_ongoing_call">Вернуться к текущему звонку</string>
<string name="could_not_switch_camera">Не удалось переключить камеру</string>
<string name="add_to_favorites">Прикрепить</string>
<string name="remove_from_favorites">Открепить</string>
<string name="gpx_track">GPX-трек</string>
<string name="could_not_correct_message">Не удалось исправить сообщение</string>
<string name="search_all_conversations">Все беседы</string>
<string name="search_this_conversation">Эта беседа</string>
<string name="your_avatar">Ваш аватар</string>
<string name="avatar_for_x">Аватар для %s</string>
<string name="encrypted_with_omemo">Зашифровано с помощью OMEMO</string>
<string name="encrypted_with_openpgp">Зашифровано с помощью OpenPGP</string>
<string name="not_encrypted">Не зашифровано</string>
<string name="exit">Выйти</string>
<string name="record_voice_mail">Записать голосовое сообщение</string>
<string name="play_audio">Воспроизвести аудио</string>
<string name="pause_audio">Остановить воспроизведение</string>
<string name="add_contact_or_create_or_join_group_chat">Добавить контакт, создать или присоединиться к конференции, или найти каналы</string>
<plurals name="view_users">
<item quantity="one">Просмотр %1$d участника</item>
<item quantity="few">Просмотр %1$d участников</item>
<item quantity="many">Просмотр %1$d участников</item>
<item quantity="other">Просмотр %1$d участников</item>
</plurals>
<plurals name="some_messages_could_not_be_delivered">
<item quantity="one">Не удалось доставить сообщение</item>
<item quantity="few">Не удалось доставить сообщения</item>
<item quantity="many">Не удалось доставить сообщения</item>
<item quantity="other">Не удалось доставить некоторые сообщения</item>
</plurals>
<string name="failed_deliveries">Недоставленные сообщения</string>
<string name="more_options">Ещё</string>
<string name="no_application_found">Не найдено приложения</string>
</resources>

View File

@ -4,6 +4,7 @@
<string name="action_add">Yeni konuşma</string>
<string name="action_accounts">Hesapları yönet</string>
<string name="action_account">Hesabı yönet</string>
<string name="action_end_conversation">Konuşmayı kapat</string>
<string name="action_contact_details">Kişi bilgileri</string>
<string name="action_muc_details">Küme konuşması ayrıntıları</string>
<string name="channel_details">Kanal ayrıntıları</string>
@ -33,22 +34,26 @@
<string name="message_decrypting">İleti deşifre ediliyor. Lütfen bekleyin…</string>
<string name="pgp_message">OpenPGP şifreli ileti</string>
<string name="nick_in_use">Rumuz kullanılıyor</string>
<string name="invalid_muc_nick">Geçersiz rumuz</string>
<string name="admin">Yönetici</string>
<string name="owner">Sahip</string>
<string name="moderator">Moderatör</string>
<string name="participant">Katılımcı</string>
<string name="visitor">Ziyaretçi</string>
<string name="remove_contact_text">%s adlı kişiyi listenizden çıkarmak ister misiniz? Bu kişi ile olan konuşmalar silinmeyecektir.</string>
<string name="block_contact_text">%s kişisinin size ileti göndermesini engellemek istiyor musunuz?</string>
<string name="unblock_contact_text">% kişisinin size ileti göndermesine koyduğunuz engellemeyi kaldırmak ve size ileti göndermesine izin vermek istiyor musunuz?</string>
<string name="block_domain_text">%s üzerinden gelen tüm kişileri engellemek istiyor musunuz? </string>
<string name="unblock_domain_text">%s üzerinden gelen kişilerdeki engellemeyi kaldırmak istiyor musunuz?</string>
<string name="contact_blocked">Kişi engellendi</string>
<string name="blocked">Engellendi</string>
<string name="remove_bookmark_text">%s kişisini yer imlerinden çıkarmak ister misiniz? Bu yer imi ile kayıtlı konuşmalar silinmeyecektir.</string>
<string name="register_account">Sunucuda yeni bir hesap oluştur</string>
<string name="change_password_on_server">Sunucudaki şifreni değiştir</string>
<string name="share_with">Paylaş...</string>
<string name="start_conversation">Konuşma başlat</string>
<string name="invite_contact">Kişi davet et</string>
<string name="invite">Davet et </string>
<string name="contacts">Kişiler</string>
<string name="contact">Kişi</string>
<string name="cancel">İptal et</string>
@ -61,30 +66,46 @@
<string name="save">Kaydet</string>
<string name="ok">Tamam</string>
<string name="crash_report_title">Conversations çöktü</string>
<string name="crash_report_message">XMPP hesabınız ile yığın izleri göndermeniz Conversations\'ın devam eden gelişimine yardımcı oluyor.</string>
<string name="send_now">Şimdi gönder</string>
<string name="send_never">Bir daha sorma</string>
<string name="problem_connecting_to_account">Hesaba bağlanılamadı</string>
<string name="problem_connecting_to_accounts">Birden fazla hesaba bağlanılamadı.</string>
<string name="touch_to_fix">Hesaplarınızı yönetmek için dokununuz.</string>
<string name="attach_file">Dosya ekle</string>
<string name="not_in_roster">Eksik olan bu kişiyi listenize eklemek ister misiniz?</string>
<string name="add_contact">Kişi ekle</string>
<string name="send_failed">ulaştırılamadı</string>
<string name="preparing_image">Görüntü gönderilmeye hazırlanılıyor.</string>
<string name="preparing_images">Görüntüler gönderilmeye hazırlanılıyor.</string>
<string name="sharing_files_please_wait">Dosyalar Paylaşılıyor. Lütfen bekleyin...</string>
<string name="action_clear_history">Geçmişi sil</string>
<string name="clear_conversation_history">Konuşma geçmişini sil</string>
<string name="clear_histor_msg">Bu konuşmadaki tüm mesajları silmek istiyor musunuz? \n\n<b>Uyarı:</b> Bu eylem, diğer aygıt ve sunucularda kayıtlı mesajları etkilemeyecektir. </string>
<string name="delete_file_dialog">Dosyayı sil</string>
<string name="delete_file_dialog_msg">Bu dosyayı silmek istediğinizden emin misiniz? \n\n<b>Uyarı:</b> Bu eylem, bu dosyanın diğer aygıt ve sunucularda kayıtlı kopyalarını silmeyecektir.</string>
<string name="also_end_conversation">Devamında bu konuşmayı kapat</string>
<string name="choose_presence">Aygıt seç</string>
<string name="send_unencrypted_message">Şifrelenmemiş ileti gönder</string>
<string name="send_message">Mesajı gönder</string>
<string name="send_message_to_x">%s kişisine ileti gönder</string>
<string name="send_omemo_message">OMEMO ile şifrelenmiş ileti gönder</string>
<string name="send_omemo_x509_message">v\\OMEMO ile şifrelenmiş ileti gönder</string>
<string name="send_pgp_message">OpenPGP ile şifrelenmiş ileti gönder</string>
<string name="your_nick_has_been_changed">Yeni rumuz kullanımda</string>
<string name="send_unencrypted">Şifrelenmemiş gönder</string>
<string name="decryption_failed">Deşifre edilemedi. Uygun bir özel anahtarınız olmayabilir.</string>
<string name="openkeychain_required">OpenKeychain</string>
<string name="openkeychain_required_long">Conversations mesajları şifrelemek ve çözmek ve genel anahtarlarınızı yönetmek için <b>OpenKeychain</b> kullanmaktadır. \n\nlt GPLv3+ altında lisanslıdır ve F-Droid ve Google Play\'de mevcuttur. \n\n<small>(Lütfen devamında Conversations\'ı yeniden başlatın.)</small></string>
<string name="restart">Yeniden başlat</string>
<string name="install">Kur</string>
<string name="openkeychain_not_installed">Lütfen OpenKeychaini kur</string>
<string name="offering">sunuluyor…</string>
<string name="waiting">bekliyor…</string>
<string name="no_pgp_key">Herhangi bir OpenPGP anahtarı bulunamadı</string>
<string name="contact_has_no_pgp_key">Bağlantınız genel anahtarınııklamadığı için bağlanılamadı.\n\n<small>Lütfen bağlantızdan OpenPGP kurmasını isteyin.</small></string>
<string name="no_pgp_keys">Herhangi bir OpenPGP anahtarı bulunamadı</string>
<string name="contacts_have_no_pgp_keys">Bağlantılarınız genel anahtarılarınııklamadığı için bağlanılamadı.\n\n<small>Lütfen bağlantılarınızdan OpenPGP kurmaslarını isteyin.</small></string>
<string name="pref_general">Genel</string>
<string name="pref_accept_files">Dosyaları kabul et</string>
<string name="pref_accept_files_summary">den küçük olan dosyaları kendiliğinden kabul et</string>
@ -94,14 +115,23 @@
<string name="pref_vibrate_summary">Yeni ileti geldiğinde titret</string>
<string name="pref_led">LED Bildirimi</string>
<string name="pref_led_summary">Yeni bir ileti geldiğinde bildirim ışığı yanıp sönsün</string>
<string name="pref_ringtone">Zil sesi</string>
<string name="pref_notification_sound">Bildirim sesi</string>
<string name="pref_notification_sound_summary">Yeni mesajlar için bildirim sesi</string>
<string name="pref_call_ringtone_summary">Gelen çağrılar için zil sesi</string>
<string name="pref_notification_grace_period">Mühlet</string>
<string name="pref_notification_grace_period_summary">Cihazlarınızın birinde faaliyet tespit edilmesinden sonra zaman hatırlatmalarının susturulma uzunluğu.</string>
<string name="pref_advanced_options">Gelişmiş</string>
<string name="pref_never_send_crash">Asla çöküş raporu gönderme</string>
<string name="pref_never_send_crash_summary">Yığın izi göndererek gelişime yardımcı oluyorsunuz.</string>
<string name="pref_confirm_messages">İletileri onayla</string>
<string name="pref_confirm_messages_summary">Onların iletilerini aldığınızda ve okuduğunuzda, kişilerinizin bunu bilmesini sağlayın</string>
<string name="pref_ui_options">Arabirim</string>
<string name="openpgp_error">OpenKeychain bir hata verdi.</string>
<string name="bad_key_for_encryption">Kötü anahar şifrelemesi.</string>
<string name="accept">Kabul et</string>
<string name="error">Bir hata oluştu</string>
<string name="recording_error">Hata</string>
<string name="your_account">Hesabınız</string>
<string name="send_presence_updates">Çevrim içi durum bildirimi gönder</string>
<string name="receive_presence_updates">Çevrim içi durum bildirimi al</string>
@ -110,8 +140,10 @@
<string name="attach_take_picture">Resim çek</string>
<string name="preemptively_grant">Abonelik isteğini peşinen kabul et</string>
<string name="error_not_an_image_file">Seçtiğiniz dosya bir görüntü dosyası değil</string>
<string name="error_compressing_image">Görüntü dosyası dönüştürülemedi.</string>
<string name="error_file_not_found">Dosya bulunamadı</string>
<string name="error_io_exception">Genel G/Ç hatası. Depolama yeri kalmamış olabilir mi?</string>
<string name="error_security_exception_during_image_copy">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.</string>
<string name="account_status_unknown">Bilinmeyen</string>
<string name="account_status_disabled">Geçici olarak devre dışı</string>
<string name="account_status_online">Çevrim içi</string>
@ -123,9 +155,13 @@
<string name="account_status_regis_fail">Hesap oluşturulamadı</string>
<string name="account_status_regis_conflict">Kullanıcı adı kullanılıyor</string>
<string name="account_status_regis_success">Hesap oluşturuldu</string>
<string name="account_status_regis_not_sup">Hesap, sunucu tarafından desteklenmiyor.</string>
<string name="account_status_regis_invalid_token">Geçersiz hesak simgesi</string>
<string name="account_status_tls_error">TLS uzlaşması başarısız</string>
<string name="account_status_policy_violation">Politika ihlali</string>
<string name="account_status_incompatible_server">Sunucu uyuşmazlığı</string>
<string name="account_status_stream_error">Akış hatası</string>
<string name="account_status_stream_opening_error">Akış açılım hatası</string>
<string name="encryption_choice_unencrypted">Şifrelenmemiş</string>
<string name="encryption_choice_otr">OTR</string>
<string name="encryption_choice_pgp">OpenPGP</string>
@ -134,11 +170,19 @@
<string name="mgmt_account_disable">Geçici olarak devre dışı bırak</string>
<string name="mgmt_account_publish_avatar">Avatar yayımla</string>
<string name="mgmt_account_publish_pgp">OpenPGP genel anahtarını yayımla</string>
<string name="unpublish_pgp">OpenPGP genel anahtarını kaldır</string>
<string name="unpublish_pgp_message">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.</string>
<string name="openpgp_has_been_published">OpenPGP genel anahtarı yayınlandı.</string>
<string name="mgmt_account_enable">Hesabı etkinleştir</string>
<string name="mgmt_account_are_you_sure">Emin misiniz?</string>
<string name="mgmt_account_delete_confirm_text">Hesabınızın silinmesi bütün konuşma geçmişinizi siler</string>
<string name="attach_record_voice">Ses kaydet</string>
<string name="account_settings_jabber_id">XMPP adresi</string>
<string name="block_jabber_id">XMPP adresini engelle</string>
<string name="account_settings_example_jabber_id">kullanıcıadı@ornek.com</string>
<string name="password">parola</string>
<string name="invalid_jid">Bu geçerli bir XMPP adresi değil</string>
<string name="error_out_of_memory">Yetersiz bellek. Görüntü çok büyük.</string>
<string name="add_phone_book_text">%s kişisini listenize eklemek ister misiniz?</string>
<string name="server_info_show_more">Sunucu bilgisi</string>
<string name="server_info_mam">XEP-0313: MAM</string>
@ -147,6 +191,7 @@
<string name="server_info_blocking">XEP-0191: Blocking Command</string>
<string name="server_info_roster_version">XEP-0237: Roster Versioning</string>
<string name="server_info_stream_management">XEP-0198: Stream Management</string>
<string name="server_info_external_service_discovery">XEP-0215: Dış Hizmet Keşfi</string>
<string name="server_info_pep">XEP-0163: PEP (Avatars / OMEMO)</string>
<string name="server_info_http_upload">XEP-0363: HTTP File Upload</string>
<string name="server_info_push">XEP-0357: Push</string>
@ -154,9 +199,14 @@
<string name="server_info_unavailable">mevcut değil</string>
<string name="missing_public_keys">Kayıp genel anahtar bildirimleri</string>
<string name="last_seen_now">en son şimdi görüldü</string>
<string name="last_seen_min">en son bir dakika önce görüldü</string>
<string name="last_seen_mins">en son %d dakika önce görüldü</string>
<string name="last_seen_hour">en son bir saat önce görüldü</string>
<string name="last_seen_hours">en son %d saat önce görüldü</string>
<string name="last_seen_day">en son bir saat önce görüldü</string>
<string name="last_seen_days">en son %d gün önce görüldü</string>
<string name="install_openkeychain">Şifrelenmiş mesaj. Çözmek için lütfen OpenKeychain yükleyin.</string>
<string name="openpgp_messages_found">Yeni şifrelenmiş OpenPGP mesajları bulundu</string>
<string name="openpgp_key_id">OpenPGP Anahtar ID</string>
<string name="omemo_fingerprint">OMEMO parmak izi</string>
<string name="omemo_fingerprint_x509">v\\OMEMO parmak izi</string>
@ -167,8 +217,10 @@
<string name="fetching_keys">Anahtarları alıyor…</string>
<string name="done">Tamam</string>
<string name="decrypt">Şifreyi çöz</string>
<string name="bookmarks">Yer imleri</string>
<string name="search">Ara</string>
<string name="enter_contact">Kişi Girin</string>
<string name="delete_contact">Kişiyi sil</string>
<string name="view_contact_details">Kişi bilgilerini görüntüle</string>
<string name="block_contact">Kişiyi engelle</string>
<string name="unblock_contact">Kişiyi engellemeyi kaldır</string>
@ -176,57 +228,103 @@
<string name="select">Seç</string>
<string name="contact_already_exists">Kişi zaten mevcut</string>
<string name="join">Katıl</string>
<string name="channel_full_jid_example">channel@cnoference.example.com/nick</string>
<string name="channel_bare_jid_example">channel@conference.example.com</string>
<string name="save_as_bookmark">Yer imi olarak kaydet</string>
<string name="delete_bookmark">Yer imini sil</string>
<string name="destroy_room">Grup konuşmasını yoket</string>
<string name="destroy_channel">Kanalı yoket</string>
<string name="destroy_room_dialog">Bu grup konuşmasını yoketmek istediğinizden emin misiniz?\n\n<b>Uyarı:</b> Grup konuşması sunucudan tamamen kaldırlacaktır.</string>
<string name="destroy_channel_dialog">Bu genel kanalı yoketmek istediğnizden emin misiniz?\n\n<b>Uyarı:</b> Kanal sunucudan tamamen kaldırılacaktır. </string>
<string name="could_not_destroy_room">Grup konuşması yokedilemedi</string>
<string name="could_not_destroy_channel">Kanal yokedilemedi</string>
<string name="action_edit_subject">Grup konuşma konusunu düzenle</string>
<string name="topic">Başlık</string>
<string name="joining_conference">Grup konuşmasına bağlanılıyor...</string>
<string name="leave">Ayrıl</string>
<string name="contact_added_you">Kişi sizi listesine ekledi</string>
<string name="add_back">Siz de ekleyin</string>
<string name="contact_has_read_up_to_this_point">%s buraya kadar okudu</string>
<string name="contacts_have_read_up_to_this_point">%sburaya kadar okudu</string>
<string name="contacts_and_n_more_have_read_up_to_this_point">%1$s+%2$dkişi buraya kadar okudu</string>
<string name="everyone_has_read_up_to_this_point">Buraya kadar herkes okudu</string>
<string name="publish">Yayımla</string>
<string name="touch_to_choose_picture">Galeriden resim seçmek için avatara dokunun</string>
<string name="publishing">Yayımlanıyor…</string>
<string name="error_publish_avatar_server_reject">Sunucu yayımladığınızı reddetti</string>
<string name="error_publish_avatar_converting">Resminiz dönüştürülemedi</string>
<string name="error_saving_avatar">vatar diske kaydedilemedi</string>
<string name="or_long_press_for_default">(Veya varsayılan değerlere dönmek için uzun süre basılı tutun)</string>
<string name="error_publish_avatar_no_server_support">Sunucunuz avatarların tanıtılmasını desteklemiyor.</string>
<string name="private_message">fısıldandı</string>
<string name="private_message_to">%s kişisine</string>
<string name="send_private_message_to">%s kişisine özel ileti gönder</string>
<string name="connect">Bağlan</string>
<string name="account_already_exists">Bu hesap zaten mevcut</string>
<string name="next">Sonraki</string>
<string name="server_info_session_established">Oturum oluşturuldu</string>
<string name="skip">Atla</string>
<string name="disable_notifications">Bildirimleri kapat</string>
<string name="enable">Etkinleştir</string>
<string name="conference_requires_password">Grup konuşması şifre talep ediyor</string>
<string name="enter_password">Parolayı gir</string>
<string name="request_presence_updates">Lütfen bağlantınızdan önce çevrim içi durum bildirimi talep edin. \n\n<small>Bu, bağlantınızın hangi konuşma uygulamasını kullandığını belirlemekte kullanılacak</small>. </string>
<string name="request_now">Şimdi iste</string>
<string name="ignore">Yok say</string>
<string name="without_mutual_presence_updates"><b>Uyarı:</b> Bu mesajı karşılıklı çevrim içi durum bildirimleri olmadan göndermek, beklenmeyen problemlere neden olabilir. <small>\n\n Çevrim içi durum aboneliklerini doğrulamak için \"Kişi Bilgileri\" kısmına gidin.</small></string>
<string name="pref_security_settings">Güvenlik</string>
<string name="pref_allow_message_correction">İleti düzeltmeye izin ver</string>
<string name="pref_allow_message_correction_summary">Kişilerinizin geçmiş iletilerini düzeltmelerine izin ver</string>
<string name="pref_expert_options">Uzman seçenekleri</string>
<string name="pref_expert_options_summary">Lütfen dikkatli olun</string>
<string name="title_activity_about_x">%sHakkında</string>
<string name="title_pref_quiet_hours">Sessiz Saatler</string>
<string name="title_pref_quiet_hours_start_time">Başlangıç zamanı</string>
<string name="title_pref_quiet_hours_end_time">Bitiş zamanı</string>
<string name="title_pref_enable_quiet_hours">Sessiz saatleri etkinleştir</string>
<string name="pref_quiet_hours_summary">Bildirimler sessiz saatler boyunca sessize alınacaktır</string>
<string name="pref_expert_options_other">Diğer</string>
<string name="pref_autojoin">Yer imleri ile senkronize et.</string>
<string name="pref_autojoin_summary">Yer imleri öyle belirtmişse grup konuşmalarına otomatik olarak katıl.</string>
<string name="toast_message_omemo_fingerprint">OMEMO parmak izi panoya kopyalandı</string>
<string name="conference_banned">Bu grup konuşmasından menedildiniz</string>
<string name="conference_members_only">Bu grup konuşması yalnızca üyeleri içindir</string>
<string name="conference_resource_constraint">Kaynak sınırlaması</string>
<string name="conference_kicked">Bu grup konuşmasından atıldınız</string>
<string name="conference_shutdown">Grup konuşması kapatıldı</string>
<string name="conference_unknown_error">Artık bu grup konuşmasında değilsiniz</string>
<string name="using_account">%s hesabını kullanarak</string>
<string name="hosted_on">%sev sahipliğinde</string>
<string name="checking_x">HTTP sunucusundaki %s denetleniyor</string>
<string name="not_connected_try_again">Bağlı değilsiniz. Daha sonra yeniden deneyin</string>
<string name="check_x_filesize">%s boyutunu denetle</string>
<string name="check_x_filesize_on_host">%2$s üzerindeki %1$s boyutunu denetle</string>
<string name="message_options">İleti seçenekleri</string>
<string name="quote">Alıntı</string>
<string name="paste_as_quote">Alıntı olarak yapıştır</string>
<string name="copy_original_url">Orijinal URL\'i kopyala</string>
<string name="send_again">Yeniden gönder</string>
<string name="file_url">Dosya URL</string>
<string name="url_copied_to_clipboard">URL panoya kopyalandı</string>
<string name="jabber_id_copied_to_clipboard">XMPP adresi panoya kopyalandı</string>
<string name="error_message_copied_to_clipboard">Hata mesajı panoya kopyalandı</string>
<string name="web_address">web adresi</string>
<string name="scan_qr_code">2B Barkod Tara</string>
<string name="show_qr_code">2B Barkod Göster</string>
<string name="show_block_list">Engellenenler listesini göster</string>
<string name="account_details">Hesap bilgileri</string>
<string name="confirm">Doğrula</string>
<string name="try_again">Yeniden deneyin</string>
<string name="pref_keep_foreground_service">Ön planda çalışması</string>
<string name="pref_keep_foreground_service_summary">İşletim sisteminin bağlantınızı koparmasına engel olur</string>
<string name="pref_create_backup">Yedek oluştur</string>
<string name="pref_create_backup_summary">Yedekleme dosyaları %s\'da depolanacak</string>
<string name="notification_create_backup_title">Yedekleme dosyaları oluşturuluyor</string>
<string name="notification_backup_created_title">Yedeklemeniz oluşturuldu</string>
<string name="notification_backup_created_subtitle">Yedekleme dosyaları %s\'da depolandı</string>
<string name="restoring_backup">Yedekleme yükleniyor</string>
<string name="notification_restored_backup_title">Yedekleminiz yüklendi</string>
<string name="notification_restored_backup_subtitle">Hesabı etkinleştirmeyi unutmayın</string>
<string name="choose_file">Dosya seç</string>
<string name="receiving_x_file">%1$s alıyor/(%2$d%% tamamlandı)</string>
<string name="download_x_file">%s indir</string>
@ -234,14 +332,28 @@
<string name="file">dosya</string>
<string name="open_x_file">%s aç</string>
<string name="sending_file">gönderiyor (%1$d%% tamamlandı)</string>
<string name="preparing_file">Dosya paylaşılmaya hazırlanılıyor</string>
<string name="x_file_offered_for_download">%s indirme işlemi için sunuldu</string>
<string name="cancel_transmission">Aktarmayı iptal et</string>
<string name="file_transmission_failed">Dosya paylaşılanamadı</string>
<string name="file_transmission_cancelled">Dosya aktarma iptal edildi</string>
<string name="file_deleted">Dosya silindi</string>
<string name="no_application_found_to_open_file">Dosyayı açacak bir uygulama bulunamadı</string>
<string name="no_application_found_to_open_link">Linki açacak bir uygulama bulunamadı</string>
<string name="no_application_found_to_view_contact">Kişiyi görüntüleyecek bir uygulama bulunamadı</string>
<string name="pref_show_dynamic_tags">Dinamik etiketler</string>
<string name="pref_show_dynamic_tags_summary">Kişilerin görünmeyen salt okunur etiketlerini göster</string>
<string name="enable_notifications">Bildirimleri etkinleştir</string>
<string name="no_conference_server_found">Grup konuşma sunucusu bulunamadı</string>
<string name="conference_creation_failed">Grup konuşması oluşturulamadı</string>
<string name="account_image_description">Hesap avatarı</string>
<string name="copy_omemo_clipboard_description">OMEMO parmak izini panoya kopyala</string>
<string name="regenerate_omemo_key">OMEMO anahtarını yeniden oluştur</string>
<string name="clear_other_devices">Aygıtları sil</string>
<string name="clear_other_devices_desc">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.</string>
<string name="error_no_keys_to_trust_server_error">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?</string>
<string name="error_no_keys_to_trust_presence">Bu kişi için kullanılabilir bir anahtar yok.\İkinizin de çevrim içi durum aboneliği oldudğundan emin olun.</string>
<string name="error_trustkeys_title">Bir şeyler ters gitti</string>
<string name="fetching_history_from_server">Sunucudan geçmiş alınıyor</string>
<string name="no_more_history_on_server">Sunucuda başka geçmiş kalmadı</string>
<string name="updating">Güncelleniyor…</string>
@ -250,6 +362,7 @@
<string name="change_password">Parolayı değiştirin</string>
<string name="current_password">Mevcut parola</string>
<string name="new_password">Yeni parola</string>
<string name="password_should_not_be_empty">Şifre boş olamaz</string>
<string name="enable_all_accounts">Tüm hesapları etkinleştir</string>
<string name="disable_all_accounts">Tüm hesapları devre dışı bırak</string>
<string name="perform_action_with">Kullanarak tamamla</string>
@ -258,17 +371,36 @@
<string name="outcast">Bağlantısız</string>
<string name="member">Üye</string>
<string name="advanced_mode">Gelişmiş kip</string>
<string name="grant_membership">Üye imtiyazları tanı</string>
<string name="remove_membership">Üye imtiyazlarını kaldır</string>
<string name="grant_admin_privileges">Yönetici imtiyazlarını kabul et</string>
<string name="remove_admin_privileges">Yönetici imtiyazlarını geri çevir</string>
<string name="grant_owner_privileges">Sahip imtiyazları tanı</string>
<string name="remove_owner_privileges">Sahip imtiyazlarını kaldır</string>
<string name="remove_from_room">Grup konuşmasından çıkar </string>
<string name="remove_from_channel">Kanaldan çıkar</string>
<string name="could_not_change_affiliation">%s kişisinin ortaklığı değiştirilemedi</string>
<string name="ban_from_conference">Grup konuşmasından men et</string>
<string name="ban_from_channel">Kanaldan men et</string>
<string name="removing_from_public_conference">%s kişisini ortak kanaldan çıkarmaya çalışıyorsunuz. Bunu yapmanın tek yolu kişiyi tamamen men etmektir.</string>
<string name="ban_now">Şimdi men et</string>
<string name="could_not_change_role">%s kişisinin rolü değiştirilemedi</string>
<string name="conference_options">Özel grup konuşması ayarları</string>
<string name="channel_options">Ortak kanal ayarları </string>
<string name="members_only">Özel, yalnızca üyeler</string>
<string name="non_anonymous">XMPP adreslerini herkes için görünür yap </string>
<string name="moderated">Kanalı denetimli hale getir</string>
<string name="you_are_not_participating">Katılımcı değilsiniz</string>
<string name="modified_conference_options">Düzenlenmiş grup konuşması seçenekleri!</string>
<string name="could_not_modify_conference_options">Grup konuşma seçenekleri düzenlenemedi</string>
<string name="never">Hiçbir zaman</string>
<string name="until_further_notice">İkinci bildirime kadar</string>
<string name="snooze">Ertele</string>
<string name="reply">Cevapla</string>
<string name="mark_as_read">Okundu olarak işaretle</string>
<string name="pref_input_options">Girdi</string>
<string name="pref_enter_is_send">Enter=gönder</string>
<string name="pref_enter_is_send_summary">Mesaj yollamak için Enter tuşunu kullanın. Bu seçenek devre dışı olsa da her zaman Ctrl+Enter ile mesaj yollayabilirsiniz.</string>
<string name="pref_display_enter_key">\"Enter\" tuşunu göster</string>
<string name="pref_display_enter_key_summary">İfade simgesi tuşunu \"enter\" tuşu olarak değiştir</string>
<string name="audio">ses</string>
@ -289,8 +421,11 @@
<string name="pref_chat_states_summary">Siz onlara ileti yazarken kişilerinizin bunu bilmesini sağlayın</string>
<string name="send_location">Yer bildirimi gönder</string>
<string name="show_location">Yer bildirimi göster</string>
<string name="no_application_found_to_display_location">Konum göstermek için uygulama bulunamadı</string>
<string name="location">Yer</string>
<string name="title_undo_swipe_out_conversation">Konuşma sonlandı</string>
<string name="title_undo_swipe_out_group_chat">Özel grup konuşmasından ayrıldı</string>
<string name="title_undo_swipe_out_channel">Ortak kanaldan ayrıldı</string>
<string name="pref_dont_trust_system_cas_title">Sistem sertifikalarına güvenmeyin</string>
<string name="pref_dont_trust_system_cas_summary">Tüm sertifikalar bizzat onaylanmalıdır</string>
<string name="pref_remove_trusted_certificates_title">Sertifikaları kaldır</string>
@ -303,11 +438,15 @@
<item quantity="one">%d sertifikaları silindi</item>
<item quantity="other">%d sertifikaları silindi</item>
</plurals>
<string name="pref_quick_action_summary">\"Gönder\" tuşunu kısayol ile değiştir</string>
<string name="pref_quick_action">Kısayol</string>
<string name="none">Hiçbiri</string>
<string name="recently_used">En son kullanılanlar</string>
<string name="choose_quick_action">Kısayolu seç</string>
<string name="search_contacts">Kişilerde ara</string>
<string name="search_bookmarks">Yer imleri ara</string>
<string name="send_private_message">Özel ileti gönder</string>
<string name="user_has_left_conference">%1$s grup konuşmasından ayrıldı</string>
<string name="username">Kullanıcı adı</string>
<string name="username_hint">Kullanıcı adı</string>
<string name="invalid_username">Kullanıcı adı geçerli değil</string>
@ -317,16 +456,28 @@
<string name="download_failed_could_not_write_file">İndirme başarısız: Dosya yazılamıyor</string>
<string name="account_status_tor_unavailable">Tor ağına erişilemiyor</string>
<string name="account_status_bind_failure">Bağlantı başarısız</string>
<string name="account_status_host_unknown">Sunucu bu alan adı için sorumlu değil</string>
<string name="server_info_broken">Bozuk</string>
<string name="pref_presence_settings">Mevcudiyet</string>
<string name="pref_away_when_screen_off">Ekran kapandığında uzakta</string>
<string name="pref_away_when_screen_off_summary">Ekran kapalı olduğund Uzakta olarak göster</string>
<string name="pref_dnd_on_silent_mode">Müsait değilken sessiz kipte olur</string>
<string name="pref_dnd_on_silent_mode_summary">Telefonunuz sessizdeyken, durum bildiriminizi müsait değil olarak gösterir.</string>
<string name="pref_treat_vibrate_as_silent">Titreşim kipini sessiz kip olarak değerlendir</string>
<string name="pref_treat_vibrate_as_dnd_summary">Telefonunuz titreşimdeyken, durum bildiriminizi müsait değil olarak gösterir.</string>
<string name="pref_show_connection_options">Genişletilmiş bağlantı seçenekleri</string>
<string name="pref_show_connection_options_summary">Hesap oluştururken sunucu adıyla bağlantı noktası seçeneğini göster</string>
<string name="hostname_example">xmpp.ornek.com</string>
<string name="action_add_account_with_certificate">Sertifika ile giriş yap</string>
<string name="unable_to_parse_certificate">Sertifika çözümlenemedi</string>
<string name="mam_prefs">Arşivleme tercihleri</string>
<string name="server_side_mam_prefs">Sunucu tarafı arşivleme tercihleri</string>
<string name="fetching_mam_prefs">Arşivleme tercihleri alınıyor. Lütfen bekleyin...</string>
<string name="unable_to_fetch_mam_prefs">Arşivleme tercihleri alınamadı</string>
<string name="captcha_required">CAPTCHA gerekli</string>
<string name="captcha_hint">Resimdeki yazıyı girin</string>
<string name="certificate_chain_is_not_trusted">Güvenilmeyen sertifika zinciri</string>
<string name="jid_does_not_match_certificate">XMPP adresi sertifika ile uyuşmuyor</string>
<string name="action_renew_certificate">Sertifikayı yenile</string>
<string name="error_fetching_omemo_key">OMEMO anahtarı alınırken hata oluştu!</string>
<string name="verified_omemo_key_with_certificate">Sertifikalı OMEMO anahtarı onaylandı!</string>
@ -336,6 +487,7 @@
<string name="pref_use_tor_summary">Tüm bağlantıları Tor ağı üzerinden aktar. Orbot gerekir.</string>
<string name="account_settings_hostname">Sunucu adı</string>
<string name="account_settings_port">Bağlantı noktası</string>
<string name="hostname_or_onion">Sunucu- veya .onion- adresi</string>
<string name="not_a_valid_port">Bu bağlantı noktası geçerli değil</string>
<string name="not_valid_hostname">Bu sunucu geçerli değil</string>
<string name="connected_accounts"> %2$d hesabın %1$d kadarı bağlandı</string>
@ -344,23 +496,69 @@
<item quantity="other">%d ileti</item>
</plurals>
<string name="load_more_messages">Daha fazla ileti yükle</string>
<string name="shared_file_with_x">Dosya %s ile paylaşıldı</string>
<string name="shared_image_with_x">Resim %sile paylaşıldı</string>
<string name="shared_images_with_x">Resimler %s ile paylaşıldı</string>
<string name="shared_text_with_x">Metin %s ile paylaşıldı</string>
<string name="no_storage_permission">Conversations\'ın haricii depolama erişimine izin ver</string>
<string name="no_camera_permission">Conversations\'ın kamera erişimine izin ver</string>
<string name="sync_with_contacts">Kişilerle senkronize et</string>
<string name="sync_with_contacts_long">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.</string>
<string name="sync_with_contacts_quicksy"><![CDATA[Quicksy kişilerinizin telefon numarasına; Quicksy üzerinde olabiliecek bağlantılar hakkında tavsiyede bulunmak için ulaşması gerekmektedir. <br><br>Bu telefon numaralarının herhangi bir kopyasını depolamayacağız. \n\nDaha fazla bilgi için <a href="https://quicksy.im/#privacy">gizlilik sözleşmemizi</a> okuyun.<br><br>Şimdi kişilerinize ulaşılması için sizden izin istenecek.</string>
<string name=\"notify_on_all_messages\">Tüm iletilerde uyar</string>
<string name=\"notify_only_when_highlighted\">Yalnızca bahsedilğinde haber ver</string>
<string name=\"notify_never\">Uyarılar devre dışı</string>
<string name=\"notify_paused\">Uyarılar geçici olarak durduruldu</string>
<string name=\"pref_picture_compression\">Görüntü sıkıştırma</string>
<string name=\"pref_picture_compression_summary\">İ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.</string>
<string name=\"always\">Her zaman</string>
<string name=\"large_images_only\">Sadece büyük resimler</string>
<string name=\"battery_optimizations_enabled\">Pil optimizasyonu devrede</string>
<string name=\"battery_optimizations_enabled_explained\">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.</string>
<string name=\"battery_optimizations_enabled_dialog\">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.</string>
<string name=\"disable\">Devre dışı</string>
<string name=\"selection_too_large\">Seçilen alan çok büyük</string>
<string name=\"no_accounts\">(Etkin hesap bulunmuyor)</string>
<string name=\"this_field_is_required\">Bu alan zorunludur</string>
<string name=\"correct_message\">ileti düzelt</string>
<string name=\"send_corrected_message\">Düzeltilmiş iletiyi gönder</string>
<string name=\"no_keys_just_confirm\">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.</string>
<string name=\"this_account_is_disabled\">Bu hesabı devre dışı bıraktınız</string>
<string name=\"security_error_invalid_file_access\">Güvenlik hatası: Geçersiz dosya erişimi!</string>
<string name=\"no_application_to_share_uri\">URL paylaşacak uygulama bulunamadı</string>
<string name=\"share_uri_with\">URI paylaş ile...</string>
<string name=\"welcome_text_quicksy\"><![CDATA[Quicksy, popüler XMPP sunucusu Conversations\'ın otomatik kişi keşfine sahip bir yan ürünüdür. <br><br>Telefon numarası ile kayıt olursunuz ve Quicksy -adres defterinizdeki numaraları baz alarak- otomatik olarak size olası yeni kişiler önerir.<br><br>Kayıt olarak <a href="https://quicksy.im/#privacy">gizlilik sözleşmemizi</a> onaylamış oluyorsunuz.]]></string>
<string name="notify_on_all_messages">Tüm iletilerde uyar</string>
<string name="notify_only_when_highlighted">Yalnızca bahsedilğinde haber ver</string>
<string name="notify_never">Uyarılar devre dışı</string>
<string name="notify_paused">Uyarılar geçici olarak durduruldu</string>
<string name="pref_picture_compression">Görüntü sıkıştırma</string>
<string name="pref_picture_compression_summary">İ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.</string>
<string name="always">Her zaman</string>
<string name="large_images_only">Sadece büyük resimler</string>
<string name="battery_optimizations_enabled">Pil optimizasyonu devrede</string>
<string name="battery_optimizations_enabled_explained">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.</string>
<string name="battery_optimizations_enabled_dialog">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.</string>
<string name="disable">Devre dışı</string>
<string name="selection_too_large">Seçilen alan çok büyük</string>
<string name="no_accounts">(Etkin hesap bulunmuyor)</string>
<string name="this_field_is_required">Bu alan zorunludur</string>
<string name="correct_message">ileti düzelt</string>
<string name="send_corrected_message">Düzeltilmiş iletiyi gönder</string>
<string name="no_keys_just_confirm">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.</string>
<string name="this_account_is_disabled">Bu hesabı devre dışı bıraktınız</string>
<string name="security_error_invalid_file_access">Güvenlik hatası: Geçersiz dosya erişimi!</string>
<string name="no_application_to_share_uri">URL paylaşacak uygulama bulunamadı</string>
<string name="share_uri_with">URI paylaş ile...</string>
<string name="welcome_text_quicksy"><![CDATA[Quicksy, popüler XMPP sunucusu Conversations\'ın otomatik kişi keşfine sahip bir yan ürünüdür. <br><br>Telefon numarası ile kayıt olursunuz ve Quicksy -adres defterinizdeki numaraları baz alarak- otomatik olarak size olası yeni kişiler önerir.<br><br>Kayıt olarak <a href="https://quicksy.im/#privacy">gizlilik sözleşmemizi</a> onaylamış oluyorsunuz.]]></string>
<string name="agree_and_continue">Kabul et ve devam et</string>
<string name="magic_create_text">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.</string>
<string name="your_full_jid_will_be">Tam XMPP adresiniz %s olacak</string>
<string name="create_account">Hesap Oluştur</string>
<string name="use_own_provider">Kendi sağlayıcımı kullan</string>
<string name="pick_your_username">Kullanıcı adınızı seçin</string>
<string name="pref_manually_change_presence">Mevcudiyet durumunu elle yönet</string>
<string name="pref_manually_change_presence_summary">Durumunuzu düzenlerken mevcudiyetinizi kaydedin</string>
<string name="status_message">Durum iletisi</string>
<string name="presence_chat">Konuşmak için uygun</string>
<string name="presence_online">Çevrim içi</string>
@ -372,16 +570,23 @@
<string name="registration_please_wait">Hesap oluşturulamadı: Sonra yeniden deneyin</string>
<string name="registration_password_too_weak">Kayıt Başarısız: Parola çok zayıf</string>
<string name="choose_participants">Katılımcıları seç</string>
<string name="creating_conference">Grup konuşması oluşturuluyor...</string>
<string name="invite_again">Yeniden davet et</string>
<string name="gp_disable">Devre dışı bırak</string>
<string name="gp_short">Kısa</string>
<string name="gp_medium">Orta</string>
<string name="gp_long">Uzun</string>
<string name="pref_broadcast_last_activity">Kullanımı yayınla</string>
<string name="pref_broadcast_last_activity_summary">Kişiler Conversations\'ı kullandığınız zaman bundan haberdar olur.</string>
<string name="pref_privacy">Gizlilik</string>
<string name="pref_theme_options">Gövde</string>
<string name="pref_theme_options_summary">Renk paletini seçin</string>
<string name="pref_theme_light">ık gövde</string>
<string name="pref_theme_dark">Koyu gövde</string>
<string name="unable_to_connect_to_keychain">OpenKeychain\'e bağlanılamıyor</string>
<string name="pref_theme_automatic">Otomatik</string>
<string name="pref_theme_light">Aydınlık</string>
<string name="pref_theme_dark">Karanlık</string>
<string name="pref_use_green_background">Yeşil arka plan</string>
<string name="pref_use_green_background_summary">Gelen iletiler için yeşil arka plan kullan</string>
<string name="unable_to_connect_to_keychain">OpenKeychain\'e bağlanılamadı</string>
<string name="this_device_is_no_longer_in_use">Bu aygıt artık kullanılmıyor</string>
<string name="type_pc">Bilgisayar</string>
<string name="type_phone">Mobil telefon</string>
@ -389,20 +594,29 @@
<string name="type_web">Web tarayıcı</string>
<string name="type_console">Konsol</string>
<string name="payment_required">Ödeme gerekli</string>
<string name="missing_internet_permission">Internet kullanıma izin ver</string>
<string name="me">Ben</string>
<string name="contact_asks_for_presence_subscription">Kişi sizi eklemek istiyor</string>
<string name="allow">İzin ver</string>
<string name="no_permission_to_access_x">%s e erişim hakkınız yok</string>
<string name="remote_server_not_found">Uzak sunucu bulunamadı</string>
<string name="remote_server_timeout">Uzak sunucu zaman aşımına uğradı</string>
<string name="unable_to_update_account">Hesap güncellenemedi</string>
<string name="report_jid_as_spammer">Bu XMPP adresini spam mesajlardan dolayı rapor et</string>
<string name="pref_delete_omemo_identities">OMEMO kimliğini sil</string>
<string name="pref_delete_omemo_identities_summary">OMEMO anahtarını yeniden oluştur. Tüm kişilerinizin sizi yeniden doğrulaması gerekecek. Bunu yalnızca son çare olarak kullanın.</string>
<string name="delete_selected_keys">Seçilen anahtarları sil</string>
<string name="error_publish_avatar_offline">Avatarınızı yayımlamak için bağlı olmalısınız.</string>
<string name="show_error_message">Hata iletisini göster</string>
<string name="error_message">Hata İletisi</string>
<string name="data_saver_enabled">Veri tasarrufu etkin</string>
<string name="data_saver_enabled_explained">İş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.</string>
<string name="device_does_not_support_data_saver">Aygıtınız Conversations için Veri tasarrufunu devre dışı bırakmayı desteklemiyor</string>
<string name="error_unable_to_create_temporary_file">Geçici dosya oluşturulamadı</string>
<string name="this_device_has_been_verified">Bu aygıt doğrulandı</string>
<string name="copy_fingerprint">Parmak izini kopyala</string>
<string name="all_omemo_keys_have_been_verified">Sahip olduğunuz bütün OMEMO anahtarlarını doğruladınız</string>
<string name="barcode_does_not_contain_fingerprints_for_this_conversation">Barkod bu konuşmanın parmak izlerlerini içermiyor</string>
<string name="verified_fingerprints">Doğrulanmış parmak izleri</string>
<string name="use_camera_icon_to_scan_barcode">Bir kişinin barkodunu taramak için kamerayı kullan</string>
<string name="please_wait_for_keys_to_be_fetched">Anahtarların alınması için lütfen bekle</string>
@ -410,21 +624,354 @@
<string name="share_as_uri">XMPP URI\'si olarak paylaş</string>
<string name="share_as_http">HTTP bağlantısı olarak paylaş</string>
<string name="pref_blind_trust_before_verification">Doğrulamadan Önce Kör Güven</string>
<string name="pref_blind_trust_before_verification_summary">Doğrulanmamış kişilerin tüm yani aygıtlarına güven, ama doğrulanmış kişilerden aygıtlarını onaylamalarını iste.</string>
<string name="blindly_trusted_omemo_keys">OMEMO anahtarlarına körlemisne güvenildi, yani bu kişi bir başkası olabilir veya biri konuşmayı dinleyebilir.</string>
<string name="not_trusted">Güvenilmeyen</string>
<string name="invalid_barcode">Geçersiz 2D barkod</string>
<string name="pref_clean_cache_summary">Önbellek dizinini temizle (Kamera uygulamasının kullandığı)</string>
<string name="pref_clean_cache">Önbelleği temizle</string>
<string name="pref_clean_private_storage">Özel depolama alanını temizle</string>
<string name="pref_clean_private_storage_summary">Dosyaların tutulduğu özel depolama alanını temizle (Sunucu üzerinden tekrar indirilebilir)</string>
<string name="i_followed_this_link_from_a_trusted_source">Bu bağlantıyı güvenilir bir kaynaktan takip ettim</string>
<string name="verifying_omemo_keys_trusted_source">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.</string>
<string name="verify_omemo_keys">OMEMO anahtarlarını doğrula</string>
<string name="show_inactive_devices">Aktif olmayanları göster</string>
<string name="hide_inactive_devices">Aktif olmayanları sakla</string>
<string name="distrust_omemo_key">Güvensiz aygıt</string>
<string name="distrust_omemo_key_text">Bu cihazın doğrulamasını kaldırmak istediğinizden emin misiniz? \ Bu cihaz ve cihazdan gelen mesajlar güvenilmez olarak işaretlenecektir.</string>
<plurals name="seconds">
<item quantity="one">%d saniye</item>
<item quantity="other">%d saniye</item>
</plurals>
<plurals name="minutes">
<item quantity="one">%d dakika</item>
<item quantity="other">%d dakika</item>
</plurals>
<plurals name="hours">
<item quantity="one">%d saat</item>
<item quantity="other">%d saat</item>
</plurals>
<plurals name="days">
<item quantity="one">%d gün</item>
<item quantity="other">%d gün</item>
</plurals>
<plurals name="weeks">
<item quantity="one">%d hafta</item>
<item quantity="other">%d hafta</item>
</plurals>
<plurals name="months">
<item quantity="one">%d ay</item>
<item quantity="other">%d ay</item>
</plurals>
<string name="pref_automatically_delete_messages">Otomatik ileti silmek</string>
<string name="pref_automatically_delete_messages_description">Bu cihazdan, ayarlanmış zaman aralığından eski olan mesajları otomatik olarak silin.</string>
<string name="encrypting_message">İletiyi şifrelemek</string>
<string name="not_fetching_history_retention_period">Yerel saklama süresi nedeniyle ileti getirilmiyor.</string>
<string name="transcoding_video">Video sıkıştırılıyor</string>
<string name="corresponding_conversations_closed">Konuşma sonlandı</string>
<string name="contact_blocked_past_tense">Kişi engellendi.</string>
<string name="pref_notifications_from_strangers">Yabancılardan bildirimler</string>
<string name="pref_notifications_from_strangers_summary">Yabancılardan alınan ileti ve aramaları bildir.</string>
<string name="received_message_from_stranger">Yabancıdan alınmış ileti</string>
<string name="block_stranger">Yabancıyı blokla</string>
<string name="block_entire_domain">Bütün alan adını engelle</string>
<string name="online_right_now">Şu anda çevrimiçi</string>
<string name="retry_decryption">Tekrar şifrelemeyi dene</string>
<string name="session_failure">Oturum başarısız</string>
<string name="sasl_downgrade">SASL mekanizması downgrade edildi</string>
<string name="account_status_regis_web">Sunucu web sitesinden oturum açılmasını istiyor</string>
<string name="open_website">ık web sitesi</string>
<string name="application_found_to_open_website">Web sitesini aç</string>
<string name="pref_headsup_notifications">Uyarı bildirimleri</string>
<string name="pref_headsup_notifications_summary">Uyarı bildirimlerini göster</string>
<string name="today">Bugün</string>
<string name="yesterday">Dün</string>
<string name="pref_validate_hostname">Sunucu adını DNSSEC ile doğrula</string>
<string name="pref_validate_hostname_summary">Doğrulanmış sunucu adına sahip sunucu sertifikaları onaylanmış kabul edilir</string>
<string name="certificate_does_not_contain_jid">Sertifika bir XMPP adresi içermiyor</string>
<string name="server_info_partial">kısmi</string>
<string name="attach_record_video">Video kaydet</string>
<string name="copy_to_clipboard">Panoya kopyala</string>
<string name="message_copied_to_clipboard">İleti panoya kopyalandı</string>
<string name="message">İleti</string>
<string name="private_messages_are_disabled">Özel iletiler devre dışı bırakıldı</string>
<string name="huawei_protected_apps">Korunan uygulamalar</string>
<string name="huawei_protected_apps_summary">Ekranınız kapalıyken bile bildirim almak için Conversations\'ı korunan uygulamalara eklemelisiniz.</string>
<string name="mtm_accept_cert">Bilinmeyen sertifikayı kabul et?</string>
<string name="mtm_trust_anchor">Sunucu sertifikası bilinen bir Sertifika Yetkilisi tarafından imzalanmamış.</string>
<string name="mtm_accept_servername">Uyuşmayan Sunucu isimlerini kabul et?</string>
<string name="mtm_hostname_mismatch">Sunucu \"%s\" olarak doğrulayamad. Bu sertifika sadece bunun için geçerlidir:</string>
<string name="mtm_connect_anyway">Yine de bağlanmak istiyor musunuz?</string>
<string name="mtm_cert_details">Sertifika detayları:</string>
<string name="once">Bir kez</string>
<string name="qr_code_scanner_needs_access_to_camera">QR kod tarayıcısın kameraya erişmesi gerek</string>
<string name="pref_scroll_to_bottom">En alta in</string>
<string name="pref_scroll_to_bottom_summary">İleti gönderdikten sonra alta in</string>
<string name="edit_status_message_title">Durum mesajını düzenle</string>
<string name="edit_status_message">Durum mesajını düzenle</string>
<string name="disable_encryption">Şifrelemeyi devre dışı bırak</string>
<string name="error_trustkey_general">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.</string>
<string name="error_trustkey_device_list">Aygıt listesi alınamadı</string>
<string name="error_trustkey_bundle">Şifreleme anahtarları alınamadı</string>
<string name="error_trustkey_hint_mutual">İpucu: Kimi durumlarda bu sorun, birbirinizi kişi listenize eklemenizle çözülebilir.</string>
<string name="disable_encryption_message">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.</string>
<string name="disable_now">Şimdi devre dışı bırak</string>
<string name="draft">Taslak:</string>
<string name="pref_omemo_setting">OMEMO Şifrelemesi</string>
<string name="pref_omemo_setting_summary_always">Bire bir ve grup konuşmalarında her zaman OMEMO kullanılacak.</string>
<string name="pref_omemo_setting_summary_default_on">Yeni konuşmalarda OMEMO varsayılan olarak kullanılacak.</string>
<string name="pref_omemo_setting_summary_default_off">Özellikle yeni konuşmalarda OMEMO aktif hale getirilecek.</string>
<string name="create_shortcut">Kısayol oluştur</string>
<string name="pref_font_size">Yazı tipi boyutu</string>
<string name="pref_font_size_summary">Uygulamaya kıyasla kullanılan yazı tipi boyutu.</string>
<string name="default_on">Varsayılan olarak aktif</string>
<string name="default_off">Varsayılan olarak devre dışı</string>
<string name="small">Küçük</string>
<string name="medium">Orta</string>
<string name="large">Büyük</string>
<string name="not_encrypted_for_this_device">İleti bu cihaz için şifrelenmedi</string>
<string name="omemo_decryption_failed">OMEMO mesajı çözümlenemedi</string>
<string name="undo">geri al</string>
<string name="location_disabled">Konum paylaşımı devre dışı bırakıldı</string>
<string name="action_fix_to_location">Konumu sabitle</string>
<string name="action_unfix_from_location">Konumu ayır</string>
<string name="action_copy_location">Konumu Kopyala</string>
<string name="action_share_location">Konumu paylaş</string>
<string name="action_directions">Yol tarifi</string>
<string name="title_activity_share_location">Konumu paylaş</string>
<string name="title_activity_show_location">Konumu göster</string>
<string name="share">Paylaş</string>
<string name="unable_to_start_recording">Kayıt başlatılamadı</string>
<string name="please_wait">Lütfen bekleyin...</string>
<string name="no_microphone_permission">Conversations\'ın mikrofon erişimine izin ver</string>
<string name="search_messages">İleti ara</string>
<string name="gif">GIF</string>
<string name="view_conversation">Konuşma görüntüle</string>
<string name="pref_use_share_location_plugin">Konum Eklentisini Paylaş</string>
<string name="pref_use_share_location_plugin_summary">Varolan harita yerine Konum Eklentisini Paylaş\'ı kullan</string>
<string name="copy_link">Web adresini kopyala</string>
<string name="copy_jabber_id">XMPP adresini kopyala</string>
<string name="p1_s3_filetransfer">S3 için HTTP Dosya Paylaşımı</string>
<string name="pref_start_search">Doğrudan arama</string>
<string name="pref_start_search_summary">\'Konuşma Başlat\" ekranında klavyeyi aç ve arama kısmına imleci getir</string>
<string name="group_chat_avatar">Grup konuşması avatarı</string>
<string name="host_does_not_support_group_chat_avatars">Yönetici grup konuşması avatarlarını desteklemiyor</string>
<string name="only_the_owner_can_change_group_chat_avatar">Yalnızca yönetici grup konuşması avatarını değiştirebilir</string>
<string name="contact_name">Kişi ismi</string>
<string name="nickname">Rumuz</string>
<string name="group_chat_name">İsim</string>
<string name="providing_a_name_is_optional">İsim vermek isteğe bağlıdır</string>
<string name="create_dialog_group_chat_name">Grup konuşması ismi</string>
<string name="conference_destroyed">Bu grup konuşması yokedildi</string>
<string name="unable_to_save_recording">Kayıt kaydedilemedi</string>
<string name="foreground_service_channel_name">Ön planda çalışması</string>
<string name="foreground_service_channel_description">Bu bildirim kategorisi Conversations\'ın çalıştığını sürekli belirtmekte kullanmaktadır.</string>
<string name="notification_group_status_information">Durum bilgisi</string>
<string name="error_channel_name">Bağlantı Sorunları</string>
<string name="error_channel_description">Bu bildirim kategorisi, bir hesaba bağlanmakta sorun olduğunu belirtmekte kullanılır</string>
<string name="notification_group_messages">İletiler</string>
<string name="notification_group_calls">Aramalar</string>
<string name="messages_channel_name">İletiler</string>
<string name="incoming_calls_channel_name">Gelen aramalar</string>
<string name="ongoing_calls_channel_name">Yapılan aramalar</string>
<string name="silent_messages_channel_name">Sessiz iletiler</string>
<string name="silent_messages_channel_description">Bu bildirim grubu, bildirimlerin herhangi bir ses çıkarmaması gerektiğini belirtmekte kullanılır. Mesela başka bir cihazda aktif olunduğunda (Mühlet)</string>
<string name="delivery_failed_channel_name">Başarısız gönderiler</string>
<string name="pref_message_notification_settings">İleti bildirim ayarları</string>
<string name="pref_incoming_call_notification_settings">Gelen arama bildirimleri ayarları</string>
<string name="pref_more_notification_settings_summary">Önem, Ses, Titreş</string>
<string name="video_compression_channel_name">Video sıkıştırma</string>
<string name="view_media">Medyayı görüntüle</string>
<string name="group_chat_members">Katılımcılar</string>
<string name="media_browser">Medya tarayıcısı</string>
<string name="security_violation_not_attaching_file">Dosya güvenlik ihlalinden dolayı dahil edilmedi</string>
<string name="pref_video_compression">Video kalitesi</string>
<string name="pref_video_compression_summary">Daha düşük kalite, daha ufak dosya anlamına gelir</string>
<string name="video_360p">Orta (360P)</string>
<string name="video_720p">Yüksek (720p)</string>
<string name="cancelled">iptal edildi</string>
<string name="already_drafting_message">Zaten taslak halinde bir iletiniz var</string>
<string name="feature_not_implemented">Özellik uygulanmadı </string>
<string name="invalid_country_code">Geçersiz ülke kodu</string>
<string name="choose_a_country">Bir ülke seçin</string>
<string name="phone_number">telefon numarası</string>
<string name="verify_your_phone_number">Telefon numaranızı doğrulayın</string>
<string name="enter_country_code_and_phone_number">Quicksy, telefon numaranızı doğrulamak için bir SMS iletisi yollayacak (operatör fiyatlandırmaları uygulanabilir). Ülke kodunuzu ve telefon numaranızı giriniz:</string>
<string name="we_will_be_verifying"><![CDATA[Eğer uygunsa<br/><br/><b>%s</b><br/><br/> telefon numarasını doğrulayacağız. Bu numara doğru mudur, yoksa numarayı değiştirmek mi istersiniz?]]></string>
<string name="not_a_valid_phone_number">%s geçerli bir telefon numarası değil.</string>
<string name="please_enter_your_phone_number">Lütfen telefon numaranızı girin.</string>
<string name="search_countries">Ülkelerde ara</string>
<string name="verify_x">%s doğrula</string>
<string name="we_have_sent_you_an_sms_to_x"><![CDATA[<b>%s</b> telefonunuza bir SMS gönderdik.]]></string>
<string name="we_have_sent_you_another_sms">Size 6 haneli kodun olduğu başka bir SMS gönderdik.</string>
<string name="please_enter_pin_below">Lüfen aşağıya 6 haneli kodu girin.</string>
<string name="resend_sms">Tekrar sms gönder</string>
<string name="resend_sms_in">Tekrar sms gönder (%s)</string>
<string name="wait_x">Lütfen bekleyin (%s)</string>
<string name="back">geri</string>
<string name="possible_pin">Olası kod, otomatik olarak panodan yapıştırıldı</string>
<string name="please_enter_pin">Lütfen 6 haneli kodu girin.</string>
<string name="abort_registration_procedure">Kayıt sürecini iptal etmek istediğinizden emin misiniz?</string>
<string name="yes">Evet</string>
<string name="no">Hayır</string>
<string name="verifying">Doğrulanıyor...</string>
<string name="requesting_sms">SMS talep ediliyor...</string>
<string name="incorrect_pin">Girdiğiniz kod yanlış</string>
<string name="pin_expired">Girdiğiniz kodun tarihi geçmiş</string>
<string name="unknown_api_error_network">Bilinmeyen ağ hatası</string>
<string name="unknown_api_error_response">Sunucudan bilinmeyen cevap</string>
<string name="unable_to_connect_to_server">Sunucuya bağlanılamadı</string>
<string name="unable_to_establish_secure_connection">Güvenli bağlantı oluşturulamadı</string>
<string name="unable_to_find_server">Sunucu bulunamadı</string>
<string name="something_went_wrong_processing_your_request">Talebinizin işlenmesinde bir hata meydana geldi</string>
<string name="invalid_user_input">Geçersiz kullanıcı girişi</string>
<string name="temporarily_unavailable">Geçici olarak ulaşılamıyor. Daha sonra tekrar deneyiniz.</string>
<string name="no_network_connection">Ağ bağlantısı yok</string>
<string name="try_again_in_x">Lütfen %s içerisinde tekrar deneyiniz.</string>
<string name="rate_limited">Sınırlandınız</string>
<string name="too_many_attempts">Çok fazla girişim</string>
<string name="the_app_is_out_of_date">Bu uygulamamının tarihi geçmiş bir versiyonunu kullanıyorsunuz.</string>
<string name="update">Güncelle</string>
<string name="logged_in_with_another_device">Bu telefon numarası şu anda başka bir cihazla giriş yapmış durumda.</string>
<string name="enter_your_name_instructions">Adres defterlerinde sizin kim olduğunuzu bilmeyen kişilerin sizi tanıması için lütfen isminizi girin.</string>
<string name="your_name">Adınız</string>
<string name="enter_your_name">Adınızı girin</string>
<string name="no_name_set_instructions">Adınızı belirlemek için düzenle tuşunu kullanın</string>
<string name="reject_request">Talebi reddet</string>
<string name="install_orbot">Orbot\'u yükle</string>
<string name="start_orbot">Orbot\'u başlat</string>
<string name="no_market_app_installed">Herhangi bir mağaza uygulaması yüklenmedi</string>
<string name="group_chat_will_make_your_jabber_id_public">Bu kanal XMPP adresinizi herkese açık hale getirecek.</string>
<string name="ebook">e-kitap</string>
<string name="video_original">Orijinal (sıkıştırılmamış)</string>
<string name="open_with">Şununla aç...</string>
<string name="set_profile_picture">Conversations profil resmi</string>
<string name="choose_account">Hesap seç</string>
<string name="restore_backup">Yedekleri yükle</string>
<string name="restore">Geri getir</string>
<string name="enter_password_to_restore"> Yedekleri geri getirmek için %s hesabının şifrenizi girin.</string>
<string name="restore_warning">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.</string>
<string name="unable_to_restore_backup">Yedekler geri yüklenemedi</string>
<string name="unable_to_decrypt_backup">Yedekleme çözülemedi. Şifre doğru mu?</string>
<string name="backup_channel_name">Yedekleme &amp; Geri yükle</string>
<string name="enter_jabber_id">XMPP adresini girin</string>
<string name="create_group_chat">Grup konuşması oluştur</string>
<string name="join_public_channel">Ortak kanala katıl</string>
<string name="create_private_group_chat">Özel grup konuşması oluştur</string>
<string name="create_public_channel">Ortak kanal oluştur</string>
<string name="create_dialog_channel_name">Kanal ismi</string>
<string name="xmpp_address">XMPP adresi</string>
<string name="please_enter_name">Lütfen kanal için bir isim belirleyin</string>
<string name="please_enter_xmpp_address">Lütfen bir XMPP adresi sağlayın</string>
<string name="this_is_an_xmpp_address">Bu bir XMPP adresi. Lütfen bir isim belirleyin.</string>
<string name="creating_channel">Ortak kanal oluşturuluyor...</string>
<string name="channel_already_exists">Bu kanal zaten var</string>
<string name="joined_an_existing_channel">Varolan bir kanala katıldınız</string>
<string name="unable_to_set_channel_configuration">Kanal ayarları kaydedilemedi</string>
<string name="allow_participants_to_edit_subject">Herhangi birinin başlığı düzenlemesine izin ver</string>
<string name="allow_participants_to_invite_others">Herhangi birinin davet etmesine izin ver</string>
<string name="anyone_can_edit_subject">Herhangi biri başlığı düzenleyebilir.</string>
<string name="owners_can_edit_subject">Yöneticiler başlığı düzenleyebilir</string>
<string name="admins_can_edit_subject">Yöneticiler başlığı düzenleyebilir</string>
<string name="owners_can_invite_others">Yöneticiler başkalarını davet edebilir.</string>
<string name="anyone_can_invite_others">Herhangi biri başkalarını davet edebilir.</string>
<string name="jabber_ids_are_visible_to_admins">XMPP adresleri yöneticelere görünür.</string>
<string name="jabber_ids_are_visible_to_anyone">XMPP adresleri herkese görünür.</string>
<string name="no_users_hint_channel">Bu ortak kanalın herhangi bir katılımcısı yok. Kişilerinizi davat edin veya paylaş düğmesi ile XMPP adresini paylaşın.</string>
<string name="no_users_hint_group_chat">Bu özel grup konuşmasının herhangi bir katılımcısı yok.</string>
<string name="manage_permission">İmtiyazları düzenle</string>
<string name="search_participants">Katılımcı ara</string>
<string name="file_too_large">Dosya çok büyük</string>
<string name="attach">Ekle</string>
<string name="discover_channels">Kanal keşfet</string>
<string name="search_channels">Kanal ara</string>
<string name="channel_discovery_opt_in_title">Olası gizlilik ihlali!</string>
<string name="channel_discover_opt_in_message"><![CDATA[Kanal keşfetme özelliği<a href="https://search.jabber.network">search.jabber.network</a> isimli bir üçüncü parti hizmeti kullanıyor.<br><br>Bu özelliği kullandığınız zaman IP adresiniz ve arama tercihleriniz bu hizmete aktarılacak. Daha fazla bilgi için <a href="https://search.jabber.network/privacy">Gizlilik Politikasını</a> inceleyiniz.]]></string>
<string name="i_already_have_an_account">Zaten bir hesabım var</string>
<string name="add_existing_account">Varolan bir hesap ekle</string>
<string name="register_new_account">Yeni hesap oluştur</string>
<string name="this_looks_like_a_domain">Bu bir alan adı adresine benziyor</string>
<string name="add_anway">Yine de ekle</string>
<string name="this_looks_like_channel">Bu bir kanal adresine benziyor</string>
<string name="share_backup_files">Yedekleme dosyalarını paylaş</string>
<string name="conversations_backup">Conversations yedeklemesi</string>
<string name="event">Faaliyet</string>
<string name="open_backup">Yedeklemeyi aç</string>
<string name="not_a_backup_file">Seçtioiniz dosya bir Conversations yedekleme dosyası değildir</string>
<string name="account_already_setup">Bu hesap zaten kurulu vaziyette</string>
<string name="please_enter_password">Lütfen bu hesabın şifresini girin</string>
<string name="unable_to_perform_this_action">Eylem gerçekleştirilemedi</string>
<string name="open_join_dialog">Ortak kanala katılınıyor</string>
<string name="sharing_application_not_grant_permission">Paylaşımda bulunan uygulama dosya erişimi için yetki sağlamıyor</string>
<string name="group_chats_and_channels"><![CDATA[Grup Konuşmaları & Kanallar]]></string>
<string name="jabber_network">jabber.network</string>
<string name="local_server">Yerel sunucu</string>
<string name="pref_channel_discovery_summary">XMPP ortamının genelinde daha iyi öneriler almak için çoğu kullanıcı \'jabber.network\'\'ü seçmelidir.</string>
<string name="pref_channel_discovery">Kanal keşif yöntemi</string>
<string name="backup">Yedekle</string>
<string name="category_about">Hakkında</string>
<string name="please_enable_an_account">Lütfen bir hesabı etkinleştirin</string>
<string name="make_call">Arama yap</string>
<string name="rtp_state_incoming_call">Gelen arama</string>
<string name="rtp_state_incoming_video_call">Gelen görüntülü arama</string>
<string name="rtp_state_connecting">Bağlanıyor</string>
<string name="rtp_state_connected">Bağlandı</string>
<string name="rtp_state_accepting_call">Arama kabül ediliyor</string>
<string name="rtp_state_ending_call">Arama sonlandırılıyor</string>
<string name="answer_call">Cevapla</string>
<string name="dismiss_call">Reddet</string>
<string name="rtp_state_finding_device">Cihazlar keşfediliyor</string>
<string name="rtp_state_ringing">Çaldırılıyor</string>
<string name="rtp_state_declined_or_busy">Meşgul</string>
<string name="rtp_state_connectivity_error">Arama bağlanılamadı</string>
<string name="rtp_state_connectivity_lost_error">Bağlantı kesildi</string>
<string name="rtp_state_retracted">Geri çekilmiş arama</string>
<string name="rtp_state_application_failure">Uygulama hatası</string>
<string name="hang_up">Çağrıyı sonlandır</string>
<string name="ongoing_call">Devam eden arama</string>
<string name="ongoing_video_call">Deaam eden görüntülü arama</string>
<string name="disable_tor_to_make_call">Arama yapmak için Tor\'u devre dışı bırak</string>
<string name="incoming_call">Gelen arama</string>
<string name="incoming_call_duration">Gelen arama. %s</string>
<string name="outgoing_call">Yapılan arama</string>
<string name="outgoing_call_duration">Yapılan arama. %s</string>
<string name="missed_call">Cevapsız arama</string>
<string name="audio_call">Sesli arama</string>
<string name="video_call">Görüntülü arama</string>
<string name="help">Yardım</string>
<string name="switch_to_conversation">Konuşmaya geç</string>
<string name="microphone_unavailable">Mikrofonunuza erişilemiyor</string>
<string name="only_one_call_at_a_time">Bir seferde yalnızca tek bir aramanız olabilir.</string>
<string name="return_to_ongoing_call">Devam eden aramaya dön</string>
<string name="could_not_switch_camera">Kamera açılamadı</string>
<string name="add_to_favorites">En başa iliştir</string>
<string name="remove_from_favorites">En baştan kaldır</string>
<string name="gpx_track">GPX izi</string>
<string name="could_not_correct_message">İleti düzeltilemedi</string>
<string name="search_all_conversations">Bütün konuşmalar</string>
<string name="search_this_conversation">Bu konuşma</string>
<string name="your_avatar">Avatarınız</string>
<string name="avatar_for_x">%s avatarı</string>
<string name="encrypted_with_omemo">OMEMO ile şifrelendi</string>
<string name="encrypted_with_openpgp">OpenPGP ile şifrelendi</string>
<string name="not_encrypted">Şifrelenmedi</string>
<string name="exit">Çıkış</string>
<string name="record_voice_mail">Sesli ileti kaydet</string>
<string name="play_audio">Sesi oynat</string>
<string name="pause_audio">Sesi durdur</string>
<string name="add_contact_or_create_or_join_group_chat">Kişi ekle, grup konuşması oluştur veya katıl, veya kanal keşfet</string>
<plurals name="view_users">
<item quantity="one">%1$d</item>
<item quantity="other">%1$d Katılımcılarını görüntüle</item>
</plurals>
<plurals name="some_messages_could_not_be_delivered">
<item quantity="one">aaa </item>
<item quantity="other">Bağzı iletiler gönderilemedi</item>
</plurals>
<string name="failed_deliveries">Başarısız gönderiler</string>
<string name="more_options">Daha fazla seçenek</string>
<string name="no_application_found">Herhangi bir uygulama bulunamadı</string>
<string name="invite_to_app">Conversations\'a davet et</string>
<string name="unable_to_parse_invite">Davet iletilemedi</string>
<string name="server_does_not_support_easy_onboarding_invites">Sunucu, davet oluşturulmasını desteklemiyor</string>
</resources>

View File

@ -1,6 +1,10 @@
<resources>
<!-- 384dp is the screen width of the Nexus 4. Something like a Moto G is smaller but a Nexus 5X is larger -->
<!-- https://material.io/devices/ -->
<dimen name="in_call_fab_margin">12dp</dimen>
<dimen name="in_call_fab_margin_center">16dp</dimen>
<dimen name="fineprint_size">12sp</dimen>
<dimen name="audio_player_width">288dp</dimen>
<dimen name="image_preview_width">288dp</dimen>

View File

@ -4,6 +4,7 @@
<string name="action_add">新对话</string>
<string name="action_accounts">管理账户</string>
<string name="action_account">管理账户</string>
<string name="action_end_conversation">关闭 Conversation</string>
<string name="action_contact_details">联系人详情</string>
<string name="action_muc_details">群聊详情</string>
<string name="channel_details">频道详情</string>
@ -744,6 +745,7 @@
<string name="ongoing_calls_channel_name">正在进行的通话</string>
<string name="silent_messages_channel_name">无声消息</string>
<string name="silent_messages_channel_description">此通知组用于显示不应触发任何声音的通知。 例如,当在另一个设备上激活时(宽限期)。</string>
<string name="delivery_failed_channel_name">发送失败</string>
<string name="pref_message_notification_settings">消息通知设置</string>
<string name="pref_incoming_call_notification_settings">来电通知设置</string>
<string name="pref_more_notification_settings_summary">重要程度、声音、振动</string>
@ -911,9 +913,32 @@
<string name="only_one_call_at_a_time">只能同时打一通电话</string>
<string name="return_to_ongoing_call">返回正在进行的通话</string>
<string name="could_not_switch_camera">无法切换摄像头</string>
<string name="add_to_favorites">置顶</string>
<string name="remove_from_favorites">取消置顶</string>
<string name="gpx_track">GPX轨迹</string>
<string name="could_not_correct_message">无法更正消息</string>
<string name="search_all_conversations">所有会话</string>
<string name="search_this_conversation">该会话</string>
<string name="your_avatar">你的头像</string>
<string name="avatar_for_x">%s的头像</string>
<string name="encrypted_with_omemo">用OMEMO加密</string>
<string name="encrypted_with_openpgp">用OpenPGP加密</string>
<string name="not_encrypted">未加密</string>
<string name="exit">退出</string>
<string name="record_voice_mail">语音邮件录音</string>
<string name="play_audio">播放音频</string>
<string name="pause_audio">暂停音频播放</string>
<string name="add_contact_or_create_or_join_group_chat">添加联系人、创建或加入群组会话,或发现频道</string>
<plurals name="view_users">
<item quantity="other">查看%1$d成员</item>
</plurals>
<plurals name="some_messages_could_not_be_delivered">
<item quantity="other">一些消息无法发送</item>
</plurals>
<string name="failed_deliveries">发送失败</string>
<string name="more_options">更多选项</string>
<string name="no_application_found">没有找到应用程序</string>
<string name="invite_to_app">邀请到 Conversations</string>
<string name="unable_to_parse_invite">无法解析邀请</string>
<string name="server_does_not_support_easy_onboarding_invites">服务器不支持生成邀请</string>
</resources>

View File

@ -1,5 +1,7 @@
<resources>
<!-- Default screen margins, per the Android Design guidelines. -->
<dimen name="in_call_fab_margin">8dp</dimen>
<dimen name="in_call_fab_margin_center">12dp</dimen>
<dimen name="activity_horizontal_margin">8dp</dimen>
<dimen name="activity_vertical_margin">8dp</dimen>
<dimen name="card_padding_regular">16dp</dimen>

View File

@ -949,4 +949,8 @@
</plurals>
<string name="failed_deliveries">Failed deliveries</string>
<string name="more_options">More options</string>
<string name="no_application_found">No application found</string>
<string name="invite_to_app">Invite to Conversations</string>
<string name="unable_to_parse_invite">Unable to parse invite</string>
<string name="server_does_not_support_easy_onboarding_invites">Server does not support generating invites</string>
</resources>

View File

@ -0,0 +1,9 @@
package eu.siacs.conversations.ui;
import eu.siacs.conversations.entities.Account;
public class EasyOnboardingInviteActivity {
public static void launch(Account account, XmppActivity activity) {
throw new IllegalArgumentException("Easy Onboarding is not implemented for Quicksy");
}
}

View File

@ -5,19 +5,21 @@
<string name="openkeychain_required_long">Το Quicksy χρησιμοποιεί μια τρίτη εφαρμογή που ονομάζεται <b>OpenKeychain</b> για να κρυπτογραφεί και να αποκρυπτογραφεί μηνύματα και να διαχειρίζεται τα δημόσια κλειδιά σας.\n\nΤο OpenKeychain δημοσιεύεται με την άδεια GPLv3 και είναι διαθέσιμο στο F-Droid και το Google Play.\n\n<small>(Παρακαλώ επανεκκινήστε το Quicksy αμέσως μετά.)</small></string>
<string name="contact_has_no_pgp_key">Το Quicksy αδυνατεί να κρυπτογραφήσει τα μηνύματά σας γιατί η επαφή σας δεν ανακοινώνει το δημόσιο κλειδί της.\n\n<small>Παρακαλώ ζητήστε από την επαφή σας να εγκαταστήσει το OpenPGP.</small></string>
<string name="contacts_have_no_pgp_keys">Το Quicksy αδυνατεί να κρυπτογραφήσει τα μηνύματά σας γιατί οι επαφές σας δεν ανακοινώνουν το δημόσιο κλειδί τους.\n\n<small>Παρακαλώ ζητήστε από τις επαφές σας να εγκαταστήσουν το OpenPGP.</small></string>
<string name="pref_notification_grace_period_summary">Η διάρκεια του χρόνου που το Quicksy σταματάει τη λειτουργία του καθώς ανιχνεύθηκε δραστηριόητα σε άλλη συσκευή</string>
<string name="pref_never_send_crash_summary">Στέλνοντας ίχνη στοίβας βοηθάτε την συνεχόμενη ανάπτυξη του Quicksy</string>
<string name="pref_notification_grace_period_summary">Ο χρόνος σίγασης ειδοποιήσεων του Quicksy αφότου ανιχνευθεί δραστηριότητα σε μια από τις άλλες συσκευές σας.</string>
<string name="pref_never_send_crash_summary">Στέλνοντας ίχνη στοίβας προωθείτε την συνεχόμενη ανάπτυξη του Quicksy</string>
<string name="no_storage_permission">Το Quicksy χρειάζεται πρόσβαση στον εξωτερικό αποθηκευτικό χώρο</string>
<string name="no_camera_permission">Το Quicksy χρειάζεται πρόσβαση στην φωτογραφική μηχανή</string>
<string name="battery_optimizations_enabled_explained">Η συσκευή σας χρησιμοποιεί έντονη βελτιστοποίηση στην χρήση μπαταρίας του Quicksy που μπορεί να οδηγήσει σε αργοπορημένες ειδοποιήσεις ή ακόμα και σε απώλεια μηνυμάτων.\nΠροτείνεται να την απενεργοποιήσετε.</string>
<string name="battery_optimizations_enabled_dialog">Η συσκευή σας χρησιμοποιεί έντονη βελτιστοποίηση στην χρήση μπαταρίας του Quicksy που μπορεί να οδηγήσει σε αργοπορημένες ειδοποιήσεις ή ακόμα και σε απώλεια μηνυμάτων.\nΘα σας ζητηθεί να την απενεργοποιήσετε.</string>
<string name="pref_broadcast_last_activity_summary">Επιτρέψτε στις επαφές σας να γνωρίζουν πότε χρησιμοποιείτε το Quicksy</string>
<string name="data_saver_enabled_explained">Το λειτουργικό σας σύστημα περιορίζει το Quicksy από το να συνδέεται στο Internet όταν βρίσκεται στο παρασκήνιο. Για να λαμβάνετε ειδοποιήσεις νέων μηνυμάτων πρέπει να επιτρέψετε στο Quicksy να έχει απεριόριστη πρόσβαση όταν ενεργοποιείται η μείωση χρήσης δεδομένων κινητής.\nΤο Quicksy θα προσπαθεί να περιορίσει τη χρήση δεδομένων όταν είναι δυνατό.</string>
<string name="device_does_not_support_data_saver">Η συσκευή σας δεν υποστηρίζει την απενεργοποίηση μείωσης χρήσης δεδομένων κινητής για το Quicksy.</string>
<string name="data_saver_enabled_explained">Το λειτουργικό σας σύστημα περιορίζει το Quicksy από το να συνδέεται στο Internet όταν βρίσκεται στο παρασκήνιο. Για να λαμβάνετε ειδοποιήσεις νέων μηνυμάτων πρέπει να επιτρέψετε στο Quicksy να έχει απεριόριστη πρόσβαση όταν ενεργοποιείται η μείωση χρήσης δεδομένων.\nΤο Quicksy θα προσπαθεί να περιορίσει τη χρήση δεδομένων όταν είναι δυνατό.</string>
<string name="device_does_not_support_data_saver">Η συσκευή σας δεν υποστηρίζει την απενεργοποίηση μείωσης χρήσης δεδομένων για το Quicksy.</string>
<string name="huawei_protected_apps_summary">Για να συνεχίσετε να λαμβάνετε ειδοποιήσεις, ακόμα κι όταν η οθόνη είναι σβηστή, χρειάζεται να προσθέσετε το Quicksy στον κατάλογο με τις προστατευμένες εφαρμογές.</string>
<string name="error_trustkey_general">Το Quicksy αδυνατεί να στείλει κρυπτογραφημένα μηνύματα στην επαφή %1$s. Αυτό μπορεί να συμβαίνει γιατί η επαφή σας χρησιμοποιεί παλιότερο διακομιστή ή πρόγραμμα που δε μπορεί να χειριστεί κρυπτογράφηση OMEMO.</string>
<string name="no_microphone_permission">Το Quicksy χρειάζεται πρόσβαση στο μικρόφωνο</string>
<string name="foreground_service_channel_description">Αυτή η κατηγορία ειδοποιήσεων χρησιμοποιείται για την εμφάνιση μιας μόνιμης ειδοποίησης που δείχνει πως εκτελείται το Quicksy.</string>
<string name="set_profile_picture">Φωτογραφία προφίλ του quicksy</string>
<string name="not_available_in_your_country">Το quicksy δεν είναι διαθέσιμο στην χώρα σας.</string>
<string name="set_profile_picture">Φωτογραφία προφίλ του Quicksy</string>
<string name="not_available_in_your_country">Το Quicksy δεν είναι διαθέσιμο στην χώρα σας.</string>
<string name="unable_to_verify_server_identity">Αδυναμία επαλήθευσης της ταυτότητας του διακομιστή.</string>
<string name="unknown_security_error">Άγνωστο σφάλμα ασφάλειας.</string>
<string name="timeout_while_connecting_to_server">Λήξη χρονικού ορίου κατά τη σύνδεση στον διακομιστή.</string>

View File

@ -0,0 +1,26 @@
<?xml version="1.0" encoding="utf-8"?>
<resources>
<string name="crash_report_title">Quicksy çalışmayı durdurdu</string>
<string name="crash_report_message">Çöküş raporu yollayarak Quicksy\'nin halihazırda devam eden gelişimine katkıda bulunuyorsunuz.\<b>Uyarı:</b>Çöküş raporları geliştiricilere gönderiminde XMPP hesabınız kullanılacak. </string>
<string name="openkeychain_required_long">Quicksy; iletileri şifrelemek ve herkese açık anahtarlarınızı yönetmek için<b>OpenKeychain</b> 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 <small>(Lütfen sonrasında Quicksy\'i tekrar başlatın</small></string>
<string name="contact_has_no_pgp_key">Bağlantınız ortak anahatarını paylaşmıyor olduğu için Quicksy iletilerinizi şifreliyemiyor.\n\n<small>Lütfen bağlantınızdan OpenPGP kurmasını isteyin.</small></string>
<string name="contacts_have_no_pgp_keys">Kişileriniz ortak anahtarlarını yayımlamadığı için Conversations iletilerinizi şifreleyemiyor.\n\n<small>Lütfen kişilerden OpenPGPyi ayarlamalarını isteyin.</small></string>
<string name="pref_notification_grace_period_summary">Başka bir aygıt üstünde etkinlik algılandığında Quicksy\'nin sessiz kalma süresi</string>
<string name="pref_never_send_crash_summary">Çöküş raporu göndermeniz Quicksy\'nin geliştirlmesinde katkıda bulunacaktır.</string>
<string name="no_storage_permission">Quicksy\'nin haricii depolamaya erişmesi gerekiyor</string>
<string name="no_camera_permission">Quicksy\'nin kameraya erişmesi gerekiyor</string>
<string name="battery_optimizations_enabled_explained">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.</string>
<string name="battery_optimizations_enabled_dialog">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.</string>
<string name="pref_broadcast_last_activity_summary">Tüm kişileriniz ne zaman Quicksy kullandığınızı görsün</string>
<string name="data_saver_enabled_explained">İş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.</string>
<string name="device_does_not_support_data_saver">Aygıtınız Quicksy için Veri tasarrufunu devre dışı bırakmayı desteklemiyor</string>
<string name="huawei_protected_apps_summary">Ekranınız kapalıyken bile bildirim almak için Quicksy\'i korunan uygulamalara eklemelisiniz.</string>
<string name="error_trustkey_general">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.</string>
<string name="no_microphone_permission">Quicksy\'nin mikrofona erişmesi gerekiyor</string>
<string name="foreground_service_channel_description">Bu bildirim kategorisi Quicksy\'nin çalıştığını sürekli belirtmekte kullanmaktadır.</string>
<string name="set_profile_picture">Quicksy profil resmi</string>
<string name="not_available_in_your_country">Quicksy ülkenizde kullanılamıyor.</string>
<string name="unable_to_verify_server_identity">Sunucu kimliği belirlenemiyor.</string>
<string name="unknown_security_error">Bilinmeyen güvenlik hatası.</string>
<string name="timeout_while_connecting_to_server">Sunucuya bağlanılırken zaman aşımına uğrandı.</string>
</resources>