Compare commits

..

44 Commits

Author SHA1 Message Date
B. Petersen 9123210f69 bump version 2017-12-15 17:27:07 +01:00
B. Petersen 630a259a5a add missing MrLotUnref() function, fixes #218 2017-12-15 17:26:54 +01:00
B. Petersen f0183064ed show a 'not yet implemented' message when trying to enter the setup code 2017-12-15 17:08:28 +01:00
B. Petersen 11bca87a47 update gradle 2017-12-15 08:22:56 +01:00
B. Petersen 3863b74fbd Update messenger-backend submodule. 2017-12-15 01:04:56 +01:00
B. Petersen 8216ce7d20 bump version 2017-12-15 01:02:46 +01:00
B. Petersen a7a06ce26b wording 2017-12-15 00:05:37 +01:00
B. Petersen e9e4c01e54 Update messenger-backend submodule. 2017-12-14 23:59:26 +01:00
B. Petersen 47e2fa4a22 disable entering the setup code, for now 2017-12-14 23:59:07 +01:00
B. Petersen 90fad460a6 changelog 2017-12-14 23:54:41 +01:00
B. Petersen 929962c228 bump version 2017-12-14 23:47:52 +01:00
B. Petersen a55edf0ba0 update gradle, simplify versionCode, add flavorDimensions, fixed #217 2017-12-14 23:40:54 +01:00
B. Petersen e255926e10 allow self talk chats 2017-12-14 23:39:06 +01:00
B. Petersen 21ed3e06e6 update german and polish translations 2017-12-11 22:21:53 +01:00
B. Petersen 2ceffb283f update translations 2017-12-09 16:29:50 +01:00
B. Petersen 2e52bacfba wording 2017-12-09 16:28:13 +01:00
B. Petersen 6c624e93b3 Update messenger-backend submodule. 2017-12-07 16:13:49 +01:00
B. Petersen ee5b2371e0 update jni makefile 2017-12-07 16:13:34 +01:00
B. Petersen 18297213f2 update translations 2017-12-06 16:39:31 +01:00
B. Petersen 1373e46d04 regarding cancel/move events on setup message clicks 2017-12-06 12:58:11 +01:00
B. Petersen d7c6bac301 add a little margin below the last setup code row (for kitkat) 2017-12-06 12:48:27 +01:00
B. Petersen b9e3a5454e update Russian translation 2017-12-06 12:26:21 +01:00
B. Petersen 3decd485ea add an option to retry entering the setup code 2017-12-06 12:24:21 +01:00
B. Petersen 285fcf3df3 Update messenger-backend submodule. 2017-12-06 11:27:10 +01:00
B. Petersen 0312960e93 show a message after entering the setup code 2017-12-06 00:39:07 +01:00
B. Petersen cfee7400c9 update Italian 2017-12-06 00:20:03 +01:00
B. Petersen e113fb0902 add layout file for displaying the setup code entry fields 2017-12-06 00:19:18 +01:00
B. Petersen deedd1acac add ui for entering the setup code 2017-12-06 00:17:40 +01:00
B. Petersen e1d912158d detect clicks on setup messages 2017-12-05 17:30:44 +01:00
B. Petersen 373e15b08a changelog 2017-12-05 16:10:57 +01:00
B. Petersen e2bdb0bf13 do not use a symbol for the enter key; while a good idea, in practise, this creates too much confusion and problems with translations. 2017-12-05 16:03:01 +01:00
B. Petersen 19de16887c fix some string escapes 2017-12-05 15:50:07 +01:00
B. Petersen 8609892116 update Albanian 2017-12-05 15:45:08 +01:00
B. Petersen 76717b908d connect after importing a backup, fixes #213 2017-12-05 15:33:52 +01:00
B. Petersen c57ae9861f do the key transfer in a separate thread 2017-12-05 14:01:48 +01:00
B. Petersen 63a2899fdc hilite setup message 2017-12-04 17:44:05 +01:00
B. Petersen 2d86c5b10b update Albanian translation 2017-12-04 16:31:33 +01:00
B. Petersen bd5ba8ebaf Add Setup Message text 2017-12-03 23:52:51 +01:00
B. Petersen 0e90ea1308 add albanian translation 2017-12-03 16:49:25 +01:00
B. Petersen ec05602bb1 update german translation 2017-12-03 16:47:36 +01:00
B. Petersen 2c55c93367 add ui for initiating autocrypt key transfer 2017-12-03 15:53:59 +01:00
B. Petersen b37a91cdd9 adapt to new imex api 2017-11-30 23:44:46 +01:00
B. Petersen 223c39d26a comment 2017-11-30 14:16:56 +01:00
B. Petersen 0a46073552 comment 2017-11-29 17:55:40 +01:00
32 changed files with 938 additions and 69 deletions
+8
View File
@@ -1,5 +1,13 @@
# Delta Chat Changelog
## v0.11.2
2017-12-15
* Add option to initiate Autocrypt Key Transfer
* Connect after importing a backup
* Add Albanian translation
* Update German, Italian, Polish and Russian translations
## v0.10.0
2017-11-29
+9 -7
View File
@@ -32,7 +32,7 @@ dependencies {
android {
compileSdkVersion 25
buildToolsVersion '25.0.2'
buildToolsVersion '26.0.2'
useLibrary 'org.apache.http.legacy'
defaultConfig.applicationId = "com.b44t.messenger"
@@ -79,13 +79,12 @@ android {
}
}
defaultConfig.versionCode = 50
sourceSets.main {
jniLibs.srcDir 'libs'
jni.srcDirs = [] //disable automatic ndk-build call
}
flavorDimensions "none"
productFlavors {
/*
x86 {
@@ -108,19 +107,22 @@ android {
}
*/
fat {
versionCode = 3
dimension "none"
//versionCode = 3
}
}
applicationVariants.all { variant ->
/*applicationVariants.all { variant ->
def abiVersion = variant.productFlavors.get(0).versionCode
variant.mergedFlavor.versionCode = defaultConfig.versionCode * 10 + abiVersion;
}
}*/
defaultConfig {
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.10.0" // do NOT forget to increase defaultConfig.versionCode!
versionName "0.11.2" // do NOT forget to increase defaultConfig.versionCode!
versionCode 507
}
}
+1
View File
@@ -1638,6 +1638,7 @@ LOCAL_SRC_FILES += \
./messenger-backend/src/mrchatlist.c \
./messenger-backend/src/mrcontact.c \
./messenger-backend/src/mrdehtml.c \
./messenger-backend/src/mrhash.c \
./messenger-backend/src/mrimap.c \
./messenger-backend/src/mrjob.c \
./messenger-backend/src/mrkey.c \
+54 -4
View File
@@ -258,9 +258,9 @@ JNIEXPORT jint Java_com_b44t_messenger_MrMailbox_configureAndConnect(JNIEnv *env
}
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_configureCancel(JNIEnv *env, jclass cls)
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_stopOngoingProcess(JNIEnv *env, jclass cls)
{
mrmailbox_configure_cancel(get_mrmailbox_t(env, cls));
mrmailbox_stop_ongoing_process(get_mrmailbox_t(env, cls));
}
@@ -603,11 +603,33 @@ JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_cmdline(JNIEnv *env, jclass
}
JNIEXPORT void Java_com_b44t_messenger_MrMailbox_imex(JNIEnv *env, jclass cls, jint what, jstring dir)
JNIEXPORT jstring Java_com_b44t_messenger_MrMailbox_initiateKeyTransfer(JNIEnv *env, jclass cls)
{
jstring setup_code = NULL;
char* temp = mrmailbox_initiate_key_transfer(get_mrmailbox_t(env, cls));
if( temp ) {
setup_code = JSTRING_NEW(temp);
free(temp);
}
return setup_code;
}
JNIEXPORT jboolean Java_com_b44t_messenger_MrMailbox_continueKeyTransfer(JNIEnv *env, jclass cls, jint msg_id, jstring setupCode)
{
CHAR_REF(setupCode);
jboolean ret = mrmailbox_continue_key_transfer(get_mrmailbox_t(env, cls), msg_id, setupCodePtr);
CHAR_UNREF(setupCode);
return ret;
}
JNIEXPORT int Java_com_b44t_messenger_MrMailbox_imex(JNIEnv *env, jclass cls, jint what, jstring dir)
{
CHAR_REF(dir);
mrmailbox_imex(get_mrmailbox_t(env, cls), what, dirPtr, "");
jint ret = mrmailbox_imex(get_mrmailbox_t(env, cls), what, dirPtr, "");
CHAR_UNREF(dir);
return ret;
}
@@ -764,6 +786,12 @@ JNIEXPORT jboolean Java_com_b44t_messenger_MrChat_isUnpromoted(JNIEnv *env, jobj
}
JNIEXPORT jboolean Java_com_b44t_messenger_MrChat_isSelfTalk(JNIEnv *env, jobject obj)
{
return mrchat_is_self_talk(get_mrchat_t(env, obj)) != 0;
}
JNIEXPORT jstring Java_com_b44t_messenger_MrChat_MrChatGetDraft(JNIEnv *env, jclass c, jlong hChat) /* returns NULL for "no draft" */
{
mrchat_t* ths = (mrchat_t*)hChat;
@@ -1025,6 +1053,22 @@ JNIEXPORT jboolean Java_com_b44t_messenger_MrMsg_isSystemcmd(JNIEnv *env, jobjec
}
JNIEXPORT jboolean Java_com_b44t_messenger_MrMsg_isSetupMessage(JNIEnv *env, jobject obj)
{
return mrmsg_is_setupmessage(get_mrmsg_t(env, obj));
}
JNIEXPORT jstring Java_com_b44t_messenger_MrMsg_getSetupCodeBegin(JNIEnv *env, jobject obj)
{
char* temp = mrmsg_get_setupcodebegin(get_mrmsg_t(env, obj));
jstring ret = JSTRING_NEW(temp);
free(temp);
return ret;
}
/*******************************************************************************
* MrContact
******************************************************************************/
@@ -1153,6 +1197,12 @@ JNIEXPORT jint Java_com_b44t_messenger_MrLot_getState(JNIEnv *env, jobject obj)
}
JNIEXPORT void Java_com_b44t_messenger_MrLot_MrLotUnref(JNIEnv *env, jclass c, jlong hLot)
{
mrlot_unref((mrlot_t*)hLot);
}
/*******************************************************************************
* Tools
******************************************************************************/
@@ -307,7 +307,7 @@ public class BaseFragment {
}
try {
visibleDialog = dialog;
visibleDialog.setCanceledOnTouchOutside(true);
//visibleDialog.setCanceledOnTouchOutside(true); -- we do overwrite this from time to time manually, eg. for showing the setup code. so, not all dialogs should be cancelled when touching outside!
visibleDialog.setOnDismissListener(new DialogInterface.OnDismissListener() {
@Override
public void onDismiss(DialogInterface dialog) {
@@ -75,6 +75,7 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
public interface ChatMessageCellDelegate {
void didPressedUserAvatar(ChatMessageCell cell, TLRPC.User user);
void didPressedSetupMessage(ChatMessageCell cell);
void didLongPressed(ChatMessageCell cell);
void didPressedUrl(MessageObject messageObject, ClickableSpan url, boolean longPress);
void didPressedImage(ChatMessageCell cell);
@@ -207,6 +208,8 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
private AvatarDrawable avatarDrawable;
private boolean avatarPressed;
private boolean setupmessagePressed;
private boolean drawNewchatButton;
private boolean newchatPressed;
private int newchatStartX;
@@ -658,7 +661,11 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
newchatPressed = true;
result = true;
invalidate();
} else if( currentMessageObject.messageOwner.is_setup_message && currentBackgroundDrawable.getBounds().contains((int)x, (int)y) ) {
setupmessagePressed = true;
result = true;
}
if (result) {
startCheckLongPress();
}
@@ -683,6 +690,18 @@ public class ChatMessageCell extends BaseCell implements SeekBar.SeekBarDelegate
avatarPressed = false;
}
}
} else if(setupmessagePressed) {
if (event.getAction() == MotionEvent.ACTION_UP) {
setupmessagePressed = false;
delegate.didPressedSetupMessage(this);
}
else if(event.getAction() == MotionEvent.ACTION_CANCEL) {
setupmessagePressed = false;
} else if (event.getAction() == MotionEvent.ACTION_MOVE) {
if( !currentBackgroundDrawable.getBounds().contains((int)x, (int)y) ) {
setupmessagePressed = false;
}
}
} else if (newchatPressed) {
if (event.getAction() == MotionEvent.ACTION_UP) {
newchatPressed = false;
@@ -43,7 +43,9 @@ import android.os.Build;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.v4.content.FileProvider;
import android.text.Editable;
import android.text.TextUtils;
import android.text.TextWatcher;
import android.text.style.ClickableSpan;
import android.text.style.URLSpan;
import android.util.SparseIntArray;
@@ -852,7 +854,7 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
emptyView.setText(context.getString(R.string.MsgNewGroupDraftHint));
emptyView.setGravity(Gravity.START);
}
else if( m_mrChat.getType()==MrChat.MR_CHAT_NORMAL ){
else if( m_mrChat.getType()==MrChat.MR_CHAT_NORMAL && !m_mrChat.isSelfTalk() ){
String name = m_mrChat.getName();
emptyView.setText(AndroidUtilities.replaceTags(String.format(context.getString(R.string.NoMessagesHint), name, name)));
emptyView.setGravity(Gravity.START);
@@ -2667,6 +2669,12 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
}
@Override
public void didPressedSetupMessage(ChatMessageCell cell) {
Toast.makeText(getParentActivity(), ApplicationLoader.applicationContext.getString(R.string.NotYetImplemented), Toast.LENGTH_SHORT).show();
querySetupCode(cell.getMessageObject().getId(), null);
}
@Override
public boolean canPerformActions() {
return actionBar != null && !actionBar.isActionModeShowed();
@@ -2905,4 +2913,80 @@ public class ChatActivity extends BaseFragment implements NotificationCenter.Not
}
}
}
void querySetupCode(final int msg_id, String[] preload)
{
if( !MrMailbox.getMsg(msg_id).isSetupMessage()) {
return;
}
View gl = View.inflate(getParentActivity(), R.layout.setup_code_grid, null);
final EditText[] editTexts = {
(EditText) gl.findViewById(R.id.setupCode0), (EditText) gl.findViewById(R.id.setupCode1), (EditText) gl.findViewById(R.id.setupCode2),
(EditText) gl.findViewById(R.id.setupCode3), (EditText) gl.findViewById(R.id.setupCode4), (EditText) gl.findViewById(R.id.setupCode5),
(EditText) gl.findViewById(R.id.setupCode6), (EditText) gl.findViewById(R.id.setupCode7), (EditText) gl.findViewById(R.id.setupCode8)
};
AlertDialog.Builder builder1 = new AlertDialog.Builder(getParentActivity());
builder1.setView(gl);
editTexts[0].setText(MrMailbox.getMsg(msg_id).getSetupCodeBegin());
editTexts[0].setSelection(editTexts[0].getText().length());
for( int i = 0; i < 9; i++ ) {
if( preload != null && i < preload.length ) {
editTexts[i].setText(preload[i]);
editTexts[i].setSelection(editTexts[i].getText().length());
}
editTexts[i].addTextChangedListener(new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if( s.length()==4 ) {
for ( int i = 0; i < 8; i++ ) {
if( editTexts[i].hasFocus() && editTexts[i+1].getText().length()<4 ) {
editTexts[i+1].requestFocus();
break;
}
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
});
}
builder1.setTitle(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransfer));
builder1.setMessage(AndroidUtilities.replaceTags(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransferPleaseEnterCode)));
builder1.setNegativeButton(R.string.Cancel, null);
builder1.setCancelable(false); // prevent the dialog from being dismissed accidentally (when the dialog is closed, the setup code is gone forever and the user has to create a new setup message)
builder1.setPositiveButton(R.string.OK, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
String setup_code = "";
final String[] preload = new String[9];
for ( int i = 0; i < 9; i++ ) {
preload[i] = editTexts[i].getText().toString();
setup_code += preload[i];
}
boolean success = MrMailbox.continueKeyTransfer(msg_id, setup_code);
AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity());
builder2.setTitle(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransfer));
builder2.setMessage(AndroidUtilities.replaceTags(ApplicationLoader.applicationContext.getString(success? R.string.AutocryptKeyTransferSucceeded : R.string.AutocryptKeyTransferBadCode)));
builder2.setNegativeButton(R.string.Cancel, null);
builder2.setPositiveButton(R.string.Retry, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
querySetupCode(msg_id, preload);
}
});
showDialog(builder2.create());
}
});
showDialog(builder1.create());
}
}
@@ -56,6 +56,7 @@ public class MrChat {
public native String getProfileImage();
public native boolean isUnpromoted();
public native boolean isSelfTalk();
public String getDraft() {
return MrChatGetDraft(m_hChat);
@@ -52,7 +52,7 @@ public class MrMailbox {
public native static String getBlobdir();
public native static int configureAndConnect();
public native static void configureCancel();
public native static void stopOngoingProcess();
public native static int isConfigured();
@@ -67,11 +67,13 @@ public class MrMailbox {
public native static String getInfo();
public native static String cmdline(String cmd);
public native static String initiateKeyTransfer();
public native static boolean continueKeyTransfer(int msg_id, String setup_code);
public final static int MR_IMEX_EXPORT_SELF_KEYS = 1;
public final static int MR_IMEX_IMPORT_SELF_KEYS = 2;
public final static int MR_IMEX_EXPORT_BACKUP = 11;
public final static int MR_IMEX_IMPORT_BACKUP = 12;
public native static void imex(int what, String dir);
public native static int imex(int what, String dir);
public native static String imexHasBackup(String dir);
public native static int checkPassword(String pw);
@@ -200,7 +202,6 @@ public class MrMailbox {
public final static int MR_EVENT_CONFIGURE_PROGRESS = 2041;
public final static int MR_EVENT_IMEX_ENDED = 2050;
public final static int MR_EVENT_IMEX_PROGRESS = 2051;
public final static int MR_EVENT_IMEX_FILE_WRITTEN = 2052;
@@ -228,15 +229,6 @@ public class MrMailbox {
});
return 0;
case MR_EVENT_IMEX_ENDED:
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.imexEnded, (int)data1);
}
});
return 0;
case MR_EVENT_IMEX_PROGRESS:
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
@@ -334,7 +326,7 @@ public class MrMailbox {
return 0;
case MR_EVENT_GET_STRING:
String s = "ErrStrBadId";
String s;
switch( (int)data1 ) {
// the string-IDs are defined in the backend; as this is the only place where they're used, there is no benefit in creating an enum or sth. like that.
case 1: s = ApplicationLoader.applicationContext.getString(R.string.NoMessages); break;
@@ -370,6 +362,10 @@ public class MrMailbox {
case 36: s = "<c#808080>"+ApplicationLoader.applicationContext.getString(R.string.E2eeOffBecauseOfUser)+"</c>"; break;
case 37: s = "<c#808080>"+ApplicationLoader.applicationContext.getString(R.string.E2eeOffBecauseOfRecipient)+"</c>"; break;
case 40: s = ApplicationLoader.applicationContext.getString(R.string.ArchivedChats); break;
case 42: s = ApplicationLoader.applicationContext.getString(R.string.AutocryptSetupMessageSubject); break;
case 43: s = ApplicationLoader.applicationContext.getString(R.string.AutocryptSetupMessageGeneralBody); break;
case 50: s = ApplicationLoader.applicationContext.getString(R.string.SelfTalkSubtitle); break;
default: s = null; break;
}
return String2CPtr(s);
@@ -112,6 +112,8 @@ public class MrMsg {
public native String getFilename();
public native boolean isForwarded();
public native boolean isSystemcmd();
public native boolean isSetupMessage();
public native String getSetupCodeBegin();
public native boolean isIncreation();
private long m_hMsg; // must not be renamed as referenced by JNI under the name "m_hMsg"
@@ -157,10 +159,15 @@ public class MrMsg {
ret.created_by_mr = true;
ret.show_padlock = showPadlock()!=0;
ret.is_system_cmd = isSystemcmd();
ret.is_setup_message = isSetupMessage();
if( type == MR_MSG_TEXT ) {
ret.message = getText();
}
else if( type == MR_MSG_FILE && isSetupMessage() )
{
ret.message = ApplicationLoader.applicationContext.getString(R.string.AutocryptSetupMessageTapBody);
}
else if( type == MR_MSG_IMAGE ) {
String path = getFile();
TLRPC.TL_photo photo = null;
@@ -841,7 +841,7 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
settingsNotificationsRow = rowCount++;
}
if( user_id!=0 || chat_id!=MrChat.MR_CHAT_ID_DEADDROP) {
if( (user_id!=0 && user_id!=MrContact.MR_CONTACT_ID_SELF) || (chat_id!=0 && chat_id!=MrChat.MR_CHAT_ID_DEADDROP)) {
changeNameRow = rowCount++;
}
@@ -918,6 +918,9 @@ public class ProfileActivity extends BaseFragment implements NotificationCenter.
if (user_id != 0) {
item.addSubItem(ID_COPY_EMAIL_TO_CLIPBOARD, ApplicationLoader.applicationContext.getString(R.string.CopyToClipboard), 0);
}
if( user_id != 0 && user_id != MrContact.MR_CONTACT_ID_SELF ) {
item.addSubItem(ID_BLOCK_CONTACT, userBlocked()? ApplicationLoader.applicationContext.getString(R.string.UnblockContact) : ApplicationLoader.applicationContext.getString(R.string.BlockContact), 0);
item.addSubItem(ID_DELETE_CONTACT, ApplicationLoader.applicationContext.getString(R.string.DeleteContact), 0);
}
@@ -345,7 +345,7 @@ public class SettingsAccountFragment extends BaseFragment implements Notificatio
progressDialog.setButton(DialogInterface.BUTTON_NEGATIVE, ApplicationLoader.applicationContext.getString(R.string.Cancel), new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
MrMailbox.configureCancel();
MrMailbox.stopOngoingProcess();
}
});
progressDialog.show();
@@ -72,6 +72,7 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
private int settingsShadowRow;
private int imexHeaderRow;
private int initiateKeyTransferRow;
private int manageKeysRow;
private int backupRow;
private int backupShadowRow;
@@ -120,6 +121,7 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
settingsShadowRow = rowCount++;
imexHeaderRow = rowCount++;
initiateKeyTransferRow = rowCount++;
manageKeysRow = rowCount++;
backupRow = rowCount++;
backupShadowRow = rowCount++;
@@ -232,6 +234,63 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
{
presentFragment(new SettingsAccountFragment(null));
}
else if(i==initiateKeyTransferRow )
{
AlertDialog.Builder builder1 = new AlertDialog.Builder(getParentActivity());
builder1.setTitle(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransfer));
builder1.setMessage(AndroidUtilities.replaceTags(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransferMsgBeforeSend)));
builder1.setNegativeButton(R.string.Cancel, null);
builder1.setPositiveButton(R.string.AutocryptKeyTransferInitiate, new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
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.stopOngoingProcess();
}
});
progressDialog.show();
Utilities.searchQueue.postRunnable(new Runnable() {
@Override
public void run() {
final String sc = MrMailbox.initiateKeyTransfer();
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
if( progressDialog != null ) {
progressDialog.dismiss();
progressDialog = null;
}
if( sc != null ) {
String scFormatted = "";
try {
scFormatted = sc.substring(0, 4) + " - " + sc.substring(5, 9) + " - " + sc.substring(10, 14) + " -\n\n" +
sc.substring(15, 19) + " - " + sc.substring(20, 24) + " - " + sc.substring(25, 29) + " -\n\n" +
sc.substring(30, 34) + " - " + sc.substring(35, 39) + " - " + sc.substring(40, 44);
} catch (Exception e) {
e.printStackTrace();
}
AlertDialog.Builder builder2 = new AlertDialog.Builder(getParentActivity());
builder2.setTitle(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransfer));
builder2.setMessage(AndroidUtilities.replaceTags(String.format(ApplicationLoader.applicationContext.getString(R.string.AutocryptKeyTransferMsgAfterSend), scFormatted)));
builder2.setPositiveButton(R.string.OK, null);
builder2.setCancelable(false); // prevent the dialog from being dismissed accidentally (when the dialog is closed, the setup code is gone forever and the user has to create a new setup message)
showDialog(builder2.create());
}
}
});
}
});
}
});
showDialog(builder1.create());
}
else if(i==manageKeysRow )
{
imexShowMenu(ApplicationLoader.applicationContext.getString(R.string.E2EManagePrivateKeys),
@@ -410,7 +469,7 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
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);
MrMailbox.stopOngoingProcess();
}
});
progressDialog.show();
@@ -420,7 +479,18 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
MrMailbox.m_lastErrorString = "";
}
MrMailbox.imex(what, imexDir.getAbsolutePath());
Utilities.searchQueue.postRunnable(new Runnable() {
@Override
public void run() {
final int res = MrMailbox.imex(progressWhat, imexDir.getAbsolutePath());
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.imexEnded, (int)res);
}
});
}
});
}
@Override
@@ -535,6 +605,9 @@ public class SettingsAdvFragment extends BaseFragment implements NotificationCen
String cntStr = String.format("%d", MrMailbox.getBlockedCount());
textCell.setTextAndValue(ApplicationLoader.applicationContext.getString(R.string.BlockedContacts), cntStr, true);
}
else if( i==initiateKeyTransferRow ) {
textCell.setText(mContext.getString(R.string.AutocryptKeyTransferInitiate), true);
}
else if( i==manageKeysRow ) {
textCell.setText(mContext.getString(R.string.E2EManagePrivateKeys), true);
}
@@ -258,6 +258,7 @@ public class TLRPC {
public boolean created_by_mr;
public boolean show_padlock;
public boolean is_system_cmd;
public boolean is_setup_message;
}
public static class TL_message extends Message {
@@ -323,7 +323,7 @@ public class WelcomeActivity extends Activity implements NotificationCenter.Noti
}
private ProgressDialog progressDialog = null;
private void startImport(String backupFile)
private void startImport(final String backupFile)
{
if( progressDialog!=null ) {
progressDialog.dismiss();
@@ -337,7 +337,7 @@ public class WelcomeActivity extends Activity implements NotificationCenter.Noti
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);
MrMailbox.stopOngoingProcess();
}
});
progressDialog.show();
@@ -347,7 +347,18 @@ public class WelcomeActivity extends Activity implements NotificationCenter.Noti
MrMailbox.m_lastErrorString = "";
}
MrMailbox.imex(MrMailbox.MR_IMEX_IMPORT_BACKUP, backupFile);
Utilities.searchQueue.postRunnable(new Runnable() {
@Override
public void run() {
final int res = MrMailbox.imex(MrMailbox.MR_IMEX_IMPORT_BACKUP, backupFile);
AndroidUtilities.runOnUIThread(new Runnable() {
@Override
public void run() {
NotificationCenter.getInstance().postNotificationName(NotificationCenter.imexEnded, (int)res);
}
});
}
});
}
@Override
@@ -371,6 +382,7 @@ public class WelcomeActivity extends Activity implements NotificationCenter.Noti
}
if( (int)args[0]==1 ) {
MrMailbox.connect(); // import does not automatically connect
startActivity(new Intent(WelcomeActivity.this, LaunchActivity.class));
finish();
}
@@ -0,0 +1,144 @@
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!-- the FrameLayout is needed as View.inflate() without a root discards all layout_-attributes -->
<GridLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginTop="16dp"
android:layout_marginLeft="24dp"
android:layout_marginStart="24dp"
android:layout_marginRight="24dp"
android:layout_marginEnd="24dp"
android:columnCount="6"
android:rowCount="1">
<!-- 1st row -->
<EditText
android:id="@+id/setupCode0"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:layout_marginBottom="8dp"
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode1"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode2"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:layout_marginBottom="8dp"
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<!-- 2nd row -->
<EditText
android:id="@+id/setupCode3"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:layout_marginBottom="8dp"
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode4"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:layout_marginBottom="8dp"
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode5"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" - "
android:textAppearance="@style/TextAppearance.AppCompat"/>
<!-- 3rd row -->
<EditText
android:id="@+id/setupCode6"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" - "
android:layout_marginBottom="8dp"
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode7"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" - "
android:layout_marginBottom="8dp"
android:textAppearance="@style/TextAppearance.AppCompat"/>
<EditText
android:id="@+id/setupCode8"
android:layout_marginBottom="8dp"
android:layout_width="wrap_content"
android:inputType="numberDecimal"
android:maxLength="4"
android:minEms="3"/>
<TextView
android:text=" "
android:layout_marginBottom="8dp"
android:textAppearance="@style/TextAppearance.AppCompat"/>
</GridLayout>
</FrameLayout>
@@ -41,9 +41,9 @@
<string name="From">Von</string>
<string name="NoRecent">Keine aktuellen</string>
<string name="TypeMessage">Nachricht</string>
<string name="SlideToCancel">WISCHEN UM ABZUBRECHEN</string>
<string name="SaveToDownloads">In Downloads speichern</string>
<string name="SaveToMusic">In Musik speichern</string>
<string name="SlideToCancel">Wischen um abzubrechen</string>
<string name="SaveToDownloads">In Downloads speichern</string>
<string name="SaveToMusic">In Musik speichern</string>
<string name="Share">Teilen</string>
<string name="SendItems">%1$s senden</string>
<string name="ClearRecentEmoji">Zuletzt benutzte Emoji leeren?</string>
@@ -83,7 +83,7 @@
<string name="Default">Standard</string>
<string name="OnlyIfSilent">Wenn lautlos</string>
<string name="ChatBackground">Chat-Hintergrundbild</string>
<string name="SendByEnter">Mit Taste „Enter“ senden</string>
<string name="SendByEnter">Mit Eingabetaste senden</string>
<string name="Help">Hilfe</string>
<string name="Enabled">An</string>
<string name="Disabled">Aus</string>
@@ -151,13 +151,13 @@
<string name="Sharpen">Schärfe</string>
<string name="Fade">Verblassen</string>
<string name="Tint">Tönung</string>
<string name="TintShadows">TIEFEN</string>
<string name="TintHighlights">LICHTER</string>
<string name="TintShadows">Tiefen</string>
<string name="TintHighlights">Lichter</string>
<string name="Curves">Kurven</string>
<string name="CurvesAll">ALLE</string>
<string name="CurvesRed">ROT</string>
<string name="CurvesGreen">GRÜN</string>
<string name="CurvesBlue">BLAU</string>
<string name="CurvesAll">Alle</string>
<string name="CurvesRed">Rot</string>
<string name="CurvesGreen">Grün</string>
<string name="CurvesBlue">Blau</string>
<string name="Blur">Unschärfe</string>
<string name="BlurOff">Aus</string>
<string name="BlurLinear">Linear</string>
@@ -184,7 +184,7 @@
<string name="FromGalley">Aus der Galerie</string>
<string name="Set">Wählen</string>
<string name="OK">OK</string>
<string name="Crop">SCHNEIDEN</string>
<string name="Crop">Schneiden</string>
<!--messages-->
<string name="AttachPhoto">Bild</string>
<string name="AttachVideo">Video</string>
@@ -239,7 +239,7 @@
</plurals>
<plurals name="MeAndMembers">
<item quantity="one">Ich und %d Mitglied</item>
<item quantity="other">Ich und %d Mitglieder</item>
<item quantity="other">%d Mitglieder und ich</item>
</plurals>
<plurals name="NewMessages">
<item quantity="one">%d neue Nachricht</item>
@@ -409,4 +409,15 @@
<string name="LeaveGroup">Gruppe verlassen</string>
<string name="AskLeaveGroup">Diese Gruppe verlassen?</string>
<string name="Never">Niemals</string>
<string name="AutocryptKeyTransferInitiate">Autocrypt-Key-Transfer starten</string>
<string name="AutocryptKeyTransfer">Autocrypt-Key-Transfer</string>
<string name="AutocryptKeyTransferMsgBeforeSend">Der <![CDATA[<i>]]>Autocrypt-Key-Transfer<![CDATA[</i>]]> erfordert, dass das andere Gerät Autocrypt-kompatibel ist.\n\nSie können dann Ihren privaten Schlüssel an sich selbst schicken. Der Schlüssel wird mit einem <![CDATA[<i>]]>Setup Code<![CDATA[</i>]]> geschützt; dieser wird hier angezeigt und muss auf dem anderen Gerät eingetippt werden.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Ihr Schüssel wurde an Sie selbst verschickt. Wechseln sie nun zum anderen Gerät und öffnen die Setup-Nachricht. Sie werden dann aufgefordert einen Setup-Code einzugeben. Tippen Sie dort die folgenden Zahlen ein:\n\n%1$s\n\nWenn Sie fertig sind, ist Autocrypt auf dem anderen Gerät eingerichet.</string>
<string name="AutocryptSetupMessageSubject">Autocrypt-Setup-Nachricht</string>
<string name="AutocryptSetupMessageGeneralBody">Diese Autocrypt-Setup-Nachricht wird verwendet um Ihren Schlüssel von einem Gerät auf das andere zu übertragen.\n\nUm Ihren Schlüssel zu verwenden, öffnen Sie diese Nachricht in einer Autocrypt-kompatiblen E-Mail-App und geben Sie den Setup-Code ein, der Ihnen auf dem andern Gerät angezeigt wurde.</string>
<string name="AutocryptSetupMessageTapBody">Diese Autocrypt-Setup-Nachricht wird verwendet um Ihren Schlüssel von einem Gerät auf das andere zu übertragen.\n\nTippen Sie auf diese Nachricht, um den Schlüssel zu verwenden.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Bitte geben Sie den Setup-Code ein, der auf dem anderen Gerät angezeigt wird.</string>
<string name="AutocryptKeyTransferBadCode">Ungültiger Setup-Code. Bitte versuchen Sie es erneut.\n\nWenn Sie den Setup-Code nicht mehr haben, können Sie auch jederzeit einen neue Autocrypt-Setup-Nachricht mit einem neuen Setup-Code erzeugen.</string>
<string name="AutocryptKeyTransferSucceeded">Ihr Schlüssel wurde erfolgreich übertragen. Dieses Gerät wird nun Autocrypt mit demselben Schlüssel wie das Andere verwenden.</string>
<string name="Retry">Wiederholen</string>
</resources>
@@ -410,4 +410,4 @@ La dernière clé importée sera utilisée comme nouvelle clé par défaut</stri
<string name="LeaveGroup">Quitter le groupe</string>
<string name="AskLeaveGroup">Êtes-vous sûr de vouloir quitter ce groupe?</string>
<string name="Never">Jamais</string>
</resources>
</resources>
@@ -409,4 +409,15 @@
<string name="LeaveGroup">Abbandona gruppo</string>
<string name="AskLeaveGroup">Sei sicuro di voler abbandonare il gruppo?</string>
<string name="Never">Mai</string>
<string name="AutocryptKeyTransferInitiate">Avviato trasferimento chiavi Autocrypt</string>
<string name="AutocryptKeyTransfer">Trasferimento chiavi Autocrypt</string>
<string name="AutocryptKeyTransferMsgBeforeSend">Il <![CDATA[<i>]]>trasferimento chiavi Autocrypt<![CDATA[</i>]]> richiede che il client email sull\'altro dispositivo sia compatibile con Autocrypt.\n\nSarà quindi possibile inviare la chiave a se stessi. La chiave verrà cifrata con un codice di configurazione che verrà mostrato qui e dovrà essere digitato sull\'altro dispositivo.</string>
<string name="AutocryptKeyTransferMsgAfterSend">La chiave è stata inviata. Passare all\'altro dispositivo e aprire il messaggio di configurazione. Verrà richiesto un codice. Digitare il codice seguente:\n\n%1$s\n\nUna volta terminato, l\'altro dispositivo sarà pronto per usare Autocrypt.</string>
<string name="AutocryptSetupMessageSubject">Massaggio di configurazione Autocrypt</string>
<string name="AutocryptSetupMessageGeneralBody">Questo è il messaggio di configurazione di Autocrypt usato per trasferire la propria chiave tra più client.\n\nPer decifrare e usare la chiave, aprire il messaggio in un client compatibile con Autocrypt e digitare il codice di configurazione visibile sul dispositivo dal quale si è generata la chiave.</string>
<string name="AutocryptSetupMessageTapBody">Questo è il messaggio di configurazione di Autocrypt usato per trasferire la propria chiave tra più client.\n\nPer decifrare e usare la chiave, aprire questo messaggio.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Inserire il codice di configurazione mostrato sull\'altro dispositivo.</string>
<string name="AutocryptKeyTransferBadCode">Codice di configurazione errato.\n\nSe non si ricorda il codice di configurazione, avviare nuovamente il trafserimento chiavi sull\'altro dispositivo.</string>
<string name="AutocryptKeyTransferSucceeded">Chiave trasferita con successo. Questo dispositivo è pronto per usare Autocrypt con la stessa chiave dell\'altro dispositivo.</string>
<string name="Retry">Riprovare</string>
</resources>
@@ -116,7 +116,7 @@
<string name="FingerprintInfo">Bekreft fingeravtrykk for å fortsette</string>
<string name="FingerprintNotRecognized">Fingeravtrykket ble ikke gjenkjent. Prøv igjen</string>
<!--photo gallery view-->
<string name="SaveToGallery">Lagre i \"Galleri"\</string>
<string name="SaveToGallery">Lagre i \"Galleri\"</string>
<string name="Of">%1$d av %2$d</string>
<string name="Gallery">Galleri</string>
<string name="AllPhotos">Alle bilder</string>
@@ -358,4 +358,4 @@
<string name="LeaveGroup">Forlat gruppe</string>
<string name="AskLeaveGroup">Er du sikker på at du vil forlate denne gruppen?</string>
<string name="Never">Aldri</string>
</resources>
</resources>
@@ -437,4 +437,15 @@
<string name="LeaveGroup">Opuść grupę</string>
<string name="AskLeaveGroup">Czy na pewno chcesz opuścić tą grupę?</string>
<string name="Never">Nigdy</string>
<string name="AutocryptKeyTransferInitiate">Rozpocznij tranfer klucza automatycznego szyfrowania</string>
<string name="AutocryptKeyTransfer">Tranfer klucza automatycznego szyfrowania</string>
<string name="AutocryptKeyTransferMsgBeforeSend"><![CDATA[<i>]]>Tranfer klucza automatycznego szyfrowania<![CDATA[</i>]]> wymaga, aby klient poczty na drugim urządzeniu był zgodny z automatycznym szyfrowaniem.\n\nMożesz wysłać klucz do siebie. Klucz zostanie zaszyfrowany za pomocą wyświetlonego tutaj kodu konfiguracyjnego, który należy wpisać na drugim urządzeniu.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Klucz został wysłany do ciebie. Przejdź do innego urządzenia i otwórz wiadomość konfiguracyjną. Zostanie wyświetlona prośba o podanie kodu konfiguracyjnego. Wpisz następujące cyfry w podpowiedzi:\n\n%1$s\n\nGdy skończysz, drugie urządzenie będzie gotowe do użycia funkcji automatycznego szyfrowania.</string>
<string name="AutocryptSetupMessageSubject">Wiadomość konfiguracyjna automatycznego szyfrowania</string>
<string name="AutocryptSetupMessageGeneralBody">Jest to wiadomość konfiguracyjna automatycznego szyfrowania służąca do przesyłania klucza między klientami.\n\nAby odszyfrować i użyć klucza, otwórz wiadomość w kliencie zgodnym z automatycznym szyfrowaniem i wprowadź kod konfiguracyjny przedstawiony na urządzeniu generującym.</string>
<string name="AutocryptSetupMessageTapBody">Jest to wiadomość konfiguracyjna automatycznego szyfrowania służąca do przesyłania klucza między klientami.\n\nAby odszyfrować i użyć klucza, dotknij tą wiadomość.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Wprowadź kod konfiguracyjny wyświetlany na drugim urządzeniu.</string>
<string name="AutocryptKeyTransferBadCode">Zły kod konfiguracyjny. Spróbuj ponownie.\n\nJeśli nie pamiętasz kodu konfiguracji, po prostu uruchom ponownie transfer klucza na drugim urządzeniu.</string>
<string name="AutocryptKeyTransferSucceeded">Udany transfer klucza. To urządzenie jest teraz gotowe do użycia automatycznego szyfrowania za pomocą tego samego klucza, co na drugim urządzeniu.</string>
<string name="Retry">Powtórz</string>
</resources>
@@ -409,4 +409,4 @@
<string name="LeaveGroup">Sair do grupo</string>
<string name="AskLeaveGroup">Tem certeza que deseja sair do grupo?</string>
<string name="Never">Jamais</string>
</resources>
</resources>
@@ -437,4 +437,15 @@
<string name="LeaveGroup">Выйти из группы</string>
<string name="AskLeaveGroup">Вы уверены, что хотите выйти из группы?</string>
<string name="Never">Никогда</string>
<string name="AutocryptKeyTransferInitiate">Начать передачу ключа Autocrypt</string>
<string name="AutocryptKeyTransfer">Передача ключа Autocrypt</string>
<string name="AutocryptKeyTransferMsgBeforeSend">Для <![CDATA[<i>]]>передачи ключа Autocrypt<![CDATA[</i>]]> необходимо, чтобы почтовый клиент на другом устройстве так же поддерживал Autocrypt.\n\nЗатем Вы можете послать ключ себе. Ключ будет зашифрован кодом настройки, который указан здесь, и который нужно будет ввести на другом устройстве.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Вы отправили ключ себе. Теперь перейдите к другому устройству и откройте сообщение настройки. Будет предложено ввести код настройки. Введите следующие цифры:\n\n%1$s\n\nКак только Вы это сделаете, другое устройство будет готово использовать Autocrypt.</string>
<string name="AutocryptSetupMessageSubject">Сообщение настройки Autocrypt</string>
<string name="AutocryptSetupMessageGeneralBody">Это сообщение настройки Autocrypt, используемое для передачи ключа между клиентами.\n\nДля расшифровки и использования Вашего ключа откройте это сообщение в почтовом клиенте, совместимом с Autocrypt, и введите код, показываемый на устройстве, с которого отправлено сообщение.</string>
<string name="AutocryptSetupMessageTapBody">Это сообщение настройки Autocrypt, используемое для передачи Вашего ключа между клиентами.\n\nЧтобы расшифровать и начать использовать Ваш ключ, нажмите на это сообщение.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Пожалуйста, введите код настройки, показанный на другом устройстве.</string>
<string name="AutocryptKeyTransferBadCode">Неверный код настройки. Пожалуйста, повторите.\n\nЕсли Вы не помните код настройки, вернитесь к исходному устройству и передайте ключ ещё раз.</string>
<string name="AutocryptKeyTransferSucceeded">Ключ передан успешно. Сейчас это устройство может использовать Autocrypt с тем же ключом, что и на другом устройстве.</string>
<string name="Retry">Повторить</string>
</resources>
@@ -0,0 +1,393 @@
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:tools="http://schemas.android.com/tools">
<string name="AppName">Fjalosje Delta</string>
<!--chats view-->
<string name="Settings">Rregullime</string>
<string name="NewGroup">Grup i ri</string>
<string name="NoResult">Ska përfundime.</string>
<string name="NoChats">Ende pa fjalosje.</string>
<string name="DeleteChat">Fshije fjalosjen</string>
<string name="SelectChat">Përzgjidhni fjalosje…</string>
<string name="Search">Kërko</string>
<string name="MuteNotifications">Mos shfaq njoftime</string>
<string name="MuteFor">Mos i shfaq për %1$s</string>
<string name="UnmuteNotifications">Shfaqi</string>
<string name="Draft">Skicë</string>
<!--audio view-->
<string name="NoAudio">Kartelat e shtuara te mediateka e pajisjes suaj do të shfaqen këtu.</string>
<string name="AttachMusic">Muzikë</string>
<!--documents view-->
<string name="SelectFile">Përzgjidhni Kartelë</string>
<string name="FreeOfTotal">%1$s nga %2$s të lira</string>
<string name="ErrorHint">Gabim i panjohur</string>
<string name="AccessError">Gabim hyrjeje</string>
<string name="NoFiles">Ende pa kartela…</string>
<string name="NotMounted">Ska depozitë të montuar</string>
<string name="UsbActive">Shpërngulje USB në ecuri e sipër</string>
<string name="InternalStorage">Depozitë e Brendshme</string>
<string name="ExternalStorage">Depozitë e Jashtme</string>
<string name="SystemRoot">Rrënjë e Sistemit</string>
<string name="SdCard">Diskth SD</string>
<string name="Folder">Dosje</string>
<string name="GalleryInfo">Për dërgim figurash të pangjeshura</string>
<!--chat view-->
<string name="ChatGallery">Galeri</string>
<string name="ChatCamera">Kamerë</string>
<string name="NoMessages">Ska mesazhe.</string>
<string name="ForwardedMessage">Mesazh i përcjellë</string>
<string name="From">Nga</string>
<string name="TypeMessage">Mesazh</string>
<string name="SaveToDownloads">Ruaje te \"Shkarkime\"</string>
<string name="SaveToMusic">Ruaje te \"Muzikë\"</string>
<string name="AddShortcut">Shtoje widget-in te kreu</string>
<string name="ShortcutAdded">Widget-i u shtua tek kreu</string>
<!--notification-->
<string name="Reply">Përgjigjuni</string>
<string name="ReplyToGroup">Përgjigjiuni %1$s</string>
<string name="ReplyToContact">Përgjigjiuni %1$s</string>
<!--contacts view-->
<string name="NoContacts">Ende pa kontakte.</string>
<!--group create view-->
<string name="SendMessageTo">Dërgoni mesazh te…</string>
<string name="EnterGroupNamePlaceholder">Jepni emër grupi</string>
<!--group info view-->
<string name="AddMember">Shtoni anëtar</string>
<string name="Notifications">Njoftime</string>
<string name="RemoveMember">Hiqni anëtar</string>
<!--contact info view-->
<string name="NewContactTitle">Kontakt i ri</string>
<string name="BlockContact">Bllokoje kontaktin</string>
<string name="DeleteContact">Fshije kontaktin</string>
<string name="Info">Të dhëna</string>
<!--settings view-->
<string name="TextSize">Madhësi shkronjash mesazhi</string>
<string name="UnblockContact">Zhbllokoje kontaktin</string>
<string name="NoBlocked">Ende pa kontakte të bllokuar</string>
<string name="DefaultForNormalMessages">Mesazhe normale</string>
<string name="MessagePreview">Paraparje mesazhesh</string>
<string name="Sound">Tingull</string>
<string name="Vibrate">Dridhu</string>
<string name="ResetAllNotifications">Ktheji krejt njoftimet te parazgjedhjet</string>
<string name="NotificationsAndSounds">Njoftime dhe tinguj</string>
<string name="BlockedContacts">Kontakte të bllokuar</string>
<string name="Default">Parazgjedhje</string>
<string name="ChatBackground">Sfond fjalosjeje</string>
<string name="SendByEnter">Dërgoje me \"Enter\"</string>
<string name="Help">Ndihmë</string>
<string name="Enabled">On</string>
<string name="Disabled">Off</string>
<string name="LedColor">Ngjyrë LED</string>
<string name="Short">E shkurtër</string>
<string name="Long">E gjatë</string>
<string name="RaiseToSpeak">Rriteni që të flisni</string>
<string name="EditName">Përpunoni emrin</string>
<string name="NotificationsPriority">Shiheni</string>
<string name="NotificationsPriorityDefault">Përparësi normale</string>
<string name="NotificationsPriorityHigh">Përparësi e lartë</string>
<string name="NotificationsPriorityMax">Përparësia më lartë</string>
<string name="RepeatNotifications">Ripërsëriti njoftimet</string>
<string name="NotificationsOther">Tjetër</string>
<string name="SmartNotifications">Kufizo njoftimet</string>
<string name="SmartNotificationsSoundAtMost">Maks.</string>
<string name="SmartNotificationsTimes">herë</string>
<string name="SmartNotificationsWithin">brenda</string>
<string name="SmartNotificationsMinutes">minutash</string>
<!--cache view-->
<string name="CacheSettings">Depozitë</string>
<string name="KeepMedia">Mbaje Median</string>
<string name="KeepMediaInfo">Foto, video dhe kartela të tjera prej bisedash në re, që <![CDATA[<b>nuk i keni hapur</b>]]> gjatë kësaj periudhe, do të hiqen prej pajisjes, për të kursyer hapësirë disku.</string>
<string name="KeepMediaForever">Përgjithmonë</string>
<!--passcode view-->
<string name="Passcode">Kyçje Kodkalimi</string>
<string name="ChangePasscode">Ndryshoni Kodkalimin</string>
<string name="ChangePasscodeInfo">Kur rregulloni një kodkalim shtesë, te faqja e bisedave do të shfaqet një ikonë dryni. Prekeni që të kyçet aplikacioni.\n\nShënim: nëse harroni kodkalimin, do tju duhet të fshini dhe ri-instaloni aplikacionin.</string>
<string name="PasscodePIN">PIN</string>
<string name="PasscodePassword">Fjalëkalim</string>
<string name="EnterCurrentPasscode">Jepni kodkalimin tuaj të tanishëm</string>
<string name="EnterNewFirstPasscode">Jepni një kodkalim</string>
<string name="EnterNewPasscode">Jepni kodkalimin tuaj të ri</string>
<string name="EnterYourPasscode">Jepni kodkalimin tuaj</string>
<string name="ReEnterYourPasscode">Rijepeni kodkalimin tuaj të ri</string>
<string name="PasscodeDoNotMatch">Kodkalimet nuk përputhen</string>
<string name="AutoLock">Vetëkyçe</string>
<string name="AutoLockInfo">Kërko kodkalim nëse largohet për njëfarë koe.</string>
<string name="UnlockFingerprint">Shkyçe me shenja gishtash</string>
<string name="FingerprintInfo">Që të vazhdohet, konfirmoni shenja gishtash</string>
<string name="FingerprintNotRecognized">Shenja gishtash që nuk njihen. Riprovoni</string>
<!--photo gallery view-->
<string name="SaveToGallery">Ruaje te \"Galeri\"</string>
<string name="Gallery">Galeri</string>
<string name="AllPhotos">Krejt Fotot</string>
<string name="AllVideo">Krejt Videot</string>
<string name="NoPhotos">Ende pa foto</string>
<string name="NoVideo">Ende pa video</string>
<string name="CropImage">Qetheni figurën</string>
<string name="EditImage">Përpunoni figurën</string>
<string name="Enhance">Përmirësoje</string>
<string name="Highlights">Theksime</string>
<string name="Contrast">Kontrast</string>
<string name="Exposure">Ekspozim</string>
<string name="Warmth">Ngrohtësi</string>
<string name="Saturation">Ngopje</string>
<string name="Shadows">Hij</string>
<string name="Sharpen">Mprehe</string>
<string name="Fade">Zbehe</string>
<string name="Tint">Ngjyrosje</string>
<string name="TintShadows">Hije</string>
<string name="TintHighlights">Theksime</string>
<string name="Curves">Kurba</string>
<string name="CurvesAll">Krejt</string>
<string name="CurvesRed">E kuqe</string>
<string name="CurvesGreen">E gjelbër</string>
<string name="CurvesBlue">Blu</string>
<string name="BlurOff">Off</string>
<string name="BlurLinear">Lineare</string>
<string name="BlurRadial">Radiale</string>
<string name="DiscardChanges">Të hidhen tej ndryshimet></string>
<string name="ClearButton">Pastroje</string>
<string name="PickerPhotos">Foto</string>
<string name="PickerVideo">Video</string>
<!--privacy settings-->
<string name="PrivacySettings">Privatësi dhe siguri</string>
<string name="SecurityTitle">Siguri</string>
<!--edit video view-->
<string name="SendVideo">Dërgoni Video</string>
<!--button titles-->
<string name="Done">U bë</string>
<string name="Open">Hape</string>
<string name="Cancel">Anuloje</string>
<string name="Edit">Përpunoni</string>
<string name="Send">Dërgoje</string>
<string name="CopyToClipboard">Kopjoje në të papastër</string>
<string name="Delete">Fshije</string>
<string name="Forward">Përcille</string>
<string name="FromCamera">Prej kamerës</string>
<string name="FromGalley">Nga \"Galeri\"</string>
<string name="OK">OK</string>
<string name="Crop">Qethe</string>
<!--messages-->
<string name="AttachPhoto">Foto</string>
<string name="AttachVideo">Video</string>
<string name="AttachGif">GIF</string>
<string name="AttachContact">Kontakt</string>
<string name="AttachDocument">Kartelë</string>
<string name="AttachVoiceMessage">Mesazh zanor</string>
<string name="FromSelf">Unë</string>
<!--Alert messages-->
<string name="NoHandleAppInstalled">Asnjë aplikacion nga të instaluarit s\e hap dot llojin \'%1$s\' e kartelave, ju lutemi, që të vazhdohet, instaloni një të tillë.</string>
<string name="ContactAlreadyInGroup">Kontakti gjendet tashmë në këtë grup.</string>
<string name="ForwardMessagesTo">Përcillja mesazhet e përzgjedhur <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="SendMessagesTo">Të dërgohen mesazhet te <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="AreYouSureDeleteThisChat">Të fshihet kjo bisedë? S\do të shfaqet më te lista e bisedave, mesazhet e saj do të mbeten në shërbyes.</string>
<string name="AreYouSureBlockContact">Jeni i sigurt se doni ta bllokoni këtë kontakt?</string>
<string name="AreYouSureDeleteContact">Jeni i sigurt se doni ta fshini këtë kontakt?</string>
<!--permissions-->
<string name="PermissionContacts">Lypset hyrje te kontaktet për tju lidhur me shokët tuaj nga cilado pajisje juaj.</string>
<string name="PermissionStorage">Për dërgim dhe ruajte fotosh, videosh, muzike dhe media të tjera, lypset hyrje te depozita.</string>
<string name="PermissionNoAudio">Për dërgim mesazhesh zanorë, lypset hyrje te mikrofoni.</string>
<string name="PermissionOpenSettings">Rregullime</string>
<!--Intro view-->
<string name="Intro1Headline">Fjalosje Delta</string>
<string name="Intro1Message">Lajmëtari me <![CDATA[<b>publikun më të gjerë</b>]]> në botë.<![CDATA[<br/><b>I lirë</b>]]> dhe <![CDATA[<b>i pavarur</b>]]>.</string>
<string name="Intro2Headline">I pavarur</string>
<string name="Intro2Message"><![CDATA[<b>I pavarur</b>]]> nga kompjutera apo shërbime të huaja. Aplikacioni përdor vetëm shërbyesin tuaj të email-eve.</string>
<string name="Intro3Headline">I shpejtë</string>
<string name="Intro3Message"><![CDATA[<b>Dërgim mesazhesh</b>]]> brenda pak sekondash.<![CDATA[<br/>]]>Ndërfaqe e shpejtë.</string>
<string name="Intro4Headline">I fuqishëm</string>
<string name="Intro4Message">Fjalosje, figura, video, mesazhe audio, etj <![CDATA[<b>Pa kufi</b>]]>. I aftë për punë me shumë klientë.</string>
<string name="Intro5Headline">I lirë</string>
<string name="Intro5Message"><![CDATA[<b>Delta Chat</b>]]> është i lirë, përgjithmonë.<![CDATA[<br/>]]>Me burim të hapët. Pa reklama. Pa pajtime. Pa kyçje brenda një platforme nga tregtues.</string>
<string name="Intro6Headline">I fshehtëzuar</string>
<string name="Intro6Message"><![CDATA[<b>I fshehtëzuar</b>]]> me krejt algoritmet e zakonshëm. Mesazhet mbeten në shërbyesit tuaj.</string>
<string name="Intro7Headline">I besueshëm</string>
<string name="IntroStartMessaging">Filloni të Shkëmbeni Mesazhe</string>
<!--plural-->
<plurals name="Members">
<item quantity="one">%d anëtar</item>
<item quantity="other">%d anëtarë</item>
</plurals>
<plurals name="Contacts">
<item quantity="one">%d kontakte</item>
<item quantity="other">%d kontakte</item>
</plurals>
<plurals name="MeAndMembers">
<item quantity="one">%d anëtar dhe unë</item>
<item quantity="other">%d anëtarë dhe unë</item>
</plurals>
<plurals name="NewMessages">
<item quantity="one">%d mesazh i ri</item>
<item quantity="other">%d mesazhe të rinj</item>
</plurals>
<plurals name="messages">
<item quantity="one">%d mesazh</item>
<item quantity="other">%d mesazhe</item>
</plurals>
<plurals name="AreYouSureDeleteMessages">
<item quantity="one">Të fshihen %d mesazh? Do të fshihet edhe nga shërbyesi.</item>
<item quantity="other">Të fshihen %d mesazhe? Këta do të fshihen edhe nga shërbyesi.</item>
</plurals>
<plurals name="NewMessagesInChats">
<item quantity="one">%1$s në %2$d fjalosje</item>
<item quantity="other">%1$s në %2$d fjalosje</item>
</plurals>
<plurals name="Chats">
<item quantity="one">%d fjalosje</item>
<item quantity="other">%d fjalosje</item>
</plurals>
<plurals name="Minutes">
<item quantity="one">%d minutë</item>
<item quantity="other">%d minuta</item>
</plurals>
<plurals name="Hours">
<item quantity="one">%d orë</item>
<item quantity="other">%d orë</item>
</plurals>
<plurals name="Days">
<item quantity="one">%d ditë</item>
<item quantity="other">%d ditë</item>
</plurals>
<plurals name="Weeks">
<item quantity="one">%d javë</item>
<item quantity="other">%d javë</item>
</plurals>
<plurals name="Months">
<item quantity="one">%d muaj</item>
<item quantity="other">%d muaj</item>
</plurals>
<plurals name="MaxNotifications">
<item quantity="one">E shumta %1$d njoftime brenda %2$s</item>
<item quantity="other">E shumta %1$d njoftime brenda %2$s</item>
</plurals>
<!--date formatters-->
<string name="formatterMonthYear">MMMM yyyy</string>
<string name="formatterMonth">dd MMM</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>
<string name="formatterDay24H">HH:mm</string>
<string name="formatterDay12H">h:mm a</string>
<string name="AccountSettings">Rregullime llogarie</string>
<string name="MyAccount">Llogaria ime</string>
<string name="MyName">Emri im</string>
<string name="MyNameExplain">Emri juaj, si u shfaqet marrësve. Në u lëntë i zbrazët, do të dërgohet vetëm adresa juaj email.</string>
<string name="Password">Fjalëkalim</string>
<string name="SmtpPassword">Fjalëkalim SMTP</string>
<string name="FromAbove">Nga sipër</string>
<string name="SmtpLoginname">Emër hyrjeje për SMTP</string>
<string name="SmtpPort">Portë SMTP</string>
<string name="Automatic">Automatike</string>
<string name="ImapServer">Shërbyes IMAP</string>
<string name="ImapLoginname">Emër hyrjeje për IMAP</string>
<string name="SmtpServer">Shërbyes SMTP</string>
<string name="ImapPort">Portë IMAP</string>
<string name="InboxHeadline">Të marrë</string>
<string name="OutboxHeadline">Të dërguar</string>
<string name="MyAccountExplain">Për furnizues të njohur shërbimesh email, rregullimet shtesë përcaktohen vetvetiu.</string>
<string name="MyAccountExplain2" >Ndonjëherë, <![CDATA[<b>]]>IMAP lypset të aktivizohet<![CDATA[</b>]]> te pjesa e dukshme e sistemit email web.\n\nNëse hasni probleme, këshillohuni me furnizuesin e email-it ose me shokë tuajt.</string>
<string name="AccountNotConfigured">Llogari e paformësuar</string>
<string name="AboutThisProgram">Mbi Delta Chat-in</string>
<string name="NotSet">E papërcaktuar</string>
<string name="NewChat">Fjalosje e re</string>
<string name="Deaddrop">Kërkesa kontakti</string>
<string name="DeaddropInChatlist">Shfaq te listë fjalosjesh kërkesa kontakti</string>
<string name="AskStartChatWith">Bisedoni me <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>?</string>
<string name="DeaddropHint">Prekni shigjetat përgjigje që të nisni të bisedoni.</string>
<string name="NotYetImplemented">Ky funksion s’është i passhëm ose është jo i plotë</string>
<string name="DefaultStatusText">Dërguar me Lajmëtarin tim Delta Chat: https://delta.chat</string>
<string name="Name" >Emër</string>
<string name="EmailAddress">Adresë email</string>
<string name="CannotDeleteContact">Sfshihen dot kontakte në përdorim, në vend të kësaj bëni bllokim kontakti.</string>
<string name="BadEmailAddress">Adresë email e gabuar</string>
<string name="ContactCreated">Kontakti u krijua</string>
<string name="ViewProfile">Shihni profilin</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">Një sekondë…</string>
<string name="NoChatsHelp">Nisni të shkëmbeni mesazhe duke shtypur butonin \"Fjalosje e re\" poshtë djathtas, ose prekni butonin \"Menu\" për më tepër mundësi.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> është i parrezik për përdorim në biznes, i përputhshëm dhe i bazuar në standarde.</string>
<string name="InviteMenuEntry">Dërgoni ftesa</string>
<string name="InviteText">Tani përdor Delta Chat-in - %1$s - mund të dërgoni mesazh te %2$s</string>
<string name="AdvancedSettings">Rregullime të mëtejshme</string>
<string name="AskResetNotifications">Të kthehen te parazgjedhjet krejt rregullimet mbi njoftime dhe tinguj për faqen e tanishme, kontaktet dhe grupet?</string>
<string name="AttachFiles">Bashkëngjitni kartela</string>
<string name="ErrGroupNameEmpty">Ju lutemi, jepni një emër për grupin.</string>
<string name="MsgNewGroupDraftHint">Hartoni mesazhin e parë, duke u lejuar të tjerëve të përgjigjen brenda këtij grupi.\n\n• S\ka problem që Delta Chat-in s\e përdorin tërë anëtarët.\n\n• Dërgimi i mesazhit të parë mund të dojë pak kohë.</string>
<string name="MsgNewGroupDraft">Tungjatjeta, sapo krijova grupin \"%1$s\" për ne.</string>
<string name="MsgGroupNameChanged">Emri i grupit ndryshoi nga \"%1$s\" në \"%2$s\".</string>
<string name="MsgGroupImageChanged">Figura e grupit ndryshoi.</string>
<string name="MsgMemberAddedToGroup">U shtua anëtari %1$s.</string>
<string name="MsgMemberRemovedFromToGroup">U hoq anëtari %1$s.</string>
<string name="AskAddMemberToGroup">Të shtohet <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> te grupi?</string>
<string name="AskRemoveMemberFromGroup">Të hiqet <![CDATA[<b>]]>%1$s<![CDATA[</b>]]> nga grupi?</string>
<string name="ErrSelfNotInGroup">Që të kryeni këtë veprim, duhet të jeni një anëtar i grupit.</string>
<string name="MsgGroupLeft">Grupi u la.</string>
<string name="NoMessagesHint">Dërgoje mesazhin te <![CDATA[<b>]]>%1$s<![CDATA[</b>]]>:\n\n• S\ka problem nëse <![CDATA[<b>]]>%2$s<![CDATA[</b>]]> nuk përdor Delta Chat-in.\n\n• Dërgimi i mesazhit të parë mund të dojë pak kohë.</string>
<string name="SendNRcvReadReceipts">Merrni dhe dërgoni fatura kthimesh</string>
<string name="PreferE2EEncryption">Parapëlqe fshehtëzim skaj-më-skaj</string>
<string name="E2EManagePrivateKeys">Administroni kyçe privatë</string>
<string name="E2ECompareKeys">Krahasoni kyçe</string>
<string name="ForwardToTitle">Përcille te…</string>
<string name="SelectContact">Zgjidhni një kontakt</string>
<string name="DoneHint">U bë.</string>
<string name="FileNotFound">Su gjet dot %1$s.</string>
<string name="Error">Gabim: %1$s</string>
<string name="NoNetwork">Rrjet i pakapshëm.</string>
<string name="Audio">Audio</string>
<string name="PleaseCutVideoToMaxSize">Ju lutemi, prijeni videon në një madhësi më të vogël se %1$s.</string>
<string name="PermNotificationTitle">I lidhur te %1$s</string>
<string name="PermNotificationText">Po pritet për mesazhe…</string>
<string name="SettingsFor">Rregullime për %1$s</string>
<string name="AutoplayGifs">Vetëluaji GIF-et</string>
<string name="HelpUrl">https://delta.chat/en/help</string>
<string name="EncryptedMessage">Mesazh i fshehtëzuar</string>
<string name="Encryption">Fshehtëzim</string>
<string name="EncrinfoE2E">U aktivizua fshehtëzimi skaj-më-skaj.</string>
<string name="EncrinfoE2EExplain">Nëse te pajisja tjetër përputhen krejt shenjat e gishtave, lidhja është e parrezik.</string>
<string name="EncrinfoTransport">Shpërngulje-fshehtëzim të paktën deri te shërbyesi im.</string>
<string name="EncrinfoNone">Pa fshehtëzim te shërbyesi im.</string>
<string name="EncrinfoNoE2EExplain">Fshehtëzimi skaj-më-skaj do të përdoret kur edhe nga marrësi përdoret Delta Chat ose tjetër aplikacion Autocrypt.</string>
<string name="EncrinfoFingerprints">Shenja gishtash</string>
<string name="Backup">Kopjeruajtje</string>
<string name="ImportBackupExplain2">Që të importohet një kopjeruajtje, kopjojeni kopjeruajtjen te <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> dhe ri-instaloni aplikacionin.</string>
<string name="ReadReceiptMailBody">Kjo është një faturë kthimi për mesazhin \"%1$s\".\n\nKjo faturë kthimi dëshmon vetëm se mesazhi u shfaq te pajisja e marrësit. S\ka garanci që marrësi ta ketë lexuar lëndën e mesazhit.</string>
<string name="ReadReceipt">Faturë kthimi</string>
<string name="NameAndStatus">Emër dhe gjendje</string>
<string name="MyStatus">Gjendja ime</string>
<string name="MyStatusExplain">Veç vendesh të tjera, gjendja tregohet edhe te poshtëshënime email-esh.</string>
<string name="MsgGroupImageDeleted">Figura e grupit u fshi.</string>
<string name="AskDeleteGroupImage">Jeni të sigurt se doni të fshihet figura e grupit?\n\nKjo do të prekë krejt pajisjet e krejt anëtarëve të grupit.</string>
<string name="ExportImportHeader">Eksportim dhe importim</string>
<string name="ImportExportExplain">Kartelat e eksportuara do të përmbajnë kyçe private! Mbajini në një vend të parrezik, ose fshijini sa më shpejt të jetë e mundur.</string>
<string name="EnterPasswordToContinue">Që të vazhdohet, jepni fjalëkalimin për %1$s:</string>
<string name="IncorrectPassword">Fjalëkalim i pasaktë.</string>
<string name="ImportBackupAsk">U gjet kopjeruajtje te <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\nDoni të importohet dhe të përdoren krejt të dhënat dhe rregullimet prej saj?</string>
<string name="ImportBackup">Importoje kopjeruajtjen</string>
<string name="NoBackupFound">S\u gjetën kopjeruajtje.\n\nKopjojeni kopjeruajtjen te <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> dhe riprovoni. Ose, shtypni \"Nisni të shkëmbeni mesazhe\" që të ecni sipas procesit normal të rregullimit.</string>
<string name="FilesSuccessfullyExported">Kartelat u eksportuan te <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.</string>
<string name="ExportBackup">Eksporto kopjeruajtje</string>
<string name="ExportPrivateKeys">Eksporto kyçe private</string>
<string name="ImportPrivateKeys">Importo kyçe private</string>
<string name="ImportPrivateKeysAsk2">Të importohen kyçe privatë prej <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n• Kyçet private ekzistuese nuk do të fshihen\n\n• Si kyç i ri parazgjedhje do të përdoret kyçi i fundit i importuar</string>
<string name="NoRecentEmoji">Këtu do të shfaqen emoji-t e përdorura së fundi.</string>
<string name="E2eeOffBecauseOfUser">Për aktivizim të fshehtëzimit skaj-më-skaj, i vini shenjë mundësisë përkatëse te rregullimet tuaja.</string>
<string name="E2eeOffBecauseOfRecipient">Fshehtëzimi skaj-më-skaj do të përdoret nëse e aktivizon edhe pala tjetër.</string>
<string name="NotNow">Jo tani</string>
<string name="ArchiveChat">Arkivoje bisedën</string>
<string name="UnarchiveChat">Çarkivoje bisedën</string>
<string name="ArchivedChats">Biseda të arkivuara</string>
<string name="Archived">E arkivuar</string>
<string name="LeaveGroup">Braktiseni grupin</string>
<string name="AskLeaveGroup">Jeni i sigurt se doni ta braktisni grupin?</string>
<string name="Never">Kurrë</string>
</resources>
@@ -279,4 +279,4 @@
<string name="Archived">Arşivlenmiş</string>
<string name="LeaveGroup">Gruptan ayrıl</string>
<string name="Never">Asla</string>
</resources>
</resources>
+21 -9
View File
@@ -42,8 +42,8 @@
<string name="NoRecent">No recent</string>
<string name="TypeMessage">Message</string>
<string name="SlideToCancel">Slide to cancel</string>
<string name="SaveToDownloads">Save to \"Downloads"\</string>
<string name="SaveToMusic">Save to "\Music"\</string>
<string name="SaveToDownloads">Save to \"Downloads\"</string>
<string name="SaveToMusic">Save to \"Music\"</string>
<string name="Share">Share</string>
<string name="SendItems">Send %1$s</string>
<string name="ClearRecentEmoji">Clear recent emoji?</string>
@@ -83,7 +83,7 @@
<string name="Default">Default</string>
<string name="OnlyIfSilent">Only when silent</string>
<string name="ChatBackground">Chat background</string>
<string name="SendByEnter">Send with \"⏎\"</string>
<string name="SendByEnter">Send with Enter key</string>
<string name="Help">Help</string>
<string name="Enabled">On</string>
<string name="Disabled">Off</string>
@@ -339,7 +339,7 @@
<!-- 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">One moment …</string>
<string name="NoChatsHelp">Start messaging by pressing the \"New chat"\ button in the bottom right, or tap the \"Menu"\ button for more options.</string>
<string name="NoChatsHelp">Start messaging by pressing the \"New chat\" button in the bottom right, or tap the \"Menu\" button for more options.</string>
<string name="Intro7Message"><![CDATA[<b>Delta Chat</b>]]> is safe for business use, compatible and standards-based.</string>
<string name="InviteMenuEntry">Send invitations</string>
<string name="InviteText">I\'m using Delta Chat messenger now - %1$s - you can text me at %2$s</string>
@@ -360,7 +360,7 @@
<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 while.</string>
<string name="SendNRcvReadReceipts">Receive and send return receipts</string>
<string name="PreferE2EEncryption">Prefer end-to-end encryption</string>
<string name="E2EManagePrivateKeys">Manage private keys</string>
<string name="E2EManagePrivateKeys">Manage secret keys</string>
<string name="E2ECompareKeys">Compare keys</string>
<string name="ForwardToTitle">Forward to …</string>
<string name="SelectContact">Choose a contact</string>
@@ -393,7 +393,7 @@
<string name="MsgGroupImageDeleted">Group image deleted.</string>
<string name="AskDeleteGroupImage">Are you sure to delete the group image?\n\nThis will affect all devices of all group members.</string>
<string name="ExportImportHeader">Export and import</string>
<string name="ImportExportExplain">Exported files will contain private keys! Keep them in a safe place or delete them as soon as possible.</string>
<string name="ImportExportExplain">Exported files will contain secret keys! Keep them in a safe place or delete them as soon as possible.</string>
<string name="EnterPasswordToContinue">Enter the password for %1$s to continue:</string>
<string name="IncorrectPassword">Incorrect password.</string>
<string name="ImportBackupAsk">Backup found at <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.\n\nDo you want to import and use all data and settings from it?</string>
@@ -401,9 +401,9 @@
<string name="NoBackupFound">No backups found.\n\nCopy the backup to <![CDATA[<i>]]>%1$s<![CDATA[</i>]]> and try again. Alternatively, press \"Start messaging\" to go with the normal setup process.</string>
<string name="FilesSuccessfullyExported">Files exported to <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>.</string>
<string name="ExportBackup">Export backup</string>
<string name="ExportPrivateKeys">Export private keys</string>
<string name="ImportPrivateKeys">Import private keys</string>
<string name="ImportPrivateKeysAsk2">Import private keys from <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n• Existing private keys will not be deleted\n\n• The last imported key will be used as the new default key</string>
<string name="ExportPrivateKeys">Export secret keys</string>
<string name="ImportPrivateKeys">Import secret keys</string>
<string name="ImportPrivateKeysAsk2">Import secret keys from <![CDATA[<i>]]>%1$s<![CDATA[</i>]]>?\n\n• Existing secret keys will not be deleted\n\n• The last imported key will be used as the new default key</string>
<string name="NoRecentEmoji">Recently used emoji will be shown here.</string>
<string name="E2eeOffBecauseOfUser">To enable end-to-end-encryption, check the corresponding option in your settings.</string>
<string name="E2eeOffBecauseOfRecipient">End-to-end encryption will be employed if the other party enables the setting too.</string>
@@ -415,4 +415,16 @@
<string name="LeaveGroup">Leave group</string>
<string name="AskLeaveGroup">Are you sure you want to leave this group?</string>
<string name="Never">Never</string>
<string name="AutocryptKeyTransferInitiate">Initiate Autocrypt Key Transfer</string>
<string name="AutocryptKeyTransfer">Autocrypt Key Transfer</string>
<string name="AutocryptKeyTransferMsgBeforeSend">The <![CDATA[<i>]]>Autocrypt Key Transfer<![CDATA[</i>]]> requires that the mail client on the other device is Autocrypt-compliant.\n\nYou can then send your secret key to yourself. The key will be encrypted by a setup code which is displayed here and must be typed on the other device.</string>
<string name="AutocryptKeyTransferMsgAfterSend">Your key has been sent to yourself. Switch to the other device and open the setup message. You should be prompted for a setup code. Type the following digits into the prompt:\n\n%1$s\n\nOnce you\'re done, your other device will be ready to use Autocrypt.</string>
<string name="AutocryptSetupMessageSubject">Autocrypt Setup Message</string>
<string name="AutocryptSetupMessageGeneralBody">This is the Autocrypt Setup Message used to transfer your key between clients.\n\nTo decrypt and use your key, open the message in an Autocrypt-compliant client and enter the setup code presented on the generating device.</string>
<string name="AutocryptSetupMessageTapBody">This is the Autocrypt Setup Message used to transfer your key between clients.\n\nTo decrypt and use your key, tap on this message.</string>
<string name="AutocryptKeyTransferPleaseEnterCode">Please enter the setup code that is displayed on the other device.</string>
<string name="AutocryptKeyTransferBadCode">Bad setup code. Please try again.\n\nIf you do not remember the setup code, just initiate the key transfer on the other device again.</string>
<string name="AutocryptKeyTransferSucceeded">Key transferred successfully. This device is now ready to use Autocrypt with the same key as the other device.</string>
<string name="Retry">Retry</string>
<string name="SelfTalkSubtitle">Messages I sent to myself</string>
</resources>
+1 -1
View File
@@ -5,6 +5,6 @@ buildscript {
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.3.3'
classpath 'com.android.tools.build:gradle:3.0.1'
}
}
+2 -2
View File
@@ -1,6 +1,6 @@
#Fri Mar 03 14:17:13 CET 2017
#Thu Dec 14 21:54:25 CET 2017
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-3.3-all.zip
distributionUrl=https\://services.gradle.org/distributions/gradle-4.1-all.zip
+23 -6
View File
@@ -1,21 +1,38 @@
The following checklists are there not to forget things ... to be continued.
# Add Release on F-Droid
1. deltachat-core: "draft a new release", if required
2. deltachat-android: check CHANGES.md against core and android commit list from last release
3. deltachat-android/tools: `$ ./update-core.sh` followed by a `git push`
4. deltachat-android/tools: `$ ./txpull` followed by a `git commit` and a `git push` if there are changes
5. deltachat-android: "Draft a new release" using a version number in for Form v1.2.3
# Release new Core version
1. deltachat-core: bump version, commit, push
2. deltachat-core on Github: "Draft a new release" with the version form `v1.2.3`
# Release new Android version
Release core, if needed, then:
1. deltachat-android: check CHANGLOG.md, commit, push
2. deltachat-android/tools: `$ ./update-core.sh`, push
3. deltachat-android/tools: `$ ./txpull`, if there are changes: commit, push
4. deltachat-android: bump version, commit, push
5. deltachat-android on Github: "Draft a new release" with the version form `v1.2.3`
... some days later, F-Droid should be updated.
For an additional APK:
6. in Android Studio select "Build / Build APK"
7. rename the generated APK to `deltachat-v1.2.3.apk`
8. upload the APK to the created Github release
# Add language
1. add `MessengerProj/src/main/res/values-<LANG>/strings.xml`
2. add copy command to `tools/txpull.sh` and `tools/txpush.sh`
# Update source languges on Transifex
1. call `./txpull` to overwrite local translation files with the ones from Transifex, the source is not updated
+1
View File
@@ -21,6 +21,7 @@ cp "${TXPREFIX}nl.xml" "${SRCPREFIX}-nl/strings.xml"
cp "${TXPREFIX}pl.xml" "${SRCPREFIX}-pl/strings.xml"
cp "${TXPREFIX}pt.xml" "${SRCPREFIX}-pt/strings.xml"
cp "${TXPREFIX}ru.xml" "${SRCPREFIX}-ru/strings.xml"
cp "${TXPREFIX}sq.xml" "${SRCPREFIX}-sq/strings.xml"
cp "${TXPREFIX}sr.xml" "${SRCPREFIX}-sr/strings.xml"
cp "${TXPREFIX}ta.xml" "${SRCPREFIX}-ta/strings.xml"
cp "${TXPREFIX}te.xml" "${SRCPREFIX}-te/strings.xml"
+1
View File
@@ -27,6 +27,7 @@ cp "${SRCPREFIX}-nl/strings.xml" "${TXPREFIX}nl.xml"
cp "${SRCPREFIX}-pl/strings.xml" "${TXPREFIX}pl.xml"
cp "${SRCPREFIX}-pt/strings.xml" "${TXPREFIX}pt.xml"
cp "${SRCPREFIX}-ru/strings.xml" "${TXPREFIX}ru.xml"
cp "${SRCPREFIX}-sq/strings.xml" "${TXPREFIX}sq.xml"
cp "${SRCPREFIX}-sr/strings.xml" "${TXPREFIX}sr.xml"
cp "${SRCPREFIX}-ta/strings.xml" "${TXPREFIX}ta.xml"
cp "${SRCPREFIX}-te/strings.xml" "${TXPREFIX}te.xml"