Compare commits

...

42 Commits

Author SHA1 Message Date
B. Petersen e5695194d5 Update messenger-backend submodule. 2017-06-28 18:42:56 +02:00
B. Petersen e1c192ddd3 Changelog. 2017-06-28 18:40:41 +02:00
B. Petersen ee5e6cb125 Add deprecated export routines, for now. 2017-06-28 18:28:01 +02:00
Björn Petersen 5ca9bbff28 Update README.md 2017-06-28 12:49:08 +02:00
B. Petersen 1761335092 Add missing russian plural forms. 2017-06-27 14:03:31 +02:00
Björn Petersen b87e135b3c Update CHANGELOG.md 2017-06-26 01:20:43 +02:00
Björn Petersen c1154a87cc Update CHANGELOG.md 2017-06-23 18:29:01 +02:00
B. Petersen a683880f7e Changelog 2017-06-23 15:16:41 +02:00
B. Petersen 23acff2a87 Encrypt group chats. 2017-06-22 17:35:30 +02:00
B. Petersen 484d723c75 Cleanup chat list: As we encrypt messages, not chats, there is not need for a chat-encrypted state. 2017-06-21 12:22:38 +02:00
B. Petersen ecab439d0a Unify error icon. 2017-06-21 12:08:47 +02:00
B. Petersen d02732c16d Refactor E2EE. 2017-06-21 11:58:12 +02:00
B. Petersen f55106612c Typo 2017-06-19 21:29:01 +02:00
B. Petersen efde505eb5 Pimp lock-screen icon and text. 2017-06-19 12:57:08 +02:00
B. Petersen 7ae296dcac Use lock icon for locking the app. 2017-06-19 01:15:04 +02:00
B. Petersen 8a20f439c0 Fix french apostrophs. 2017-06-19 01:14:36 +02:00
B. Petersen 57a8251313 Merge branch 'master' of https://github.com/deltachat/deltachat-android 2017-06-19 00:51:42 +02:00
B. Petersen 6039a4e6b1 Use a lock-icon for end-to-end-encrypted messages. 2017-06-19 00:51:17 +02:00
Björn Petersen ea59519c09 Merge pull request #106 from Almtesh/patch-1
French translation
2017-06-18 20:08:02 +02:00
Gilles Émilien MOREL 84e7345607 French translation
Added new translations
Corrected my and other's mistaken translations.
2017-06-18 17:13:40 +02:00
B. Petersen 4357817faf Wording 2017-06-18 00:59:56 +02:00
B. Petersen fb4f378b86 Merge branch 'master' of https://github.com/deltachat/deltachat-android 2017-06-17 15:01:15 +02:00
B. Petersen ee081b3037 End-to-end-encrypted messages are marked by a sign beside the timestamp. 2017-06-17 15:01:06 +02:00
Dr. Tobias Quathamer 33d3d92f62 Update URLs, fix typo 2017-06-16 22:48:20 +02:00
B. Petersen 9ba8659536 Update Portuguese translation. 2017-06-15 16:53:38 +02:00
B. Petersen 3c14d32e19 Set help URL for Spanish locale to Spanish homepage. 2017-06-13 13:24:07 +02:00
B. Petersen 6cb866233b Wording 2017-06-12 10:30:08 +02:00
B. Petersen e98bffdacc Cleanup import/export interface. 2017-06-07 08:51:44 +02:00
B. Petersen 96400768b5 Make the backup task cancellable. 2017-06-06 14:10:15 +02:00
B. Petersen dd8474cecf Add backup export function. 2017-06-06 13:42:16 +02:00
B. Petersen 7b98265a2a Update Polish translation. 2017-06-05 00:40:18 +02:00
B. Petersen 03a20c26db Changelog. 2017-06-04 16:26:39 +02:00
B. Petersen fd0731c52a Update messenger-backend submodule. 2017-06-04 16:25:44 +02:00
B. Petersen 7856fb22e4 Improved video quality of short clips. 2017-06-04 16:06:45 +02:00
B. Petersen d38a4535bb Pimp settings. 2017-06-04 14:40:25 +02:00
B. Petersen 757ad7266f Simplify settings structure and avoid an additional action bar menu. 2017-06-04 11:26:00 +02:00
B. Petersen da8274de1b Add backup menu entry. 2017-06-04 02:13:01 +02:00
B. Petersen 22bd12cfd6 Improve encryption state dialog. 2017-06-04 01:44:37 +02:00
B. Petersen 6d868cb541 Changelog. 2017-06-03 00:57:49 +02:00
Björn Petersen ca2ad6fa68 Merge pull request #92 from guland2000/patch-2
Update strings.xml
2017-06-03 00:40:15 +02:00
guland2000 718dd6d1a9 Update strings.xml
374 and 375
2017-06-02 17:12:50 +02:00
guland2000 b4db0d7d70 Update strings.xml
1. Fix some error, linguistic and semantic (contextual) : strings 86,118,129,223,343,345,351 
2. and added New strings 377, 378, 379,380,381,382,383,384,385.
2017-06-02 00:58:09 +02:00
64 changed files with 513 additions and 274 deletions
+22
View File
@@ -1,10 +1,32 @@
# Delta Chat Changelog
## v0.9.2
2017-06-28
* Encrypt group chats
* Cryptographically sign messages
* Validate signatures of incoming messages ("Info" shows the state)
* Show a little lock beside end-to-end-encrypted messages with a validated signature
* If end-to-end-encryption is available on sending time, guarantee the message not to be sent without end-to-end-encryption later
* Show special characters in HTML-mails
* Help MUAs on showing chat threads
* Upgrade from Autocrypt Level 0 to Level 1; as the levels are not compatible, encryption on mixed setups does not happen
* Update Polish, Portuguese, Spanish and French translations
## v0.9.1
2017-06-04
* Profile: Improve encryption state dialog
* Improved video quality of short clips
* Make encryption-dialog localizable
* Update Russian translation
## v0.9.0
2017-06-01
* Add end-to-end-encrypting following the OpenPGP and Autocrypt standards
* Add a function to compare keys
* Profile: Add option to copy the email address to the clipboard
* Pimp GUI
## v0.1.36
+2 -2
View File
@@ -76,7 +76,7 @@ android {
}
}
defaultConfig.versionCode = 39
defaultConfig.versionCode = 41
sourceSets.main {
jniLibs.srcDir 'libs'
@@ -118,6 +118,6 @@ android {
minSdkVersion 14 // 14: Android 4.0 Ice Cream Sandwich 2011 (Telegram default), 21: Android 5.0 Lollipop 2014 (recommended for InstantRun)
targetSdkVersion 25 // 25: Nougat. CAVE: Do NOT target "Andoid O" without checking the background tasks carefully, see https://developer.android.com/preview/behavior-changes.html#back-all . As long as we target "Nougat", everything works as expected even for "Andoid O" or later
// in general, we should not change the target without reason; eg. after the switch to Nougat, the camera stops working (see https://inthecheesefactory.com/blog/how-to-share-access-to-file-with-fileprovider-on-android-nougat/en )
versionName "0.9.0" // do NOT forget to increase defaultConfig.versionCode!
versionName "0.9.2" // do NOT forget to increase defaultConfig.versionCode!
}
}
+2 -2
View File
@@ -1636,8 +1636,6 @@ LOCAL_SRC_FILES += \
./messenger-backend/src/mrchatlist.c \
./messenger-backend/src/mrcmdline.c \
./messenger-backend/src/mrcontact.c \
./messenger-backend/src/mre2ee.c \
./messenger-backend/src/mre2ee_driver_openssl.c \
./messenger-backend/src/mrimap.c \
./messenger-backend/src/mrjob.c \
./messenger-backend/src/mrkey.c \
@@ -1645,12 +1643,14 @@ LOCAL_SRC_FILES += \
./messenger-backend/src/mrloginparam.c \
./messenger-backend/src/mrmailbox.c \
./messenger-backend/src/mrmailbox_configure.c \
./messenger-backend/src/mrmailbox_e2ee.c \
./messenger-backend/src/mrmailbox_imex.c \
./messenger-backend/src/mrmailbox_log.c \
./messenger-backend/src/mrmimeparser.c \
./messenger-backend/src/mrmsg.c \
./messenger-backend/src/mrosnative.c \
./messenger-backend/src/mrparam.c \
./messenger-backend/src/mrpgp.c \
./messenger-backend/src/mrpoortext.c \
./messenger-backend/src/mrsaxparser.c \
./messenger-backend/src/mrsimplify.c \
+2 -11
View File
@@ -531,19 +531,10 @@ JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_cmdline(JNIEnv *env, jclass
}
JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_importStuff(JNIEnv *env, jclass cls, jint what, jstring dir)
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_imex(JNIEnv *env, jclass cls, jint what, jstring dir)
{
CHAR_REF(dir);
jint ret = mrmailbox_import(get_mrmailbox_t(env, cls), what, dirPtr);
CHAR_UNREF(dir);
return ret;
}
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_exportStuff(JNIEnv *env, jclass cls, jint what, jstring dir)
{
CHAR_REF(dir);
mrmailbox_export(get_mrmailbox_t(env, cls), what, dirPtr);
mrmailbox_imex(get_mrmailbox_t(env, cls), what, dirPtr, "");
CHAR_UNREF(dir);
}
@@ -93,10 +93,6 @@ public class MrChat {
/* additional functions that are not 1:1 available in the backend
**********************************************************************************************/
public int isEncrypted() {
return 0;
}
public static TLRPC.Chat chatId2chat(int id)
{
TLRPC.Chat ret = new TLRPC.Chat();
@@ -32,8 +32,6 @@ import android.app.Activity;
import android.app.DownloadManager;
import android.content.Context;
import android.content.SharedPreferences;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
import com.b44t.ui.Components.ForegroundDetector;
@@ -72,10 +70,10 @@ public class MrMailbox {
public native static String getInfo();
public native static String cmdline(String cmd);
public final static int MR_IMEX_SELF_KEYS = 0x01;
public final static int MR_EXPORT_BACKUP = 0x02;
public native static int importStuff(int what, String dir);
public native static void exportStuff(int what, String dir);
public final static int MR_IMEX_EXPORT_SELF_KEYS = 0x01;
public final static int MR_IMEX_EXPORT_BACKUP = 0x02;
public final static int MR_IMEX_IMPORT_SELF_KEYS = 0x00010000;
public native static void imex(int what, String dir);
public native static void heartbeat();
@@ -192,6 +190,8 @@ public class MrMailbox {
public final static int MR_EVENT_CONFIGURE_ENDED = 2040;
public final static int MR_EVENT_CONFIGURE_PROGRESS = 2041;
public final static int MR_EVENT_EXPORT_ENDED = 2050;
public final static int MR_EVENT_EXPORT_PROGRESS = 2051;
public final static int MR_EVENT_EXPORT_FILE_WRITTEN = 2052;
public final static int MR_EVENT_IS_ONLINE = 2080;
@@ -227,6 +227,24 @@ public class MrMailbox {
});
return 0;
case MR_EVENT_EXPORT_ENDED:
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.exportEnded, (int)data1);
}
});
return 0;
case MR_EVENT_EXPORT_PROGRESS:
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.exportProgress, (int)data1);
}
});
return 0;
case MR_EVENT_EXPORT_FILE_WRITTEN: {
final String file_name = CPtr2String(data1);
final String file_mime = CPtr2String(data2);
@@ -354,6 +372,12 @@ public class MrMailbox {
case 22: s = ApplicationLoader.applicationContext.getString(R.string.NoNetwork); break;
case 23: s = ApplicationLoader.applicationContext.getString(R.string.AttachGif); break;
case 24: s = ApplicationLoader.applicationContext.getString(R.string.EncryptedMessage); break;
case 25: s = ApplicationLoader.applicationContext.getString(R.string.EncrinfoE2E); break;
case 26: s = "<c#808080>"+ApplicationLoader.applicationContext.getString(R.string.EncrinfoE2EExplain)+"</c>"; break;
case 27: s = ApplicationLoader.applicationContext.getString(R.string.EncrinfoTransport); break;
case 28: s = ApplicationLoader.applicationContext.getString(R.string.EncrinfoNone); break;
case 29: s = "<c#808080>"+ApplicationLoader.applicationContext.getString(R.string.EncrinfoNoE2EExplain)+"</c>"; break;
case 30: s = ApplicationLoader.applicationContext.getString(R.string.EncrinfoFingerprints); break;
}
return String2CPtr(s);
@@ -152,6 +152,7 @@ public class MrMsg {
ret.flags = 0; // posible flags: MESSAGE_FLAG_HAS_FROM_ID, however, this seems to be read only
ret.out = ret.from_id==MrContact.MR_CONTACT_ID_SELF; // true=outgoing message, read eg. in MessageObject.isOutOwner()
ret.created_by_mr = true;
ret.e2ee = getParamInt('c', 0)!=0;
if( type == MR_MSG_TEXT ) {
ret.message = getText();
@@ -33,6 +33,8 @@ public class NotificationCenter {
public static final int configureEnded = totalEvents++;
public static final int configureProgress = totalEvents++;
public static final int exportEnded = totalEvents++;
public static final int exportProgress = totalEvents++;
public static final int didReceivedNewMessages = totalEvents++;
public static final int updateInterfaces = totalEvents++;
public static final int dialogsNeedReload = totalEvents++;
@@ -291,6 +291,7 @@ public class TLRPC {
public long dialog_id; //custom
public final int layer = 0; //custom
public boolean created_by_mr;
public boolean e2ee;
}
public static class TL_message extends Message {
@@ -103,7 +103,7 @@ public class ActionBarMenu extends LinearLayout {
case R.drawable.photo_crop: hint = ApplicationLoader.applicationContext.getString(R.string.CropImage); break;
case R.drawable.photo_tools: hint = ApplicationLoader.applicationContext.getString(R.string.EditImage); break;
case R.drawable.ic_ab_search: hint = ApplicationLoader.applicationContext.getString(R.string.Search); break;
case R.drawable.lock_close: hint = ApplicationLoader.applicationContext.getString(R.string.Passcode); break;
case R.drawable.ic_ab_lock_screen: hint = ApplicationLoader.applicationContext.getString(R.string.Passcode); break;
}
if( hint != null ) {
if( s_menuItemHint != null ) {
@@ -110,6 +110,9 @@ public class Theme {
public static Drawable systemDrawable;
public static Drawable timeBackgroundDrawable;
public static Drawable timeStickerBackgroundDrawable;
public static Drawable encrOutDrawable;
public static Drawable encrInDrawable;
public static Drawable encrMediaDrawable;
public static Drawable[] cornerOuter = new Drawable[4];
public static Drawable[] cornerInner = new Drawable[4];
@@ -147,6 +150,10 @@ public class Theme {
timeStickerBackgroundDrawable = context.getResources().getDrawable(R.drawable.phototime2);
systemDrawable = context.getResources().getDrawable(R.drawable.system);
encrInDrawable = context.getResources().getDrawable(R.drawable.msg_encr_in);
encrOutDrawable = context.getResources().getDrawable(R.drawable.msg_encr_out);
encrMediaDrawable = context.getResources().getDrawable(R.drawable.msg_encr_media);
inlistDrawable[INLIST_FILE] = context.getResources().getDrawable(R.drawable.attach_file_inlist);
inlistDrawable[INLIST_PLAY] = context.getResources().getDrawable(R.drawable.attach_audio_inlist_play);
inlistDrawable[INLIST_TRANSP_PLAY] = context.getResources().getDrawable(R.drawable.video_play);
@@ -231,8 +231,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
private float forwardNameOffsetX[] = new float[2];
private StaticLayout timeLayout;
private int timeWidth;
private int timeTextWidth;
private int timeWidth; // includes timeEncrWidth
private int timeEncrWidth;
private int timeX;
private String currentTimeString;
private boolean drawTime = true;
@@ -1655,10 +1655,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
if (changed || !wasLayout) {
layoutWidth = getMeasuredWidth();
layoutHeight = getMeasuredHeight() - substractBackgroundHeight;
if (timeTextWidth < 0) {
timeTextWidth = dp(10);
}
timeLayout = new StaticLayout(currentTimeString, timePaint, timeTextWidth + dp(6), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
timeLayout = new StaticLayout(currentTimeString, timePaint, timeWidth + dp(6), Layout.Alignment.ALIGN_NORMAL, 1.0f, 0.0f, false);
if (!mediaBackground) {
if (!currentMessageObject.isOutOwner()) {
timeX = backgroundWidth - dp(9) - timeWidth + (isGroupChat && currentMessageObject.isFromUser() ? dp(48) : 0);
@@ -2089,7 +2086,12 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
private void measureTime(MessageObject messageObject) {
currentTimeString = LocaleController.getInstance().formatterDay.format((long) (messageObject.messageOwner.date) * 1000);
timeTextWidth = timeWidth = (int) Math.ceil(timePaint.measureText(currentTimeString));
timeWidth = (int) Math.ceil(timePaint.measureText(currentTimeString));
timeEncrWidth = 0;
if( messageObject.messageOwner.e2ee ) {
timeEncrWidth = Theme.encrOutDrawable.getIntrinsicWidth();
timeWidth += timeEncrWidth;
}
}
private boolean isDrawSelectedBackground() {
@@ -2333,19 +2335,36 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
int additionalX = 0;
canvas.save();
canvas.translate(timeX + additionalX, layoutHeight - dp(11.3f) - timeLayout.getHeight());
canvas.translate(timeX + additionalX + timeEncrWidth, layoutHeight - dp(11.3f) - timeLayout.getHeight());
timeLayout.draw(canvas);
canvas.restore();
} else {
int additionalX = 0;
canvas.save();
canvas.translate(timeX + additionalX, layoutHeight - dp(6.5f) - timeLayout.getHeight());
canvas.translate(timeX + additionalX + timeEncrWidth, layoutHeight - dp(6.5f) - timeLayout.getHeight());
timeLayout.draw(canvas);
canvas.restore();
//canvas.drawRect(timeX, layoutHeight - AndroidUtilities.dp(6.5f) - timeLayout.getHeight(), timeX + availableTimeWidth, layoutHeight - AndroidUtilities.dp(4.5f) - timeLayout.getHeight(), timePaint);
}
// draw encryption icon left of clock
if( timeEncrWidth>0 ) {
if (!mediaBackground) {
if (currentMessageObject.isOutOwner()) {
setDrawableBounds(Theme.encrOutDrawable, timeX, layoutHeight - dp(8.5f) - Theme.encrOutDrawable.getIntrinsicHeight());
Theme.encrOutDrawable.draw(canvas);
} else {
setDrawableBounds(Theme.encrInDrawable, timeX, layoutHeight - dp(8.5f) - Theme.encrInDrawable.getIntrinsicHeight());
Theme.encrInDrawable.draw(canvas);
}
} else {
setDrawableBounds(Theme.encrMediaDrawable, timeX, layoutHeight - dp(13.2f) - Theme.encrMediaDrawable.getIntrinsicHeight());
Theme.encrMediaDrawable.draw(canvas);
}
}
// draw checkmarks right of clock
if (currentMessageObject.isOutOwner()) {
boolean drawCheck1 = false;
boolean drawCheck2 = false;
@@ -70,7 +70,6 @@ public class DialogCell extends BaseCell {
private static Drawable countDrawableGrey;
private static Drawable groupDrawable;
private static Drawable muteDrawable;
private static Drawable verifiedDrawable;
private static Paint linePaint;
private static Paint backPaint;
@@ -114,7 +113,7 @@ public class DialogCell extends BaseCell {
private StaticLayout messageLayout;
private boolean drawError;
private int errorTop = AndroidUtilities.dp(39);
private int errorTop = AndroidUtilities.dp(42);
private int errorLeft;
private boolean drawCount;
@@ -123,8 +122,6 @@ public class DialogCell extends BaseCell {
private int countWidth;
private StaticLayout countLayout;
private boolean drawVerified;
private int avatarTop = AndroidUtilities.dp(10);
private boolean isSelected;
@@ -168,12 +165,11 @@ public class DialogCell extends BaseCell {
checkDrawable = getResources().getDrawable(R.drawable.dialogs_check);
halfCheckDrawable = getResources().getDrawable(R.drawable.dialogs_halfcheck);
clockDrawable = getResources().getDrawable(R.drawable.msg_clock);
errorDrawable = getResources().getDrawable(R.drawable.dialogs_warning);
errorDrawable = getResources().getDrawable(R.drawable.msg_warning);
countDrawable = getResources().getDrawable(R.drawable.dialogs_badge);
countDrawableGrey = getResources().getDrawable(R.drawable.dialogs_badge2);
groupDrawable = getResources().getDrawable(R.drawable.list_group);
muteDrawable = getResources().getDrawable(R.drawable.mute_grey);
verifiedDrawable = getResources().getDrawable(R.drawable.check_list);
}
setBackgroundResource(R.drawable.list_selector);
@@ -253,10 +249,6 @@ public class DialogCell extends BaseCell {
boolean checkMessage = true;
drawNameGroup = false;
//drawNameBroadcast = false;
//drawNameLock = false;
//drawNameBot = false;
drawVerified = false;
{
if (m_mrChat.getType()==MrChat.MR_CHAT_GROUP) { // EDIT BY MR
@@ -267,7 +259,6 @@ public class DialogCell extends BaseCell {
drawNameGroup = true;
nameLockTop = AndroidUtilities.dp(17.5f);
//}
//drawVerified = chat.verified; -- /EDIT BY MR
if (!LocaleController.isRTL) {
nameLockLeft = AndroidUtilities.dp(AndroidUtilities.leftBaseline);
@@ -328,7 +319,6 @@ public class DialogCell extends BaseCell {
case MrMsg.MR_OUT_DELIVERED: drawCheck2 = true; break;
case MrMsg.MR_OUT_READ: drawCheck1 = true; drawCheck2 = true; break;
}
drawVerified = m_mrChat.isEncrypted()!=0; // we use the "verified" check as an icon for "encryted" and "verified"
}
if (unreadCount != 0) {
@@ -393,18 +383,12 @@ public class DialogCell extends BaseCell {
}
}
if (dialogMuted && !drawVerified) {
if (dialogMuted) {
int w = AndroidUtilities.dp(6) + muteDrawable.getIntrinsicWidth();
nameWidth -= w;
if (LocaleController.isRTL) {
nameLeft += w;
}
} else if (drawVerified) {
int w = AndroidUtilities.dp(6) + verifiedDrawable.getIntrinsicWidth();
nameWidth -= w;
if (LocaleController.isRTL) {
nameLeft += w;
}
}
nameWidth = Math.max(AndroidUtilities.dp(12), nameWidth);
@@ -429,9 +413,9 @@ public class DialogCell extends BaseCell {
int w = errorDrawable.getIntrinsicWidth() + AndroidUtilities.dp(8);
messageWidth -= w;
if (!LocaleController.isRTL) {
errorLeft = getMeasuredWidth() - errorDrawable.getIntrinsicWidth() - AndroidUtilities.dp(11);
errorLeft = getMeasuredWidth() - errorDrawable.getIntrinsicWidth() - AndroidUtilities.dp(16);
} else {
errorLeft = AndroidUtilities.dp(11);
errorLeft = AndroidUtilities.dp(16);
messageLeft += w;
}
} else if (countString != null) {
@@ -475,10 +459,8 @@ public class DialogCell extends BaseCell {
if (nameLayout != null && nameLayout.getLineCount() > 0) {
left = nameLayout.getLineLeft(0);
widthpx = Math.ceil(nameLayout.getLineWidth(0));
if (dialogMuted && !drawVerified) {
if (dialogMuted) {
nameMuteLeft = (int) (nameLeft + (nameWidth - widthpx) - AndroidUtilities.dp(6) - muteDrawable.getIntrinsicWidth());
} else if (drawVerified) {
nameMuteLeft = (int) (nameLeft + (nameWidth - widthpx) - AndroidUtilities.dp(6) - verifiedDrawable.getIntrinsicWidth());
}
if (left == 0) {
if (widthpx < nameWidth) {
@@ -504,7 +486,7 @@ public class DialogCell extends BaseCell {
nameLeft -= (nameWidth - widthpx);
}
}
if (dialogMuted || drawVerified) {
if (dialogMuted) {
nameMuteLeft = (int) (nameLeft + left + AndroidUtilities.dp(6));
}
}
@@ -669,12 +651,9 @@ public class DialogCell extends BaseCell {
}
}
if (dialogMuted && !drawVerified) { // TODO: if we enable encrypted chats and show the verified logo, we may show both, muted and verivied
if (dialogMuted) {
setDrawableBounds(muteDrawable, nameMuteLeft, AndroidUtilities.dp(16.5f));
muteDrawable.draw(canvas);
} else if (drawVerified) {
setDrawableBounds(verifiedDrawable, nameMuteLeft, AndroidUtilities.dp(16.5f));
verifiedDrawable.draw(canvas);
}
if (drawError) {
@@ -65,7 +65,7 @@ public class DrawerProfileCell extends FrameLayout {
ImageView shadowView = new ImageView(context);
shadowView.setScaleType(ImageView.ScaleType.FIT_XY);
shadowView.setImageResource(R.drawable.bottom_shadow);
addView(shadowView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 100/*EDIT BY MR, was 70*/, Gravity.START | Gravity.BOTTOM));
addView(shadowView, LayoutHelper.createFrame(LayoutHelper.MATCH_PARENT, 85/*shadow height*/, Gravity.START | Gravity.BOTTOM));
nameTextView = new TextView(context);
nameTextView.setTextColor(0xffffffff);
@@ -90,7 +90,7 @@ public class DrawerProfileCell extends FrameLayout {
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
int mrHeight = DrawerLayoutContainer.USE_DRAWER? 180 : 150;
int mrHeight = DrawerLayoutContainer.USE_DRAWER? 180 : 100/*see also shadow height above*/;
if (Build.VERSION.SDK_INT >= 21) {
super.onMeasure(widthMeasureSpec, MeasureSpec.makeMeasureSpec(AndroidUtilities.dp(mrHeight) + AndroidUtilities.statusBarHeight, MeasureSpec.EXACTLY));
} else {
@@ -199,7 +199,7 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
ActionBarMenu menu = actionBar.createMenu();
if (!onlySelect ) {
passcodeItem = menu.addItem(ID_LOCK_APP, R.drawable.lock_close);
passcodeItem = menu.addItem(ID_LOCK_APP, R.drawable.ic_ab_lock_screen);
updatePasscodeButton();
}
final ActionBarMenuItem item = menu.addItem(0, R.drawable.ic_ab_search).setIsSearchField(true, true).setActionBarMenuItemSearchListener(new ActionBarMenuItem.ActionBarMenuItemSearchListener() {
@@ -778,11 +778,6 @@ public class DialogsActivity extends BaseFragment implements NotificationCenter.
}
if (UserConfig.passcodeHash.length() != 0 && !searching) {
passcodeItem.setVisibility(View.VISIBLE);
if (UserConfig.appLocked) {
passcodeItem.setIcon(R.drawable.lock_close);
} else {
passcodeItem.setIcon(R.drawable.lock_open);
}
} else {
passcodeItem.setVisibility(View.GONE);
}
@@ -408,8 +408,8 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
{
String info_str = MrMailbox.getContactEncrInfo(user_id);
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setTitle(ApplicationLoader.applicationContext.getString(R.string.E2ECompareKeys));
builder.setMessage(info_str);
builder.setTitle(ApplicationLoader.applicationContext.getString(R.string.Encryption));
builder.setMessage(AndroidUtilities.replaceTags(info_str));
builder.setPositiveButton(context.getString(R.string.OK), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
@@ -1322,7 +1322,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
if (i == changeNameRow) {
textCell.setText(mContext.getString(R.string.EditName));
} else if (i == compareKeysRow) {
textCell.setText(mContext.getString(R.string.E2ECompareKeys));
textCell.setText(mContext.getString(R.string.Encryption));
} else if (i == startChatRow) {
textCell.setText(mContext.getString(R.string.NewChat));
} else if (i == settingsNotificationsRow) {
@@ -54,8 +54,6 @@ import com.b44t.ui.Cells.TextInfoCell;
import com.b44t.ui.Cells.TextSettingsCell;
import com.b44t.ui.Components.LayoutHelper;
import static android.app.ProgressDialog.STYLE_HORIZONTAL;
public class SettingsAccountActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
@@ -32,9 +32,6 @@ import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.pm.PackageInfo;
import android.os.Build;
import android.os.PowerManager;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
@@ -48,8 +45,6 @@ import com.b44t.messenger.R;
import com.b44t.messenger.UserConfig;
import com.b44t.messenger.browser.Browser;
import com.b44t.ui.ActionBar.ActionBar;
import com.b44t.ui.ActionBar.ActionBarMenu;
import com.b44t.ui.ActionBar.ActionBarMenuItem;
import com.b44t.ui.ActionBar.BaseFragment;
import com.b44t.ui.ActionBar.DrawerLayoutContainer;
import com.b44t.ui.Adapters.BaseFragmentAdapter;
@@ -66,15 +61,12 @@ import com.b44t.ui.Components.NumberPicker;
public class SettingsActivity extends BaseFragment {
// the list
private int profileRow, accountHeaderRow, usernameRow, accountSettingsRow, accountShadowRow;
private int profileRow, accountHeaderRow, usernameRow, accountShadowRow;
private int settingsHeaderRow, notificationRow, backgroundRow, textSizeRow, advRow, settingsShadowRow;
private int readReceiptsRow, blockedRow, passcodeRow;
private int aboutHeaderRow, aboutRow, inviteRow, helpRow, aboutShadowRow;
private int rowCount;
private static final int ID_ACCOUNT_SETTINGS = 10;
private static final int ID_ADV_SETTINGS = 11;
private static final int ROWTYPE_SHADOW = 0;
private static final int ROWTYPE_TEXT_SETTINGS = 1;
private static final int ROWTYPE_HEADER = 2;
@@ -102,12 +94,10 @@ public class SettingsActivity extends BaseFragment {
usernameRow = rowCount++;
if (DrawerLayoutContainer.USE_DRAWER) {
accountSettingsRow = rowCount++;
accountShadowRow = rowCount++;
settingsHeaderRow = rowCount++;
}
else {
accountSettingsRow = -1;
accountShadowRow = -1;
settingsHeaderRow = -1;
}
@@ -116,17 +106,16 @@ public class SettingsActivity extends BaseFragment {
notificationRow = rowCount++;
backgroundRow = rowCount++;
textSizeRow = rowCount++;
advRow = rowCount++;
}
else {
notificationRow = rowCount++;
backgroundRow = rowCount++;
textSizeRow = rowCount++;
advRow = -1;
}
readReceiptsRow=-1;
passcodeRow = rowCount++;
blockedRow = rowCount++;
advRow = rowCount++;
settingsShadowRow = rowCount++;
aboutHeaderRow = rowCount++;
@@ -148,6 +137,8 @@ public class SettingsActivity extends BaseFragment {
public View createView(Context context)
{
// create action bar
// (we have also used an action bar menu for less frequently stuff (advanced, backup, account settings) but this needs to be explained -
// so, if possible, we will avoid this - form follows function)
actionBar.setBackButtonImage(R.drawable.ic_ab_back);
actionBar.setAllowOverlayTitle(true);
actionBar.setTitle(context.getString(R.string.Settings));
@@ -157,23 +148,9 @@ public class SettingsActivity extends BaseFragment {
if (id == -1) {
finishFragment();
}
else if( id == ID_ACCOUNT_SETTINGS ) {
presentFragment(new SettingsAccountActivity(null));
}
else if( id == ID_ADV_SETTINGS ) {
presentFragment(new SettingsAdvActivity());
}
}
});
// create action bar menu (we use it only for the account settings that are not changed frequently)
if(!DrawerLayoutContainer.USE_DRAWER) {
ActionBarMenu menu = actionBar.createMenu();
ActionBarMenuItem headerItem = menu.addItem(0, R.drawable.ic_ab_other);
headerItem.addSubItem(ID_ACCOUNT_SETTINGS, context.getString(R.string.AccountSettings), 0);
headerItem.addSubItem(ID_ADV_SETTINGS, context.getString(R.string.AdvancedSettings), 0);
}
// create object to hold the whole view
fragmentView = new FrameLayout(context);
FrameLayout frameLayout = (FrameLayout) fragmentView;
@@ -194,9 +171,6 @@ public class SettingsActivity extends BaseFragment {
if (i == usernameRow) {
presentFragment(new SettingsNameActivity());
}
else if (i == accountSettingsRow) {
presentFragment(new SettingsAccountActivity(null));
}
else if (i == blockedRow) {
presentFragment(new BlockedUsersActivity());
}
@@ -298,7 +272,7 @@ public class SettingsActivity extends BaseFragment {
@Override
public boolean isEnabled(int i) {
return i == textSizeRow || i == usernameRow || i == accountSettingsRow ||
return i == textSizeRow || i == usernameRow ||
i == blockedRow || i==passcodeRow || i==readReceiptsRow || i == notificationRow || i == backgroundRow || i == advRow ||
i == aboutRow || i == inviteRow || i == helpRow;
}
@@ -346,7 +320,7 @@ public class SettingsActivity extends BaseFragment {
TextSettingsCell textCell = (TextSettingsCell) view;
if (i == blockedRow) {
String cntStr = String.format("%d", MrMailbox.getBlockedCount());
textCell.setTextAndValue(ApplicationLoader.applicationContext.getString(R.string.BlockedContacts), cntStr, false);
textCell.setTextAndValue(ApplicationLoader.applicationContext.getString(R.string.BlockedContacts), cntStr, true);
}
else if (i == passcodeRow) {
String val = UserConfig.passcodeHash.length() > 0? mContext.getString(R.string.Enabled) : mContext.getString(R.string.Disabled);
@@ -377,9 +351,6 @@ public class SettingsActivity extends BaseFragment {
else if(i == helpRow) {
textCell.setText(mContext.getString(R.string.Help), false);
}
else if (i == accountSettingsRow) {
textCell.setText(mContext.getString(R.string.AccountSettings), true);
}
else if (i == usernameRow) {
String value = MrMailbox.getConfig("displayname", "");
if( value.isEmpty()) {
@@ -409,18 +380,7 @@ public class SettingsActivity extends BaseFragment {
view.setBackgroundColor(0xffffffff);
}
TextDetailSettingsCell textCell = (TextDetailSettingsCell) view;
if (i == accountSettingsRow) {
String subtitle;
if( MrMailbox.isConfigured()!=0) {
subtitle = MrMailbox.getConfig("addr", "");
}
else {
subtitle = mContext.getString(R.string.AccountNotConfigured);
}
textCell.setTextAndValue(mContext.getString(R.string.AccountSettings), subtitle, false);
}
else if (i == usernameRow) {
if (i == usernameRow) {
String subtitle = MrMailbox.getConfig("displayname", "");
if( subtitle.isEmpty()) {
subtitle = mContext.getString(R.string.NotSet);
@@ -453,7 +413,7 @@ public class SettingsActivity extends BaseFragment {
else if (i == accountShadowRow || i == settingsShadowRow || i == aboutShadowRow ) {
return ROWTYPE_SHADOW;
}
else if ( (DrawerLayoutContainer.USE_DRAWER && (i==accountSettingsRow || i==usernameRow)) || i==aboutRow ) {
else if ( (DrawerLayoutContainer.USE_DRAWER && (i==usernameRow)) || i==aboutRow ) {
return ROWTYPE_DETAIL_SETTINGS;
}
else if (i == settingsHeaderRow || i == aboutHeaderRow || i == accountHeaderRow) {
@@ -25,6 +25,7 @@ package com.b44t.ui;
import android.Manifest;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.SharedPreferences;
@@ -43,6 +44,7 @@ import com.b44t.messenger.MediaController;
import com.b44t.messenger.ApplicationLoader;
import com.b44t.messenger.MrChat;
import com.b44t.messenger.MrMailbox;
import com.b44t.messenger.NotificationCenter;
import com.b44t.messenger.R;
import com.b44t.ui.Adapters.BaseFragmentAdapter;
import com.b44t.ui.Cells.ShadowSectionCell;
@@ -55,12 +57,14 @@ import com.b44t.ui.Components.LayoutHelper;
import java.io.File;
public class SettingsAdvActivity extends BaseFragment {
public class SettingsAdvActivity extends BaseFragment implements NotificationCenter.NotificationCenterDelegate {
// the list
private int directShareRow, cacheRow, raiseToSpeakRow, sendByEnterRow, autoplayGifsRow, showUnknownSendersRow, finalShadowRow;
private int accountSettingsRow;
private int e2eEncryptionRow;
private int manageKeysRow;
private int backupRow;
private int rowCount;
private static final int ROWTYPE_SHADOW = 0;
@@ -80,7 +84,11 @@ public class SettingsAdvActivity extends BaseFragment {
public boolean onFragmentCreate() {
super.onFragmentCreate();
NotificationCenter.getInstance().addObserver(this, NotificationCenter.exportEnded);
NotificationCenter.getInstance().addObserver(this, NotificationCenter.exportProgress);
rowCount = 0;
accountSettingsRow = rowCount++;
if (Build.VERSION.SDK_INT >= 23) {
directShareRow = -1; // for now, seems not really to work, however, in T'gram it does
}
@@ -94,11 +102,19 @@ public class SettingsAdvActivity extends BaseFragment {
cacheRow = -1;// for now, the - non-functional - page is reachable by the "storage settings" in the "android App Settings" only
e2eEncryptionRow = rowCount++;
manageKeysRow = rowCount++;
backupRow = -1; //rowCount++; -- disabled for now
finalShadowRow = rowCount++;
return true;
}
@Override
public void onFragmentDestroy() {
super.onFragmentDestroy();
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.exportEnded);
NotificationCenter.getInstance().removeObserver(this, NotificationCenter.exportProgress);
}
@Override
public View createView(Context context)
{
@@ -191,50 +207,17 @@ public class SettingsAdvActivity extends BaseFragment {
((TextCheckCell) view).setChecked(oldval == 0);
}
}
else if(i==accountSettingsRow)
{
presentFragment(new SettingsAccountActivity(null));
}
else if(i==manageKeysRow )
{
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); // was: BottomSheet.Builder
builder.setTitle(ApplicationLoader.applicationContext.getString(R.string.E2EManagePrivateKeys));
CharSequence[] items = new CharSequence[]{
ApplicationLoader.applicationContext.getString(R.string.ImportPrivateKeys),
ApplicationLoader.applicationContext.getString(R.string.ExportPrivateKeys),
};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if( i== 0/*import*/ ) {
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
getParentActivity().requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 4);
return;
}
AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity());
builder2.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
int cnt = MrMailbox.importStuff(MrMailbox.MR_IMEX_SELF_KEYS, downloadsDir.getAbsolutePath());
String cntStr = ApplicationLoader.applicationContext.getResources().getQuantityString(R.plurals.ImportKeysDone, cnt, cnt);
AndroidUtilities.showHint(ApplicationLoader.applicationContext, cntStr);
}
});
builder2.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
builder2.setMessage(ApplicationLoader.applicationContext.getString(R.string.ImportPrivateKeysAsk));
showDialog(builder2.create());
}
else /*export*/ {
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
getParentActivity().requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 4);
return;
}
File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
downloadsDir.mkdirs();
MrMailbox.exportStuff(MrMailbox.MR_IMEX_SELF_KEYS, downloadsDir.getAbsolutePath());
AndroidUtilities.showDoneHint(ApplicationLoader.applicationContext);
}
}
}
);
showDialog(builder.create());
imexShowMenu(ApplicationLoader.applicationContext.getString(R.string.E2EManagePrivateKeys), MrMailbox.MR_IMEX_EXPORT_SELF_KEYS, MrMailbox.MR_IMEX_IMPORT_SELF_KEYS);
}
else if( i == backupRow )
{
imexShowMenu(ApplicationLoader.applicationContext.getString(R.string.Backup), MrMailbox.MR_IMEX_EXPORT_BACKUP, 0);
}
}
});
@@ -242,6 +225,127 @@ public class SettingsAdvActivity extends BaseFragment {
return fragmentView;
}
private void imexShowMenu(String title, final int exportCommand, final int importCommand)
{
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity()); // was: BottomSheet.Builder
builder.setTitle(title);
CharSequence[] items = new CharSequence[]{
ApplicationLoader.applicationContext.getString(R.string.ExportToDownloads),
ApplicationLoader.applicationContext.getString(R.string.ImportFromDownloads),
};
builder.setItems(items, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
if( i==0 ) /*export*/ {
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
getParentActivity().requestPermissions(new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 4);
return;
}
startImex(exportCommand);
}
else /*import*/ {
if( importCommand ==MrMailbox.MR_IMEX_IMPORT_SELF_KEYS ) {
if (Build.VERSION.SDK_INT >= 23 && getParentActivity().checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
getParentActivity().requestPermissions(new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 4);
return;
}
AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity());
builder2.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
startImex(importCommand);
}
});
builder2.setNegativeButton(ApplicationLoader.applicationContext.getString(R.string.Cancel), null);
builder2.setMessage(ApplicationLoader.applicationContext.getString(R.string.ImportPrivateKeysAsk));
showDialog(builder2.create());
}
else {
AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity());
builder2.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
builder2.setMessage(ApplicationLoader.applicationContext.getString(R.string.ImportBackupExplain));
showDialog(builder2.create());
}
}
}
}
);
showDialog(builder.create());
}
private ProgressDialog progressDialog = null;
private void startImex(int what)
{
if( progressDialog!=null ) {
progressDialog.dismiss();
progressDialog = null;
}
progressDialog = new ProgressDialog(getParentActivity());
progressDialog.setMessage(ApplicationLoader.applicationContext.getString(R.string.OneMoment));
progressDialog.setCanceledOnTouchOutside(false);
progressDialog.setCancelable(false);
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, ApplicationLoader.applicationContext.getString(R.string.Cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MrMailbox.imex(0, null);
}
});
progressDialog.show();
synchronized (MrMailbox.m_lastErrorLock) {
MrMailbox.m_showNextErrorAsToast = false;
MrMailbox.m_lastErrorString = "";
}
File downloadsDir = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS);
downloadsDir.mkdirs();
MrMailbox.imex(what, downloadsDir.getAbsolutePath());
}
@Override
public void didReceivedNotification(int id, Object... args) {
if( id==NotificationCenter.exportProgress ) {
if( progressDialog!=null ) {
// we want the spinner together with a progress info
int percent = (Integer)args[0];
progressDialog.setMessage(ApplicationLoader.applicationContext.getString(R.string.OneMoment)+String.format(" %d%%", percent));
}
}
else if( id==NotificationCenter.exportEnded ) {
final String errorString;
synchronized (MrMailbox.m_lastErrorLock) {
MrMailbox.m_showNextErrorAsToast = true;
errorString = MrMailbox.m_lastErrorString;
}
if( progressDialog!=null ) {
progressDialog.dismiss();
progressDialog = null;
}
if( (int)args[0]==1 ) {
AndroidUtilities.showDoneHint(ApplicationLoader.applicationContext);
}
else if( !errorString.isEmpty() /*usually empty if export is cancelled by the user*/ ) {
AlertDialog.Builder builder = new AlertDialog.Builder(getParentActivity());
builder.setMessage(errorString);
builder.setPositiveButton(ApplicationLoader.applicationContext.getString(R.string.OK), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
;
}
});
showDialog(builder.create());
}
}
}
private class ListAdapter extends BaseFragmentAdapter {
private Context mContext;
@@ -300,7 +404,13 @@ public class SettingsAdvActivity extends BaseFragment {
textCell.setText(mContext.getString(R.string.CacheSettings), true);
}
else if( i==manageKeysRow ) {
textCell.setText(mContext.getString(R.string.E2EManagePrivateKeys), false);
textCell.setText(mContext.getString(R.string.E2EManagePrivateKeys), true);
}
else if( i==backupRow ) {
textCell.setText(mContext.getString(R.string.Backup), false);
}
else if( i == accountSettingsRow ) {
textCell.setText(mContext.getString(R.string.AccountSettings), true);
}
} else if (type == ROWTYPE_CHECK) {
if (view == null) {
@@ -324,7 +434,7 @@ public class SettingsAdvActivity extends BaseFragment {
MrMailbox.getConfigInt("show_deaddrop", 0)!=0, true);
}
else if( i == e2eEncryptionRow ) {
textCell.setTextAndCheck(mContext.getString(R.string.E2EEncryption),
textCell.setTextAndCheck(mContext.getString(R.string.PreferE2EEncryption),
MrMailbox.getConfigInt("e2ee_enabled", MR_E2EE_DEFAULT_ENABLED)!=0, true);
}
}
@@ -732,7 +732,15 @@ public class VideoEditorActivity extends BaseFragment implements TextureView.Sur
resultBitrate = 200000;
}
else if (resultBitrate > 500000) {
resultBitrate = 500000; // ~ 3.7 MB/minute, plus Audio
if( resultDurationMs<30*1000 ) {
resultBitrate = 1500000; // ~ 12 MB/minute, plus Audio
}
else if( resultDurationMs<60*1000 ) {
resultBitrate = 1000000; // ~ 8 MB/minute, plus Audio
}
else {
resultBitrate = 500000; // ~ 3.7 MB/minute, plus Audio
}
}
// get video dimensions
Binary file not shown.

Before

Width:  |  Height:  |  Size: 689 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 436 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 369 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 304 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 374 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 459 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 306 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 297 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 255 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 298 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 908 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 505 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 428 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 328 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 429 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 694 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 598 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 441 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

@@ -357,7 +357,7 @@
<string name="ErrSelfNotInGroup">Sie müssen ein Gruppenmitglied sein, um diese Aktion ausführen zu können.</string>
<string name="MsgGroupLeft">Gruppe verlassen.</string>
<string name="NoMessagesHint">Nachricht an <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> senden:\n\n• <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> muss hierzu Delta Chat nicht installiert haben.\n\n• Die Zustellung der ersten Nachricht kann einen Moment dauern.</string>
<string name="E2EEncryption">Ende-zu-Ende-Verschlüsselung</string>
<string name="PreferE2EEncryption">Ende-zu-Ende-Verschlüsselung bevorzugen</string>
<string name="SendNRcvReadReceipts">Lesebestätigungen empfangen/senden</string>
<string name="E2EManagePrivateKeys">Private Schlüssel verwalten</string>
<string name="E2ECompareKeys">Schlüssel vergleichen</string>
@@ -376,11 +376,18 @@
<string name="AutoplayGifs">GIFs automatisch abspielen</string>
<string name="HelpUrl">https://delta.chat/de/help</string>
<string name="EncryptedMessage">Verschlüsselte Nachricht</string>
<string name="ImportPrivateKeys">Aus \"Downloads\" importieren</string>
<string name="ExportPrivateKeys">Nach \"Downloads\" exportieren</string>
<string name="ImportPrivateKeysAsk">Private Schlüssel aus \"Downloads\" importieren?\n\n• Bereits vorhandene private Schlüssel bleiben erhalten\n\n• Der zuletzt importierte private Schlüssel wird der Standardschlüssel\n\n• Fortfahren?</string>
<plurals name="ImportKeysDone">
<item quantity="one">%d Schlüssel importiert</item>
<item quantity="other">%d Schlüssel importiert</item>
</plurals>
<string name="EncrinfoE2E">Die Verbindung ist Ende-zu-Ende-Verschlüsselt.</string>
<string name="EncrinfoE2EExplain">Wenn die angezeigten Fingerabdrücke auf dem anderen Gerät genauso angezeigt werden, ist die Verbindung sicher.</string>
<string name="EncrinfoTransport">Transportverschlüsselung mindestens bis zu meinem Server.</string>
<string name="EncrinfoNone">Keine Verschlüsselung bis zu meinem Server.</string>
<string name="EncrinfoNoE2EExplain">Die Ende-zu-Ende-Verschlüsselung wird automatisch aktiviert, sobald der Kontakt Delta Chat oder eine andere Autocrypt-kompatible App verwendet.</string>
<string name="EncrinfoFingerprints">Fingerabdrücke</string>
<string name="ImportFromDownloads">Aus \"Downloads\" importieren</string>
<string name="ExportToDownloads">Nach \"Downloads\" exportieren</string>
<string name="ImportPrivateKeysAsk">Private Schlüssel aus \"Downloads\" importieren?\n\n• Bereits vorhandene private Schlüssel bleiben erhalten\n\n• Der zuletzt importierte private Schlüssel wird der Standardschlüssel\n\nFortfahren?</string>
<string name="Encryption">Verschlüsselung</string>
<string name="ImportBackupExplain">Um ein Backup zu importieren, kopieren Sie es auf dem Zielgerät in das \"Downloads\"-Verzeichnis und installieren die App neu.</string>
</resources>
@@ -373,6 +373,7 @@
<string name="PleaseCutVideoToMaxSize">Reduzca el tamaño del vídeo hasta un máximo de %1$s, por favor.</string>
<string name="SettingsFor">Ajustes para %1$s</string>
<string name="AutoplayGifs">Autorreproducción de GIF</string>
<string name="HelpUrl">https://delta.chat/es/help</string>
</resources>
@@ -18,7 +18,7 @@
<string name="AttachMusic">Musique</string>
<!--documents view-->
<string name="SelectFile">Selectionner le fichier</string>
<string name="FreeOfTotal">Free %1$s of %2$s</string>
<string name="FreeOfTotal">Libre %1$s sur %2$s</string>
<string name="ErrorHint">Erreur inconnue</string>
<string name="AccessError">Erreur d\'accès</string>
<string name="NoFiles">Aucun fichier pour le moment…</string>
@@ -43,7 +43,7 @@
<string name="SaveToMusic">Enregistrer dans les musiques</string>
<string name="Share">Partager</string>
<string name="SendItems">Envoyer %1$s</string>
<string name="ClearRecentEmoji">Vider les emokis récent?</string>
<string name="ClearRecentEmoji">Vider les emojis récents ?</string>
<string name="AddShortcut">Ajouter le widget à l\'écran d\'accueil</string>
<string name="ShortcutAdded">Widget ajouté à l\'écran d\'accueil</string>
<!--notification-->
@@ -106,26 +106,26 @@
<string name="DirectShareInfo">Montrer les conversations récentes dans le menu de partage</string>
<!--cache view-->
<string name="CacheSettings">Stockage</string>
<string name="KeepMedia">Conserver les fichier média</string>
<string name="KeepMedia">Conserver les fichiers média</string>
<string name="KeepMediaInfo">Les photos, vidéos et autres fichiers venant des conversations du cloud que vous n\'avez <![CDATA[<b>pas</b>]]> consultés pendant cette période seront supprimés pour libérer de l\'espace.</string>
<string name="KeepMediaForever">Toujours</string>
<!--passcode view-->
<string name="Passcode">Verrouiller par mot de passe</string>
<string name="ChangePasscode">Modifier le mot de passe</string>
<string name="ChangePasscodeInfo">Quand vous ajoutez un mot de passe additionnel, une icône de verrouillage apparaîtra sur la page des conversations. Appuyez sur cette icône et déverrouillez l\'application.\n\nNote : si vous oubliez le mot de passe, vous devrez supprimer et réinstaller l\'application.</string>
<string name="ChangePasscodeInfo">Quand vous ajoutez un verrouillage par mot de passe, une icône de verrouillage apparaîtra sur la page des conversations. Appuyez sur cette icône et déverrouillez l\'application.\n\nNote : si vous oubliez le mot de passe, vous devrez supprimer et réinstaller l\'application.</string>
<string name="PasscodePIN">PIN</string>
<string name="PasscodePassword">Mot de passe</string>
<string name="EnterCurrentPasscode">Saississez votre mot de passe actuel</string>
<string name="EnterNewFirstPasscode">Saississez un mot de passe</string>
<string name="EnterNewPasscode">Saississez un nouveau mot de passe</string>
<string name="EnterYourPasscode">Saississez votre mot de passe</string>
<string name="ReEnterYourPasscode">Ressaississez votre mot de passe</string>
<string name="EnterCurrentPasscode">Saisissez votre mot de passe actuel</string>
<string name="EnterNewFirstPasscode">Saisissez un mot de passe</string>
<string name="EnterNewPasscode">Saisissez un nouveau mot de passe</string>
<string name="EnterYourPasscode">Saisissez votre mot de passe</string>
<string name="ReEnterYourPasscode">Ressaisissez votre mot de passe</string>
<string name="PasscodeDoNotMatch">Les mots de passe ne correspondent pas</string>
<string name="AutoLock">Verrouillage automatique</string>
<string name="AutoLockInfo">Redemande le mot de passe en cas d\'inactivité prolongée.</string>
<string name="UnlockFingerprint">Déverrouiller avec votre empreinte digitale</string>
<string name="FingerprintInfo">Confirmer votre empreinte digitale pour continuer</string>
<string name="FingerprintNotRecognized">Empreinte non reconnue. Essayer encore</string>
<string name="FingerprintNotRecognized">Empreinte non reconnue. Essayez encore.</string>
<!--photo gallery view-->
<string name="SaveToGallery">Enregistrer dans la galerie</string>
<string name="Of">%1$d de %2$d</string>
@@ -133,7 +133,7 @@
<string name="AllPhotos">Toutes les photos</string>
<string name="AllVideo">Toutes les vidéos</string>
<string name="NoPhotos">Aucune photo pour le moment</string>
<string name="NoVideo">Aucune vidéo pour le moement</string>
<string name="NoVideo">Aucune vidéo pour le moment</string>
<string name="CropImage">Couper les images</string>
<string name="EditImage">Modifier les images</string>
<string name="Enhance">Améliorer</string>
@@ -191,13 +191,13 @@
<string name="AttachVoiceMessage">Message vocal</string>
<string name="FromSelf">Moi</string>
<!--Alert messages-->
<string name="NoHandleAppInstalled">Vous n\'avez pas d\'application qui peut gérer le type \'%1$s\', veuillez en installer un pour continuer</string>
<string name="NoHandleAppInstalled">Vous n\'avez pas d\'application qui peut gérer le type \'%1$s\', veuillez en installer une pour continuer</string>
<string name="ContactAlreadyInGroup">Ce contact est déjà dans ce groupe</string>
<string name="ForwardMessagesTo">Renvoyer les messages sélectionnés à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> ?</string>
<string name="SendMessagesTo">Envoyer les messages à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="AreYouSureDeleteThisChat">Êtes-vous sûr de vouloir supprimer cette conversation? La conversation n\'apparaîtra plus dans la liste des conversations, mais les messages resteront sur le serveur.</string>
<string name="AreYouSureBlockContact">Êtes-vous sûr de vouloir bloquer cet utilisateur?</string>
<string name="AreYouSureDeleteContact">Êtes-vous sûr de vouloir supprimer cet utilisateur?</string>
<string name="SendMessagesTo">Envoyer les messages à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> ?</string>
<string name="AreYouSureDeleteThisChat">Êtes-vous sûr de vouloir supprimer cette conversation ? La conversation n\'apparaîtra plus dans la liste des conversations, mais les messages resteront sur le serveur.</string>
<string name="AreYouSureBlockContact">Êtes-vous sûr de vouloir bloquer cet utilisateur ?</string>
<string name="AreYouSureDeleteContact">Êtes-vous sûr de vouloir supprimer cet utilisateur ?</string>
<!--permissions-->
<string name="PermissionContacts">Delta Chat a besoin d\'accéder aux contacts de façon à pouvoir vous connecter avec vos amis avec tous vos appareils.</string>
<string name="PermissionStorage">Delta Chat a besoin d\'accéder au stockage pour envoyer vos photos, vidéos, musiques et autres médias.</string>
@@ -205,24 +205,25 @@
<string name="PermissionOpenSettings">Paramètres</string>
<!--Intro view-->
<string name="Intro1Headline">Delta Chat</string>
<string name="Intro1Message">La messagerie avec <![CDATA[<b>le plus grande portée</b>]]> dans le monde.<![CDATA[<br/><b>Libre</b>]]> et <![CDATA[<b>sécurisé</b>]]>.</string>
<string name="Intro1Message">La messagerie <![CDATA[<b>la plus étendue</b>]]> dans le monde.<![CDATA[<br/><b>Libre</b>]]> et <![CDATA[<b>sécurisée</b>]]>.</string>
<string name="Intro2Headline">Indépendent</string>
<string name="Intro2Message"><![CDATA[<b>Aucune dépendance</b>]]> à des ordinateurs ou services tiers. L\'application utilise juste votre serveur d\'e-mail.</string>
<string name="Intro2Message"><![CDATA[<b>Aucune dépendance</b>]]> à des serveurs ou services tiers. L\'application utilise juste votre serveur d\'e-mail.</string>
<string name="Intro3Headline">Rapide</string>
<string name="Intro3Message">Envoyez des messages<![CDATA[<b>en quelques secondes</b>]]>.<![CDATA[<br/>]]>Interface rapide.</string>
<string name="Intro3Message">Envoyez des messages <![CDATA[<b>en quelques secondes</b>]]>.<![CDATA[<br/>]]> grâce à son interface rapide.</string>
<string name="Intro4Headline">Puissant</string>
<string name="Intro4Message">Envoyer et recevez des messages, des photo, des vidéos, des messages audios et plus <![CDATA[<b>sans limite</b>]]>. Compatible multi-plateforme.</string>
<string name="Intro4Message">Envoyer et recevez des messages, des photos, des vidéos, des messages audios et plus <![CDATA[<b>sans limite</b>]]>. Compatible multi-plateforme.</string>
<string name="Intro5Headline">Libre</string>
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> sera toujours libre.<![CDATA[<br/>]]>OpenSource. Pas de pub. Pas d\'inscription.</string>
<string name="Intro6Headline">Sûr</string>
<string name="Intro6Message"><![CDATA[<b>Chiffré</b>]]> avec des algorithmes communs. Les messages restent sur vos serveurs.</string>
<string name="Intro6Message"><![CDATA[<b>Chiffré</b>]]> avec des algorithmes reconnus. Les messages restent sur vos serveurs.</string>
<string name="Intro7Headline">Fiable</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> est sûr pour une utilisation professionnelle, compatible et basé sur des standards.</string>
<string name="IntroStartMessaging">Commencez à converser</string>
<!--plural-->
@@ -275,7 +276,7 @@
<!--date formatters-->
<string name="formatterMonthYear">MMMM yyyy</string>
<string name="formatterMonth">dd MMM</string>
<string name="formatterYear">dd.MM.yyyy</string>
<string name="formatterYear">dd/MM/yyyy</string>
<string name="chatDate">EEE, d MMMM</string>
<string name="chatFullDate">EEE, d MMMM yyyy</string>
<string name="formatterWeek">EEE</string>
@@ -285,10 +286,10 @@
<string name="AccountSettings">Paramètres du compte</string>
<string name="MyAccount">Mon compte</string>
<string name="MyName">Mon nom</string>
<string name="MyNameExplain">Votre nom, tel que montré par les destinataires.\n\nSi vous ne saisissez pas un nom, les destinataires ne verront que votre adresse e-mail renseignée dans les paramètres de compte.</string>
<string name="MyNameExplain">Votre nom, tel que montré aux destinataires.\n\nSi vous ne saisissez pas un nom, les destinataires ne verront que votre adresse e-mail renseignée dans les paramètres de compte.</string>
<string name="Password">Mot de passe</string>
<string name="SmtpPassword">Mot de passe SMTP</string>
<string name="FromAbove">De ci-dessus</string>
<string name="FromAbove">Le même qu\'au dessus</string>
<string name="SmtpLoginname">Identifiant SMTP</string>
<string name="SmtpPort">Port SMTP</string>
<string name="Automatic">Automatique</string>
@@ -309,34 +310,33 @@
<string name="MuteAlways">Toujours muet</string>
<string name="AskStartChatWith">Lancer une conversation avec <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="DeaddropHint">Pour lancer une conversation, cliquez sur le bouton de réponse en forme de flèche.</string>
<string name="NotYetImplemented">This function is not available or incomplete.</string>
<string name="DefaultStatusText">Envoyé avec ma messagerie Delta Chat</string>
<string name="NotYetImplemented">Cette fonction n\'est pas disponible ou non supportée complètement.</string>
<string name="DefaultStatusText">Envoyé avec Delta Chat</string>
<string name="Name" >Nom</string>
<string name="EmailAddress">Adresse e-mail</string>
<string name="CannotDeleteContact">Impossible de supprimer les contacts en cours d\'utilisation, bloquez-les à la place.</string>
<string name="BadEmailAddress">Mauvaise adresse e-mail.</string>
<string name="ContactCreated">Utilisateur créé.</string>
<string name="ViewProfile">Voir le profil</string>
<string name="OneMoment">Un moment…</string>
<string name="OneMoment">Veuillez patienter</string>
<string name="NoChatsHelp">Lancez une conversation en appuyant sur le bouton dans le coin inférieur droit ou appuyez sur le bouton menu pour plus d\'options.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> est sûr pour une utilisation professionnelle, compatible et basé sur des standards.</string>
<string name="InviteMenuEntry">Envoyer des invitations</string>
<string name="InviteText">J\'utilise la messagerie Delta Chat maintenant - %1$s - vous pouvez me contacter à %2$s</string>
<string name="AdvancedSettings">Paramètres avancés</string>
<string name="AskResetNotifications" >Êtes-vous sûr de vouloir réinitialiser toutes les paramètres de notification et les sons de cette page et de vos contacts et groups?</string>
<string name="AskResetNotifications" >Êtes-vous sûr de vouloir réinitialiser toutes les paramètres de notification et les sons de cette page et de vos contacts et groupes?</string>
<string name="AttachFiles">Joindre des fichiers</string>
<string name="ErrGroupNameEmpty">Merci de saisir un nom pour le groupe.</string>
<string name="MsgNewGroupDraftHint">Écrivez un premier message pour permettre aux autres de répondre dans ce group.\n\n• C\'est bon si tout les membres n\'utilisent pas Delta Chat.\n\n• La livraison du premier message peut prendre un moment.</string>
<string name="MsgNewGroupDraftHint">Écrivez un premier message pour permettre aux autres de répondre dans ce groupe.\n\n• Ça ne devrait pas poser de problème si tout les membres du groupe n\'utilisent pas Delta Chat.\n\n• La livraison du premier message peut prendre un moment.</string>
<string name="MsgNewGroupDraft">Bonjour, je viens juste de créer le groupe \"%1$s\" pour nous.</string>
<string name="MsgGroupNameChanged">Le nom du group a changé de \"%1$s\" à \"%2$s\".</string>
<string name="MsgGroupNameChanged">Le nom du groupe a changé de \"%1$s\" à \"%2$s\".</string>
<string name="MsgGroupImageChanged">L\'image du groupe a changé.</string>
<string name="MsgMemberAddedToGroup">Le membre %1$s vient d\'être ajouté.</string>
<string name="MsgMemberRemovedFromToGroup">Le membre %1$s vient d\'être retiré.</string>
<string name="AskAddMemberToGroup">Voulez-vous ajouter <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> au groupe?</string>
<string name="AskRemoveMemberFromGroup">Voulez-vous retirer <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> du groupe?</string>
<string name="AskAddMemberToGroup">Voulez-vous ajouter <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> au groupe ?</string>
<string name="AskRemoveMemberFromGroup">Voulez-vous retirer <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> du groupe ?</string>
<string name="ErrSelfNotInGroup">Vous devez être membre du groupe pour effectuer cette action.</string>
<string name="MsgGroupLeft">Groupe quitté.</string>
<string name="NoMessagesHint">Envoyez un message à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• C\'est bon si <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> .n\'utilise pas Delta Chat\n\n• La livraison du premier message peut prendre un moment.</string>
<string name="NoMessagesHint">Envoyez un message à <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> :\n\n• Ça ne devrait pas poser de problème si <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> n\'utilise pas Delta Chat\n\n• La livraison du premier message peut prendre un moment.</string>
<string name="SendNRcvReadReceipts">Recevoir et envoyer les accusés de lecture</string>
<string name="E2EEncryption">Chiffrement bout à bout</string>
<string name="E2EManagePrivateKeys">Gérer les clefs privées</string>
@@ -344,4 +344,27 @@
<string name="ResetContactsKey">Reinitialiser les clefs de l\'utilisateur</string>
<string name="ForwardToTitle">Renvoyer à…</string>
<string name="DoneHint">Fait.</string>
<string name="FileNotFound">Fichier %1$s non trouvé.</string>
<string name="Error">Erreur: %1$s</string>
<string name="NoNetwork">Réseau non disponible.</string>
<string name="Audio">Audio</string>
<string name="PleaseCutVideoToMaxSize">Veuillez couper la vidéo à une taille max. de %1$s.</string>
<string name="PermNotificationTitle">Connecté à %1$s</string>
<string name="PermNotificationText">En attente de messages…</string>
<string name="SettingsFor">Paramètres pour %1$s</string>
<string name="AutoplayGifs">Lecture automatique des GIFs</string>
<string name="HelpUrl">https://delta.chat/en/help</string>
<string name="EncryptedMessage">Message chiffré</string>
<string name="ImportFromDownloads">Importer depuis \"Downloads\"</string>
<string name="ExportToDownloads">Exporter vers \"Downloads\"</string>
<string name="ImportPrivateKeysAsk">Importer des clefs privées depuis \"Downloads\"?\n\n• Les clefs privées existantes ne sont pas supprimées\n\n• Les dernières clefs importées seront utilisées par défaut\n\nContinuer ?</string>
<string name="Encryption">Chiffrement</string>
<string name="EncrinfoE2E">La connexion est maintenant chiffré de bout-à-bout.</string>
<string name="EncrinfoE2EExplain">Si toutes les empreintes digitales correspondent sur l\'autre appareil, la connexion est sûre.</string>
<string name="EncrinfoTransport">Le chiffrement du transport au moins active sur mon serveur.</string>
<string name="EncrinfoNone">Aucun chiffrement sur mon serveur.</string>
<string name="EncrinfoNoE2EExplain">Le chiffrement de bout-à-bout sera activé automatiquement dès que le contact utilisera Delta Chat ou n\'importe quelle autre application de chiffrement automatique.</string>
<string name="EncrinfoFingerprints">Empreintes digitales</string>
<string name="Backup">Sauvegarde</string>
<string name="ImportBackupExplain">Pour importer une sauvegarde, copiez celle-ci vers le répertoire \"Downloads\" et réinstallez l\'application.</string>
</resources>
@@ -205,7 +205,7 @@
<string name="PermissionContacts">Aby można było łączyć się ze znajomymi na wszystkich urządzeniach, Delta Chat musi mieć dostęp do listy kontaktów.</string>
<string name="PermissionStorage">Aby wysyłać i zapisywać zdjęcia, wideo, muzykę i inne multimedia, Delta Chat musi mieć dostęp do pamięci.</string>
<string name="PermissionNoAudio">Aby wysyłać wiadomości głosowe Delta Chat musi mieć dostęp do mikrofonu.</string>
<string name="PermissionOpenSettings">Ustawienia</string>
<string name="PermissionOpenSettings">Dostosuj ustawienia</string>
<!--Intro view-->
<string name="Intro1Headline">Delta Chat</string>
<string name="Intro1Message">Komunikator o <![CDATA[<b>największym zasięgu</b>]]> na świecie.<![CDATA[<br/><b>Darmowy</b>]]> i <![CDATA[<b>bezpieczny</b>]]>.</string>
@@ -332,7 +332,7 @@
<string name="FromAbove">Jak wyżej</string>
<string name="SmtpLoginname">SMTP nazwa użytkownika</string>
<string name="SmtpPort">SMTP port</string>
<string name="Automatic">Atomatycznie</string>
<string name="Automatic">Automatycznie</string>
<string name="ImapServer">IMAP serwer</string>
<string name="ImapLoginname">IMAP nazwa użytkownika</string>
<string name="SmtpServer">SMTP serwer</string>
@@ -340,7 +340,7 @@
<string name="InboxHeadline">Skrzynka odbiorcza</string>
<string name="OutboxHeadline">Skrzynka nadawcza</string>
<string name="MyAccountExplain">Dla znanych dostawców usług poczty elektronicznej poniższe ustawienia są określane automatycznie.</string>
<string name="MyAccountExplain2" >Czasami IMAP / SMTP musi być włączony w interfejsie www poczty internetowej.\n\nZ problemami należy zwrócić się do usługodawcy e-mail lub znajomych.</string>
<string name="MyAccountExplain2" >Czasami <![CDATA[<b>]]>IMAP musi być włączony<![CDATA[</b>]]> w interfejsie www poczty internetowej.\n\nZ problemami należy zwrócić się do usługodawcy e-mail lub znajomych.</string>
<string name="AccountNotConfigured">Konto nie jest skonfigurowane</string>
<string name="AboutThisProgram">O Delta Chat</string>
<string name="NotSet">Nie ustawiona</string>
@@ -358,7 +358,9 @@
<string name="BadEmailAddress">Zły adres e-mail</string>
<string name="ContactCreated">Kontakt utworzony.</string>
<string name="ViewProfile">Pokaż profil</string>
<string name="OneMoment">Jedną chwilę…</string>
<!-- Translators: please use a very short string here, it should not much longer than
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">Jedną chwilę …</string>
<string name="NoChatsHelp">Zacznij przesyłanie wiadomości, naciskając przycisk nowej wiadomości w prawym dolnym rogu lub naciśnij przycisk menu, aby uzyskać więcej opcji.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> jest bezpieczny dla zastosowań biznesowych, zgodny i oparty na standardach.</string>
<string name="InviteMenuEntry">Wyślij zaproszenia</string>
@@ -386,5 +388,18 @@
<string name="ForwardToTitle">Przekaż do…</string>
<string name="SelectContact">Wybierz kontakt</string>
<string name="DoneHint">Gotowe.</string>
<string name="FileNotFound">Nie znaleziono pliku %1$s.</string>
<string name="Error">Błąd: %1$s</string>
<string name="NoNetwork">Sieć niedostępna.</string>
<string name="Audio">Audio</string>
<string name="PleaseCutVideoToMaxSize">Przytnij wideo do rozmiaru maks. %1$s.</string>
<string name="PermNotificationTitle">Połączony z %1$s</string>
<string name="PermNotificationText">Czekam na wiadomość</string>
<string name="SettingsFor">Ustawienia dla %1$s</string>
<string name="AutoplayGifs">Automatycznie odtwórz GIFy</string>
<string name="HelpUrl">https://jaworski-pawel.github.io/Delta/#help</string>
<string name="EncryptedMessage">Szyfrowana wiadomość</string>
<string name="ImportFromDownloads">Importuj z katalogu „Downloads”</string>
<string name="ExportToDownloads">Eksportuj do katalogu „Downloads”</string>
<string name="ImportPrivateKeysAsk">Zaimportować prywatne klucze z „Downloads”?\n\n• Istniejące prywatne klucze nie są usuwane\n\n• Ostatni zaimportowany klucz zostanie użyty jako nowy klucz domyślny\n\nKontynuować?</string>
</resources>
@@ -13,6 +13,7 @@
<string name="SelectChat">Selecione um Chat …</string>
<string name="Search">Busca</string>
<string name="MuteNotifications">Silenciar notificações</string>
<string name="MuteFor">Silenciar por %1$s</string>
<string name="UnmuteNotifications">Restaurar Som</string>
<string name="Draft">Rascunho</string>
<!--audio view-->
@@ -194,10 +195,9 @@
<string name="FromSelf">Você</string>
<!--Alert messages-->
<string name="NoHandleAppInstalled">Você não possui um aplicativo que suporte o tipo de arquivo \'%1$s\', por favor instale um para continuar</string>
<string name="AskAddMemberToGroup">Adicionar <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> no grupo?</string>
<string name="ContactAlreadyInGroup">Este usuário já está neste grupo</string>
<string name="ForwardMessagesTo">Encaminhar mensagem para <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="SendMessagesTo">Enviar mensagens para <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="ForwardMessagesTo">Encaminhar mensagem para <![CDATA[<b>%1$s</b>]]>?</string>
<string name="SendMessagesTo">Enviar mensagens para <![CDATA[<b>%1$s</b>]]>?</string>
<string name="AreYouSureDeleteThisChat">Você tem certeza que deseja apagar esta conversa?</string>
<string name="AreYouSureBlockContact">Você tem certeza que deseja bloquear este contato?</string>
<string name="AreYouSureDeleteContact">Você tem certeza que deseja apagar este contato?</string>
@@ -208,22 +208,22 @@
<string name="PermissionOpenSettings">Configurações</string>
<!--Intro view-->
<string name="Intro1Headline">Delta Chat</string>
<string name="Intro1Message">O aplicativo com o <![CDATA[<b>]]>maior número de usuários<![CDATA[</b>]]> do mundo.&lt;br/&gt;&lt;b&gt;Grátis&lt;/b&gt; e &lt;b&gt;seguro&lt;/b&gt;.</string>
<string name="Intro1Message">O aplicativo com o <![CDATA[<b>maior número de usuários</b>]]> do mundo.<![CDATA[<br/><b>Grátis</b> e <b>seguro</b>]]>.</string>
<string name="Intro2Headline">Independente</string>
<string name="Intro2Message">&lt;b&gt;Independente&lt;/b&gt; de serviços estrangeiros. Este aplicativo só precisa de um e-mail para funcionar.</string>
<string name="Intro2Message"><![CDATA[<b>Independente</b>]]> de serviços estrangeiros. Este aplicativo só precisa de um e-mail para funcionar.</string>
<string name="Intro3Headline">Rápido</string>
<string name="Intro3Message">&lt;b&gt;Envie mensagens&lt;/b&gt; num átimo.&lt;br/&gt; Interface leve.</string>
<string name="Intro3Message"><![CDATA[<b>Envie mensagens</b>]]> num átimo.<![CDATA[<br/>]]> Interface leve.</string>
<string name="Intro4Headline">Poderoso</string>
<string name="Intro4Message">&lt;b&gt;Sem limites&lt;/b&gt; para chats, imagens, vídeos, áudio e mais. Multicliente.</string>
<string name="Intro4Message"><![CDATA[<b>Sem limites</b>]]> para chats, imagens, vídeos, áudio e mais. Multicliente.</string>
<string name="Intro5Headline">Grátis</string>
<string name="Intro5Message">&lt;b&gt;Delta Chat&lt;/b&gt; será sempre grátis, de Código livre e sem propagandas.</string>
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> será sempre grátis, de Código livre e sem propagandas.</string>
<string name="Intro6Headline">Seguro</string>
<string name="Intro6Message">&lt;b&gt;Criptografia&lt;/b&gt; com as tecnologias mais usadas. Suas mensagens ficam no servidor de e-mail.</string>
<string name="Intro6Message"><![CDATA[<b>Criptografia</b>]]> com as tecnologias mais usadas. Suas mensagens ficam no servidor de e-mail.</string>
<string name="Intro7Headline">Confiável</string>
@@ -249,6 +249,21 @@
<item quantity="one">%d mensagem</item>
<item quantity="other">%d mensagens</item>
</plurals>
<plurals name="AreYouSureDeleteMessages">
<item quantity="one">Deletar a mensagem %d ? Ela também será removida no servidor.</item>
<item quantity="other">Deletar as mensagens %d ? Elas também serão removidas no servidor.</item>
</plurals>
<plurals name="NewMessagesInChats">
<!-- Translators: the first string placeholder "%s" gets replaced with the
text "%d new messages", so the complete sentence would be e.g.
"4 new messages in 2 chats". -->
<item quantity="one">%1$s na conversa %2$d</item>
<item quantity="other">%1$s nas conversas %2$d</item>
</plurals>
<plurals name="Chats">
<item quantity="one">%d conversa</item>
<item quantity="other">%d conversas</item>
</plurals>
<plurals name="Minutes">
<item quantity="one">%d minuto</item>
<item quantity="other">%d minutos</item>
@@ -269,6 +284,13 @@
<item quantity="one">%d mês</item>
<item quantity="other">%d meses</item>
</plurals>
<plurals name="MaxNotifications">
<!-- Translators: the second string placeholder "%s" gets replaced with the
text "%d minutes", so the complete sentence would be e.g.
"At most 8 notifications within 3 minutes". -->
<item quantity="one">No máximo %1$d notificação a cada %2$s</item>
<item quantity="other">No máximo %1$d notificações dentro de %2$s</item>
</plurals>
<!--date formatters-->
<string name="formatterMonthYear">MMMM yyyy</string>
<string name="formatterMonth">dd MMM</string>
@@ -296,7 +318,7 @@
<string name="InboxHeadline">Caixa de entrada</string>
<string name="OutboxHeadline">Caixa de saída</string>
<string name="MyAccountExplain">Para provedores de e-mail mais populares as configurações a seguir são detectadas automaticamente.</string>
<string name="MyAccountExplain2">Por vezes é necessário habilitar o IMAP/SMTP nas configurações do servidor de e-mail.\n\nSe tiver dificuldades peça ajuda ao servidor ou a algum amigo.</string>
<string name="MyAccountExplain2" >Por vezes é necessário habilitar o IMAP/SMTP nas configurações do servidor de e-mail.\n\nSe tiver dificuldades peça ajuda ao servidor ou a algum amigo.</string>
<string name="AccountNotConfigured">Conta não configurada</string>
<string name="AboutThisProgram">Sobre Delta Chat</string>
<string name="NotSet">Não configurado</string>
@@ -304,7 +326,7 @@
<string name="Deaddrop">Caixa de entrada</string>
<string name="DeaddropInChatlist">Exibir caixa de entrada na lista de conversas</string>
<string name="MuteAlways">Sempre mudo</string>
<string name="AskStartChatWith">Começar um chat com &lt;b&gt;%1$s&lt;/b&gt;?</string>
<string name="AskStartChatWith">Começar um chat com <![CDATA[<b>%1$s</b>]]>?</string>
<string name="DeaddropHint">Para conversar clique na seta.</string>
<string name="NotYetImplemented">Esta função ainda não está disponível ou ainda não está completamente desenvolvida.</string>
<string name="DefaultStatusText">Enviado pelo Delta Chat Messenger</string>
@@ -314,9 +336,11 @@
<string name="BadEmailAddress">Endereço inválido</string>
<string name="ContactCreated">Usuário criado.</string>
<string name="ViewProfile">Ver perfil</string>
<!-- Translators: please use a very short string here, it should not much longer than
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">Um momento…</string>
<string name="NoChatsHelp">Comece uma conversa pressionando \"+\" do canto direito inferior. Pressione o menu para mais opções.</string>
<string name="Intro7Message">&lt;b&gt;Delta Chat&lt;/b&gt; é seguro para uso comercial e compatível com os padrões de uso.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> é seguro para uso comercial e compatível com os padrões de uso.</string>
<string name="InviteMenuEntry">Convidar Amigos</string>
<string name="InviteText">Estou usando o Delta Chat messenger - %1$s - meu contato neste app é: %2$s</string>
<string name="AdvancedSettings">Configurações avançadas</string>
@@ -329,19 +353,40 @@
<string name="MsgGroupImageChanged">Imagem do grupo alterada.</string>
<string name="MsgMemberAddedToGroup">Adicionado %1$s como membro.</string>
<string name="MsgMemberRemovedFromToGroup">%1$s removido.</string>
<string name="AskRemoveMemberFromGroup">Remover usuário &lt;b&gt;%1$s&lt;/b&gt; do grupo?</string>
<string name="AskAddMemberToGroup">Adicionar <![CDATA[<b>%1$s</b>]]> no grupo?</string>
<string name="AskRemoveMemberFromGroup">Remover usuário <![CDATA[<b>%1$s</b>]]> do grupo?</string>
<string name="ErrSelfNotInGroup">É necessário ser um membro do grupo para fazer isso.</string>
<string name="MsgGroupLeft">Deixou o grupo.</string>
<string name="NoMessagesHint">Enviar mensagem para &lt;b&gt;%1$s&lt;/b&gt;:\n\n• Tudo bem se &lt;b&gt;%2$s&lt;/b&gt; não usa Delta Chat.\n\n• A primeira mensagem pode demorar um pouco.</string>
<string name="NoMessagesHint">Enviar mensagem para <![CDATA[<b>%1$s</b>]]>:\n\n• Tudo bem se <![CDATA[<b>%2$s</b>]]> não usa Delta Chat.\n\n• A primeira mensagem pode demorar um pouco.</string>
<string name="SendNRcvReadReceipts">Receber e dar confirmações</string>
<string name="E2EEncryption">Criptografia ponta-a-ponta</string>
<string name="PreferE2EEncryption">Preferir criptografia ponta-a-ponta</string>
<string name="E2EManagePrivateKeys">Gerir chaves privadas</string>
<string name="E2ECompareKeys">Comparar chaves</string>
<string name="ResetContactsKey">Apagar chave do usuário</string>
<string name="ForwardToTitle">Selecione um Chat …</string>
<string name="SelectContact">Escolha um contato</string>
<string name="DoneHint">Concluído.</string>
<string name="FileNotFound">O arquivo %1$s não foi encontrado.</string>
<string name="Error">Erro: %1$s</string>
<string name="NoNetwork">Rede indisponível</string>
<string name="Audio">Áudio</string>
<string name="PleaseCutVideoToMaxSize">Favor cortar o vídeo ao tamanho máx. de 1$s.</string>
<string name="PermNotificationTitle">Conectado em %1$s</string>
<string name="PermNotificationText">Aguardando mensagens …</string>
<string name="AutoplayGifs">Auto-Reproduzir GIFs</string>
<string name="SettingsFor">Configuração para %1$s</string>
<string name="AutoplayGifs">Animar GIFs automaticamente</string>
<string name="EncryptedMessage">Mensagem criptografada</string>
<string name="ImportFromDownloads">Importar de \"Downloads"</string>
<string name="ExportToDownloads">Exportar para \"Downloads"</string>
<string name="ImportPrivateKeysAsk">Importar chaves privadas da pasta \"Downloads\"?\n\n• As chaves já constantes do aplicativo não serão deletadas\n\n• A última chave importada será usada como a padrão\n\nContinuar?</string>
<string name="Encryption">Criptografia</string>
<string name="EncrinfoE2E">A conexão está criptografada ponta-a-ponta.</string>
<string name="EncrinfoE2EExplain">Se ambas impressões combinam no outro dispositivo, a conexão é segura.</string>
<string name="EncrinfoTransport">Criptografar tráfego ao menos até o meu servidor.</string>
<string name="EncrinfoNone">Sem encriptação para meu servidor.</string>
<string name="EncrinfoNoE2EExplain">A criptografia ponta-a-ponta será ativada automaticamente tão logo o seu contato utilize algum aplicativo que tenha suporte ao Autocrypt, como o Delta Chat.</string>
<string name="EncrinfoFingerprints">Impressões</string>
<string name="Backup">Becape</string>
<string name="ImportBackupExplain">Para importar um becape, copie-o na pasta \"Downloads\" e reinstale o aplicativo.</string>
</resources>
@@ -83,7 +83,7 @@
<string name="Default">По умолчанию</string>
<string name="OnlyIfSilent">Только если тишина</string>
<string name="ChatBackground">Фоновое изображение чата</string>
<string name="SendByEnter">Отправить нажав "ввод"</string>
<string name="SendByEnter">Отправить нажав "Ввод"</string>
<string name="Help">Помощь</string>
<string name="Enabled">Вкл</string>
<string name="Disabled">Выкл</string>
@@ -115,7 +115,7 @@
<!--passcode view-->
<string name="Passcode">Код блокировки</string>
<string name="ChangePasscode">Изменить код блокировки</string>
<string name="ChangePasscodeInfo">Когда вы установите дополнительный код доступа, на странице чатов появится значок блокировки. Нажмите, чтобы заблокировать и разблокировать приложение. \ N \ nПримечание. Если вы забудете пароль, вам нужно будет удалить и переустановить приложение.</string>
<string name="ChangePasscodeInfo">Когда вы установите дополнительный код доступа, на странице чатов появится значок блокировки. Нажмите, чтобы заблокировать и разблокировать приложение.\n\nПримечание: если вы забудете пароль, вам нужно будет удалить и переустановить приложение.</string>
<string name="PasscodePIN">ПИН</string>
<string name="PasscodePassword">Пароль</string>
<string name="EnterCurrentPasscode">Введите текущий код блокировки</string>
@@ -126,7 +126,7 @@
<string name="PasscodeDoNotMatch">Код блокировки не подходит</string>
<string name="AutoLock">Автоблокировка</string>
<string name="AutoLockInfo">Необходим код блокировки если лимит времени превышен.</string>
<string name="UnlockFingerprint">Раблокировать с помощью отпечатка пальца</string>
<string name="UnlockFingerprint">Разблокировать с помощью отпечатка пальца</string>
<string name="FingerprintInfo">Подтвердить отпечаток пальца для продолжения</string>
<string name="FingerprintNotRecognized">Отпечаток пальца не опознан. Повторите снова</string>
<!--photo gallery view-->
@@ -220,7 +220,7 @@
<string name="Intro4Message"><![CDATA[<b>Безлимитные</b>]]> чаты, фото, видео, аудио сообщения и многое другое. Поддержка различных платформ и устройств.</string>
<string name="Intro5Headline">Бесплатный</string>
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> бесплатен навсегда.<![CDATA[<br/>]]>Открытое программное обеспечение. Без рекламы. Без навязчивых подписок. Без привязки к поставщику услуг.</string>
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> бесплатен навсегда.<![CDATA[<br/>]]>Открытое ПО. Без рекламы. Без навязчивых подписок. Без привязки к поставщику услуг.</string>
<string name="Intro6Headline">Безопасный</string>
<string name="Intro6Message"><![CDATA[<b>Шифрование</b>]]> со всеми известными алгоритмами. Сообщения остаются на ваших серверах.</string>
@@ -231,26 +231,38 @@
<!--plural-->
<plurals name="Members">
<item quantity="one">%d участник</item>
<item quantity="few">%d участники</item>
<item quantity="many">%d участники</item>
<item quantity="other">%d участники</item>
</plurals>
<plurals name="Contacts">
<item quantity="one">%d контакт</item>
<item quantity="other">%d контакты</item>
<item quantity="few">%d контактов</item>
<item quantity="many">%d контактов</item>
<item quantity="other">%d контактов</item>
</plurals>
<plurals name="MeAndMembers">
<item quantity="one">Я и %d участник</item>
<item quantity="other">Я и %d участник</item>
<item quantity="few">Я и %d участников</item>
<item quantity="many">Я и %d участников</item>
<item quantity="other">Я и %d участников</item>
</plurals>
<plurals name="NewMessages">
<item quantity="one">%d новое сообщение</item>
<item quantity="other">%d новые сообщения</item>
<item quantity="few">%d новых сообщений</item>
<item quantity="many">%d новых сообщений</item>
<item quantity="other">%d новых сообщений</item>
</plurals>
<plurals name="messages">
<item quantity="one">%d сообщение</item>
<item quantity="few">%d сообщения</item>
<item quantity="many">%d сообщения</item>
<item quantity="other">%d сообщения</item>
</plurals>
<plurals name="AreYouSureDeleteMessages">
<item quantity="one">Удалить %d сообщение? Сообщение также будет удалено с сервера.</item>
<item quantity="few">Удалить %d сообщения? Сообщения также будут удалены с сервера.</item>
<item quantity="many">Удалить %d сообщения? Сообщения также будут удалены с сервера.</item>
<item quantity="other">Удалить %d сообщения? Сообщения также будут удалены с сервера.</item>
</plurals>
<plurals name="NewMessagesInChats">
@@ -258,30 +270,44 @@
text "%d new messages", so the complete sentence would be e.g.
"4 new messages in 2 chats". -->
<item quantity="one">%1$s в %2$d чате</item>
<item quantity="few">%1$s в %2$d чатах</item>
<item quantity="many">%1$s в %2$d чатах</item>
<item quantity="other">%1$s в %2$d чатах</item>
</plurals>
<plurals name="Chats">
<item quantity="one">%d чат</item>
<item quantity="few">%d чатах</item>
<item quantity="many">%d чатах</item>
<item quantity="other">%d чатах</item>
</plurals>
<plurals name="Minutes">
<item quantity="one">%d минута</item>
<item quantity="few">%d минут</item>
<item quantity="many">%d минут</item>
<item quantity="other">%d минут</item>
</plurals>
<plurals name="Hours">
<item quantity="one">%d час</item>
<item quantity="few">%d часов</item>
<item quantity="many">%d часов</item>
<item quantity="other">%d часов</item>
</plurals>
<plurals name="Days">
<item quantity="one">%d день</item>
<item quantity="few">%d дней</item>
<item quantity="many">%d дней</item>
<item quantity="other">%d дней</item>
</plurals>
<plurals name="Weeks">
<item quantity="one">%d неделя</item>
<item quantity="few">%d недель</item>
<item quantity="many">%d недель</item>
<item quantity="other">%d недель</item>
</plurals>
<plurals name="Months">
<item quantity="one">%d месяц</item>
<item quantity="few">%d месяцев</item>
<item quantity="many">%d месяцев</item>
<item quantity="other">%d месяцев</item>
</plurals>
<plurals name="MaxNotifications">
@@ -289,17 +315,19 @@
text "%d minutes", so the complete sentence would be e.g.
"At most 8 notifications within 3 minutes". -->
<item quantity="one">Не более %1$d сообщения в течении %2$s</item>
<item quantity="few">Не более %1$d сообщений в течении %2$s</item>
<item quantity="many">Не более %1$d сообщений в течении %2$s</item>
<item quantity="other">Не более %1$d сообщений в течении %2$s</item>
</plurals>
<!--date formatters-->
<string name="formatterMonthYear">MMMM yyyy</string>
<string name="formatterMonth">MMM dd</string>
<string name="formatterYear">dd.MM.yyyy</string>
<string name="chatDate">EEE, MMMM d</string>
<string name="chatFullDate">EEE, MMMM d, yyyy</string>
<string name="formatterMonthYear">ММММ гггг</string>
<string name="formatterMonth">МММ дд</string>
<string name="formatterYear">дд.ММ.гггг</string>
<string name="chatDate">EEE, ММММ д</string>
<string name="chatFullDate">EEE, ММММ д, гггг</string>
<string name="formatterWeek">EEE</string>
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="formatterDay24H">ЧЧ:мм</string>
<string name="formatterDay12H">ч:мм a</string>
<string name="formatDateAtTime">%1$s в %2$s</string>
<string name="AccountSettings">Настройки аккаунта</string>
<string name="MyAccount">Мой аккаунт</string>
@@ -320,7 +348,7 @@
<string name="MyAccountExplain">Для известных поставщиков электронной почты дополнительные настройки определяются автоматически.</string>
<string name="MyAccountExplain2" >Иногда, <![CDATA[<b>]]>IMAP должен быть включен<![CDATA[</b>]]> в веб-интерфейсе электронной почты.\n\nВ случае затруднений, обратитесь к своему поставщику электронной почты или компентентным друзьям.</string>
<string name="AccountNotConfigured">Аккаунт не настроен</string>
<string name="AboutThisProgram">О Delta Chat (Дельта Чат)</string>
<string name="AboutThisProgram">Delta Chat (Дельта Чат)</string>
<string name="NotSet">Не задано</string>
<string name="NewChat">Новый чат</string>
<string name="Deaddrop">Почтовый ящик</string>
@@ -328,7 +356,7 @@
<string name="MuteAlways">Всегда отключено</string>
<string name="AskStartChatWith">Начать чат с <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="DeaddropHint">Чтобы начать чат, нажмите стрелку ответа.</string>
<string name="NotYetImplemented">Эта функция недоступна или неполна.</string>
<string name="NotYetImplemented">Эта функция недоступна или в разработке.</string>
<string name="DefaultStatusText">Отправлено из Delta Chat Messenger</string>
<string name="Name" >Имя</string>
<string name="EmailAddress" >Адрес электронной почты</string>
@@ -340,15 +368,15 @@
the string needed for video time+size (0:00, 12,3 Mib) -->
<string name="OneMoment">Один момент …</string>
<string name="NoChatsHelp">Начните обмен сообщениями, нажав кнопку нового чата в нижнем правом углу или коснитесь кнопки меню для получения дополнительных параметров.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> безопасен для использования в бизнесе, основанным на совместимых стандартах.</string>
<string name="InviteMenuEntry">Отправить приглашения</string>
<string name="InviteText">Я\ использую Delta Chat messenger сейчас - %1$s - вы можете написать мне тоже %2$s</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> безопасен для использования в бизнесе, основан на совместимых стандартах.</string>
<string name="InviteMenuEntry">Отправить приглашение</string>
<string name="InviteText">Я использую систему мгновенных сообщений Delta Chat - %1$s - вы тоже можете мне написать на %2$s</string>
<string name="AdvancedSettings">Расширенные настройки</string>
<string name="AskResetNotifications" >Сбросить все настройки уведомлений и звуки этой страницы, а также ваших контактов и групп?</string>
<string name="AttachFiles">Прикрепить файлы</string>
<string name="ErrGroupNameEmpty">Введите название группы.</string>
<string name="MsgNewGroupDraftHint">Напишите первое сообщение, чтобы другие могли отвечать в этой группе.\n\n• Это нормально, если не все участники используют Delta Chat.\n\n• Доставка первого сообщения может занять некоторое время.</string>
<string name="MsgNewGroupDraft">Привет!, Я только что создал группу \"%1$s\" для нас.</string>
<string name="MsgNewGroupDraft">Привет! Я только что создал группу \"%1$s\" для нас.</string>
<string name="MsgGroupNameChanged">Название группы изменено с \"%1$s\" в \"%2$s\".</string>
<string name="MsgGroupImageChanged">Изображение группы изменено.</string>
<string name="MsgMemberAddedToGroup">Участник %1$s добавлен.</string>
@@ -371,8 +399,13 @@
<string name="NoNetwork">Сеть недоступна.</string>
<string name="Audio">Аудио</string>
<string name="PleaseCutVideoToMaxSize">Обрежьте видео до максимального размера в %1$s.</string>
<string name="PermNotificationTitle">Подключен к %1$s</string>
<string name="PermNotificationText">Ожидание сообщений </string>
<string name="PermNotificationTitle">Связан с %1$s</string>
<string name="PermNotificationText">Подключён</string>
<string name="SettingsFor">Настройки для %1$s</string>
</resources>
<string name="AutoplayGifs">Автозапуск GIF</string>
<string name="HelpUrl">https://delta.chat/en/help</string>
<string name="EncryptedMessage">Зашифрованное сообщение</string>
<string name="ImportPrivateKeys">Импортировать из \"Загрузки\"</string>
<string name="ExportPrivateKeys">Экспортировать в \"Загрузки\"</string>
<string name="ImportPrivateKeysAsk">Импортировать приватный ключи из \"Загрузки\"?\n\n• Существующие ключи не удалены\n\n• Последний ключ будет использован как новый по умолчанию\n\nПродолжить?</string>
</resources>
+13 -8
View File
@@ -115,7 +115,7 @@
<!--passcode view-->
<string name="Passcode">Passcode Lock</string>
<string name="ChangePasscode">Change Passcode</string>
<string name="ChangePasscodeInfo">When you set up an additional passcode, a lock icon will appear on the chats page. Tap it to lock and unlock the app.\n\nNote: if you forget the passcode, you\'ll need to delete and reinstall the app.</string>
<string name="ChangePasscodeInfo">When you set up an additional passcode, a lock icon will appear on the chats page. Tap it to lock the app.\n\nNote: if you forget the passcode, you\'ll need to delete and reinstall the app.</string>
<string name="PasscodePIN">PIN</string>
<string name="PasscodePassword">Password</string>
<string name="EnterCurrentPasscode">Enter your current passcode</string>
@@ -359,7 +359,7 @@
<string name="MsgGroupLeft">Group left.</string>
<string name="NoMessagesHint">Send message to <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• It is okay if <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> does not use Delta Chat.\n\n• Delivering the first message may take a moment.</string>
<string name="SendNRcvReadReceipts">Receive and send read receipts</string>
<string name="E2EEncryption">End-to-end-encryption</string>
<string name="PreferE2EEncryption">Prefer end-to-end-encryption</string>
<string name="E2EManagePrivateKeys">Manage private keys</string>
<string name="E2ECompareKeys">Compare keys</string>
<string name="ResetContactsKey">Reset contact\'s key</string>
@@ -377,11 +377,16 @@
<string name="AutoplayGifs">Autoplay GIFs</string>
<string name="HelpUrl">https://delta.chat/en/help</string>
<string name="EncryptedMessage">Encrypted message</string>
<string name="ImportPrivateKeys">Import from \"Downloads\"</string>
<string name="ExportPrivateKeys">Export to \"Downloads\"</string>
<string name="ImportFromDownloads">Import from \"Downloads\"</string>
<string name="ExportToDownloads">Export to \"Downloads\"</string>
<string name="ImportPrivateKeysAsk">Import private keys from \"Downloads\"?\n\n• Existing private keys are not deleted\n\n• The last imported key will be used as the new default key\n\nContinue?</string>
<plurals name="ImportKeysDone">
<item quantity="one">%d key imported</item>
<item quantity="other">%d keys imported</item>
</plurals>
<string name="Encryption">Encryption</string>
<string name="EncrinfoE2E">The connection is end-to-end-encrypted.</string>
<string name="EncrinfoE2EExplain">If all fingerprints match on the other device, the connection is safe.</string>
<string name="EncrinfoTransport">Transport-encryption at least up to my server.</string>
<string name="EncrinfoNone">No encryption to my server.</string>
<string name="EncrinfoNoE2EExplain">Encryption will switch to end-to-end automatically as soon as the contact uses Delta Chat or another Autocrypt-enabled app.</string>
<string name="EncrinfoFingerprints">Fingerprints</string>
<string name="Backup">Backup</string>
<string name="ImportBackupExplain">To import a backup, copy to the backup to the \"Downloads\" directory and reinstall the app.</string>
</resources>
+5 -8
View File
@@ -2,7 +2,7 @@ Delta Chat Android Client
================================================================================
This is the android client for Delta Chat. For the core library and other common
information, please refer to https://github.com/r10s/deltachat-core and to
information, please refer to https://github.com/deltachat/deltachat-core and to
https://delta.chat .
@@ -13,15 +13,12 @@ Beside a build in Android Studio, you have to call `ndk-build` in the
`MessengerProj` directory. Moreover, place a copy of your keyfile eg. to
`MessengerProj/config/debug.keystore`.
![Logo](https://delta.chat/public/images/features/start-img4.png)
![Logo](https://delta.chat/assets/features/start-img4.png)
The core library (https://github.com/r10s/deltachat-core), is checked out
automatically; there is not need to build the core library itself, the android
The core library (https://github.com/deltachat/deltachat-core), is checked out
automatically; there is no need to build the core library itself, the android
client just references the needed files.
The Delta Chat Android Frontend is based upon
[Telegram FOSS](https://github.com/slp/Telegram-FOSS).
---
Copyright (C) 2017 Delta Chat contributors
Copyright © 2017 Delta Chat contributors