Copione merged onto master
continuous-integration/drone/push Build is passing Details

master
blallo 2020-03-28 00:00:42 +00:00
commit 517e91296f
134 changed files with 1979 additions and 2434 deletions

View File

@ -80,8 +80,8 @@ protobuf {
}
}
def canonicalVersionCode = 614
def canonicalVersionName = "4.58.0"
def canonicalVersionCode = 615
def canonicalVersionName = "4.58.1"
def postFixSize = 10
def abiPostFix = ['universal' : 0,

View File

@ -625,11 +625,6 @@
android:authorities="org.thoughtcrime.securesms.database.stickerpack"
android:exported="false" />
<provider android:name="androidx.camera.camera2.impl.Camera2Initializer"
android:authorities="${applicationId}.camerax-init"
android:exported="false"
android:enabled="false" />
<receiver android:name=".service.BootReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>

View File

@ -17,17 +17,15 @@
package org.thoughtcrime.securesms;
import android.annotation.SuppressLint;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.camera.camera2.Camera2Config;
import androidx.camera.core.CameraX;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;
import android.content.Context;
import android.os.AsyncTask;
import android.os.Build;
import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatDelegate;
import androidx.lifecycle.DefaultLifecycleObserver;
import androidx.lifecycle.LifecycleOwner;
import androidx.lifecycle.ProcessLifecycleOwner;
import androidx.multidex.MultiDexApplication;
import com.google.android.gms.security.ProviderInstaller;
@ -47,27 +45,23 @@ import org.thoughtcrime.securesms.jobs.FcmRefreshJob;
import org.thoughtcrime.securesms.jobs.MultiDeviceContactUpdateJob;
import org.thoughtcrime.securesms.jobs.PushNotificationReceiveJob;
import org.thoughtcrime.securesms.jobs.RefreshPreKeysJob;
import org.thoughtcrime.securesms.jobs.StorageSyncJob;
import org.thoughtcrime.securesms.logging.AndroidLogger;
import org.thoughtcrime.securesms.logging.CustomSignalProtocolLogger;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.logging.PersistentLogger;
import org.thoughtcrime.securesms.logging.SignalUncaughtExceptionHandler;
import org.thoughtcrime.securesms.mediasend.camerax.CameraXUtil;
import org.thoughtcrime.securesms.migrations.ApplicationMigrations;
import org.thoughtcrime.securesms.migrations.StorageServiceMigrationJob;
import org.thoughtcrime.securesms.notifications.MessageNotifier;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.push.SignalServiceNetworkAccess;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.revealable.ViewOnceMessageManager;
import org.thoughtcrime.securesms.ringrtc.RingRtcLogger;
import org.thoughtcrime.securesms.service.DirectoryRefreshListener;
import org.thoughtcrime.securesms.service.ExpiringMessageManager;
import org.thoughtcrime.securesms.service.IncomingMessageObserver;
import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.service.LocalBackupListener;
import org.thoughtcrime.securesms.revealable.ViewOnceMessageManager;
import org.thoughtcrime.securesms.service.RotateSenderCertificateListener;
import org.thoughtcrime.securesms.service.RotateSignedPreKeyListener;
import org.thoughtcrime.securesms.service.UpdateApkRefreshListener;
@ -133,7 +127,7 @@ public class ApplicationContext extends MultiDexApplication implements DefaultLi
initializePendingMessages();
initializeBlobProvider();
initializeCleanup();
initializeCameraX();
FeatureFlags.init();
NotificationChannels.create(this);
RefreshPreKeysJob.scheduleIfNecessary();
@ -381,19 +375,6 @@ public class ApplicationContext extends MultiDexApplication implements DefaultLi
});
}
@SuppressLint("RestrictedApi")
private void initializeCameraX() {
if (CameraXUtil.isSupported()) {
new Thread(() -> {
try {
CameraX.initialize(this, Camera2Config.defaultConfig());
} catch (Throwable t) {
Log.w(TAG, "Failed to initialize CameraX.");
}
}, "signal-camerax-initialization").start();
}
}
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(DynamicLanguageContextWrapper.updateContext(base, TextSecurePreferences.getLanguage(base)));

View File

@ -20,6 +20,7 @@ package org.thoughtcrime.securesms;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.os.AsyncTask;
import android.os.Bundle;
@ -63,6 +64,7 @@ import org.thoughtcrime.securesms.mediasend.AvatarSelectionBottomSheetDialogFrag
import org.thoughtcrime.securesms.mediasend.Media;
import org.thoughtcrime.securesms.mms.DecryptableStreamUriLoader.DecryptableUri;
import org.thoughtcrime.securesms.mms.GlideApp;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.BitmapUtil;
@ -76,6 +78,7 @@ import org.thoughtcrime.securesms.util.task.ProgressDialogAsyncTask;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
import java.io.IOException;
import java.util.Collection;
import java.util.HashSet;
import java.util.LinkedList;
@ -102,7 +105,6 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
private static final short REQUEST_CODE_SELECT_AVATAR = 26165;
private static final int PICK_CONTACT = 1;
public static final int AVATAR_SIZE = 210;
private EditText groupName;
private ListView lv;
@ -321,7 +323,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
.skipMemoryCache(true)
.diskCacheStrategy(DiskCacheStrategy.NONE)
.centerCrop()
.override(AVATAR_SIZE, AVATAR_SIZE)
.override(AvatarHelper.AVATAR_DIMENSIONS, AvatarHelper.AVATAR_DIMENSIONS)
.into(new SimpleTarget<Bitmap>() {
@Override
public void onResourceReady(@NonNull Bitmap resource, Transition<? super Bitmap> transition) {
@ -362,7 +364,7 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
}
memberAddresses.add(Recipient.self().getId());
GroupId groupId = DatabaseFactory.getGroupDatabase(activity).getOrCreateGroupForMembers(memberAddresses, true);
GroupId.Mms groupId = DatabaseFactory.getGroupDatabase(activity).getOrCreateMmsGroupForMembers(memberAddresses);
RecipientId groupRecipientId = DatabaseFactory.getRecipientDatabase(activity).getOrInsertFromGroupId(groupId);
Recipient groupRecipient = Recipient.resolved(groupRecipientId);
long threadId = DatabaseFactory.getThreadDatabase(activity).getThreadIdFor(groupRecipient, ThreadDatabase.DistributionTypes.DEFAULT);
@ -548,16 +550,22 @@ public class GroupCreateActivity extends PassphraseRequiredActionBarActivity
@Override
protected Optional<GroupData> doInBackground(GroupId... groupIds) {
final GroupDatabase db = DatabaseFactory.getGroupDatabase(activity);
final List<Recipient> recipients = db.getGroupMembers(groupIds[0], false);
final List<Recipient> recipients = db.getGroupMembers(groupIds[0], GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
final Optional<GroupRecord> group = db.getGroup(groupIds[0]);
final Set<Recipient> existingContacts = new HashSet<>(recipients.size());
existingContacts.addAll(recipients);
if (group.isPresent()) {
Bitmap avatar = null;
try {
avatar = BitmapFactory.decodeStream(AvatarHelper.getAvatar(getContext(), group.get().getRecipientId()));
} catch (IOException e) {
Log.w(TAG, "Failed to read avatar.");
}
return Optional.of(new GroupData(groupIds[0],
existingContacts,
BitmapUtil.fromByteArray(group.get().getAvatar()),
group.get().getAvatar(),
avatar,
BitmapUtil.toByteArray(avatar),
group.get().getTitle()));
} else {
return Optional.absent();

View File

@ -8,6 +8,7 @@ import androidx.appcompat.app.AlertDialog;
import androidx.lifecycle.Lifecycle;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.groups.ui.GroupMemberEntry;
import org.thoughtcrime.securesms.groups.ui.GroupMemberListView;
import org.thoughtcrime.securesms.recipients.Recipient;
@ -34,7 +35,7 @@ public final class GroupMembersDialog {
public void display() {
SimpleTask.run(
lifecycle,
() -> DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupRecipient.requireGroupId(), true),
() -> DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupRecipient.requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_INCLUDING_SELF),
members -> {
AlertDialog dialog = new AlertDialog.Builder(context)
.setTitle(R.string.ConversationActivity_group_members)

View File

@ -31,6 +31,7 @@ import androidx.loader.app.LoaderManager.LoaderCallbacks;
import androidx.loader.content.Loader;
import org.thoughtcrime.securesms.conversation.ConversationItem;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.logging.Log;
import android.view.LayoutInflater;
import android.view.MenuItem;
@ -368,7 +369,7 @@ public class MessageDetailsActivity extends PassphraseRequiredActionBarActivity
List<GroupReceiptInfo> receiptInfoList = DatabaseFactory.getGroupReceiptDatabase(context).getGroupReceiptInfo(messageRecord.getId());
if (receiptInfoList.isEmpty()) {
List<Recipient> group = DatabaseFactory.getGroupDatabase(context).getGroupMembers(messageRecord.getRecipient().requireGroupId(), false);
List<Recipient> group = DatabaseFactory.getGroupDatabase(context).getGroupMembers(messageRecord.getRecipient().requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
for (Recipient recipient : group) {
recipients.add(new RecipientDeliveryStatus(recipient, RecipientDeliveryStatus.Status.UNKNOWN, false, -1));

View File

@ -21,7 +21,6 @@ import org.thoughtcrime.securesms.crypto.ClassicDecryptingPartInputStream;
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil;
import org.thoughtcrime.securesms.crypto.ModernDecryptingPartInputStream;
import org.thoughtcrime.securesms.database.AttachmentDatabase;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupReceiptDatabase;
import org.thoughtcrime.securesms.database.JobDatabase;
import org.thoughtcrime.securesms.database.KeyValueDatabase;
@ -49,7 +48,6 @@ import java.io.OutputStream;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Set;
@ -118,9 +116,11 @@ public class FullBackupExporter extends FullBackupBase {
stopwatch.split("prefs");
for (File avatar : AvatarHelper.getAvatarFiles(context)) {
EventBus.getDefault().post(new BackupEvent(BackupEvent.Type.PROGRESS, ++count));
outputStream.write(avatar.getName(), new FileInputStream(avatar), avatar.length());
for (AvatarHelper.Avatar avatar : AvatarHelper.getAvatars(context)) {
if (avatar != null) {
EventBus.getDefault().post(new BackupEvent(BackupEvent.Type.PROGRESS, ++count));
outputStream.write(avatar.getFilename(), avatar.getInputStream(), avatar.getLength());
}
}
stopwatch.split("avatars");

View File

@ -176,7 +176,7 @@ public class FullBackupImporter extends FullBackupBase {
private static void processAvatar(@NonNull Context context, @NonNull SQLiteDatabase db, @NonNull BackupProtos.Avatar avatar, @NonNull BackupRecordInputStream inputStream) throws IOException {
if (avatar.hasRecipientId()) {
RecipientId recipientId = RecipientId.from(avatar.getRecipientId());
inputStream.readAttachmentTo(new FileOutputStream(AvatarHelper.getAvatarFile(context, recipientId)), avatar.getLength());
inputStream.readAttachmentTo(AvatarHelper.getOutputStream(context, recipientId), avatar.getLength());
} else {
if (avatar.hasName() && SqlUtil.tableExists(db, "recipient_preferences")) {
Log.w(TAG, "Avatar is missing a recipientId. Clearing signal_profile_avatar (legacy) so it can be fetched later.");

View File

@ -25,7 +25,7 @@ public class EmojiVariationSelectorPopup extends PopupWindow {
ViewGroup.LayoutParams.WRAP_CONTENT);
this.context = context;
this.listener = listener;
this.list = (ViewGroup) getContentView();
this.list = (ViewGroup) getContentView().findViewById(R.id.emoji_variation_container);
setBackgroundDrawable(null);
setOutsideTouchable(true);

View File

@ -10,6 +10,7 @@ import androidx.annotation.Nullable;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.util.Conversions;
import org.whispersystems.libsignal.util.guava.Optional;
@ -33,11 +34,11 @@ public final class GroupRecordContactPhoto implements ContactPhoto {
GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
Optional<GroupDatabase.GroupRecord> groupRecord = groupDatabase.getGroup(groupId);
if (groupRecord.isPresent() && groupRecord.get().getAvatar() != null) {
return new ByteArrayInputStream(groupRecord.get().getAvatar());
if (!groupRecord.isPresent() || !AvatarHelper.hasAvatar(context, groupRecord.get().getRecipientId())) {
throw new IOException("No avatar for group: " + groupId);
}
throw new IOException("Couldn't load avatar for group: " + groupId);
return AvatarHelper.getAvatar(context, groupRecord.get().getRecipientId());
}
@Override

View File

@ -31,13 +31,12 @@ public class ProfileContactPhoto implements ContactPhoto {
@Override
public @NonNull InputStream openInputStream(Context context) throws IOException {
return AvatarHelper.getInputStreamFor(context, recipient.getId());
return AvatarHelper.getAvatar(context, recipient.getId());
}
@Override
public @Nullable Uri getUri(@NonNull Context context) {
File avatarFile = AvatarHelper.getAvatarFile(context, recipient.getId());
return avatarFile.exists() ? Uri.fromFile(avatarFile) : null;
return null;
}
@Override
@ -72,12 +71,6 @@ public class ProfileContactPhoto implements ContactPhoto {
return 0;
}
File avatarFile = AvatarHelper.getAvatarFile(ApplicationDependencies.getApplication(), recipient.getId());
if (avatarFile.exists()) {
return avatarFile.lastModified();
} else {
return 0;
}
return AvatarHelper.getLastModified(ApplicationDependencies.getApplication(), recipient.getId());
}
}

View File

@ -132,6 +132,7 @@ import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.DraftDatabase;
import org.thoughtcrime.securesms.database.DraftDatabase.Draft;
import org.thoughtcrime.securesms.database.DraftDatabase.Drafts;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.database.IdentityDatabase;
import org.thoughtcrime.securesms.database.IdentityDatabase.IdentityRecord;
import org.thoughtcrime.securesms.database.IdentityDatabase.VerifiedStatus;
@ -1574,7 +1575,7 @@ public class ConversationActivity extends PassphraseRequiredActionBarActivity
if (params[0].isGroup()) {
recipients.addAll(DatabaseFactory.getGroupDatabase(ConversationActivity.this)
.getGroupMembers(params[0].requireGroupId(), false));
.getGroupMembers(params[0].requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF));
} else {
recipients.add(params[0]);
}

View File

@ -103,7 +103,6 @@ import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.revealable.ViewOnceMessageActivity;
import org.thoughtcrime.securesms.revealable.ViewOnceUtil;
import org.thoughtcrime.securesms.sharing.ShareActivity;
import org.thoughtcrime.securesms.sms.MessageSender;
import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
import org.thoughtcrime.securesms.stickers.StickerLocator;
@ -206,7 +205,7 @@ public class ConversationFragment extends Fragment
new ConversationItemSwipeCallback(
messageRecord -> actionMode == null &&
canReplyToMessage(isActionMessage(messageRecord), messageRecord, messageRequestViewModel.shouldShowMessageRequest()),
MenuState.canReplyToMessage(MenuState.isActionMessage(messageRecord), messageRecord, messageRequestViewModel.shouldShowMessageRequest()),
this::handleReplyMessage
).attachToRecyclerView(list);
@ -504,78 +503,22 @@ public class ConversationFragment extends Fragment
});
}
private void setCorrectMenuVisibility(Menu menu) {
private void setCorrectMenuVisibility(@NonNull Menu menu) {
Set<MessageRecord> messageRecords = getListAdapter().getSelectedItems();
boolean actionMessage = false;
boolean hasText = false;
boolean sharedContact = false;
boolean viewOnce = false;
if (actionMode != null && messageRecords.size() == 0) {
actionMode.finish();
return;
}
for (MessageRecord messageRecord : messageRecords) {
if (isActionMessage(messageRecord))
{
actionMessage = true;
}
MenuState menuState = MenuState.getMenuState(messageRecords, messageRequestViewModel.shouldShowMessageRequest());
if (messageRecord.getBody().length() > 0) {
hasText = true;
}
if (messageRecord.isMms() && !((MmsMessageRecord) messageRecord).getSharedContacts().isEmpty()) {
sharedContact = true;
}
if (messageRecord.isViewOnce()) {
viewOnce = true;
}
}
if (messageRecords.size() > 1) {
menu.findItem(R.id.menu_context_forward).setVisible(false);
menu.findItem(R.id.menu_context_reply).setVisible(false);
menu.findItem(R.id.menu_context_details).setVisible(false);
menu.findItem(R.id.menu_context_save_attachment).setVisible(false);
menu.findItem(R.id.menu_context_resend).setVisible(false);
} else {
MessageRecord messageRecord = messageRecords.iterator().next();
menu.findItem(R.id.menu_context_resend).setVisible(messageRecord.isFailed());
menu.findItem(R.id.menu_context_save_attachment).setVisible(!actionMessage &&
!viewOnce &&
messageRecord.isMms() &&
!messageRecord.isMmsNotification() &&
((MediaMmsMessageRecord)messageRecord).containsMediaSlide() &&
((MediaMmsMessageRecord)messageRecord).getSlideDeck().getStickerSlide() == null);
menu.findItem(R.id.menu_context_forward).setVisible(!actionMessage && !sharedContact && !viewOnce);
menu.findItem(R.id.menu_context_details).setVisible(!actionMessage);
menu.findItem(R.id.menu_context_reply).setVisible(canReplyToMessage(actionMessage, messageRecord, messageRequestViewModel.shouldShowMessageRequest()));
}
menu.findItem(R.id.menu_context_copy).setVisible(!actionMessage && hasText);
}
private static boolean canReplyToMessage(boolean actionMessage, MessageRecord messageRecord, boolean isDisplayingMessageRequest) {
return !actionMessage &&
!messageRecord.isPending() &&
!messageRecord.isFailed() &&
!isDisplayingMessageRequest &&
messageRecord.isSecure();
}
private static boolean isActionMessage(MessageRecord messageRecord) {
return messageRecord.isGroupAction() ||
messageRecord.isCallLog() ||
messageRecord.isJoined() ||
messageRecord.isExpirationTimerUpdate() ||
messageRecord.isEndSession() ||
messageRecord.isIdentityUpdate() ||
messageRecord.isIdentityVerified() ||
messageRecord.isIdentityDefault();
menu.findItem(R.id.menu_context_forward).setVisible(menuState.shouldShowForwardAction());
menu.findItem(R.id.menu_context_reply).setVisible(menuState.shouldShowReplyAction());
menu.findItem(R.id.menu_context_details).setVisible(menuState.shouldShowDetailsAction());
menu.findItem(R.id.menu_context_save_attachment).setVisible(menuState.shouldShowSaveAttachmentAction());
menu.findItem(R.id.menu_context_resend).setVisible(menuState.shouldShowResendAction());
menu.findItem(R.id.menu_context_copy).setVisible(menuState.shouldShowCopyAction());
}
private ConversationAdapter getListAdapter() {
@ -1432,6 +1375,10 @@ public class ConversationFragment extends Fragment
}
public void show() {
if (textView.getText() == null || textView.getText().length() == 0) {
return;
}
if (pendingHide) {
pendingHide = false;
} else {

View File

@ -33,11 +33,11 @@ import org.thoughtcrime.securesms.components.MaskView;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.ReactionRecord;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.MessageRecordUtil;
import org.thoughtcrime.securesms.util.ThemeUtil;
import org.thoughtcrime.securesms.util.Util;
import org.thoughtcrime.securesms.util.ViewUtil;
import java.util.Collections;
import java.util.List;
public final class ConversationReactionOverlay extends RelativeLayout {
@ -427,25 +427,11 @@ public final class ConversationReactionOverlay extends RelativeLayout {
}
private void setupToolbarMenuItems() {
toolbar.getMenu().findItem(R.id.action_copy).setVisible(shouldShowCopy());
toolbar.getMenu().findItem(R.id.action_download).setVisible(shouldShowDownload());
toolbar.getMenu().findItem(R.id.action_forward).setVisible(shouldShowForward());
}
MenuState menuState = MenuState.getMenuState(Collections.singleton(messageRecord), false);
private boolean shouldShowCopy() {
return !MessageRecordUtil.hasSticker(messageRecord) &&
!MessageRecordUtil.isMediaMessage(messageRecord) &&
!MessageRecordUtil.hasSharedContact(messageRecord);
}
private boolean shouldShowDownload() {
return MessageRecordUtil.isMediaMessage(messageRecord) ||
MessageRecordUtil.hasLocation(messageRecord);
}
private boolean shouldShowForward() {
return !MessageRecordUtil.hasSharedContact(messageRecord);
toolbar.getMenu().findItem(R.id.action_copy).setVisible(menuState.shouldShowCopyAction());
toolbar.getMenu().findItem(R.id.action_download).setVisible(menuState.shouldShowSaveAttachmentAction());
toolbar.getMenu().findItem(R.id.action_forward).setVisible(menuState.shouldShowForwardAction());
}
private boolean handleToolbarItemClicked(@NonNull MenuItem menuItem) {

View File

@ -0,0 +1,170 @@
package org.thoughtcrime.securesms.conversation;
import androidx.annotation.NonNull;
import org.thoughtcrime.securesms.database.model.MediaMmsMessageRecord;
import org.thoughtcrime.securesms.database.model.MessageRecord;
import org.thoughtcrime.securesms.database.model.MmsMessageRecord;
import java.util.Set;
final class MenuState {
private final boolean forward;
private final boolean reply;
private final boolean details;
private final boolean saveAttachment;
private final boolean resend;
private final boolean copy;
private MenuState(@NonNull Builder builder) {
forward = builder.forward;
reply = builder.reply;
details = builder.details;
saveAttachment = builder.saveAttachment;
resend = builder.resend;
copy = builder.copy;
}
boolean shouldShowForwardAction() {
return forward;
}
boolean shouldShowReplyAction() {
return reply;
}
boolean shouldShowDetailsAction() {
return details;
}
boolean shouldShowSaveAttachmentAction() {
return saveAttachment;
}
boolean shouldShowResendAction() {
return resend;
}
boolean shouldShowCopyAction() {
return copy;
}
static MenuState getMenuState(@NonNull Set<MessageRecord> messageRecords,
boolean shouldShowMessageRequest)
{
Builder builder = new Builder();
boolean actionMessage = false;
boolean hasText = false;
boolean sharedContact = false;
boolean viewOnce = false;
for (MessageRecord messageRecord : messageRecords) {
if (isActionMessage(messageRecord))
{
actionMessage = true;
}
if (messageRecord.getBody().length() > 0) {
hasText = true;
}
if (messageRecord.isMms() && !((MmsMessageRecord) messageRecord).getSharedContacts().isEmpty()) {
sharedContact = true;
}
if (messageRecord.isViewOnce()) {
viewOnce = true;
}
}
if (messageRecords.size() > 1) {
builder.shouldShowForwardAction(false)
.shouldShowReplyAction(false)
.shouldShowDetailsAction(false)
.shouldShowSaveAttachmentAction(false)
.shouldShowResendAction(false);
} else {
MessageRecord messageRecord = messageRecords.iterator().next();
builder.shouldShowResendAction(messageRecord.isFailed())
.shouldShowSaveAttachmentAction(!actionMessage &&
!viewOnce &&
messageRecord.isMms() &&
!messageRecord.isMmsNotification() &&
((MediaMmsMessageRecord)messageRecord).containsMediaSlide() &&
((MediaMmsMessageRecord)messageRecord).getSlideDeck().getStickerSlide() == null)
.shouldShowForwardAction(!actionMessage && !sharedContact && !viewOnce)
.shouldShowDetailsAction(!actionMessage)
.shouldShowReplyAction(canReplyToMessage(actionMessage, messageRecord, shouldShowMessageRequest));
}
return builder.shouldShowCopyAction(!actionMessage && hasText)
.build();
}
static boolean canReplyToMessage(boolean actionMessage, @NonNull MessageRecord messageRecord, boolean isDisplayingMessageRequest) {
return !actionMessage &&
!messageRecord.isPending() &&
!messageRecord.isFailed() &&
!isDisplayingMessageRequest &&
messageRecord.isSecure();
}
static boolean isActionMessage(@NonNull MessageRecord messageRecord) {
return messageRecord.isGroupAction() ||
messageRecord.isCallLog() ||
messageRecord.isJoined() ||
messageRecord.isExpirationTimerUpdate() ||
messageRecord.isEndSession() ||
messageRecord.isIdentityUpdate() ||
messageRecord.isIdentityVerified() ||
messageRecord.isIdentityDefault();
}
private final static class Builder {
private boolean forward;
private boolean reply;
private boolean details;
private boolean saveAttachment;
private boolean resend;
private boolean copy;
@NonNull Builder shouldShowForwardAction(boolean forward) {
this.forward = forward;
return this;
}
@NonNull Builder shouldShowReplyAction(boolean reply) {
this.reply = reply;
return this;
}
@NonNull Builder shouldShowDetailsAction(boolean details) {
this.details = details;
return this;
}
@NonNull Builder shouldShowSaveAttachmentAction(boolean saveAttachment) {
this.saveAttachment = saveAttachment;
return this;
}
@NonNull Builder shouldShowResendAction(boolean resend) {
this.resend = resend;
return this;
}
@NonNull Builder shouldShowCopyAction(boolean copy) {
this.copy = copy;
return this;
}
@NonNull
MenuState build() {
return new MenuState(this);
}
}
}

View File

@ -54,4 +54,7 @@ public class ModernEncryptingPartOutputStream {
}
}
public static long getPlaintextLength(long cipherTextLength) {
return cipherTextLength - 32;
}
}

View File

@ -1,40 +1,50 @@
package org.thoughtcrime.securesms.database;
import android.annotation.SuppressLint;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.annotation.WorkerThread;
import com.annimon.stream.Stream;
import com.google.protobuf.InvalidProtocolBufferException;
import net.sqlcipher.database.SQLiteDatabase;
import org.signal.storageservice.protos.groups.Member;
import org.signal.storageservice.protos.groups.local.DecryptedGroup;
import org.signal.storageservice.protos.groups.local.DecryptedMember;
import org.signal.zkgroup.InvalidInputException;
import org.signal.zkgroup.groups.GroupMasterKey;
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.BitmapUtil;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.messages.SignalServiceAttachmentPointer;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.util.UuidUtil;
import org.whispersystems.signalservice.internal.groupsv2.DecryptedGroupUtil;
import java.io.Closeable;
import java.security.SecureRandom;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.UUID;
public class GroupDatabase extends Database {
public final class GroupDatabase extends Database {
@SuppressWarnings("unused")
private static final String TAG = GroupDatabase.class.getSimpleName();
private static final String TAG = Log.tag(GroupDatabase.class);
static final String TABLE_NAME = "groups";
private static final String ID = "_id";
@ -42,7 +52,6 @@ public class GroupDatabase extends Database {
static final String RECIPIENT_ID = "recipient_id";
private static final String TITLE = "title";
private static final String MEMBERS = "members";
private static final String AVATAR = "avatar";
private static final String AVATAR_ID = "avatar_id";
private static final String AVATAR_KEY = "avatar_key";
private static final String AVATAR_CONTENT_TYPE = "avatar_content_type";
@ -52,6 +61,14 @@ public class GroupDatabase extends Database {
static final String ACTIVE = "active";
static final String MMS = "mms";
/* V2 Group columns */
/** 32 bytes serialized {@link GroupMasterKey} */
private static final String V2_MASTER_KEY = "master_key";
/** Increments with every change to the group */
private static final String V2_REVISION = "revision";
/** Serialized {@link DecryptedGroup} protobuf */
private static final String V2_DECRYPTED_GROUP = "decrypted_group";
public static final String CREATE_TABLE =
"CREATE TABLE " + TABLE_NAME +
" (" + ID + " INTEGER PRIMARY KEY, " +
@ -59,7 +76,6 @@ public class GroupDatabase extends Database {
RECIPIENT_ID + " INTEGER, " +
TITLE + " TEXT, " +
MEMBERS + " TEXT, " +
AVATAR + " BLOB, " +
AVATAR_ID + " INTEGER, " +
AVATAR_KEY + " BLOB, " +
AVATAR_CONTENT_TYPE + " TEXT, " +
@ -67,7 +83,10 @@ public class GroupDatabase extends Database {
TIMESTAMP + " INTEGER, " +
ACTIVE + " INTEGER DEFAULT 1, " +
AVATAR_DIGEST + " BLOB, " +
MMS + " INTEGER DEFAULT 0);";
MMS + " INTEGER DEFAULT 0, " +
V2_MASTER_KEY + " BLOB, " +
V2_REVISION + " BLOB, " +
V2_DECRYPTED_GROUP + " BLOB);";
public static final String[] CREATE_INDEXS = {
"CREATE UNIQUE INDEX IF NOT EXISTS group_id_index ON " + TABLE_NAME + " (" + GROUP_ID + ");",
@ -75,7 +94,7 @@ public class GroupDatabase extends Database {
};
private static final String[] GROUP_PROJECTION = {
GROUP_ID, RECIPIENT_ID, TITLE, MEMBERS, AVATAR, AVATAR_ID, AVATAR_KEY, AVATAR_CONTENT_TYPE, AVATAR_RELAY, AVATAR_DIGEST,
GROUP_ID, RECIPIENT_ID, TITLE, MEMBERS, AVATAR_ID, AVATAR_KEY, AVATAR_CONTENT_TYPE, AVATAR_RELAY, AVATAR_DIGEST,
TIMESTAMP, ACTIVE, MMS
};
@ -120,7 +139,7 @@ public class GroupDatabase extends Database {
return true;
}
boolean noMetadata = group.get().getAvatar() == null && TextUtils.isEmpty(group.get().getTitle());
boolean noMetadata = !group.get().hasAvatar() && TextUtils.isEmpty(group.get().getTitle());
boolean noMembers = group.get().getMembers().isEmpty() || (group.get().getMembers().size() == 1 && group.get().getMembers().contains(Recipient.self().getId()));
return noMetadata && noMembers;
@ -143,19 +162,20 @@ public class GroupDatabase extends Database {
return new Reader(cursor);
}
public GroupId getOrCreateGroupForMembers(List<RecipientId> members, boolean mms) {
public GroupId.Mms getOrCreateMmsGroupForMembers(List<RecipientId> members) {
Collections.sort(members);
Cursor cursor = databaseHelper.getReadableDatabase().query(TABLE_NAME, new String[] {GROUP_ID},
MEMBERS + " = ? AND " + MMS + " = ?",
new String[] {RecipientId.toSerializedList(members), mms ? "1" : "0"},
new String[] {RecipientId.toSerializedList(members), "1"},
null, null, null);
try {
if (cursor != null && cursor.moveToNext()) {
return GroupId.parse(cursor.getString(cursor.getColumnIndexOrThrow(GROUP_ID)));
return GroupId.parse(cursor.getString(cursor.getColumnIndexOrThrow(GROUP_ID)))
.requireMms();
} else {
GroupId groupId = allocateGroupId(mms);
create(groupId, null, members, null, null);
GroupId.Mms groupId = GroupId.createMms(new SecureRandom());
create(groupId, members);
return groupId;
}
} finally {
@ -197,24 +217,62 @@ public class GroupDatabase extends Database {
return new Reader(cursor);
}
public @NonNull List<Recipient> getGroupMembers(@NonNull GroupId groupId, boolean includeSelf) {
List<RecipientId> members = getCurrentMembers(groupId);
List<Recipient> recipients = new LinkedList<>();
@WorkerThread
public @NonNull List<Recipient> getGroupMembers(@NonNull GroupId groupId, @NonNull MemberSet memberSet) {
if (groupId.isV2()) {
return getGroup(groupId).transform(g -> g.requireV2GroupProperties().getMembers(context, memberSet))
.or(Collections.emptyList());
} else {
List<RecipientId> currentMembers = getCurrentMembers(groupId);
List<Recipient> recipients = new ArrayList<>(currentMembers.size());
for (RecipientId member : members) {
if (!includeSelf && Recipient.resolved(member).isLocalNumber()) {
continue;
for (RecipientId member : currentMembers) {
if (memberSet.includeSelf || !Recipient.resolved(member).isLocalNumber()) {
recipients.add(Recipient.resolved(member));
}
}
recipients.add(Recipient.resolved(member));
return recipients;
}
return recipients;
}
public void create(@NonNull GroupId groupId, @Nullable String title, @NonNull List<RecipientId> members,
@Nullable SignalServiceAttachmentPointer avatar, @Nullable String relay)
public void create(@NonNull GroupId.V1 groupId,
@Nullable String title,
@NonNull Collection<RecipientId> members,
@Nullable SignalServiceAttachmentPointer avatar,
@Nullable String relay)
{
create(groupId, title, members, avatar, relay, null, null);
}
public void create(@NonNull GroupId.Mms groupId,
@NonNull Collection<RecipientId> members)
{
create(groupId, null, members, null, null, null, null);
}
public void create(@NonNull GroupId.V2 groupId,
@Nullable SignalServiceAttachmentPointer avatar,
@Nullable String relay,
@NonNull GroupMasterKey groupMasterKey,
@NonNull DecryptedGroup groupState)
{
create(groupId, groupState.getTitle(), Collections.emptyList(), avatar, relay, groupMasterKey, groupState);
}
/**
* @param groupMasterKey null for V1, must be non-null for V2 (presence dictates group version).
*/
private void create(@NonNull GroupId groupId,
@Nullable String title,
@NonNull Collection<RecipientId> memberCollection,
@Nullable SignalServiceAttachmentPointer avatar,
@Nullable String relay,
@Nullable GroupMasterKey groupMasterKey,
@Nullable DecryptedGroup groupState)
{
List<RecipientId> members = new ArrayList<>(new HashSet<>(memberCollection));
Collections.sort(members);
ContentValues contentValues = new ContentValues();
@ -228,12 +286,29 @@ public class GroupDatabase extends Database {
contentValues.put(AVATAR_KEY, avatar.getKey());
contentValues.put(AVATAR_CONTENT_TYPE, avatar.getContentType());
contentValues.put(AVATAR_DIGEST, avatar.getDigest().orNull());
} else {
contentValues.put(AVATAR_ID, 0);
}
contentValues.put(AVATAR_RELAY, relay);
contentValues.put(TIMESTAMP, System.currentTimeMillis());
contentValues.put(ACTIVE, 1);
contentValues.put(MMS, groupId.isMmsGroup());
contentValues.put(MMS, groupId.isMms());
if (groupMasterKey != null) {
if (groupState == null) {
throw new AssertionError("V2 master key but no group state");
}
groupId.requireV2();
contentValues.put(V2_MASTER_KEY, groupMasterKey.serialize());
contentValues.put(V2_REVISION, groupState.getVersion());
contentValues.put(V2_DECRYPTED_GROUP, groupState.toByteArray());
contentValues.put(MEMBERS, serializeV2GroupMembers(context, groupState));
} else {
if (groupId.isV2()) {
throw new AssertionError("V2 group id but no master key");
}
}
databaseHelper.getWritableDatabase().insert(TABLE_NAME, null, contentValues);
@ -243,7 +318,10 @@ public class GroupDatabase extends Database {
notifyConversationListListeners();
}
public void update(@NonNull GroupId groupId, String title, SignalServiceAttachmentPointer avatar) {
public void update(@NonNull GroupId.V1 groupId,
@Nullable String title,
@Nullable SignalServiceAttachmentPointer avatar)
{
ContentValues contentValues = new ContentValues();
if (title != null) contentValues.put(TITLE, title);
@ -252,6 +330,8 @@ public class GroupDatabase extends Database {
contentValues.put(AVATAR_CONTENT_TYPE, avatar.getContentType());
contentValues.put(AVATAR_KEY, avatar.getKey());
contentValues.put(AVATAR_DIGEST, avatar.getDigest().orNull());
} else {
contentValues.put(AVATAR_ID, 0);
}
databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues,
@ -264,7 +344,30 @@ public class GroupDatabase extends Database {
notifyConversationListListeners();
}
public void updateTitle(@NonNull GroupId groupId, String title) {
public void update(@NonNull GroupMasterKey groupMasterKey, @NonNull DecryptedGroup decryptedGroup) {
update(GroupId.v2(groupMasterKey), decryptedGroup);
}
public void update(@NonNull GroupId.V2 groupId, @NonNull DecryptedGroup decryptedGroup) {
String title = decryptedGroup.getTitle();
ContentValues contentValues = new ContentValues();
contentValues.put(TITLE, title);
contentValues.put(V2_REVISION, decryptedGroup.getVersion());
contentValues.put(V2_DECRYPTED_GROUP, decryptedGroup.toByteArray());
contentValues.put(MEMBERS, serializeV2GroupMembers(context, decryptedGroup));
databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues,
GROUP_ID + " = ?",
new String[]{ groupId.toString() });
RecipientId groupRecipient = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(groupId);
Recipient.live(groupRecipient).refresh();
notifyConversationListListeners();
}
public void updateTitle(@NonNull GroupId.V1 groupId, String title) {
ContentValues contentValues = new ContentValues();
contentValues.put(TITLE, title);
databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, GROUP_ID + " = ?",
@ -274,20 +377,12 @@ public class GroupDatabase extends Database {
Recipient.live(groupRecipient).refresh();
}
public void updateAvatar(@NonNull GroupId groupId, @Nullable Bitmap avatar) {
updateAvatar(groupId, BitmapUtil.toByteArray(avatar));
}
public void updateAvatar(@NonNull GroupId groupId, @Nullable byte[] avatar) {
long avatarId;
if (avatar != null) avatarId = Math.abs(new SecureRandom().nextLong());
else avatarId = 0;
ContentValues contentValues = new ContentValues(2);
contentValues.put(AVATAR, avatar);
contentValues.put(AVATAR_ID, avatarId);
/**
* Used to bust the Glide cache when an avatar changes.
*/
public void onAvatarUpdated(@NonNull GroupId.V1 groupId, boolean hasAvatar) {
ContentValues contentValues = new ContentValues(1);
contentValues.put(AVATAR_ID, hasAvatar ? Math.abs(new SecureRandom().nextLong()) : 0);
databaseHelper.getWritableDatabase().update(TABLE_NAME, contentValues, GROUP_ID + " = ?",
new String[] {groupId.toString()});
@ -357,10 +452,18 @@ public class GroupDatabase extends Database {
database.update(TABLE_NAME, values, GROUP_ID + " = ?", new String[] {groupId.toString()});
}
public static GroupId allocateGroupId(boolean mms) {
byte[] groupId = new byte[16];
new SecureRandom().nextBytes(groupId);
return mms ? GroupId.mms(groupId) : GroupId.v1(groupId);
private static String serializeV2GroupMembers(@NonNull Context context, @NonNull DecryptedGroup decryptedGroup) {
List<RecipientId> groupMembers = new ArrayList<>(decryptedGroup.getMembersCount());
for (DecryptedMember member : decryptedGroup.getMembersList()) {
Recipient recipient = Recipient.externalPush(context, new SignalServiceAddress(UuidUtil.fromByteString(member.getUuid()), null));
groupMembers.add(recipient.getId());
}
Collections.sort(groupMembers);
return RecipientId.toSerializedList(groupMembers);
}
public static class Reader implements Closeable {
@ -388,14 +491,16 @@ public class GroupDatabase extends Database {
RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow(RECIPIENT_ID))),
cursor.getString(cursor.getColumnIndexOrThrow(TITLE)),
cursor.getString(cursor.getColumnIndexOrThrow(MEMBERS)),
cursor.getBlob(cursor.getColumnIndexOrThrow(AVATAR)),
cursor.getLong(cursor.getColumnIndexOrThrow(AVATAR_ID)),
cursor.getBlob(cursor.getColumnIndexOrThrow(AVATAR_KEY)),
cursor.getString(cursor.getColumnIndexOrThrow(AVATAR_CONTENT_TYPE)),
cursor.getString(cursor.getColumnIndexOrThrow(AVATAR_RELAY)),
cursor.getInt(cursor.getColumnIndexOrThrow(ACTIVE)) == 1,
cursor.getBlob(cursor.getColumnIndexOrThrow(AVATAR_DIGEST)),
cursor.getInt(cursor.getColumnIndexOrThrow(MMS)) == 1);
cursor.getInt(cursor.getColumnIndexOrThrow(MMS)) == 1,
cursor.getBlob(cursor.getColumnIndexOrThrow(V2_MASTER_KEY)),
cursor.getInt(cursor.getColumnIndexOrThrow(V2_REVISION)),
cursor.getBlob(cursor.getColumnIndexOrThrow(V2_DECRYPTED_GROUP)));
}
@Override
@ -407,27 +512,27 @@ public class GroupDatabase extends Database {
public static class GroupRecord {
private final GroupId id;
private final RecipientId recipientId;
private final String title;
private final List<RecipientId> members;
private final byte[] avatar;
private final long avatarId;
private final byte[] avatarKey;
private final byte[] avatarDigest;
private final String avatarContentType;
private final String relay;
private final boolean active;
private final boolean mms;
private final GroupId id;
private final RecipientId recipientId;
private final String title;
private final List<RecipientId> members;
private final long avatarId;
private final byte[] avatarKey;
private final byte[] avatarDigest;
private final String avatarContentType;
private final String relay;
private final boolean active;
private final boolean mms;
@Nullable private final V2GroupProperties v2GroupProperties;
public GroupRecord(@NonNull GroupId id, @NonNull RecipientId recipientId, String title, String members, byte[] avatar,
public GroupRecord(@NonNull GroupId id, @NonNull RecipientId recipientId, String title, String members,
long avatarId, byte[] avatarKey, String avatarContentType,
String relay, boolean active, byte[] avatarDigest, boolean mms)
String relay, boolean active, byte[] avatarDigest, boolean mms,
@Nullable byte[] groupMasterKeyBytes, int groupRevision, @Nullable byte[] decryptedGroupBytes)
{
this.id = id;
this.recipientId = recipientId;
this.title = title;
this.avatar = avatar;
this.avatarId = avatarId;
this.avatarKey = avatarKey;
this.avatarDigest = avatarDigest;
@ -436,6 +541,18 @@ public class GroupDatabase extends Database {
this.active = active;
this.mms = mms;
V2GroupProperties v2GroupProperties = null;
if (groupMasterKeyBytes != null && decryptedGroupBytes != null) {
GroupMasterKey groupMasterKey;
try {
groupMasterKey = new GroupMasterKey(groupMasterKeyBytes);
} catch (InvalidInputException e) {
throw new AssertionError(e);
}
v2GroupProperties = new V2GroupProperties(groupMasterKey, groupRevision, decryptedGroupBytes);
}
this.v2GroupProperties = v2GroupProperties;
if (!TextUtils.isEmpty(members)) this.members = RecipientId.fromSerializedList(members);
else this.members = new LinkedList<>();
}
@ -456,8 +573,8 @@ public class GroupDatabase extends Database {
return members;
}
public byte[] getAvatar() {
return avatar;
public boolean hasAvatar() {
return avatarId != 0;
}
public long getAvatarId() {
@ -487,5 +604,97 @@ public class GroupDatabase extends Database {
public boolean isMms() {
return mms;
}
public boolean isV2Group() {
return v2GroupProperties != null;
}
public @NonNull V2GroupProperties requireV2GroupProperties() {
if (v2GroupProperties == null) {
throw new AssertionError();
}
return v2GroupProperties;
}
public boolean isAdmin(@NonNull Recipient recipient) {
return isV2Group() && requireV2GroupProperties().isAdmin(recipient);
}
}
public static class V2GroupProperties {
@NonNull private final GroupMasterKey groupMasterKey;
private final int groupRevision;
@NonNull private final byte[] decryptedGroupBytes;
private DecryptedGroup decryptedGroup;
private V2GroupProperties(@NonNull GroupMasterKey groupMasterKey, int groupRevision, @NonNull byte[] decryptedGroup) {
this.groupMasterKey = groupMasterKey;
this.groupRevision = groupRevision;
this.decryptedGroupBytes = decryptedGroup;
}
public @NonNull GroupMasterKey getGroupMasterKey() {
return groupMasterKey;
}
public int getGroupRevision() {
return groupRevision;
}
public @NonNull DecryptedGroup getDecryptedGroup() {
try {
if (decryptedGroup == null) {
decryptedGroup = DecryptedGroup.parseFrom(decryptedGroupBytes);
}
return decryptedGroup;
} catch (InvalidProtocolBufferException e) {
throw new AssertionError(e);
}
}
public boolean isAdmin(@NonNull Recipient recipient) {
return DecryptedGroupUtil.findMemberByUuid(getDecryptedGroup().getMembersList(), recipient.getUuid().get())
.transform(t -> t.getRole() == Member.Role.ADMINISTRATOR)
.or(false);
}
public List<Recipient> getMembers(@NonNull Context context, @NonNull MemberSet memberSet) {
boolean includeSelf = memberSet.includeSelf;
DecryptedGroup groupV2 = getDecryptedGroup();
UUID selfUuid = Recipient.self().getUuid().get();
List<Recipient> recipients = new ArrayList<>(groupV2.getMembersCount() + groupV2.getPendingMembersCount());
for (UUID uuid : DecryptedGroupUtil.toUuidList(groupV2.getMembersList())) {
if (includeSelf || !selfUuid.equals(uuid)) {
recipients.add(Recipient.externalPush(context, uuid, null));
}
}
if (memberSet.includePending) {
for (UUID uuid : DecryptedGroupUtil.pendingToUuidList(groupV2.getPendingMembersList())) {
if (includeSelf || !selfUuid.equals(uuid)) {
recipients.add(Recipient.externalPush(context, uuid, null));
}
}
}
return recipients;
}
}
public enum MemberSet {
FULL_MEMBERS_INCLUDING_SELF(true, false),
FULL_MEMBERS_EXCLUDING_SELF(false, false),
FULL_MEMBERS_AND_PENDING_INCLUDING_SELF(true, true),
FULL_MEMBERS_AND_PENDING_EXCLUDING_SELF(false, true);
private boolean includeSelf;
private boolean includePending;
MemberSet(boolean includeSelf, boolean includePending) {
this.includeSelf = includeSelf;
this.includePending = includePending;
}
}
}

View File

@ -4,6 +4,7 @@ package org.thoughtcrime.securesms.database;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import androidx.annotation.NonNull;
import net.sqlcipher.database.SQLiteDatabase;
@ -11,6 +12,7 @@ import net.sqlcipher.database.SQLiteDatabase;
import org.thoughtcrime.securesms.database.helpers.SQLCipherOpenHelper;
import org.thoughtcrime.securesms.recipients.RecipientId;
import java.util.Collection;
import java.util.LinkedList;
import java.util.List;
@ -41,7 +43,7 @@ public class GroupReceiptDatabase extends Database {
super(context, databaseHelper);
}
public void insert(List<RecipientId> recipientIds, long mmsId, int status, long timestamp) {
public void insert(Collection<RecipientId> recipientIds, long mmsId, int status, long timestamp) {
SQLiteDatabase db = databaseHelper.getWritableDatabase();
for (RecipientId recipientId : recipientIds) {

View File

@ -1141,8 +1141,8 @@ public class MmsDatabase extends MessagingDatabase {
long messageId = insertMediaMessage(message.getBody(), message.getAttachments(), quoteAttachments, message.getSharedContacts(), message.getLinkPreviews(), contentValues, insertListener);
if (message.getRecipient().isGroup()) {
List<Recipient> members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(message.getRecipient().requireGroupId(), false);
GroupReceiptDatabase receiptDatabase = DatabaseFactory.getGroupReceiptDatabase(context);
List<Recipient> members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(message.getRecipient().requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
receiptDatabase.insert(Stream.of(members).map(Recipient::getId).toList(),
messageId, defaultReceiptStatus, message.getSentTimeMillis());

View File

@ -356,7 +356,7 @@ public class RecipientDatabase extends Database {
if (result.neededInsert) {
ContentValues values = new ContentValues();
if (groupId.isMmsGroup()) {
if (groupId.isMms()) {
values.put(GROUP_TYPE, GroupType.MMS.getId());
} else {
values.put(GROUP_TYPE, GroupType.SIGNAL_V1.getId());
@ -1406,9 +1406,9 @@ public class RecipientDatabase extends Database {
db.update(TABLE_NAME, setBlocked, UUID + " = ?", new String[] { uuid });
}
List<GroupId> groupIdStrings = Stream.of(groupIds).map(GroupId::v1).toList();
List<GroupId.V1> groupIdStrings = Stream.of(groupIds).map(GroupId::v1).toList();
for (GroupId groupId : groupIdStrings) {
for (GroupId.V1 groupId : groupIdStrings) {
db.update(TABLE_NAME, setBlocked, GROUP_ID + " = ?", new String[] { groupId.toString() });
}

View File

@ -233,7 +233,7 @@ public class SmsMigrator {
List<RecipientId> recipientIds = Stream.of(ourRecipients).map(Recipient::getId).toList();
GroupId ourGroupId = DatabaseFactory.getGroupDatabase(context).getOrCreateGroupForMembers(recipientIds, true);
GroupId.Mms ourGroupId = DatabaseFactory.getGroupDatabase(context).getOrCreateMmsGroupForMembers(recipientIds);
RecipientId ourGroupRecipientId = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(ourGroupId);
Recipient ourGroupRecipient = Recipient.resolved(ourGroupRecipientId);
long ourThreadId = threadDatabase.getThreadIdFor(ourGroupRecipient, ThreadDatabase.DistributionTypes.CONVERSATION);

View File

@ -21,7 +21,9 @@ import net.sqlcipher.database.SQLiteDatabase;
import net.sqlcipher.database.SQLiteDatabaseHook;
import net.sqlcipher.database.SQLiteOpenHelper;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.profiles.ProfileName;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.storage.StorageSyncHelper;
import org.thoughtcrime.securesms.crypto.DatabaseSecret;
import org.thoughtcrime.securesms.crypto.MasterSecret;
@ -51,14 +53,17 @@ import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter;
import org.thoughtcrime.securesms.service.KeyCachingService;
import org.thoughtcrime.securesms.storage.StorageSyncHelper;
import org.thoughtcrime.securesms.util.Base64;
import org.thoughtcrime.securesms.util.FileUtils;
import org.thoughtcrime.securesms.util.ServiceUtil;
import org.thoughtcrime.securesms.util.SqlUtil;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.thoughtcrime.securesms.util.Util;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
public class SQLCipherOpenHelper extends SQLiteOpenHelper {
@ -118,8 +123,10 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
private static final int GROUPS_V2_RECIPIENT_CAPABILITY = 51;
private static final int TRANSFER_FILE_CLEANUP = 52;
private static final int PROFILE_DATA_MIGRATION = 53;
private static final int AVATAR_LOCATION_MIGRATION = 54;
private static final int GROUPS_V2 = 55;
private static final int DATABASE_VERSION = 53;
private static final int DATABASE_VERSION = 55;
private static final String DATABASE_NAME = "signal.db";
private final Context context;
@ -802,6 +809,55 @@ public class SQLCipherOpenHelper extends SQLiteOpenHelper {
}
}
if (oldVersion < AVATAR_LOCATION_MIGRATION) {
File oldAvatarDirectory = new File(context.getFilesDir(), "avatars");
File[] results = oldAvatarDirectory.listFiles();
if (results != null) {
Log.i(TAG, "Preparing to migrate " + results.length + " avatars.");
for (File file : results) {
if (Util.isLong(file.getName())) {
try {
AvatarHelper.setAvatar(context, RecipientId.from(file.getName()), new FileInputStream(file));
} catch(IOException e) {
Log.w(TAG, "Failed to copy file " + file.getName() + "! Skipping.");
}
} else {
Log.w(TAG, "Invalid avatar name '" + file.getName() + "'! Skipping.");
}
}
} else {
Log.w(TAG, "No avatar directory files found.");
}
if (!FileUtils.deleteDirectory(oldAvatarDirectory)) {
Log.w(TAG, "Failed to delete avatar directory.");
}
try (Cursor cursor = db.rawQuery("SELECT recipient_id, avatar FROM groups", null)) {
while (cursor != null && cursor.moveToNext()) {
RecipientId recipientId = RecipientId.from(cursor.getLong(cursor.getColumnIndexOrThrow("recipient_id")));
byte[] avatar = cursor.getBlob(cursor.getColumnIndexOrThrow("avatar"));
try {
AvatarHelper.setAvatar(context, recipientId, avatar != null ? new ByteArrayInputStream(avatar) : null);
} catch (IOException e) {
Log.w(TAG, "Failed to copy avatar for " + recipientId + "! Skipping.", e);
}
}
}
db.execSQL("UPDATE groups SET avatar_id = 0 WHERE avatar IS NULL");
db.execSQL("UPDATE groups SET avatar = NULL");
}
if (oldVersion < GROUPS_V2) {
db.execSQL("ALTER TABLE groups ADD COLUMN master_key");
db.execSQL("ALTER TABLE groups ADD COLUMN revision");
db.execSQL("ALTER TABLE groups ADD COLUMN decrypted_group");
}
db.setTransactionSuccessful();
} finally {
db.endTransaction();

View File

@ -3,27 +3,64 @@ package org.thoughtcrime.securesms.groups;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import org.signal.zkgroup.groups.GroupIdentifier;
import org.signal.zkgroup.groups.GroupMasterKey;
import org.signal.zkgroup.groups.GroupSecretParams;
import org.thoughtcrime.securesms.util.Hex;
import org.thoughtcrime.securesms.util.Util;
import java.io.IOException;
import java.security.SecureRandom;
public final class GroupId {
public abstract class GroupId {
private static final String ENCODED_SIGNAL_GROUP_PREFIX = "__textsecure_group__!";
private static final String ENCODED_MMS_GROUP_PREFIX = "__signal_mms_group__!";
private static final int MMS_BYTE_LENGTH = 16;
private static final int V1_MMS_BYTE_LENGTH = 16;
private static final int V2_BYTE_LENGTH = GroupIdentifier.SIZE;
private static final int V2_ENCODED_LENGTH = ENCODED_SIGNAL_GROUP_PREFIX.length() + V2_BYTE_LENGTH * 2;
private final String encodedId;
private GroupId(@NonNull String encodedId) {
this.encodedId = encodedId;
private GroupId(@NonNull String prefix, @NonNull byte[] bytes) {
this.encodedId = prefix + Hex.toStringCondensed(bytes);
}
public static @NonNull GroupId v1(byte[] gv1GroupIdBytes) {
return new GroupId(ENCODED_SIGNAL_GROUP_PREFIX + Hex.toStringCondensed(gv1GroupIdBytes));
public static @NonNull GroupId.Mms mms(byte[] mmsGroupIdBytes) {
return new GroupId.Mms(mmsGroupIdBytes);
}
public static @NonNull GroupId mms(byte[] mmsGroupIdBytes) {
return new GroupId(ENCODED_MMS_GROUP_PREFIX + Hex.toStringCondensed(mmsGroupIdBytes));
public static @NonNull GroupId.V1 v1(byte[] gv1GroupIdBytes) {
if (gv1GroupIdBytes.length == V2_BYTE_LENGTH) {
throw new AssertionError();
}
return new GroupId.V1(gv1GroupIdBytes);
}
public static GroupId.V1 createV1(@NonNull SecureRandom secureRandom) {
return v1(Util.getSecretBytes(secureRandom, V1_MMS_BYTE_LENGTH));
}
public static GroupId.Mms createMms(@NonNull SecureRandom secureRandom) {
return mms(Util.getSecretBytes(secureRandom, MMS_BYTE_LENGTH));
}
public static GroupId.V2 v2(@NonNull byte[] bytes) {
if (bytes.length != V2_BYTE_LENGTH) {
throw new AssertionError();
}
return new GroupId.V2(bytes);
}
public static GroupId.V2 v2(@NonNull GroupIdentifier groupIdentifier) {
return v2(groupIdentifier.serialize());
}
public static GroupId.V2 v2(@NonNull GroupMasterKey masterKey) {
return v2(GroupSecretParams.deriveFromMasterKey(masterKey)
.getPublicParams()
.getGroupIdentifier());
}
public static @NonNull GroupId parse(@NonNull String encodedGroupId) {
@ -33,7 +70,11 @@ public final class GroupId {
}
byte[] bytes = extractDecodedId(encodedGroupId);
return isMmsGroup(encodedGroupId) ? mms(bytes) : v1(bytes);
if (encodedGroupId.startsWith(ENCODED_MMS_GROUP_PREFIX)) return mms(bytes);
else if (encodedGroupId.length() == V2_ENCODED_LENGTH) return v2(bytes);
else return v1(bytes);
} catch (IOException e) {
throw new AssertionError(e);
}
@ -55,10 +96,6 @@ public final class GroupId {
return Hex.fromStringCondensed(encodedGroupId.split("!", 2)[1]);
}
private static boolean isMmsGroup(@NonNull String groupId) {
return groupId.startsWith(ENCODED_MMS_GROUP_PREFIX);
}
public byte[] getDecodedId() {
try {
return extractDecodedId(encodedId);
@ -67,10 +104,6 @@ public final class GroupId {
}
}
public boolean isMmsGroup() {
return isMmsGroup(encodedId);
}
@Override
public boolean equals(@Nullable Object obj) {
if (obj instanceof GroupId) {
@ -90,4 +123,109 @@ public final class GroupId {
public String toString() {
return encodedId;
}
public abstract boolean isMms();
public abstract boolean isV1();
public abstract boolean isV2();
public abstract boolean isPush();
public GroupId.Mms requireMms() {
if (this instanceof GroupId.Mms) return (GroupId.Mms) this;
throw new AssertionError();
}
public GroupId.V1 requireV1() {
if (this instanceof GroupId.V1) return (GroupId.V1) this;
throw new AssertionError();
}
public GroupId.V2 requireV2() {
if (this instanceof GroupId.V2) return (GroupId.V2) this;
throw new AssertionError();
}
public GroupId.Push requirePush() {
if (this instanceof GroupId.Push) return (GroupId.Push) this;
throw new AssertionError();
}
public static final class Mms extends GroupId {
private Mms(@NonNull byte[] bytes) {
super(ENCODED_MMS_GROUP_PREFIX, bytes);
}
@Override
public boolean isMms() {
return true;
}
@Override
public boolean isV1() {
return false;
}
@Override
public boolean isV2() {
return false;
}
@Override
public boolean isPush() {
return false;
}
}
public static abstract class Push extends GroupId {
private Push(@NonNull byte[] bytes) {
super(ENCODED_SIGNAL_GROUP_PREFIX, bytes);
}
@Override
public boolean isMms() {
return false;
}
@Override
public boolean isPush() {
return true;
}
}
public static final class V1 extends GroupId.Push {
private V1(@NonNull byte[] bytes) {
super(bytes);
}
@Override
public boolean isV1() {
return true;
}
@Override
public boolean isV2() {
return false;
}
}
public static final class V2 extends GroupId.Push {
private V2(@NonNull byte[] bytes) {
super(bytes);
}
@Override
public boolean isV1() {
return false;
}
@Override
public boolean isV2() {
return true;
}
}
}

View File

@ -53,7 +53,7 @@ public final class GroupManager {
public static boolean leaveGroup(@NonNull Context context, @NonNull Recipient groupRecipient) {
GroupId groupId = groupRecipient.requireGroupId();
return V1GroupManager.leaveGroup(context, groupId, groupRecipient);
return V1GroupManager.leaveGroup(context, groupId.requireV1(), groupRecipient);
}
public static class GroupActionResult {

View File

@ -34,6 +34,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceContent;
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
import org.whispersystems.signalservice.api.messages.SignalServiceGroup.Type;
import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import java.util.Collections;
@ -46,22 +47,29 @@ import static org.thoughtcrime.securesms.database.GroupDatabase.GroupRecord;
import static org.whispersystems.signalservice.internal.push.SignalServiceProtos.AttachmentPointer;
import static org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupContext;
public class GroupMessageProcessor {
public final class GroupV1MessageProcessor {
private static final String TAG = GroupMessageProcessor.class.getSimpleName();
private static final String TAG = Log.tag(GroupV1MessageProcessor.class);
public static @Nullable Long process(@NonNull Context context,
@NonNull SignalServiceContent content,
@NonNull SignalServiceDataMessage message,
boolean outgoing)
{
if (!message.getGroupInfo().isPresent() || message.getGroupInfo().get().getGroupId() == null) {
SignalServiceGroupContext signalServiceGroupContext = message.getGroupContext().get();
Optional<SignalServiceGroup> groupV1 = signalServiceGroupContext.getGroupV1();
if (signalServiceGroupContext.getGroupV2().isPresent()) {
throw new AssertionError("Cannot process GV2");
}
if (!groupV1.isPresent() || groupV1.get().getGroupId() == null) {
Log.w(TAG, "Received group message with no id! Ignoring...");
return null;
}
GroupDatabase database = DatabaseFactory.getGroupDatabase(context);
SignalServiceGroup group = message.getGroupInfo().get();
SignalServiceGroup group = groupV1.get();
GroupId id = GroupId.v1(group.getGroupId());
Optional<GroupRecord> record = database.getGroup(id);
@ -85,7 +93,7 @@ public class GroupMessageProcessor {
boolean outgoing)
{
GroupDatabase database = DatabaseFactory.getGroupDatabase(context);
GroupId id = GroupId.v1(group.getGroupId());
GroupId.V1 id = GroupId.v1(group.getGroupId());
GroupContext.Builder builder = createGroupContext(group);
builder.setType(GroupContext.Type.UPDATE);
@ -119,7 +127,7 @@ public class GroupMessageProcessor {
{
GroupDatabase database = DatabaseFactory.getGroupDatabase(context);
GroupId id = GroupId.v1(group.getGroupId());
GroupId.V1 id = GroupId.v1(group.getGroupId());
Set<RecipientId> recordMembers = new HashSet<>(groupRecord.getMembers());
Set<RecipientId> messageMembers = new HashSet<>();
@ -278,7 +286,7 @@ public class GroupMessageProcessor {
.map(a -> a.getNumber().get())
.toList());
builder.addAllMembers(Stream.of(group.getMembers().get())
.map(GroupMessageProcessor::createMember)
.map(GroupV1MessageProcessor::createMember)
.toList());
}

View File

@ -19,7 +19,10 @@ import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupManager.GroupActionResult;
import org.thoughtcrime.securesms.jobs.LeaveGroupJob;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.MmsException;
import org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
@ -32,6 +35,9 @@ import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.util.InvalidNumberException;
import org.whispersystems.signalservice.internal.push.SignalServiceProtos.GroupContext;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
@ -39,6 +45,8 @@ import java.util.Set;
final class V1GroupManager {
private static final String TAG = Log.tag(V1GroupManager.class);
static @NonNull GroupActionResult createGroup(@NonNull Context context,
@NonNull Set<RecipientId> memberIds,
@Nullable Bitmap avatar,
@ -47,18 +55,28 @@ final class V1GroupManager {
{
final byte[] avatarBytes = BitmapUtil.toByteArray(avatar);
final GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
final GroupId groupId = GroupDatabase.allocateGroupId(mms);
final SecureRandom secureRandom = new SecureRandom();
final GroupId groupId = mms ? GroupId.createMms(secureRandom) : GroupId.createV1(secureRandom);
final RecipientId groupRecipientId = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(groupId);
final Recipient groupRecipient = Recipient.resolved(groupRecipientId);
memberIds.add(Recipient.self().getId());
groupDatabase.create(groupId, name, new LinkedList<>(memberIds), null, null);
if (!mms) {
groupDatabase.updateAvatar(groupId, avatarBytes);
if (groupId.isV1()) {
GroupId.V1 groupIdV1 = groupId.requireV1();
groupDatabase.create(groupIdV1, name, memberIds, null, null);
try {
AvatarHelper.setAvatar(context, groupRecipientId, avatarBytes != null ? new ByteArrayInputStream(avatarBytes) : null);
} catch (IOException e) {
Log.w(TAG, "Failed to save avatar!", e);
}
groupDatabase.onAvatarUpdated(groupIdV1, avatarBytes != null);
DatabaseFactory.getRecipientDatabase(context).setProfileSharing(groupRecipient.getId(), true);
return sendGroupUpdate(context, groupId, memberIds, name, avatarBytes);
return sendGroupUpdate(context, groupIdV1, memberIds, name, avatarBytes);
} else {
groupDatabase.create(groupId.requireMms(), memberIds);
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipient, ThreadDatabase.DistributionTypes.CONVERSATION);
return new GroupActionResult(groupRecipient, threadId);
}
@ -71,18 +89,26 @@ final class V1GroupManager {
@Nullable String name)
throws InvalidNumberException
{
final GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
final byte[] avatarBytes = BitmapUtil.toByteArray(avatar);
final GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
final RecipientId groupRecipientId = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(groupId);
final byte[] avatarBytes = BitmapUtil.toByteArray(avatar);
memberAddresses.add(Recipient.self().getId());
groupDatabase.updateMembers(groupId, new LinkedList<>(memberAddresses));
groupDatabase.updateTitle(groupId, name);
groupDatabase.updateAvatar(groupId, avatarBytes);
if (!groupId.isMmsGroup()) {
return sendGroupUpdate(context, groupId, memberAddresses, name, avatarBytes);
if (groupId.isPush()) {
GroupId.V1 groupIdV1 = groupId.requireV1();
groupDatabase.updateTitle(groupIdV1, name);
groupDatabase.onAvatarUpdated(groupIdV1, avatarBytes != null);
try {
AvatarHelper.setAvatar(context, groupRecipientId, avatarBytes != null ? new ByteArrayInputStream(avatarBytes) : null);
} catch (IOException e) {
Log.w(TAG, "Failed to save avatar!", e);
}
return sendGroupUpdate(context, groupIdV1, memberAddresses, name, avatarBytes);
} else {
RecipientId groupRecipientId = DatabaseFactory.getRecipientDatabase(context).getOrInsertFromGroupId(groupId);
Recipient groupRecipient = Recipient.resolved(groupRecipientId);
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipient);
return new GroupActionResult(groupRecipient, threadId);
@ -90,7 +116,7 @@ final class V1GroupManager {
}
private static GroupActionResult sendGroupUpdate(@NonNull Context context,
@NonNull GroupId groupId,
@NonNull GroupId.V1 groupId,
@NonNull Set<RecipientId> members,
@Nullable String groupName,
@Nullable byte[] avatar)
@ -104,7 +130,7 @@ final class V1GroupManager {
for (RecipientId member : members) {
Recipient recipient = Recipient.resolved(member);
uuidMembers.add(GroupMessageProcessor.createMember(RecipientUtil.toSignalServiceAddress(context, recipient)));
uuidMembers.add(GroupV1MessageProcessor.createMember(RecipientUtil.toSignalServiceAddress(context, recipient)));
}
GroupContext.Builder groupContextBuilder = GroupContext.newBuilder()
@ -127,11 +153,16 @@ final class V1GroupManager {
}
@WorkerThread
static boolean leaveGroup(@NonNull Context context, @NonNull GroupId groupId, @NonNull Recipient groupRecipient) {
static boolean leaveGroup(@NonNull Context context, @NonNull GroupId.V1 groupId, @NonNull Recipient groupRecipient) {
long threadId = DatabaseFactory.getThreadDatabase(context).getThreadIdFor(groupRecipient);
Optional<OutgoingGroupMediaMessage> leaveMessage = GroupUtil.createGroupLeaveMessage(context, groupRecipient);
if (threadId != -1 && leaveMessage.isPresent()) {
try {
DatabaseFactory.getMmsDatabase(context).insertMessageOutbox(leaveMessage.get(), threadId, false, null);
} catch (MmsException e) {
Log.w(TAG, "Failed to insert leave message.", e);
}
ApplicationDependencies.getJobManager().add(LeaveGroupJob.create(groupRecipient));
GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);

View File

@ -14,6 +14,7 @@ import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.mms.AttachmentStreamUriLoader.AttachmentModel;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.util.BitmapDecodingException;
import org.thoughtcrime.securesms.util.BitmapUtil;
import org.thoughtcrime.securesms.util.Hex;
@ -37,9 +38,9 @@ public class AvatarDownloadJob extends BaseJob {
private static final String KEY_GROUP_ID = "group_id";
private @NonNull GroupId groupId;
private @NonNull GroupId.V1 groupId;
public AvatarDownloadJob(@NonNull GroupId groupId) {
public AvatarDownloadJob(@NonNull GroupId.V1 groupId) {
this(new Job.Parameters.Builder()
.addConstraint(NetworkConstraint.KEY)
.setMaxAttempts(10)
@ -47,7 +48,7 @@ public class AvatarDownloadJob extends BaseJob {
groupId);
}
private AvatarDownloadJob(@NonNull Job.Parameters parameters, @NonNull GroupId groupId) {
private AvatarDownloadJob(@NonNull Job.Parameters parameters, @NonNull GroupId.V1 groupId) {
super(parameters);
this.groupId = groupId;
}
@ -90,13 +91,14 @@ public class AvatarDownloadJob extends BaseJob {
SignalServiceMessageReceiver receiver = ApplicationDependencies.getSignalServiceMessageReceiver();
SignalServiceAttachmentPointer pointer = new SignalServiceAttachmentPointer(avatarId, contentType, key, Optional.of(0), Optional.absent(), 0, 0, digest, fileName, false, Optional.absent(), Optional.absent());
InputStream inputStream = receiver.retrieveAttachment(pointer, attachment, MAX_AVATAR_SIZE);
Bitmap avatar = BitmapUtil.createScaledBitmap(context, new AttachmentModel(attachment, key, 0, digest), 500, 500);
InputStream inputStream = receiver.retrieveAttachment(pointer, attachment, AvatarHelper.AVATAR_DOWNLOAD_FAILSAFE_MAX_SIZE);
AvatarHelper.setAvatar(context, record.get().getRecipientId(), inputStream);
DatabaseFactory.getGroupDatabase(context).onAvatarUpdated(groupId, true);
database.updateAvatar(groupId, avatar);
inputStream.close();
}
} catch (BitmapDecodingException | NonSuccessfulResponseCodeException | InvalidMessageException e) {
} catch (NonSuccessfulResponseCodeException | InvalidMessageException e) {
Log.w(TAG, e);
} finally {
if (attachment != null)
@ -116,7 +118,7 @@ public class AvatarDownloadJob extends BaseJob {
public static final class Factory implements Job.Factory<AvatarDownloadJob> {
@Override
public @NonNull AvatarDownloadJob create(@NonNull Parameters parameters, @NonNull Data data) {
return new AvatarDownloadJob(parameters, GroupId.parse(data.getString(KEY_GROUP_ID)));
return new AvatarDownloadJob(parameters, GroupId.parse(data.getString(KEY_GROUP_ID)).requireV1());
}
}
}

View File

@ -51,7 +51,7 @@ public class LeaveGroupJob extends BaseJob {
private static final String KEY_MEMBERS = "members";
private static final String KEY_RECIPIENTS = "recipients";
private final GroupId groupId;
private final GroupId.Push groupId;
private final String name;
private final List<RecipientId> members;
private final List<RecipientId> recipients;
@ -60,7 +60,7 @@ public class LeaveGroupJob extends BaseJob {
List<RecipientId> members = Stream.of(group.resolve().getParticipants()).map(Recipient::getId).toList();
members.remove(Recipient.self().getId());
return new LeaveGroupJob(group.getGroupId().get(),
return new LeaveGroupJob(group.getGroupId().get().requirePush(),
group.resolve().getDisplayName(ApplicationDependencies.getApplication()),
members,
members,
@ -72,7 +72,7 @@ public class LeaveGroupJob extends BaseJob {
.build());
}
private LeaveGroupJob(@NonNull GroupId groupId,
private LeaveGroupJob(@NonNull GroupId.Push groupId,
@NonNull String name,
@NonNull List<RecipientId> members,
@NonNull List<RecipientId> recipients,

View File

@ -232,7 +232,7 @@ public class MmsDownloadJob extends BaseJob {
if (members.size() > 2) {
List<RecipientId> recipients = new ArrayList<>(members);
group = Optional.of(DatabaseFactory.getGroupDatabase(context).getOrCreateGroupForMembers(recipients, true));
group = Optional.of(DatabaseFactory.getGroupDatabase(context).getOrCreateMmsGroupForMembers(recipients));
}
IncomingMediaMessage message = new IncomingMediaMessage(from, group, body, retrieved.getDate() * 1000L, attachments, subscriptionId, 0, false, false, false);

View File

@ -25,6 +25,7 @@ import com.klinker.android.send_message.Utils;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.attachments.DatabaseAttachment;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.database.MmsDatabase;
import org.thoughtcrime.securesms.database.NoSuchMessageException;
import org.thoughtcrime.securesms.database.ThreadDatabase;
@ -51,6 +52,7 @@ import org.thoughtcrime.securesms.util.Util;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.Arrays;
import java.util.List;
@ -231,7 +233,7 @@ public final class MmsSendJob extends SendJob {
}
if (message.getRecipient().isMmsGroup()) {
List<Recipient> members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(message.getRecipient().requireGroupId(), false);
List<Recipient> members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(message.getRecipient().requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
for (Recipient member : members) {
if (message.getDistributionType() == ThreadDatabase.DistributionTypes.BROADCAST) {
@ -271,7 +273,7 @@ public final class MmsSendJob extends SendJob {
PduPart part = new PduPart();
if (fileName == null) {
fileName = String.valueOf(Math.abs(Util.getSecureRandom().nextLong()));
fileName = String.valueOf(Math.abs(new SecureRandom().nextLong()));
String fileExtension = MimeTypeMap.getSingleton().getExtensionFromMimeType(attachment.getContentType());
if (fileExtension != null) fileName = fileName + "." + fileExtension;

View File

@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
@ -100,7 +101,7 @@ public class MultiDeviceGroupUpdateJob extends BaseJob {
out.write(new DeviceGroup(record.getId().getDecodedId(),
Optional.fromNullable(record.getTitle()),
members,
getAvatar(record.getAvatar()),
getAvatar(record.getRecipientId()),
record.isActive(),
expirationTimer,
Optional.of(recipient.getColor().serialize()),
@ -151,13 +152,13 @@ public class MultiDeviceGroupUpdateJob extends BaseJob {
}
private Optional<SignalServiceAttachmentStream> getAvatar(@Nullable byte[] avatar) {
if (avatar == null) return Optional.absent();
private Optional<SignalServiceAttachmentStream> getAvatar(@NonNull RecipientId recipientId) throws IOException {
if (!AvatarHelper.hasAvatar(context, recipientId)) return Optional.absent();
return Optional.of(SignalServiceAttachment.newStreamBuilder()
.withStream(new ByteArrayInputStream(avatar))
.withStream(AvatarHelper.getAvatar(context, recipientId))
.withContentType("image/*")
.withLength(avatar.length)
.withLength(AvatarHelper.getAvatarLength(context, recipientId))
.build());
}

View File

@ -29,13 +29,13 @@ import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.NoSuchMessageException;
import org.thoughtcrime.securesms.database.PushDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.transport.RetryLaterException;
import org.thoughtcrime.securesms.util.GroupUtil;
import org.thoughtcrime.securesms.util.TextSecurePreferences;
import org.whispersystems.libsignal.state.SignalProtocolStore;
import org.whispersystems.libsignal.util.guava.Optional;
@ -233,7 +233,7 @@ public final class PushDecryptMessageJob extends BaseJob {
return new PushProcessMessageJob.ExceptionMetadata(sender,
e.getSenderDevice(),
e.getGroup().transform(g -> GroupId.v1(g.getGroupId())).orNull());
e.getGroup().transform(GroupUtil::idFromGroupContext).orNull());
}
private static PushProcessMessageJob.ExceptionMetadata toExceptionMetadata(@NonNull ProtocolException e) throws NoSenderException {

View File

@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.ApplicationContext;
import org.thoughtcrime.securesms.attachments.Attachment;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.database.GroupReceiptDatabase.GroupReceiptInfo;
import org.thoughtcrime.securesms.database.MmsDatabase;
import org.thoughtcrime.securesms.database.NoSuchMessageException;
@ -299,7 +300,7 @@ public class PushGroupSendJob extends PushSendJob {
List<GroupReceiptInfo> destinations = DatabaseFactory.getGroupReceiptDatabase(context).getGroupReceiptInfo(messageId);
if (!destinations.isEmpty()) return Stream.of(destinations).map(GroupReceiptInfo::getRecipientId).toList();
List<Recipient> members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupId, false);
List<Recipient> members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupId, GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
return Stream.of(members).map(Recipient::getId).toList();
}

View File

@ -13,6 +13,7 @@ import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.recipients.RecipientUtil;
@ -80,16 +81,16 @@ public class PushGroupUpdateJob extends BaseJob {
Optional<GroupRecord> record = groupDatabase.getGroup(groupId);
SignalServiceAttachment avatar = null;
if (record == null) {
if (record == null || !record.isPresent()) {
Log.w(TAG, "No information for group record info request: " + groupId.toString());
return;
}
if (record.get().getAvatar() != null) {
if (AvatarHelper.hasAvatar(context, record.get().getRecipientId())) {
avatar = SignalServiceAttachmentStream.newStreamBuilder()
.withContentType("image/jpeg")
.withStream(new ByteArrayInputStream(record.get().getAvatar()))
.withLength(record.get().getAvatar().length)
.withStream(AvatarHelper.getAvatar(context, record.get().getRecipientId()))
.withLength(AvatarHelper.getAvatarLength(context, record.get().getRecipientId()))
.build();
}

View File

@ -44,7 +44,7 @@ import org.thoughtcrime.securesms.database.model.ReactionRecord;
import org.thoughtcrime.securesms.database.model.StickerRecord;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.groups.GroupMessageProcessor;
import org.thoughtcrime.securesms.groups.GroupV1MessageProcessor;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
import org.thoughtcrime.securesms.jobmanager.JobManager;
@ -75,6 +75,7 @@ import org.thoughtcrime.securesms.sms.OutgoingTextMessage;
import org.thoughtcrime.securesms.stickers.StickerLocator;
import org.thoughtcrime.securesms.storage.StorageSyncHelper;
import org.thoughtcrime.securesms.util.Base64;
import org.thoughtcrime.securesms.util.GroupUtil;
import org.thoughtcrime.securesms.util.Hex;
import org.thoughtcrime.securesms.util.IdentityUtil;
import org.thoughtcrime.securesms.util.MediaUtil;
@ -86,6 +87,7 @@ import org.whispersystems.signalservice.api.messages.SignalServiceContent;
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage;
import org.whispersystems.signalservice.api.messages.SignalServiceDataMessage.Preview;
import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
import org.whispersystems.signalservice.api.messages.SignalServiceReceiptMessage;
import org.whispersystems.signalservice.api.messages.SignalServiceTypingMessage;
import org.whispersystems.signalservice.api.messages.calls.AnswerMessage;
@ -263,17 +265,24 @@ public final class PushProcessMessageJob extends BaseJob {
if (content.getDataMessage().isPresent()) {
SignalServiceDataMessage message = content.getDataMessage().get();
boolean isMediaMessage = message.getAttachments().isPresent() || message.getQuote().isPresent() || message.getSharedContacts().isPresent() || message.getPreviews().isPresent() || message.getSticker().isPresent();
Optional<GroupId> groupId = GroupUtil.idFromGroupContext(message.getGroupContext());
boolean isGv2Message = groupId.isPresent() && groupId.get().isV2();
if (isInvalidMessage(message)) handleInvalidMessage(content.getSender(), content.getSenderDevice(), toEncodedId(message.getGroupInfo()), content.getTimestamp(), smsMessageId);
if (isGv2Message) {
Log.w(TAG, "Ignoring GV2 message.");
return;
}
if (isInvalidMessage(message)) handleInvalidMessage(content.getSender(), content.getSenderDevice(), groupId, content.getTimestamp(), smsMessageId);
else if (message.isEndSession()) handleEndSessionMessage(content, smsMessageId);
else if (message.isGroupUpdate()) handleGroupMessage(content, message, smsMessageId);
else if (message.isGroupV1Update()) handleGroupV1Message(content, message, smsMessageId);
else if (message.isExpirationUpdate()) handleExpirationUpdate(content, message, smsMessageId);
else if (message.getReaction().isPresent()) handleReaction(content, message);
else if (isMediaMessage) handleMediaMessage(content, message, smsMessageId);
else if (message.getBody().isPresent()) handleTextMessage(content, message, smsMessageId);
else if (message.getBody().isPresent()) handleTextMessage(content, message, smsMessageId, groupId);
if (message.getGroupInfo().isPresent() && groupDatabase.isUnknownGroup(GroupId.v1(message.getGroupInfo().get().getGroupId()))) {
handleUnknownGroupMessage(content, message.getGroupInfo().get());
if (groupId.isPresent() && groupDatabase.isUnknownGroup(groupId.get())) {
handleUnknownGroupMessage(content, message.getGroupContext().get());
}
if (message.getProfileKey().isPresent()) {
@ -327,10 +336,6 @@ public final class PushProcessMessageJob extends BaseJob {
}
}
private static @NonNull Optional<GroupId> toEncodedId(@NonNull Optional<SignalServiceGroup> groupInfo) {
return groupInfo.transform(g -> GroupId.v1(g.getGroupId()));
}
private void handleExceptionMessage(@NonNull ExceptionMetadata e, @NonNull Optional<Long> smsMessageId) {
switch (messageState) {
@ -415,7 +420,7 @@ public final class PushProcessMessageJob extends BaseJob {
{
Log.i(TAG, "handleCallIceUpdateMessage... " + messages.size());
ArrayList<IceCandidateParcel> iceCandidates = new ArrayList(messages.size());
ArrayList<IceCandidateParcel> iceCandidates = new ArrayList<>(messages.size());
long callId = -1;
for (IceUpdateMessage iceMessage : messages) {
iceCandidates.add(new IceCandidateParcel(iceMessage));
@ -526,12 +531,12 @@ public final class PushProcessMessageJob extends BaseJob {
return threadId;
}
private void handleGroupMessage(@NonNull SignalServiceContent content,
@NonNull SignalServiceDataMessage message,
@NonNull Optional<Long> smsMessageId)
private void handleGroupV1Message(@NonNull SignalServiceContent content,
@NonNull SignalServiceDataMessage message,
@NonNull Optional<Long> smsMessageId)
throws StorageFailedException
{
GroupMessageProcessor.process(context, content, message, false);
GroupV1MessageProcessor.process(context, content, message, false);
if (message.getExpiresInSeconds() != 0 && message.getExpiresInSeconds() != getMessageDestination(content, message).getExpireMessages()) {
handleExpirationUpdate(content, message, Optional.absent());
@ -543,12 +548,17 @@ public final class PushProcessMessageJob extends BaseJob {
}
private void handleUnknownGroupMessage(@NonNull SignalServiceContent content,
@NonNull SignalServiceGroup group)
@NonNull SignalServiceGroupContext group)
{
if (group.getType() != SignalServiceGroup.Type.REQUEST_INFO) {
ApplicationDependencies.getJobManager().add(new RequestGroupInfoJob(Recipient.externalPush(context, content.getSender()).getId(), GroupId.v1(group.getGroupId())));
if (group.getGroupV1().isPresent()) {
SignalServiceGroup groupV1 = group.getGroupV1().get();
if (groupV1.getType() != SignalServiceGroup.Type.REQUEST_INFO) {
ApplicationDependencies.getJobManager().add(new RequestGroupInfoJob(Recipient.externalPush(context, content.getSender()).getId(), GroupId.v1(groupV1.getGroupId())));
} else {
Log.w(TAG, "Received a REQUEST_INFO message for a group we don't know about. Ignoring.");
}
} else {
Log.w(TAG, "Received a REQUEST_INFO message for a group we don't know about. Ignoring.");
Log.w(TAG, "Received a message for a group we don't know about without a GV1 context. Ignoring.");
}
}
@ -567,7 +577,7 @@ public final class PushProcessMessageJob extends BaseJob {
false,
content.isNeedsReceipt(),
Optional.absent(),
message.getGroupInfo(),
message.getGroupContext(),
Optional.absent(),
Optional.absent(),
Optional.absent(),
@ -729,8 +739,8 @@ public final class PushProcessMessageJob extends BaseJob {
handleGroupRecipientUpdate(message);
} else if (message.getMessage().isEndSession()) {
threadId = handleSynchronizeSentEndSessionMessage(message);
} else if (message.getMessage().isGroupUpdate()) {
threadId = GroupMessageProcessor.process(context, content, message.getMessage(), true);
} else if (message.getMessage().isGroupV1Update()) {
threadId = GroupV1MessageProcessor.process(context, content, message.getMessage(), true);
} else if (message.getMessage().isExpirationUpdate()) {
threadId = handleSynchronizeSentExpirationUpdate(message);
} else if (message.getMessage().getReaction().isPresent()) {
@ -743,8 +753,8 @@ public final class PushProcessMessageJob extends BaseJob {
threadId = handleSynchronizeSentTextMessage(message);
}
if (message.getMessage().getGroupInfo().isPresent() && groupDatabase.isUnknownGroup(GroupId.v1(message.getMessage().getGroupInfo().get().getGroupId()))) {
handleUnknownGroupMessage(content, message.getMessage().getGroupInfo().get());
if (message.getMessage().getGroupContext().isPresent() && groupDatabase.isUnknownGroup(GroupUtil.idFromGroupContext(message.getMessage().getGroupContext().get()))) {
handleUnknownGroupMessage(content, message.getMessage().getGroupContext().get());
}
if (message.getMessage().getProfileKey().isPresent()) {
@ -854,7 +864,7 @@ public final class PushProcessMessageJob extends BaseJob {
message.isViewOnce(),
content.isNeedsReceipt(),
message.getBody(),
message.getGroupInfo(),
message.getGroupContext(),
message.getAttachments(),
quote,
sharedContacts,
@ -1020,7 +1030,7 @@ public final class PushProcessMessageJob extends BaseJob {
private void updateGroupReceiptStatus(@NonNull SentTranscriptMessage message, long messageId, @NonNull GroupId groupString) {
GroupReceiptDatabase receiptDatabase = DatabaseFactory.getGroupReceiptDatabase(context);
List<Recipient> messageRecipients = Stream.of(message.getRecipients()).map(address -> Recipient.externalPush(context, address)).toList();
List<Recipient> members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupString, false);
List<Recipient> members = DatabaseFactory.getGroupDatabase(context).getGroupMembers(groupString, GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
Map<RecipientId, Integer> localReceipts = Stream.of(receiptDatabase.getGroupReceiptInfo(messageId))
.collect(Collectors.toMap(GroupReceiptInfo::getRecipientId, GroupReceiptInfo::getStatus));
@ -1040,7 +1050,8 @@ public final class PushProcessMessageJob extends BaseJob {
private void handleTextMessage(@NonNull SignalServiceContent content,
@NonNull SignalServiceDataMessage message,
@NonNull Optional<Long> smsMessageId)
@NonNull Optional<Long> smsMessageId,
@NonNull Optional<GroupId> groupId)
throws StorageFailedException
{
SmsDatabase database = DatabaseFactory.getSmsDatabase(context);
@ -1053,7 +1064,7 @@ public final class PushProcessMessageJob extends BaseJob {
Long threadId;
if (smsMessageId.isPresent() && !message.getGroupInfo().isPresent()) {
if (smsMessageId.isPresent() && !message.getGroupContext().isPresent()) {
threadId = database.updateBundleMessageBody(smsMessageId.get(), body).second;
} else {
notifyTypingStoppedFromIncomingMessage(recipient, content.getSender(), content.getSenderDevice());
@ -1061,7 +1072,7 @@ public final class PushProcessMessageJob extends BaseJob {
IncomingTextMessage textMessage = new IncomingTextMessage(Recipient.externalPush(context, content.getSender()).getId(),
content.getSenderDevice(),
message.getTimestamp(), body,
toEncodedId(message.getGroupInfo()),
groupId,
message.getExpiresInSeconds() * 1000L,
content.isNeedsReceipt());
@ -1488,20 +1499,20 @@ public final class PushProcessMessageJob extends BaseJob {
return database.insertMessageInbox(textMessage);
}
private Recipient getSyncMessageDestination(SentTranscriptMessage message) {
if (message.getMessage().getGroupInfo().isPresent()) {
return Recipient.externalGroup(context, GroupId.v1(message.getMessage().getGroupInfo().get().getGroupId()));
} else {
return Recipient.externalPush(context, message.getDestination().get());
}
private Recipient getSyncMessageDestination(@NonNull SentTranscriptMessage message) {
return getGroupRecipient(message.getMessage().getGroupContext())
.or(() -> Recipient.externalPush(context, message.getDestination().get()));
}
private Recipient getMessageDestination(SignalServiceContent content, SignalServiceDataMessage message) {
if (message.getGroupInfo().isPresent()) {
return Recipient.externalGroup(context, GroupId.v1(message.getGroupInfo().get().getGroupId()));
} else {
return Recipient.externalPush(context, content.getSender());
}
private Recipient getMessageDestination(@NonNull SignalServiceContent content,
@NonNull SignalServiceDataMessage message)
{
return getGroupRecipient(message.getGroupContext())
.or(() -> Recipient.externalPush(context, content.getSender()));
}
private Optional<Recipient> getGroupRecipient(Optional<SignalServiceGroupContext> message) {
return message.transform(groupContext -> Recipient.externalGroup(context, GroupUtil.idFromGroupContext(groupContext)));
}
private void notifyTypingStoppedFromIncomingMessage(@NonNull Recipient conversationRecipient, @NonNull SignalServiceAddress sender, int device) {
@ -1530,8 +1541,7 @@ public final class PushProcessMessageJob extends BaseJob {
return true;
} else if (conversation.isGroup()) {
GroupDatabase groupDatabase = DatabaseFactory.getGroupDatabase(context);
Optional<GroupId> groupId = message.getGroupInfo().isPresent() ? Optional.of(GroupId.v1(message.getGroupInfo().get().getGroupId()))
: Optional.absent();
Optional<GroupId> groupId = message.getGroupContext().transform(GroupUtil::idFromGroupContext);
if (groupId.isPresent() && groupDatabase.isUnknownGroup(groupId.get())) {
return false;
@ -1540,9 +1550,9 @@ public final class PushProcessMessageJob extends BaseJob {
boolean isTextMessage = message.getBody().isPresent();
boolean isMediaMessage = message.getAttachments().isPresent() || message.getQuote().isPresent() || message.getSharedContacts().isPresent();
boolean isExpireMessage = message.isExpirationUpdate();
boolean isContentMessage = !message.isGroupUpdate() && !isExpireMessage && (isTextMessage || isMediaMessage);
boolean isContentMessage = !message.isGroupV1Update() && !isExpireMessage && (isTextMessage || isMediaMessage);
boolean isGroupActive = groupId.isPresent() && groupDatabase.isActive(groupId.get());
boolean isLeaveMessage = message.getGroupInfo().isPresent() && message.getGroupInfo().get().getType() == SignalServiceGroup.Type.QUIT;
boolean isLeaveMessage = message.getGroupContext().isPresent() && message.getGroupContext().get().getGroupV1Type() == SignalServiceGroup.Type.QUIT;
return (isContentMessage && !isGroupActive) || (sender.isBlocked() && !isLeaveMessage);
} else {

View File

@ -1,5 +1,7 @@
package org.thoughtcrime.securesms.jobs;
import android.text.TextUtils;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
@ -64,6 +66,11 @@ public class RefreshOwnProfileJob extends BaseJob {
@Override
protected void onRun() throws Exception {
if (!TextSecurePreferences.isPushRegistered(context) || TextUtils.isEmpty(TextSecurePreferences.getLocalNumber(context))) {
Log.w(TAG, "Not yet registered!");
return;
}
Recipient self = Recipient.self();
ProfileAndCredential profileAndCredential = ProfileUtil.retrieveProfile(context, self, getRequestType(self));
SignalServiceProfile profile = profileAndCredential.getProfile();

View File

@ -97,17 +97,10 @@ public class RetrieveProfileAvatarJob extends BaseJob {
File downloadDestination = File.createTempFile("avatar", "jpg", context.getCacheDir());
try {
SignalServiceMessageReceiver receiver = ApplicationDependencies.getSignalServiceMessageReceiver();
InputStream avatarStream = receiver.retrieveProfileAvatar(profileAvatar, downloadDestination, profileKey, MAX_PROFILE_SIZE_BYTES);
File decryptDestination = File.createTempFile("avatar", "jpg", context.getCacheDir());
SignalServiceMessageReceiver receiver = ApplicationDependencies.getSignalServiceMessageReceiver();
InputStream avatarStream = receiver.retrieveProfileAvatar(profileAvatar, downloadDestination, profileKey, AvatarHelper.AVATAR_DOWNLOAD_FAILSAFE_MAX_SIZE);
try {
Util.copy(avatarStream, new FileOutputStream(decryptDestination));
} catch (AssertionError e) {
throw new IOException("Failed to copy stream. Likely a Conscrypt issue.", e);
}
decryptDestination.renameTo(AvatarHelper.getAvatarFile(context, recipient.getId()));
AvatarHelper.setAvatar(context, recipient.getId(), avatarStream);
} catch (PushNetworkException e) {
if (e.getCause() instanceof NonSuccessfulResponseCodeException) {
Log.w(TAG, "Removing profile avatar (no image available) for: " + recipient.getId().serialize());

View File

@ -10,6 +10,7 @@ import org.signal.zkgroup.profiles.ProfileKey;
import org.signal.zkgroup.profiles.ProfileKeyCredential;
import org.thoughtcrime.securesms.crypto.ProfileKeyUtil;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.database.RecipientDatabase;
import org.thoughtcrime.securesms.database.RecipientDatabase.UnidentifiedAccessMode;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
@ -137,7 +138,7 @@ public class RetrieveProfileJob extends BaseJob {
}
private void handleGroupRecipient(Recipient group) throws IOException {
List<Recipient> recipients = DatabaseFactory.getGroupDatabase(context).getGroupMembers(group.requireGroupId(), false);
List<Recipient> recipients = DatabaseFactory.getGroupDatabase(context).getGroupMembers(group.requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
for (Recipient recipient : recipients) {
handleIndividualRecipient(recipient);

View File

@ -6,6 +6,7 @@ import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.crypto.UnidentifiedAccessUtil;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.database.GroupDatabase;
import org.thoughtcrime.securesms.dependencies.ApplicationDependencies;
import org.thoughtcrime.securesms.jobmanager.Data;
import org.thoughtcrime.securesms.jobmanager.Job;
@ -85,7 +86,7 @@ public class TypingSendJob extends BaseJob {
Optional<byte[]> groupId = Optional.absent();
if (recipient.isGroup()) {
recipients = DatabaseFactory.getGroupDatabase(context).getGroupMembers(recipient.requireGroupId(), false);
recipients = DatabaseFactory.getGroupDatabase(context).getGroupMembers(recipient.requireGroupId(), GroupDatabase.MemberSet.FULL_MEMBERS_EXCLUDING_SELF);
groupId = Optional.of(recipient.requireGroupId().getDecodedId());
}

View File

@ -17,6 +17,7 @@ import androidx.lifecycle.ViewModelProviders;
import org.thoughtcrime.securesms.R;
import org.thoughtcrime.securesms.TransportOptions;
import org.thoughtcrime.securesms.imageeditor.model.EditorModel;
import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.scribbles.ImageEditorFragment;
import org.thoughtcrime.securesms.util.MediaUtil;
@ -27,7 +28,7 @@ import java.util.Collections;
public class AvatarSelectionActivity extends AppCompatActivity implements CameraFragment.Controller, ImageEditorFragment.Controller, MediaPickerFolderFragment.Controller, MediaPickerItemFragment.Controller {
private static final Point AVATAR_DIMENSIONS = new Point(1024, 1024);
private static final Point AVATAR_DIMENSIONS = new Point(AvatarHelper.AVATAR_DIMENSIONS, AvatarHelper.AVATAR_DIMENSIONS);
private static final String IMAGE_CAPTURE = "IMAGE_CAPTURE";
private static final String IMAGE_EDITOR = "IMAGE_EDITOR";

View File

@ -168,6 +168,7 @@ class Camera1Controller {
while (i < sizes.size() && (sizes.get(i).width * sizes.get(i).height) < (width * height)) {
i++;
}
i++;
return sizes.get(Math.min(i, sizes.size() - 1));
}

View File

@ -3,7 +3,6 @@ package org.thoughtcrime.securesms.mediasend;
import android.annotation.SuppressLint;
import androidx.annotation.NonNull;
import androidx.camera.core.CameraX;
import androidx.fragment.app.Fragment;
import org.thoughtcrime.securesms.mediasend.camerax.CameraXUtil;
@ -14,7 +13,7 @@ public interface CameraFragment {
@SuppressLint("RestrictedApi")
static Fragment newInstance() {
if (CameraXUtil.isSupported() && CameraX.isInitialized()) {
if (CameraXUtil.isSupported()) {
return CameraXFragment.newInstance();
} else {
return Camera1Fragment.newInstance();
@ -23,7 +22,7 @@ public interface CameraFragment {
@SuppressLint("RestrictedApi")
static Fragment newInstanceForAvatarCapture() {
if (CameraXUtil.isSupported() && CameraX.isInitialized()) {
if (CameraXUtil.isSupported()) {
return CameraXFragment.newInstanceForAvatarCapture();
} else {
return Camera1Fragment.newInstance();

View File

@ -11,6 +11,7 @@ import org.thoughtcrime.securesms.profiles.AvatarHelper;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.util.Util;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
@ -64,7 +65,7 @@ public class AvatarMigrationJob extends MigrationJob {
Recipient recipient = Recipient.external(context, file.getName());
byte[] data = Util.readFully(new FileInputStream(file));
AvatarHelper.setAvatar(context, recipient.getId(), data);
AvatarHelper.setAvatar(context, recipient.getId(), new ByteArrayInputStream(data));
} else {
Log.w(TAG, "Invalid file name! Can't migrate this file. It'll just get deleted.");
}

View File

@ -8,9 +8,10 @@ import org.thoughtcrime.securesms.contactshare.Contact;
import org.thoughtcrime.securesms.groups.GroupId;
import org.thoughtcrime.securesms.linkpreview.LinkPreview;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.GroupUtil;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.messages.SignalServiceAttachment;
import org.whispersystems.signalservice.api.messages.SignalServiceGroup;
import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
import java.util.Collections;
import java.util.LinkedList;
@ -68,7 +69,7 @@ public class IncomingMediaMessage {
boolean viewOnce,
boolean unidentified,
Optional<String> body,
Optional<SignalServiceGroup> group,
Optional<SignalServiceGroupContext> group,
Optional<List<SignalServiceAttachment>> attachments,
Optional<QuoteModel> quote,
Optional<List<Contact>> sharedContacts,
@ -86,7 +87,7 @@ public class IncomingMediaMessage {
this.quote = quote.orNull();
this.unidentified = unidentified;
if (group.isPresent()) this.groupId = GroupId.v1(group.get().getGroupId());
if (group.isPresent()) this.groupId = GroupUtil.idFromGroupContext(group.get());
else this.groupId = null;
this.attachments.addAll(PointerAttachment.forPointers(attachments));

View File

@ -537,7 +537,7 @@ public class MessageNotifier {
}
if (threadRecipients == null || !threadRecipients.isMuted()) {
notificationState.addNotification(new NotificationItem(id, mms, recipient, conversationRecipient, threadRecipients, threadId, body, timestamp, slideDeck));
notificationState.addNotification(new NotificationItem(id, mms, recipient, conversationRecipient, threadRecipients, threadId, body, timestamp, timestamp, slideDeck, false));
}
}
@ -571,7 +571,7 @@ public class MessageNotifier {
}
if (threadRecipients == null || !threadRecipients.isMuted()) {
notificationState.addNotification(new NotificationItem(id, mms, reactionSender, conversationRecipient, threadRecipients, threadId, body, reaction.getDateReceived(), null));
notificationState.addNotification(new NotificationItem(id, mms, reactionSender, conversationRecipient, threadRecipients, threadId, body, reaction.getDateReceived(), timestamp, null, true));
}
}
}

View File

@ -3,43 +3,53 @@ package org.thoughtcrime.securesms.notifications;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.core.app.TaskStackBuilder;
import org.thoughtcrime.securesms.conversation.ConversationActivity;
import org.thoughtcrime.securesms.database.DatabaseFactory;
import org.thoughtcrime.securesms.mms.SlideDeck;
import org.thoughtcrime.securesms.recipients.Recipient;
public class NotificationItem {
private final long id;
private final boolean mms;
private final @NonNull Recipient conversationRecipient;
private final @NonNull Recipient individualRecipient;
private final @Nullable Recipient threadRecipient;
private final long threadId;
private final @Nullable CharSequence text;
private final long timestamp;
private final @Nullable SlideDeck slideDeck;
private final long id;
private final boolean mms;
@NonNull private final Recipient conversationRecipient;
@NonNull private final Recipient individualRecipient;
@Nullable private final Recipient threadRecipient;
private final long threadId;
@Nullable private final CharSequence text;
private final long notificationTimestamp;
private final long messageReceivedTimestamp;
@Nullable private final SlideDeck slideDeck;
private final boolean jumpToMessage;
public NotificationItem(long id, boolean mms,
@NonNull Recipient individualRecipient,
@NonNull Recipient conversationRecipient,
@Nullable Recipient threadRecipient,
long threadId, @Nullable CharSequence text, long timestamp,
@Nullable SlideDeck slideDeck)
public NotificationItem(long id,
boolean mms,
@NonNull Recipient individualRecipient,
@NonNull Recipient conversationRecipient,
@Nullable Recipient threadRecipient,
long threadId,
@Nullable CharSequence text,
long notificationTimestamp,
long messageReceivedTimestamp,
@Nullable SlideDeck slideDeck,
boolean jumpToMessage)
{
this.id = id;
this.mms = mms;
this.individualRecipient = individualRecipient;
this.conversationRecipient = conversationRecipient;
this.threadRecipient = threadRecipient;
this.text = text;
this.threadId = threadId;
this.timestamp = timestamp;
this.slideDeck = slideDeck;
this.id = id;
this.mms = mms;
this.individualRecipient = individualRecipient;
this.conversationRecipient = conversationRecipient;
this.threadRecipient = threadRecipient;
this.text = text;
this.threadId = threadId;
this.notificationTimestamp = notificationTimestamp;
this.messageReceivedTimestamp = messageReceivedTimestamp;
this.slideDeck = slideDeck;
this.jumpToMessage = jumpToMessage;
}
public @NonNull Recipient getRecipient() {
@ -55,7 +65,7 @@ public class NotificationItem {
}
public long getTimestamp() {
return timestamp;
return notificationTimestamp;
}
public long getThreadId() {
@ -67,12 +77,9 @@ public class NotificationItem {
}
public PendingIntent getPendingIntent(Context context) {
Intent intent = new Intent(context, ConversationActivity.class);
Recipient notifyRecipients = threadRecipient != null ? threadRecipient : conversationRecipient;
intent.putExtra(ConversationActivity.RECIPIENT_EXTRA, notifyRecipients.getId());
intent.putExtra("thread_id", threadId);
intent.setData((Uri.parse("custom://"+System.currentTimeMillis())));
Recipient recipient = threadRecipient != null ? threadRecipient : conversationRecipient;
int startingPosition = jumpToMessage ? getStartingPosition(context, threadId, messageReceivedTimestamp) : -1;
Intent intent = ConversationActivity.buildIntent(context, recipient.getId(), threadId, 0, -1, startingPosition);
return TaskStackBuilder.create(context)
.addNextIntentWithParentStack(intent)
@ -86,4 +93,8 @@ public class NotificationItem {
public boolean isMms() {
return mms;
}
private static int getStartingPosition(@NonNull Context context, long threadId, long receivedTimestampMs) {
return DatabaseFactory.getMmsSmsDatabase(context).getMessagePositionInConversation(threadId, receivedTimestampMs);
}
}

View File

@ -6,81 +6,191 @@ import android.content.Context;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import org.thoughtcrime.securesms.crypto.AttachmentSecret;
import org.thoughtcrime.securesms.crypto.AttachmentSecretProvider;
import org.thoughtcrime.securesms.crypto.ModernDecryptingPartInputStream;
import org.thoughtcrime.securesms.crypto.ModernEncryptingPartOutputStream;
import org.thoughtcrime.securesms.logging.Log;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientId;
import org.thoughtcrime.securesms.util.ByteUnit;
import org.thoughtcrime.securesms.util.MediaUtil;
import org.thoughtcrime.securesms.util.Util;
import org.whispersystems.signalservice.api.util.StreamDetails;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.LinkedList;
import java.util.List;
import java.io.OutputStream;
import java.util.Collections;
import java.util.Iterator;
public class AvatarHelper {
private static final String TAG = Log.tag(AvatarHelper.class);
public static int AVATAR_DIMENSIONS = 1024;
public static long AVATAR_DOWNLOAD_FAILSAFE_MAX_SIZE = ByteUnit.MEGABYTES.toBytes(10);
private static final String AVATAR_DIRECTORY = "avatars";
public static InputStream getInputStreamFor(@NonNull Context context, @NonNull RecipientId recipientId)
throws IOException
{
return new FileInputStream(getAvatarFile(context, recipientId));
}
public static List<File> getAvatarFiles(@NonNull Context context) {
File avatarDirectory = new File(context.getFilesDir(), AVATAR_DIRECTORY);
/**
* Retrieves an iterable set of avatars. Only intended to be used during backup.
*/
public static Iterable<Avatar> getAvatars(@NonNull Context context) {
File avatarDirectory = context.getDir(AVATAR_DIRECTORY, Context.MODE_PRIVATE);
File[] results = avatarDirectory.listFiles();
if (results == null) return new LinkedList<>();
else return Stream.of(results).toList();
if (results == null) {
return Collections.emptyList();
}
return () -> {
return new Iterator<Avatar>() {
int i = 0;
@Override
public boolean hasNext() {
return i < results.length;
}
@Override
public Avatar next() {
File file = results[i];
try {
return new Avatar(getAvatar(context, RecipientId.from(file.getName())),
file.getName(),
ModernEncryptingPartOutputStream.getPlaintextLength(file.length()));
} catch (IOException e) {
return null;
} finally {
i++;
}
}
};
};
}
/**
* Deletes and avatar.
*/
public static void delete(@NonNull Context context, @NonNull RecipientId recipientId) {
getAvatarFile(context, recipientId).delete();
}
public static @NonNull File getAvatarFile(@NonNull Context context, @NonNull RecipientId recipientId) {
File avatarDirectory = new File(context.getFilesDir(), AVATAR_DIRECTORY);
avatarDirectory.mkdirs();
return new File(avatarDirectory, new File(recipientId.serialize()).getName());
/**
* Whether or not an avatar is present for the given recipient.
*/
public static boolean hasAvatar(@NonNull Context context, @NonNull RecipientId recipientId) {
return getAvatarFile(context, recipientId).exists();
}
public static void setAvatar(@NonNull Context context, @NonNull RecipientId recipientId, @Nullable byte[] data)
throws IOException
/**
* Retrieves a stream for an avatar. If there is no avatar, the stream will likely throw an
* IOException. It is recommended to call {@link #hasAvatar(Context, RecipientId)} first.
*/
public static @NonNull InputStream getAvatar(@NonNull Context context, @NonNull RecipientId recipientId) throws IOException {
AttachmentSecret attachmentSecret = AttachmentSecretProvider.getInstance(context).getOrCreateAttachmentSecret();
File avatarFile = getAvatarFile(context, recipientId);
return ModernDecryptingPartInputStream.createFor(attachmentSecret, avatarFile, 0);
}
/**
* Returns the size of the avatar on disk.
*/
public static long getAvatarLength(@NonNull Context context, @NonNull RecipientId recipientId) {
return ModernEncryptingPartOutputStream.getPlaintextLength(getAvatarFile(context, recipientId).length());
}
/**
* Saves the contents of the input stream as the avatar for the specified recipient. If you pass
* in null for the stream, the avatar will be deleted.
*/
public static void setAvatar(@NonNull Context context, @NonNull RecipientId recipientId, @Nullable InputStream inputStream)
throws IOException
{
if (data == null) {
if (inputStream == null) {
delete(context, recipientId);
} else {
FileOutputStream out = new FileOutputStream(getAvatarFile(context, recipientId));
out.write(data);
out.close();
return;
}
OutputStream outputStream = null;
try {
outputStream = getOutputStream(context, recipientId);
Util.copy(inputStream, outputStream);
} finally {
Util.close(outputStream);
}
}
public static @NonNull StreamDetails avatarStream(@NonNull byte[] data) {
return new StreamDetails(new ByteArrayInputStream(data), MediaUtil.IMAGE_JPEG, data.length);
/**
* Retrieves an output stream you can write to that will be saved as the avatar for the specified
* recipient. Only intended to be used for backup. Otherwise, use {@link #setAvatar(Context, RecipientId, InputStream)}.
*/
public static @NonNull OutputStream getOutputStream(@NonNull Context context, @NonNull RecipientId recipientId) throws IOException {
AttachmentSecret attachmentSecret = AttachmentSecretProvider.getInstance(context).getOrCreateAttachmentSecret();
File targetFile = getAvatarFile(context, recipientId);
return ModernEncryptingPartOutputStream.createFor(attachmentSecret, targetFile, true).second;
}
public static @Nullable StreamDetails getSelfProfileAvatarStream(@NonNull Context context) {
File avatarFile = getAvatarFile(context, Recipient.self().getId());
/**
* Returns the timestamp of when the avatar was last modified, or zero if the avatar doesn't exist.
*/
public static long getLastModified(@NonNull Context context, @NonNull RecipientId recipientId) {
File file = getAvatarFile(context, recipientId);
if (avatarFile.exists() && avatarFile.length() > 0) {
try {
FileInputStream stream = new FileInputStream(avatarFile);
return new StreamDetails(stream, MediaUtil.IMAGE_JPEG, avatarFile.length());
} catch (FileNotFoundException e) {
throw new AssertionError(e);
}
if (file.exists()) {
return file.lastModified();
} else {
return 0;
}
}
/**
* Returns a {@link StreamDetails} for the local user's own avatar, or null if one does not exist.
*/
public static @Nullable StreamDetails getSelfProfileAvatarStream(@NonNull Context context) {
RecipientId selfId = Recipient.self().getId();
if (!hasAvatar(context, selfId)) {
return null;
}
try {
InputStream stream = getAvatar(context, selfId);
return new StreamDetails(stream, MediaUtil.IMAGE_JPEG, getAvatarLength(context, selfId));
} catch (IOException e) {
Log.w(TAG, "Failed to read own avatar!", e);
return null;
}
}
private static @NonNull File getAvatarFile(@NonNull Context context, @NonNull RecipientId recipientId) {
File directory = context.getDir(AVATAR_DIRECTORY, Context.MODE_PRIVATE);
return new File(directory, recipientId.serialize());
}
public static class Avatar {
private final InputStream inputStream;
private final String filename;
private final long length;
public Avatar(@NonNull InputStream inputStream, @NonNull String filename, long length) {
this.inputStream = inputStream;
this.filename = filename;
this.length = length;
}
public @NonNull InputStream getInputStream() {
return inputStream;
}
public @NonNull String getFilename() {
return filename;
}
public long getLength() {
return length;
}
}
}

View File

@ -30,6 +30,7 @@ import org.thoughtcrime.securesms.util.concurrent.SimpleTask;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.profiles.SignalServiceProfile;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.security.SecureRandom;
import java.util.Arrays;
@ -76,10 +77,10 @@ class EditProfileRepository {
void getCurrentAvatar(@NonNull Consumer<byte[]> avatarConsumer) {
RecipientId selfId = Recipient.self().getId();
if (AvatarHelper.getAvatarFile(context, selfId).exists() && AvatarHelper.getAvatarFile(context, selfId).length() > 0) {
if (AvatarHelper.hasAvatar(context, selfId)) {
SimpleTask.run(() -> {
try {
return Util.readFully(AvatarHelper.getInputStreamFor(context, selfId));
return Util.readFully(AvatarHelper.getAvatar(context, selfId));
} catch (IOException e) {
Log.w(TAG, e);
return null;
@ -106,7 +107,7 @@ class EditProfileRepository {
DatabaseFactory.getRecipientDatabase(context).setProfileName(Recipient.self().getId(), profileName);
try {
AvatarHelper.setAvatar(context, Recipient.self().getId(), avatar);
AvatarHelper.setAvatar(context, Recipient.self().getId(), avatar != null ? new ByteArrayInputStream(avatar) : null);
} catch (IOException e) {
return UploadResult.ERROR_FILE_IO;
}

View File

@ -197,11 +197,11 @@ public final class LiveRecipient {
List<Recipient> members = Stream.of(groupRecord.get().getMembers()).filterNot(RecipientId::isUnknown).map(this::fetchRecipientFromDisk).toList();
Optional<Long> avatarId = Optional.absent();
if (settings.getGroupId() != null && !settings.getGroupId().isMmsGroup() && title == null) {
if (settings.getGroupId() != null && settings.getGroupId().isPush() && title == null) {
title = unnamedGroupName;
}
if (groupRecord.get().getAvatar() != null && groupRecord.get().getAvatar().length > 0) {
if (groupRecord.get().hasAvatar()) {
avatarId = Optional.of(groupRecord.get().getAvatarId());
}

View File

@ -381,7 +381,7 @@ public class Recipient {
}
public @Nullable String getName(@NonNull Context context) {
if (this.name == null && groupId != null && groupId.isMmsGroup()) {
if (this.name == null && groupId != null && groupId.isMms()) {
List<String> names = new LinkedList<>();
for (Recipient recipient : participants) {
@ -567,12 +567,12 @@ public class Recipient {
public boolean isMmsGroup() {
GroupId groupId = resolve().groupId;
return groupId != null && groupId.isMmsGroup();
return groupId != null && groupId.isMms();
}
public boolean isPushGroup() {
GroupId groupId = resolve().groupId;
return groupId != null && !groupId.isMmsGroup();
return groupId != null && groupId.isPush();
}
public @NonNull List<Recipient> getParticipants() {

View File

@ -1690,7 +1690,7 @@ public class WebRtcCallService extends Service implements CallManager.Observer,
RemotePeer remotePeer = (RemotePeer)remote;
Intent intent = new Intent(this, WebRtcCallService.class);
ArrayList<IceCandidateParcel> iceCandidateParcels = new ArrayList(iceCandidates.size());
ArrayList<IceCandidateParcel> iceCandidateParcels = new ArrayList<>(iceCandidates.size());
for (IceCandidate iceCandidate : iceCandidates) {
iceCandidateParcels.add(new IceCandidateParcel(iceCandidate));
}

View File

@ -49,13 +49,13 @@ public final class FileUtils {
}
}
public static void deleteDirectory(@Nullable File directory) {
public static boolean deleteDirectory(@Nullable File directory) {
if (directory == null || !directory.exists() || !directory.isDirectory()) {
return;
return false;
}
deleteDirectoryContents(directory);
directory.delete();
return directory.delete();
}
}

View File

@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.mms.OutgoingGroupMediaMessage;
import org.thoughtcrime.securesms.recipients.Recipient;
import org.thoughtcrime.securesms.recipients.RecipientForeverObserver;
import org.whispersystems.libsignal.util.guava.Optional;
import org.whispersystems.signalservice.api.messages.SignalServiceGroupContext;
import org.whispersystems.signalservice.api.push.SignalServiceAddress;
import org.whispersystems.signalservice.api.util.UuidUtil;
@ -34,6 +35,26 @@ public final class GroupUtil {
private static final String TAG = Log.tag(GroupUtil.class);
/**
* Result may be a v1 or v2 GroupId.
*/
public static GroupId idFromGroupContext(@NonNull SignalServiceGroupContext groupContext) {
if (groupContext.getGroupV1().isPresent()) {
return GroupId.v1(groupContext.getGroupV1().get().getGroupId());
} else if (groupContext.getGroupV2().isPresent()) {
return GroupId.v2(groupContext.getGroupV2().get().getMasterKey());
} else {
throw new AssertionError();
}
}
/**
* Result may be a v1 or v2 GroupId.
*/
public static @NonNull Optional<GroupId> idFromGroupContext(@NonNull Optional<SignalServiceGroupContext> groupContext) {
return groupContext.transform(GroupUtil::idFromGroupContext);
}
@WorkerThread
public static Optional<OutgoingGroupMediaMessage> createGroupLeaveMessage(@NonNull Context context, @NonNull Recipient groupRecipient) {
GroupId encodedGroupId = groupRecipient.requireGroupId();

View File

@ -224,7 +224,9 @@ public class Util {
}
}
public static void close(Closeable closeable) {
public static void close(@Nullable Closeable closeable) {
if (closeable == null) return;
try {
closeable.close();
} catch (IOException e) {
@ -426,13 +428,13 @@ public class Util {
}
public static byte[] getSecretBytes(int size) {
byte[] secret = new byte[size];
getSecureRandom().nextBytes(secret);
return secret;
return getSecretBytes(new SecureRandom(), size);
}
public static SecureRandom getSecureRandom() {
return new SecureRandom();
public static byte[] getSecretBytes(@NonNull SecureRandom secureRandom, int size) {
byte[] secret = new byte[size];
secureRandom.nextBytes(secret);
return secret;
}
public static int getDaysTillBuildExpiry() {
@ -607,4 +609,12 @@ public class Util {
return concat;
}
public static boolean isLong(String value) {
try {
Long.parseLong(value);
return true;
} catch (NumberFormatException e) {
return false;
}
}
}

View File

@ -208,7 +208,8 @@
android:tint="?conversation_list_compose_icon_tint"
app:layout_constraintBottom_toTopOf="@id/megaphone_container"
app:layout_constraintEnd_toEndOf="parent"
app:srcCompat="@drawable/ic_compose_solid_24" />
app:srcCompat="@drawable/ic_compose_solid_24"
app:backgroundTint="@color/core_ultramarine"/>
<androidx.cardview.widget.CardView
android:id="@+id/megaphone_container"

View File

@ -5,6 +5,8 @@
android:layout_height="?attr/actionBarSize"
android:background="@color/action_mode_status_bar"
android:theme="@style/TextSecure.DarkActionBar.Conversation"
app:contentInsetStart="0dp"
app:contentInsetStartWithNavigation="48sp"
app:menu="@menu/conversation_reactions_long_press_menu"
app:navigationIcon="@drawable/ic_x_conversation">

View File

@ -1,9 +1,14 @@
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
<HorizontalScrollView
xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/emoji_variation_selector_background">
android:layout_height="wrap_content">
</LinearLayout>
<LinearLayout
android:id="@+id/emoji_variation_container"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="?attr/emoji_variation_selector_background" />
</HorizontalScrollView>

View File

@ -10,6 +10,6 @@
android:layout_gravity="right|center_vertical"
android:gravity="right|center_vertical"
android:textSize="16sp"
android:textColor="@color/core_ultramarine"/>
android:textColor="?colorAccent"/>
</FrameLayout>

View File

@ -178,6 +178,6 @@
android:layout_gravity="top|end"
android:background="@drawable/dismiss_background"
android:src="@drawable/ic_close_white_18dp"
android:tint="@color/core_grey_70" />
android:tint="?quote_dismiss_button_tint" />
</merge>

View File

@ -395,34 +395,6 @@
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">هذا الهاتف لا يدعم خدمات Play. أنقر لإلغاء تفعيل ميزة الأداء الأمثل للبطارية والتي تمنع Signal من استقبال الرسائل عند عدم النشاط.</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">شارك مع</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">أهلا بكم في Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">تم دمج TextSecure وRedPhone في تطبيق واحد للتواصل الخاص لأي موقف: Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">أهلا بكم في Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure أصبح Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">تم دمج TextSecure وRedPhone في تطبيق واحد وهو: Signal. يرجى النّقر لاستكشاف التطبيق. </string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">رحّبوا باتصالات الفيديو الآمنة.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls"> يدعم Signal الآن مكالمات الفيديو الآمنة. فقط ابدأ مكالمة Signal بالطريقة الاعتيادية، قم بنقر زر الفيديو، وابدأ حديثك بالسلام.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">أصبح Signal يدعم اتصالات الفيديو الآمنة.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">أصبح Signal يدعم اتصالات الفيديو الآمنة. انقر لمعرفة المزيد.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">جاهزين لأخذ سيلفي؟</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">بإمكانكم الآن مشاركة الاسم وصورة الملف الشخصي مع أصدقائكم على Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">هنا ملفّات Signal الشخصية</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">نقدم لكم المؤشرات على الطباعة.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">يمكنكم الآن إختياريا مشاركة ورؤية مؤشّرعند طباعة الرسائل.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">هل تريدون تفعيلها الآن؟</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">وصلت المؤشرات عند الطباعة</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">تفعيل المؤشرات عند الطباعة</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">تشغيل المؤشرات عند الطباعة</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">لا شكرا</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">نقدم لكم لمحة من الروابط.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">خيار رؤية لمحة للروابط أصبحت الآن مدعومة لبعض أشهر مواقع الإنترنت. </string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">يمكنك أن تعطل أوتفعل هذه الخاصية فى أي وقت في إعدادات Signal (الخصوصية &gt; إرسال لمحة عن الرابط).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">عُلم</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">نقدم لكم الملصقات</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">ما جدوى استخدام الكلمات عند توفّر الملصقات؟</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">ما جدوى استخدام الكلمات عند توفّر الملصقات؟ انقر هذه الأيقونة على لوحة المفاتيح:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">هيا بنا</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">جار استعادة رسالة…</string>
<!--GcmRefreshJob-->
@ -1710,8 +1682,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">جارٍ نقل قاعدة بيانات Signal</string>
<string name="PushDecryptJob_new_locked_message">رسالة مُقفلة جديدة</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">فك القفل لعرض الرسائل المعلّقة</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">فك القفل لمواصلة التحديث</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">يُرجى فك القفل عن Signal لإتمام التحديث</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">العبارة السرّية للنسخة الإحتياطية</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">سيتم حفظ النسخ الاحتياطية في سعة التخزين الخارجيّة وستكون مشفرة بالعبارة السرية أدناه. من الضروري حفظ هذه العبارة من أجل استعادة أي نسخة احتياطيّة. </string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">قمت بتدوين هذه العبارة السرية. بدونها، لن يمكنني استعادة أي نسخة احتياطية.</string>

View File

@ -331,30 +331,6 @@
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">Това устройство не поддържа Play услуги. Натиснете, за да изключите оптимизациите на батерият, за да преустановите опитите на Signal да изтегля съобщения, когато не е активен.</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">Споделяне с</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Добре дошли в Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure и Redphone се обедениха в чат програма за конфеденциално разговори, за всяка ситуация: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Добре дошли в Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure вече е Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure и Redphone вече са една програма: Signal. Натисни за да разгледаш.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Кажете здравей на криптирани видео разговори.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal вече поддържа криптирани видео разговори. Просто започнете обаждане, както обикновено и натиснете бутонът за видео.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal вече поддържа криптирано видео обаждане.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal вече поддържа криптирано видео обаждане. Натиснете, за да научите повече.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Готови за снимка?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Вече може да споделяте профилна снимка и името си с приятелите си в Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Профилите в Signal пристигнаха</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Представяме индикатори за писане.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">По желание можете да споделяте и виждате дали някой пише съобщения.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Желаете ли да активирате тази опция?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Ето ги индикаторите за писане</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Активиране на индикатори за писане</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Активиране на индикатори за писане</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Не, благодаря</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Представяме ви визуализации на линковете.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Опционални визуализации на линковете вече са поддържани за някои от най-популярните сайтове в интернет.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Можете да деактивирате или активирате тази функция по всяко време в настройките на Signal (Поверителност &gt; Изпращане на визуализации на връзката).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Ясно</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Изтегляне на съобщение…</string>
<!--GcmRefreshJob-->
@ -1345,8 +1321,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Мигриране на базата данни на Signal</string>
<string name="PushDecryptJob_new_locked_message">Ново заключено съобщение</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Отключете, за да прегледате новите съобщения</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Отключете, за да довършите актуализацията</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Моля отключете Signal за да довършите актуализацията</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Парола на архива</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Архивите ще бъдат запазени на външно хранилище и криптирани с паролата задена по-долу. Трябва да използвате същата парола за въстановяване от архива.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Записах тази парола. Без нея, няма да мога да възстановя архива.</string>

File diff suppressed because one or more lines are too long

View File

@ -334,34 +334,6 @@
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">Ovaj uređaj ne podržava Play Services. Pritisnite ovdje kako biste onemogućili sistemske optimizacije korištenja baterije koje sprečavaju Signal da prima poruke dok je aplikacija zatvorena.</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">Dijeli sa</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Dobrodošli u Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure i RedPhone sada su jedna privatna aplikacija za komunikaciju u svakoj situaciji: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Dobrodošli u Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure je sada Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure i RedPhone sada su jedna aplikacija: Signal. Pritisnite za pregled.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Pozdravite zaštićene videopozive</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal sada podržava zaštićene video pozive. Jednostavno započnite Signal poziv kao i inače, pritisnite video tipku i mahnite sagovorniku.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal sada podržava zaštićene video pozive.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal sada podržava zaštićene video pozive. Pritisnite za pregled.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Spremni ste za licem u lice?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Sada možete podijeliti profilnu sliku i ime sa prijateljima na Signalu</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Stigli su Signal profili</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Novo: indikatori kucanja</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Sada možete, ako želite, vidjeti i podijeliti s drugima obavijest da se poruka piše.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Želite li ih odmah aktivirati?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Indikatori kucanja su stigli</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Prikaži indikatore kucanja</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Uključite indikatore kucanja</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Ne, hvala</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Novo: prikazi linka</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Prikazi linka sa nekih od najpopularnijih internet stranica sada su podržani.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Ovu mogućnost možete aktivirati ili deaktivirati kada god to poželite kroz podešavanja Signala (Privatnost &gt; Šalji prikaze veza).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Primljeno na znanje</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Novo: naljepnice</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Zašto pisati riječi kad možete koristiti naljepnice?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Zašto pisati riječi kad možete koristiti naljepnice? Dotaknite ovu sličicu na Vašoj tastaturi:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Krenimo</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Primam poruku…</string>
<!--GcmRefreshJob-->
@ -1492,8 +1464,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Prenosim Signalovu bazu podataka</string>
<string name="PushDecryptJob_new_locked_message">Nova zaključana poruka</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Otključajte kako biste vidjeli poruke na čekanju</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Otključajte da dovršite ažuriranje</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Molimo otključajte Signal da dovršite ažuriranje</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Lozinka za rezervne kopije</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Rezervne kopije bit će pohranjene u memoriju uređaja i šifrirane lozinkom navedenom dolje. Morate znati lozinku da biste mogli vratiti podatke iz rezervne kopije.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Zapisao/la sam ovu lozinku. Bez nje neću moći vratiti podatke iz rezervne kopije.</string>

View File

@ -24,17 +24,17 @@
<item quantity="other">Això reduirà immediatament totes les converses als %d missatges més recents.</item>
</plurals>
<string name="ApplicationPreferencesActivity_delete">Suprimeix</string>
<string name="ApplicationPreferencesActivity_disable_passphrase">Voleu inhabilitar la contrasenya?</string>
<string name="ApplicationPreferencesActivity_disable_passphrase">Voleu desactivar la contrasenya?</string>
<string name="ApplicationPreferencesActivity_this_will_permanently_unlock_signal_and_message_notifications">El Signal i les notificacions es desblocaran permanentment.</string>
<string name="ApplicationPreferencesActivity_disable">Inhabilita</string>
<string name="ApplicationPreferencesActivity_disable">Desactiva</string>
<string name="ApplicationPreferencesActivity_unregistering">Cancel·lació del registre</string>
<string name="ApplicationPreferencesActivity_unregistering_from_signal_messages_and_calls">Es cancel·la el registre per als missatges i les trucades del Signal…</string>
<string name="ApplicationPreferencesActivity_disable_signal_messages_and_calls">Voleu inhabilitar els missatges i les trucades del Signal?</string>
<string name="ApplicationPreferencesActivity_disable_signal_messages_and_calls_by_unregistering">Inhabiliteu els missatges i les trucades del Signal cancel·lant el registre del servidor. Haureu de tornar a registrar el número de telèfon per usar-los de nou.</string>
<string name="ApplicationPreferencesActivity_disable_signal_messages_and_calls">Voleu desactivarr els missatges i les trucades del Signal?</string>
<string name="ApplicationPreferencesActivity_disable_signal_messages_and_calls_by_unregistering">Desactiveu els missatges i les trucades del Signal cancel·lant el registre del servidor. Haureu de tornar a registrar el número de telèfon per usar-los de nou.</string>
<string name="ApplicationPreferencesActivity_error_connecting_to_server">S\'ha produït un error en connectar amb el servidor.</string>
<string name="ApplicationPreferencesActivity_sms_enabled">SMS habilitats</string>
<string name="ApplicationPreferencesActivity_sms_enabled">SMS activats</string>
<string name="ApplicationPreferencesActivity_touch_to_change_your_default_sms_app">Toqueu per canviar l\'aplicació d\'SMS predeterminada</string>
<string name="ApplicationPreferencesActivity_sms_disabled">SMS inhabilitats</string>
<string name="ApplicationPreferencesActivity_sms_disabled">SMS desactivats</string>
<string name="ApplicationPreferencesActivity_touch_to_make_signal_your_default_sms_app">Toqueu perquè el Signal sigui l\'aplicació d\'SMS predeterminada</string>
<string name="ApplicationPreferencesActivity_on">actiu</string>
<string name="ApplicationPreferencesActivity_On">Actiu</string>
@ -65,10 +65,10 @@
<string name="AttachmentKeyboard_give_access">Permet-hi l\'accés</string>
<!--AttachmentManager-->
<string name="AttachmentManager_cant_open_media_selection">No s\'ha trobat cap aplicació compatible.</string>
<string name="AttachmentManager_signal_requires_the_external_storage_permission_in_order_to_attach_photos_videos_or_audio">El Signal necessita el permís de l\'emmagatzematge per tal d\'adjuntar fotografies, vídeos o àudio, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi l\'emmagatzematge.</string>
<string name="AttachmentManager_signal_requires_contacts_permission_in_order_to_attach_contact_information">El Signal necessita el permís de l\'aplicació dels contactes per tal d\'adjuntar-ne informació, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi els contactes.</string>
<string name="AttachmentManager_signal_requires_location_information_in_order_to_attach_a_location">El Signal necessita el permís de la ubicació per tal d\'adjuntar-ne informació, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi la ubicació.</string>
<string name="AttachmentManager_signal_requires_the_camera_permission_in_order_to_take_photos_but_it_has_been_permanently_denied">El Signal necessita el permís de la càmera per tal d\'adjuntar-ne informació, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi la càmera.</string>
<string name="AttachmentManager_signal_requires_the_external_storage_permission_in_order_to_attach_photos_videos_or_audio">El Signal necessita el permís de l\'emmagatzematge per tal d\'adjuntar fotografies, vídeos o àudio, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi l\'emmagatzematge.</string>
<string name="AttachmentManager_signal_requires_contacts_permission_in_order_to_attach_contact_information">El Signal necessita el permís de l\'aplicació dels contactes per tal d\'adjuntar-ne informació, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi els contactes.</string>
<string name="AttachmentManager_signal_requires_location_information_in_order_to_attach_a_location">El Signal necessita el permís de la ubicació per tal d\'adjuntar-ne informació, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi la ubicació.</string>
<string name="AttachmentManager_signal_requires_the_camera_permission_in_order_to_take_photos_but_it_has_been_permanently_denied">El Signal necessita el permís de la càmera per tal d\'adjuntar-ne informació, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi la càmera.</string>
<!--AttachmentUploadJob-->
<string name="AttachmentUploadJob_uploading_media">Es penja el contingut…</string>
<string name="AttachmentUploadJob_compressing_video_start">Es comprimeix el vídeo…</string>
@ -189,14 +189,14 @@
<string name="ConversationActivity_unable_to_record_audio">No s\'ha pogut enregistrar l\'àudio.</string>
<string name="ConversationActivity_there_is_no_app_available_to_handle_this_link_on_your_device">No hi ha cap aplicació que pugui obrir aquest enllaç.</string>
<string name="ConversationActivity_to_send_audio_messages_allow_signal_access_to_your_microphone">Per enviar missatges d\'àudio, permeteu que el Signal tingui accés al micròfon.</string>
<string name="ConversationActivity_signal_requires_the_microphone_permission_in_order_to_send_audio_messages">El Signal necessita el permís del micròfon per tal d\'enviar missatges d\'àudio, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi el micròfon.</string>
<string name="ConversationActivity_signal_requires_the_microphone_permission_in_order_to_send_audio_messages">El Signal necessita el permís del micròfon per tal d\'enviar missatges d\'àudio, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi el micròfon.</string>
<string name="ConversationActivity_to_call_s_signal_needs_access_to_your_microphone_and_camera">Per trucar a %s, el Signal necessita accés al micròfon i a la càmera.</string>
<string name="ConversationActivity_signal_needs_the_microphone_and_camera_permissions_in_order_to_call_s">El Signal necessita el permís del micròfon i de la càmera per tal de trucar a %s, però s\'han denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi el micròfon i la càmera.</string>
<string name="ConversationActivity_signal_needs_the_microphone_and_camera_permissions_in_order_to_call_s">El Signal necessita el permís del micròfon i de la càmera per tal de trucar a %s, però s\'han denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi el micròfon i la càmera.</string>
<string name="ConversationActivity_to_capture_photos_and_video_allow_signal_access_to_the_camera">Per captar fotografies i vídeos, permeteu que el Signal tingui accés a la càmera.</string>
<string name="ConversationActivity_signal_needs_the_camera_permission_to_take_photos_or_video">El Signal necessita el permís de la càmera per tal de fer fotografies i vídeos, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi la càmera.</string>
<string name="ConversationActivity_signal_needs_the_camera_permission_to_take_photos_or_video">El Signal necessita el permís de la càmera per tal de fer fotografies i vídeos, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi la càmera.</string>
<string name="ConversationActivity_signal_needs_camera_permissions_to_take_photos_or_video">El Signal necessita el permís de la càmera per fer fotografies i vídeos.</string>
<string name="ConversationActivity_enable_the_microphone_permission_to_capture_videos_with_sound">Habiliteu el permís del micròfon per capturar vídeos amb so.</string>
<string name="ConversationActivity_signal_needs_the_recording_permissions_to_capture_video">El Signal necessita el permís del micròfon per gravar vídeos, però s\'han denegat. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi el micròfon i la càmera.</string>
<string name="ConversationActivity_enable_the_microphone_permission_to_capture_videos_with_sound">Activeu el permís del micròfon per capturar vídeos amb so.</string>
<string name="ConversationActivity_signal_needs_the_recording_permissions_to_capture_video">El Signal necessita el permís del micròfon per gravar vídeos, però s\'han denegat. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi el micròfon i la càmera.</string>
<string name="ConversationActivity_signal_needs_recording_permissions_to_capture_video">El Signal necessita el permís del telèfon per gravar vídeos.</string>
<string name="ConversationActivity_quoted_contact_message">%1$s %2$s</string>
<string name="ConversationActivity_signal_cannot_sent_sms_mms_messages_because_it_is_not_your_default_sms_app">El Signal no pot enviar missatges SMS / MMS perquè no és la vostra aplicació d\'SMS predeterminada. Voleu canviar-ho a la configuració d\'Android?</string>
@ -343,43 +343,15 @@
<string name="DocumentView_unnamed_file">Fitxer sense nom</string>
<!--DozeReminder-->
<string name="DozeReminder_optimize_for_missing_play_services">Optimitza per a la no presència dels Play Services</string>
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">El dispositiu no és compatible amb Play Services. Toqueu per inhabilitar les optimitzacions de la bateria que impedeixen que el Signal rebi missatges quan estigui inactiu.</string>
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">El dispositiu no és compatible amb Play Services. Toqueu per desactivar les optimitzacions de la bateria que impedeixen que el Signal rebi missatges quan estigui inactiu.</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">Comparteix amb</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Els adjunts múltiples només s\'admeten per a imatges i vídeos.</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Benvingut al Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure i RedPhone ara són un únic servei de missatgeria privada, per a qualsevol situació: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Benvingut al Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure ara és Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure i RedPhone són ara una única aplicació: Signal. Premeu per a més informació.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Digueu hola a les videotrucades segures.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">El Signal és compatible amb les trucades de vídeo segures. Inicieu una trucada Signal, toqueu el botó de vídeo i saludeu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">El Signal ara permet trucades de vídeo segures.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">El Signal ara permet trucades de vídeo segures. Toqueu per explorar-ho.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">A punt per a un primer pla?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Ara podeu compartir un nom i una foto de perfil amb les amistats del Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Els perfils del Signal són aquí</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">S\'introdueixen els indicadors de tecleig.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Ara, opcionalment, podeu veure i compartir quan s\'escriuen els missatges.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Voleu habilitar-los ara?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Ja tenim aquí els indicadors de tecleig.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Habilita els indicadors de tecleig</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Activa els indicadors de tecleig</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">No, gràcies</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">S\'introdueixen les previsualitzacions d\'enllaços.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Ara s\'admeten previsualitzacions d\'enllaços opcionals per a la majoria de les pàgines més populars d\'Internet.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Podeu habilitar o inhabilitar aquesta opció en qualsevol moment a la configuració del Signal (Privadesa &gt; Envia previsualitzacions d\'enllaços).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Entès!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">S\'introdueixen els adhesius.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Per què usar paraules quan podeu fer servir adhesius?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Per què usar paraules quan podeu fer servir adhesius? Toqueu aquesta icona del teclat:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Som-hi</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Es recupera un missatge…</string>
<!--GcmRefreshJob-->
<string name="GcmRefreshJob_Permanent_Signal_communication_failure">La comunicació del Signal falla contínuament!</string>
<string name="GcmRefreshJob_Signal_was_unable_to_register_with_Google_Play_Services">El Signal no s\'ha pogut registrar al Google Play Services. Els missatges i les trucades del Signal s\'han inhabilitat, registreu-vos de nou a Configuració &gt; Avançada.</string>
<string name="GcmRefreshJob_Signal_was_unable_to_register_with_Google_Play_Services">El Signal no s\'ha pogut registrar al Google Play Services. Els missatges i les trucades del Signal s\'han desactivat, registreu-vos de nou a Configuració &gt; Avançada.</string>
<!--GiphyActivity-->
<string name="GiphyActivity_error_while_retrieving_full_resolution_gif">S\'ha produït un error en recuperar el GIF a resolució completa</string>
<!--GiphyFragmentPageAdapter-->
@ -391,7 +363,7 @@
<string name="GroupCreateActivity_group_name_hint">Nom del grup</string>
<string name="GroupCreateActivity_actionbar_mms_title">Grup de MMS nou</string>
<string name="GroupCreateActivity_contacts_dont_support_push">Heu seleccionat un contacte que no pot gestionar els grups del Signal, per tant aquest grup serà per MMS.</string>
<string name="GroupCreateActivity_youre_not_registered_for_signal">No esteu registrat per als missatges i les trucades del Signal; per tant, els grups del Signal estan inhabilitats. Torneu a registrar-vos a Configuració &gt; Avançada.l</string>
<string name="GroupCreateActivity_youre_not_registered_for_signal">No esteu registrat per als missatges i les trucades del Signal; per tant, els grups del Signal estan desactivats. Torneu a registrar-vos a Configuració &gt; Avançada.l</string>
<string name="GroupCreateActivity_contacts_no_members">Cal almenys una persona al grup.</string>
<string name="GroupCreateActivity_contacts_invalid_number">Un dels membres del grup té un número que no es pot llegir correctament. Corregiu-ho o suprimiu aquest contacte i torneu a provar-ho.</string>
<string name="GroupCreateActivity_avatar_content_description">Avatar del grup</string>
@ -444,7 +416,7 @@
<string name="LongMessageActivity_your_message">El vostre missatge</string>
<!--MessageRetrievalService-->
<string name="MessageRetrievalService_signal">Signal</string>
<string name="MessageRetrievalService_background_connection_enabled">S\'ha habilitat la connexió en segon pla</string>
<string name="MessageRetrievalService_background_connection_enabled">S\'ha activat la connexió en segon pla</string>
<!--MmsDownloader-->
<string name="MmsDownloader_error_reading_mms_settings">S\'ha produït un error en llegir la configuració d\'MMS de l\'operador</string>
<!--MediaOverviewActivity-->
@ -520,7 +492,7 @@
<string name="MediaSendActivity_message">Missatge</string>
<string name="MediaSendActivity_select_recipients">Seleccioneu destinataris</string>
<string name="MediaSendActivity_signal_needs_access_to_your_contacts">El Signal necessita accés als contactes per tal de mostrar-los.</string>
<string name="MediaSendActivity_signal_needs_contacts_permission_in_order_to_show_your_contacts_but_it_has_been_permanently_denied">El Signal necessita el permís de l\'aplicació de contactes per tal de mostrar-ne els vostres, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi els contactes.</string>
<string name="MediaSendActivity_signal_needs_contacts_permission_in_order_to_show_your_contacts_but_it_has_been_permanently_denied">El Signal necessita el permís de l\'aplicació de contactes per tal de mostrar-ne els vostres, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi els contactes.</string>
<plurals name="MediaSendActivity_cant_share_more_than_n_items">
<item quantity="one">No podeu compartir més de %d elements.</item>
<item quantity="other">No podeu compartir més de %d elements.</item>
@ -541,8 +513,8 @@
<string name="MessageRecord_called_s">Heu trucat a %s</string>
<string name="MessageRecord_missed_call_from">Trucada perduda de %s</string>
<string name="MessageRecord_s_joined_signal">%s és al Signal!</string>
<string name="MessageRecord_you_disabled_disappearing_messages">Heu inhabilitat els missatges efímers.</string>
<string name="MessageRecord_s_disabled_disappearing_messages">%1$s ha inhabilitat els missatges efímers.</string>
<string name="MessageRecord_you_disabled_disappearing_messages">Heu desactivat els missatges efímers.</string>
<string name="MessageRecord_s_disabled_disappearing_messages">%1$s ha desactivat els missatges efímers.</string>
<string name="MessageRecord_you_set_disappearing_message_time_to_s">Heu establert el temporitzador dels missatges efímers a %1$s.</string>
<string name="MessageRecord_s_set_disappearing_message_time_to_s">%1$s ha establert el temporitzador dels missatges efímers a %2$s.</string>
<string name="MessageRecord_your_safety_number_with_s_has_changed">El número de seguretat amb %s ha canviat.</string>
@ -566,6 +538,10 @@
<item quantity="one">%1$d membre</item>
<item quantity="other">%1$d membres</item>
</plurals>
<plurals name="MessageRequestProfileView_members_and_invited">
<item quantity="one">%1$d membre (+%2$d convidat/s)</item>
<item quantity="other">%1$d membres (+%2$d convidat/s)</item>
</plurals>
<plurals name="MessageRequestProfileView_member_of_others">
<item quantity="one">%d més</item>
<item quantity="other">%d més</item>
@ -592,7 +568,7 @@
<string name="DeviceActivity_sorry_this_is_not_a_valid_device_link_qr_code">Això no és un codi QR amb enllaç vàlid.</string>
<string name="DeviceProvisioningActivity_link_a_signal_device">Voleu enllaçar un dispositiu de Signal?</string>
<string name="DeviceProvisioningActivity_it_looks_like_youre_trying_to_link_a_signal_device_using_a_3rd_party_scanner">Sembla que esteu provant d\'enllaçar un dispositiu de Signal amb un escàner extern. Per seguretat, torneu a escanejar el codi dins del Signal.</string>
<string name="DeviceActivity_signal_needs_the_camera_permission_in_order_to_scan_a_qr_code">El Signal necessita el permís de la càmera per tal d\'escanejar un codi QR, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi la càmera.</string>
<string name="DeviceActivity_signal_needs_the_camera_permission_in_order_to_scan_a_qr_code">El Signal necessita el permís de la càmera per tal d\'escanejar un codi QR, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi la càmera.</string>
<string name="DeviceActivity_unable_to_scan_a_qr_code_without_the_camera_permission">No es pot escanejar un codi QR sense permís de la càmera.</string>
<!--ExpirationDialog-->
<string name="ExpirationDialog_disappearing_messages">Missatges efímers</string>
@ -637,8 +613,8 @@
<string name="RecipientPreferenceActivity_unblock_this_group_description">Els membres existents us podran afegir de nou al grup.</string>
<string name="RecipientPreferenceActivity_error_leaving_group">Error en abandonar el grup</string>
<string name="RecipientPreferenceActivity_unblock">Desbloca</string>
<string name="RecipientPreferenceActivity_enabled">Habilitat</string>
<string name="RecipientPreferenceActivity_disabled">Inhabilitat</string>
<string name="RecipientPreferenceActivity_enabled">Activat</string>
<string name="RecipientPreferenceActivity_disabled">Desactivat</string>
<string name="RecipientPreferenceActivity_available_once_a_message_has_been_sent_or_received">Disponible una vegada s\'ha enviat o rebut un missatge.</string>
<!--RecipientProvider-->
<string name="RecipientProvider_unnamed_group">Grup sense nom</string>
@ -777,7 +753,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="ThreadRecord_view_once_video">Vídeo d\'una sola visualització</string>
<string name="ThreadRecord_view_once_media">Contingut d\'una sola visualització</string>
<string name="ThreadRecord_s_is_on_signal">%s és al Signal!</string>
<string name="ThreadRecord_disappearing_messages_disabled">Missatges efímers inhabilitats</string>
<string name="ThreadRecord_disappearing_messages_disabled">Missatges efímers desactivats</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">El temps del missatge efímer s\'ha establit a %s</string>
<string name="ThreadRecord_safety_number_changed">El número de seguretat ha canviat</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">El número de seguretat amb %s ha canviat.</string>
@ -824,7 +800,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="VerifyIdentityActivity_our_signal_safety_number">El nostre número de seguretat:</string>
<string name="VerifyIdentityActivity_no_app_to_share_to">Sembla que no teniu cap aplicació on compartir-ho.</string>
<string name="VerifyIdentityActivity_no_safety_number_to_compare_was_found_in_the_clipboard">No s\'ha trobat cap número de seguretat al porta-retalls</string>
<string name="VerifyIdentityActivity_signal_needs_the_camera_permission_in_order_to_scan_a_qr_code_but_it_has_been_permanently_denied">El Signal necessita el permís de la càmera per tal d\'escanejar un codi QR, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi la càmera.</string>
<string name="VerifyIdentityActivity_signal_needs_the_camera_permission_in_order_to_scan_a_qr_code_but_it_has_been_permanently_denied">El Signal necessita el permís de la càmera per tal d\'escanejar un codi QR, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi la càmera.</string>
<string name="VerifyIdentityActivity_unable_to_scan_qr_code_without_camera_permission">No es pot escanejar un codi QR sense permís de la càmera.</string>
<!--ViewOnceMessageActivity-->
<!--MessageDisplayHelper-->
@ -851,7 +827,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="MediaPreviewActivity_you">Jo</string>
<string name="MediaPreviewActivity_unssuported_media_type">Tipus de fitxer no compatible</string>
<string name="MediaPreviewActivity_draft">Esborrany</string>
<string name="MediaPreviewActivity_signal_needs_the_storage_permission_in_order_to_write_to_external_storage_but_it_has_been_permanently_denied">El Signal necessita el permís de l\'emmagatzematge per tal de desar en un emmagatzematge extern, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi l\'emmagatzematge.</string>
<string name="MediaPreviewActivity_signal_needs_the_storage_permission_in_order_to_write_to_external_storage_but_it_has_been_permanently_denied">El Signal necessita el permís de l\'emmagatzematge per tal de desar en un emmagatzematge extern, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi l\'emmagatzematge.</string>
<string name="MediaPreviewActivity_unable_to_write_to_external_storage_without_permission">No es pot desar en un emmagatzematge extern sense permís.</string>
<string name="MediaPreviewActivity_media_delete_confirmation_title">Voleu suprimir el missatge?</string>
<string name="MediaPreviewActivity_media_delete_confirmation_message">Aquest missatge se suprimirà permanentment.</string>
@ -927,7 +903,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="VideoPlayer_error_playing_video">S\'ha produït un error en reproduir el vídeo</string>
<!--WebRtcCallActivity-->
<string name="WebRtcCallActivity_to_answer_the_call_from_s_give_signal_access_to_your_microphone">Per respondre una trucada de %s, permeteu que el Signal tingui accés al micròfon.</string>
<string name="WebRtcCallActivity_signal_requires_microphone_and_camera_permissions_in_order_to_make_or_receive_calls">El Signal necessita el permís del micròfon i de la càmera per tal de fer o rebre trucades, però s\'han denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi el micròfon i la càmera.</string>
<string name="WebRtcCallActivity_signal_requires_microphone_and_camera_permissions_in_order_to_make_or_receive_calls">El Signal necessita el permís del micròfon i de la càmera per tal de fer o rebre trucades, però s\'han denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi el micròfon i la càmera.</string>
<!--WebRtcCallScreen-->
<string name="WebRtcCallScreen_new_safety_numbers">El número de seguretat de la conversa amb %1$s ha canviat. Això pot significar o bé que algú està provant d\'interceptar la comunicació, o bé que %2$s ha reinstal·lat el Signal.</string>
<string name="WebRtcCallScreen_you_may_wish_to_verify_this_contact">Potser voleu verificar el número de seguretat amb aquest contacte.</string>
@ -935,7 +911,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="WebRtcCallScreen_accept">Accepta</string>
<string name="WebRtcCallScreen_end_call">Acaba la trucada</string>
<!--WebRtcCallControls-->
<string name="WebRtcCallControls_tap_to_enable_your_video">Toqueu per inhabilitar el vídeo</string>
<string name="WebRtcCallControls_tap_to_enable_your_video">Toqueu per activar el vídeo</string>
<!--WebRtcCallControls Content Descriptions-->
<string name="WebRtcCallControls_contact_photo_description">Foto del contacte</string>
<string name="WebRtcCallControls_speaker_button_description">Altaveu</string>
@ -978,7 +954,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<!--single_contact_selection_activity-->
<string name="SingleContactSelectionActivity_contact_photo">Foto del contacte</string>
<!--ContactSelectionListFragment-->
<string name="ContactSelectionListFragment_signal_requires_the_contacts_permission_in_order_to_display_your_contacts">El Signal necessita el permís de l\'aplicació dels contactes per tal de mostrar-ne els vostres, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi els contactes.</string>
<string name="ContactSelectionListFragment_signal_requires_the_contacts_permission_in_order_to_display_your_contacts">El Signal necessita el permís de l\'aplicació dels contactes per tal de mostrar-ne els vostres, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi els contactes.</string>
<string name="ContactSelectionListFragment_error_retrieving_contacts_check_your_network_connection">Error en recuperar els contactes. Comproveu la connexió de xarxa.</string>
<string name="ContactSelectionListFragment_username_not_found">No s\'ha trobat el nom d\'usuari.</string>
<string name="ContactSelectionListFragment_s_is_not_a_signal_user">%1$s no és un usuari del Signal. Si us plau, comproveu-ne el nom i torneu-ho a provar.</string>
@ -1001,7 +977,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="conversation_activity__quick_attachment_drawer_toggle_camera_description">Desplega la pestanya d\'adjunts de càmera ràpida</string>
<string name="conversation_activity__quick_attachment_drawer_record_and_send_audio_description">Enregistra i envia un àudio adjunt</string>
<string name="conversation_activity__quick_attachment_drawer_lock_record_description">Bloqueja la gravació d\'un adjunt d\'àudio</string>
<string name="conversation_activity__enable_signal_for_sms">Habilita el Signal per als SMS</string>
<string name="conversation_activity__enable_signal_for_sms">Activa el Signal per als SMS</string>
<!--conversation_input_panel-->
<string name="conversation_input_panel__slide_to_cancel">Llisqueu per cancel·lar-ho</string>
<string name="conversation_input_panel__cancel">Cancel·la</string>
@ -1043,7 +1019,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="experience_upgrade_activity__continue">continua</string>
<string name="experience_upgrade_preference_fragment__read_receipts_are_here">Aquí hi ha les confirmacions de lectura</string>
<string name="experience_upgrade_preference_fragment__optionally_see_and_share_when_messages_have_been_read">Opcionalment vegeu i compartiu quan s\'han llegit els missatges</string>
<string name="experience_upgrade_preference_fragment__enable_read_receipts">Inhabilita les confirmacions de lectura</string>
<string name="experience_upgrade_preference_fragment__enable_read_receipts">Activa les confirmacions de lectura</string>
<!--expiration-->
<string name="expiration_off">Inactiu</string>
<plurals name="expiration_seconds">
@ -1243,8 +1219,8 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="arrays__mute_for_seven_days">Silencia-ho durant 7 dies</string>
<string name="arrays__mute_for_one_year">Silencia-ho durant 1 any</string>
<string name="arrays__settings_default">Configuració predeterminada</string>
<string name="arrays__enabled">Habilitat</string>
<string name="arrays__disabled">Inhabilitat</string>
<string name="arrays__enabled">Activat</string>
<string name="arrays__disabled">Desactivat</string>
<string name="arrays__name_and_message">Nom i missatge</string>
<string name="arrays__name_only">Només el nom</string>
<string name="arrays__no_name_or_message">Sense nom ni missatge</string>
@ -1278,7 +1254,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="preferences__choose_your_contact_entry_from_the_contacts_list">Trieu els contactes de la llista de contactes.</string>
<string name="preferences__change_passphrase">Canvia la contrasenya</string>
<string name="preferences__change_your_passphrase">Canvia la contrasenya</string>
<string name="preferences__enable_passphrase">Habilita la contrasenya del blocatge de la pantalla</string>
<string name="preferences__enable_passphrase">Activa la contrasenya del blocatge de la pantalla</string>
<string name="preferences__lock_signal_and_message_notifications_with_a_passphrase">Bloca la pantalla i les notificacions amb una contrasenya</string>
<string name="preferences__screen_security">Seguretat de la pantalla</string>
<string name="preferences__disable_screen_security_to_allow_screen_shots">Bloca les captures de pantalla a les llistes de recents i dins de l\'aplicació</string>
@ -1342,13 +1318,13 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="preferences__free_private_messages_and_calls">Missatges i trucades privades gratuïtes per als usuaris del Signal </string>
<string name="preferences__submit_debug_log">Envia un registre de depuració</string>
<string name="preferences__support_wifi_calling">Compatibilitat «Trucada per WiFi»</string>
<string name="preferences__enable_if_your_device_supports_sms_mms_delivery_over_wifi">Habiliteu-ho si el dispositiu fa servir SMS / MMS per WiFi (feu-ho només si la «Trucada per WiFi» està habilitada al dispositiu)</string>
<string name="preferences__enable_if_your_device_supports_sms_mms_delivery_over_wifi">Activeu-ho si el dispositiu fa servir SMS / MMS per WiFi (feu-ho només si la «Trucada per WiFi» està activada al dispositiu)</string>
<string name="preferences__incognito_keyboard">Teclat d\'incògnit</string>
<string name="preferences__read_receipts">Confirmació de lectura</string>
<string name="preferences__if_read_receipts_are_disabled_you_wont_be_able_to_see_read_receipts">Si les confirmacions de recepció estan inhabilitades, no podreu veure les dels altres.</string>
<string name="preferences__if_read_receipts_are_disabled_you_wont_be_able_to_see_read_receipts">Si les confirmacions de recepció estan desactivbades, no podreu veure les dels altres.</string>
<string name="preferences__typing_indicators">Indicadors de tecleig</string>
<string name="preferences__if_typing_indicators_are_disabled_you_wont_be_able_to_see_typing_indicators">Si els indicadors de tecleig estan inhabilitats, no podreu veure els indicadors de tecleig dels altres.</string>
<string name="preferences__request_keyboard_to_disable_personalized_learning">Demana el teclat per inhabilitar l\'aprenentatge personalitzat</string>
<string name="preferences__if_typing_indicators_are_disabled_you_wont_be_able_to_see_typing_indicators">Si els indicadors de tecleig estan desactivats, no podreu veure els indicadors de tecleig dels altres.</string>
<string name="preferences__request_keyboard_to_disable_personalized_learning">Demana el teclat per desactivar l\'aprenentatge personalitzat</string>
<string name="preferences_app_protection__blocked_contacts">Contactes blocats</string>
<string name="preferences_chats__when_using_mobile_data">En usar dades mòbils</string>
<string name="preferences_chats__when_using_wifi">En usar Wi-Fi</string>
@ -1362,8 +1338,8 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="preferences_storage__audio">Àudio</string>
<string name="preferences_storage__review_storage">Revisa l\'emmagatzematge</string>
<string name="preferences_advanced__use_system_emoji">Usa els emoji del sistema</string>
<string name="preferences_advanced__disable_signal_built_in_emoji_support">Inhabilita els emojis inclosos al Signal</string>
<string name="preferences_advanced__relay_all_calls_through_the_signal_server_to_avoid_revealing_your_ip_address">Retransmet totes les trucades a través del servidor del Signal per evitar revelar l\'adreça IP al contacte. Habilitar-ho reduirà la qualitat de la trucada.</string>
<string name="preferences_advanced__disable_signal_built_in_emoji_support">Desactiva els emojis inclosos al Signal</string>
<string name="preferences_advanced__relay_all_calls_through_the_signal_server_to_avoid_revealing_your_ip_address">Retransmet totes les trucades a través del servidor del Signal per evitar revelar l\'adreça IP al contacte. Activar-ho reduirà la qualitat de la trucada.</string>
<string name="preferences_advanced__always_relay_calls">Retransmet sempre les trucades</string>
<string name="preferences_app_protection__app_access">Accés de l\'aplicació</string>
<string name="preferences_app_protection__communication">Comunicació</string>
@ -1383,7 +1359,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="preferences_communication__sealed_sender_display_indicators">Indicadors de pantalla</string>
<string name="preferences_communication__sealed_sender_display_indicators_description">Mostra una icona d\'estat si seleccioneu «Detalls del missatge» als missatges que s\'han entregat usant el remitent segellat.</string>
<string name="preferences_communication__sealed_sender_allow_from_anyone">Permet-ho per a tothom</string>
<string name="preferences_communication__sealed_sender_allow_from_anyone_description">Habilita el remitent segellat per a missatges rebuts de persones que no teniu als contactes o de persones amb qui no heu compartit el vostre perfil.</string>
<string name="preferences_communication__sealed_sender_allow_from_anyone_description">Activa el remitent segellat per a missatges rebuts de persones que no teniu als contactes o de persones amb qui no heu compartit el vostre perfil.</string>
<string name="preferences_communication__sealed_sender_learn_more">Més informació</string>
<!--****************************************-->
<!--menus-->
@ -1474,7 +1450,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="reminder_header_sms_default_text">Premeu per establir el Signal com a aplicació predeterminada per a SMS.</string>
<string name="reminder_header_sms_import_title">Importació dels SMS del sistema</string>
<string name="reminder_header_sms_import_text">Premeu per copiar els missatges SMS del telèfon a la base de dades encriptada del Signal.</string>
<string name="reminder_header_push_title">Habilita els missatges i les trucades del Signal</string>
<string name="reminder_header_push_title">Activa els missatges i les trucades del Signal</string>
<string name="reminder_header_push_text">Actualitza l\'experiència comunicativa.</string>
<string name="reminder_header_invite_title">Convida al Signal</string>
<string name="reminder_header_invite_text">Eleva la conversa amb %1$s al nivell següent.</string>
@ -1623,16 +1599,14 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="ConversationListFragment_loading">Es carrega…</string>
<string name="CallNotificationBuilder_connecting">Es connecta…</string>
<string name="Permissions_permission_required">Cal permís</string>
<string name="ConversationActivity_signal_needs_sms_permission_in_order_to_send_an_sms">El Signal necessita el permís d\'SMS per tal d\'enviar missatges SMS, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi l\'SMS.</string>
<string name="ConversationActivity_signal_needs_sms_permission_in_order_to_send_an_sms">El Signal necessita el permís d\'SMS per tal d\'enviar missatges SMS, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi l\'SMS.</string>
<string name="Permissions_continue">Continua</string>
<string name="Permissions_not_now">Ara no</string>
<string name="ConversationListActivity_signal_needs_contacts_permission_in_order_to_search_your_contacts_but_it_has_been_permanently_denied">El Signal necessita el permís de l\'aplicació dels contactes per tal de cercar-ne els vostres, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi els contactes.</string>
<string name="conversation_activity__enable_signal_messages">HABILITA ELS MISSATGES DE SIGNAL</string>
<string name="ConversationListActivity_signal_needs_contacts_permission_in_order_to_search_your_contacts_but_it_has_been_permanently_denied">El Signal necessita el permís de l\'aplicació dels contactes per tal de cercar-ne els vostres, però s\'ha denegat permanentment. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi els contactes.</string>
<string name="conversation_activity__enable_signal_messages">ACTIVA ELS MISSATGES DEL SIGNAL</string>
<string name="SQLCipherMigrationHelper_migrating_signal_database">Migració de la base de dades del Signal</string>
<string name="PushDecryptJob_new_locked_message">Missatge blocat nou</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Desbloqueu-ho per veure els missatges pendents</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Desbloca per completar l\'actualització</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Si us plau, desbloqueu el Signal per completar l\'actualització.</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Contrasenya de la còpia de seguretat</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Les còpies de seguretat es desaran a l\'emmagatzematge extern i s\'encriptaran amb la contrasenya següent. Heu de tenir aquesta contrasenya per tal de restaurar una còpia de seguretat.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">He anotat aquesta contrasenya. Sense, no podré restaurar cap còpia de seguretat.</string>
@ -1654,18 +1628,18 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="RegistrationActivity_restore_your_messages_and_media_from_a_local_backup">Restaureu els missatges i els continguts multimèdia des d\'una còpia de seguretat local. Si no ho feu ara, no ho podreu fer més tard.</string>
<string name="RegistrationActivity_backup_size_s">Mida de la còpia de seguretat: %s</string>
<string name="RegistrationActivity_backup_timestamp_s">Marca horària de la còpia de seguretat: %s</string>
<string name="BackupDialog_enable_local_backups">Voleu habilitar les còpies de seguretat locals?</string>
<string name="BackupDialog_enable_backups">Habilita les còpies de seguretat</string>
<string name="BackupDialog_enable_local_backups">Voleu activar les còpies de seguretat locals?</string>
<string name="BackupDialog_enable_backups">Activa les còpies de seguretat</string>
<string name="BackupDialog_please_acknowledge_your_understanding_by_marking_the_confirmation_check_box">Si us plau, reconeixeu que ho heu entès marcant la casella de confirmació.</string>
<string name="BackupDialog_delete_backups">Voleu suprimir les còpies de seguretat?</string>
<string name="BackupDialog_disable_and_delete_all_local_backups">Voleu inhabilitar i suprimir totes les còpies de seguretat locals?</string>
<string name="BackupDialog_disable_and_delete_all_local_backups">Voleu desactivarr i suprimir totes les còpies de seguretat locals?</string>
<string name="BackupDialog_delete_backups_statement">Suprimeix les còpies de seguretat</string>
<string name="BackupDialog_copied_to_clipboard">Copiat al porta-retalls</string>
<string name="BackupDialog_enter_backup_passphrase_to_verify">Escriviu la contrasenya de còpia de seguretat per verificar-la.</string>
<string name="BackupDialog_verify">Verificació</string>
<string name="BackupDialog_you_successfully_entered_your_backup_passphrase">Heu escrit correctament la contrasenya de còpia de seguretat.</string>
<string name="BackupDialog_passphrase_was_not_correct">La contrasenya no és correcta.</string>
<string name="ChatsPreferenceFragment_signal_requires_external_storage_permission_in_order_to_create_backups">El Signal necessita el permís de l\'emmagatzematge extern per tal de crear còpies de seguretat. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i habiliteu-hi l\'emmagatzematge.</string>
<string name="ChatsPreferenceFragment_signal_requires_external_storage_permission_in_order_to_create_backups">El Signal necessita el permís de l\'emmagatzematge extern per tal de crear còpies de seguretat. Si us plau, continueu cap al menú de configuració de l\'aplicació, seleccioneu Permisos i activeu-hi l\'emmagatzematge.</string>
<string name="ChatsPreferenceFragment_last_backup_s">Darrera còpia de seguretat: %s</string>
<string name="ChatsPreferenceFragment_in_progress">En curs</string>
<string name="LocalBackupJob_creating_backup">Es crea una còpia de seguretat…</string>
@ -1695,7 +1669,7 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="registration_lock_dialog_view__confirm_pin">Confirmeu-lo</string>
<string name="registration_lock_reminder_view__enter_your_registration_lock_pin">Escriviu el PIN de bloqueig del registre</string>
<string name="registration_lock_reminder_view__enter_pin">Escriviu el PIN</string>
<string name="preferences_app_protection__enable_a_registration_lock_pin_that_will_be_required">Habiliteu un PIN de bloqueig de registre que es demanarà per tornar a registrar aquest número de telèfon al Signal.</string>
<string name="preferences_app_protection__enable_a_registration_lock_pin_that_will_be_required">Activeu un PIN de bloqueig de registre que es demanarà per tornar a registrar aquest número de telèfon al Signal.</string>
<string name="preferences_app_protection__registration_lock_pin">PIN de bloqueig del registre</string>
<string name="preferences_app_protection__registration_lock">Bloqueig del registre</string>
<string name="RegistrationActivity_you_must_enter_your_registration_lock_PIN">Heu d\'escriure el PIN de bloqueig del registre</string>
@ -1707,18 +1681,18 @@ S\'ha rebut un missatge d\'intercanvi de claus per a una versió del protocol no
<string name="RegistrationActivity_oh_no">Oh, no!</string>
<string name="RegistrationActivity_registration_of_this_phone_number_will_be_possible_without_your_registration_lock_pin_after_seven_days_have_passed">El registre d\'aquest número de telèfon serà possible sense el PIN de bloqueig del registre 7 dies després des de l\'últim cop que el número es va usar al Signal. Us manquen %d dies.</string>
<string name="RegistrationActivity_registration_lock_pin">PIN de bloqueig del registre</string>
<string name="RegistrationActivity_this_phone_number_has_registration_lock_enabled_please_enter_the_registration_lock_pin">Aquest número de telèfon té el bloqueig de registre habilitat. Si us plau, escriviu el PIN de bloqueig del registre.</string>
<string name="RegistrationLockDialog_registration_lock_is_enabled_for_your_phone_number">El bloqueig de registre està habilitat per al vostre número de telèfon. Per a ajudar-vos a memoritzar el PIN de bloqueig de registre, el Signal us demanarà periòdicament que el confirmeu.</string>
<string name="RegistrationActivity_this_phone_number_has_registration_lock_enabled_please_enter_the_registration_lock_pin">Aquest número de telèfon té el bloqueig de registre activat. Si us plau, escriviu el PIN de bloqueig del registre.</string>
<string name="RegistrationLockDialog_registration_lock_is_enabled_for_your_phone_number">El bloqueig de registre està activat per al vostre número de telèfon. Per a ajudar-vos a memoritzar el PIN de bloqueig de registre, el Signal us demanarà periòdicament que el confirmeu.</string>
<string name="RegistrationLockDialog_i_forgot_my_pin">He oblidat el PIN.</string>
<string name="RegistrationLockDialog_forgotten_pin">PIN oblidat?</string>
<string name="RegistrationLockDialog_registration_lock_helps_protect_your_phone_number_from_unauthorized_registration_attempts">El bloqueig de registre ajuda a protegir el número de telèfon d\'intents de registre no autoritzats. Aquesta funció es pot inhabilitar en qualsevol moment a la configuració de privadesa del Signal.</string>
<string name="RegistrationLockDialog_registration_lock_helps_protect_your_phone_number_from_unauthorized_registration_attempts">El bloqueig de registre ajuda a protegir el número de telèfon d\'intents de registre no autoritzats. Aquesta funció es pot desactivar en qualsevol moment a la configuració de privadesa del Signal.</string>
<string name="RegistrationLockDialog_registration_lock">Bloqueig del registre</string>
<string name="RegistrationLockDialog_enable">Habilita</string>
<string name="RegistrationLockDialog_enable">Activa</string>
<string name="RegistrationLockDialog_the_registration_lock_pin_must_be_at_least_d_digits">El PIN de bloqueig del registre ha de tenir com a mínim %d dígits.</string>
<string name="RegistrationLockDialog_the_two_pins_you_entered_do_not_match">Els dos PIN que heu introduït no coincideixen.</string>
<string name="RegistrationLockDialog_error_connecting_to_the_service">Error en connectar al servei</string>
<string name="RegistrationLockDialog_disable_registration_lock_pin">Voleu inhabilitar el PIN de bloqueig del registre?</string>
<string name="RegistrationLockDialog_disable">Inhabilita</string>
<string name="RegistrationLockDialog_disable_registration_lock_pin">Voleu desactivar el PIN de bloqueig del registre?</string>
<string name="RegistrationLockDialog_disable">Desactiva</string>
<string name="RegistrationActivity_pin_incorrect">PIN incorrecte</string>
<string name="RegistrationActivity_you_have_d_tries_remaining">Us resten %d intents.</string>
<string name="preferences_chats__backups">Còpies de seguretat</string>

View File

@ -375,34 +375,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Sdílet s</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Vícero příloh je podporováno pouze pro obrázky a videa</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Vítejte v Signalu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure a RedPhone jsou nyní jednou platformou pro důvěrnou komunikaci: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Vítejte v Signalu!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure je nyní Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure a RedPhone jsou nyní jednou aplikací: Signal. Klepněte pro prozkoumání možností.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Přivítejte šifrované video hovory.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal nyní podporuje šifrované video hovory. Začněte volat přes Signal jako obvykle, klepněte na video tlačítko a zamávejte na pozdrav.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal nyní podporuje šifrované video hovory.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal nyní podporuje šifrované video hovory. Klepněte pro prozkoumání možností.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Připraven na portrét?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Teď můžete sdílet vaši profilovou fotografii a jméno s vašimi přáteli na Signalu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal profily jsou tady</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Představujeme indikátory psaní.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Nyní si můžete nastavit, aby bylo vidět, že se právě píše zpráva.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Chcete je nyní povolit?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Indikátory psaní jsou zde</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Povolit indikátory psaní.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Zapnout indikátory psaní</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Ne díky</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Představujeme náhledy odkazu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Volitelné náhledy odkazu jsou nyní podporovány na některých populárních internetových stránkách.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Tuto funkcionalitu můžete kdykoli zakázat či povolit v Nastavení Signalu (Soukromí &gt; Odesílat náhledy odkazu).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Rozumím</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Představujeme nálepky</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Proč užívat slova, když můžete poslat nálepku?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Proč užívat slova, když můžete poslat nálepku? Klepněte na tuto ikonku na vaší klávesnici:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Začínáme</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Načítám zprávu…</string>
<!--GcmRefreshJob-->
@ -1720,8 +1692,6 @@ Obdržen požadavek na výměnu klíčů pro neplatnou verzi protokolu.
<string name="SQLCipherMigrationHelper_migrating_signal_database">Přesouvám Signal databázi</string>
<string name="PushDecryptJob_new_locked_message">Nová uzamčená zpráva</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Pro zobrazení čekajících zpráv odemkněte</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Odemknout Signal, aby se dokončila akualizace</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Prosím odemkněte Signal, aby se dokončila aktualizace.</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Heslo pro zálohy</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Zálohy budou uloženy na externí úložiště a zašifrovány níže uvedeným heslem. Toto heslo musíte znát, abyste mohli zálohu obnovit.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Heslo jsem si zapsal. Bez něj nebudu schopen obnovit data ze zálohy.</string>

View File

@ -377,34 +377,6 @@ Send neges heb ei ddiogelu?</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">Rhannu â</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Dim ond ar gyfer delweddau a fideos y mae atodiadau lluosog yn cael eu cynnal</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Croeso i Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">Mae TextSecure a RedPhone bellach yn un negesydd preifat ar gyfer pob sefyllfa: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Croeso i Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure yw Signal nawr.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">Mae TextSecure a RedPhone nawr yn un app: Signal. Tapiwch i\'w weld.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Dywedwch helo i alwadau fideo diogel.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Mae Signal nawr yn cynnal galwadau fideo diogel. Dechreuwch alwad Signal fel arfer, tapiwch y botwm fideo, a chwifio helo.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Mae Signal nawr yn cynnal galwad fideo diogel.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Mae Signal nawr yn cynnal galwad fideo diogel. Tapiwch i weld.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Barod ar gyfer eich llun agos?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Nawr gallwch chi rannu llun proffil ac enw gyda ffrindiau ar Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Mae proffiliau Signal yma</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Yn cyflwyno dangosyddion teipio.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Nawr gallwch chi ddewis gweld a rannu pryd mae negeseuon yn cael eu teipio.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Hoffech chi eu galluogi nawr?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Mae dangosyddion teipio yma</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Galluogi dangosyddion teipio</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Cychwyn y dangosydd teipio</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Dim diolch</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Yn cyflwyno rhagolygon dolenni.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Mae rhagolygon dolenni dewisol nawr yn cael eu cynnal ar gyfer rhai o\'r gwefannau mwyaf poblogaidd ar y rhyngrwyd.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Gallwch alluogi neu analluogi\'r nodwedd yng ngosodiadau Signal. (Preifatrwydd &gt; Anfon dolen rhagolwg).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Iawn, rwy\'n deall</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Yn cyflwyno sticeri</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Pam defnyddio geiriau pan allwch chi ddefnyddio sticeri?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Pam defnyddio geiriau pan allwch chi ddefnyddio sticeri? Tapiwch yr eicon hwn ar eich bysellfwrdd:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Amdani</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Estyn neges…</string>
<!--GcmRefreshJob-->
@ -612,6 +584,12 @@ Send neges heb ei ddiogelu?</string>
<item quantity="many">%1$d aelod</item>
<item quantity="other">%1$d aelod</item>
</plurals>
<plurals name="MessageRequestProfileView_members_and_invited">
<item quantity="one"> %1$daelod (+ %2$d wedi eu gwahodd)</item>
<item quantity="two">%1$daelod (+ %2$d wedi eu gwahodd)</item>
<item quantity="many"> %1$d aelod (+ %2$dwedi eu gwahodd)</item>
<item quantity="other"> %1$d aelod (+ %2$d wedi eu gwahodd)</item>
</plurals>
<plurals name="MessageRequestProfileView_member_of_others">
<item quantity="one">%d arall</item>
<item quantity="two">%d RLL</item>
@ -1723,8 +1701,6 @@ Send neges heb ei ddiogelu?</string>
<string name="SQLCipherMigrationHelper_migrating_signal_database">Mudo cronfa ddata Signal</string>
<string name="PushDecryptJob_new_locked_message">Neges wedi\'i gloi newydd</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Datgloi i weld negeseuon sy\'n aros</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Datgloi i gwblhau\'r diweddariad</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Datgloi Signal i gwblhau\'r diweddariad</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Cyfrinymadrodd cadw wrth gefn</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Bydd copïau wrth gefn yn cael eu cadw i storfa allanol ac wedi\'u hamgryptio gyda\'r cyfrinymadrodd isod. Rhaid i chi fod â\'r cyfrinymadrodd hwn er mwyn adfer y copi wrth gefn.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Rwy wedi ysgrifennu\'r cyfrinymadrodd hwn i lawr. Hebddo, fydda i ddim yn gallu adfer copi wrth gefn.</string>

View File

@ -348,34 +348,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Del med</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Det er kun muligt at vedhæfte flere billeder og videoer</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Velkommen til Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure og RedPhone er nu én privat messenger, til enhver lejlighed: Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Velkommen til Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure er nu Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure og RedPhone er nu én app: Signal. Tap for at udforske</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Sig hej til sikre videoopkald</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal understøtter nu sikre videoopkald. Du skal bare starte et Signal opkald som normalt, tap på video knappen og vink goddag</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal understøtter nu sikre videoopkald</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal understøtter nu sikre videoopkald. Tap for at udforske</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Er du klar til et nærbilled?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Du kan nu dele dit profilbillede og navn med dine venner på Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal profiler er nu tilgængelige</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Introducerer skrive indikatorer</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Nu har du mulighed for at se og vise, når beskeder skrives</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Vil du aktivere det nu?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Skrive indikatorer er her</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Aktivér skrive indikatorer</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Aktivér skrive indikatorer</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Nej tak</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Introducere eksempelvisning for links</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Mulighed for eksempelvisning af links, er nu understøttet for de fleste populære sider på nettet</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Du kan når som helst aktivere eller deaktivere funktionaliteten, under Signal, Indstillinger (Privatliv -&gt; Send link eksempelvisning)</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Modtaget</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Inklusiv klistermærker</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Hvorfor bruge ord når du kan bruge klistermærker?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Hvorfor bruge ord når du kan bruge klistermærker? Tap på ikonet her på dit tastatur:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Kom igang</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Modtager besked…</string>
<!--GcmRefreshJob-->
@ -1601,8 +1573,6 @@ Modtog en nøgle besked, for en ugyldig protokol-version.
<string name="SQLCipherMigrationHelper_migrating_signal_database">Migrerer Signals database</string>
<string name="PushDecryptJob_new_locked_message">Ny låst besked</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Lås op for at læse indkommende beskeder</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Lås op for at fuldføre opdatering</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Lås venligst Signal op, for at fuldføre opdateringen</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Backup kodeord</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Backups vil blive gemt til ekstern placering og krypteret med koden herunder. Du skal kende denne kode for at kunne genskabe fra backup\'en</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Jeg har nedskrevet koden. Uden den vil jeg ikke have mulighed for at genskabe fra backup</string>

View File

@ -347,34 +347,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Teilen mit</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Mehrere Anhänge werden nur für Bilder und Videos unterstützt</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Willkommen bei Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure und RedPhone sind jetzt gemeinsam ein sicherer Messenger für jede Situation: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Willkommen bei Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure heißt jetzt Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure und RedPhone sind jetzt eine gemeinsame App: Signal. Antippen, um mehr zu erfahren.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Freue dich auf sichere Videoanrufe!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal unterstützt jetzt sichere Videoanrufe. Beginne einfach einen Signal-Anruf wie sonst auch, tippe die Kameraschaltfläche an und winke deinem Kontakt zu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal unterstützt jetzt sichere Videoanrufe.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal unterstützt jetzt sichere Videoanrufe. Zum Erkunden antippen.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Bereit für eine Nahaufnahme?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Jetzt kannst du bei Signal ein Profilfoto und einen Profilnamen mit Freunden teilen.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Profile für Signal sind da</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Einführung von Tipp-Indikatoren</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Du kannst jetzt optional sehen und teilen, wann Nachrichten eingetippt werden.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Möchtest du diese Funktion aktivieren?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Tipp-Indikatoren sind da</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Tipp-Indikatoren aktivieren</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Tipp-Indikatoren einschalten</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Nein, danke</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Einführung von Link-Vorschauen</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Optionale Link-Vorschauen werden nun für einige der beliebtesten Internetsites unterstützt.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Du kannst diese Funktion jederzeit in den Signal-Einstellungen aus oder einschalten (Datenschutz → Link-Vorschauen senden).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Verstanden</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Einführung von Stickern</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Warum Worte, wenn du auch Sticker verwenden kannst?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Warum Worte, wenn du auch Sticker verwenden kannst? Tippe auf dieses Symbol deiner Tastatur:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Los gehts</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Nachricht wird abgerufen </string>
<!--GcmRefreshJob-->
@ -402,7 +374,7 @@
<string name="GroupCreateActivity_loading_group_details">Gruppendetails werden geladen </string>
<string name="GroupCreateActivity_youre_already_in_the_group">Du bist bereits in der Gruppe.</string>
<!--GroupShareProfileView-->
<string name="GroupShareProfileView_share_your_profile_name_and_photo_with_this_group">Deinen Profilnamen und dein Profilfoto mit dieser Gruppe teilen?</string>
<string name="GroupShareProfileView_share_your_profile_name_and_photo_with_this_group">Profilname und -foto mit dieser Gruppe teilen?</string>
<string name="GroupShareProfileView_do_you_want_to_make_your_profile_name_and_photo_visible_to_all_current_and_future_members_of_this_group">Möchtest du deinen Profilnamen und dein Profilfoto für alle derzeitigen und zukünftigen Mitglieder dieser Gruppe sichtbar machen?</string>
<string name="GroupShareProfileView_make_visible">Sichtbar machen</string>
<!--GroupMembersDialog-->
@ -566,6 +538,10 @@
<item quantity="one">%1$d Mitglied</item>
<item quantity="other">%1$d Mitglieder</item>
</plurals>
<plurals name="MessageRequestProfileView_members_and_invited">
<item quantity="one">%1$d Mitglied (+%2$d eingeladen)</item>
<item quantity="other">%1$d Mitglieder (+%2$d eingeladen)</item>
</plurals>
<plurals name="MessageRequestProfileView_member_of_others">
<item quantity="one">%d anderer</item>
<item quantity="other">%d andere</item>
@ -1126,7 +1102,7 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangen</s
</plurals>
<string name="GroupUtil_group_name_is_now">Gruppenname lautet jetzt »%1$s«.</string>
<!--profile_group_share_view-->
<string name="profile_group_share_view__make_your_profile_name_and_photo_visible_to_this_group">Deinen Profilnamen und dein Profilfoto für diese Gruppe sichtbar machen?</string>
<string name="profile_group_share_view__make_your_profile_name_and_photo_visible_to_this_group">Antippen, um deinen Profilnamen und dein Profilfoto für diese Gruppe sichtbar zu machen</string>
<!--prompt_passphrase_activity-->
<string name="prompt_passphrase_activity__unlock">Entsperren</string>
<!--prompt_mms_activity-->
@ -1201,7 +1177,7 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangen</s
<string name="AndroidManifest_remove_photo">Foto entfernen</string>
<!--Message Requests Megaphone-->
<string name="MessageRequestsMegaphone__message_requests">Unterhaltungsanfragen</string>
<string name="MessageRequestsMegaphone__users_can_now_choose_to_accept">Nutzer können nun wählen, ob sie eine neue Unterhaltung zulassen möchten. Profilnamen informieren darüber, wer geschrieben hat.</string>
<string name="MessageRequestsMegaphone__users_can_now_choose_to_accept">Du kannst nun wählen, ob du eine neue Unterhaltung zulassen möchtest. Profilnamen lassen dich wissen, wer dir schreibt.</string>
<string name="MessageRequestsMegaphone__add_profile_name">Profilname hinzufügen</string>
<string name="MessageRequestsMegaphone__new_message_requests">Neu: Unterhaltungsanfragen</string>
<string name="MessageRequestsMegaphone__add_name">Name hinzufügen</string>
@ -1626,8 +1602,6 @@ Schlüsselaustausch-Nachricht für eine ungültige Protokollversion empfangen</s
<string name="SQLCipherMigrationHelper_migrating_signal_database">Signal-Datenbank wird migriert </string>
<string name="PushDecryptJob_new_locked_message">Neue gesperrte Nachricht</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Entsperren, um ausstehende Nachrichten anzuzeigen</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Entsperren, um Aktualisierung abzuschließen</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Entsperre bitte Signal, um die Aktualisierung abzuschließen</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Sicherungspassphrase</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Datensicherungen werden im Gerätespeicher gespeichert und mit der unten genannten Passphrase verschlüsselt. Die Passphrase ist notwendig, um die Sicherung später wiederherzustellen.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Ich habe mir diese Passphrase notiert. Ohne sie können keine Sicherungen wiederhergestellt werden.</string>

File diff suppressed because one or more lines are too long

View File

@ -347,34 +347,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Kunhavigi kun</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Pluraj kunsendaĵoj nur eblas kun bildoj kaj videaĵoj</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Bonvenon al Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">„TextSecure“ kaj „RedPhone“ nun estas unu privata mesaĝilo por ĉiu okazo: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Bonvenon al Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">„TextSecure“ nun estas Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">„TextSecure“ kaj „RedPhone“ nun estas unu aplikaĵo: Signal. Tuŝetu por esplori.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Diru saluton al sekuraj vidalvokoj.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal nun subtenas sekurajn videajn alvokojn. Simple komencigu Signal-an alvokon kiel kutime, tuŝetu la videan butonon, kaj mansalutas.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal nun subtenas sekuran vidalvokadon.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal nun subtenas sekuran vidalvokadon. Tuŝetu por esplori.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Ĉu preta je via deproksima foto?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Nun, vi povas kunhavigi viajn profilfoton kaj nomon kun amikoj ĉe Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal-aj profiloj estas ĉi tie</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Enkonduko de la tajp-indikiloj.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">De nun, vi povas malnepre vidi kaj vidigi, kiam mesaĝoj estas skribiĝantaj.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Ĉu vi volas, ŝalti tiujn tajp-indikilojn tuj?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Tajp-indikiloj alvenas</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Ŝalti tajp-indikilojn</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Ŝalti tajp-indikilojn</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Ne, dankon</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Jen la antaŭrigardo de ligiloj</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Opciaj antaŭrigardoj de ligiloj disponeblas nun por kelkaj el la plej popularaj retejoj.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Vi povas ŝalti aŭ malŝalti tiun funkcion en viaj Signal-agordoj (Privateco → Sendi antaŭrigardojn de ligilo).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Bone</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Jen la glumarkoj</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Kial uzi vortojn, kiam vi povas uzi glumarkojn?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Kial uzi vortojn, kiam vi povas uzi glumarkojn? Tuŝetu tiun piktogramon en via klavaro:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Daŭrigi</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Ricevo de mesaĝo…</string>
<!--GcmRefreshJob-->
@ -1636,8 +1608,6 @@ Ricevis mesaĝon pri interŝanĝo de ŝlosiloj por nevalida protokola versio.
<string name="SQLCipherMigrationHelper_migrating_signal_database">Transigo de la Signal-datumbazo</string>
<string name="PushDecryptJob_new_locked_message">Nova ŝlosita mesaĝo</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Malŝlosi por vidi pritraktotajn mesaĝojn</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Malŝlosi por fini ĝisdatigon</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Bv. malŝlosi Signal-on por fini ĝisdatigon</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Savkopii pasfrazon</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Savkopioj konserviĝos al ekstera konservejo kaj ĉifriĝos per la suba pasfrazo. Vi devos havi tiun ĉi pasfrazon por restaŭri savkopion.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Mi skribis tiun ĉi pasfrazon. Sen ĝi, mi ne povos restaŭri savkopion.</string>

View File

@ -347,34 +347,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Compartir con</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Sólo fotos y vídeos se pueden enviar como múltiples adjuntos</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Bienvenido a Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure y RedPhone son ahora una sola aplicación de mensajería privada, para cualquier situación: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">¡Bienvenido a Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure es ahora Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure y RedPhone son ahora una sola aplicación: Signal. Toca para explorar.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Di hola a las vídeollamadas seguras.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal ofrece ahora vídeollamadas seguras. Simplemente inicia una llamada de Signal con normalidad, toca el botón de vídeo, y saluda con la mano.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal ofrece ahora vídeollamadas seguras.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal ofrece ahora vídeollamadas seguras. Toca para saber más.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">¿Listo para tu retrato?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Ahora puedes compartir la foto y nombre de perfil con contactos de Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Los perfiles de Signal han llegado</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">¡Los indicadores de tecleo han llegado!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Ahora puedes visualizar y compartir de manera opcional cuando tú o tus contactos están escribiendo en el chat.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">¿Deseas activar la opción ahora?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Los indicadores de tecleo han llegado</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Activar indicador de tecleo</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Activar indicador de tecleo</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">No, gracias</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">¡Por fin, vista previa de enlaces!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Ahora está disponible la vista previa de enlaces para algunos de los sitios más populares de Internet.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Puedes desactivar o activar esta opción en cualquier momento desde el menú de ajustes de Signal (Privacidad &gt; Enviar previsualizaciones).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Entendido</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">¡Los cromos (stickers) han llegado!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">¿Por qué usar palabras si puedes usar cromos (stickers)?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">¿Por qué usar palabras si puedes usar cromos? Toca este icono en tu teclado:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">¡Vamos!</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Recuperando mensaje …</string>
<!--GcmRefreshJob-->
@ -566,6 +538,10 @@
<item quantity="one">%1$d participante</item>
<item quantity="other">%1$d participantes</item>
</plurals>
<plurals name="MessageRequestProfileView_members_and_invited">
<item quantity="one">%1$d participante (+%2$d pendiente)</item>
<item quantity="other">%1$d participantes (+%2$d pendientes)</item>
</plurals>
<plurals name="MessageRequestProfileView_member_of_others">
<item quantity="one">%d otro</item>
<item quantity="other">%d otros</item>
@ -1638,8 +1614,6 @@ Se recibió un mensaje de intercambio de claves para una versión no válida del
<string name="SQLCipherMigrationHelper_migrating_signal_database">Migrar base de datos de Signal</string>
<string name="PushDecryptJob_new_locked_message">Nuevo mensaje bloqueado</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Desbloquear para ver mensajes pendientes</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Desbloquear para completar actualización</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Por favor, desbloquea Signal para completar la actualización</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Clave de la copia de seguridad</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Las copias de seguridad se guardarán en una unidad de almacenamiento externo y se cifrarán con la clave de debajo. Necesitas esta clave para poder restaurar una copia de seguridad.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">He anotado esta clave. Sé que sin ella, no podré restaurar la copia de seguridad.</string>

View File

@ -326,34 +326,6 @@
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">See seade ei toeta Play teenuseid. Koputa, et keelata süsteemi aku optimeerimine, kuna see ei lase Signalil sõnumeid hankida, kui seade on ebaaktiivne.</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">Jaga inimesega</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Tere tulemast Signalisse.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure ja RedPhone on nüüd ühise sõnumirakenduse all, igaks olukorraks: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Tere tulemast Signalisse!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure on nüüd Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure ja RedPhone on nüüd ühe rakenduse all: Signal. Koputa avastamiseks.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Tervita turvalisi videokõnesid.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal toetab nüüd turvalisi videokõnesid. Lihtsalt alusta Signali kõnet nagu tavaliselt, koputa videonuppu ja lehvita kontaktile.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal toetab nüüd turvalisi videokõnesid.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal toetab nüüd turvalisi videokõnesid. Koputa avastamiseks.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Oled valmis oma lähivõtteks?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Nüüd sa saad Signalis sõpradega jagada profiilipilti ja -nime</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signali profiilid on kohal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Tutvustame kirjutamisindikaatoreid.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Nüüd on võimalik näha ja näidata, et sõnumeid sisestatakse.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Kas soovid need kohe lubada?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Kirjutamisindikaatorid on kohal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Luba kirjutamisindikaatorid</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Lülita kirjutamisindikaatorid sisse</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Tänan, ei</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Tutvustame linkide eelvaateid.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Valikulised linkide eelvaated on nüüd toetatud populaarseimate saitide puhul.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Sa saad seda funktsiooni igal ajal keelata ja lubada oma Signali seadetes (Privaatsus &gt; Saada linkide eelvaateid).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Sain aru</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Tutvustame kleepse</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Miks kasutada sõnu, kui saab kasutada kleepse?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Miks kasutada sõnu, kui saab kasutada kleepse?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Läksime</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Sõnumi hankimine…</string>
<!--GcmRefreshJob-->
@ -1535,8 +1507,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Migreerin Signali andmebaasi</string>
<string name="PushDecryptJob_new_locked_message">Uus lukustatud sõnum</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Ava lukk ootel sõnumite vaatamiseks</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Ava lukk uuenduse lõpuleviimiseks</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Palun lukusta Signal lahti uuenduse lõpuleviimiseks</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Varunduse salaväljend</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Varundused salvestatakse välismällu ja krüptitakse valitud salaväljendiga. Sul peab see salaväljend olemas olema, et taastada antud varundust.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Ma olen salaväljendi üles kirjutanud. Ilma selleta ei saa ma varundust taastada.</string>

View File

@ -344,34 +344,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Norekin konpartitu</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Eranskin anitzak bakarrik irudi eta bideoetan onartzen dira</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Ongi etorri Signalera!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure eta RedPhone mezulari pribatua bakar bat dira orain, edozein egoeratako.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Ongi etorri Signalera!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure orain Signal da.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure eta RedPhone aplikazio bera da orain: Signal. Ukitu arakatzeko.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Kaixo esan bideodei seguruei</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal orain bideodei seguruak egiteko gai da. Besterik gabe, hasi Signal dei normal bat, ukitu bideo botoia eta kaixo esan. </string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal orain bideodei seguruak egiteko gai da.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal orain bideodei seguruak egiteko gai da. Ukitu argibide gehiago lortzeko.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Prest zaude zure gertuko argazkia hartzeko?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Signaleko zure lagunekin profileko argazkia eta izena partekatu ditzakezu</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal profilak heldu dira</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Idazketa jakinarazleak aurkezten.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Orain aukeran mezuak idazten ari direla erakutsi eta ikusi dezakezu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Aktibatu nahi al duzu orain?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Idazketa jakinarazleak heldu dira</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Gaitu idazketa jakinarazleak</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Aktibatu idazketa jakinarazleak</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Ez, eskerrik asko</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Loturen aurrebistak aurkezten.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Loturen aurrebistak hautazkoak dira eta Interneteko hainbat zerbitzurekin funtzionatzen dute.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Nahi duzunean, aukera hau aktibatu eta desaktibatu dezakezu Signal aplikazioaren ezarpenetan (Pribatutasuna &gt; Loturen aurrebistak bidali).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Ulertuta</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Eranskailuen aurkezpena</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Zergatik erabili hitzak eranskailuak erabili ditzakezuenan?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Zertarako erabili hitzak eranskailuak erabili ditzakezunean? Ukitu ondoko ikonoa zure teklatuan:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Goazen</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Mezu bat berreskuratzen…</string>
<!--GcmRefreshJob-->
@ -1621,8 +1593,6 @@ Inportatu \'SMSBackup and Restorekin\' bateragarria den enkriptatu gabeko babesk
<string name="SQLCipherMigrationHelper_migrating_signal_database">Signal-en datu-basea migratzen</string>
<string name="PushDecryptJob_new_locked_message">Blokeatutako mezu berria</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Desblokeatu begiratu gabeko mezuak ikusteko</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Desblokeatu eguneratzea burutzeko</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Desblokeatu Signal eguneratzea burutzeko</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Babeskopiaren pasaesaldia</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Babeskopiak kanpoko memoria batean gordeko dira beheko pasaesaldiarekin enkriptatuta. Pasaesaldi hau eduki behar duzu babeskopia bat berreskuratzeko.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Pasaesaldia gorde dut. Hori gabe, ezin izango dut babeskopia bat berreskuratu.</string>

View File

@ -347,34 +347,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">اشتراک گذاری با</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">انتخاب چندگانهٔ پیوست‌ها فقط برای عکس‌ها و ویدئوها پشتیبانی می‌شود.</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">به Signal خوش آمدید.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure و RedPhone اکنون یک پیام‌رسان خصوصی، برای همهٔ مواقع هستند: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">به Signal خوش آمدید!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure اکنون به Signal تغییر نام یافته است.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure و RedPhone اکنون یک برنامه هستند: Signal. برای اطلاعات بیشتر ضربه بزنید.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">به تماس‌های تصویری امن سلام کنید.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal اکنون از تماس تصویری امن پشتیبانی می‌کند. یک تماس عادی Signal شروع کنید، روی دکمهٔ ویدئو ضربه بزنید و برای یکدیگر دست تکان دهید.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal اکنون تماس‌های تصویری امن را پشتیبانی می‌کند.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal اکنون از تماس تصویری امن پشتیبانی می‌کند. برای اطلاعات بیشتر ضربه بزنید.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">برای نمای نزدیک خود آماده‌اید؟</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">حال می‌‌توانید عکس پروفایل و نام خود را با دوستان روی Signal به اشتراک بگذارید</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">نمایه‌های Signal اینجا هستند</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">معرفی نشانگرهای نوشتن</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">اکنون می‌توانید زمان نوشته شدن پیام‌ها را ببینید و با دیگران به اشتراک بگذارید.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">می‌‌خواهید آن‌ها را همین حالا فعال کنید؟</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">نشانگر‌های نوشتن اینجا هستند</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">فعال‌سازی نشانگرهای نوشتن</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">فعال‌کردن نشانگرهای نوشتن</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">نه ممنون</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">معرفی پیش‌نمایش‌های پیوند</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">پیش‌نمایش‌های پیوند اکنون به صورت اختیاری برای برخی از شناخته‌شده‌ترین سایت‌ها روی اینترنت پشتیبانی می‌شوند.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">شما هر موقع که بخواهید می‌توانید این ویژگی را در تنظیمات Signal فعال یا غیرفعال کنید (حریم خصوصی ← ارسال پیش‌نمایش‌های پیوند).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">فهمیدم</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">معرفی استیکرها</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">چرا از کلمات استفاده کنیم زمانی که می‌توانیم از استیکر استفاده کنیم؟</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">چرا از کلمات استفاده کنیم زمانی که می‌توانیم از استیکر استفاده کنیم؟ بر روی این نگارک روی صفحه‌کلید خود ضربه بزنید:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">بزن بریم</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">در حال بازیابی یک پیام…</string>
<!--GcmRefreshJob-->
@ -628,14 +600,14 @@
<!--RecipientPreferencesActivity-->
<string name="RecipientPreferenceActivity_block_this_contact_question">مسدود کردن این مخاطب؟</string>
<string name="RecipientPreferenceActivity_you_will_no_longer_receive_messages_and_calls_from_this_contact">شما ديگر هیچ تماس و پيامی از این مخاطب دريافت نخواهید کرد.</string>
<string name="RecipientPreferenceActivity_block_and_leave_group">مسدود سازی و ترک این گروه؟</string>
<string name="RecipientPreferenceActivity_block_group">مسدود سازی این گروه؟</string>
<string name="RecipientPreferenceActivity_block_and_leave_group">مسدودسازی و ترک این گروه؟</string>
<string name="RecipientPreferenceActivity_block_group">مسدودسازی این گروه؟</string>
<string name="RecipientPreferenceActivity_block_and_leave_group_description">شما دیگر از این گروه پیام یا به‌روزرسانی دریافت نخواهید کرد.</string>
<string name="RecipientPreferenceActivity_block">مسدود سازی</string>
<string name="RecipientPreferenceActivity_unblock_this_contact_question">رفع مسدودیت این مخاطب؟</string>
<string name="RecipientPreferenceActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact">شما مجددا قادر به دریافت پیام و تماس از این مخاطب خواهید بود.</string>
<string name="RecipientPreferenceActivity_you_will_once_again_be_able_to_receive_messages_and_calls_from_this_contact">شما دوباره قادر به دریافت پیام و تماس از این مخاطب خواهید بود.</string>
<string name="RecipientPreferenceActivity_unblock_this_group_question">رفع مسدودیت این گروه؟</string>
<string name="RecipientPreferenceActivity_unblock_this_group_description">اعضا موجود قادر خواهند بود مجددا شما را به گروه اضافه کنند.</string>
<string name="RecipientPreferenceActivity_unblock_this_group_description">اعضا فعلی قادر خواهند بود دوباره شما را به گروه اضافه کنند.</string>
<string name="RecipientPreferenceActivity_error_leaving_group">خطا در ترک گروه</string>
<string name="RecipientPreferenceActivity_unblock">رفع مسدودیت</string>
<string name="RecipientPreferenceActivity_enabled">فعال</string>
@ -653,7 +625,7 @@
<string name="RedPhone_recipient_unavailable">گیرنده در دسترس نیست</string>
<string name="RedPhone_network_failed">خرابی شبکه!</string>
<string name="RedPhone_number_not_registered">شماره ثبت نشده است!</string>
<string name="RedPhone_the_number_you_dialed_does_not_support_secure_voice">شماره ای که گرفتید از تماس امن پشتیبانی نمی کند!</string>
<string name="RedPhone_the_number_you_dialed_does_not_support_secure_voice">شمارهای که گرفتید از تماس امن پشتیبانی نمی کند!</string>
<string name="RedPhone_got_it">فهمیدم</string>
<!--RegistrationActivity-->
<string name="RegistrationActivity_select_your_country">کشور خود را انتخاب کنید</string>
@ -683,7 +655,7 @@
<item quantity="other">شما %d قدم از ارسال گزارش اشکال‌زدایی فاصله دارید.</item>
</plurals>
<string name="RegistrationActivity_we_need_to_verify_that_youre_human">ما باید تایید کنیم که شما یک انسان هستید.</string>
<string name="RegistrationActivity_failed_to_verify_the_captcha">عدم موفقیت در تایید کپچا</string>
<string name="RegistrationActivity_failed_to_verify_the_captcha">عدم موفقیت در تأیید کپچا</string>
<string name="RegistrationActivity_next">بعدی</string>
<string name="RegistrationActivity_continue">ادامه</string>
<string name="RegistrationActivity_continue_d_attempts_left">ادامه (%d کوشش باقی مانده است)</string>
@ -782,8 +754,8 @@
<string name="ThreadRecord_s_is_on_signal">%s به Signal پیوست!</string>
<string name="ThreadRecord_disappearing_messages_disabled">پیام های ناپدید شونده غیر فعال شدند</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">زمان پیام ناپدید شونده روی %s تنظیم شد</string>
<string name="ThreadRecord_safety_number_changed">شماره امنیتی تغییر یافت</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">شماره امنیتی شما با %s تغییر یافت.</string>
<string name="ThreadRecord_safety_number_changed">شمارهٔ امنیتی تغییر یافت</string>
<string name="ThreadRecord_your_safety_number_with_s_has_changed">شمارهٔ امنیتی شما با %s تغییر یافت.</string>
<string name="ThreadRecord_you_marked_verified">شما تایید شده علامت زدید</string>
<string name="ThreadRecord_you_marked_unverified">شما تایید نشده علامت زدید</string>
<string name="ThreadRecord_message_could_not_be_processed">پیام قابل پردازش نمی باشد</string>
@ -813,9 +785,9 @@
<string name="UsernameEditFragment_successfully_removed_username">نام کاربری با موفقیت حذف شد.</string>
<string name="UsernameEditFragment_encountered_a_network_error">خطای شبکه رخ داد.</string>
<string name="UsernameEditFragment_this_username_is_taken">این نام کاربری گرفته شده است.</string>
<string name="UsernameEditFragment_this_username_is_available">این نام کاربری در دسترس می باشد.</string>
<string name="UsernameEditFragment_this_username_is_available">این نام کاربری در دسترس است.</string>
<string name="UsernameEditFragment_usernames_can_only_include">نام‌های کاربری فقط می توانند شامل a-Z ،0-9 و _ باشند.</string>
<string name="UsernameEditFragment_usernames_cannot_begin_with_a_number">نام‌ های کاربری نمی توانند با یک عدد آغاز شوند.</string>
<string name="UsernameEditFragment_usernames_cannot_begin_with_a_number">نام‌های کاربری نمی‌توانند با عدد آغاز شوند.</string>
<string name="UsernameEditFragment_username_is_invalid">نام کاربری نامعتبر است.</string>
<string name="UsernameEditFragment_usernames_must_be_between_a_and_b_characters">نام‌های کاربری باید بین %1$d و %2$d کاراکتر باشند.</string>
<string name="UsernameEditFragment_other_signal_users_can_send_message_requests_to_your_unique_username">دیگر کاربران Signal می‌توانند از طریق نام کاربری و بدون نیاز به دانستن شمارهٔ همراه شما درخواستِ پیام ارسال کنند. انتخاب نام کاربری اختیاری است.</string>
@ -1063,7 +1035,7 @@
<item quantity="one">%d ساعت</item>
<item quantity="other">%d ساعت</item>
</plurals>
<string name="expiration_hours_abbreviated">%dس</string>
<string name="expiration_hours_abbreviated">%d ساعت</string>
<plurals name="expiration_days">
<item quantity="one">%d روز</item>
<item quantity="other">%d روز</item>
@ -1265,7 +1237,7 @@
<!--plurals.xml-->
<plurals name="hours_ago">
<item quantity="one">%dس</item>
<item quantity="other">%dس</item>
<item quantity="other">%d ساعت</item>
</plurals>
<!--preferences.xml-->
<string name="preferences__sms_mms">پیامک و فراپیام</string>
@ -1408,7 +1380,7 @@
<!--conversation_context_reacction-->
<string name="conversation_context__reaction_multi_select">انتخاب چندگانه</string>
<!--conversation_context_image-->
<string name="conversation_context_image__save_attachment">ذخیره پیوست</string>
<string name="conversation_context_image__save_attachment">ذخیره‌سازی پیوست</string>
<!--conversation_expiring_off-->
<string name="conversation_expiring_off__disappearing_messages">پیام‌های ناپدید شونده</string>
<!--conversation_expiring_on-->
@ -1418,8 +1390,8 @@
<!--conversation_list_batch-->
<string name="conversation_list_batch__menu_delete_selected">حذف انتخاب شده(ها)</string>
<string name="conversation_list_batch__menu_select_all">انتخاب همه</string>
<string name="conversation_list_batch_archive__menu_archive_selected">بایگانی انتخاب شده</string>
<string name="conversation_list_batch_unarchive__menu_unarchive_selected">خارج کردن از بایگانی انتخاب شده (ها)</string>
<string name="conversation_list_batch_archive__menu_archive_selected">بایگانی موارد انتخاب شده</string>
<string name="conversation_list_batch_unarchive__menu_unarchive_selected">خارج کردن موارد انتخاب شده از بایگانی</string>
<!--conversation_list-->
<string name="conversation_list_settings_shortcut">میانبر تنظیمات</string>
<string name="conversation_list_search_description">جستجو</string>
@ -1431,7 +1403,7 @@
<!--conversation_list_fragment-->
<string name="conversation_list_fragment__fab_content_description">مکالمه جدید</string>
<string name="conversation_list_fragment__open_camera_description">باز کردن دوربین</string>
<string name="conversation_list_fragment__give_your_inbox_something_to_write_home_about_get_started_by_messaging_a_friend">صندوق ورودی خود را پر کنید. اینکار را با پیام دادن به یک دوست می توانید شروع کنید.</string>
<string name="conversation_list_fragment__give_your_inbox_something_to_write_home_about_get_started_by_messaging_a_friend">صندوق ورودی خود را پر کنید. اینکار را با پیام دادن به یک دوست میتوانید شروع کنید.</string>
<!--conversation_secure_verified-->
<string name="conversation_secure_verified__menu_reset_secure_session">تنظیم مجدد نشست امن</string>
<!--conversation_muted-->
@ -1480,9 +1452,9 @@
<string name="reminder_header_push_title">فعال‌سازی پیام‌ها و تماس‌های Signal</string>
<string name="reminder_header_push_text">تجربهٔ ارتباطی خود را ارتقا دهید.</string>
<string name="reminder_header_invite_title">دعوت به Signal</string>
<string name="reminder_header_invite_text">مکالمه خود با %1$s را به مرحله بعد ببرید.</string>
<string name="reminder_header_invite_text">مکالمهٔ خود با %1$s را به مرحله بعد ببرید.</string>
<string name="reminder_header_share_title">دوستان خود را دعوت کنید!</string>
<string name="reminder_header_share_text">هر چه دوستان بیشتری از Signal استفاده کنند، بهتر خواهد شد.</string>
<string name="reminder_header_share_text">هر چه دوستان بیشتری از Signal استفاده کنند، بهتر می‌شود.</string>
<string name="reminder_header_service_outage_text">Signal با مشکلات فنی روبرو است. ما سخت در تلاش برای بازگردانی هرچه سریع‌تر سرویس هستیم.</string>
<string name="reminder_header_the_latest_signal_features_wont_work">آخرین قابلیت‌های Signal روی این نسخه از اندروید کار نخواهند کرد. لطفاً این دستگاه را ارتقا دهید تا به‌روزرسانی‌های بعدی Signal را دریافت کنید.</string>
<string name="reminder_header_progress">%%%1$d</string>
@ -1563,7 +1535,7 @@
<string name="KbsSplashFragment__create_your_pin">پین خود را ایجاد کنید</string>
<!--KBS Reminder Dialog-->
<string name="KbsReminderDialog__enter_your_signal_pin">پین Signal خود را وارد کنید</string>
<string name="KbsReminderDialog__to_help_you_memorize_your_pin">برای کمک به شما در به خاطر سپردن پین خود، ما به صورت دوره ای از شما خواهیم خواست تا آن را وارد کنید. با گذر زمان آن را کمتر از شما خواهیم خواست.</string>
<string name="KbsReminderDialog__to_help_you_memorize_your_pin">برای کمک به شما در به‌خاطرسپاری پین، آن را به صورت دوره‌ای از شما می‌پرسیم. با گذر زمان این‌ کار را کمتر انجام خواهیم داد.</string>
<string name="KbsReminderDialog__skip">پرش</string>
<string name="KbsReminderDialog__submit">ارسال</string>
<string name="KbsReminderDialog__forgot_pin">پین را فراموش کرده اید؟</string>
@ -1634,8 +1606,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">در حال انتقال پایگاه داده Signal</string>
<string name="PushDecryptJob_new_locked_message">پیام قفل شده جدید</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">جهت دیدن پیام های در حال انتظار قفل را باز کنید</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">قفل را جهت تکمیل به‌روزرسانی باز کنید</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">لطفاً قفل Signal را جهت تکمیل به‌روزرسانی باز کنید</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">گذرواژهٔ پشتیبان‌گیری</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">پشتیبان‌ها روی یک حافظهٔ خارجی ذخیره و با گذرواژهٔ زیر رمزنگاری خواهند شد. شما برای بازگردانی پشتیبان خود باید گذرواژهٔ زیر را داشته باشید.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">من این گذرواژه را یادداشت کرده‌ام. بدون آن، قادر به بازگردانی پشتیبان خود نخواهم بود.</string>
@ -1659,7 +1629,7 @@
<string name="RegistrationActivity_backup_timestamp_s">برچسب زمان پشتیبان: %s</string>
<string name="BackupDialog_enable_local_backups">فعال‌سازی پشتیبان‌های محلی؟</string>
<string name="BackupDialog_enable_backups">فعال‌سازی پشتیبان‌ها</string>
<string name="BackupDialog_please_acknowledge_your_understanding_by_marking_the_confirmation_check_box">لطفاً فهم خود را با علامت زدن جعبه نشان دهید.</string>
<string name="BackupDialog_please_acknowledge_your_understanding_by_marking_the_confirmation_check_box">لطفاً تأیید خود را با علامت زدن جعبه نشان دهید.</string>
<string name="BackupDialog_delete_backups">حذف پشتیبان‌ها؟</string>
<string name="BackupDialog_disable_and_delete_all_local_backups">غیرفعال کردن و پاک کردن تمامی پشتیبان‌های محلی؟</string>
<string name="BackupDialog_delete_backups_statement">حذف پشتیبان‌ها</string>

View File

@ -347,34 +347,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Jaa</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Useiden tiedostojen liittämistä tuetaan vain kuvilla ja videoilla</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Tervetuloa Signaliin.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure ja RedPhone ovat yhdistyneet nyt Signaliksi: yksityiset viestit ja puhelut samassa paketissa.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Tervetuloa Signaliin!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure on nyt Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure ja RedPhone ovat nyt yksi ja sama sovellus: Signal. Napauta tutustuaksesi.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Sano hei turvallisille videopuheluille.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal tukee nyt turvallisia videopuheluita. Aloita puhelu kuten ennenkin, sitten vain napauta kamerakuvaketta ja vilkuta hei.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal tukee nyt turvallisia videopuheluita.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal tukee nyt turvallisia videopuheluita. Jatka napauttamalla.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Oletko valmis kuvaamista varten?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Nyt voit jakaa profiilikuvasi ja -nimesi ystäviesi kanssa Signalissa</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal-profiilit ovat täällä</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Esittelemme kirjoitustilaindikaattorin.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Voit nyt vaihtoehtoisesti nähdä ja jakaa milloin viestejä kirjoitetaan.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Haluatko ottaa sen käyttöön nyt?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Kirjoitustilaindikaattori on täällä</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Ota käyttöön kirjoitustilaindikaattori</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Ota käyttöön kirjoitustilaindikaattori</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Ei kiitos</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Esittelemme linkkien esikatselukuvat.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Linkkien esikatselukuvat ovat valinnaisia ja niitä tuetaan nyt joillakin Internetin suosituimmista sivustoista.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Voit poistaa tämän ominaisuuden käytöstä tai ottaa sen käyttöön milloin tahansa Signalin asetuksissa (Yksityisyys &gt; Lähetä esikatselukuva linkeistä).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Selvä</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Esittelemme tarrat</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Miksi käyttää sanoja, kun voit käyttää tarroja?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Miksi käyttää sanoja, kun voit käyttää tarroja? Napauta tätä kuvaketta näppäimistössä:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Jatka</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Haetaan viestiä…</string>
<!--GcmRefreshJob-->
@ -1631,8 +1603,6 @@ Vastaanotetiin avaintenvaihtoviesti, joka kuuluu väärälle protokollaversiolle
<string name="SQLCipherMigrationHelper_migrating_signal_database">Signalin tietokantaa siirretään</string>
<string name="PushDecryptJob_new_locked_message">Uusi lukittu viesti</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Avaa nähdäksesi odottavat viestit</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Avaa lukitus päivityksen loppuunsaattamiseksi</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Avaa Signalin lukitus päivityksen loppuunsaattamiseksi</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Varmuuskopion salalause</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Varmuuskopiot tallennetaan laitteesi tallennustilaan ja ne salataan allaolevalla salalauseella. Ilman tätä salalausetta et voi palauttaa varmuuskopiota.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Olen kirjoittanut ylös tämän salalauseen. Ilman sitä, en pysty palauttamaan varmuuskopiota.</string>

View File

@ -346,34 +346,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Partager avec</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Les fichiers joints multiples ne sont pris en charge que pour les images et les vidéos</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Bienvenue sur Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure et RedPhone sont désormais regroupées en une seule appli de messagerie qui protège vos renseignements personnels, adaptée à toutes les situations : Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Bienvenue sur Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure est désormais Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure et RedPhone sont désormais regroupées en une seule appli : Signal. Touchez pour explorer.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Bienvenue aux appels vidéo sécurisés!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal prend désormais en charge les appels vidéo sécurisés. Lancez normalement un appel Signal, touchez le bouton Vidéo et dites bonjour.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal prend désormais en charge les appels vidéo sécurisés.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal prend désormais en charge les appels vidéo sécurisés. Touchez pour explorer.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Prêt pour votre gros plan?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Vous pouvez désormais partager une photo de profil et un nom avec des amis sur Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Les profils Signal sont arrivés</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Nous présentons les indicateurs de saisie.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Vous pouvez désormais facultativement voir et faire savoir que des messages sont en cours de saisie.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Souhaitez-vous les activer maintenant?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Les indicateurs de saisie sont arrivés</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Activer les indicateurs de saisie</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Activer les indicateurs de saisie</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Non merci</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Nous présentons les aperçus de lien.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Les aperçus facultatifs de liens sont désormais pris en charge pour certains des sites les plus populaires dInternet.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Vous pouvez désactiver ou activer cette fonction en tout temps dans vos paramètres de Signal (Confidentialité &gt; Envoyer des aperçus de liens).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Compris</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Nous présentons les autocollants</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Pourquoi utiliser des mots quand vous pouvez utiliser des autocollants?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Pourquoi utiliser des mots quand vous pouvez utiliser des autocollants? Touchez cette icône sur votre clavier :</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Allons-y</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Récupération dun message…</string>
<!--GcmRefreshJob-->
@ -1618,8 +1590,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Migration de la base de données de Signal</string>
<string name="PushDecryptJob_new_locked_message">Nouveau message verrouillé</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Déverrouiller pour visualiser les messages en attente</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Déverrouiller pour terminer la mise à jour</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Veuillez déverrouillez Signal pour terminer la mise à jour</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Phrase de passe de la sauvegarde</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Les sauvegardes sont enregistrées dans la mémoire externe et chiffrées avec la phrase de passe ci-dessous. Vous devez avoir cette phrase de passe afin de restaurer la sauvegarde.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Jai noté cette phrase de passe. Sans elle, je ne pourrai pas restaurer une sauvegarde.</string>

View File

@ -331,30 +331,6 @@
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">Este dispositivo non é compatible con Servizos Play. Toca para desactivar as optimizacións da batería do sistema que evitan que Signal recupere mensaxes mentres está inactivo.</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">Compartir con</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Benvido/a a Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure e RedPhone son agora unha aplicación de mensaxaría privada para calquera situación: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Benvido/a a Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure é agora Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure e RedPhone son agora unha aplicación: Signal. Toca para explorar.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Dilles ola ás videochamadas seguras.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal agora admite videochamadas seguras. Ao comezares unha chamada normal en Signal, toca o botón de vídeo e manda un saúdo.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal agora admite videochamadas seguras.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal agora admite videochamadas seguras. Toca para saber máis.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Disposto/a a un primeiro plano?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Agora podes compartir un nome e fotografía de perfil coas túas amizades en Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Os perfís de Signal xa están aquí</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Indicadores de escritura.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Agora, opcionalmente, podes ver e compartir cando as mensaxes están a ser escritas.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Queres habilitalos agora?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Xa temos aquí os indicadores de escritura</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Habilita os indicadores de escritura</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Activa os indicadores de escritura</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Non, grazas</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Previsualizacións das ligazóns.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">As previsualizacións das ligazóns estás dispoñibles para algúns dos sitios máis populares da rede.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Podes habilitar ou deshabilitar esta funcionalidade en calquera momento nos axustes de Signal (Privacidade &gt; Enviar previsualizacións das ligazóns).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Entendo</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Recuperando unha mensaxe…</string>
<!--GcmRefreshJob-->
@ -1414,8 +1390,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Migrando a base de datos de Signal</string>
<string name="PushDecryptJob_new_locked_message">Nova mensaxe bloqueada</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Desbloquear para ver as mensaxes pendentes</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Desbloquear para completar a actualización</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Por favor, desbloquea a actualización para completar a actualizaicón</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Frase de acceso da copia de seguranza</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">As copias de seguranza gardaranse no almacenamento externo e cifraranse cunha frase de acceso. A devandita frase é necesaria para restaurar unha copia de seguranza.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Escribín esta frase de acceso. Sen ela non poderei restaurar unha copia de seguranza.</string>

File diff suppressed because one or more lines are too long

View File

@ -322,34 +322,6 @@
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">Wannan na\'urar baya daukan Google Play Services. Taba nan domin kashe fasalin batiri da yake hana Signal karban sakwanni idan ba\'a aiki dashi.</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">Tura wa</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Barka da zuwan Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure da RedPhone sun zama daya a matsayin masinja mai zaman kansa domin ko wane hali da ake ciki: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Barka da zuwan Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">Signal na da tsaron rubutu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure da RedPhone suna koma afilikashon guda. Signal. Taba domin bincikawa.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Ce hello domin kare tsaron kiran bidiyo</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Yanzu Signal na barin kiran bidiyo mai tsaro. Domin gwadawa, fara kiran Signal kamar yadda kika/ka saba da wasu kiran, taba maballin bidiyo sai kuma ka/ki daga hannun gaisuwa.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Yanzu Signal ya yarda da tsaron kiran bidiyo.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal na karban kiran bidiyo mai tsaro. Taba domin ka/ki gani.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Ka/kin shirya daukar hoto mai kusa?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Yanzu zaka/ki iya sa hoton furofayil da suna da abokan hirarka da suke Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Akwai furofayil din masu amfani da Signal anan.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Gabatar da alamomin rubutu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Yanzu zaka/ki iya gani ko tura sanda ake rubutun sako idan ka/kina so.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Ka/ki na son kunnasu yanzu?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Alamomin Nuna Rubutu Suna Nan</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Kunna alamomin rubutu</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Kunna alamomin Nuna rubutu</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">A\'a, nagode</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Gabatarwa da dubawar hadi.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Yanzu akwai mahadi na zabi da aka yarda da su na wasu sanannen shafin yanar gizo.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Zaka/ki iya kashe ko kunna wannan fasali duk san da kake/kike so a saitin Signal dinka/ki wato (Preview &gt; Send link previews).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Yayi!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Gabatar da sitika</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Me yasa zaka/ki yi amfani da kalamai bayan zaku iya amfani da abu mafi sauki kamar sitika</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Me yasa zaka/ki yi amfani da kalmomi bayan zaka/ki iya amfani da abubuwa mafi sauki wato sitika? Taba wannan alamar da yake abun rubutun na\'urarka/ki.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Mu je</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Diban sakwanni.</string>
<!--GcmRefreshJob-->
@ -1503,8 +1475,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Kauracewar shiryayyen bayanain Signal</string>
<string name="PushDecryptJob_new_locked_message">Sabon kulellen sako</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Bude domin karanta tsayyayen sakonni</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Bude domin sabuntarwa</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Dan bude Signal domin kammala sabuntuwa</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Kalmomin sirrin tsimi</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Za\'a ajiye tsimi a ajiyar waje kuma za\'a tsaresu da kalmomin sirri da suke kasa. Dole sai ka/kinada kalmomin sirri zaka/ki samu damar yin tsimi ko kuma maida na\'ura tsarin asali.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Na rike wannan kalmomin sirri. In ba tare dashi ba, bazan iya yin tsimi ko kuma maida tsarin asali.</string>

File diff suppressed because one or more lines are too long

View File

@ -348,34 +348,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Megosztás…</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Több csatolmányt használata csak fényképek és videók esetén támogatott.</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Üdvözöl a Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">A TextSecure és a RedPhone közös privát üzenetküldőben egyesült, minden helyzetre: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Üdvözöl a Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">A TextSecure mostantól Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">A TextSecure és a RedPhone már egy alkalmazás: Signal. Koppints a felfedezéséhez!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Üdvözöld a biztonságos videóhívásokat.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">A Signal mostantól támogatja a biztonságos videóhívásokat. Csak indíts egy Signal hívást mint általában, koppints a videó gombra, és integess!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">A Signal mostantól támogatja a biztonságos videóhívásokat.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">A Signal monstantól támogatja a biztonságos videóhívásokat. Koppints a felfedezéséhez!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Készen állsz egy közeli portréra?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Mostantól megoszthatod barátaiddal profilképedet és egyéni nevedet Signal-on</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">A Signal profilok megérkeztek</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Bemutatjuk a gépelés-indikátorokat.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Mostantól lehetőséged van megtekinteni és megosztani azt, hogy éppen gépel-e valaki.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Szeretnéd most bekapcsolni?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">A gépelésindikátorok megérkeztek</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Gépelésindikátor engedélyezése</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Gépelésindikátor bekapcsolása</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Nem, köszönöm</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Bemutatjuk a hivatkozások előnézeti képe szolgáltatást.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">A hivatkozásokhoz opcionálisan engedélyezhető előnézeti képeket az internet legnépszerűbb oldalaira mutató linkekhez veheted igénybe.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">A funkció engedélyezését vagy letiltását a Signal beállításaiban teheted meg (Adatvédelem &gt; Hivatkozások előnézeti képének küldése)</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Rendben</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Bemutatkoznak a matricák</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Miért használnál szavakat, ha használhatsz matricákat is?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Miért használnál szavakat, ha használhatsz matricákat is? Koppints erre az ikonra a billentyűzeteden:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Kezdjük el</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Üzenet letöltése…</string>
<!--GcmRefreshJob-->
@ -567,6 +539,10 @@
<item quantity="one">%1$d tag</item>
<item quantity="other">%1$d tag</item>
</plurals>
<plurals name="MessageRequestProfileView_members_and_invited">
<item quantity="one">%1$d tag (+%2$d meghívott)</item>
<item quantity="other">%1$d tag (+%2$d meghívott)</item>
</plurals>
<plurals name="MessageRequestProfileView_member_of_others">
<item quantity="one">%d további</item>
<item quantity="other">%d további</item>
@ -1640,8 +1616,6 @@ Kulcs-csere üzenet érkezett érvénytelen protokoll verzióhoz.
<string name="SQLCipherMigrationHelper_migrating_signal_database">Signal adatbázis migrálása</string>
<string name="PushDecryptJob_new_locked_message">Új zárolt üzenet</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Oldd fel a függő üzenetek megtekintéséhez</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Oldd fel a frissítés befejezéséhez</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Kérlek oldd fel a Signal-t a frissítés befejezéséhez</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Biztonsági mentés jelmondat</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">A biztonsági mentések külső tárolóra lesznek mentve, és az alábbi jelmondattal lesznek titkosítva. Ezt a jelmondatot kell megadnod a biztonsági mentés visszaállításához.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Feljegyeztem ezt a jelmondatot. Enélkül nem leszek képes visszaállítani biztonsági mentést.</string>

View File

@ -333,34 +333,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Berbagi dengan</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Lampiran jamak hanya berupa gambar dan video</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Selamat datang di Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure dan RedPhone sekarang bergabung menjadi pengirim pesan privat tunggal, untuk semua situasi: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Selamat datang di Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure sekarang adalah Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure dan RedPhone sekarang bergabung menjadi aplikasi tunggal: Signal. Ketuk untuk menjelajah.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Ucapkan halo untuk mengamankan panggilan video.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal sekarang mendukung panggilan video yang aman. Cukup mulai panggilan Signal seperti biasa, ketuk tombol video, dan ucapkan halo.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal sekarang mendukung panggilan video yang aman.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal sekarang mendukung panggilan video yang aman. Ketuk untuk menjelajahi.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Siap foto wajah?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Sekarang anda dapat membagikan nama dan foto profil dengan kawan anda di Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Profil Signal ada di sini</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Memperkenalkan indikator pengketikan.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Sekarang Anda mempunyai pilihan melihat dan berbagi saat pesan sedang diketik.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Apakah Anda ingin mengaktifkannya sekarang?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Indikator pengetikan di sini</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Aktifkan indikator pengetikan</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Nyalakan indikator pengetikan</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Tidak, terima kasih</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Memperkenalkan pratinjau tautan.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Untuk beberapa situs populer di internet sekarang ada pilihan pratinjau tautan</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Anda dapat menonaktifkan atau mengaktifkan fitur ini kapanpun pada pengaturan Signal Anda (Privasi &gt; Kirim pratinjau tautan).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Paham</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Memperkenalkan stiker</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Mengapa menggunakan kata-kata saat Anda bisa menggunakan stiker?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Mengapa menggunakan kata-kata saat Anda bisa menggunakan stiker? Ketuk ikon ini pada papan ketik Anda:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Ayo!</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Mengambil pesan…</string>
<!--GcmRefreshJob-->
@ -1595,8 +1567,6 @@ Menerima pesan pertukaran kunci untuk versi protokol yang tidak valid.
<string name="SQLCipherMigrationHelper_migrating_signal_database">Memindahkan basis data Signal</string>
<string name="PushDecryptJob_new_locked_message">Pesan terkunci baru</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Buka kunci untuk melihat pesan tertunda</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Buka kunci untuk menyelesaikan pembaruan</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Mohon buka kunci Signal untuk menyelesaikan pembaruan</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Frasa sandi cadangan</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Cadangan akan disimpan ke penyimpanan eksternal dan terenkripsi dengan frasa di bawah. Anda mesti memiliki frasa sandi ini untuk memulihkan cadangan.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Saya telah mencatat frasa ini. Tanpa ini, saya tidak dapat memulihkan cadangan.</string>

View File

@ -347,34 +347,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Condividi con</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Gli allegati multipli sono supportati solo per immagini e video</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Benvenuto su Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure e RedPhone ora fanno parte di un unico messenger, per ogni situazione: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Benvenuto su Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure è diventato Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure e RedPhone ora sono un\'unica app: Signal. Tocca per esplorare.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Dai il benvenuto alle videochiamate sicure.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal ora supporta le videochiamate sicure. Ti basta avviare una normale chiamata Signal, toccare il pulsante video e salutare.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal ora supporta le videochiamate sicure.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal ora supporta le videochiamate sicure. Tocca per esplorare.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Pronto per il tuo primo piano?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Ora puoi condividere una foto profilo e un nome con i tuoi amici su Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">I profili Signal sono arrivati</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Ti presentiamo gli indicatori di scrittura.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Ora puoi scegliere di vedere e condividere quando i messaggi vengono digitati.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Vuoi attivarli adesso?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Sono arrivati gli indicatori di scrittura</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Abilita gli indicatori di scrittura</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Attiva gli indicatori di scrittura</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">No grazie</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Ti presentiamo le anteprime dei link.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Le anteprime facoltative dei link sono ora supportate per alcuni dei siti internet più famosi.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Puoi disattivare o attivare questa funzione in qualsiasi momento nelle impostazioni di Signal (Privacy &gt; Invia anteprime dei link).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Capito</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Ti presentiamo gli adesivi</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Perché usare le parole quando puoi utilizzare gli adesivi?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Perché usare le parole quando puoi utilizzare gli adesivi? Tocca questa icona sulla tua tastiera:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Cominciamo</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Recuperando un messaggio…</string>
<!--GcmRefreshJob-->
@ -566,6 +538,10 @@
<item quantity="one">%1$d membro</item>
<item quantity="other">%1$d membri</item>
</plurals>
<plurals name="MessageRequestProfileView_members_and_invited">
<item quantity="one">%1$d membro (+%2$d invitato/i)</item>
<item quantity="other">%1$d membri (+%2$d invitato/i)</item>
</plurals>
<plurals name="MessageRequestProfileView_member_of_others">
<item quantity="one">%d altro</item>
<item quantity="other">altri %d</item>
@ -1637,8 +1613,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Migrazione del database di Signal</string>
<string name="PushDecryptJob_new_locked_message">Nuovo messaggio bloccato</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Sblocca per leggere i messaggi in sospeso</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Sblocca per completare l\'aggiornamento</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Per favore sblocca Signal per completare l\'aggiornamento</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Passphrase di backup</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">I backup verranno salvati nella memoria esterna e crittografati con la passphrase qui sotto. Sarà necessario avere questa passphrase per ripristinare il backup.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Ho scritto questa passphrase. Senza di questa, non sarò in grado di ripristinare un backup.</string>

View File

@ -375,34 +375,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">שתף עם</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">צרופות מרובות נתמכות רק עבור תמונות וסרטונים</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">ברוך הבא אל Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure ו־RedPhone הן עכשיו תוכנת מסרים אחת, לכל מצב: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">ברוך הבא אל Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure היא כעת Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure ו־RedPhone הן כעת יישום אחד: Signal. הקש כדי לחקור.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">אמור שלום לשיחות וידיאו מאובטחות.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal תומך כעת בשיחות וידיאו מאובטחות. התחל פשוט שיחת Signal כרגיל, הקש על הכפתור סרטון, ונופף לשלום.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal תומך כעת בשיחות וידיאו מאובטחות.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal תומך כעת בשיחות וידיאו מאובטחות. הקש כדי לחקור.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">מוכן לתקריב שלך?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">עכשיו אתה יכול לשתף תצלום פרופיל ושם עם חברים ב־Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">פרופילי Signal כאן</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">היכרות עם מחווני הקלדה.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">כעת אתה יכול לראות ולשתף באופן רשותי מתי הודעות מוקלדות.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">האם אתה רוצה לאפשר אותם כעת?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">מחווני הקלדה כאן</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">אפשר מחווני הקלדה</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">הפעל מחווני הקלדה</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">לא תודה</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">היכרות עם קדם־תצוגות של קישורים.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">קדם־תצוגות רשותיות של קישורים נתמכות כעת עבור כמה מהאתרים הפופולריים ביותר באינטרנט.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">אתה יכול להשבית או לאפשר מאפיין זה בכל זמן בהגדרות Signal שלך (פרטיות &lt; שלח קדם־תצוגות של קישורים).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">הבנתי</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">היכרות עם מדבקות</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">למה להשתמש במילים כשאתה יכול להשתמש במדבקות?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">למה להשתמש במילים כשאתה יכול להשתמש במדבקות? הקש על צלמית זו במקלדת שלך:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">בוא נתחיל</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">מאחזר הודעה…</string>
<!--GcmRefreshJob-->
@ -1721,8 +1693,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">מהגר מסד נתונים של Signal</string>
<string name="PushDecryptJob_new_locked_message">הודעה נעולה חדשה</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">בטל נעילה כדי להציג הודעות ממתינות</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">בטל נעילה כדי להשלים עדכון</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">אנא בטל את נעילת Signal כדי להשלים עדכון</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">גבה משפט־סיסמה</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">גיבויים יישמרו בהתקן חיצוני ויוצפנו עם משפט־הסיסמה למטה. חייב להיות לך משפט־סיסמה זה על מנת לשחזר גיבוי.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">כתבתי משפט־סיסמה זה. בלעדיו, לא אוכל לשחזר גיבוי.</string>

View File

@ -326,34 +326,6 @@
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">このデバイスは Play Service をサポートしていません。Signal が非アクティブ状態でもメッセージを受信できるよう、タップしてバッテリー最適化機能を無効にしてください。</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">共有先</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Signal にようこそ。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure と RedPhone は、あらゆる状況で使えるプライベートメッセンジャー「Signal」に統合されました。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Signal にようこそ!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure は Signal に生まれ変わりました。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure と RedPhoneはつのアプリ「Signal」になりました。タップして詳細をご覧ください。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">セキュリティ保護されたビデオ通話へようこそ!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal でセキュリティ保護されたビデオ通話が可能になりました。いつも通りに Signal 通話を開始し、ビデオボタンをタップして会話を始めます。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">セキュリティ保護されたビデオ通話が可能になりました。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal でセキュリティ保護されたビデオ通話が可能になりました。タップして詳細をご覧ください。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">プロフィール写真を撮る準備はいいですか?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Signal でプロフィール名と写真を友達と共有できるようになりました</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal のプロフィールはこちらです</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">入力インジケーターのご紹介。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">メッセージが入力されていることを任意に確認し、共有できるようになりました。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">すぐに有効化しますか?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">入力インジケーターはこちら</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">入力インジケーターを有効にする</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">入力インジケーターを表示する</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">今はやめておく</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">リンクプレビューのご紹介。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">オプションのリンクプレビューは、主要なインターネットサイトに対応しています。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">この機能は Signal の設定 (プライバシー &gt; リンクプレビューを送信) でいつでも有効・無効にできます。</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">分かりました</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">ステッカーのご紹介</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">言葉だけでなくステッカーも使いましょう</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">言葉だけでなくステッカーも使いましょう。キーボード上のこのアイコンをタップしてください:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">続行</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">メッセージを取得しています…</string>
<!--GcmRefreshJob-->
@ -1554,8 +1526,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Signal のデータベースを移行する</string>
<string name="PushDecryptJob_new_locked_message">ロックされた新着メッセージ</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">ロックを解除してメッセージを見る</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">ロックを解除してアップデートを完了する</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Signal のロックを解除してアップデートを完了してください</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">バックアップ用パスフレーズ </string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">バックアップは外部ストレージに保存され、下のパスフレーズで暗号化されます。バックアップを復元する場合は、このパスフレーズが必要になります。</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">パスフレーズを書き留めました。パスフレーズがなければ、バックアップは復元できません。</string>

View File

@ -308,34 +308,6 @@
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">Pirantos niki mboten ndukung Play Services. Tutul kangge nonaktifaken paningkatan baterai sistem ingkang ngewatesi Signal saking nampi pesen kala mboten aktif.</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">Diunjukaken kangge</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Sugeng rawuh ing Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">Sakmenika TextSecure lan RedPhone dados pirantos perpesanan pribadi tunggil kangge ragam-ragam kabetahan: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Sugeng rawuh ing Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">Sakmenika TextSecure dados Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">Sakmenika TextSecure lan RedPhone dados aplikasi tunggil: Signal. Tutul kangge nyobi.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Monggo cobi telepon kangge video ingkang aman.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Sakmenika Signal saged diginakaken kangge telepon video ingkang aman. Telepon mawon ngginakaken telepon Signal kados biasanipun, tutul tombol video, lajeng sampun.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Sakmenika Signal saged dipunginakaken kangge telepon video ingkang aman.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Sakmenika Signal saged dipunginakaken kangge telepon video ingkang aman. Tutul kangge nyobi.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Sakmenika wekdalipun tampil!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Sakmenika sampeyan saged ngunjukaken nami lan foto profil dhateng kanca-kanca ing Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Sakmenika sampun enten profil Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Nepangaken indikator ketikan.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Sakmenika sampeyan saged mileh menawi badhe ningali lan ngunjukaken kala pesen taksih diketik.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Badhe nyobi ngaktifaken fitur kasebut?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Sakmenika sampun enten indikator ketikan</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Aktifaken indikator ketikan</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Gesangaken indikator ketikan</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Mboten usah</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Nepangaken tampilan awal tautan.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Sakmenika tampilan awal tautan dipundukung kangge ragam-ragam situs paling populer ing internet.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Sampeyan saged ngaktifaken utawi ngenonaktifaken fitur kasebut kala-kala saking panatanan Signal (Privasi &gt; Kirimaken tampilan awal tautan).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Oke</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Nepangaken stiker</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Punapa nembung menawi saged ngginakaken stiker?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Punapa nembung menawi saged ngginakaken stiker? Tutul ikon ing keyboard sampeyan:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Mangga</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Taksih nampi pesen…</string>
<!--GcmRefreshJob-->
@ -1472,8 +1444,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Taksih mindahi database Signal</string>
<string name="PushDecryptJob_new_locked_message">Pesen ingkang dipunkunci enggal</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Uculaken kunci kangge ningali pesen-pesen ingkang ketundha</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Bikak kunci kangge ngerampungaken pangenggalan</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Bikak kunci Signal kangge ngerampungaken pengenggalan</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Tembung sandi serep</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Serep bakal dipunsimpen ing penyimpenan njawi lan dipunenkripsi ngginakaken tembung sandi ing ngandhap. Sampeyan wajib ngeling tembung sandi kasebut kangge mulihaken serep.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Kula sampun nyatet tembung sandi niki. Tanpa tembung sandi kasebut, kula mboten saged mulihaken serep.</string>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -333,34 +333,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">공유자</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">이미지와 동영상만 여러 개 첨부할 수 있습니다.</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Signal에 오신 것을 환영합니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">이제부터 TextSecure와 RedPhone이 새 보안 메신저 앱 Signal로 통합되었습니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Signal에 오신 것을 환영합니다!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure가 Signal로 탄생했습니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">이제부터 TextSecure와 RedPhone이 새 앱 Signal로 통합되었습니다. 탭하여 더 알아보세요.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">보안 영상 통화, 이제 마음 놓고 즐길 수 있습니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal이 이제 보안 영상 통화를 지원합니다. 평소처럼 Signal 전화를 건 뒤, 동영상 버튼을 탭하고 손을 흔들어 인사하세요.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal이 이제 보안 영상 통화를 지원합니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal이 이제 보안 영상 통화를 지원합니다. 탭하여 더 알아보세요.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">셀카 찍을 준비는 되셨나요?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">이제 이름과 프로필 사진을 Signal 친구들과 공유할 수 있습니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal 프로필입니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">입력 안내 기능을 소개합니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">이제 필요한 경우 메시지를 입력하고 있다는 것을 알아채고 이를 공유할 수 있습니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">지금 해당 기능을 활성화하시겠습니까?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">입력 안내 기능입니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">입력 안내 기능 활성화</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">입력 안내 기능 켜기</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">아니요</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">링크 미리 보기를 소개합니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">필요한 경우 인터넷에서 유명한 사이트들의 링크를 미리 볼 수 있습니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Signal 설정(개인 정보, 링크 미리 보기 보내기)에서 기능을 켜고 끌 수 있습니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">확인</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">스티커를 소개합니다.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">스티커를 쓸 수 있는데 왜 일일이 글을 입력해야 하죠?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">스티커를 쓸 수 있는데 왜 일일이 글을 입력해야 하죠? 키보드에서 이 아이콘을 탭하세요.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">시작해 봅시다!</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">메시지를 받는 중…</string>
<!--GcmRefreshJob-->
@ -1566,8 +1538,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Signal 데이터베이스 이전 중</string>
<string name="PushDecryptJob_new_locked_message">새 잠금 메세지</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">잠금 해제하여 보류 중인 메시지 보기</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">잠금 해제하여 업데이트</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Signal 잠금을 해제하여 업데이트 완료</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">암호 백업</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">백업은 외부 저장 공간에 보관되며 암호로 암호화됩니다. 백업에서 복원하려면 다음에 표시되는 암호가 필요합니다.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">암호를 적었습니다. 비밀번호를 잊었을 때 백업을 복구할 수 없다는 점에 동의합니다.</string>

View File

@ -375,34 +375,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Bendrinti su</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Keli priedai yra palaikomi tik paveikslams ir vaizdo įrašams</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Sveiki atvykę į Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure ir RedPhone dabar yra viena privati pokalbių programėlė kiekvienai situacijai: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Sveiki atvykę į Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure dabar tapo Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure ir RedPhone dabar yra viena programėlė: Signal. Bakstelėkite, norėdami sužinoti daugiau.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Pasveikinkite saugius vaizdo skambučius.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Dabar, Signal palaiko saugius vaizdo skambučius. Tiesiog, pradėkite, kaip įprasta, Signal skambutį, bakstelėkite vaizdo mygtuką ir pamojuokite.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Dabar, Signal palaiko saugius vaizdo skambučius.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Dabar, Signal palaiko saugius vaizdo skambučius. Bakstelėkite, norėdami išnagrinėti.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Pasiruošę artimesniam bendravimui?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Dabar, su Signal draugais galite bendrinti profilio nuotrauką ir vardą</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal profiliai jau čia</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Pristatome rašymo indikatorius.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Dabar, galite pasirinktinai matyti kada yra rašomos žinutės ir rodyti kitiems, kai rašote žinutes.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Ar norėtumėte įjungti juos dabar?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Rašymo indikatoriai jau čia</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Įjungti rašymo indikatorius</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Įjungti rašymo indikatorius</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Ne, ačiū</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Pristatome nuorodų peržiūras.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Dabar yra palaikomos pasirinktinos populiariausių svetainių internete nuorodų peržiūros.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Šią ypatybę galite bet kuriuo metu įjungti ar išjungti savo Signal nustatymuose (Privatumas &gt; Siųsti nuorodų peržiūras).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Supratau</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Pristatome lipdukus</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Kam naudoti žodžius, kai galima naudoti lipdukus?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Kam naudoti žodžius, kai galima naudoti lipdukus? Bakstelėkite savo klaviatūroje šią piktogramą:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Pirmyn</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Atgaunama žinutė…</string>
<!--GcmRefreshJob-->
@ -1721,8 +1693,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Perkeliama Signal duomenų bazė</string>
<string name="PushDecryptJob_new_locked_message">Nauja užrakinta žinutė</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Atrakinkite, norėdami matyti laukiančias žinutes</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Atrakinkite, norėdami užbaigti atnaujinimą</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Atrakinkite Signal, norėdami užbaigti atnaujinimą</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Atsarginės kopijos slaptafrazė</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Atsarginės kopijos bus įrašytos į išorinę saugyklą ir bus užšifruotos, naudojant žemiau esančią slaptafrazę. Norėdami atkurti atsarginę kopiją, privalėsite turėti šią slaptafrazę.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Aš užsirašiau šią slaptafrazę. Be jos aš negalėsiu atkurti atsarginės kopijos.</string>

View File

@ -361,34 +361,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Dalīties ar</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Vairāku pielikumu sūtīšana ir atbalstīta tikai attēliem un video</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Laipni lūdzam Signālā.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure un RedPhone tagad ir apvienoti vienā universālā aplikācijā: Signāls.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Laipni lūdzam Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure tagad ir Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure un RedPhone tagad ir apvienoti vienā aplikācija: Signal. Pieskaries, lai apskatītu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Apsveicinies ar drošajiem video zvaniem</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal tagad atbalsta drošos video zvanus. Sāc Signal zvanu, kā parasti, tad pieskaries kameras ikonai.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal tagad atbalsta drošos video zvanus.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal tagad atbalsta drošos video zvanus. Pieskaries, lai papētītu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Esi gatavs savam tuvplānam?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Tagad ar savu profila bildi un vārdu varat dalīties ar draugiem iekš Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal profili ir šeit</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Iepazīstieties ar rakstīšanas indikātoriem</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Tagad varat pēc izvēles redzēt un dalīties ar to, vai tiek rakstīta ziņa.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Vai vēlieties tos iespējot tagad?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Rakstīšanas indikātori ir šeit</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Iespējot rakstīšanas indikatorus</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Ieslēgt rakstīšanas indikatorus</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Nē, paldies</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Iepazīstinām ar saišu priekšskatu.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Papildu saišu priekšskati tagad tiek atbalstīti populārākajās interneta vietnēs.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Jūs variet ieslēgt vai izslēgt šo opciju jebkurā laikā savos Signal iestatījumos (Privātums -&gt; Sūtīt saišu prekšskatus)</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Skaidrīte</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Iepazīstieties ar uzlīmēm</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Kāpēc lietot vārdus, ja var izmantot uzlīmes?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Kāpēc lietot vārdus, ja var izmantot uzlīmes? Pieskarieties šai ikonai uz tastatūras:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Aiziet</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Notiek ziņas ielāde…</string>
<!--GcmRefreshJob-->
@ -1662,8 +1634,6 @@ Saņemts nederīgas protokola versijas atslēgas apmaiņas ziņojums.
<string name="SQLCipherMigrationHelper_migrating_signal_database">Tiek migrēta/pārcelta Signāla datubāze</string>
<string name="PushDecryptJob_new_locked_message">Jauna bloķēta ziņa</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Atbloķējiet, lai redzētu gaidošās ziņas </string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Atbloķējiet, lai pabeigtu aktualizēt</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Lai pabeigtu aktualizēt, lūdzu, atbloķējiet Signālu, </string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Dublikāta (rezerves kopijas) paroles frāze</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Dublikāti tiks saglabāti ārējā noliktavā un šifrēti, izmantojot tālāk esošo paroles frāzi. Lai atgrieztu/restaurētu no dublikāta (rezerves kopijas), būs nepieciešama šī paroles frāze.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Esmu sev pierakstījis šo paroles frāzi. Bez tās nebūs iespējams atgriezt/restaurēt dublikātu (rezerves kopiju).</string>

File diff suppressed because one or more lines are too long

View File

@ -303,33 +303,6 @@
 </string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">Kongsi dengan</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Selamat datang ke Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure dan RedPhone kini adalah satu penghantar mesej peribadi, untuk semua keadaan: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Selamat datang ke Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure sekarang dipanggil Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure dan RedPhone kini adalah satu aplikasi: Signal. Tekan untuk teroka.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Katakan hello untuk panggilan video selamat. </string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal kini menyokong panggilan video selamat. Hanya mulakan panggilan Signal seperti biasa, ketik butang video dan melambai hello. </string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal kini menyokong panggilan video selamat</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal kini menyokong panggilan video selamat. Ketik untuk teroka.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Sudah sedia untuk mengambil gambar diri?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Kini anda boleh berkongsi nama dan foto profil dengan rakan-rakan dalam Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Profil Signal ada di sini</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Memperkenalkan petunjuk menaip.</string> -->
<string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Kini anda boleh melihat dan berkongsi apabila mesej sedang ditaip secara pilihan.
 </string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Adakah anda ingin mendayakannya sekarang?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Petunjuk menaip ada di sini</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Mendayakan petunjuk menaip</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Menghidupkan petunjuk menaip</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Tidak, terima kasih</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Memperkenalkan pratonton pautan.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Pilihan pratonton pautan kini disokong untuk beberapa laman web yang paling popular di Internet.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Anda boleh menyahdayakan atau mendayakan ciri-ciri tersebut bila-bila masa dalam tetapan Signal (Privasi &gt; Hantar pratonton pautan).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Faham</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Mengapa menggunakan kata-kata apabila anda boleh menggunakan pelekat?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Mengapa menggunakan kata-kata apabila anda boleh menggunakan pelekat? Ketik ikon ini di papan kekunci anda:</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Mengambil satu mesej… </string>
<!--GcmRefreshJob-->
@ -1347,8 +1320,6 @@ Menerima mesej pertukaran kunci untuk versi protokol yang tidak sah.</string>
<string name="SQLCipherMigrationHelper_migrating_signal_database">Memindahkan pangkalan data Signal</string>
<string name="PushDecryptJob_new_locked_message">Mesej dikunci yang baru</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Buka untuk melihat mesej belum selesai</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Buka untuk menyelesaikan kemas kini</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Sila buka untuk menyelesaikan kemas kini</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Frasa laluan sandaran</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Sandaran akan disimpan ke storan luaran dan disulitkan dengan frasa laluan di bawah. Anda mesti mempunyai frasa laluan tersebut untuk memulihkan sandaran.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Saya telah menulis frasa laluan tersebut. Saya tidak memulihkan sandaran tanpanya.</string>

View File

@ -343,33 +343,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Del med</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Flere vedlegg støttes bare for bilder og videoer</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Velkommen til Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure og RedPhone er nå ett program for privat kommunikasjon, til alle formål: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Velkommen til Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure er nå Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure og RedPhone er nå ett program: Signal. Trykk for å utforske.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Si hei til sikre videosamtaler.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal støtter nå sikker videosamtaler. Bare start et signalanrop som normalt, trykk på videoknappen og vink hei.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal støtter nå sikker videosamtaler.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal støtter nå sikker videosamtaler. Trykk for å utforske.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Klar for nærbilde?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Nå kan du dele et profilbilde og et navn med venner på Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal introduserer profiler</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Vi presenterer skriveindikatorer.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Nå kan du velge å se og dele når meldinger blir skrevet.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Vil du aktivere dem nå?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Skriveindikatorer er her</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Aktiver skriveindikatorer</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Slå på skriverindikatorer</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Nei takk</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Vi presenterer linkforhåndsvisninger.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Valgfrie linkforhåndsvisninger støttes nå for noen av de mest populære nettstedene på Internett.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Du kan deaktivere eller aktivere denne funksjonen når som helst i innstillingene for Signal (Personvern &gt; Send linkforhåndsvisninger).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Ålreit</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Presenterer klistremerker</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Hvorfor bruke ord når du kan bruke klistremerker?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Hvorfor bruke ord når du kan bruke klistremerker? Trykk på dette ikonet på tastaturet ditt:</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Mottar en melding…</string>
<!--GcmRefreshJob-->
@ -1557,8 +1530,6 @@ Mottok nøkkelutvekslingsmelding for ugyldig protokollversion.</string>
<string name="SQLCipherMigrationHelper_migrating_signal_database">Flytter Signal-database</string>
<string name="PushDecryptJob_new_locked_message">Ny låst melding</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Lås opp for å vise ventende meldinger</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Lås opp for å fullføre oppdatering</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Lås opp Signal for å fullføre oppdatering</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Passordfrase for sikkerhetskopi</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Sikkerhetskopier blir lagret på eksterne enheter og kryptert med passordfrasen nedenfor. Du må skrive inn denne passordfrasen for å kunne gjennopprette fra en sikkerhetskopi.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Jeg har notert passordfrasen. Uten denne blir det umulig å bruke sikkerhetskopien til gjenoppretting.</string>

View File

@ -347,35 +347,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Doorsturen naar</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Het verzenden van meerdere bijlagen is alleen mogelijk voor afbeeldingen en video\'s</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Welkom bij Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure en RedPhone zijn vanaf nu samen één privéberichtenapp, geschikt voor iedere situatie: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Welkom bij Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure heet vanaf nu Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure en RedPhone zijn vanaf nu één app: Signal. Tik om kennis te maken.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Verwelkom beveiligde videogesprekken.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal ondersteunt vanaf nu beveiligde videogesprekken. Maak een Signal-oproep zoals je dat normaal zou doen en tik op de videoknop om een videogesprek te beginnen.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal ondersteunt vanaf nu beveiligde videogesprekken.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal ondersteunt vanaf nu beveiligde videogesprekken. Tik om te verkennen.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Klaar voor je close-up?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Je kunt vanaf nu een profielfoto en naam zichtbaar maken voor je gesprekspartners op Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal-profielen zijn vanaf nu beschikbaar</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">We introduceren typindicatoren.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Vanaf nu kun je zien of je gesprekspartner een bericht aan het typen is. Deze functie is optioneel; je kunt hem op ieder moment uitschakelen.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Wil je ze nu inschakelen?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Typindicatoren zijn gearriveerd</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Typindicatoren inschakelen</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Schakel typindicatoren in</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Nee bedankt</string> -->
<string name="ExperienceUpgradeActivity_introducing_link_previews">Nieuw: voorbeeld-
weergaven.</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">De optie om voorbeelden weer te geven wordt vanaf nu ondersteund voor enkele van de populairste weblocaties op het internet.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Je kunt deze functionaliteit op elk gewenst moment in- of uitschakelen in je Signal-instellingen (Privacy &gt; Voorbeeldweergaven verzenden).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Begrepen</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Signal introduceert stickers</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Waarom zou je woorden gebruiken als je ook stickers kunt gebruiken?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Waarom zou je woorden gebruiken als je ook stickers kunt gebruiken? Tik op dit pictogram op je toetsenbord:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Doorgaan</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Bericht aan het ophalen…</string>
<!--GcmRefreshJob-->
@ -403,7 +374,7 @@ weergaven.</string>
<string name="GroupCreateActivity_loading_group_details">Groepsdetails aan het laden…</string>
<string name="GroupCreateActivity_youre_already_in_the_group">Je bent al lid van deze groep.</string>
<!--GroupShareProfileView-->
<string name="GroupShareProfileView_share_your_profile_name_and_photo_with_this_group">Tik hier om je profielnaam en -foto voor deze groep zichtbaar te maken</string>
<string name="GroupShareProfileView_share_your_profile_name_and_photo_with_this_group">Je profielnaam en -foto voor deze groep zichtbaar maken?</string>
<string name="GroupShareProfileView_do_you_want_to_make_your_profile_name_and_photo_visible_to_all_current_and_future_members_of_this_group">Wil je je profielnaam en -foto zichtbaar maken voor alle huidige en toekomstige leden van deze groep?</string>
<string name="GroupShareProfileView_make_visible">Zichtbaar maken</string>
<!--GroupMembersDialog-->
@ -541,7 +512,7 @@ weergaven.</string>
<string name="MessageRecord_s_called_you">%s heeft je gebeld</string>
<string name="MessageRecord_called_s">Je hebt %s gebeld</string>
<string name="MessageRecord_missed_call_from">Gemiste oproep van %s</string>
<string name="MessageRecord_s_joined_signal">%s is vanaf nu ook beschikbaar via Signal.</string>
<string name="MessageRecord_s_joined_signal">%s is vanaf nu bereikbaar via Signal.</string>
<string name="MessageRecord_you_disabled_disappearing_messages">Je hebt zelf-wissende berichten uitgeschakeld.</string>
<string name="MessageRecord_s_disabled_disappearing_messages">%1$s heeft zelf-wissende berichten uitgeschakeld.</string>
<string name="MessageRecord_you_set_disappearing_message_time_to_s">Je hebt de timer voor zelf-wissende berichten op %1$s ingesteld.</string>
@ -567,6 +538,10 @@ weergaven.</string>
<item quantity="one">%1$d lid</item>
<item quantity="other">%1$d leden</item>
</plurals>
<plurals name="MessageRequestProfileView_members_and_invited">
<item quantity="one">%1$d lid (+%2$d uitgenodigden)</item>
<item quantity="other">%1$d leden (+%2$d uitgenodigden)</item>
</plurals>
<plurals name="MessageRequestProfileView_member_of_others">
<item quantity="one">%d ander</item>
<item quantity="other">%d andere</item>
@ -785,7 +760,7 @@ Tot slot moet Signal de telefoonstatus kunnen lezen om te voorkomen dat Signal-o
<string name="ThreadRecord_view_once_photo">Eenmaligeweergave-afbeelding</string>
<string name="ThreadRecord_view_once_video">Eenmaligeweergave-video</string>
<string name="ThreadRecord_view_once_media">Eenmaligeweergave-media</string>
<string name="ThreadRecord_s_is_on_signal">%s is beschikbaar voor Signal-berichten.</string>
<string name="ThreadRecord_s_is_on_signal">%s is bereikbaar via Signal.</string>
<string name="ThreadRecord_disappearing_messages_disabled">Zelf-wissende berichten uitgeschakeld</string>
<string name="ThreadRecord_disappearing_message_time_updated_to_s">Berichten zullen zichzelf wissen %s nadat ze gelezen zijn</string>
<string name="ThreadRecord_safety_number_changed">Veiligheidsnummer veranderd</string>
@ -1140,7 +1115,7 @@ Tot slot moet Signal de telefoonstatus kunnen lezen om te voorkomen dat Signal-o
</plurals>
<string name="GroupUtil_group_name_is_now">De groepsnaam is vanaf nu %1$s.</string>
<!--profile_group_share_view-->
<string name="profile_group_share_view__make_your_profile_name_and_photo_visible_to_this_group">Je profielfoto en naam zichtbaar maken voor deze groep?</string>
<string name="profile_group_share_view__make_your_profile_name_and_photo_visible_to_this_group">Tik hier om je profielnaam en -foto voor deze groep zichtbaar te maken</string>
<!--prompt_passphrase_activity-->
<string name="prompt_passphrase_activity__unlock">Ontgrendelen</string>
<!--prompt_mms_activity-->
@ -1388,7 +1363,7 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
<string name="preferences_chats__show_invitation_prompts">Uitnodigingsvoorstel weergeven</string>
<string name="preferences_chats__display_invitation_prompts_for_contacts_without_signal">Toon boven sms-gesprekken met gesprekspartners die niet op Signal zitten een suggestie om je gesprekspartner uit te nodigen op Signal</string>
<string name="preferences_chats__message_text_size">Tekstgrootte voor berichten</string>
<string name="preferences_events__contact_joined_signal">Contactpersoon beschikbaar via Signal</string>
<string name="preferences_events__contact_joined_signal">Nieuw persoon bereikbaar via Signal</string>
<string name="preferences_notifications__priority">Belangrijkheid</string>
<string name="preferences_communication__category_sealed_sender">Verzegelde afzender</string>
<string name="preferences_communication__sealed_sender_display_indicators">Verzegelde afzender-pictorgram</string>
@ -1643,15 +1618,13 @@ Signal zal nu toestemming vragen om je contactenlijst te lezen, om na te gaan wi
<string name="SQLCipherMigrationHelper_migrating_signal_database">Signal-databank wordt gemigreerd</string>
<string name="PushDecryptJob_new_locked_message">Nieuw vergrendeld bericht</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Ontgrendel om je berichten te lezen</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Ontgrendel om bijwerken te voltooien</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Ontgrendel Signal om bijwerken te voltooien</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Back-up-wachtwoord</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Back-up-bestanden worden opgeslagen op het externe opslaggeheugen en versleuteld met het wachtwoord hieronder. Je hebt dit wachtwoord nodig om de back-up-gegevens terug te zetten.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Ik heb dit wachtwoord opgeschreven. Zonder dit wachtwoord kan ik deze back-up-bestanden niet gebruiken om gegevens terug te zetten.</string>
<string name="registration_activity__restore_backup">Back-up-gegevens terugzetten</string>
<string name="registration_activity__skip">Overslaan</string>
<string name="registration_activity__register">Registreren</string>
<string name="preferences_chats__chat_backups">Laat Signal back-up-bestanden maken</string>
<string name="preferences_chats__chat_backups">Back-up-bestanden maken</string>
<string name="preferences_chats__backup_chats_to_external_storage">Sta Signal toe om versleutelde back-up-bestanden van gesprekken en media te maken naar /Signal/Backups op je interne opslag. Als dit is ingeschakeld maakt Signal automatisch elke dag een back-up-bestand. Alleen de twee meest recente geslaagde back-up-bestanden worden bewaard.</string>
<string name="preferences_chats__create_backup">Nu een back-up-bestand maken</string>
<string name="preferences_chats__verify_backup_passphrase">Back-up-wachtwoord verifiëren</string>

View File

@ -347,34 +347,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Del med</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Fleire vedlegg er berre støtta for bilde og film</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Velkomen til Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure og RedPhone er no eitt program for privat kommunikasjon, til alle føremål: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Velkomen til Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure er no Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure og RedPhone er no eitt program: Signal. Trykk for å utforska.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Sei hallo til trygge videosamtalar.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal støttar no trygge videosamtalar. Berre ring som normalt med Signal, trykk video-knappen og gje eit vink.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal støttar no trygge videosamtalar.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal støttar no trygge videosamtalar. Trykk for å utforska.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Klar til å ta nærbilde?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">No kan du dela profilbilde og namnet ditt med vennar på Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signalprofilar er her</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Her kjem tastevisning.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">No kan du sjå og visa inntasting av meldingar, viss du vil.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Vil du skru på denne funksjonen no?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Tastevisning er her</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Skru på tastevisning</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Skru på tastevisning</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Nei takk</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">No kjem lenkjesniktitt</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">No kan me laga førehandsvisningar av lenkjer til nokre av dei mest populære nettstadene, viss du vil.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Du kan skru på eller av denne funksjonen når som helst i Signal-innstillingane dine (Privay → Send lenkjesniktitt).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Ålreit</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Klistremerke på veg</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Kvifor bruka ord når du kan bruka klistremerke?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Kvifor bruka ord når du kan bruka klistremerke? Trykk dette ikonet på tastaturet ditt:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Kom i gang</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Hentar ei melding …</string>
<!--GcmRefreshJob-->
@ -566,6 +538,10 @@
<item quantity="one">%1$d medlem</item>
<item quantity="other">%1$d medlem</item>
</plurals>
<plurals name="MessageRequestProfileView_members_and_invited">
<item quantity="one">%1$d medlem (+ %2$d invitert)</item>
<item quantity="other">%1$d medlem (+ %2$d inviterte)</item>
</plurals>
<plurals name="MessageRequestProfileView_member_of_others">
<item quantity="one">%d anna</item>
<item quantity="other">%d andre</item>
@ -1637,8 +1613,6 @@ Du er à jour!</string>
<string name="SQLCipherMigrationHelper_migrating_signal_database">Migrerer Signal-databasen</string>
<string name="PushDecryptJob_new_locked_message">Ny låst melding</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Lås opp for å sjå ulesne meldingar</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Lås opp for å fullføra oppdateringa</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Lås opp Signal for å fullføra oppdateringa</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Passordfrase til reservekopi</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Reservekopiar blir lagra til ekstern lagring og krypterte med passordfrasen nedanfor. Du må ha denne passordfrasen for å gjenoppretta frå kopien.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Eg har skrive ned denne passordfrasen. Utan den vil eg ikkje få gjenoppretta frå reservekopien.</string>

View File

@ -325,34 +325,6 @@
<string name="DozeReminder_this_device_does_not_support_play_services_tap_to_disable_system_battery">ایہہ آلہ پلے سروسز دی معاونت نئیں کر دا اے۔ سسٹم بیٹری دی احسن کاری نوں غیر فعال کرن لئی بٹن دباؤ جیہڑی Signal نوں غیر فعال ہون دے دوران سنیہے بازیافت کرن توں روکدی اے۔</string>
<!--ShareActivity-->
<string name="ShareActivity_share_with">ایہدے نال سانجھا کرو</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf"> Signal اچ جی آیاں نوں۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure تے RedPhone ہن ہر صورتحال لئی اک نجی میسنجر نیں : Signal ۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Signal اچ جی آیاں نوں!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal"> TextSecure ہن Signal اے۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure تے RedPhone ہن اک ای ایپ نیں : Signal ۔ کھوجن لئی بٹن دبو۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">ویڈیو کال محفوظ کرن لئی ہیلو کہو۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal ہن محفوظ ویڈیو کالنگ دی معاونت کردا اے۔ معمول دی طرح بس اکSignal کال شروع کرو، ویڈیو بٹن دباؤ ، تے ہیلو اچ ہتھ ہلاؤ ۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal ہن محفوظ ویڈیو کالنگ دی معاونت کردا اے۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal ہن محفوظ ویڈیو کالنگ دی معاونت کردا اے۔ کھوجن لئی بٹن دبو۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">اپنے کلوزاپ لئی تیار او؟</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Signal تے ہن تسیں دوستاں دے نال اک پروفائل فوٹو تے ناں سانجھا کر سکدے او</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Signal پروفائلز ایتھے نیں</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">ٹائپنگ اشارے متعارف کرا رئیا اے۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed"> ہن سنیہے ٹائپ ہون دے دوران تسیں اختیاری طور تے ویکھ سکدے او تے سانجھا کر سکدے او۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">کیہ تسیں اوہناں نوں فعال کرنا چاہندے او؟</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">ٹائپنگ اشارے ایتھے نیں</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">ٹائپنگ اشارے فعال کرو</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">ٹائپنگ اشارے آن کرو</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">نئیں شکریہ</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">لنک پیش نظاریاں دا تعارف کرا رئیا اے۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">اختیاری لنک پیش نظارے ہن انٹرنیٹ تے کجھ مشہور ترین سائٹس لئی معاونت یافتہ نیں۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">تسیں اپنیاںSignal دیاں ترتیباں اچ کسے وی ویلے ایس خصوصیت نوں غیر فعال یاں فعال کر سکدے او (رازداری &gt; لنک پیش نظارے گھلو)۔</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">سمجھ آگیا</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">اسٹیکرز متعارف کرا رئیا اے</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">جدوں تسیں اسٹیکرز استعمال کرسکدے او تے الفاظ کیوں استعمال کرئیے؟</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">جدوں تسیں اسٹیکرز استعمال کرسکدے او تے الفاظ کیوں استعمال کرئیے؟ اپنے کی بورڈ تے ایس آئیکن نوں دبو:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">چلو شروع کرئیے</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">اک سنیہا بازیافت کر رئیا اے…</string>
<!--GcmRefreshJob-->
@ -1555,8 +1527,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Signal ڈیٹا بیس منتقل کرنا</string>
<string name="PushDecryptJob_new_locked_message">نواں مقفل سنیہا</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">التوا اچ پئۓ سنیہے ویکھن لئی غیر مقفل کرو</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">اپ ڈیٹ مکمل کرن لئی غیر مقفل کرو</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">اپ ڈیٹ مکمل کرن لئی مہربانی کر کےSignal نوںغیرمقفل کرو</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">بیک اپ پاس فریز</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">بیک اپ نوں بیرونی اسٹوریج اچ محفوظ کیتا جاوے گا تے تھلے دتے ہوئے پاس فریز دے نال ایہدی خفیہ کاری ہووے گی۔ بیک اپ بحال کرن لئی تہاڈے کول ایہہ پاس فریز ہونا لازمی اے۔</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">میں اے پاس فریز لکھ لیا اے۔ ایہدے توں بغیر، میں بیک اپ بحال نئیں کر سکاں گا۔</string>

File diff suppressed because one or more lines are too long

View File

@ -375,34 +375,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Podziel się z</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Wysyłanie kilku załączników na raz jest obsługiwane tylko dla zdjęć i filmów.</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Witamy w Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure i RedPhone są teraz jedną aplikacją: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Witamy w Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure nazywa się teraz Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure i RedPhone są teraz jedną aplikacją: Signal. Dotknij, aby dowiedzieć się więcej.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Powitaj bezpieczne rozmowy wideo.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">Signal wspiera teraz bezpieczne rozmowy wideo. Rozpocznij połączenie tak jak zawsze, dotknij przycisk wideo i pomachaj na powitanie.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">Signal wspiera teraz bezpieczne rozmowy wideo.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">Signal wspiera teraz bezpieczne rozmowy wideo. Dotknij, aby dowiedzieć się więcej.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Gotowy(a) do zdjęcia?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Możesz teraz udostępnić nazwę oraz zdjęcie profilowe swoim znajomym w Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Tu znajdują się profile Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Przedstawiamy wskaźniki pisania.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Możesz teraz wyświetlać i udostępniać informację, gdy wiadomości są wpisywane.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Czy chcesz włączyć je teraz?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Wskaźniki pisania są tutaj</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Włącz wskaźniki pisania</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Włącz wskaźniki pisania</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Nie dzięki</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Przedstawiamy podgląd linków.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Opcjonalne podglądy linków są teraz obsługiwane dla niektórych najpopularniejszych witryn w Internecie.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">W dowolnej chwili możesz wyłączyć lub włączyć tę funkcję w ustawieniach Signal (Prywatność &gt; Podgląd linków).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Rozumiem</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Przedstawiamy naklejki</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Po co używać słów, gdy można używać naklejek?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Po co używać słów, skoro można używać naklejek? Dotknij tę ikonę na klawiaturze:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Zaczynajmy</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Pobieranie wiadomości…</string>
<!--GcmRefreshJob-->
@ -610,6 +582,12 @@
<item quantity="many">%1$d użytkowników</item>
<item quantity="other">%1$d użytkowników</item>
</plurals>
<plurals name="MessageRequestProfileView_members_and_invited">
<item quantity="one">%1$d członek (+%2$d zaproszony/ch)</item>
<item quantity="few">%1$d członków (+%2$d zaproszony/ch)</item>
<item quantity="many">%1$d członków (+%2$d zaproszony/ch)</item>
<item quantity="other">%1$d członków (+%2$d zaproszony/ch)</item>
</plurals>
<plurals name="MessageRequestProfileView_member_of_others">
<item quantity="one">%d inna</item>
<item quantity="few">%d inne</item>
@ -1713,8 +1691,6 @@ Otrzymano wiadomość wymiany klucz dla niepoprawnej wersji protokołu.</string>
<string name="SQLCipherMigrationHelper_migrating_signal_database">Przenoszenie bazy danych Signal</string>
<string name="PushDecryptJob_new_locked_message">Nowa zablokowana wiadomość</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Odblokuj, aby zobaczyć oczekujące wiadomości</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Odblokuj, aby ukończyć aktualizację</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Odblokuj Signal, aby ukończyć aktualizację</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Hasło kopii zapasowej</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Kopia zapasowa zostanie zapisana w pamięci urządzenia i zaszyfrowana za pomocą poniższego hasła. Musisz mieć to hasło, aby przywrócić kopię zapasową.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Zapisałem(am) to hasło. Bez tego nie będę mógł(a) przywrócić kopii zapasowej.</string>

View File

@ -347,34 +347,6 @@
<!--ShareActivity-->
<string name="ShareActivity_share_with">Encaminhar para</string>
<string name="ShareActivity_multiple_attachments_are_only_supported">Muitos anexos de uma só vez são suportados apenas para imagens e vídeos.</string>
<!--ExperienceUpgradeActivity-->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_dgaf">Boas-vindas ao Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_called_signal">TextSecure e RedPhone agora são um mensageiro privado, para todas as situações: Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_welcome_to_signal_excited">Boas-vindas ao Signal!</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal">TextSecure agora é Signal.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_textsecure_is_now_signal_long">TextSecure e RedPhone agora são um aplicativo: Signal. Clique para explorar.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_say_hello_to_video_calls">Diga olá para chamadas de vídeo seguras</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calls">O Signal agora tem suporte para chamadas de vídeo seguras. Apenas inicie uma chamada Signal normalmente, clique no botão de vídeo, e diga \"Olá\".</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling">O Signal agora tem suporte para chamadas de vídeo seguras.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_now_supports_secure_video_calling_long">O Signal agora tem suporte para chamadas de vídeo seguras. Clique para explorar.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_ready_for_your_closeup">Pronto para tirar sua foto?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_share_a_profile_photo_and_name_with_friends_on_signal">Agora você pode compartilhar um nome e foto de perfil com amigos no Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_signal_profiles_are_here">Aqui estão os perfis do Signal</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_typing_indicators">Apresentando indicadores de digitação.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_now_you_can_optionally_see_and_share_when_messages_are_being_typed">Agora você tem a opção de ver e mostrar quando mensagens estiverem sendo digitadas.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_would_you_like_to_enable_them_now">Quer habilitá-los agora?</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_typing_ui_title">Chegaram os indicadores de digitação</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_enable_typing_indicators">Habilitar indicadores de digitação</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_turn_on_typing_indicators">Ativar indicadores de digitação</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_no_thanks">Não, obrigado</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_link_previews">Apresentando pré-visualizações de links.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_optional_link_previews_are_now_supported">Agora é possível mostrar pré-visualizações de links de alguns dos sites mais populares da internet.</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_you_can_disable_or_enable_this_feature_link_previews">Você pode desativar ou ativar esta função quando quiser nas configurações do seu Signal (Privacidade &gt; Enviar pré-visualizações de links).</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_got_it">Entendi</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_introducing_stickers">Apresentando figurinhas</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers">Por que usar palavras quando você pode usar figurinhas? </string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_why_use_words_when_you_can_use_stickers_tap_this_icon">Por que usar palavras quando você pode usar figurinhas? Clique neste ícone em seu teclado:</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_lets_go">Vamos nessa!</string> -->
<!--GcmBroadcastReceiver-->
<string name="GcmBroadcastReceiver_retrieving_a_message">Recuperando uma mensagem…</string>
<!--GcmRefreshJob-->
@ -1637,8 +1609,6 @@
<string name="SQLCipherMigrationHelper_migrating_signal_database">Migrando a base de dados do Signal</string>
<string name="PushDecryptJob_new_locked_message">Nova mensagem bloqueada</string>
<string name="PushDecryptJob_unlock_to_view_pending_messages">Destranque para ver as mensagens pendentes</string>
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_unlock_to_complete_update">Destranque para completar a atualização</string> -->
<!-- Removed by excludeNonTranslatables <string name="ExperienceUpgradeActivity_please_unlock_signal_to_complete_update">Favor destrancar o Signal para completar a atualização</string> -->
<string name="enter_backup_passphrase_dialog__backup_passphrase">Frase-chave de backup</string>
<string name="backup_enable_dialog__backups_will_be_saved_to_external_storage_and_encrypted_with_the_passphrase_below_you_must_have_this_passphrase_in_order_to_restore_a_backup">Os backups serão salvos no armazenamento externo e criptografados com a frase-chave abaixo. Você precisa desta frase-chave para restaurar um backup.</string>
<string name="backup_enable_dialog__i_have_written_down_this_passphrase">Eu anotei esta frase-chave. Sem ela eu não conseguirei restaurar um backup.</string>

Some files were not shown because too many files have changed in this diff Show More