diff --git a/app/build.gradle.kts b/app/build.gradle.kts index adfefa75a7..79b5a9f760 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -19,8 +19,8 @@ apply { from("fix-profm.gradle") } -val canonicalVersionCode = 1393 -val canonicalVersionName = "6.47.4" +val canonicalVersionCode = 1394 +val canonicalVersionName = "7.0.0" val mollyRevision = 1 val postFixSize = 100 diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest.kt index 3b2ce69942..ad246536b0 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest.kt @@ -11,8 +11,6 @@ import org.signal.core.util.CursorUtil import org.thoughtcrime.securesms.profiles.ProfileName import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.testing.SignalActivityRule -import org.thoughtcrime.securesms.util.FeatureFlags -import org.thoughtcrime.securesms.util.FeatureFlagsAccessor import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.ServiceId.PNI import java.util.UUID @@ -167,8 +165,6 @@ class RecipientTableTest { @Test fun givenARecipientWithPniAndAci_whenIMarkItUnregistered_thenIExpectItToBeSplit() { - FeatureFlagsAccessor.forceValue(FeatureFlags.PHONE_NUMBER_PRIVACY, true) - val mainId = SignalDatabase.recipients.getAndPossiblyMerge(ACI_A, PNI_A, E164_A) SignalDatabase.recipients.markUnregistered(mainId) @@ -185,8 +181,6 @@ class RecipientTableTest { @Test fun givenARecipientWithPniAndAci_whenISplitItForStorageSync_thenIExpectItToBeSplit() { - FeatureFlagsAccessor.forceValue(FeatureFlags.PHONE_NUMBER_PRIVACY, true) - val mainId = SignalDatabase.recipients.getAndPossiblyMerge(ACI_A, PNI_A, E164_A) val mainRecord = SignalDatabase.recipients.getRecord(mainId) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt index 9bf07f21e5..8c24af39c6 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/database/RecipientTableTest_getAndPossiblyMerge.kt @@ -41,8 +41,6 @@ import org.thoughtcrime.securesms.mms.IncomingMessage import org.thoughtcrime.securesms.notifications.profiles.NotificationProfile import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags -import org.thoughtcrime.securesms.util.FeatureFlagsAccessor import org.thoughtcrime.securesms.util.Util import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.ServiceId.PNI @@ -58,7 +56,6 @@ class RecipientTableTest_getAndPossiblyMerge { SignalStore.account().setE164(E164_SELF) SignalStore.account().setAci(ACI_SELF) SignalStore.account().setPni(PNI_SELF) - FeatureFlagsAccessor.forceValue(FeatureFlags.PHONE_NUMBER_PRIVACY, true) } @Test diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt index 1bf3ab3c8f..5436b8396b 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragmentTest.kt @@ -57,23 +57,6 @@ class UsernameEditFragmentTest { InstrumentationApplicationDependencyProvider.clearHandlers() } - @Test - fun testUsernameCreationInRegistration() { - val scenario = createScenario(UsernameEditMode.REGISTRATION) - - scenario.moveToState(Lifecycle.State.RESUMED) - - onView(withId(R.id.toolbar)).check { view, noViewFoundException -> - noViewFoundException.assertIsNull() - val toolbar = view as Toolbar - - toolbar.navigationIcon.assertIsNull() - } - - onView(withText(R.string.UsernameEditFragment__add_a_username)).check(matches(isDisplayed())) - onView(withContentDescription(R.string.load_more_header__loading)).check(matches(withEffectiveVisibility(ViewMatchers.Visibility.GONE))) - } - @Ignore("Flakey espresso test.") @Test fun testUsernameCreationOutsideOfRegistration() { @@ -108,7 +91,7 @@ class UsernameEditFragmentTest { } ) - val scenario = createScenario(UsernameEditMode.REGISTRATION) + val scenario = createScenario(UsernameEditMode.NORMAL) scenario.moveToState(Lifecycle.State.RESUMED) onView(withId(R.id.username_text)).perform(typeText(nickname)) diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt b/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt index 782c75b419..e33b739bab 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt @@ -12,8 +12,6 @@ import org.thoughtcrime.securesms.database.RecipientTable import org.thoughtcrime.securesms.database.SignalDatabase import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.FeatureFlags -import org.thoughtcrime.securesms.util.FeatureFlagsAccessor import org.whispersystems.signalservice.api.push.ServiceId.ACI import org.whispersystems.signalservice.api.push.ServiceId.PNI import org.whispersystems.signalservice.api.storage.SignalContactRecord @@ -29,7 +27,6 @@ class ContactRecordProcessorTest { SignalStore.account().setE164(E164_SELF) SignalStore.account().setAci(ACI_SELF) SignalStore.account().setPni(PNI_SELF) - FeatureFlagsAccessor.forceValue(FeatureFlags.PHONE_NUMBER_PRIVACY, true) } @Test diff --git a/app/src/androidTest/java/org/thoughtcrime/securesms/util/FeatureFlagsAccessor.java b/app/src/androidTest/java/org/thoughtcrime/securesms/util/FeatureFlagsAccessor.java index 103b3df41c..437b1f6e77 100644 --- a/app/src/androidTest/java/org/thoughtcrime/securesms/util/FeatureFlagsAccessor.java +++ b/app/src/androidTest/java/org/thoughtcrime/securesms/util/FeatureFlagsAccessor.java @@ -6,6 +6,6 @@ public final class FeatureFlagsAccessor { public static void forceValue(String key, Object value) { - FeatureFlags.FORCED_VALUES.put(FeatureFlags.PHONE_NUMBER_PRIVACY, true); + FeatureFlags.FORCED_VALUES.put(key, value); } } diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index 2026662254..23f0c21589 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -921,11 +921,6 @@ android:windowSoftInputMode="stateVisible|adjustResize" android:exported="false"/> - - = DimensionUnit.DP.toPixels(600) || !FeatureFlags.usernames()) { + if (getResources().getDisplayMetrics().heightPixels >= DimensionUnit.DP.toPixels(600)) { this.contactFilterView.focusAndShowKeyboard(); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java index ab75168ac7..c9aaf77766 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/ContactSelectionListFragment.java @@ -894,7 +894,7 @@ private void smoothScrollChipsToEnd() { builder.arbitrary(ContactSelectionListAdapter.ArbitraryRepository.ArbitraryRow.NEW_GROUP.getCode()); } - if (findByCallback != null && FeatureFlags.usernames()) { + if (findByCallback != null) { builder.arbitrary(ContactSelectionListAdapter.ArbitraryRepository.ArbitraryRow.FIND_BY_USERNAME.getCode()); builder.arbitrary(ContactSelectionListAdapter.ArbitraryRepository.ArbitraryRow.FIND_BY_PHONE_NUMBER.getCode()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/GroupMembersDialog.java b/app/src/main/java/org/thoughtcrime/securesms/GroupMembersDialog.java index bd42e63ff3..8f33d8ad77 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/GroupMembersDialog.java +++ b/app/src/main/java/org/thoughtcrime/securesms/GroupMembersDialog.java @@ -54,7 +54,6 @@ public void display() { } private void contactClick(@NonNull Recipient recipient) { - RecipientBottomSheetDialogFragment.create(recipient.getId(), groupRecipient.requireGroupId()) - .show(fragmentActivity.getSupportFragmentManager(), "BOTTOM"); + RecipientBottomSheetDialogFragment.show(fragmentActivity.getSupportFragmentManager(), recipient.getId(), groupRecipient.requireGroupId()); } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java index 067b3acfe9..fe02026843 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/NewConversationActivity.java @@ -80,6 +80,7 @@ public class NewConversationActivity extends ContactSelectionActivity private ContactsManagementViewModel viewModel; private ActivityResultLauncher contactLauncher; + private ActivityResultLauncher createGroupLauncher; private ActivityResultLauncher findByLauncher; private final LifecycleDisposable disposables = new LifecycleDisposable(); @@ -108,6 +109,12 @@ public void onCreate(Bundle bundle, boolean ready) { } }); + createGroupLauncher = registerForActivityResult(new ActivityResultContracts.StartActivityForResult(), result -> { + if (result.getResultCode() == RESULT_OK) { + finish(); + } + }); + viewModel = new ViewModelProvider(this, factory).get(ContactsManagementViewModel.class); } @@ -216,7 +223,7 @@ private void handleManualRefresh() { } private void handleCreateGroup() { - startActivity(CreateGroupActivity.newIntent(this)); + createGroupLauncher.launch(CreateGroupActivity.newIntent(this)); } private void handleInvite() { @@ -241,7 +248,7 @@ public void onInvite() { @Override public void onNewGroup(boolean forceV1) { handleCreateGroup(); - finish(); +// finish(); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataProcessor.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataProcessor.kt index 2f671092f8..68e3452355 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataProcessor.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/processor/AccountDataProcessor.kt @@ -17,6 +17,7 @@ import org.thoughtcrime.securesms.database.SignalDatabase.Companion.recipients import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.jobs.RetrieveProfileAvatarJob import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId @@ -56,7 +57,7 @@ object AccountDataProcessor { readReceipts = TextSecurePreferences.isReadReceiptsEnabled(context), sealedSenderIndicators = TextSecurePreferences.isShowUnidentifiedDeliveryIndicatorsEnabled(context), linkPreviews = SignalStore.settings().isLinkPreviewsEnabled, - notDiscoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode.isUndiscoverable, + notDiscoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode == PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE, phoneNumberSharingMode = SignalStore.phoneNumberPrivacy().phoneNumberSharingMode.toBackupPhoneNumberSharingMode(), preferContactAvatars = SignalStore.settings().isPreferSystemContactPhotos, universalExpireTimer = SignalStore.settings().universalExpireTimer, @@ -86,7 +87,7 @@ object AccountDataProcessor { TextSecurePreferences.setTypingIndicatorsEnabled(context, settings.typingIndicators) TextSecurePreferences.setShowUnidentifiedDeliveryIndicatorsEnabled(context, settings.sealedSenderIndicators) SignalStore.settings().isLinkPreviewsEnabled = settings.linkPreviews - SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode = if (settings.notDiscoverableByPhoneNumber) PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE else PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.DISCOVERABLE + SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode = if (settings.notDiscoverableByPhoneNumber) PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE else PhoneNumberDiscoverabilityMode.DISCOVERABLE SignalStore.phoneNumberPrivacy().phoneNumberSharingMode = settings.phoneNumberSharingMode.toLocalPhoneNumberMode() SignalStore.settings().isPreferSystemContactPhotos = settings.preferContactAvatars SignalStore.settings().universalExpireTimer = settings.universalExpireTimer diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java b/app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java index 883c86f590..e842a58450 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/components/AvatarImageView.java @@ -34,6 +34,7 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.components.settings.conversation.ConversationSettingsActivity; import org.thoughtcrime.securesms.contacts.avatars.ContactPhoto; +import org.thoughtcrime.securesms.contacts.avatars.FallbackContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ProfileContactPhoto; import org.thoughtcrime.securesms.contacts.avatars.ResourceContactPhoto; import org.thoughtcrime.securesms.conversation.colors.AvatarColor; @@ -183,8 +184,18 @@ private void setAvatar(@NonNull RequestManager requestManager, @Nullable Recipie this.chatColors = chatColors; recipientContactPhoto = photo; - Drawable fallbackContactPhotoDrawable = size == SIZE_SMALL ? photo.recipient.getSmallFallbackContactPhotoDrawable(getContext(), inverted, fallbackPhotoProvider, ViewUtil.getWidth(this)) - : photo.recipient.getFallbackContactPhotoDrawable(getContext(), inverted, fallbackPhotoProvider, ViewUtil.getWidth(this)); + Recipient.FallbackPhotoProvider activeFallbackPhotoProvider = this.fallbackPhotoProvider; + if (recipient.isSelf() && avatarOptions.useSelfProfileAvatar) { + activeFallbackPhotoProvider = new Recipient.FallbackPhotoProvider() { + @Override + public @NonNull FallbackContactPhoto getPhotoForLocalNumber() { + return super.getPhotoForRecipientWithName(recipient.getDisplayName(getContext()), ViewUtil.getWidth(AvatarImageView.this)); + } + }; + } + + Drawable fallbackContactPhotoDrawable = size == SIZE_SMALL ? photo.recipient.getSmallFallbackContactPhotoDrawable(getContext(), inverted, activeFallbackPhotoProvider, ViewUtil.getWidth(this)) + : photo.recipient.getFallbackContactPhotoDrawable(getContext(), inverted, activeFallbackPhotoProvider, ViewUtil.getWidth(this)); if (fixedSizeTarget != null) { requestManager.clear(fixedSizeTarget); @@ -244,8 +255,7 @@ private void setAvatarClickHandler(@NonNull final Recipient recipient, boolean q ConversationSettingsActivity.createTransitionBundle(context, this)); } else { if (context instanceof FragmentActivity) { - RecipientBottomSheetDialogFragment.create(recipient.getId(), null) - .show(((FragmentActivity) context).getSupportFragmentManager(), "BOTTOM"); + RecipientBottomSheetDialogFragment.show(((FragmentActivity) context).getSupportFragmentManager(), recipient.getId(), null); } else { context.startActivity(ConversationSettingsActivity.forRecipient(context, recipient.getId()), ConversationSettingsActivity.createTransitionBundle(context, this)); diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/UsernameOutOfSyncReminder.kt b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/UsernameOutOfSyncReminder.kt index b36642e051..574350c7b1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/reminder/UsernameOutOfSyncReminder.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/reminder/UsernameOutOfSyncReminder.kt @@ -4,7 +4,6 @@ import android.content.Context import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.keyvalue.AccountValues.UsernameSyncState import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.util.FeatureFlags /** * Displays a reminder message when the local username gets out of sync with @@ -42,14 +41,10 @@ class UsernameOutOfSyncReminder : Reminder(NO_RESOURCE) { companion object { @JvmStatic fun isEligible(): Boolean { - return if (FeatureFlags.usernames()) { - when (SignalStore.account().usernameSyncState) { - UsernameSyncState.USERNAME_AND_LINK_CORRUPTED -> true - UsernameSyncState.LINK_CORRUPTED -> true - UsernameSyncState.IN_SYNC -> false - } - } else { - false + return when (SignalStore.account().usernameSyncState) { + UsernameSyncState.USERNAME_AND_LINK_CORRUPTED -> true + UsernameSyncState.LINK_CORRUPTED -> true + UsernameSyncState.IN_SYNC -> false } } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt index 0aa6639d6b..9f94b1b1c9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/AppSettingsFragment.kt @@ -9,6 +9,7 @@ import androidx.navigation.fragment.findNavController import org.greenrobot.eventbus.EventBus import org.greenrobot.eventbus.Subscribe import org.greenrobot.eventbus.ThreadMode +import org.signal.core.util.isNotNullOrBlank import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.badges.BadgeImageView import org.thoughtcrime.securesms.components.AvatarImageView @@ -25,7 +26,6 @@ import org.thoughtcrime.securesms.components.settings.PreferenceModel import org.thoughtcrime.securesms.components.settings.PreferenceViewHolder import org.thoughtcrime.securesms.components.settings.configure import org.thoughtcrime.securesms.events.ReminderUpdateEvent -import org.thoughtcrime.securesms.keyvalue.AccountValues import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.phonenumbers.PhoneNumberFormatter import org.thoughtcrime.securesms.recipients.Recipient @@ -304,7 +304,7 @@ class AppSettingsFragment : DSLSettingsFragment( summaryView.visibility = View.VISIBLE avatarView.visibility = View.VISIBLE - if (FeatureFlags.usernames() && SignalStore.account().usernameSyncState == AccountValues.UsernameSyncState.IN_SYNC) { + if (SignalStore.account().username.isNotNullOrBlank()) { qrButton.visibility = View.VISIBLE qrButton.isClickable = true qrButton.setOnClickListener { model.onQrButtonClicked() } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt index 533ac37bff..6551ff9cde 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/InternalSettingsFragment.kt @@ -627,13 +627,6 @@ class InternalSettingsFragment : DSLSettingsFragment(R.string.preferences__inter } ) - clickPref( - title = DSLSettingsText.from("Clear Username education ui hint"), - onClick = { - SignalStore.uiHints().clearHasSeenUsernameEducation() - } - ) - clickPref( title = DSLSettingsText.from("Corrupt username"), summary = DSLSettingsText.from("Changes our local username without telling the server so it falls out of sync. Refresh profile afterwards to trigger corruption."), diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/search/InternalSearchFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/search/InternalSearchFragment.kt index a168664dc9..c282b03f4e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/search/InternalSearchFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/internal/search/InternalSearchFragment.kt @@ -95,8 +95,7 @@ fun ResultItem(result: InternalSearchResult, modifier: Modifier = Modifier) { .clickable { if (activity != null) { RecipientBottomSheetDialogFragment - .create(result.id, result.groupId) - .show(activity.supportFragmentManager, "TAG") + .show(activity.supportFragmentManager, result.id, result.groupId) } } .padding(8.dp) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt index ed03d76473..877117948b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/PrivacySettingsFragment.kt @@ -35,7 +35,6 @@ import org.thoughtcrime.securesms.preferences.widgets.PassphraseLockTriggerPrefe import org.thoughtcrime.securesms.util.CommunicationActions import org.thoughtcrime.securesms.util.ConversationUtil import org.thoughtcrime.securesms.util.ExpirationUtil -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.SecurePreferenceManager import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.WindowUtil @@ -84,6 +83,40 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac private fun getConfiguration(state: PrivacySettingsState): DSLConfiguration { return configure { + + sectionHeaderPref(R.string.PrivacySettingsFragment__messaging) + + clickPref( + title = DSLSettingsText.from(R.string.preferences_app_protection__phone_number), + summary = DSLSettingsText.from(R.string.preferences_app_protection__choose_who_can_see), + onClick = { + Navigation.findNavController(requireView()) + .safeNavigate(R.id.action_privacySettingsFragment_to_phoneNumberPrivacySettingsFragment) + } + ) + + switchPref( + title = DSLSettingsText.from(R.string.preferences__read_receipts), + summary = DSLSettingsText.from(R.string.preferences__if_read_receipts_are_disabled_you_wont_be_able_to_see_read_receipts), + isChecked = state.readReceipts, + isEnabled = SignalStore.account().isPrimaryDevice, + onClick = { + viewModel.setReadReceiptsEnabled(!state.readReceipts) + } + ) + + switchPref( + title = DSLSettingsText.from(R.string.preferences__typing_indicators), + summary = DSLSettingsText.from(R.string.preferences__if_typing_indicators_are_disabled_you_wont_be_able_to_see_typing_indicators), + isChecked = state.typingIndicators, + isEnabled = SignalStore.account().isPrimaryDevice, + onClick = { + viewModel.setTypingIndicatorsEnabled(!state.typingIndicators) + } + ) + + dividerPref() + sectionHeaderPref(DSLSettingsText.from(R.string.PrivacySettingsFragment_data_at_rest)) switchPref( @@ -170,43 +203,6 @@ class PrivacySettingsFragment : DSLSettingsFragment(R.string.preferences__privac dividerPref() - sectionHeaderPref(R.string.PrivacySettingsFragment__messaging) - - if (FeatureFlags.phoneNumberPrivacy()) { - clickPref( - title = DSLSettingsText.from(R.string.preferences_app_protection__phone_number), - summary = DSLSettingsText.from(R.string.preferences_app_protection__choose_who_can_see), - onClick = { - Navigation.findNavController(requireView()) - .safeNavigate(R.id.action_privacySettingsFragment_to_phoneNumberPrivacySettingsFragment) - } - ) - - dividerPref() - } - - switchPref( - title = DSLSettingsText.from(R.string.preferences__read_receipts), - summary = DSLSettingsText.from(R.string.preferences__if_read_receipts_are_disabled_you_wont_be_able_to_see_read_receipts), - isChecked = state.readReceipts, - isEnabled = SignalStore.account().isPrimaryDevice, - onClick = { - viewModel.setReadReceiptsEnabled(!state.readReceipts) - } - ) - - switchPref( - title = DSLSettingsText.from(R.string.preferences__typing_indicators), - summary = DSLSettingsText.from(R.string.preferences__if_typing_indicators_are_disabled_you_wont_be_able_to_see_typing_indicators), - isChecked = state.typingIndicators, - isEnabled = SignalStore.account().isPrimaryDevice, - onClick = { - viewModel.setTypingIndicatorsEnabled(!state.typingIndicators) - } - ) - - dividerPref() - sectionHeaderPref(R.string.PrivacySettingsFragment__disappearing_messages) customPref( diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsViewModel.kt index 4f1e286174..8ddc73e187 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/privacy/pnp/PhoneNumberPrivacySettingsViewModel.kt @@ -19,7 +19,7 @@ class PhoneNumberPrivacySettingsViewModel : ViewModel() { private val _state = mutableStateOf( PhoneNumberPrivacySettingsState( phoneNumberSharing = SignalStore.phoneNumberPrivacy().isPhoneNumberSharingEnabled, - discoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().isDiscoverableByPhoneNumber + discoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode != PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE ) ) @@ -60,7 +60,7 @@ class PhoneNumberPrivacySettingsViewModel : ViewModel() { fun refresh() { _state.value = PhoneNumberPrivacySettingsState( phoneNumberSharing = SignalStore.phoneNumberPrivacy().isPhoneNumberSharingEnabled, - discoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().isDiscoverableByPhoneNumber + discoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode != PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE ) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt index 66bd4efcd1..f6629e5d09 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkSettingsFragment.kt @@ -1,7 +1,8 @@ -@file:OptIn(ExperimentalMaterial3Api::class) +@file:OptIn(ExperimentalMaterial3Api::class, ExperimentalPermissionsApi::class) package org.thoughtcrime.securesms.components.settings.app.usernamelinks.main +import android.app.Activity import android.content.Intent import android.content.res.Configuration import android.graphics.Bitmap @@ -11,6 +12,7 @@ import androidx.compose.animation.AnimatedVisibility import androidx.compose.animation.slideInHorizontally import androidx.compose.animation.slideOutHorizontally import androidx.compose.foundation.layout.Arrangement +import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.defaultMinSize import androidx.compose.foundation.layout.fillMaxWidth @@ -45,6 +47,8 @@ import androidx.compose.ui.unit.dp import androidx.core.app.ShareCompat import androidx.fragment.app.setFragmentResultListener import androidx.fragment.app.viewModels +import androidx.lifecycle.Lifecycle +import androidx.lifecycle.LifecycleOwner import androidx.navigation.NavController import androidx.navigation.fragment.findNavController import com.google.accompanist.permissions.ExperimentalPermissionsApi @@ -52,6 +56,7 @@ import com.google.accompanist.permissions.PermissionState import com.google.accompanist.permissions.PermissionStatus import com.google.accompanist.permissions.isGranted import com.google.accompanist.permissions.rememberPermissionState +import io.reactivex.rxjava3.disposables.CompositeDisposable import kotlinx.coroutines.CoroutineScope import org.signal.core.ui.Buttons import org.signal.core.ui.Dialogs @@ -59,6 +64,9 @@ import org.signal.core.ui.Snackbars import org.signal.core.ui.theme.SignalTheme import org.signal.core.util.concurrent.LifecycleDisposable import org.thoughtcrime.securesms.R +import org.thoughtcrime.securesms.components.settings.app.usernamelinks.QrCodeData +import org.thoughtcrime.securesms.components.settings.app.usernamelinks.QrCodeState +import org.thoughtcrime.securesms.components.settings.app.usernamelinks.UsernameQrCodeColorScheme import org.thoughtcrime.securesms.components.settings.app.usernamelinks.main.UsernameLinkSettingsState.ActiveTab import org.thoughtcrime.securesms.compose.ComposeFragment import org.thoughtcrime.securesms.providers.BlobProvider @@ -80,91 +88,33 @@ class UsernameLinkSettingsFragment : ComposeFragment() { } } - @OptIn(ExperimentalMaterial3Api::class) @Composable override fun FragmentContent() { val state by viewModel.state - val snackbarHostState: SnackbarHostState = remember { SnackbarHostState() } - val scope: CoroutineScope = rememberCoroutineScope() val navController: NavController by remember { mutableStateOf(findNavController()) } - var showResetDialog: Boolean by remember { mutableStateOf(false) } - val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() - val cameraPermissionState: PermissionState = rememberPermissionState(permission = android.Manifest.permission.CAMERA) { - viewModel.onTabSelected(ActiveTab.Scan) - } val linkCopiedEvent: UUID? by viewModel.linkCopiedEvent + val helpText = stringResource(id = R.string.UsernameLinkSettings_scan_this_qr_code) - val linkCopiedString = stringResource(R.string.UsernameLinkSettings_link_copied_toast) - - LaunchedEffect(linkCopiedEvent) { - if (linkCopiedEvent != null) { - snackbarHostState.showSnackbar(linkCopiedString) - } - } - - Scaffold( - snackbarHost = { Snackbars.Host(snackbarHostState) }, - topBar = { - TopAppBarContent( - activeTab = state.activeTab, - scrollBehavior = scrollBehavior, - onCodeTabSelected = { viewModel.onTabSelected(ActiveTab.Code) }, - onScanTabSelected = { viewModel.onTabSelected(ActiveTab.Scan) }, - cameraPermissionState = cameraPermissionState - ) - }, - modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection) - ) { contentPadding -> - - if (state.indeterminateProgress) { - Dialogs.IndeterminateProgressDialog() - } - - AnimatedVisibility( - visible = state.activeTab == ActiveTab.Code, - enter = slideInHorizontally(initialOffsetX = { fullWidth -> -fullWidth }), - exit = slideOutHorizontally(targetOffsetX = { fullWidth -> -fullWidth }) - ) { - val helpText = stringResource(id = R.string.UsernameLinkSettings_scan_this_qr_code) - UsernameLinkShareScreen( - state = state, - snackbarHostState = snackbarHostState, - scope = scope, - modifier = Modifier.padding(contentPadding), - navController = navController, - onShareBadge = { - shareQrBadge(viewModel.generateQrCodeImage(helpText)) - }, - onResetClicked = { showResetDialog = true }, - onLinkResultHandled = { viewModel.onUsernameLinkResetResultHandled() } - ) - } - - AnimatedVisibility( - visible = state.activeTab == ActiveTab.Scan, - enter = slideInHorizontally(initialOffsetX = { fullWidth -> fullWidth }), - exit = slideOutHorizontally(targetOffsetX = { fullWidth -> fullWidth }) - ) { - UsernameQrScanScreen( - lifecycleOwner = viewLifecycleOwner, - disposables = disposables.disposables, - qrScanResult = state.qrScanResult, - onQrCodeScanned = { data -> viewModel.onQrCodeScanned(data) }, - onQrResultHandled = { viewModel.onQrResultHandled() }, - modifier = Modifier.padding(contentPadding) - ) - } + val cameraPermissionState: PermissionState = rememberPermissionState(permission = android.Manifest.permission.CAMERA) { + viewModel.onTabSelected(ActiveTab.Scan) } - if (showResetDialog) { - ResetDialog( - onConfirm = { - viewModel.onUsernameLinkReset() - showResetDialog = false - }, - onDismiss = { showResetDialog = false } - ) - } + MainScreen( + state = state, + navController = navController, + lifecycleOwner = viewLifecycleOwner, + disposables = disposables.disposables, + cameraPermissionState = cameraPermissionState, + onCodeTabSelected = { viewModel.onTabSelected(ActiveTab.Code) }, + onScanTabSelected = { viewModel.onTabSelected(ActiveTab.Scan) }, + onUsernameLinkResetResultHandled = { viewModel.onUsernameLinkResetResultHandled() }, + onShareBadge = { shareQrBadge(requireActivity(), viewModel.generateQrCodeImage(helpText)) }, + onQrCodeScanned = { data -> viewModel.onQrCodeScanned(data) }, + onQrResultHandled = { viewModel.onQrResultHandled() }, + onLinkReset = { viewModel.onUsernameLinkReset() }, + onBackNavigationPressed = { requireActivity().onBackPressed() }, + linkCopiedEvent = linkCopiedEvent + ) } override fun onViewCreated(view: View, savedInstanceState: Bundle?) { @@ -175,153 +125,266 @@ class UsernameLinkSettingsFragment : ComposeFragment() { super.onResume() viewModel.onResume() } +} - @OptIn(ExperimentalMaterial3Api::class) - @Composable - private fun TopAppBarContent( - activeTab: ActiveTab, - scrollBehavior: TopAppBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), - onCodeTabSelected: () -> Unit = {}, - onScanTabSelected: () -> Unit = {}, - cameraPermissionState: PermissionState = previewPermissionState() - ) { - CenterAlignedTopAppBar( - modifier = Modifier - .fillMaxWidth(), - title = { - Row( - modifier = Modifier - .fillMaxWidth(), - horizontalArrangement = Arrangement.Center, - verticalAlignment = Alignment.CenterVertically - ) { - TabButton( - label = stringResource(R.string.UsernameLinkSettings_code_tab_name), - active = activeTab == ActiveTab.Code, - onClick = onCodeTabSelected, - modifier = Modifier.padding(end = 8.dp) - ) - TabButton( - label = stringResource(R.string.UsernameLinkSettings_scan_tab_name), - active = activeTab == ActiveTab.Scan, - onClick = { - if (cameraPermissionState.status.isGranted) { - onScanTabSelected() - } else { - cameraPermissionState.launchPermissionRequest() - } - }, - modifier = Modifier.padding(end = 8.dp) - ) - } - }, - navigationIcon = { - IconButton( - onClick = { requireActivity().onBackPressed() } - ) { - Icon( - painter = painterResource(R.drawable.symbol_x_24), - contentDescription = stringResource(android.R.string.cancel) - ) - } - }, - scrollBehavior = scrollBehavior - ) +@Composable +private fun MainScreen( + state: UsernameLinkSettingsState, + navController: NavController? = null, + lifecycleOwner: LifecycleOwner = previewLifecycleOwner, + disposables: CompositeDisposable = CompositeDisposable(), + cameraPermissionState: PermissionState = previewPermissionState(), + onCodeTabSelected: () -> Unit = {}, + onScanTabSelected: () -> Unit = {}, + onUsernameLinkResetResultHandled: () -> Unit = {}, + onShareBadge: () -> Unit = {}, + onQrCodeScanned: (String) -> Unit = {}, + onQrResultHandled: () -> Unit = {}, + onLinkReset: () -> Unit = {}, + onBackNavigationPressed: () -> Unit = {}, + linkCopiedEvent: UUID? = null +) { + val snackbarHostState: SnackbarHostState = remember { SnackbarHostState() } + val scope: CoroutineScope = rememberCoroutineScope() + var showResetDialog: Boolean by remember { mutableStateOf(false) } + val scrollBehavior = TopAppBarDefaults.pinnedScrollBehavior() + + val linkCopiedString = stringResource(R.string.UsernameLinkSettings_link_copied_toast) + + LaunchedEffect(linkCopiedEvent) { + if (linkCopiedEvent != null) { + snackbarHostState.showSnackbar(linkCopiedString) + } } - @Composable - private fun TabButton(label: String, active: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier) { - val colors = if (active) { - ButtonDefaults.filledTonalButtonColors() - } else { - ButtonDefaults.buttonColors( - containerColor = SignalTheme.colors.colorSurface2, - contentColor = MaterialTheme.colorScheme.onSurface + Scaffold( + snackbarHost = { Snackbars.Host(snackbarHostState) }, + topBar = { + TopAppBarContent( + activeTab = state.activeTab, + scrollBehavior = scrollBehavior, + onCodeTabSelected = onCodeTabSelected, + onScanTabSelected = onScanTabSelected, + cameraPermissionState = cameraPermissionState, + onBackNavigationPressed = onBackNavigationPressed ) + }, + modifier = Modifier.nestedScroll(scrollBehavior.nestedScrollConnection) + ) { contentPadding -> + + if (state.indeterminateProgress) { + Dialogs.IndeterminateProgressDialog() } - Buttons.Small( - onClick = onClick, - modifier = modifier.defaultMinSize(minWidth = 100.dp), - shape = RoundedCornerShape(12.dp), - colors = colors + + AnimatedVisibility( + visible = state.activeTab == ActiveTab.Code, + enter = slideInHorizontally(initialOffsetX = { fullWidth -> -fullWidth }), + exit = slideOutHorizontally(targetOffsetX = { fullWidth -> -fullWidth }) ) { - Text(label) + UsernameLinkShareScreen( + state = state, + snackbarHostState = snackbarHostState, + scope = scope, + modifier = Modifier.padding(contentPadding), + navController = navController, + onShareBadge = onShareBadge, + onResetClicked = { showResetDialog = true }, + onLinkResultHandled = onUsernameLinkResetResultHandled + ) + } + + AnimatedVisibility( + visible = state.activeTab == ActiveTab.Scan, + enter = slideInHorizontally(initialOffsetX = { fullWidth -> fullWidth }), + exit = slideOutHorizontally(targetOffsetX = { fullWidth -> fullWidth }) + ) { + UsernameQrScanScreen( + lifecycleOwner = lifecycleOwner, + disposables = disposables, + qrScanResult = state.qrScanResult, + onQrCodeScanned = onQrCodeScanned, + onQrResultHandled = onQrResultHandled, + modifier = Modifier.padding(contentPadding) + ) } } - @Composable - private fun ResetDialog(onConfirm: () -> Unit, onDismiss: () -> Unit) { - Dialogs.SimpleAlertDialog( - title = stringResource(id = R.string.UsernameLinkSettings_reset_link_dialog_title), - body = stringResource(id = R.string.UsernameLinkSettings_reset_link_dialog_body), - confirm = stringResource(id = R.string.UsernameLinkSettings_reset_link_dialog_confirm_button), - dismiss = stringResource(id = android.R.string.cancel), - onConfirm = onConfirm, - onDismiss = onDismiss + if (showResetDialog) { + ResetDialog( + onConfirm = { + onLinkReset() + showResetDialog = false + }, + onDismiss = { showResetDialog = false } ) } +} - @Preview - @Composable - private fun PreviewAppBar() { - SignalTheme { - Surface { +@Composable +private fun TopAppBarContent( + activeTab: ActiveTab, + scrollBehavior: TopAppBarScrollBehavior = TopAppBarDefaults.pinnedScrollBehavior(), + onCodeTabSelected: () -> Unit = {}, + onScanTabSelected: () -> Unit = {}, + cameraPermissionState: PermissionState = previewPermissionState(), + onBackNavigationPressed: () -> Unit = {} +) { + CenterAlignedTopAppBar( + modifier = Modifier + .fillMaxWidth(), + title = { + Row( + modifier = Modifier + .fillMaxWidth(), + horizontalArrangement = Arrangement.Center, + verticalAlignment = Alignment.CenterVertically + ) { + TabButton( + label = stringResource(R.string.UsernameLinkSettings_code_tab_name), + active = activeTab == ActiveTab.Code, + onClick = onCodeTabSelected, + modifier = Modifier.padding(end = 8.dp) + ) + TabButton( + label = stringResource(R.string.UsernameLinkSettings_scan_tab_name), + active = activeTab == ActiveTab.Scan, + onClick = { + if (cameraPermissionState.status.isGranted) { + onScanTabSelected() + } else { + cameraPermissionState.launchPermissionRequest() + } + }, + modifier = Modifier.padding(end = 8.dp) + ) + } + }, + navigationIcon = { + IconButton( + onClick = onBackNavigationPressed + ) { + Icon( + painter = painterResource(R.drawable.symbol_x_24), + contentDescription = stringResource(android.R.string.cancel) + ) + } + }, + scrollBehavior = scrollBehavior + ) +} + +@Composable +private fun TabButton(label: String, active: Boolean, onClick: () -> Unit, modifier: Modifier = Modifier) { + val colors = if (active) { + ButtonDefaults.filledTonalButtonColors() + } else { + ButtonDefaults.buttonColors( + containerColor = SignalTheme.colors.colorSurface2, + contentColor = MaterialTheme.colorScheme.onSurface + ) + } + Buttons.Small( + onClick = onClick, + modifier = modifier.defaultMinSize(minWidth = 100.dp), + shape = RoundedCornerShape(12.dp), + colors = colors + ) { + Text(label) + } +} + +@Composable +private fun ResetDialog(onConfirm: () -> Unit, onDismiss: () -> Unit) { + Dialogs.SimpleAlertDialog( + title = stringResource(id = R.string.UsernameLinkSettings_reset_link_dialog_title), + body = stringResource(id = R.string.UsernameLinkSettings_reset_link_dialog_body), + confirm = stringResource(id = R.string.UsernameLinkSettings_reset_link_dialog_confirm_button), + dismiss = stringResource(id = android.R.string.cancel), + onConfirm = onConfirm, + onDismiss = onDismiss + ) +} + +@Preview(name = "Light Theme", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun AppBarPreview() { + SignalTheme { + Surface { + Column { TopAppBarContent(activeTab = ActiveTab.Code) + TopAppBarContent(activeTab = ActiveTab.Scan) } } } +} - @Preview(name = "Light Theme", uiMode = Configuration.UI_MODE_NIGHT_NO) - @Preview(name = "Dark Theme", uiMode = Configuration.UI_MODE_NIGHT_YES) - @Composable - private fun PreviewAll() { - FragmentContent() +@Preview(name = "Light Theme", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun MainScreenPreview() { + SignalTheme { + MainScreen( + state = UsernameLinkSettingsState( + activeTab = ActiveTab.Code, + username = "PeterParker.42", + usernameLinkState = UsernameLinkState.Present("https://signal.org"), + qrCodeState = QrCodeState.Present(QrCodeData.forData("PeterParker.42", 64)), + qrCodeColorScheme = UsernameQrCodeColorScheme.Orange + ) + ) } +} - @Preview - @Composable - private fun PreviewResetDialog() { - SignalTheme { - Surface { - ResetDialog(onConfirm = {}, onDismiss = {}) - } +@Preview(name = "Light Theme", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ResetDialogPreview() { + SignalTheme { + Surface { + ResetDialog(onConfirm = {}, onDismiss = {}) } } +} - private fun previewPermissionState(): PermissionState { - return object : PermissionState { - override val permission: String = "" - override val status: PermissionStatus = PermissionStatus.Granted - override fun launchPermissionRequest() = Unit - } +private fun previewPermissionState(): PermissionState { + return object : PermissionState { + override val permission: String = "" + override val status: PermissionStatus = PermissionStatus.Granted + override fun launchPermissionRequest() = Unit } +} - private fun shareQrBadge(badge: Bitmap?) { - if (badge == null) { - return - } +private val previewLifecycleOwner: LifecycleOwner = object : LifecycleOwner { + override val lifecycle: Lifecycle + get() = throw UnsupportedOperationException("Only for tests") +} + +private fun shareQrBadge(activity: Activity, badge: Bitmap?) { + if (badge == null) { + return + } - try { - ByteArrayOutputStream().use { byteArrayOutputStream -> - badge.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream) - byteArrayOutputStream.flush() - val bytes = byteArrayOutputStream.toByteArray() - val shareUri = BlobProvider.getInstance() - .forData(bytes) - .withMimeType("image/png") - .withFileName("SignalGroupQr.png") - .createForSingleSessionInMemory() + try { + ByteArrayOutputStream().use { byteArrayOutputStream -> + badge.compress(Bitmap.CompressFormat.PNG, 100, byteArrayOutputStream) + byteArrayOutputStream.flush() + val bytes = byteArrayOutputStream.toByteArray() + val shareUri = BlobProvider.getInstance() + .forData(bytes) + .withMimeType("image/png") + .withFileName("SignalGroupQr.png") + .createForSingleSessionInMemory() - val intent = ShareCompat.IntentBuilder.from(requireActivity()) - .setType("image/png") - .setStream(shareUri) - .createChooserIntent() - .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) + val intent = ShareCompat.IntentBuilder(activity) + .setType("image/png") + .setStream(shareUri) + .createChooserIntent() + .addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION) - startActivity(intent) - } - } finally { - badge.recycle() + activity.startActivity(intent) } + } finally { + badge.recycle() } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt index e27bb57846..8122d57235 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/app/usernamelinks/main/UsernameLinkShareScreen.kt @@ -44,6 +44,8 @@ import org.thoughtcrime.securesms.components.settings.app.usernamelinks.Username import org.thoughtcrime.securesms.components.settings.app.usernamelinks.main.UsernameLinkSettingsState.ActiveTab import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.navigation.safeNavigate +import org.whispersystems.signalservice.api.push.UsernameLinkComponents +import java.util.UUID /** * A screen that shows all the data around your username link and how to share it, including a QR code. @@ -54,7 +56,7 @@ fun UsernameLinkShareScreen( onLinkResultHandled: () -> Unit, snackbarHostState: SnackbarHostState, scope: CoroutineScope, - navController: NavController, + navController: NavController?, onShareBadge: () -> Unit, modifier: Modifier = Modifier, onResetClicked: () -> Unit @@ -68,6 +70,12 @@ fun UsernameLinkShareScreen( UsernameLinkResetResult.NetworkError -> { ResetLinkResultDialog(stringResource(R.string.UsernameLinkSettings_reset_link_result_network_error), onDismiss = onLinkResultHandled) } + UsernameLinkResetResult.UnexpectedError -> { + ResetLinkResultDialog(stringResource(R.string.UsernameLinkSettings_reset_link_result_unknown_error), onDismiss = onLinkResultHandled) + } + is UsernameLinkResetResult.Success -> { + ResetLinkResultDialog(stringResource(R.string.UsernameLinkSettings_reset_link_result_success), onDismiss = onLinkResultHandled) + } else -> {} } @@ -93,9 +101,9 @@ fun UsernameLinkShareScreen( ButtonBar( onShareClicked = onShareBadge, - onColorClicked = { navController.safeNavigate(UsernameLinkSettingsFragmentDirections.actionUsernameLinkSettingsFragmentToUsernameLinkQrColorPickerFragment()) }, + onColorClicked = { navController?.safeNavigate(UsernameLinkSettingsFragmentDirections.actionUsernameLinkSettingsFragmentToUsernameLinkQrColorPickerFragment()) }, onLinkClicked = { - navController.safeNavigate(UsernameLinkSettingsFragmentDirections.actionUsernameLinkSettingsFragmentToUsernameLinkShareBottomSheet()) + navController?.safeNavigate(UsernameLinkSettingsFragmentDirections.actionUsernameLinkSettingsFragmentToUsernameLinkShareBottomSheet()) }, linkState = state.usernameLinkState ) @@ -223,6 +231,82 @@ private fun ScreenPreview() { } } +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewResetSuccess() { + SignalTheme { + Surface { + UsernameLinkShareScreen( + state = previewState().copy(usernameLinkResetResult = UsernameLinkResetResult.Success(UsernameLinkComponents(Util.getSecretBytes(32), UUID.randomUUID()))), + snackbarHostState = SnackbarHostState(), + scope = rememberCoroutineScope(), + navController = NavController(LocalContext.current), + onShareBadge = {}, + onResetClicked = {}, + onLinkResultHandled = {} + ) + } + } +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewResetNetworkError() { + SignalTheme { + Surface { + UsernameLinkShareScreen( + state = previewState().copy(usernameLinkResetResult = UsernameLinkResetResult.NetworkError), + snackbarHostState = SnackbarHostState(), + scope = rememberCoroutineScope(), + navController = NavController(LocalContext.current), + onShareBadge = {}, + onResetClicked = {}, + onLinkResultHandled = {} + ) + } + } +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewResetNetworkUnavailable() { + SignalTheme { + Surface { + UsernameLinkShareScreen( + state = previewState().copy(usernameLinkResetResult = UsernameLinkResetResult.NetworkUnavailable), + snackbarHostState = SnackbarHostState(), + scope = rememberCoroutineScope(), + navController = NavController(LocalContext.current), + onShareBadge = {}, + onResetClicked = {}, + onLinkResultHandled = {} + ) + } + } +} + +@Preview(name = "Light Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "screen", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ScreenPreviewResetUnexpectedError() { + SignalTheme { + Surface { + UsernameLinkShareScreen( + state = previewState().copy(usernameLinkResetResult = UsernameLinkResetResult.UnexpectedError), + snackbarHostState = SnackbarHostState(), + scope = rememberCoroutineScope(), + navController = NavController(LocalContext.current), + onShareBadge = {}, + onResetClicked = {}, + onLinkResultHandled = {} + ) + } + } +} + @Preview(name = "Light Theme", group = "LinkRow", uiMode = Configuration.UI_MODE_NIGHT_NO) @Preview(name = "Dark Theme", group = "LinkRow", uiMode = Configuration.UI_MODE_NIGHT_YES) @Composable diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt index 09904e5cc8..5047fde757 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/ConversationSettingsFragment.kt @@ -690,7 +690,7 @@ class ConversationSettingsFragment : DSLSettingsFragment( recipient = member.member, isAdmin = member.isAdmin, onClick = { - RecipientBottomSheetDialogFragment.create(member.member.id, groupState.groupId).show(parentFragmentManager, "BOTTOM") + RecipientBottomSheetDialogFragment.show(parentFragmentManager, member.member.id, groupState.groupId) } ) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt index 6d25752ed6..1d65a97ae7 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/components/settings/conversation/InternalConversationSettingsFragment.kt @@ -28,7 +28,6 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientForeverObserver import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.subscription.Subscriber -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.Util import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter @@ -260,11 +259,7 @@ class InternalConversationSettingsFragment : DSLSettingsFragment( SignalDatabase.recipients.debugClearE164AndPni(recipient.id) - val splitRecipientId: RecipientId = if (FeatureFlags.phoneNumberPrivacy()) { - SignalDatabase.recipients.getAndPossiblyMergePnpVerified(null, recipient.pni.orElse(null), recipient.requireE164()) - } else { - SignalDatabase.recipients.getAndPossiblyMerge(recipient.pni.orElse(null), recipient.requireE164()) - } + val splitRecipientId: RecipientId = SignalDatabase.recipients.getAndPossiblyMergePnpVerified(null, recipient.pni.orElse(null), recipient.requireE164()) val splitRecipient: Recipient = Recipient.resolved(splitRecipientId) val splitThreadId: Long = SignalDatabase.threads.getOrCreateThreadIdFor(splitRecipient) @@ -287,7 +282,6 @@ class InternalConversationSettingsFragment : DSLSettingsFragment( clickPref( title = DSLSettingsText.from("Split without creating threads"), summary = DSLSettingsText.from("Splits this contact into two recipients so you can test merging them together. This will become the PNI-based recipient. Another recipient will be made with this ACI and profile key. Doing a CDS refresh should allow you to see a Session Switchover Event, as long as you had a session with this PNI."), - isEnabled = FeatureFlags.phoneNumberPrivacy(), onClick = { MaterialAlertDialogBuilder(requireContext()) .setTitle("Are you sure?") diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSource.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSource.kt index 4e21656809..6ca89f4ff1 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSource.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/paged/ContactSearchPagedDataSource.kt @@ -20,7 +20,6 @@ import org.thoughtcrime.securesms.search.MessageResult import org.thoughtcrime.securesms.search.MessageSearchResult import org.thoughtcrime.securesms.search.SearchRepository import org.thoughtcrime.securesms.search.ThreadSearchResult -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.UsernameUtil import java.util.concurrent.TimeUnit @@ -189,14 +188,10 @@ class ContactSearchPagedDataSource( return false } - return if (FeatureFlags.usernames()) { - NumberUtil.isVisuallyValidNumberOrEmail(query) - } else { - NumberUtil.isValidSmsOrEmail(query) - } + return NumberUtil.isVisuallyValidNumberOrEmail(query) } private fun isPossiblyUsername(query: String?): Boolean { - return query != null && FeatureFlags.usernames() && UsernameUtil.isValidUsernameForSearch(query) + return query != null && UsernameUtil.isValidUsernameForSearch(query) } private fun getPossiblePhoneNumber(section: ContactSearchConfiguration.Section.PhoneNumber, query: String?): List { return if (isPossiblyPhoneNumber(query)) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt index 32aad8cba7..7a2ac68bc8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscovery.kt @@ -25,7 +25,6 @@ import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.recipients.RecipientId import org.thoughtcrime.securesms.registration.RegistrationUtil import org.thoughtcrime.securesms.storage.StorageSyncHelper -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.TextSecurePreferences import org.thoughtcrime.securesms.util.Util import org.whispersystems.signalservice.api.push.SignalServiceAddress @@ -70,7 +69,7 @@ object ContactDiscovery { context = context, descriptor = "refresh-all", refresh = { - ContactDiscoveryRefreshV2.refreshAll(context, useCompat = FeatureFlags.cdsCompatMode()) + ContactDiscoveryRefreshV2.refreshAll(context) }, removeSystemContactLinksIfMissing = true, notifyOfNewUsers = notifyOfNewUsers, @@ -87,9 +86,7 @@ object ContactDiscovery { refreshRecipients( context = context, descriptor = "refresh-multiple", - refresh = { - ContactDiscoveryRefreshV2.refresh(context, recipients, useCompat = FeatureFlags.cdsCompatMode()) - }, + refresh = { ContactDiscoveryRefreshV2.refresh(context, recipients) }, removeSystemContactLinksIfMissing = false, notifyOfNewUsers = notifyOfNewUsers ) @@ -103,9 +100,7 @@ object ContactDiscovery { val result: RefreshResult = refreshRecipients( context = context, descriptor = "refresh-single", - refresh = { - ContactDiscoveryRefreshV2.refresh(context, listOf(recipient), useCompat = FeatureFlags.cdsCompatMode(), timeoutMs = timeoutMs) - }, + refresh = { ContactDiscoveryRefreshV2.refresh(context, listOf(recipient), timeoutMs = timeoutMs) }, removeSystemContactLinksIfMissing = false, notifyOfNewUsers = notifyOfNewUsers ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt index 375f4ddcae..b0df28ff49 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/contacts/sync/ContactDiscoveryRefreshV2.kt @@ -44,7 +44,7 @@ object ContactDiscoveryRefreshV2 { @WorkerThread @Synchronized @JvmStatic - fun refreshAll(context: Context, useCompat: Boolean, timeoutMs: Long? = null): ContactDiscovery.RefreshResult { + fun refreshAll(context: Context, timeoutMs: Long? = null): ContactDiscovery.RefreshResult { val recipientE164s: Set = SignalDatabase.recipients.getAllE164s().sanitize() val systemE164s: Set = SystemContactsRepository.getAllDisplayNumbers(context).toE164s(context).sanitize() @@ -53,7 +53,6 @@ object ContactDiscoveryRefreshV2 { systemE164s = systemE164s, inputPreviousE164s = SignalDatabase.cds.getAllE164s(), isPartialRefresh = false, - useCompat = useCompat, timeoutMs = timeoutMs ) } @@ -62,14 +61,14 @@ object ContactDiscoveryRefreshV2 { @WorkerThread @Synchronized @JvmStatic - fun refresh(context: Context, inputRecipients: List, useCompat: Boolean, timeoutMs: Long? = null): ContactDiscovery.RefreshResult { + fun refresh(context: Context, inputRecipients: List, timeoutMs: Long? = null): ContactDiscovery.RefreshResult { val recipients: List = inputRecipients.map { it.resolve() } val inputE164s: Set = recipients.mapNotNull { it.e164.orElse(null) }.toSet().sanitize() return if (inputE164s.size > MAXIMUM_ONE_OFF_REQUEST_SIZE) { Log.i(TAG, "List of specific recipients to refresh is too large! (Size: ${recipients.size}). Doing a full refresh instead.") - val fullResult: ContactDiscovery.RefreshResult = refreshAll(context, useCompat = useCompat, timeoutMs = timeoutMs) + val fullResult: ContactDiscovery.RefreshResult = refreshAll(context, timeoutMs = timeoutMs) val inputIds: Set = recipients.map { it.id }.toSet() ContactDiscovery.RefreshResult( @@ -82,7 +81,6 @@ object ContactDiscoveryRefreshV2 { systemE164s = inputE164s, inputPreviousE164s = emptySet(), isPartialRefresh = true, - useCompat = useCompat, timeoutMs = timeoutMs ) } @@ -94,10 +92,9 @@ object ContactDiscoveryRefreshV2 { systemE164s: Set, inputPreviousE164s: Set, isPartialRefresh: Boolean, - useCompat: Boolean, timeoutMs: Long? = null ): ContactDiscovery.RefreshResult { - val tag = "refreshInternal-${if (useCompat) "compat" else "v2"}" + val tag = "refreshInternal-v2" val stopwatch = Stopwatch(tag) val previousE164s: Set = if (SignalStore.misc().cdsToken != null && !isPartialRefresh) inputPreviousE164s else emptySet() @@ -127,7 +124,6 @@ object ContactDiscoveryRefreshV2 { previousE164s, newE164s, SignalDatabase.recipients.getAllServiceIdProfileKeyPairs(), - useCompat, Optional.ofNullable(token), BuildConfig.CDSI_MRENCLAVE, timeoutMs @@ -165,10 +161,6 @@ object ContactDiscoveryRefreshV2 { val registeredIds: MutableSet = mutableSetOf() val rewrites: MutableMap = mutableMapOf() - if (useCompat && !response.isCompatResponse()) { - Log.w(TAG, "Was told to useCompat, but the server responded with a non-compat response! Assuming the server has shut off compat mode.") - } - val transformed: Map = response.results.mapValues { entry -> CdsV2Result(entry.value.pni, entry.value.aci.orElse(null)) } val fuzzyOutput: OutputResult = FuzzyPhoneNumberHelper.generateOutput(transformed, fuzzyInput) @@ -238,13 +230,4 @@ object ContactDiscoveryRefreshV2 { val nearestThousand = (this.toDouble() / 1000).roundToInt() return "~${nearestThousand}k" } - - /** - * Responses that respect useCompat will have an ACI for every user. If it doesn't, it means is a PNP response where some accounts may only have PNI's. - * There may come a day when we request compat mode but the server refuses to allow it, so we need to be able to detect when that happens to fallback - * to the PNP behavior. - */ - private fun CdsiV2Service.Response.isCompatResponse(): Boolean { - return this.results.values.all { it.hasAci() } - } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationBannerView.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationBannerView.kt index 3073b0ad99..258783f16e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationBannerView.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationBannerView.kt @@ -6,7 +6,6 @@ package org.thoughtcrime.securesms.conversation.v2 import android.content.Context -import android.text.SpannableStringBuilder import android.transition.ChangeBounds import android.transition.Slide import android.transition.TransitionManager @@ -15,8 +14,6 @@ import android.util.AttributeSet import android.view.Gravity import android.view.View import androidx.appcompat.widget.LinearLayoutCompat -import androidx.core.content.ContextCompat -import androidx.core.graphics.drawable.DrawableCompat import androidx.core.transition.addListener import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.components.identity.UnverifiedBannerView @@ -28,9 +25,7 @@ import org.thoughtcrime.securesms.database.model.IdentityRecord import org.thoughtcrime.securesms.groups.GroupId import org.thoughtcrime.securesms.profiles.spoofing.ReviewBannerView import org.thoughtcrime.securesms.recipients.RecipientId -import org.thoughtcrime.securesms.util.ContextUtil import org.thoughtcrime.securesms.util.IdentityUtil -import org.thoughtcrime.securesms.util.SpanUtil import org.thoughtcrime.securesms.util.ViewUtil import org.thoughtcrime.securesms.util.views.Stub import org.thoughtcrime.securesms.util.visible @@ -114,20 +109,12 @@ class ConversationBannerView @JvmOverloads constructor( stub = reviewBannerStub ) { if (requestReviewState.individualReviewState != null) { - val message: CharSequence = SpannableStringBuilder() - .append(SpanUtil.bold(context.getString(R.string.ConversationFragment__review_requests_carefully))) - .append(" ") - .append(context.getString(R.string.ConversationFragment__signal_found_another_contact_with_the_same_name)) - - setBannerMessage(message) - - val drawable = ContextUtil.requireDrawable(context, R.drawable.symbol_info_24).mutate() - DrawableCompat.setTint(drawable, ContextCompat.getColor(context, R.color.signal_icon_tint_primary)) - setBannerIcon(drawable) - setOnClickListener { listener?.onRequestReviewIndividual(requestReviewState.individualReviewState.recipient.id) } + setBannerMessage(context.getString(R.string.ConversationFragment__review_banner_body)) + setBannerRecipients(requestReviewState.individualReviewState.target, requestReviewState.individualReviewState.firstDuplicate) + setOnClickListener { listener?.onRequestReviewIndividual(requestReviewState.individualReviewState.target.id) } } else if (requestReviewState.groupReviewState != null) { setBannerMessage(context.getString(R.string.ConversationFragment__d_group_members_have_the_same_name, requestReviewState.groupReviewState.count)) - setBannerRecipient(requestReviewState.groupReviewState.recipient) + setBannerRecipients(requestReviewState.groupReviewState.target, requestReviewState.groupReviewState.firstDuplicate) setOnClickListener { listener?.onReviewGroupMembers(requestReviewState.groupReviewState.groupId) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt index 4374452628..f704319470 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationFragment.kt @@ -2693,7 +2693,7 @@ class ConversationFragment : override fun onGroupMemberClicked(recipientId: RecipientId, groupId: GroupId) { context ?: return - RecipientBottomSheetDialogFragment.create(recipientId, groupId).show(childFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + RecipientBottomSheetDialogFragment.show(childFragmentManager, recipientId, groupId) } override fun onMessageWithErrorClicked(messageRecord: MessageRecord) { @@ -2818,10 +2818,11 @@ class ConversationFragment : override fun onRecipientNameClicked(target: RecipientId) { context ?: return disposables += viewModel.recipient.firstOrError().observeOn(AndroidSchedulers.mainThread()).subscribeBy { - RecipientBottomSheetDialogFragment.create( + RecipientBottomSheetDialogFragment.show( + parentFragmentManager, target, it.groupId.orElse(null) - ).show(parentFragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG) + ) } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt index 980b27c5c1..896be87bbc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/ConversationRepository.kt @@ -370,8 +370,16 @@ class ConversationRepository( return@fromCallable RequestReviewState() } - if (group == null && ReviewUtil.isRecipientReviewSuggested(recipient.id)) { - return@fromCallable RequestReviewState(individualReviewState = IndividualReviewState(recipient)) + if (group == null) { + val recipientsToReview = ReviewUtil.getRecipientsToPromptForReview(recipient.id) + if (recipientsToReview.size > 0) { + return@fromCallable RequestReviewState( + individualReviewState = IndividualReviewState( + target = recipient, + firstDuplicate = Recipient.resolvedList(recipientsToReview)[0] + ) + ) + } } if (group != null && group.isV2Group) { @@ -383,6 +391,7 @@ class ConversationRepository( groupReviewState = GroupReviewState( groupId, duplicateRecipients[0], + duplicateRecipients[1], duplicateRecipients.size ) ) diff --git a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RequestReviewState.kt b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RequestReviewState.kt index f279ee727e..0b1716f5ee 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RequestReviewState.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/conversation/v2/RequestReviewState.kt @@ -22,8 +22,8 @@ data class RequestReviewState( } /** Recipient is in message request state and has similar name as someone else */ - data class IndividualReviewState(val recipient: Recipient) + data class IndividualReviewState(val target: Recipient, val firstDuplicate: Recipient) /** Group has multiple members with similar names */ - data class GroupReviewState(val groupId: GroupId.V2, val recipient: Recipient, val count: Int) + data class GroupReviewState(val groupId: GroupId.V2, val target: Recipient, val firstDuplicate: Recipient, val count: Int) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java index 663547cbfc..1874f39d77 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/creategroup/CreateGroupActivity.java @@ -15,6 +15,7 @@ import com.google.android.material.floatingactionbutton.FloatingActionButton; import org.signal.core.util.DimensionUnit; +import org.signal.core.util.Stopwatch; import org.signal.core.util.concurrent.SimpleTask; import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.ContactSelectionActivity; @@ -22,7 +23,6 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contacts.ContactSelectionDisplayMode; import org.thoughtcrime.securesms.contacts.sync.ContactDiscovery; -import org.thoughtcrime.securesms.database.RecipientTable; import org.thoughtcrime.securesms.groups.ui.creategroup.details.AddGroupDetailsActivity; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; @@ -30,11 +30,9 @@ import org.thoughtcrime.securesms.recipients.ui.findby.FindByActivity; import org.thoughtcrime.securesms.recipients.ui.findby.FindByMode; import org.thoughtcrime.securesms.util.FeatureFlags; -import org.signal.core.util.Stopwatch; import org.thoughtcrime.securesms.util.views.SimpleProgressDialog; import java.io.IOException; -import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; @@ -102,6 +100,7 @@ public boolean onOptionsItemSelected(MenuItem item) { @Override protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) { if (requestCode == REQUEST_CODE_ADD_DETAILS && resultCode == RESULT_OK) { + setResult(RESULT_OK); finish(); } else { super.onActivityResult(requestCode, resultCode, data); diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/invited/PendingMemberInvitesFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/invited/PendingMemberInvitesFragment.java index a4aa07105c..82b5a9289d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/invited/PendingMemberInvitesFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/invited/PendingMemberInvitesFragment.java @@ -52,9 +52,7 @@ public static PendingMemberInvitesFragment newInstance(@NonNull GroupId.V2 group youInvited.initializeAdapter(getViewLifecycleOwner()); othersInvited.initializeAdapter(getViewLifecycleOwner()); - youInvited.setRecipientClickListener(recipient -> - RecipientBottomSheetDialogFragment.create(recipient.getId(), null) - .show(requireActivity().getSupportFragmentManager(), BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG)); + youInvited.setRecipientClickListener(recipient -> RecipientBottomSheetDialogFragment.show(requireActivity().getSupportFragmentManager(), recipient.getId(), null)); youInvited.setAdminActionsListener(new AdminActionsListener() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/requesting/RequestingMembersFragment.java b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/requesting/RequestingMembersFragment.java index 858721698e..332c427507 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/requesting/RequestingMembersFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/ui/invitesandrequests/requesting/RequestingMembersFragment.java @@ -55,8 +55,7 @@ public static RequestingMembersFragment newInstance(@NonNull GroupId.V2 groupId) requestingMembers.initializeAdapter(getViewLifecycleOwner()); requestingMembers.setRecipientClickListener(recipient -> { - RecipientBottomSheetDialogFragment.create(recipient.getId(), null) - .show(requireActivity().getSupportFragmentManager(), BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG); + RecipientBottomSheetDialogFragment.show(requireActivity().getSupportFragmentManager(), recipient.getId(), null); }); requestingMembers.setAdminActionsListener(new AdminActionsListener() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/ProfileKeySet.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/ProfileKeySet.java index 7bc24243fa..993476b348 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/ProfileKeySet.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/ProfileKeySet.java @@ -61,10 +61,6 @@ public void addKeysFromGroupChange(@NonNull DecryptedGroupChange change) { for (DecryptedMember member : change.promotePendingPniAciMembers) { addMemberKey(member, editor); } - - for (DecryptedMember member : change.promotePendingPniAciMembers) { - addMemberKey(member, editor); - } } /** diff --git a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java index d4178b86a9..76c2d69772 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/groups/v2/processing/GroupsV2StateProcessor.java @@ -35,6 +35,7 @@ import org.thoughtcrime.securesms.groups.v2.ProfileKeySet; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobs.AvatarGroupsV2DownloadJob; +import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; import org.thoughtcrime.securesms.jobs.LeaveGroupV2Job; import org.thoughtcrime.securesms.jobs.RequestGroupV2InfoJob; import org.thoughtcrime.securesms.jobs.RetrieveProfileJob; @@ -352,6 +353,10 @@ public GroupUpdateResult updateLocalGroupToRevision(final int revision, } profileAndMessageHelper.persistLearnedProfileKeys(inputGroupState); + if (!signedGroupChange.promotePendingPniAciMembers.isEmpty()) { + ApplicationDependencies.getJobManager().add(new DirectoryRefreshJob(false)); + } + GlobalGroupState remainingWork = advanceGroupStateResult.getNewGlobalGroupState(); if (remainingWork.getServerHistory().size() > 0) { info(String.format(Locale.US, "There are more revisions on the server for this group, scheduling for later, V[%d..%d]", newLocalState.revision + 1, remainingWork.getLatestRevisionNumber())); @@ -443,6 +448,7 @@ private GroupUpdateResult updateLocalGroupFromServerPaged(int revision, Decrypte ProfileKeySet profileKeys = new ProfileKeySet(); DecryptedGroup finalState = localState; GlobalGroupState finalGlobalGroupState = inputGroupState; + boolean performCdsLookup = false; boolean hasMore = true; @@ -474,8 +480,13 @@ private GroupUpdateResult updateLocalGroupFromServerPaged(int revision, Decrypte if (entry.getGroup() != null) { profileKeys.addKeysFromGroupState(entry.getGroup()); } + if (entry.getChange() != null) { profileKeys.addKeysFromGroupChange(entry.getChange()); + + if (!entry.getChange().promotePendingPniAciMembers.isEmpty()) { + performCdsLookup = true; + } } } @@ -496,6 +507,10 @@ private GroupUpdateResult updateLocalGroupFromServerPaged(int revision, Decrypte profileAndMessageHelper.persistLearnedProfileKeys(profileKeys); + if (performCdsLookup) { + ApplicationDependencies.getJobManager().add(new DirectoryRefreshJob(false)); + } + if (finalGlobalGroupState.getServerHistory().size() > 0) { info(String.format(Locale.US, "There are more revisions on the server for this group, scheduling for later, V[%d..%d]", finalState.revision + 1, finalGlobalGroupState.getLatestRevisionNumber())); ApplicationDependencies.getJobManager().add(new RequestGroupV2InfoJob(groupId, finalGlobalGroupState.getLatestRevisionNumber())); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java index 77dd9a6184..b70a0b52b9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/JobManagerFactories.java @@ -58,6 +58,7 @@ import org.thoughtcrime.securesms.migrations.PinReminderMigrationJob; import org.thoughtcrime.securesms.migrations.PniAccountInitializationMigrationJob; import org.thoughtcrime.securesms.migrations.PniMigrationJob; +import org.thoughtcrime.securesms.migrations.PnpLaunchMigrationJob; import org.thoughtcrime.securesms.migrations.PreKeysSyncMigrationJob; import org.thoughtcrime.securesms.migrations.ProfileMigrationJob; import org.thoughtcrime.securesms.migrations.ProfileSharingUpdateMigrationJob; @@ -243,6 +244,7 @@ public static Map getJobFactories(@NonNull Application appl put(PinReminderMigrationJob.KEY, new PinReminderMigrationJob.Factory()); put(PniAccountInitializationMigrationJob.KEY, new PniAccountInitializationMigrationJob.Factory()); put(PniMigrationJob.KEY, new PniMigrationJob.Factory()); + put(PnpLaunchMigrationJob.KEY, new PnpLaunchMigrationJob.Factory()); put(PreKeysSyncMigrationJob.KEY, new PreKeysSyncMigrationJob.Factory()); put(ProfileMigrationJob.KEY, new ProfileMigrationJob.Factory()); put(ProfileSharingUpdateMigrationJob.KEY, new ProfileSharingUpdateMigrationJob.Factory()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/PnpInitializeDevicesJob.kt b/app/src/main/java/org/thoughtcrime/securesms/jobs/PnpInitializeDevicesJob.kt index ab98ad5cd2..2fe83fe25a 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/PnpInitializeDevicesJob.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/PnpInitializeDevicesJob.kt @@ -20,7 +20,6 @@ import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.jobmanager.Job import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint import org.thoughtcrime.securesms.keyvalue.SignalStore -import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.registration.VerifyResponse import org.thoughtcrime.securesms.registration.VerifyResponseWithoutKbs import org.thoughtcrime.securesms.util.TextSecurePreferences @@ -49,7 +48,7 @@ class PnpInitializeDevicesJob private constructor(parameters: Parameters) : Base @JvmStatic fun enqueueIfNecessary() { - if (SignalStore.misc().hasPniInitializedDevices() || !SignalStore.account().isRegistered || SignalStore.account().aci == null || Recipient.self().pnpCapability != Recipient.Capability.SUPPORTED) { + if (SignalStore.misc().hasPniInitializedDevices() || !SignalStore.account().isRegistered || SignalStore.account().aci == null) { return } @@ -71,10 +70,6 @@ class PnpInitializeDevicesJob private constructor(parameters: Parameters) : Base @Throws(Exception::class) public override fun onRun() { - if (Recipient.self().pnpCapability != Recipient.Capability.SUPPORTED) { - throw IllegalStateException("This should only be run if you have the capability!") - } - if (!SignalStore.account().isRegistered || SignalStore.account().aci == null) { Log.w(TAG, "Not registered! Skipping, as it wouldn't do anything.") return diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java index d98050057b..6f29347c66 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshAttributesJob.java @@ -12,6 +12,8 @@ import org.thoughtcrime.securesms.jobmanager.JsonJobData; import org.thoughtcrime.securesms.jobmanager.Job; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues; +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode; import org.thoughtcrime.securesms.keyvalue.SvrValues; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.registration.RegistrationRepository; @@ -97,7 +99,7 @@ public void onRun() throws IOException { registrationLockV2 = svrValues.getRegistrationLockToken(); } - boolean phoneNumberDiscoverable = SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode().isDiscoverable(); + boolean phoneNumberDiscoverable = SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode() == PhoneNumberDiscoverabilityMode.DISCOVERABLE; String deviceName = SignalStore.account().getDeviceName(); byte[] encryptedDeviceName = (deviceName == null) ? null : DeviceNameCipher.encryptDeviceName(deviceName.getBytes(StandardCharsets.UTF_8), SignalStore.account().getAciIdentityKey()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob.java b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob.java index 45be7f4146..1df7fb75a4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob.java +++ b/app/src/main/java/org/thoughtcrime/securesms/jobs/RefreshOwnProfileJob.java @@ -135,9 +135,7 @@ protected void onRun() throws Exception { StoryOnboardingDownloadJob.Companion.enqueueIfNeeded(); - if (FeatureFlags.usernames()) { - checkUsernameIsInSync(); - } + checkUsernameIsInSync(); } private void setExpiringProfileKeyCredential(@NonNull Recipient recipient, diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues.java index 7f5b7e1443..8a804c6869 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/PhoneNumberPrivacyValues.java @@ -23,10 +23,9 @@ public final class PhoneNumberPrivacyValues extends SignalStoreValues { @Override void onFirstEverAppLaunch() { - // TODO [ALAN] PhoneNumberPrivacy: During registration, set the attribute to so that new registrations start out as not listed - //getStore().beginWrite() - // .putInteger(LISTING_MODE, PhoneNumberListingMode.UNLISTED.serialize()) - // .apply(); + getStore().beginWrite() + .putInteger(DISCOVERABILITY_MODE, PhoneNumberDiscoverabilityMode.UNDECIDED.serialize()) + .apply(); } @Override @@ -43,10 +42,9 @@ void onFirstEverAppLaunch() { } public boolean isPhoneNumberSharingEnabled() { - // TODO [pnp] When we launch usernames, the default should return false return switch (getPhoneNumberSharingMode()) { - case DEFAULT, EVERYBODY -> true; - case NOBODY -> false; + case EVERYBODY -> true; + case DEFAULT, NOBODY -> false; }; } @@ -54,11 +52,8 @@ public void setPhoneNumberSharingMode(@NonNull PhoneNumberSharingMode phoneNumbe putInteger(SHARING_MODE, phoneNumberSharingMode.serialize()); } - public boolean isDiscoverableByPhoneNumber() { - return getPhoneNumberDiscoverabilityMode() == PhoneNumberDiscoverabilityMode.DISCOVERABLE; - } - public @NonNull PhoneNumberDiscoverabilityMode getPhoneNumberDiscoverabilityMode() { + // The default for existing users is to be discoverable, but new users are set to UNDECIDED in onFirstEverAppLaunch return PhoneNumberDiscoverabilityMode.deserialize(getInteger(DISCOVERABILITY_MODE, PhoneNumberDiscoverabilityMode.DISCOVERABLE.serialize())); } @@ -121,7 +116,9 @@ public static PhoneNumberSharingMode deserialize(int code) { public enum PhoneNumberDiscoverabilityMode { DISCOVERABLE(0), - NOT_DISCOVERABLE(1); + NOT_DISCOVERABLE(1), + /** The user is going through registration and has not yet chosen a discoverability setting */ + UNDECIDED(2); private final int code; @@ -129,14 +126,6 @@ public enum PhoneNumberDiscoverabilityMode { this.code = code; } - public boolean isDiscoverable() { - return this == DISCOVERABLE; - } - - public boolean isUndiscoverable() { - return this == NOT_DISCOVERABLE; - } - public int serialize() { return code; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/UiHints.java b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/UiHints.java index bfaee3ef08..4e80604c43 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/keyvalue/UiHints.java +++ b/app/src/main/java/org/thoughtcrime/securesms/keyvalue/UiHints.java @@ -14,10 +14,10 @@ public class UiHints extends SignalStoreValues { private static final String HAS_SET_OR_SKIPPED_USERNAME_CREATION = "uihints.has_set_or_skipped_username_creation"; private static final String NEVER_DISPLAY_PULL_TO_FILTER_TIP = "uihints.never_display_pull_to_filter_tip"; private static final String HAS_SEEN_SCHEDULED_MESSAGES_INFO_ONCE = "uihints.has_seen_scheduled_messages_info_once"; - private static final String HAS_SEEN_USERNAME_EDUCATION = "uihints.has_seen_username_education"; private static final String HAS_SEEN_TEXT_FORMATTING_ALERT = "uihints.text_formatting.has_seen_alert"; private static final String HAS_NOT_SEEN_EDIT_MESSAGE_BETA_ALERT = "uihints.edit_message.has_not_seen_beta_alert"; private static final String HAS_SEEN_SAFETY_NUMBER_NUX = "uihints.has_seen_safety_number_nux"; + private static final String HAS_COMPLETED_USERNAME_ONBOARDING = "uihints.has_completed_username_onboarding"; UiHints(@NonNull KeyValueStore store) { super(store); @@ -30,7 +30,7 @@ void onFirstEverAppLaunch() { @Override @NonNull List getKeysToIncludeInBackup() { - return Arrays.asList(NEVER_DISPLAY_PULL_TO_FILTER_TIP, HAS_SEEN_USERNAME_EDUCATION, HAS_SEEN_TEXT_FORMATTING_ALERT); + return Arrays.asList(NEVER_DISPLAY_PULL_TO_FILTER_TIP, HAS_COMPLETED_USERNAME_ONBOARDING, HAS_SEEN_TEXT_FORMATTING_ALERT); } public void markHasSeenGroupSettingsMenuToast() { @@ -65,19 +65,14 @@ public void markHasSetOrSkippedUsernameCreation() { putBoolean(HAS_SET_OR_SKIPPED_USERNAME_CREATION, true); } - public void markHasSeenUsernameEducation() { - putBoolean(HAS_SEEN_USERNAME_EDUCATION, true); + public void setHasCompletedUsernameOnboarding(boolean value) { + putBoolean(HAS_COMPLETED_USERNAME_ONBOARDING, value); } - public boolean hasSeenUsernameEducation() { - return getBoolean(HAS_SEEN_USERNAME_EDUCATION, false); + public boolean hasCompletedUsernameOnboarding() { + return getBoolean(HAS_COMPLETED_USERNAME_ONBOARDING, false); } - public void clearHasSeenUsernameEducation() { - putBoolean(HAS_SEEN_USERNAME_EDUCATION, false); - } - - public void resetNeverDisplayPullToRefreshCount() { putInteger(NEVER_DISPLAY_PULL_TO_FILTER_TIP, 0); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionKeyPreferences.java b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionKeyPreferences.java index aec2aa12b5..4cd970c827 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionKeyPreferences.java +++ b/app/src/main/java/org/thoughtcrime/securesms/logsubmit/LogSectionKeyPreferences.java @@ -37,7 +37,7 @@ final class LogSectionKeyPreferences implements LogSection { .append("Roaming Download : ").append(Util.join(TextSecurePreferences.getRoamingMediaDownloadAllowed(context), ",")).append("\n") .append("Mobile Download : ").append(Util.join(TextSecurePreferences.getMobileMediaDownloadAllowed(context), ",")).append("\n") .append("Phone Number Sharing : ").append(SignalStore.phoneNumberPrivacy().isPhoneNumberSharingEnabled()).append(" (").append(SignalStore.phoneNumberPrivacy().getPhoneNumberSharingMode()).append(")\n") - .append("Phone Number Discoverable: ").append(SignalStore.phoneNumberPrivacy().isDiscoverableByPhoneNumber()).append(" (").append(SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode()).append(")\n"); + .append("Phone Number Discoverable: ").append(SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode()).append("\n"); } private static String getThreadTrimmingString() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/VideoMediaPreviewFragment.java b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/VideoMediaPreviewFragment.java index 68cd992668..9a66ff6dbc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/mediapreview/VideoMediaPreviewFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/mediapreview/VideoMediaPreviewFragment.java @@ -165,7 +165,9 @@ public void pause() { @Override public void setBottomButtonControls(@NonNull MediaPreviewPlayerControlView playerControlView) { - videoView.setControlView(playerControlView); + if (videoView != null) { + videoView.setControlView(playerControlView); + } updateSkipButtonState(); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java index 5545c997bb..f0f0d169b8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java +++ b/app/src/main/java/org/thoughtcrime/securesms/megaphone/Megaphones.java @@ -4,6 +4,7 @@ import android.content.Context; import android.content.Intent; import android.os.Build; +import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -13,6 +14,7 @@ import com.annimon.stream.Stream; import com.bumptech.glide.Glide; +import org.checkerframework.checker.units.qual.A; import org.signal.core.util.MapUtil; import org.signal.core.util.SetUtil; import org.signal.core.util.TranslationDetection; @@ -20,11 +22,13 @@ import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.apkupdate.ApkUpdateRefreshListener; import org.thoughtcrime.securesms.components.settings.app.AppSettingsActivity; +import org.thoughtcrime.securesms.database.SignalDatabase; import org.thoughtcrime.securesms.database.model.MegaphoneRecord; import org.thoughtcrime.securesms.database.model.RemoteMegaphoneRecord; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobmanager.impl.NetworkConstraint; import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues; +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.lock.SignalPinReminderDialog; import org.thoughtcrime.securesms.lock.SignalPinReminders; @@ -36,6 +40,7 @@ import org.thoughtcrime.securesms.profiles.manage.EditProfileActivity; import org.thoughtcrime.securesms.profiles.username.NewWaysToConnectDialogFragment; import org.thoughtcrime.securesms.recipients.Recipient; +import org.thoughtcrime.securesms.storage.StorageSyncHelper; import org.thoughtcrime.securesms.util.CommunicationActions; import org.thoughtcrime.securesms.util.FeatureFlags; import org.thoughtcrime.securesms.util.ServiceUtil; @@ -106,7 +111,7 @@ private Megaphones() {} * This is also when you would hide certain megaphones based on things like {@link FeatureFlags}. */ private static Map buildDisplayOrder(@NonNull Context context, @NonNull Map records) { - return new LinkedHashMap() {{ + return new LinkedHashMap<>() {{ put(Event.PINS_FOR_ALL, new PinsForAllSchedule()); put(Event.CLIENT_DEPRECATED, SignalStore.misc().isClientDeprecated() ? ALWAYS : NEVER); put(Event.NOTIFICATIONS, shouldShowNotificationsMegaphone(context) ? RecurringSchedule.every(TimeUnit.DAYS.toMillis(30)) : NEVER); @@ -122,6 +127,7 @@ private static Map buildDisplayOrder(@NonNull Context // Feature-introduction megaphones should *probably* be added below this divider put(Event.ADD_A_PROFILE_PHOTO, shouldShowAddAProfilePhotoMegaphone(context) ? ALWAYS : NEVER); + put(Event.PNP_LAUNCH, shouldShowPnpLaunchMegaphone() ? ALWAYS : NEVER); }}; } @@ -153,7 +159,8 @@ private static Map buildDisplayOrder(@NonNull Context return buildSetUpYourUsernameMegaphone(context); case GRANT_FULL_SCREEN_INTENT: return buildGrantFullScreenIntentPermission(context); - + case PNP_LAUNCH: + return buildPnpLaunchMegaphone(); default: throw new IllegalArgumentException("Event not handled!"); } @@ -377,6 +384,29 @@ private static boolean shouldShowEnableAppUpdatesMegaphone(@NonNull Context cont .build(); } + public static @NonNull Megaphone buildPnpLaunchMegaphone() { + return new Megaphone.Builder(Event.PNP_LAUNCH, Megaphone.Style.BASIC) + .setTitle(R.string.PnpLaunchMegaphone_title) + .setBody(R.string.PnpLaunchMegaphone_body) + .setImage(R.drawable.usernames_megaphone) + .setActionButton(R.string.PnpLaunchMegaphone_learn_more, (megaphone, controller) -> { + controller.onMegaphoneDialogFragmentRequested(new NewWaysToConnectDialogFragment()); + controller.onMegaphoneCompleted(Event.PNP_LAUNCH); + + SignalStore.uiHints().setHasCompletedUsernameOnboarding(true); + SignalDatabase.recipients().markNeedsSync(Recipient.self().getId()); + StorageSyncHelper.scheduleSyncForDataChange(); + }) + .setSecondaryButton(R.string.PnpLaunchMegaphone_dismiss, (megaphone, controller) -> { + controller.onMegaphoneCompleted(Event.PNP_LAUNCH); + + SignalStore.uiHints().setHasCompletedUsernameOnboarding(true); + SignalDatabase.recipients().markNeedsSync(Recipient.self().getId()); + StorageSyncHelper.scheduleSyncForDataChange(); + }) + .build(); + } + public static @NonNull Megaphone buildGrantFullScreenIntentPermission(@NonNull Context context) { return new Megaphone.Builder(Event.GRANT_FULL_SCREEN_INTENT, Megaphone.Style.BASIC) .setTitle(R.string.GrantFullScreenIntentPermission_megaphone_title) @@ -445,19 +475,22 @@ private static boolean shouldShowAddAProfilePhotoMegaphone(@NonNull Context cont * Prompt megaphone 3 days after turning off phone number discovery when no username is set. */ private static boolean shouldShowSetUpYourUsernameMegaphone(@NonNull Map records) { - boolean hasUsername = SignalStore.account().isRegistered() && SignalStore.account().getUsername() != null; - boolean hasCompleted = MapUtil.mapOrDefault(records, Event.SET_UP_YOUR_USERNAME, MegaphoneRecord::isFinished, false); - long phoneNumberDiscoveryDisabledAt = SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityModeTimestamp(); - PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode listingMode = SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode(); - - return FeatureFlags.usernames() && - !hasUsername && - listingMode.isUndiscoverable() && + boolean hasUsername = SignalStore.account().isRegistered() && SignalStore.account().getUsername() != null; + boolean hasCompleted = MapUtil.mapOrDefault(records, Event.SET_UP_YOUR_USERNAME, MegaphoneRecord::isFinished, false); + long phoneNumberDiscoveryDisabledAt = SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityModeTimestamp(); + PhoneNumberDiscoverabilityMode listingMode = SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode(); + + return !hasUsername && + listingMode == PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE && !hasCompleted && phoneNumberDiscoveryDisabledAt > 0 && (System.currentTimeMillis() - phoneNumberDiscoveryDisabledAt) >= TimeUnit.DAYS.toMillis(3); } + private static boolean shouldShowPnpLaunchMegaphone() { + return TextUtils.isEmpty(SignalStore.account().getUsername()) && !SignalStore.uiHints().hasCompletedUsernameOnboarding(); + } + private static boolean shouldShowGrantFullScreenIntentPermission(@NonNull Context context) { return Build.VERSION.SDK_INT >= 34 && !NotificationManagerCompat.from(context).canUseFullScreenIntent(); } @@ -503,6 +536,7 @@ public enum Event { REMOTE_MEGAPHONE("remote_megaphone"), BACKUP_SCHEDULE_PERMISSION("backup_schedule_permission"), SET_UP_YOUR_USERNAME("set_up_your_username"), + PNP_LAUNCH("pnp_launch"), GRANT_FULL_SCREEN_INTENT("grant_full_screen_intent"); private final String key; diff --git a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt index 70f70c2967..6dc89485b8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/messages/IncomingMessageObserver.kt @@ -32,7 +32,6 @@ import org.thoughtcrime.securesms.service.KeyCachingService import org.thoughtcrime.securesms.util.AppForegroundObserver import org.thoughtcrime.securesms.util.SignalLocalMetrics import org.whispersystems.signalservice.api.push.ServiceId -import org.whispersystems.signalservice.api.util.UuidUtil import org.whispersystems.signalservice.api.websocket.WebSocketConnectionState import org.whispersystems.signalservice.api.websocket.WebSocketUnavailableException import org.whispersystems.signalservice.internal.push.Envelope @@ -334,12 +333,13 @@ class IncomingMessageObserver(private val context: Application) { } private fun processReceipt(envelope: Envelope) { - if (!UuidUtil.isUuid(envelope.sourceServiceId)) { - Log.w(TAG, "Invalid envelope source UUID!") + val serviceId = ServiceId.parseOrNull(envelope.sourceServiceId) + if (serviceId == null) { + Log.w(TAG, "Invalid envelope sourceServiceId!") return } - val senderId = RecipientId.from(ServiceId.parseOrThrow(envelope.sourceServiceId!!)) + val senderId = RecipientId.from(serviceId) Log.i(TAG, "Received server receipt. Sender: $senderId, Device: ${envelope.sourceDevice}, Timestamp: ${envelope.timestamp}") SignalDatabase.messages.incrementDeliveryReceiptCount(envelope.timestamp!!, senderId, System.currentTimeMillis()) diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java index 17a22719ed..76749cba01 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/ApplicationMigrations.java @@ -132,9 +132,10 @@ static final class Version { static final int SELF_REGISTERTED_STATE = 99; static final int SVR2_ENCLAVE_UPDATE = 100; static final int STORAGE_LOCAL_UNKNOWNS_FIX = 101; + static final int PNP_LAUNCH = 102; } - public static final int CURRENT_VERSION = 101; + public static final int CURRENT_VERSION = 102; /** * This *must* be called after the {@link JobManager} has been instantiated, but *before* the call @@ -593,6 +594,10 @@ private static LinkedHashMap getMigrationJobs(@NonNull Co jobs.put(Version.STORAGE_LOCAL_UNKNOWNS_FIX, new StorageFixLocalUnknownMigrationJob()); } + if (lastSeenVersion < Version.PNP_LAUNCH) { + jobs.put(Version.PNP_LAUNCH, new PnpLaunchMigrationJob()); + } + return jobs; } diff --git a/app/src/main/java/org/thoughtcrime/securesms/migrations/PnpLaunchMigrationJob.kt b/app/src/main/java/org/thoughtcrime/securesms/migrations/PnpLaunchMigrationJob.kt new file mode 100644 index 0000000000..314ed73c23 --- /dev/null +++ b/app/src/main/java/org/thoughtcrime/securesms/migrations/PnpLaunchMigrationJob.kt @@ -0,0 +1,40 @@ +/* + * Copyright 2024 Signal Messenger, LLC + * SPDX-License-Identifier: AGPL-3.0-only + */ + +package org.thoughtcrime.securesms.migrations + +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies +import org.thoughtcrime.securesms.jobmanager.Job +import org.thoughtcrime.securesms.jobs.ProfileUploadJob +import org.thoughtcrime.securesms.jobs.RefreshAttributesJob +import java.lang.Exception + +/** + * Kicks off a chain of jobs to update the server with our latest PNP settings. + */ +internal class PnpLaunchMigrationJob(parameters: Parameters = Parameters.Builder().build()) : MigrationJob(parameters) { + companion object { + const val KEY = "PnpLaunchMigrationJob" + } + + override fun getFactoryKey(): String = KEY + + override fun isUiBlocking(): Boolean = false + + override fun performMigration() { + ApplicationDependencies.getJobManager() + .startChain(RefreshAttributesJob()) + .then(ProfileUploadJob()) + .enqueue() + } + + override fun shouldRetry(e: Exception): Boolean = false + + class Factory : Job.Factory { + override fun create(parameters: Parameters, serializedData: ByteArray?): PnpLaunchMigrationJob { + return PnpLaunchMigrationJob(parameters) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java index 9020887e9a..6f8f6795b4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/CreateProfileFragment.java @@ -209,17 +209,15 @@ private void initializeResources(@Nullable GroupId groupId) { binding.profileDescriptionText.setLinkColor(ContextCompat.getColor(requireContext(), R.color.signal_colorPrimary)); binding.profileDescriptionText.setOnLinkClickListener(v -> CommunicationActions.openBrowserLink(requireContext(), getString(R.string.EditProfileFragment__support_link))); - if (FeatureFlags.phoneNumberPrivacy()) { - getParentFragmentManager().setFragmentResultListener(WhoCanFindMeByPhoneNumberFragment.REQUEST_KEY, getViewLifecycleOwner(), (requestKey, result) -> { - if (WhoCanFindMeByPhoneNumberFragment.REQUEST_KEY.equals(requestKey)) { - presentWhoCanFindMeDescription(SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode()); - } - }); - - binding.whoCanFindMeContainer.setVisibility(View.VISIBLE); - binding.whoCanFindMeContainer.setOnClickListener(v -> SafeNavigation.safeNavigate(Navigation.findNavController(v), CreateProfileFragmentDirections.actionCreateProfileFragmentToPhoneNumberPrivacy())); - presentWhoCanFindMeDescription(SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode()); - } + getParentFragmentManager().setFragmentResultListener(WhoCanFindMeByPhoneNumberFragment.REQUEST_KEY, getViewLifecycleOwner(), (requestKey, result) -> { + if (WhoCanFindMeByPhoneNumberFragment.REQUEST_KEY.equals(requestKey)) { + presentWhoCanFindMeDescription(SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode()); + } + }); + + binding.whoCanFindMeContainer.setVisibility(View.VISIBLE); + binding.whoCanFindMeContainer.setOnClickListener(v -> SafeNavigation.safeNavigate(Navigation.findNavController(v), CreateProfileFragmentDirections.actionCreateProfileFragmentToPhoneNumberPrivacy())); + presentWhoCanFindMeDescription(SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode()); } binding.finishButton.setOnClickListener(v -> { @@ -288,6 +286,7 @@ private static void updateFieldIfNeeded(@NonNull EditText field, @NonNull String private void presentWhoCanFindMeDescription(PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode phoneNumberListingMode) { switch (phoneNumberListingMode) { case DISCOVERABLE: + case UNDECIDED: binding.whoCanFindMeIcon.setImageResource(R.drawable.symbol_group_24); binding.whoCanFindMeDescription.setText(R.string.PhoneNumberPrivacy_everyone); break; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java index 951a78cb78..bbe1599603 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/EditProfileViewModel.java @@ -8,8 +8,12 @@ import androidx.lifecycle.ViewModel; import androidx.lifecycle.ViewModelProvider; +import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.conversation.colors.AvatarColor; import org.thoughtcrime.securesms.groups.GroupId; +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues; +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode; +import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.mediasend.Media; import org.thoughtcrime.securesms.profiles.ProfileName; import org.thoughtcrime.securesms.profiles.edit.EditProfileRepository.UploadResult; @@ -22,6 +26,8 @@ class EditProfileViewModel extends ViewModel { + private static final String TAG = Log.tag(EditProfileViewModel.class); + private final MutableLiveData givenName = new MutableLiveData<>(); private final MutableLiveData familyName = new MutableLiveData<>(); private final LiveData trimmedGivenName = Transformations.map(givenName, StringUtil::trimToVisualBounds); @@ -112,10 +118,6 @@ public void setAvatarMedia(@Nullable Media avatarMedia) { return groupId; } - public boolean canRemoveProfilePhoto() { - return hasAvatar(); - } - public SingleLiveEvent getUploadResult() { return uploadResult; } @@ -146,6 +148,11 @@ public void submitProfile() { String oldDisplayName = isGroup() ? originalDisplayName.getValue() : null; String oldDescription = isGroup() ? originalDescription : null; + if (!isGroup() && SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode() == PhoneNumberDiscoverabilityMode.UNDECIDED) { + Log.i(TAG, "Phone number discoverability mode is still UNDECIDED. Setting to DISCOVERABLE."); + SignalStore.phoneNumberPrivacy().setPhoneNumberDiscoverabilityMode(PhoneNumberDiscoverabilityMode.DISCOVERABLE); + } + repository.uploadProfile(profileName, displayName, !Objects.equals(StringUtil.stripBidiProtection(oldDisplayName), displayName), diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberFragment.kt index 222c681f74..4585b81ae4 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberFragment.kt @@ -14,7 +14,6 @@ import org.thoughtcrime.securesms.components.settings.DSLSettingsFragment import org.thoughtcrime.securesms.components.settings.DSLSettingsText import org.thoughtcrime.securesms.components.settings.configure import org.thoughtcrime.securesms.databinding.WhoCanFindMeByPhoneNumberFragmentBinding -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.adapter.mapping.MappingAdapter /** @@ -38,8 +37,6 @@ class WhoCanFindMeByPhoneNumberFragment : DSLSettingsFragment( private val binding by ViewBinderDelegate(WhoCanFindMeByPhoneNumberFragmentBinding::bind) override fun bindAdapter(adapter: MappingAdapter) { - require(FeatureFlags.phoneNumberPrivacy()) - lifecycleDisposable += viewModel.state.subscribe { adapter.submitList(getConfiguration(it).toMappingModelList()) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberRepository.kt index c589dd0f9e..a620107d9f 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/edit/pnp/WhoCanFindMeByPhoneNumberRepository.kt @@ -17,6 +17,7 @@ class WhoCanFindMeByPhoneNumberRepository { return when (SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode) { PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.DISCOVERABLE -> WhoCanFindMeByPhoneNumberState.EVERYONE PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE -> WhoCanFindMeByPhoneNumberState.NOBODY + PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.UNDECIDED -> WhoCanFindMeByPhoneNumberState.EVERYONE } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt index d4721bfb7a..1a20755bfc 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileFragment.kt @@ -36,7 +36,6 @@ import org.thoughtcrime.securesms.profiles.ProfileName import org.thoughtcrime.securesms.profiles.manage.EditProfileViewModel.AvatarState import org.thoughtcrime.securesms.profiles.manage.UsernameRepository.UsernameDeleteResult import org.thoughtcrime.securesms.recipients.Recipient -import org.thoughtcrime.securesms.util.FeatureFlags import org.thoughtcrime.securesms.util.NameUtil.getAbbreviation import org.thoughtcrime.securesms.util.livedata.LiveDataUtil import org.thoughtcrime.securesms.util.navigation.safeNavigate @@ -120,28 +119,6 @@ class EditProfileFragment : LoggingFragment() { AvatarPreviewActivity.createTransitionBundle(requireActivity(), binding.manageProfileAvatar) ) } - - if (FeatureFlags.usernames() && SignalStore.account().username != null && SignalStore.account().usernameSyncState != AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED) { - binding.usernameLinkContainer.setOnClickListener { - findNavController().safeNavigate(EditProfileFragmentDirections.actionManageProfileFragmentToUsernameLinkFragment()) - } - - if (SignalStore.account().usernameSyncState == AccountValues.UsernameSyncState.LINK_CORRUPTED) { - binding.linkErrorIndicator.visibility = View.VISIBLE - } else { - binding.linkErrorIndicator.visibility = View.GONE - } - - if (SignalStore.tooltips().showProfileSettingsQrCodeTooltop()) { - binding.usernameLinkTooltip.visibility = View.VISIBLE - binding.linkTooltipCloseButton.setOnClickListener { - binding.usernameLinkTooltip.visibility = View.GONE - SignalStore.tooltips().markProfileSettingsQrCodeTooltipSeen() - } - } - } else { - binding.usernameLinkContainer.visibility = View.GONE - } } private fun initializeViewModel() { @@ -158,14 +135,7 @@ class EditProfileFragment : LoggingFragment() { viewModel.about.observe(viewLifecycleOwner) { presentAbout(it) } viewModel.aboutEmoji.observe(viewLifecycleOwner) { presentAboutEmoji(it) } viewModel.badge.observe(viewLifecycleOwner) { presentBadge(it) } - - if (viewModel.shouldShowUsername()) { - viewModel.username.observe(viewLifecycleOwner) { presentUsername(it) } - } else { - binding.manageProfileUsernameContainer.visibility = View.GONE - binding.manageProfileDivider.root.visibility = View.GONE - binding.usernameInfoText.visibility = View.GONE - } + viewModel.username.observe(viewLifecycleOwner) { presentUsername(it) } } private fun presentAvatarImage(avatarData: Optional) { @@ -242,6 +212,31 @@ class EditProfileFragment : LoggingFragment() { } else { binding.usernameErrorIndicator.visibility = View.GONE } + + if (SignalStore.account().username != null && SignalStore.account().usernameSyncState != AccountValues.UsernameSyncState.USERNAME_AND_LINK_CORRUPTED) { + binding.usernameLinkContainer.setOnClickListener { + findNavController().safeNavigate(EditProfileFragmentDirections.actionManageProfileFragmentToUsernameLinkFragment()) + } + + if (SignalStore.account().usernameSyncState == AccountValues.UsernameSyncState.LINK_CORRUPTED) { + binding.linkErrorIndicator.visibility = View.VISIBLE + } else { + binding.linkErrorIndicator.visibility = View.GONE + } + + if (SignalStore.tooltips().showProfileSettingsQrCodeTooltop()) { + binding.usernameLinkTooltip.visibility = View.VISIBLE + binding.linkTooltipCloseButton.setOnClickListener { + binding.usernameLinkTooltip.visibility = View.GONE + SignalStore.tooltips().markProfileSettingsQrCodeTooltipSeen() + } + } + + binding.usernameInfoText.setText(R.string.ManageProfileFragment__your_username) + } else { + binding.usernameLinkContainer.visibility = View.GONE + binding.usernameInfoText.setText(R.string.ManageProfileFragment__username_footer_no_username) + } } private fun presentAbout(about: String?) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileViewModel.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileViewModel.java index b27b344985..ee2b4705f9 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileViewModel.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/EditProfileViewModel.java @@ -107,10 +107,6 @@ public Single deleteUsername() { return UsernameRepository.deleteUsernameAndLink().observeOn(AndroidSchedulers.mainThread()); } - public boolean shouldShowUsername() { - return FeatureFlags.usernames(); - } - public void onAvatarSelected(@NonNull Context context, @Nullable Media media) { previousAvatar = internalAvatarState.getValue() != null ? internalAvatarState.getValue().getAvatar() : null; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java index 0fab2e03b5..8a56a1ef05 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditFragment.java @@ -2,7 +2,6 @@ import android.animation.LayoutTransition; import android.app.Activity; -import android.content.Intent; import android.content.res.ColorStateList; import android.os.Bundle; import android.view.LayoutInflater; @@ -15,7 +14,6 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.core.content.ContextCompat; -import androidx.fragment.app.FragmentActivity; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProvider; import androidx.navigation.Navigation; @@ -27,7 +25,6 @@ import org.signal.core.util.EditTextUtil; import org.signal.core.util.concurrent.LifecycleDisposable; import org.thoughtcrime.securesms.LoggingFragment; -import org.thoughtcrime.securesms.PassphraseRequiredActivity; import org.thoughtcrime.securesms.R; import org.thoughtcrime.securesms.contactshare.SimpleTextWatcher; import org.thoughtcrime.securesms.databinding.UsernameEditFragmentBinding; @@ -42,8 +39,7 @@ public class UsernameEditFragment extends LoggingFragment { private static final float DISABLED_ALPHA = 0.5f; public static final String IGNORE_TEXT_CHANGE_EVENT = "ignore.text.change.event"; - public static final int REQUEST_CODE = 4242; - public static final String EXTRA_USERNAME = "username"; + public static final int REQUEST_CODE = 4242; private UsernameEditViewModel viewModel; private UsernameEditFragmentBinding binding; @@ -80,21 +76,14 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat args = new UsernameEditFragmentArgs.Builder().build(); } - if (args.getMode() == UsernameEditMode.REGISTRATION) { - binding.toolbar.setNavigationIcon(null); - binding.toolbar.setTitle(R.string.UsernameEditFragment__add_a_username); - binding.usernameSkipButton.setVisibility(View.VISIBLE); - binding.usernameDoneButton.setVisibility(View.VISIBLE); - } else { - binding.toolbar.setNavigationOnClickListener(v -> { - if (args.getMode() == UsernameEditMode.RECOVERY) { - getActivity().finish(); - } else { - Navigation.findNavController(view).popBackStack(); - } - }); - binding.usernameSubmitButton.setVisibility(View.VISIBLE); - } + binding.toolbar.setNavigationOnClickListener(v -> { + if (args.getMode() == UsernameEditMode.RECOVERY) { + getActivity().finish(); + } else { + Navigation.findNavController(view).popBackStack(); + } + }); + binding.usernameSubmitButton.setVisibility(View.VISIBLE); binding.usernameTextWrapper.setErrorIconDrawable(null); @@ -109,7 +98,7 @@ public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceStat binding.usernameSubmitButton.setOnClickListener(v -> promptOrSubmitUsername()); binding.usernameDeleteButton.setOnClickListener(v -> viewModel.onUsernameDeleted()); - binding.usernameDoneButton.setOnClickListener(v -> viewModel.onUsernameSubmitted()); + binding.usernameDoneButton.setOnClickListener(v -> viewModel.onUsernameSubmitted(false)); binding.usernameSkipButton.setOnClickListener(v -> viewModel.onUsernameSkipped()); binding.usernameText.addTextChangedListener(new SimpleTextWatcher() { @@ -156,28 +145,26 @@ private void promptOrSubmitUsername() { new MaterialAlertDialogBuilder(requireContext()) .setMessage(R.string.UsernameEditFragment_recovery_dialog_confirmation) .setPositiveButton(android.R.string.ok, ((dialog, which) -> { - viewModel.onUsernameSubmitted(); + viewModel.onUsernameSubmitted(true); dialog.dismiss(); })) .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) .show(); } else { - viewModel.onUsernameSubmitted(); + viewModel.onUsernameSubmitted(false); } } private void onLearnMore(@Nullable View unused) { new MaterialAlertDialogBuilder(requireContext()) - .setTitle(new StringBuilder("#\n").append(getString(R.string.UsernameEditFragment__what_is_this_number))) + .setTitle(getString(R.string.UsernameEditFragment__what_is_this_number)) .setMessage(R.string.UsernameEditFragment__these_digits_help_keep) .setPositiveButton(android.R.string.ok, (dialog, which) -> {}) .show(); } private void onUiStateChanged(@NonNull UsernameEditViewModel.State state) { - TextInputLayout usernameInputWrapper = binding.usernameTextWrapper; - presentProgressState(state.usernameState); presentButtonState(state.buttonState); presentSummary(state.usernameState); @@ -208,50 +195,17 @@ private void onUiStateChanged(@NonNull UsernameEditViewModel.State state) { binding.usernameError.setVisibility(error != null ? View.VISIBLE : View.GONE); binding.usernameError.setText(error); binding.root.setLayoutTransition(STATIC_LAYOUT); - } - private void presentButtonState(@NonNull UsernameEditViewModel.ButtonState buttonState) { - if (args.getMode() == UsernameEditMode.REGISTRATION) { - presentRegistrationButtonState(buttonState); + if (state.usernameState.getDiscriminator() == null && SignalStore.account().getUsername() == null) { + binding.discriminatorText.setVisibility(View.GONE); + binding.divider.setVisibility(View.GONE); } else { - presentProfileUpdateButtonState(buttonState); - } - } - - private void presentSummary(@NonNull UsernameState usernameState) { - if (usernameState.getUsername() != null) { - binding.summary.setText(usernameState.getUsername().getUsername()); - binding.summary.setAlpha(1f); - } else if (!(usernameState instanceof UsernameState.Loading)) { - binding.summary.setText(R.string.UsernameEditFragment__choose_your_username); - binding.summary.setAlpha(1f); + binding.discriminatorText.setVisibility(View.VISIBLE); + binding.divider.setVisibility(View.VISIBLE); } } - private void presentRegistrationButtonState(@NonNull UsernameEditViewModel.ButtonState buttonState) { - binding.usernameText.setEnabled(true); - binding.usernameProgressCard.setVisibility(View.GONE); - - switch (buttonState) { - case SUBMIT: - binding.usernameDoneButton.setEnabled(true); - binding.usernameDoneButton.setAlpha(1f); - break; - case SUBMIT_DISABLED: - binding.usernameDoneButton.setEnabled(false); - binding.usernameDoneButton.setAlpha(DISABLED_ALPHA); - break; - case SUBMIT_LOADING: - binding.usernameDoneButton.setEnabled(false); - binding.usernameDoneButton.setAlpha(DISABLED_ALPHA); - binding.usernameProgressCard.setVisibility(View.VISIBLE); - break; - default: - throw new IllegalStateException("Delete functionality is not available during registration."); - } - } - - private void presentProfileUpdateButtonState(@NonNull UsernameEditViewModel.ButtonState buttonState) { + private void presentButtonState(@NonNull UsernameEditViewModel.ButtonState buttonState) { CircularProgressMaterialButton submitButton = binding.usernameSubmitButton; CircularProgressMaterialButton deleteButton = binding.usernameDeleteButton; EditText usernameInput = binding.usernameText; @@ -303,6 +257,16 @@ private void presentProfileUpdateButtonState(@NonNull UsernameEditViewModel.Butt } } + private void presentSummary(@NonNull UsernameState usernameState) { + if (usernameState.getUsername() != null) { + binding.summary.setText(usernameState.getUsername().getUsername()); + binding.summary.setAlpha(1f); + } else if (!(usernameState instanceof UsernameState.Loading)) { + binding.summary.setText(R.string.UsernameEditFragment__choose_your_username); + binding.summary.setAlpha(1f); + } + } + private void presentUsernameInputState(@NonNull UsernameEditStateMachine.State state) { binding.usernameText.setTag(IGNORE_TEXT_CHANGE_EVENT); String nickname = state.getNickname(); @@ -356,38 +320,23 @@ private void onEvent(@NonNull UsernameEditViewModel.Event event) { case SKIPPED: closeScreen(); break; + case NEEDS_CONFIRM_RESET: + new MaterialAlertDialogBuilder(requireContext()) + .setMessage(R.string.UsernameEditFragment_change_confirmation_message) + .setNegativeButton(android.R.string.cancel, (dialog, which) -> dialog.dismiss()) + .setPositiveButton(R.string.UsernameEditFragment_continue, (dialog, which) -> viewModel.onUsernameSubmitted(true)) + .show(); } } private void closeScreen() { - if (args.getMode() == UsernameEditMode.REGISTRATION) { - finishAndStartNextIntent(); - } else if (args.getMode() == UsernameEditMode.RECOVERY) { + if (args.getMode() == UsernameEditMode.RECOVERY) { getActivity().finish(); } else { NavHostFragment.findNavController(this).popBackStack(); } } - private void finishAndStartNextIntent() { - FragmentActivity activity = requireActivity(); - boolean didLaunch = false; - Intent activityIntent = activity.getIntent(); - - if (activityIntent != null) { - Intent nextIntent = activityIntent.getParcelableExtra(PassphraseRequiredActivity.NEXT_INTENT_EXTRA); - if (nextIntent != null) { - activity.startActivity(nextIntent); - activity.finish(); - didLaunch = true; - } - } - - if (!didLaunch) { - activity.finish(); - } - } - static class ResultContract extends FragmentResultContract { private static final String REQUEST_KEY = "username_created"; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditMode.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditMode.kt index a99936ff58..7b1f7c3cba 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditMode.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditMode.kt @@ -9,11 +9,6 @@ enum class UsernameEditMode { /** A typical launch, no special conditions. */ NORMAL, - /** Screen is launched during registration, includes special first-time flows. */ - REGISTRATION, - /** Screen was launched because the username was in a bad state and needs to be recovered. Shows a special dialog. */ - RECOVERY; - - val allowsDelete get() = this == NORMAL || this == RECOVERY + RECOVERY } diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt index 7af746d415..c605fd0fe8 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/manage/UsernameEditViewModel.kt @@ -12,6 +12,7 @@ import io.reactivex.rxjava3.kotlin.subscribeBy import io.reactivex.rxjava3.schedulers.Schedulers import io.reactivex.rxjava3.subjects.PublishSubject import org.signal.core.util.Result +import org.signal.core.util.isNotNullOrBlank import org.signal.core.util.logging.Log import org.signal.libsignal.usernames.Username import org.thoughtcrime.securesms.dependencies.ApplicationDependencies @@ -83,7 +84,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern uiState.update { state: State -> if (nickname.isBlank() && SignalStore.account().username != null) { return@update State( - buttonState = if (mode.allowsDelete) ButtonState.DELETE else ButtonState.SUBMIT_DISABLED, + buttonState = ButtonState.DELETE, usernameStatus = UsernameStatus.NONE, usernameState = UsernameState.NoUsername ) @@ -105,7 +106,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern uiState.update { state: State -> if (discriminator.isBlank() && SignalStore.account().username != null) { return@update State( - buttonState = if (mode.allowsDelete) ButtonState.DELETE else ButtonState.SUBMIT_DISABLED, + buttonState = ButtonState.DELETE, usernameStatus = UsernameStatus.NONE, usernameState = UsernameState.NoUsername ) @@ -128,7 +129,10 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern events.onNext(Event.SKIPPED) } - fun onUsernameSubmitted() { + /** + * @param userConfirmedResetOk True if the user is submitting this after confirming that they're ok with resetting their username via [Event.NEEDS_CONFIRM_RESET]. + */ + fun onUsernameSubmitted(userConfirmedResetOk: Boolean) { if (!NetworkUtil.isConnected(ApplicationDependencies.getApplication())) { events.onNext(Event.NETWORK_FAILURE) return @@ -138,6 +142,11 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern val usernameState = uiState.state.usernameState val isCaseChange = isCaseChange(editState) + if (!isCaseChange && SignalStore.account().username.isNotNullOrBlank() && !userConfirmedResetOk) { + events.onNext(Event.NEEDS_CONFIRM_RESET) + return + } + if (usernameState !is UsernameState.Reserved && usernameState !is UsernameState.CaseChange) { Log.w(TAG, "Username was submitted, current state is invalid! State: ${usernameState.javaClass.simpleName}") uiState.update { it.copy(buttonState = ButtonState.SUBMIT_DISABLED, usernameStatus = UsernameStatus.NONE) } @@ -365,7 +374,7 @@ internal class UsernameEditViewModel private constructor(private val mode: Usern } enum class Event { - NETWORK_FAILURE, SUBMIT_SUCCESS, DELETE_SUCCESS, SUBMIT_FAIL_INVALID, SUBMIT_FAIL_TAKEN, SKIPPED + NETWORK_FAILURE, SUBMIT_SUCCESS, DELETE_SUCCESS, SUBMIT_FAIL_INVALID, SUBMIT_FAIL_TAKEN, SKIPPED, NEEDS_CONFIRM_RESET } class Factory(private val mode: UsernameEditMode) : ViewModelProvider.Factory { diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewBannerView.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewBannerView.java index 7d4c3f2cea..a4768c4253 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewBannerView.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewBannerView.java @@ -69,9 +69,9 @@ public void setBannerIcon(@Nullable Drawable icon) { binding.bannerAvatarStroke.setVisibility(GONE); } - public void setBannerRecipient(@NonNull Recipient recipient) { - binding.bannerTopLeftAvatar.setAvatar(recipient); - binding.bannerBottomRightAvatar.setAvatar(recipient); + public void setBannerRecipients(@NonNull Recipient target, @NonNull Recipient dupe) { + binding.bannerTopLeftAvatar.setAvatar(target); + binding.bannerBottomRightAvatar.setAvatar(dupe); binding.bannerIcon.setVisibility(GONE); binding.bannerTopLeftAvatar.setVisibility(VISIBLE); diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardDialogFragment.java index f4e253c897..76bc9be24d 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardDialogFragment.java @@ -175,8 +175,7 @@ private final class AdapterCallbacks implements ReviewCardAdapter.Callbacks { @Override public void onCardClicked(@NonNull ReviewCard card) { - RecipientBottomSheetDialogFragment.create(card.getReviewRecipient().getId(), null) - .show(requireFragmentManager(), null); + RecipientBottomSheetDialogFragment.show(getParentFragmentManager(), card.getReviewRecipient().getId(), null); } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardViewHolder.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardViewHolder.java index 63f6836e12..6052cfd6b5 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardViewHolder.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewCardViewHolder.java @@ -83,13 +83,6 @@ void bind(@NonNull ReviewCard reviewCard) { binding.cardName.setText(name); - int titleTextResId = getTitleResId(reviewCard.getCardType()); - if (titleTextResId > 0) { - binding.cardTitle.setText(getTitleResId(reviewCard.getCardType())); - } else { - binding.cardTitle.setVisibility(View.GONE); - } - List rows = switch (reviewCard.getCardType()) { case MEMBER, REQUEST -> getNonContactSublines(reviewCard); case YOUR_CONTACT -> getContactSublines(reviewCard); @@ -253,14 +246,6 @@ interface Callbacks { void onSignalConnectionClicked(); } - private static @StringRes int getTitleResId(@NonNull ReviewCard.CardType cardType) { - return switch (cardType) { - case MEMBER -> -1; - case REQUEST -> R.string.ReviewCard__request; - case YOUR_CONTACT -> R.string.ReviewCard__your_contact; - }; - } - private static @StringRes int getActionLabelResId(@NonNull ReviewCard.Action action) { return switch (action) { case UPDATE_CONTACT -> R.string.ReviewCard__update_contact; diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewUtil.java b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewUtil.java index 2926140d98..173ea4b773 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/spoofing/ReviewUtil.java @@ -39,15 +39,17 @@ private ReviewUtil() { } * @return Whether or not multiple recipients share this profile name. */ @WorkerThread - public static boolean isRecipientReviewSuggested(@NonNull RecipientId recipientId) + public static List getRecipientsToPromptForReview(@NonNull RecipientId recipientId) { Recipient recipient = Recipient.resolved(recipientId); if (recipient.isGroup() || recipient.isSystemContact()) { - return false; + return Collections.emptyList(); } - return SignalDatabase.recipients().getSimilarRecipientIds(recipient).size() > 1; + return Stream.of(SignalDatabase.recipients().getSimilarRecipientIds(recipient)) + .filter(id -> !id.equals(recipientId)) + .toList(); } @WorkerThread diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/username/AddAUsernameActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/username/AddAUsernameActivity.kt deleted file mode 100644 index 214eebe948..0000000000 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/username/AddAUsernameActivity.kt +++ /dev/null @@ -1,38 +0,0 @@ -package org.thoughtcrime.securesms.profiles.username - -import android.os.Bundle -import androidx.navigation.fragment.NavHostFragment -import org.thoughtcrime.securesms.BaseActivity -import org.thoughtcrime.securesms.R -import org.thoughtcrime.securesms.profiles.manage.UsernameEditFragmentArgs -import org.thoughtcrime.securesms.profiles.manage.UsernameEditMode -import org.thoughtcrime.securesms.util.DynamicNoActionBarTheme -import org.thoughtcrime.securesms.util.DynamicTheme - -class AddAUsernameActivity : BaseActivity() { - private val dynamicTheme: DynamicTheme = DynamicNoActionBarTheme() - private val contentViewId: Int = R.layout.fragment_container - - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(contentViewId) - dynamicTheme.onCreate(this) - - if (savedInstanceState == null) { - supportFragmentManager.beginTransaction() - .replace( - R.id.fragment_container, - NavHostFragment.create( - R.navigation.create_username, - UsernameEditFragmentArgs.Builder().setMode(UsernameEditMode.REGISTRATION).build().toBundle() - ) - ) - .commit() - } - } - - override fun onResume() { - super.onResume() - dynamicTheme.onResume(this) - } -} diff --git a/app/src/main/java/org/thoughtcrime/securesms/profiles/username/NewWaysToConnectDialogFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/profiles/username/NewWaysToConnectDialogFragment.kt index ee5ed6c157..857402ee90 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/profiles/username/NewWaysToConnectDialogFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/profiles/username/NewWaysToConnectDialogFragment.kt @@ -80,17 +80,19 @@ private fun NewWaysToConnectDialogContent( navigationIconPainter = painterResource(id = R.drawable.symbol_x_24) ) { Column(modifier = Modifier.padding(it)) { - Text( - text = stringResource(id = R.string.NewWaysToConnectDialogFragment__new_ways_to_connect), - style = MaterialTheme.typography.headlineMedium, - textAlign = TextAlign.Center, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) - .padding(top = 16.dp, bottom = 36.dp) - ) - LazyColumn(modifier = Modifier.weight(1f)) { + item { + Text( + text = stringResource(id = R.string.NewWaysToConnectDialogFragment__new_ways_to_connect), + style = MaterialTheme.typography.headlineMedium, + textAlign = TextAlign.Center, + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) + .padding(top = 4.dp, bottom = 36.dp) + ) + } + item { NewWaysToConnectRowItem( title = stringResource(id = R.string.NewWaysToConnectDialogFragment__phone_number_privacy), @@ -120,7 +122,7 @@ private fun NewWaysToConnectDialogContent( onClick = onSetUpUsernameClick, modifier = Modifier .padding(horizontal = dimensionResource(id = R.dimen.core_ui__gutter)) - .padding(top = 36.dp) + .padding(top = 16.dp) .defaultMinSize(minWidth = 221.dp) .align(alignment = Alignment.CenterHorizontally) ) { @@ -133,8 +135,10 @@ private fun NewWaysToConnectDialogContent( onClick = onNotNowClick, modifier = Modifier .padding( - horizontal = dimensionResource(id = R.dimen.core_ui__gutter), - vertical = 36.dp + start = dimensionResource(id = R.dimen.core_ui__gutter), + end = dimensionResource(id = R.dimen.core_ui__gutter), + top = 8.dp, + bottom = 16.dp ) .defaultMinSize(minWidth = 221.dp) .align(alignment = Alignment.CenterHorizontally) diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java index 268208b75a..c2b6d97217 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/Recipient.java @@ -681,11 +681,7 @@ private String getUnknownDisplayName(@NonNull Context context) { } public @NonNull Optional getUsername() { - if (FeatureFlags.usernames()) { - return OptionalUtil.absentIfEmpty(username); - } else { - return Optional.empty(); - } + return OptionalUtil.absentIfEmpty(username); } public @NonNull Optional getE164() { @@ -696,7 +692,7 @@ private String getUnknownDisplayName(@NonNull Context context) { * Whether or not we should show this user's e164 in the interface. */ public boolean shouldShowE164() { - return hasE164() && (isSystemContact() || getPhoneNumberSharing() != PhoneNumberSharingState.DISABLED); + return hasE164() && (isSystemContact() || getPhoneNumberSharing() == PhoneNumberSharingState.ENABLED); } public @NonNull Optional getEmail() { diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheet.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheet.kt index ed1d78b48e..4db9e45db2 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheet.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheet.kt @@ -5,6 +5,7 @@ package org.thoughtcrime.securesms.recipients.ui.about +import android.content.res.Configuration import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column @@ -26,7 +27,6 @@ import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.painter.Painter -import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.pluralStringResource import androidx.compose.ui.res.stringResource @@ -38,6 +38,7 @@ import androidx.core.widget.TextViewCompat import org.signal.core.ui.BottomSheets import org.signal.core.ui.theme.SignalTheme import org.signal.core.util.getParcelableCompat +import org.signal.core.util.isNotNullOrBlank import org.thoughtcrime.securesms.AvatarPreviewActivity import org.thoughtcrime.securesms.R import org.thoughtcrime.securesms.avatar.AvatarImage @@ -81,11 +82,27 @@ class AboutSheet : ComposeBottomSheetDialogFragment() { override fun SheetContent() { val recipient by viewModel.recipient val groupsInCommonCount by viewModel.groupsInCommonCount + val verified by viewModel.verified if (recipient.isPresent) { - AboutSheetContent( - recipient = recipient.get(), - groupsInCommonCount = groupsInCommonCount, + Content( + model = AboutModel( + isSelf = recipient.get().isSelf, + hasAvatar = recipient.get().profileAvatarFileDetails.hasFile(), + displayName = recipient.get().getDisplayName(requireContext()), + shortName = recipient.get().getShortDisplayName(requireContext()), + about = recipient.get().about, + verified = verified, + recipientForAvatar = recipient.get(), + formattedE164 = if (recipient.get().hasE164() && recipient.get().shouldShowE164()) { + PhoneNumberFormatter.get(requireContext()).prettyPrintFormat(recipient.get().requireE164()) + } else { + null + }, + groupsInCommon = groupsInCommonCount, + profileSharing = recipient.get().isProfileSharing, + systemContact = recipient.get().isSystemContact + ), onClickSignalConnections = this::openSignalConnectionsSheet, onAvatarClicked = this::openProfilePhotoViewer ) @@ -102,25 +119,23 @@ class AboutSheet : ComposeBottomSheetDialogFragment() { } } -@Preview -@Composable -private fun AboutSheetContentPreview() { - SignalTheme { - Surface { - AboutSheetContent( - recipient = Recipient.UNKNOWN, - groupsInCommonCount = 0, - onClickSignalConnections = {}, - onAvatarClicked = {} - ) - } - } -} +private data class AboutModel( + val isSelf: Boolean, + val displayName: String, + val shortName: String, + val about: String?, + val verified: Boolean, + val hasAvatar: Boolean, + val recipientForAvatar: Recipient, + val formattedE164: String?, + val profileSharing: Boolean, + val systemContact: Boolean, + val groupsInCommon: Int +) @Composable -private fun AboutSheetContent( - recipient: Recipient, - groupsInCommonCount: Int, +private fun Content( + model: AboutModel, onClickSignalConnections: () -> Unit, onAvatarClicked: () -> Unit ) { @@ -131,8 +146,8 @@ private fun AboutSheetContent( BottomSheets.Handle(modifier = Modifier.padding(top = 6.dp)) } - val avatarOnClick = remember(recipient.profileAvatarFileDetails.hasFile()) { - if (recipient.profileAvatarFileDetails.hasFile()) { + val avatarOnClick = remember(model.hasAvatar) { + if (model.hasAvatar) { onAvatarClicked } else { { } @@ -141,7 +156,7 @@ private fun AboutSheetContent( Column(horizontalAlignment = Alignment.CenterHorizontally) { AvatarImage( - recipient = recipient, + recipient = model.recipientForAvatar, modifier = Modifier .padding(top = 56.dp) .size(240.dp) @@ -150,7 +165,7 @@ private fun AboutSheetContent( ) Text( - text = stringResource(id = if (recipient.isSelf) R.string.AboutSheet__you else R.string.AboutSheet__about), + text = stringResource(id = if (model.isSelf) R.string.AboutSheet__you else R.string.AboutSheet__about), style = MaterialTheme.typography.headlineMedium, modifier = Modifier .fillMaxWidth() @@ -158,22 +173,19 @@ private fun AboutSheetContent( .padding(top = 20.dp, bottom = 14.dp) ) - val context = LocalContext.current - val displayName = remember(recipient) { recipient.getDisplayName(context) } - AboutRow( startIcon = painterResource(R.drawable.symbol_person_24), - text = displayName, + text = model.displayName, modifier = Modifier.fillMaxWidth() ) - if (!recipient.about.isNullOrBlank()) { + if (model.about.isNotNullOrBlank()) { AboutRow( startIcon = painterResource(R.drawable.symbol_edit_24), text = { Row { AndroidView(factory = ::EmojiTextView) { - it.text = recipient.combinedAboutAndEmoji + it.text = model.about TextViewCompat.setTextAppearance(it, R.style.Signal_Text_BodyLarge) } @@ -183,7 +195,16 @@ private fun AboutSheetContent( ) } - if (recipient.isProfileSharing) { + if (model.verified) { + AboutRow( + startIcon = painterResource(id = R.drawable.check), + text = stringResource(id = R.string.AboutSheet__verified), + modifier = Modifier.align(alignment = Alignment.Start), + onClick = onClickSignalConnections + ) + } + + if (model.profileSharing || model.systemContact) { AboutRow( startIcon = painterResource(id = R.drawable.symbol_connections_24), text = stringResource(id = R.string.AboutSheet__signal_connection), @@ -191,36 +212,38 @@ private fun AboutSheetContent( modifier = Modifier.align(alignment = Alignment.Start), onClick = onClickSignalConnections ) + } else { + AboutRow( + startIcon = painterResource(id = R.drawable.chat_x), + text = stringResource(id = R.string.AboutSheet__no_direct_message, model.shortName), + modifier = Modifier.align(alignment = Alignment.Start), + onClick = onClickSignalConnections + ) } - val shortName = remember(recipient) { recipient.getShortDisplayName(context) } - if (recipient.isSystemContact) { + if (model.systemContact) { AboutRow( startIcon = painterResource(id = R.drawable.symbol_person_circle_24), - text = stringResource(id = R.string.AboutSheet__s_is_in_your_system_contacts, shortName), + text = stringResource(id = R.string.AboutSheet__s_is_in_your_system_contacts, model.shortName), modifier = Modifier.fillMaxWidth() ) } - if (recipient.e164.isPresent && recipient.shouldShowE164()) { - val e164 = remember(recipient.e164.get()) { - PhoneNumberFormatter.get(context).prettyPrintFormat(recipient.e164.get()) - } - + if (model.formattedE164.isNotNullOrBlank()) { AboutRow( startIcon = painterResource(R.drawable.symbol_phone_24), - text = e164, + text = model.formattedE164, modifier = Modifier.fillMaxWidth() ) } - val groupsInCommonText = if (recipient.hasGroupsInCommon()) { - pluralStringResource(id = R.plurals.AboutSheet__d_groups_in, groupsInCommonCount, groupsInCommonCount) + val groupsInCommonText = if (model.groupsInCommon > 0) { + pluralStringResource(id = R.plurals.AboutSheet__d_groups_in, model.groupsInCommon, model.groupsInCommon) } else { stringResource(id = R.string.AboutSheet__you_have_no_groups_in_common) } - val groupsInCommonIcon = if (!recipient.isProfileSharing && groupsInCommonCount == 0) { + val groupsInCommonIcon = if (!model.profileSharing && model.groupsInCommon == 0) { painterResource(R.drawable.symbol_error_circle_24) } else { painterResource(R.drawable.symbol_group_24) @@ -236,20 +259,6 @@ private fun AboutSheetContent( } } -@Preview -@Composable -private fun AboutRowPreview() { - SignalTheme { - Surface { - AboutRow( - startIcon = painterResource(R.drawable.symbol_person_24), - text = "Maya Johnson", - endIcon = painterResource(id = R.drawable.symbol_chevron_right_compact_bold_16) - ) - } - } -} - @Composable private fun AboutRow( startIcon: Painter, @@ -318,3 +327,126 @@ private fun AboutRow( } } } + +@Preview(name = "Light Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ContentPreviewDefault() { + SignalTheme { + Surface { + Content( + model = AboutModel( + isSelf = false, + hasAvatar = true, + displayName = "Peter Parker", + shortName = "Peter", + about = "Photographer for the Daily Bugle.", + verified = true, + recipientForAvatar = Recipient.UNKNOWN, + formattedE164 = "(123) 456-7890", + profileSharing = true, + systemContact = true, + groupsInCommon = 0 + ), + onClickSignalConnections = {}, + onAvatarClicked = {} + ) + } + } +} + +@Preview(name = "Light Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ContentPreviewInContactsNotProfileSharing() { + SignalTheme { + Surface { + Content( + model = AboutModel( + isSelf = false, + hasAvatar = true, + displayName = "Peter Parker", + shortName = "Peter", + about = "Photographer for the Daily Bugle.", + verified = false, + recipientForAvatar = Recipient.UNKNOWN, + formattedE164 = null, + profileSharing = false, + systemContact = true, + groupsInCommon = 3 + ), + onClickSignalConnections = {}, + onAvatarClicked = {} + ) + } + } +} + +@Preview(name = "Light Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ContentPreviewGroupsInCommonNoE164() { + SignalTheme { + Surface { + Content( + model = AboutModel( + isSelf = false, + hasAvatar = true, + displayName = "Peter Parker", + shortName = "Peter", + about = "Photographer for the Daily Bugle.", + verified = false, + recipientForAvatar = Recipient.UNKNOWN, + formattedE164 = null, + profileSharing = true, + systemContact = false, + groupsInCommon = 3 + ), + onClickSignalConnections = {}, + onAvatarClicked = {} + ) + } + } +} + +@Preview(name = "Light Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ContentPreviewNotAConnection() { + SignalTheme { + Surface { + Content( + model = AboutModel( + isSelf = false, + hasAvatar = true, + displayName = "Peter Parker", + shortName = "Peter", + about = "Photographer for the Daily Bugle.", + verified = false, + recipientForAvatar = Recipient.UNKNOWN, + formattedE164 = null, + profileSharing = false, + systemContact = false, + groupsInCommon = 3 + ), + onClickSignalConnections = {}, + onAvatarClicked = {} + ) + } + } +} + +@Preview(name = "Light Theme", group = "about row", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "about row", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun AboutRowPreview() { + SignalTheme { + Surface { + AboutRow( + startIcon = painterResource(R.drawable.symbol_person_24), + text = "Maya Johnson", + endIcon = painterResource(id = R.drawable.symbol_chevron_right_compact_bold_16) + ) + } + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheetRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheetRepository.kt index 587638d63e..22650f7f81 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheetRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheetRepository.kt @@ -7,7 +7,9 @@ package org.thoughtcrime.securesms.recipients.ui.about import io.reactivex.rxjava3.core.Single import io.reactivex.rxjava3.schedulers.Schedulers +import org.thoughtcrime.securesms.database.IdentityTable import org.thoughtcrime.securesms.database.SignalDatabase +import org.thoughtcrime.securesms.dependencies.ApplicationDependencies import org.thoughtcrime.securesms.recipients.RecipientId class AboutSheetRepository { @@ -16,4 +18,11 @@ class AboutSheetRepository { SignalDatabase.groups.getPushGroupsContainingMember(recipientId).size }.subscribeOn(Schedulers.io()) } + + fun getVerified(recipientId: RecipientId): Single { + return Single.fromCallable { + val identityRecord = ApplicationDependencies.getProtocolStore().aci().identities().getIdentityRecord(recipientId) + identityRecord.isPresent && identityRecord.get().verifiedStatus == IdentityTable.VerifiedStatus.VERIFIED + }.subscribeOn(Schedulers.io()) + } } diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheetViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheetViewModel.kt index 1d936ffb4c..51716a7b1e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheetViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/about/AboutSheetViewModel.kt @@ -30,6 +30,9 @@ class AboutSheetViewModel( private val _groupsInCommonCount: MutableIntState = mutableIntStateOf(0) val groupsInCommonCount: IntState = _groupsInCommonCount + private val _verified: MutableState = mutableStateOf(false) + val verified: State = _verified + private val recipientDisposable: Disposable = Recipient .observable(recipientId) .observeOn(AndroidSchedulers.mainThread()) @@ -44,6 +47,13 @@ class AboutSheetViewModel( _groupsInCommonCount.intValue = it } + private val verifiedDisposable: Disposable = repository + .getVerified(recipientId) + .observeOn(AndroidSchedulers.mainThread()) + .subscribeBy { + _verified.value = it + } + override fun onCleared() { recipientDisposable.dispose() groupsInCommonDisposable.dispose() diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java index df02d0d02f..51fe18c625 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/bottomsheet/RecipientBottomSheetDialogFragment.java @@ -19,6 +19,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.fragment.app.DialogFragment; +import androidx.fragment.app.Fragment; import androidx.fragment.app.FragmentManager; import androidx.lifecycle.ViewModelProvider; @@ -40,6 +41,7 @@ import org.thoughtcrime.securesms.recipients.RecipientId; import org.thoughtcrime.securesms.recipients.RecipientUtil; import org.thoughtcrime.securesms.recipients.ui.about.AboutSheet; +import org.thoughtcrime.securesms.recipients.ui.about.AboutSheetKt; import org.thoughtcrime.securesms.util.BottomSheetUtil; import org.thoughtcrime.securesms.util.ContextUtil; import org.thoughtcrime.securesms.util.SpanUtil; @@ -88,20 +90,23 @@ public final class RecipientBottomSheetDialogFragment extends BottomSheetDialogF private ButtonStripPreference.ViewHolder buttonStripViewHolder; - public static BottomSheetDialogFragment create(@NonNull RecipientId recipientId, - @Nullable GroupId groupId) - { - Bundle args = new Bundle(); - RecipientBottomSheetDialogFragment fragment = new RecipientBottomSheetDialogFragment(); - - args.putString(ARGS_RECIPIENT_ID, recipientId.serialize()); - if (groupId != null) { - args.putString(ARGS_GROUP_ID, groupId.toString()); - } + public static void show(FragmentManager fragmentManager, @NonNull RecipientId recipientId, @Nullable GroupId groupId) { + Recipient recipient = Recipient.resolved(recipientId); + if (recipient.isSelf()) { + AboutSheet.create(recipient).show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG); + } else { + Bundle args = new Bundle(); + RecipientBottomSheetDialogFragment fragment = new RecipientBottomSheetDialogFragment(); + + args.putString(ARGS_RECIPIENT_ID, recipientId.serialize()); + if (groupId != null) { + args.putString(ARGS_GROUP_ID, groupId.toString()); + } - fragment.setArguments(args); + fragment.setArguments(args); - return fragment; + fragment.show(fragmentManager, BottomSheetUtil.STANDARD_BOTTOM_SHEET_FRAGMENT_TAG); + } } @Override diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt index 6936570bdd..817f1601bd 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByActivity.kt @@ -7,6 +7,7 @@ package org.thoughtcrime.securesms.recipients.ui.findby import android.content.Context import android.content.Intent +import android.content.res.Configuration import android.os.Bundle import androidx.activity.compose.setContent import androidx.activity.result.contract.ActivityResultContract @@ -40,6 +41,7 @@ import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.focus.FocusRequester import androidx.compose.ui.focus.focusRequester import androidx.compose.ui.graphics.Color @@ -124,7 +126,7 @@ class FindByActivity : PassphraseRequiredActivity() { navigationIconPainter = painterResource(id = R.drawable.symbol_arrow_left_24) ) { val context = LocalContext.current - FindByContent( + Content( paddingValues = it, state = state, onUserEntryChanged = viewModel::onUserEntryChanged, @@ -265,25 +267,8 @@ class FindByActivity : PassphraseRequiredActivity() { } } -@Preview @Composable -private fun FindByContentPreview() { - Previews.Preview { - FindByContent( - paddingValues = PaddingValues(0.dp), - state = FindByState( - mode = FindByMode.PHONE_NUMBER, - userEntry = "" - ), - onUserEntryChanged = {}, - onNextClick = {}, - onSelectCountryPrefixClick = {} - ) - } -} - -@Composable -private fun FindByContent( +private fun Content( paddingValues: PaddingValues, state: FindByState, onUserEntryChanged: (String) -> Unit, @@ -363,12 +348,16 @@ private fun FindByContent( .padding(horizontal = 16.dp, vertical = 10.dp) .focusRequester(focusRequester) .heightIn(min = 44.dp), - contentPadding = TextFieldDefaults.contentPaddingWithoutLabel(top = 10.dp, bottom = 10.dp) + contentPadding = if (state.mode == FindByMode.PHONE_NUMBER) { + TextFieldDefaults.contentPaddingWithoutLabel(start = 4.dp, top = 10.dp, bottom = 10.dp) + } else { + TextFieldDefaults.contentPaddingWithoutLabel(top = 10.dp, bottom = 10.dp) + } ) if (state.mode == FindByMode.USERNAME) { Text( - text = stringResource(id = R.string.FindByActivity__enter_a_full_username), + text = stringResource(id = R.string.FindByActivity__enter_username_description), style = MaterialTheme.typography.bodyMedium, color = MaterialTheme.colorScheme.onSurfaceVariant, modifier = Modifier @@ -411,18 +400,27 @@ private fun PhoneNumberEntryPrefix( onSelectCountryPrefixClick: () -> Unit ) { Row( + verticalAlignment = Alignment.CenterVertically, modifier = Modifier.padding(end = 16.dp) ) { Row( - modifier = Modifier.clickable(onClick = onSelectCountryPrefixClick, enabled = enabled) + verticalAlignment = Alignment.CenterVertically, + modifier = Modifier + .clip(RoundedCornerShape(1000.dp)) + .clickable(onClick = onSelectCountryPrefixClick, enabled = enabled) ) { Text( - text = selectedCountryPrefix.toString() + text = selectedCountryPrefix.toString(), + modifier = Modifier + .padding(start = 12.dp, top = 6.dp, bottom = 6.dp) ) Icon( painter = painterResource(id = R.drawable.symbol_dropdown_triangle_24), contentDescription = null, - tint = MaterialTheme.colorScheme.onSurfaceVariant + tint = MaterialTheme.colorScheme.onSurfaceVariant, + modifier = Modifier + .size(24.dp) + .padding(end = 1.dp) ) } Dividers.Vertical( @@ -430,26 +428,12 @@ private fun PhoneNumberEntryPrefix( color = MaterialTheme.colorScheme.outline, modifier = Modifier .padding(vertical = 2.dp) - .padding(start = 8.dp) + .padding(start = 7.dp) .height(20.dp) ) } } -@Preview -@Composable -private fun SelectCountryScreenPreview() { - Previews.Preview { - SelectCountryScreen( - paddingValues = PaddingValues(0.dp), - searchEntry = "", - onSearchEntryChanged = {}, - supportedCountryPrefixes = FindByState(mode = FindByMode.PHONE_NUMBER).supportedCountryPrefixes, - onCountryPrefixSelected = {} - ) - } -} - @Composable private fun SelectCountryScreen( paddingValues: PaddingValues, @@ -556,3 +540,54 @@ private fun CountryPrefixRowItem( ) } } + +@Preview(name = "Light Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ContentPreviewPhoneNumber() { + Previews.Preview { + Content( + paddingValues = PaddingValues(0.dp), + state = FindByState( + mode = FindByMode.PHONE_NUMBER, + userEntry = "" + ), + onUserEntryChanged = {}, + onNextClick = {}, + onSelectCountryPrefixClick = {} + ) + } +} + +@Preview(name = "Light Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "content", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun ContentPreviewUsername() { + Previews.Preview { + Content( + paddingValues = PaddingValues(0.dp), + state = FindByState( + mode = FindByMode.USERNAME, + userEntry = "" + ), + onUserEntryChanged = {}, + onNextClick = {}, + onSelectCountryPrefixClick = {} + ) + } +} + +@Preview(name = "Light Theme", group = "select country", uiMode = Configuration.UI_MODE_NIGHT_NO) +@Preview(name = "Dark Theme", group = "select country", uiMode = Configuration.UI_MODE_NIGHT_YES) +@Composable +private fun SelectCountryScreenPreview() { + Previews.Preview { + SelectCountryScreen( + paddingValues = PaddingValues(0.dp), + searchEntry = "", + onSearchEntryChanged = {}, + supportedCountryPrefixes = FindByState(mode = FindByMode.PHONE_NUMBER).supportedCountryPrefixes, + onCountryPrefixSelected = {} + ) + } +} diff --git a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt index 8ed177d703..8637b1910b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/recipients/ui/findby/FindByViewModel.kt @@ -20,6 +20,7 @@ import org.thoughtcrime.securesms.profiles.manage.UsernameRepository import org.thoughtcrime.securesms.recipients.Recipient import org.thoughtcrime.securesms.registration.util.CountryPrefix import org.thoughtcrime.securesms.util.UsernameUtil +import org.whispersystems.signalservice.api.util.PhoneNumberFormatter import java.util.concurrent.TimeUnit class FindByViewModel( @@ -104,12 +105,20 @@ class FindByViewModel( ContactDiscovery.refresh(context, recipient, false, TimeUnit.SECONDS.toMillis(10)) val resolved = Recipient.resolved(recipient.id) if (!resolved.isRegistered) { - FindByResult.NotFound(recipient.id) + if (PhoneNumberFormatter.isValidNumber(nationalNumber, countryCode.toString())) { + FindByResult.NotFound(recipient.id) + } else { + FindByResult.InvalidEntry + } } else { FindByResult.Success(recipient.id) } } catch (e: Exception) { - FindByResult.NotFound(recipient.id) + if (PhoneNumberFormatter.isValidNumber(nationalNumber, countryCode.toString())) { + FindByResult.NotFound(recipient.id) + } else { + FindByResult.InvalidEntry + } } } else { FindByResult.Success(recipient.id) diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/LinkDeviceRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/LinkDeviceRepository.kt index 3be4d77ded..ab64d69f94 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/LinkDeviceRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/LinkDeviceRepository.kt @@ -8,6 +8,7 @@ import org.signal.core.util.logging.Log import org.signal.libsignal.protocol.IdentityKeyPair import org.thoughtcrime.securesms.AppCapabilities import org.thoughtcrime.securesms.crypto.IdentityKeyUtil +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.push.AccountManagerFactory import org.thoughtcrime.securesms.registration.secondary.DeviceNameCipher @@ -75,9 +76,10 @@ class LinkDeviceRepository(private val context: Application) { val unidentifiedAccessKey: ByteArray = UnidentifiedAccess.deriveAccessKeyFrom(registrationData.profileKey) val registrationLock: String? = ret.masterKey?.deriveRegistrationLock() - val encryptedDeviceName = deviceName?.let { DeviceNameCipher.encryptDeviceName(it.toByteArray(), ret.aciIdentity) } + val notDiscoverable = SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode == PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE + val accountAttributes = AccountAttributes( signalingKey = null, registrationId = registrationData.registrationId, @@ -86,7 +88,7 @@ class LinkDeviceRepository(private val context: Application) { unidentifiedAccessKey = unidentifiedAccessKey, unrestrictedUnidentifiedAccess = universalUnidentifiedAccess, capabilities = AppCapabilities.getCapabilities(true), - discoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode.isDiscoverable, + discoverableByPhoneNumber = !notDiscoverable, name = encryptedDeviceName?.let { Base64.encodeWithPadding(it) }, pniRegistrationId = registrationData.pniRegistrationId, recoveryPassword = registrationData.recoveryPassword diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationUtil.java b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationUtil.java index 8f84d64781..512e00339e 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationUtil.java +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/RegistrationUtil.java @@ -3,7 +3,10 @@ import org.signal.core.util.logging.Log; import org.thoughtcrime.securesms.dependencies.ApplicationDependencies; import org.thoughtcrime.securesms.jobs.DirectoryRefreshJob; +import org.thoughtcrime.securesms.jobs.RefreshAttributesJob; import org.thoughtcrime.securesms.jobs.StorageSyncJob; +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues; +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.recipients.Recipient; @@ -26,9 +29,17 @@ public static void maybeMarkRegistrationComplete() { { Log.i(TAG, "Marking registration completed.", new Throwable()); SignalStore.registrationValues().setRegistrationComplete(); - ApplicationDependencies.getJobManager().startChain(new StorageSyncJob()) + + if (SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode() == PhoneNumberDiscoverabilityMode.UNDECIDED) { + Log.w(TAG, "Phone number discoverability mode is still UNDECIDED. Setting to DISCOVERABLE."); + SignalStore.phoneNumberPrivacy().setPhoneNumberDiscoverabilityMode(PhoneNumberDiscoverabilityMode.DISCOVERABLE); + } + + ApplicationDependencies.getJobManager().startChain(new RefreshAttributesJob()) + .then(new StorageSyncJob()) .then(new DirectoryRefreshJob(false)) .enqueue(); + } else if (!SignalStore.registrationValues().isRegistrationComplete()) { Log.i(TAG, "Registration is not yet complete.", new Throwable()); } diff --git a/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyAccountRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyAccountRepository.kt index d96d5bf204..16e4cb8302 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyAccountRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/registration/VerifyAccountRepository.kt @@ -9,6 +9,7 @@ import org.signal.core.util.logging.Log import org.signal.libsignal.protocol.IdentityKeyPair import org.thoughtcrime.securesms.AppCapabilities import org.thoughtcrime.securesms.gcm.FcmUtil +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode import org.thoughtcrime.securesms.keyvalue.SignalStore import org.thoughtcrime.securesms.pin.SvrWrongPinException import org.thoughtcrime.securesms.push.AccountManagerFactory @@ -179,7 +180,7 @@ class VerifyAccountRepository(private val context: Application) { unidentifiedAccessKey = unidentifiedAccessKey, unrestrictedUnidentifiedAccess = universalUnidentifiedAccess, capabilities = AppCapabilities.getCapabilities(true), - discoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode.isDiscoverable, + discoverableByPhoneNumber = SignalStore.phoneNumberPrivacy().phoneNumberDiscoverabilityMode == PhoneNumberDiscoverabilityMode.DISCOVERABLE, name = null, pniRegistrationId = registrationData.pniRegistrationId, recoveryPassword = registrationData.recoveryPassword diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java b/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java index dd380187b0..d876af4f00 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/AccountRecordProcessor.java @@ -116,7 +116,7 @@ boolean isInvalid(@NonNull SignalAccountRecord remote) { boolean preferContactAvatars = remote.isPreferContactAvatars(); int universalExpireTimer = remote.getUniversalExpireTimer(); boolean primarySendsSms = SignalStore.account().isPrimaryDevice() ? local.isPrimarySendsSms() : remote.isPrimarySendsSms(); - String e164 = SignalStore.account().isPrimaryDevice() && !self.getPnpCapability().isSupported() ? local.getE164() : remote.getE164(); + String e164 = SignalStore.account().isPrimaryDevice() ? local.getE164() : remote.getE164(); List defaultReactions = remote.getDefaultReactions().size() > 0 ? remote.getDefaultReactions() : local.getDefaultReactions(); boolean displayBadgesOnProfile = remote.isDisplayBadgesOnProfile(); boolean subscriptionManuallyCancelled = remote.isSubscriptionManuallyCancelled(); @@ -125,10 +125,11 @@ boolean isInvalid(@NonNull SignalAccountRecord remote) { boolean hasViewedOnboardingStory = remote.hasViewedOnboardingStory() || local.hasViewedOnboardingStory(); boolean storiesDisabled = remote.isStoriesDisabled(); boolean hasSeenGroupStoryEducation = remote.hasSeenGroupStoryEducationSheet() || local.hasSeenGroupStoryEducationSheet(); + boolean hasSeenUsernameOnboarding = remote.hasCompletedUsernameOnboarding() || local.hasCompletedUsernameOnboarding(); String username = remote.getUsername(); AccountRecord.UsernameLink usernameLink = remote.getUsernameLink(); - boolean matchesRemote = doParamsMatch(remote, unknownFields, givenName, familyName, avatarUrlPath, profileKey, noteToSelfArchived, noteToSelfForcedUnread, readReceipts, typingIndicators, sealedSenderIndicators, linkPreviews, phoneNumberSharingMode, unlisted, pinnedConversations, preferContactAvatars, payments, universalExpireTimer, primarySendsSms, e164, defaultReactions, subscriber, displayBadgesOnProfile, subscriptionManuallyCancelled, keepMutedChatsArchived, hasSetMyStoriesPrivacy, hasViewedOnboardingStory, storiesDisabled, storyViewReceiptsState, username, usernameLink); - boolean matchesLocal = doParamsMatch(local, unknownFields, givenName, familyName, avatarUrlPath, profileKey, noteToSelfArchived, noteToSelfForcedUnread, readReceipts, typingIndicators, sealedSenderIndicators, linkPreviews, phoneNumberSharingMode, unlisted, pinnedConversations, preferContactAvatars, payments, universalExpireTimer, primarySendsSms, e164, defaultReactions, subscriber, displayBadgesOnProfile, subscriptionManuallyCancelled, keepMutedChatsArchived, hasSetMyStoriesPrivacy, hasViewedOnboardingStory, storiesDisabled, storyViewReceiptsState, username, usernameLink); + boolean matchesRemote = doParamsMatch(remote, unknownFields, givenName, familyName, avatarUrlPath, profileKey, noteToSelfArchived, noteToSelfForcedUnread, readReceipts, typingIndicators, sealedSenderIndicators, linkPreviews, phoneNumberSharingMode, unlisted, pinnedConversations, preferContactAvatars, payments, universalExpireTimer, primarySendsSms, e164, defaultReactions, subscriber, displayBadgesOnProfile, subscriptionManuallyCancelled, keepMutedChatsArchived, hasSetMyStoriesPrivacy, hasViewedOnboardingStory, hasSeenUsernameOnboarding, storiesDisabled, storyViewReceiptsState, username, usernameLink); + boolean matchesLocal = doParamsMatch(local, unknownFields, givenName, familyName, avatarUrlPath, profileKey, noteToSelfArchived, noteToSelfForcedUnread, readReceipts, typingIndicators, sealedSenderIndicators, linkPreviews, phoneNumberSharingMode, unlisted, pinnedConversations, preferContactAvatars, payments, universalExpireTimer, primarySendsSms, e164, defaultReactions, subscriber, displayBadgesOnProfile, subscriptionManuallyCancelled, keepMutedChatsArchived, hasSetMyStoriesPrivacy, hasViewedOnboardingStory, hasSeenUsernameOnboarding, storiesDisabled, storyViewReceiptsState, username, usernameLink); if (matchesRemote) { return remote; @@ -163,6 +164,7 @@ boolean isInvalid(@NonNull SignalAccountRecord remote) { .setHasViewedOnboardingStory(hasViewedOnboardingStory) .setStoriesDisabled(storiesDisabled) .setHasSeenGroupStoryEducationSheet(hasSeenGroupStoryEducation) + .setHasCompletedUsernameOnboarding(hasSeenUsernameOnboarding) .setUsername(username) .setUsernameLink(usernameLink); @@ -216,6 +218,7 @@ private static boolean doParamsMatch(@NonNull SignalAccountRecord contact, boolean keepMutedChatsArchived, boolean hasSetMyStoriesPrivacy, boolean hasViewedOnboardingStory, + boolean hasCompletedUsernameOnboarding, boolean storiesDisabled, @NonNull OptionalBool storyViewReceiptsState, @Nullable String username, @@ -247,6 +250,7 @@ private static boolean doParamsMatch(@NonNull SignalAccountRecord contact, contact.isKeepMutedChatsArchived() == keepMutedChatsArchived && contact.hasSetMyStoriesPrivacy() == hasSetMyStoriesPrivacy && contact.hasViewedOnboardingStory() == hasViewedOnboardingStory && + contact.hasCompletedUsernameOnboarding() == hasCompletedUsernameOnboarding && contact.isStoriesDisabled() == storiesDisabled && contact.getStoryViewReceiptsState().equals(storyViewReceiptsState) && Objects.equals(contact.getUsername(), username) && diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java index 5767d7f1e4..c00e10ee7b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncHelper.java @@ -19,6 +19,7 @@ import org.thoughtcrime.securesms.jobs.StorageSyncJob; import org.thoughtcrime.securesms.keyvalue.AccountValues; import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues; +import org.thoughtcrime.securesms.keyvalue.PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode; import org.thoughtcrime.securesms.keyvalue.SignalStore; import org.thoughtcrime.securesms.payments.Entropy; import org.thoughtcrime.securesms.recipients.Recipient; @@ -147,7 +148,7 @@ record = recipientTable.getRecordForSync(self.getId()); .setReadReceiptsEnabled(TextSecurePreferences.isReadReceiptsEnabled(context)) .setSealedSenderIndicatorsEnabled(TextSecurePreferences.isShowUnidentifiedDeliveryIndicatorsEnabled(context)) .setLinkPreviewsEnabled(SignalStore.settings().isLinkPreviewsEnabled()) - .setUnlistedPhoneNumber(SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode().isUndiscoverable()) + .setUnlistedPhoneNumber(SignalStore.phoneNumberPrivacy().getPhoneNumberDiscoverabilityMode() == PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE) .setPhoneNumberSharingMode(StorageSyncModels.localToRemotePhoneNumberSharingMode(SignalStore.phoneNumberPrivacy().getPhoneNumberSharingMode())) .setPinnedConversations(StorageSyncModels.localToRemotePinnedConversations(pinned)) .setPreferContactAvatars(SignalStore.settings().isPreferSystemContactPhotos()) @@ -164,11 +165,8 @@ record = recipientTable.getRecordForSync(self.getId()); .setStoriesDisabled(SignalStore.storyValues().isFeatureDisabled()) .setStoryViewReceiptsState(storyViewReceiptsState) .setHasSeenGroupStoryEducationSheet(SignalStore.storyValues().getUserHasSeenGroupStoryEducationSheet()) - .setUsername(SignalStore.account().getUsername()); - - if (!self.getPnpCapability().isSupported()) { - account.setE164(self.requireE164()); - } + .setUsername(SignalStore.account().getUsername()) + .setHasCompletedUsernameOnboarding(SignalStore.uiHints().hasCompletedUsernameOnboarding()); UsernameLinkComponents linkComponents = SignalStore.account().getUsernameLink(); if (linkComponents != null) { @@ -196,7 +194,7 @@ public static void applyAccountStorageSyncUpdates(@NonNull Context context, @Non TextSecurePreferences.setTypingIndicatorsEnabled(context, update.getNew().isTypingIndicatorsEnabled()); TextSecurePreferences.setShowUnidentifiedDeliveryIndicatorsEnabled(context, update.getNew().isSealedSenderIndicatorsEnabled()); SignalStore.settings().setLinkPreviewsEnabled(update.getNew().isLinkPreviewsEnabled()); - SignalStore.phoneNumberPrivacy().setPhoneNumberDiscoverabilityMode(update.getNew().isPhoneNumberUnlisted() ? PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE : PhoneNumberPrivacyValues.PhoneNumberDiscoverabilityMode.DISCOVERABLE); + SignalStore.phoneNumberPrivacy().setPhoneNumberDiscoverabilityMode(update.getNew().isPhoneNumberUnlisted() ? PhoneNumberDiscoverabilityMode.NOT_DISCOVERABLE : PhoneNumberDiscoverabilityMode.DISCOVERABLE); SignalStore.phoneNumberPrivacy().setPhoneNumberSharingMode(StorageSyncModels.remoteToLocalPhoneNumberSharingMode(update.getNew().getPhoneNumberSharingMode())); SignalStore.settings().setPreferSystemContactPhotos(update.getNew().isPreferContactAvatars()); SignalStore.paymentsValues().setEnabledAndEntropy(update.getNew().getPayments().isEnabled(), Entropy.fromBytes(update.getNew().getPayments().getEntropy().orElse(null))); @@ -208,6 +206,7 @@ public static void applyAccountStorageSyncUpdates(@NonNull Context context, @Non SignalStore.storyValues().setUserHasViewedOnboardingStory(update.getNew().hasViewedOnboardingStory()); SignalStore.storyValues().setFeatureDisabled(update.getNew().isStoriesDisabled()); SignalStore.storyValues().setUserHasSeenGroupStoryEducationSheet(update.getNew().hasSeenGroupStoryEducationSheet()); + SignalStore.uiHints().setHasCompletedUsernameOnboarding(update.getNew().hasCompletedUsernameOnboarding()); if (update.getNew().getStoryViewReceiptsState() == OptionalBool.UNSET) { SignalStore.storyValues().setViewedReceiptsEnabled(update.getNew().isReadReceiptsEnabled()); diff --git a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java index 92377e79d2..f5a4c2b793 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java +++ b/app/src/main/java/org/thoughtcrime/securesms/storage/StorageSyncModels.java @@ -65,9 +65,8 @@ private StorageSyncModels() {} } public static AccountRecord.PhoneNumberSharingMode localToRemotePhoneNumberSharingMode(PhoneNumberPrivacyValues.PhoneNumberSharingMode phoneNumberPhoneNumberSharingMode) { - // TODO [pnp] When we launch usernames, we want DEFAULT to map to NOBODY. In fact, we can just pass a boolean into this function instead of an enum. switch (phoneNumberPhoneNumberSharingMode) { - case DEFAULT : return AccountRecord.PhoneNumberSharingMode.UNKNOWN; + case DEFAULT : return AccountRecord.PhoneNumberSharingMode.NOBODY; case EVERYBODY: return AccountRecord.PhoneNumberSharingMode.EVERYBODY; case NOBODY : return AccountRecord.PhoneNumberSharingMode.NOBODY; default : throw new AssertionError(); diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt index c2080918e5..efaa23fe02 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/page/StoryViewerPageFragment.kt @@ -933,8 +933,7 @@ class StoryViewerPageFragment : private fun onSenderClicked(senderId: RecipientId) { viewModel.setIsDisplayingRecipientBottomSheet(true) RecipientBottomSheetDialogFragment - .create(senderId, null) - .show(childFragmentManager, "BOTTOM") + .show(childFragmentManager, senderId, null) } private fun presentBottomBar(post: StoryPost, replyState: StoryViewerPageState.ReplyState, isReceiptsEnabled: Boolean) { diff --git a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt index dd1401044a..38e5948da6 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/stories/viewer/reply/group/StoryGroupReplyFragment.kt @@ -271,8 +271,7 @@ class StoryGroupReplyFragment : onCopyClick = { s -> onCopyClick(s) }, onMentionClick = { recipientId -> RecipientBottomSheetDialogFragment - .create(recipientId, null) - .show(childFragmentManager, null) + .show(childFragmentManager, recipientId, null) }, onDeleteClick = { m -> onDeleteClick(m) }, onTapForDetailsClick = { m -> onTapForDetailsClick(m) } diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java index 6788d8b02e..0e9ad59379 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java +++ b/app/src/main/java/org/thoughtcrime/securesms/util/FeatureFlags.java @@ -83,7 +83,6 @@ public final class FeatureFlags { private static final String SOFTWARE_AEC_BLOCKLIST_MODELS = "android.calling.softwareAecBlockList"; private static final String USE_HARDWARE_AEC_IF_OLD = "android.calling.useHardwareAecIfOlderThanApi29"; private static final String PAYMENTS_COUNTRY_BLOCKLIST = "global.payments.disabledRegions"; - public static final String PHONE_NUMBER_PRIVACY = "android.pnp"; private static final String STORIES_AUTO_DOWNLOAD_MAXIMUM = "android.stories.autoDownloadMaximum"; private static final String TELECOM_MANUFACTURER_ALLOWLIST = "android.calling.telecomAllowList"; private static final String TELECOM_MODEL_BLOCKLIST = "android.calling.telecomModelBlockList"; @@ -107,7 +106,6 @@ public final class FeatureFlags { public static final String PROMPT_FOR_NOTIFICATION_LOGS = "android.logs.promptNotifications"; private static final String PROMPT_FOR_NOTIFICATION_CONFIG = "android.logs.promptNotificationsConfig"; public static final String PROMPT_BATTERY_SAVER = "android.promptBatterySaver"; - public static final String USERNAMES = "android.usernames"; public static final String INSTANT_VIDEO_PLAYBACK = "android.instantVideoPlayback.1"; public static final String CRASH_PROMPT_CONFIG = "android.crashPromptConfig"; private static final String SEPA_DEBIT_DONATIONS = "android.sepa.debit.donations.5"; @@ -180,7 +178,6 @@ public final class FeatureFlags { PROMPT_FOR_NOTIFICATION_LOGS, PROMPT_FOR_NOTIFICATION_CONFIG, PROMPT_BATTERY_SAVER, - USERNAMES, INSTANT_VIDEO_PLAYBACK, CRASH_PROMPT_CONFIG, SEPA_DEBIT_DONATIONS, @@ -190,7 +187,6 @@ public final class FeatureFlags { CALLING_REACTIONS, NOTIFICATION_THUMBNAIL_BLOCKLIST, CALLING_RAISE_HAND, - PHONE_NUMBER_PRIVACY, USE_ACTIVE_CALL_MANAGER, GIF_SEARCH, AUDIO_REMUXING, @@ -259,12 +255,10 @@ public final class FeatureFlags { PROMPT_FOR_NOTIFICATION_LOGS, PROMPT_FOR_NOTIFICATION_CONFIG, PROMPT_BATTERY_SAVER, - USERNAMES, CRASH_PROMPT_CONFIG, CALLING_REACTIONS, NOTIFICATION_THUMBNAIL_BLOCKLIST, CALLING_RAISE_HAND, - PHONE_NUMBER_PRIVACY, VIDEO_RECORD_1X_ZOOM ); @@ -344,11 +338,6 @@ public static synchronized void update(@NonNull Map config) { Log.i(TAG, "[Disk] After : " + result.getDisk().toString()); } - /** Creating usernames, sending messages by username. */ - public static synchronized boolean usernames() { - return getBoolean(USERNAMES, false) || phoneNumberPrivacy(); - } - /** * Maximum number of members allowed in a group. */ @@ -381,14 +370,6 @@ public static String clientExpiration() { return getString(CLIENT_EXPIRATION, null); } - /** - * Whether phone number privacy is enabled. - * IMPORTANT: This is under active development. Enabling this *will* break your contacts in terrible, irreversible ways. - */ - public static boolean phoneNumberPrivacy() { - return getBoolean(PHONE_NUMBER_PRIVACY, false); - } - /** Whether to use the custom streaming muxer or built in android muxer. */ public static boolean useStreamingVideoMuxer() { return getBoolean(CUSTOM_VIDEO_MUXER, false); @@ -567,15 +548,6 @@ public static long maxAttachmentSizeBytes() { return getLong(MAX_ATTACHMENT_SIZE_BYTES, ByteUnit.MEGABYTES.toBytes(100)); } - /** True if you should use CDS in compat mode (i.e. request ACI's even if you don't know the access key), otherwise false. */ - public static boolean cdsCompatMode() { - if (phoneNumberPrivacy()) { - return false; - } else { - return !getBoolean(CDS_DISABLE_COMPAT_MODE, false); - } - } - /** * Allow the video players to read from the temporary download files for attachments. * @return whether this functionality is enabled. diff --git a/app/src/main/java/org/thoughtcrime/securesms/util/UsernameUtil.kt b/app/src/main/java/org/thoughtcrime/securesms/util/UsernameUtil.kt index c391e5bca0..5ac6dc053b 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/util/UsernameUtil.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/util/UsernameUtil.kt @@ -9,7 +9,7 @@ object UsernameUtil { const val MIN_NICKNAME_LENGTH = 3 const val MAX_NICKNAME_LENGTH = 32 const val MIN_DISCRIMINATOR_LENGTH = 2 - const val MAX_DISCRIMINATOR_LENGTH = 10 + const val MAX_DISCRIMINATOR_LENGTH = 9 private val FULL_PATTERN = Pattern.compile(String.format(Locale.US, "^[a-zA-Z_][a-zA-Z0-9_]{%d,%d}$", MIN_NICKNAME_LENGTH - 1, MAX_NICKNAME_LENGTH - 1), Pattern.CASE_INSENSITIVE) private val DIGIT_START_PATTERN = Pattern.compile("^[0-9].*$") private const val BASE_URL_SCHEMELESS = "signal.me/#eu/" diff --git a/app/src/main/res/drawable-night/usernames_48_color.xml b/app/src/main/res/drawable-night/usernames_48_color.xml index 70175a9921..9ce90516ec 100644 --- a/app/src/main/res/drawable-night/usernames_48_color.xml +++ b/app/src/main/res/drawable-night/usernames_48_color.xml @@ -4,7 +4,7 @@ android:viewportWidth="48" android:viewportHeight="48"> + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/check.xml b/app/src/main/res/drawable/check.xml new file mode 100644 index 0000000000..1b7224f16e --- /dev/null +++ b/app/src/main/res/drawable/check.xml @@ -0,0 +1,14 @@ + + + + + \ No newline at end of file diff --git a/app/src/main/res/drawable/ic_new_group_circle.xml b/app/src/main/res/drawable/ic_new_group_circle.xml deleted file mode 100644 index fde3317a5b..0000000000 --- a/app/src/main/res/drawable/ic_new_group_circle.xml +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - - - - diff --git a/app/src/main/res/drawable/symbol_group_24.xml b/app/src/main/res/drawable/symbol_group_24.xml index 9418b74976..5e4419695c 100644 --- a/app/src/main/res/drawable/symbol_group_24.xml +++ b/app/src/main/res/drawable/symbol_group_24.xml @@ -3,15 +3,16 @@ android:height="24dp" android:viewportWidth="24" android:viewportHeight="24"> - - - + + + + diff --git a/app/src/main/res/drawable/usernames_megaphone.xml b/app/src/main/res/drawable/usernames_megaphone.xml index 0346c9df92..7dc0c7238b 100644 --- a/app/src/main/res/drawable/usernames_megaphone.xml +++ b/app/src/main/res/drawable/usernames_megaphone.xml @@ -4,10 +4,10 @@ android:viewportWidth="56" android:viewportHeight="56"> + app:tint="@color/signal_colorOnSecondaryContainer" /> + app:tint="@color/signal_colorOnSecondaryContainer" /> - + app:layout_constraintTop_toTopOf="parent" + app:shapeAppearanceOverlay="@style/ShapeAppearanceOverlay.Signal.Circle" + app:tint="@color/signal_colorOnSecondaryContainer" /> + android:layout_height="wrap_content"> - + + + app:layout_constraintTop_toBottomOf="@id/handle" /> + tools:text="🕷🕷🕷 Hangin' on the web 🕷🕷🕷" /> - diff --git a/app/src/main/res/layout/username_edit_fragment.xml b/app/src/main/res/layout/username_edit_fragment.xml index cb179684ec..737a043bda 100644 --- a/app/src/main/res/layout/username_edit_fragment.xml +++ b/app/src/main/res/layout/username_edit_fragment.xml @@ -40,8 +40,9 @@ android:layout_width="0dp" android:layout_height="0dp" android:background="@drawable/username_edit_box_fill" + android:layout_marginEnd="@dimen/dsl_settings_gutter" app:layout_constraintBottom_toBottomOf="@id/username_text_wrapper" - app:layout_constraintEnd_toEndOf="@id/discriminator_text" + app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="@id/username_text_wrapper" app:layout_constraintTop_toTopOf="@id/username_text_wrapper" /> @@ -86,19 +87,18 @@ style="@style/Signal.Text.BodyLarge" android:layout_width="wrap_content" android:layout_height="wrap_content" - android:layout_marginEnd="@dimen/dsl_settings_gutter" android:background="@null" android:hint="@string/UsernameEditFragment__00" android:imeOptions="actionDone" android:importantForAutofill="no" android:inputType="number" - android:maxLength="19" + android:maxLength="9" android:maxLines="1" android:minHeight="48dp" android:paddingHorizontal="16dp" app:layout_constrainedWidth="true" app:layout_constraintBottom_toBottomOf="@id/username_text_wrapper" - app:layout_constraintEnd_toEndOf="parent" + app:layout_constraintEnd_toEndOf="@id/username_box_fill" tools:text="21" /> + + + + - \ No newline at end of file diff --git a/app/src/main/res/navigation/create_username.xml b/app/src/main/res/navigation/create_username.xml deleted file mode 100644 index 73ad8c0949..0000000000 --- a/app/src/main/res/navigation/create_username.xml +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/app/src/main/res/values-af/strings.xml b/app/src/main/res/values-af/strings.xml index 35c5a8a942..96f16f0dcf 100644 --- a/app/src/main/res/values-af/strings.xml +++ b/app/src/main/res/values-af/strings.xml @@ -494,8 +494,8 @@ Jy kan notas vir jouself in hierdie klets byvoeg. Indien daar enige toestelle aan jou rekening gekoppel is, sal nuwe notas gesinchroniseer word. %1$d groepslede het dieselfde naam. Tik om te hersien - Gaan versoeke noukeurig na - Molly het \'n ander kontak met dieselfde naam gevind. + + This person has the same name as another contact Kontak ons Verifieer Nie nou nie @@ -1064,7 +1064,7 @@ Jou gebruikersnaam, QR-kode en skakel is nie op jou profiel sigbaar nie. Deel net jou gebruikersnaam met mense wat jy vertrou. - + Mense kan nou vir jou \'n boodskap stuur deur jou opsionele gebruikersnaam te gebruik sodat jy nie jou telefoonnommer vir mense hoef te gee nie. Profielnaam Gebruikersnaam Meer oor @@ -1965,9 +1965,9 @@ Signal-kontak - + Geverifiëer - + No direct messages with %1$s %1$s is in jou stelselkontakte @@ -2301,7 +2301,7 @@ Ongeldige gebruikersnaam. Gebruikersname moet tussen %1$d en %2$d karakters lank wees. - Gebruikersname laat toe dat andere vir jou boodskappe kan stuur sonder dat hulle jou telefoonnommer nodig het. Hulle word gekoppel aan \'n stel syfers om jou adres privaat te help hou. + Usernames are always paired with a set of numbers. Wat beteken hierdie syfers? Hierdie syfers help om jou gebruikersnaam privaat te hou sodat jy ongevraagde boodskappe kan voorkom. Deel jou gebruikersnaam slegs met die mense en groepe met wie jy wil klets. As jy gebruikersname verander, sal jy \'n nuwe stel syfers ontvang. @@ -2322,9 +2322,9 @@ As jy jou gebruikersnaam herwin, sal dit jou bestaande QR-kode en skakel terugstel. Is jy seker? - + As jy jou gebruikersnaam verander, sal dit jou bestaande QR-kode en skakel terugstel. Is jy seker? - + Gaan voort %1$d kontak is op Signal! @@ -4124,8 +4124,10 @@ “%1$s” is ontsper. - Hersien lede - Hersien versoek + + Review members + + Review request %1$d groeplede het dieselfde naam, hersien die lede hier onder en kies ’n aksie om te neem. Indien jy onseker is oor die sender van die versoek, kan jy die kontakte hier onder nagaan en aksie neem. Geen ander groepe in gemeen. @@ -6184,13 +6186,13 @@ Vind meer uit - + Nuwe maniere om kontak te maak - + Ons stel bekend telefoonnommerprivaatheid, opsionele gebruikersname en skakels. - + Wys weg - + Vind meer uit @@ -6490,9 +6492,9 @@ \'n Netwerkfout het voorgekom terwyl jy probeer het om jou skakel terug te stel. Probeer later weer. - + An unexpected error occurred while trying to reset your link. Try again later. - + Jou QR-kode en -skakel is teruggestel en \'n nuwe QR-kode en -skakel is geskep. Skandeer hierdie QR-kode met jou foon om met my op Signal te klets. @@ -6563,7 +6565,7 @@ Telefoonnommer - Voer \'n volledige gebruikersnaam met sy paar syfers in. + Enter a username followed by a dot and its set of numbers. Volgende diff --git a/app/src/main/res/values-ar/strings.xml b/app/src/main/res/values-ar/strings.xml index bc8f0fa6e6..bee909d889 100644 --- a/app/src/main/res/values-ar/strings.xml +++ b/app/src/main/res/values-ar/strings.xml @@ -530,8 +530,8 @@ يُمكِنُك إضافة مُلاحظات لنفسك في هذه الدردشة. إذا كان حسابك يحتوي على أي أجهزة مُرتبطة، ستتم مُزامنة المُلاحظات. %1$d عضوا بالمجموعة لهم نفس اﻻسم. يُرجى اللمس للمراجعة - مراجعة الطلبات بعناية - وجد سيجنال جهة اتصال أخرى بنفس الاسم. + + This person has the same name as another contact تواصل معنا تحقق ليس الآن @@ -1204,7 +1204,7 @@ اسم المُستخدم الخاص بك ليس مرئيًا على حسابك الشخصي، وكذلك رمز ورابط الاستجابة السريعة الخاصين بك. شارك اسم المُستخدم الخاص بك فقط مع الناس الذين تثق بهم. - + يُمكن للناس مراسلتك الآن باستخدام اسم المُستخدم الاختياري الخاص بك حتى لا تضطر إلى إعطاء رقم هاتفك. اسم الحساب اسم المُستخدم حول @@ -2261,9 +2261,9 @@ جهة اتصال سيجنال - + متحقق منه - + No direct messages with %1$s %1$s موجود في جهات اتصال حسابك @@ -2621,7 +2621,7 @@ اسم المُستخدم غير صالح اسم المُستخدم لا بد أن يكون بين %1$d و%2$d رمز. - تسمح أسماء المُستخدمين للآخرين بمراسلتك دون الحاجة إلى رقم هاتفك. يتم إقرانها بمجموعة من الأرقام للمساعدة في الحفاظ على خصوصية عنوانك. + Usernames are always paired with a set of numbers. ماذا يعني هذا الرقم؟ تُساعد هذه الأرقام في الحفاظ على خصوصية اسم المُستخدم الخاص بك حتى تتجنب الرسائل غير مرغوب فيها. شارك اسم المُستخدم الخاص بك مع الأشخاص والمجموعات الذين ترغب في الدردشة معهم. إذا قمت بتغيير أسماء المُستخدمين، سَتحصل على مجموعة جديدة من الأرقام. @@ -2642,9 +2642,9 @@ سيُؤدي استرداد اسم المُستخدم الخاص بك إلى إعادة تعيين رمز ورابط الاستجابة السريعة الخاصين بك. هل أنت مُتأكد؟ - + سيُؤدي تغيير اسم المُستخدم الخاص بك إلى إعادة تعيين رمز الاستجابة السريع والرابط الحاليين الخاصين بك. هل أنت متأكد؟ - + مواصلة %1$d جهة اتصال تستخدم سيجنال!‏ @@ -4548,8 +4548,10 @@ تم إلغاء حظر \"%1$s\". - مراجعة الأعضاء - طلب المراجعة + + Review members + + Review request %1$d من أعضاء المجموعة يحملون نفس الاسم، يُرجى مراجعة اﻷعضاء أسفله ثم القيام باﻹجراء المناسب. إذا التبس عليك مصدر الطلب، يُرجى مراجعة جهات الاتصال أدناه والقيام بالإجراء المناسب. لا وجود لمجموعات أخرى مشتركة. @@ -6736,13 +6738,13 @@ معرفة المزيد - + طرق جديدة للاتصال - + نُقدم لكم خصوصية رقم الهاتف وأسماء المستخدمين الاختيارية والروابط. - + تجاهُل - + معرفة المزيد @@ -7054,9 +7056,9 @@ لقد حدث خطأ في الشبكة أثناء محاولة إعادة تعيين رابطك. يُرجى المحاولة مرة أخرى لاحقًا. - + An unexpected error occurred while trying to reset your link. Try again later. - + تمت إعادة تعيين رمز ورابط الاستجابة السريعة وتم إنشاء رمز ورابط الاستجابة السريعة جديدين. امسح رمز الاستجابة السريعة هذا باستخدام هاتفك للدردشة معي على سيجنال. @@ -7135,7 +7137,7 @@ رقم الهاتف - أدخل اسم مُستخدم كامل مع زوج الأرقام الخاص به. + Enter a username followed by a dot and its set of numbers. التالي diff --git a/app/src/main/res/values-az/strings.xml b/app/src/main/res/values-az/strings.xml index 035f9899fc..67d70860e8 100644 --- a/app/src/main/res/values-az/strings.xml +++ b/app/src/main/res/values-az/strings.xml @@ -494,8 +494,8 @@ Bu çatda özünüzə qeydlər yaza bilərsiniz. Hesabınızla əlaqələndirilmiş cihazlar varsa, yeni qeydlər sinxronlaşdırılacaq. %1$d qrup üzvünün adı eynidir. Nəzərdən keçirmək üçün toxunun - Tələbləri diqqətlə nəzərdən keçirin - Molly, eyni adda başqa bir əlaqə tapdı. + + This person has the same name as another contact Bizimlə əlaqə Təsdiqlə İndi yox @@ -1064,7 +1064,7 @@ İstifadəçi adınız, QR kodu və keçidiniz profilinizdə görünmür. İstifadəçi adınızı yalnız inandığınız insanlarla paylaşın. - + Artıq telefon nömrənizi onlarla paylşamasanız da, insanlar əlavə istifadəçi adınızdan istifadə edərək sizə mesaj göndərə bilər. Profil adı İstifadəçi adı Haqqında @@ -1965,9 +1965,9 @@ Signal bağlantısı - + Təsdiqləndi - + No direct messages with %1$s %1$s sistem kontaktlarınız arasındadır @@ -2301,7 +2301,7 @@ İstifadəçi adı etibarsızdır. İstifadəçi adları %1$d ilə %2$d simvol aralığında olmalıdır. - İstifadəçi adları telefon nömrəniz olmadan digərlərinin sizə mesaj göndərməsinə imkan verir. Onlar ünvanınızın məxfiliyini qorumanıza kömək etmək üçün rəqəmlər toplusu ilə əlaqələndirilir. + Usernames are always paired with a set of numbers. Bu nömrə nə üçündür? Bu rəqəmlər istifadəçi adınızın məxfiliyini qorumağa kömək etdiyi üçün, arzuolunmaz mesajlara məruz qalmırsınız. İstifadəçi adınızı yalnız söhbət etmək istədiyiniz insan və qruplarla paylaşın. İstifadəçi adlarını dəyişdirsəniz, yeni rəqəmlər toplusu alacaqsınız. @@ -2322,9 +2322,9 @@ İstifadəçi adınızın bərpası mövcud QR kodunuzu və keçidi sıfırlayacaq. Əminsiniz? - + İstifadəçi adınızın dəyişdirilməsi mövcud QR kodunuzu və keçidi sıfırlayacaq. Əminsiniz? - + Davam et %1$d əlaqə Signal-dadır! @@ -4124,8 +4124,10 @@ \"%1$s\" blokdan çıxarıldı. - Üzvləri nəzərdən keçir - Tələbi nəzərdən keçir + + Review members + + Review request %1$d qrup üzvü eyni ada sahibdir, aşağıda nəzərdən keçirərək seçim edə bilərsiniz. Tələbin kimdən gəldiyinə əmin deyilsinizsə, aşağıdakı əlaqələri nəzərdən keçirib seçim edin. Başqa ortaq qrup yoxdur. @@ -6184,13 +6186,13 @@ Daha ətraflı - + Qoşulmanın yeni yolları - + Telefon nömrəsi məxfiliyi, əlavə istifadəçi adları və keçidlərin təqdim edilməsi. - + Rədd et - + Daha ətraflı @@ -6490,9 +6492,9 @@ Keçidinizi sıfırlamağa çalışarkən şəbəkə xətası baş verdi. Daha sonra yenidən cəhd edin. - + An unexpected error occurred while trying to reset your link. Try again later. - + QR kodunuz və keçidiniz sıfırlanaraq yeni QR kodu və keçid yaradıldı. Mənimlə Signal-da söhbət etmək üçün telefonunuzla bu QR kodunu skan edin. @@ -6563,7 +6565,7 @@ Telefon nömrəsi - İstifadəçi adını tam şəkildə və rəqəmləri ilə daxil edin. + Enter a username followed by a dot and its set of numbers. Növbəti diff --git a/app/src/main/res/values-bg/strings.xml b/app/src/main/res/values-bg/strings.xml index fdef48d2f0..4509640d2e 100644 --- a/app/src/main/res/values-bg/strings.xml +++ b/app/src/main/res/values-bg/strings.xml @@ -494,8 +494,8 @@ В този чат можете да добавяте бележки за себе си. Ако акаунтът ви има свързани устройства, новите бележки ще бъдат синхронизирани. %1$d члена на групата имат същото име. Натиснете за преглед - Прегледайте внимателно заявката - Molly откри друг контакт със същото име. + + This person has the same name as another contact Свържете се с нас Валидиране Не сега @@ -1064,7 +1064,7 @@ Вашите потребителско име, QR код и линк не се виждат в профила ви. Споделяйте потребителското си име само с хора, на които имате доверие. - + Хората вече могат да ви изпращат съобщения, като използват вашето незадължителнo потребителско име, за да не се налага да давате телефонния си номер. Име на профила Потребителско име Биография @@ -1965,9 +1965,9 @@ Контакт в Signal - + Потвърдено - + No direct messages with %1$s %1$s е в контактите на системата ви @@ -2301,7 +2301,7 @@ Потребителското име е невалидно. Потребителските имена трябва да са между %1$d и %2$d знака. - Потребителските имена позволяват на другите да ви пишат, без да имат нужда от телефонния ви номер. Те са комбинирани със серия числа, за да запазят поверителността на адреса ви. + Usernames are always paired with a set of numbers. Какъв е този номер? Тези цифри ни помагат да запазим поверителността на вашето потребителско име, за да избегнете нежелани съобщения. Споделяйте потребителското си име само с хората и групите, с които искате да чатите. При промяна на потребителски имена, ще получите нова комбинация от цифри. @@ -2322,9 +2322,9 @@ Възстановяването на вашето потребителско име ще нулира съществуващите ви QR код и линк. Сигурни ли сте? - + Промяната на вашето потребителско име ще нулира съществуващия ви QR код и линк. Сигурни ли сте? - + Продължете %1$d контакт е в Signal! @@ -4124,8 +4124,10 @@ Потребителят „%1$s“ беше отблокиран. - Преглед на членовете - Преглед на заявките + + Review members + + Review request %1$d членовете на групата имат същото име, прегледайте членовете по-долу и изберете действия. Ако не сте сигурни от кого е искането, прегледайте контактите по-долу и предприемете действие. Няма други общи групи. @@ -6184,13 +6186,13 @@ Научете повече - + Нови начини за свързване - + Въвеждане на поверителност на телефонния номер, незадължителни потребителски имена и линкове. - + Отказ - + Научете повече @@ -6490,9 +6492,9 @@ Възникна мрежова грешка при опита за нулиране на линка ви. Опитайте пак по-късно. - + An unexpected error occurred while trying to reset your link. Try again later. - + Вашите QR код и линк са нулирани и на тяхно място са генерирани нови. Сканирай този QR код с телефона си, за да си чатим в Signal. @@ -6563,7 +6565,7 @@ Телефонен номер - Въведете цялото потребителско име с неговата двойка цифри. + Enter a username followed by a dot and its set of numbers. Напред diff --git a/app/src/main/res/values-bn/strings.xml b/app/src/main/res/values-bn/strings.xml index 9bd5ad8d69..dbfaa6640b 100644 --- a/app/src/main/res/values-bn/strings.xml +++ b/app/src/main/res/values-bn/strings.xml @@ -494,8 +494,8 @@ আপনি এই চ্যাটটিতে আপনার নিজের জন্য নোট যোগ করতে পারবেন। আপনার অ্যাকাউন্টের সাথে সংযুক্ত কোনো ডিভাইস থাকলে, নতুন নোট সমন্বয় করা হবে। গ্রুপের %1$d জনের একই নাম আছে। পর্যালোচনা করতে চাপুন - তোমার অনুরোধ ভালোভাবে দেখো - Molly একই নামের আরেকটা কন্ট্যাক্ট পাওয়া গেছে। + + This person has the same name as another contact আমাদের সাথে যোগাযোগ করুন যাচাই করুন এখন না @@ -1064,7 +1064,7 @@ আপনার ব্যবহারকারীর নাম, QR কোড এবং লিংক আপনার প্রোফাইলে দৃশ্যমান নয়। শুধুমাত্র আপনি আস্থা রাখতে পারেন এমন ব্যক্তিদের সাথে আপনার ব্যবহারকারীর নাম শেয়ার করুন। - + লোকজন এখন আপনার ঐচ্ছিক ব্যবহারকারীর নাম ব্যবহার করে আপনাকে মেসেজ পাঠাতে পারবেন যাতে আপনাকে আপনার ফোন নম্বর দিতে না হয়। প্রোফাইল নাম ব্যবহারকারীর নাম সম্বন্ধে @@ -1965,9 +1965,9 @@ Signal কানেকশন - + যাচাই করা হয়েছে - + No direct messages with %1$s %1$s আপনার সিস্টেমের কন্টাক্টে আছেন @@ -2301,7 +2301,7 @@ ব্যবহারকারীর নাম অকার্যকর। ব্যবহারকারীর নামগুলো অবশ্যই %1$d এবং %2$d অক্ষরের মধ্যে থাকতে হবে। - ব্যবহারকারীর নাম ব্যবহার করলে আপনার ফোন নম্বর ছাড়াই অন্যরা আপনাকে মেসেজ দিতে পারবেন। আপনার ঠিকানা গোপন রাখতে সাহায্য করার জন্য এগুলো একগুচ্ছ সংখ্যার সাথে যুক্ত করা হয়। + Usernames are always paired with a set of numbers. এই নম্বরটি কী? এই সংখ্যাগুলো আপনার ব্যবহারকারীর নামটি গোপন রাখতে সাহায্য করে, যাতে আপনি অবাঞ্ছিত মেসেজ এড়িয়ে যেতে পারেন৷ আপনি যে ব্যক্তি ও গ্রুপের সাথে চ্যাট করতে চান শুধুমাত্র তাদের সাথে আপনার ব্যবহারকারীর নামটি শেয়ার করুন। ব্যবহারকারীর নামটি পরিবর্তন করলে আপনি নতুন একগুচ্ছ সংখ্যা পাবেন। @@ -2322,9 +2322,9 @@ আপনার ব্যবহারকারীর নাম পুনরুদ্ধার করা হলে আপনার বিদ্যমান QR কোড এবং লিংক রিসেট করা হবে। আপনি কি নিশ্চিত? - + আপনার \'ব্যবহারকারীর নাম\' পরিবর্তন করলে আপনার বিদ্যমান QR কোড ও লিংক রিসেট করা হবে। আপনি কি নিশ্চিত? - + চালিয়ে যান %1$d টি কন্ট্যাক্ট Signal ব্যবহার করছে! @@ -4124,8 +4124,10 @@ \"%1$s\"-কে আনব্লক করা হয়েছে। - সদস্যদের পর্যালোচনা করুন - অনুরোধ পর্যালোচনা + + Review members + + Review request %1$d জন গ্রুপ সদস্যদের একই নাম রয়েছে, নীচের সদস্যদের পর্যালোচনা করুন এবং পদক্ষেপ নিন। আপনি যদি নিশ্চিত না হন কার থেকে অনুরোধ এসেছে, আগে কন্টাক্টটি পরিদর্শন সিদ্ধান্ত নিন একই রকমের আর কোন গ্রুপ নেই @@ -6184,13 +6186,13 @@ আরো জানুন - + সংযোগ করার নতুন উপায় - + ফোন নম্বরের গোপনীয়তা, ঐচ্ছিক ব্যবহারকারীর নাম ও লিংক চালু হচ্ছে। - + বাতিল করুন - + আরো জানুন @@ -6490,9 +6492,9 @@ আপনার লিংক রিসেট চেষ্টা করার সময় নেটওয়ার্কে একটি ত্রুটি ঘটেছে। পরে আবার চেষ্টা করুন। - + An unexpected error occurred while trying to reset your link. Try again later. - + আপনার QR কোড ও লিংক রিসেট করা হয়েছে এবং একটি নতুন QR কোড ও লিংক তৈরি করা হয়েছে। Signal-এ আমার সাথে চ্যাট করতে আপনার ফোন দিয়ে এই QR কোডটি স্ক্যান করুন। @@ -6563,7 +6565,7 @@ ফোন নম্বর - এক জোড়া ডিজিট সহ একটি সম্পূর্ণ ব্যবহারকারীর নাম লিখুন। + Enter a username followed by a dot and its set of numbers. পরবর্তী diff --git a/app/src/main/res/values-bs/strings.xml b/app/src/main/res/values-bs/strings.xml index 9d181af065..10dbac136e 100644 --- a/app/src/main/res/values-bs/strings.xml +++ b/app/src/main/res/values-bs/strings.xml @@ -512,8 +512,8 @@ U ovom chatu možete dodati bilješke za sebe. Ako Signal koristite na više uređaja, ove će bilješke biti sinhronizovane na njima. %1$d člana grupe imaju isto ime. Dotaknite da provjerite - Pažljivo pregledajte zahtjeve - Molly je među kontaktima pronašao još jednu osobu s istim imenom. + + This person has the same name as another contact Kontaktirajte nas Verifikuj Ne sada @@ -1134,7 +1134,7 @@ Vaše korisničko ime, QR kod i poveznica nisu vidljivi na vašem profilu. Svoje korisničko ime dijelite samo s osobama kojima vjerujete. - + Drugi vam sada mogu slati poruke koristeći vaše opcionalno korisničko ime tako da ne morate davati svoj broj telefona. Ime profila Korisničko ime O kontaktu @@ -2113,9 +2113,9 @@ Signal veza - + Potvrđeno - + No direct messages with %1$s %1$s je u vašim sistemskim kontaktima @@ -2461,7 +2461,7 @@ Korisničko ime nije valjano. Korisničko ime mora sadržavati najmanje %1$d, a najviše %2$d znakova. - Korisnička imena omogućavaju drugim da vam pošalju poruku bez broja telefona. Uparena su s kompletom brojeva da bi vaša adresa ostala privatna. + Usernames are always paired with a set of numbers. Kakav je ovo broj? Ti brojevi pomažu održati vaše korisničko ime privatnim da možete izbjeći neželjene poruke. Dijelite korisničko ime samo s osobama i grupama s kojim se želite dopisivati. Ako promijenite korisničko ime, dobit ćete novi komplet brojeva. @@ -2482,9 +2482,9 @@ Oporavak vašeg korisničkog imena će poništiti vaš postojeći QR kod i vezu. Jeste li sigurni? - + Promjena korisničkog imena će resetirati vaš postojeći QR kȏd i poveznicu. Jeste li sigurni? - + Nastavi %1$d kontakt je na Signalu! @@ -4336,8 +4336,10 @@ \"%1$s\" je deblokiran. - Provjeri članove - Provjeri zahtjev + + Review members + + Review request %1$d člana grupe imaju isto ime. Provjerite članove ispod i odlučite kako s njima postupiti. Ako niste sigurni od koga potječe zahtjev, provjerite kontakte ispod i odlučite kako postupiti. Nema drugih zajedničkih grupa. @@ -6460,13 +6462,13 @@ Saznaj više - + Novi načini povezivanja - + Predstavljamo privatnost telefonskih brojeva, opcionalna korisnička imena i poveznice. - + Odbaci - + Saznaj više @@ -6772,9 +6774,9 @@ Došlo je do mrežne greške prilikom pokušaja poništavanja vaše veze. Pokušajte ponovo kasnije. - + An unexpected error occurred while trying to reset your link. Try again later. - + Vaš QR kod i link su poništeni i novi QR kod i link su kreirani. Skenirajte ovaj QR kod telefonom da razgovarate sa mnom na Signalu. @@ -6849,7 +6851,7 @@ Broj telefona - Unesite puno korisničko ime s njegovim parom brojki. + Enter a username followed by a dot and its set of numbers. Dalje diff --git a/app/src/main/res/values-ca/strings.xml b/app/src/main/res/values-ca/strings.xml index 1c2bac19ad..2a9cafee37 100644 --- a/app/src/main/res/values-ca/strings.xml +++ b/app/src/main/res/values-ca/strings.xml @@ -494,8 +494,8 @@ En aquest xat, pots afegir notes per a tu mateix. Si hi ha algun dispositiu enllaçat, s\'hi sincronitzaran les notes noves. %1$d membres del grup tenen el mateix nom. Feu un toc per revisar-ho - Reviseu les sol·licituds amb atenció. - El Molly ha trobat un altre contacte amb el mateix nom. + + This person has the same name as another contact Contacteu-nos Verificació Ara no @@ -1064,7 +1064,7 @@ El teu àlies, codi QR i enllaç no són visibles al teu perfil. Comparteix el teu àlies només amb persones de confiança. - + Ara, la gent et pot enviar missatges fent servir el teu àlies opcional, i no caldrà que donis el teu número de telèfon. Nom del perfil Àlies Quant a @@ -1965,9 +1965,9 @@ Connexió de Signal - + Verificat - + No direct messages with %1$s %1$s és als contactes del teu sistema @@ -2301,7 +2301,7 @@ L\'àlies no és vàlid. Els àlies han de tenir entre %1$d i %2$d caràcters. - Els àlies permeten a altres persones enviar-te un missatge sense necessitat del teu número de telèfon. Funcionen conjuntament amb una sèrie de dígits per ajudar-te a mantenir privada la teva adreça. + Usernames are always paired with a set of numbers. Què és aquest número? Aquests dígits ajudaran a mantenir el teu àlies en privat per tal d\'evitar rebre missatges no desitjats. Comparteix el teu àlies només amb aquelles persones i grups amb les que desitges parlar. Si canvies el teu àlies, rebràs una nova sèrie de dígits. @@ -2322,9 +2322,9 @@ Recuperar el teu àlies restablirà el teu codi QR i enllaç actuals. Segur que vols fer això? - + Canviar el teu àlies restablirà el teu codi QR i enllaç actuals. Segur que vols fer això? - + Continuar %1$d contacte és al Signal! @@ -4124,8 +4124,10 @@ S\'ha desbloquejat a %1$s. - Reviseu els mebres - Reviseu la sol·licitud + + Review members + + Review request %1$d membres del grup tenen el mateix nom. Reviseu els membres que es mostren a continuació. Si no esteu segur de qui prové la sol·licitud, reviseu els contactes que hi ha a continuació. Cap altre grup en comú @@ -6184,13 +6186,13 @@ Més informació - + Noves maneres de connectar-te - + Presentem la privacitat del número de telèfon, els noms d\'usuari opcionals i els enllaços. - + Descarta - + Més informació @@ -6490,9 +6492,9 @@ S\'ha produït un error de xarxa en intentar restablir l\'enllaç. Torna-ho a provar més tard. - + An unexpected error occurred while trying to reset your link. Try again later. - + El teu codi QR i l\'enllaç s\'han restablert, i s\'ha creat un nou codi QR i enllaç. Escaneja aquest codi QR amb el teu telèfon per xatejar amb mi a Signal. @@ -6563,7 +6565,7 @@ Número de telèfon - Introdueix un àlies complet amb el seu parell de dígits. + Enter a username followed by a dot and its set of numbers. Següent diff --git a/app/src/main/res/values-cs/strings.xml b/app/src/main/res/values-cs/strings.xml index 4aadc0ec89..722c5dce60 100644 --- a/app/src/main/res/values-cs/strings.xml +++ b/app/src/main/res/values-cs/strings.xml @@ -512,8 +512,8 @@ V tomto chatu si můžete přidávat poznámky. Pokud má váš účet nějaká propojená zařízení, budou se nové poznámky synchronizovat. %1$d členů skupiny má stejné jméno. Klepněte pro prověření - Požadavky pečlivě prověřte - Molly nalezl jiný kontakt se stejným jménem. + + This person has the same name as another contact Kontaktujte nás Ověřit Teď ne @@ -1134,7 +1134,7 @@ Vaše uživatelské jméno, QR kód a odkaz se na vašem profilu nezobrazují. Své uživatelské jméno sdílejte jen s lidmi, kterým věříte. - + Lidé vám teď mohou posílat zprávy pomocí vašeho volitelného uživatelského jména, takže jim nemusíte sdělovat své telefonní číslo. Jméno profilu Uživatelské jméno O mně @@ -2113,9 +2113,9 @@ Spojení Signal - + Ověřeno - + No direct messages with %1$s %1$s je v kontaktech na vašem zařízení @@ -2461,7 +2461,7 @@ Uživatelské jméno je neplatné. Uživatelská jména musí mít %1$d až %2$d znaků. - Uživatelská jména umožňují ostatním posílat vám zprávy, aniž by k tomu potřebovali vaše telefonní číslo. Jsou spárována s kombinací číslic, které pomáhají udržet vaši adresu v soukromí. + Usernames are always paired with a set of numbers. O jakou sadu číslic se jedná? Tyto číslice pomáhají udržet vaše uživatelské jméno v soukromí, abyste se vyhnuli nechtěným zprávám. Uživatelské jméno sdílejte pouze s lidmi a skupinami, se kterými chcete chatovat. Pokud uživatelské jméno změníte, dostanete novou sadu číslic. @@ -2482,9 +2482,9 @@ Obnovením uživatelského jména resetujete svůj stávající QR kód a odkaz. Jste si jisti? - + Změnou uživatelského jména zresetuje váš současný QR kód a odkaz. Jste si jisti? - + Pokračovat %1$d kontakt má Signal! @@ -4336,8 +4336,10 @@ Uživatel „%1$s“ byl odblokován. - Prověřit členy - Prověřit požadavek + + Review members + + Review request %1$d členů skupiny má stejné jméno, prověřte níže uvedené členy a zvolte akci. Pokud si nejste jistí, od koho je požadavek, tak prověřte kontakty a proveďte akci. Žádné další společné skupiny. @@ -6460,13 +6462,13 @@ Více informací - + Nové způsoby, jak se propojit - + Zavádíme soukromá telefonní čísla, volitelná uživatelská jména a odkazy. - + Zavřít - + Více informací @@ -6772,9 +6774,9 @@ Při pokusu o resetování vašeho odkazu došlo k chybě sítě. Zkuste to znovu později. - + An unexpected error occurred while trying to reset your link. Try again later. - + Váš QR kód a odkaz byly resetovány a byl vytvořen nový QR kód a odkaz. Naskenuj tento QR kód svým telefonem a chatuj se mnou přes Signal. @@ -6849,7 +6851,7 @@ Telefonní číslo - Zadejte celé uživatelské jméno s příslušnou dvojicí číslic. + Enter a username followed by a dot and its set of numbers. Další diff --git a/app/src/main/res/values-da/strings.xml b/app/src/main/res/values-da/strings.xml index 355ca81043..902b975f35 100644 --- a/app/src/main/res/values-da/strings.xml +++ b/app/src/main/res/values-da/strings.xml @@ -180,17 +180,17 @@ Blokér Blokér og forlad - Report and block + Rapportér og blokér - Report spam? + Rapportér spam? - Report spam + Rapportér spam - Signal will be notified that this person may be sending spam. Signal can’t see the content of any chats. + Signal får besked om at denne person muligvis sender spam. Signal kan ikke se indholdet af nogen chats. - Signal will be notified that %1$s, who invited you to this group, may be sending spam. Signal can’t see the content of any chats. + Signal får besked om at %1$s, der inviterede dig til denne gruppe, muligvis sender spam. Signal kan ikke se indholdet af nogen chats. - Signal will be notified that the person who invited you to this group may be sending spam. Signal can’t see the content of any chats. + Signal får besked om at den person, der inviterede dig til denne gruppe, muligvis sender spam. Signal kan ikke se indholdet af nogen chats. I dag @@ -494,8 +494,8 @@ Du kan tilføje egne noter i denne chat. Hvis din konto har forbundne enheder, vil noterne blive synkroniseret. %1$d gruppemedlemmer har samme navn. Tryk for at gennemgå - Gennemgå anmodninger omhyggeligt - Molly fandt en anden kontakt med samme navn. + + This person has the same name as another contact Kontakt os Bekræft Ikke nu @@ -522,54 +522,54 @@ Ikke længere verificeret - Safety tips + Sikkerhedstips - Report spam + Rapportér spam Blokér Godkend - Delete chat + Slet chat Fjern blokering - Reported spam + Rapporteret spam - Signal has been be notified that this person may be sending spam. Signal can’t see the content of any chats. + Signal har fået besked om at denne person muligvis sender spam. Signal kan ikke se indholdet af nogen chats. - Reported as spam + Rapporteret som spam - Reported as spam and blocked + Rapporteret som spam og blokeret - You accepted a message request from %1$s. If this was a mistake, you can choose an action below. + Du accepterede en beskedanmodningen fra %1$s. Hvis dette var en fejl, kan du vælge en handling nedenfor. - Safety Tips + Sikkerhedstips - Be careful when accepting message requests from people you don’t know. Watch out for: + Vær forsigtig med at acceptere beskedanmodninger fra folk, du ikke kender. Pas på: - Review this request carefully. None of your contacts or people you chat with are in this group. Here are a few things to watch out for: + Gennemgå denne anmodning. Ingen af dine kontakter eller personer, du chatter med, er i denne gruppe. Her er nogle ting at være opmærksom på: - Previous tip + Forrige tip - Next tip + Næste tip - Crypto or money scams + Krypto- eller pengesvindel - If someone you don’t know messages about cryptocurrency (like Bitcoin) or an financial opportunity, be careful—it’s likely spam. + Pas på, hvis du får en besked om kryptovalutaer (såsom Bitcoin) eller en økonomisk mulighed fra en, du ikke kender – det er sandsynligvis spam. - Vague or irrelevant messages + Uklare eller irrelevante beskeder - Spammers often start with a simple message like “Hi” to draw you in. If you respond they may engage you further. + Spammere starter ofte med en simpel besked som \"Hej\" for at lokke dig ind. Hvis du svarer, engagerer de dig måske yderligere. - Messages with links + Beskeder med links - Be careful of messages from people you don’t know that have links to websites. Never visit links from people you don’t trust. + Vær forsigtig med beskeder fra folk, du ikke kender, der indeholder links til hjemmesider. Besøg aldrig links fra folk, du ikke stoler på. - Fake businesses and institutions + Falske virksomheder og institutioner - Be careful of businesses or government agencies contacting you. Messages involving tax agencies, couriers, and more can be spam. + Forhold dig skeptisk, når du bliver kontaktet af virksomheder eller offentlige myndigheder. Beskeder vedrørende skattebureauer, fragtvirksomheder osv. kan være spam. Ryd filter @@ -585,8 +585,8 @@ Sletter - Deleting selected chat… - Deleting selected chats… + Sletter den valgte chat… + Sletter de valgte chats… Chat arkiveret @@ -1064,7 +1064,7 @@ Dit brugernavn, din QR-kode og dit link er ikke synlige på din profil. Del kun dit brugernavn med folk, du stoler på. - + Folk kan nu sende dig beskeder ved hjælp af dit valgfrie brugernavn, så du ikke behøver at dele dit telefonnummer. Profilnavn Brugernavn Om @@ -1599,9 +1599,9 @@ Betaling: %1$s - Reported as spam + Rapporteret som spam - You accepted the message request + Du accepterede beskedanmodningen Godkend @@ -1649,7 +1649,7 @@ %1$d yderligere grupper - Report… + Rapportér… Adgangssætninger matcher ikke! @@ -1965,9 +1965,9 @@ Signal-kontakt - + Bekræftet - + Ingen direkte beskeder med %1$s %1$s er i dine systemkontakter @@ -2301,7 +2301,7 @@ Brugernavn er ugyldigt. Brugernavne skal være på mellem %1$d og %2$d tegn. - Med brugernavne kan andre skrive til dig uden dit telefonnummer. De er tilknyttet et sæt tal, der hjælper med at holde dine adresse hemmelig. + Usernames are always paired with a set of numbers. Hvad er dette nummer? Disse tal hjælper dig med at holde dit brugernavn hemmeligt, så du undgår uønskede beskeder. Del dit brugernavn med de mennesker og grupper, du gerne vil snakke med. Hvis du ændrer brugernavn, får du et nyt sæt tal. @@ -2322,9 +2322,9 @@ Hvis du gendanner dit brugernavn, nulstilles din eksisterende QR-kode og dit link. Er du sikker? - + Hvis du ændrer dit brugernavn, nulstilles din eksisterende QR-kode og dit link. Er du sikker? - + Fortsæt %1$d kontakt anvender Signal! @@ -2722,7 +2722,7 @@ Du har fjernet denne person, og hvis du sender vedkommende en besked, tilføjes vedkommende igen til din liste. - Options + Valgmuligheder Afspil … Pause @@ -4124,8 +4124,10 @@ \"%1$s\" er ikke længere blokeret. - Gennemgå medlemmer - Gennemgå anmodning + + Review members + + Review request %1$d medlemmer af gruppen har det samme navn, gennemgå medlemmer herunder og vælg en handling. Hvis du ikke er sikker på hvem forespørgslen er fra, gennemgå kontakterne herunder og vælg en handling. Ingen andre grupper til fælles @@ -6184,13 +6186,13 @@ Få mere at vide - + Nye måder at komme i kontakt på - + Introducerer telefonnummerbeskyttelse, valgfrie brugernavne og links. - + Afvis - + Få mere at vide @@ -6490,9 +6492,9 @@ Der opstod en netværksfejl under forsøget på at nulstille dit link. Prøv igen senere. - + Der opstod en uventet fejl under forsøget på at nulstille dit link. Prøv igen senere. - + Din QR-kode og dit link er blevet nulstillet, og der er oprettet en ny QR-kode og et nyt link. Scan QR-koden med din mobil for at snakke med mig på Signal. @@ -6563,7 +6565,7 @@ Telefonnummer - Angiv et brugernavn med de tilhørende cifre. + Enter a username followed by a dot and its set of numbers. Næste diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml index df23087fd9..00bfc2b951 100644 --- a/app/src/main/res/values-de/strings.xml +++ b/app/src/main/res/values-de/strings.xml @@ -494,8 +494,8 @@ Du kannst in diesem Chat an dich selbst gerichtete Notizen hinzufügen. Falls dein Nutzerkonto gekoppelte Geräte besitzt, werden neue Notizen synchronisiert. %1$d Gruppenmitglieder haben denselben Namen. Zum Prüfen antippen - Prüfe Anfragen sorgfältig - Molly hat einen weiteren Kontakt mit demselben Namen gefunden. + + This person has the same name as another contact Kontaktiere uns Verifizieren Jetzt nicht @@ -655,7 +655,7 @@ Profil - Fehler beim Festlegen des Profilfotos + Fehler beim Festlegen des Profilbildes Problem beim Festlegen des Profils Richte dein Profil ein Dein Profil und Änderungen daran sind für Personen, an die du Nachrichten verschickst, Kontakte und Gruppen sichtbar. @@ -1064,7 +1064,7 @@ Dein Nutzername, der QR-Code und der Link sind in deinem Profil nicht sichtbar. Teile deinen Nutzernamen nur mit Leuten, denen du vertraust. - + Andere können dir jetzt über deinen optionalen Nutzernamen eine Nachricht schicken, sodass du deine Telefonnummer nicht mehr herausgeben musst. Profilname Nutzername Info @@ -1965,9 +1965,9 @@ Signal-Verbindung - + Verifiziert - + No direct messages with %1$s %1$s ist in deinen Telefonkontakten @@ -2301,7 +2301,7 @@ Nutzername ist ungültig. Nutzernamen dürfen aus %1$d bis %2$d Zeichen bestehen. - Über Nutzernamen können andere dir Nachrichten schicken, ohne dass sie deine Telefonnummer brauchen. Sie sind mit einer Ziffernfolge gekoppelt, damit deine Adresse geheim bleibt. + Usernames are always paired with a set of numbers. Was ist das für eine Nummer? Diese Ziffern helfen, deinen Nutzernamen privat zu halten, damit du keine unerwünschten Nachrichten erhältst. Teile deinen Nutzernamen nur mit den Personen und Gruppen, mit denen du chatten möchtest. Wenn du deinen Nutzernamen änderst, bekommst du eine neue Ziffernfolge. @@ -2322,9 +2322,9 @@ Wenn du deinen Nutzernamen wiederherstellst, werden dein bestehender QR-Code und dein Link ersetzt und neu erstellt. Bist du dir sicher? - + Wenn du deinen Nutzernamen änderst, werden dein bisheriger QR-Code und dein Link zurückgesetzt. Bist du dir sicher? - + Fortfahren %1$d Kontakt ist bei Signal! @@ -4124,8 +4124,10 @@ %1$s wurde freigegeben. - Mitglieder prüfen - Anfrage prüfen + + Review members + + Review request %1$d Gruppenmitglieder haben denselben Namen. Prüfe die folgenden Mitglieder und handle entsprechend. Falls du dir über die Herkunft der Anfrage unsicher bist, prüfe die folgenden Kontakte und handle entsprechend. Keine anderen gemeinsamen Gruppen. @@ -6184,13 +6186,13 @@ Mehr erfahren - + Neue Möglichkeiten, um sich zu verbinden - + Wir führen Datenschutz bei Telefonnummern, optionale Nutzernamen und Links ein. - + Verwerfen - + Mehr erfahren @@ -6490,9 +6492,9 @@ Beim Zurücksetzen deines Links ist ein Netzwerkfehler aufgetreten. Versuche es später erneut. - + An unexpected error occurred while trying to reset your link. Try again later. - + Dein QR-Code und dein Link wurden zurückgesetzt. Ein neuer QR-Code und ein neuer Link wurden erstellt. Scanne diesen QR-Code mit deinem Smartphone, um mit mir auf Signal zu chatten. @@ -6563,7 +6565,7 @@ Telefonnummer - Gib einen vollständigen Nutzernamen mit dem entsprechenden Ziffernpaar ein. + Enter a username followed by a dot and its set of numbers. Weiter diff --git a/app/src/main/res/values-el/strings.xml b/app/src/main/res/values-el/strings.xml index 7690d771ee..e52df8f46a 100644 --- a/app/src/main/res/values-el/strings.xml +++ b/app/src/main/res/values-el/strings.xml @@ -494,8 +494,8 @@ Μπορείς να προσθέσεις σημειώσεις για δική σου χρήση σε αυτήν τη συνομιλία. Εάν ο λογαριασμός σου είναι συνδεμένος με άλλες συσκευές, οι νέες σημειώσεις θα συγχρονίζονται. %1$d μέλη της ομάδας έχουν το ίδιο όνομα. Πάτα για επιθεώρηση - Επιθεώρησε τα αιτήματα προσεκτικά - Το Molly βρήκε και άλλη επαφή με το ίδιο όνομα. + + This person has the same name as another contact Επικοινώνησε μαζί μας Επιβεβαίωση Όχι τώρα @@ -1064,7 +1064,7 @@ Το όνομα χρήστη, ο κωδικός QR και ο σύνδεσμός σου δεν είναι ορατά στο προφίλ σου. Να μοιράζεσαι μόνο το όνομα χρήστη σου με άτομα που εμπιστεύεσαι. - + Οι χρήστες μπορούν πλέον να σου στέλνουν μήνυμα χρησιμοποιώντας το προαιρετικό όνομα χρήστη σου, ώστε να μη χρειάζεται να δώσεις τον αριθμό τηλεφώνου σου. Όνομα προφίλ Όνομα χρήστη Πληροφορίες @@ -1965,9 +1965,9 @@ Επαφές Signal - + Επιβεβαιωμένος - + No direct messages with %1$s Ο χρήστης %1$s βρίσκεται στις επαφές του συστήματός σου @@ -2301,7 +2301,7 @@ Το όνομα χρήστη δεν είναι έγκυρο. Τα ονόματα χρήστη πρέπει να είναι από %1$d εώς %2$d χαρακτήρες. - Τα ονόματα χρήστη επιτρέπουν σε άλλους χρήστες να σου στείλουν μηνύματα χωρίς τον αριθμό τηλεφώνου σου. Είναι συνδεδεμένα με ένα σετ ψηφίων ώστε να διατηρούν απόρρητη τη διεύθυνσή σου. + Usernames are always paired with a set of numbers. Τι είναι αυτός ο αριθμός; Αυτά τα ψηφία διατηρούν απόρρητο το δικό σου όνομα χρήστη ώστε να μη λαμβάνεις ανεπιθύμητα μηνύματα. Να μοιράζεσαι το δικό σου όνομα χρήστη μόνο με άτομα και ομάδες που θέλεις να συνομιλείς. Εάν θέλεις να αλλάξεις όνομα χρήστη, θα λάβεις έναν νέο σετ ψηφίων. @@ -2322,9 +2322,9 @@ Η ανάκτηση του ονόματος χρήστη θα επαναφέρει τον υπάρχοντα κωδικό QR και τον σύνδεσμό σου. Σίγουρα; - + Η αλλαγή του ονόματος χρήστη σου θα επαναφέρει τον υπάρχοντα κωδικό QR και τον σύνδεσμό σου. Είσαι σίγουρος/η; - + Συνέχεια %1$d επαφή είναι στο Signal! @@ -4124,8 +4124,10 @@ Ο αποκλεισμός του/της \"%1$s\" καταργήθηκε. - Ανασκόπηση μελών - Εξέταση αιτήματος + + Review members + + Review request %1$d μέλη της ομάδας έχουν το ίδιο όνομα, εξέτασε τα παρακάτω μέλη, και διάλεξε τί ενέργεια να κάνεις. Αν δεν είσαι σίγουρος/η από ποιόν είναι το αίτημα, εξέτασε τις παρακάτω επαφές, και κάνε κάποια ενέργεια. Καμμία άλλη κοινή ομάδα @@ -6184,13 +6186,13 @@ Μάθε περισσότερα - + Νέοι τρόποι σύνδεσης - + Παρουσιάζουμε το απόρρητο των αριθμών τηλεφώνου, τα προαιρετικά ονόματα χρηστών και τους συνδέσμους. - + Απόρριψη - + Μάθε περισσότερα @@ -6490,9 +6492,9 @@ Προέκυψε σφάλμα δικτύου κατά την προσπάθεια επαναφοράς του συνδέσμου. Δοκίμασε ξανά αργότερα. - + An unexpected error occurred while trying to reset your link. Try again later. - + Έχει γίνει επαναφορά του κωδικού QR και του συνδέσμου σου και έχει δημιουργηθεί ένας νέος κωδικός QR και ένας νέος σύνδεσμος. Σάρωσε αυτόν τον κωδικό QR με το τηλέφωνό σου για να συνομιλήσεις μαζί μου στο Signal. @@ -6563,7 +6565,7 @@ Αριθμός τηλεφώνου - Γράψε ένα πλήρες όνομα χρήστη με το ζεύγος των ψηφίων του. + Enter a username followed by a dot and its set of numbers. Επόμενο diff --git a/app/src/main/res/values-es/strings.xml b/app/src/main/res/values-es/strings.xml index 1557b19905..e209f8c180 100644 --- a/app/src/main/res/values-es/strings.xml +++ b/app/src/main/res/values-es/strings.xml @@ -494,8 +494,8 @@ En este chat puedes añadir notas, mensajes personales, fotos… que solo tú puedes ver. Si tu cuenta tiene dispositivos enlazados, el contenido nuevo se sincronizará. %1$d participantes usan el mismo nombre. Toca para revisar - Revisa cuidadosamente las solicitudes - Molly ha encontrado otra persona con el mismo nombre. + + This person has the same name as another contact Contáctanos Verificar Ahora no @@ -1064,7 +1064,7 @@ Tu alias, código QR y enlace no son visibles en tu perfil. Comparte tu alias solo con personas de confianza. - + Ahora, la gente puede enviarte mensajes usando tu alias opcional, con lo que no necesitas dar tu número de teléfono. Nombre de perfil Alias Biografía @@ -1965,9 +1965,9 @@ Conexión de Signal - + Pago verificado - + No direct messages with %1$s %1$s está entre tus contactos del sistema @@ -2301,7 +2301,7 @@ Alias no válido. El alias debe contener entre %1$d y %2$d caracteres. - Los alias les permiten a otras personas mandarte un mensaje sin necesidad de tu número de teléfono. Funcionan conjuntamente con una serie de dígitos para ayudarte a mantener tu dirección en privado. + Usernames are always paired with a set of numbers. ¿Qué es este número? Estos dígitos te ayudarán a mantener tu alias en privado para así evitar que recibas mensajes no deseados. Comparte tu alias solo con aquellas personas y grupos con los que quieras charlar. Si cambias tu alias, recibirás una nueva serie de dígitos. @@ -2322,9 +2322,9 @@ Recuperar tu alias restablecerá tu código QR y tu enlace. ¿Seguro que quieres hacer esto? ¿Seguro que quieres hacer esto? - + Cambiar tu alias restablecerá tu código QR y tu enlace. ¿Seguro que quieres hacer esto? - + Continuar ¡%1$d contacto usa Signal! @@ -4124,8 +4124,10 @@ Se ha desbloqueado a %1$s - Revisar participantes - Revisar solicitud + + Review members + + Review request %1$d participantes usan el mismo nombre, revisa la lista de participantes debajo y selecciona la opción correcta. Si no sabes quién ha enviado esta solicitud, revisa la lista de personas debajo para tomar la decisión correcta. No hay otros grupos en común. @@ -6184,13 +6186,13 @@ Saber más - + Nuevas formas de conectarte - + Presentamos la privacidad del número de teléfono, los alias opcionales y los enlaces. - + Ignorar - + Saber más @@ -6490,9 +6492,9 @@ Se ha producido un fallo al tratar de reiniciar tu enlace. Inténtalo de nuevo más tarde. - + An unexpected error occurred while trying to reset your link. Try again later. - + Tu código QR y tu enlace se han restablecido, y se han creado un código QR y enlace nuevos. Escanea este código QR con tu teléfono para chatear conmigo en Signal. @@ -6563,7 +6565,7 @@ Número de teléfono - Introduce tu alias completo con su par de dígitos. + Enter a username followed by a dot and its set of numbers. Siguiente diff --git a/app/src/main/res/values-et/strings.xml b/app/src/main/res/values-et/strings.xml index 814040eb46..5ee9615015 100644 --- a/app/src/main/res/values-et/strings.xml +++ b/app/src/main/res/values-et/strings.xml @@ -494,8 +494,8 @@ Selles vestluses saad enda jaoks märkmeid lisada. Kui su kontol on lingitud seadmeid, siis uued märkmed sünkroonitakse. %1$d grupiliikmel on sama nimi. Üle vaatamiseks koputa - Vaata taotlused tähelepanelikult üle - Molly leidis teise samanimelise kontakti + + This person has the same name as another contact Võta meiega ühendust Kinnita Mitte praegu @@ -1064,7 +1064,7 @@ Sinu kasutajanimi, QR-kood ega link ei ole su profiilil nähtavad. Jaga oma kasutajanime ainult inimestega, keda usaldad. - + Nüüd saavad teised sulle sõnumeid saata, kasutades sinu valikulist kasutajanime, et sa ei peaks oma telefoninumbrit jagama. Profiilinimi Kasutajanimi Teave @@ -1965,9 +1965,9 @@ Signali kontakt - + Kontrollitud - + No direct messages with %1$s %1$s on sinu süsteemi kontaktide hulgas @@ -2301,7 +2301,7 @@ Kasutajanimi on sobimatu. Kasutajanimede pikkus peab olema %1$d ja %2$d tähemärgi vahel. - Kasutajanime abil saavad teised sulle sõnumeid saata ilma su telefoninumbrit teadmata. Kasutajanimi seotakse numbrilise koodiga, mis aitab sul oma aadressi privaatsena hoida. + Usernames are always paired with a set of numbers. Mis number see on? See kood aitab su kasutajanime privaatsena hoida, et saaksid vältida soovimatuid sõnumeid. Jaga oma kasutajanime ainult inimeste ja gruppidega, kellega soovid vestelda. Kui kasutajanime muudad, saadetakse sulle uus kood. @@ -2322,9 +2322,9 @@ Kasutajanime taastades lähtestad olemasoleva QR-koodi ja lingi. Kas oled kindel? - + Kasutajanime muutes lähtestad olemasoleva QR-koodi ja lingi. Kas oled kindel? - + Jätka %1$d kontakt on Signalis! @@ -4124,8 +4124,10 @@ Kasutaja %1$s blokeering on eemaldatud. - Vaata liikmed üle - Vaata taotlus üle + + Review members + + Review request %1$d grupi liiget on sama nimega, kontrolli allpool liikmeid ja vali, mida teha. Kui sa pole kindel, kellelt soov on, siis vaata kontaktid allpool üle ja vali tegevus. Muid ühised gruppe pole. @@ -6184,13 +6186,13 @@ Rohkem teavet - + Uued viisid ühenduse loomiseks - + Tutvustame telefoninumbri privaatsust, valikulisi kasutajanimesid ja linke. - + Tühista - + Rohkem teavet @@ -6490,9 +6492,9 @@ Sinu lingi lähtestamise ajal tekkis võrgu viga. Proovi hiljem uuesti. - + An unexpected error occurred while trying to reset your link. Try again later. - + Sinu QR-kood ja link on lähtestatud ja uus QR-kood ja link on loodud. Skanni oma telefoniga see QR-kood, et minuga Signalis vestelda. @@ -6563,7 +6565,7 @@ Telefoninumber - Sisesta täielik kasutajanimi koos selle numbripaariga. + Enter a username followed by a dot and its set of numbers. Edasi diff --git a/app/src/main/res/values-eu/strings.xml b/app/src/main/res/values-eu/strings.xml index f8eb0c6462..a4b12e9840 100644 --- a/app/src/main/res/values-eu/strings.xml +++ b/app/src/main/res/values-eu/strings.xml @@ -494,8 +494,8 @@ Zuretzako oharrak gehi ditzakezu txat honetan. Zure kontuak gailuren bat badauka lotuta, ohar berriak sinkronizatuko dira. %1$d taldeko kide izen bera dute. Sakatu berrikusteko - Berrikusi eskaerak kontu handiz - Molly-ek izen bera duen beste kontaktu bat topatu du. + + This person has the same name as another contact Harremanetan jarri gurekin Baieztatu Orain ez @@ -1064,7 +1064,7 @@ Erabiltzaile-izena, QR kodea eta esteka ez daude ikusgai profilean. Partekatu erabiltzaile-izena pertsona fidagarriekin bakarrik. - + Orain, jendeak zure hautazko erabiltzaile-izena erabil dezake zuri mezuak bidaltzeko; horrela, ez duzu telefono-zenbakia ematen ibili beharko. Profileko izena Erabiltzaile-izena Honi buruz @@ -1965,9 +1965,9 @@ Signal-eko konexioa - + Egiaztatuta - + No direct messages with %1$s %1$s zure sistemako kontaktuetan dago @@ -2301,7 +2301,7 @@ Erabiltzaile-izena baliogabea da. Erabiltzaile-izenek %1$d eta %2$d karaktere bitartean egon behar dira. - Erabiltzaile-izenei esker, beste erabiltzaileek zure telefono-zenbakiaren beharrik gabe bidal diezazkizukete mezuak. Digitu multzo batekin parekatuta daude, zure helbidea pribatu mantentzeko. + Usernames are always paired with a set of numbers. Zer da zenbaki hau? Digitu hauei esker, zure erabiltzaile-izena pribatu mantentzen da, nahi ez dituzun mezuak saihestu ahal izateko. Partekatu erabiltzaile-izena zurekin txateatzea nahi duzun pertsonekin eta taldeekin soilik. Erabiltzaile-izena aldatzen baduzu, digitu-multzo berri bat jasoko duzu. @@ -2322,9 +2322,9 @@ Erabiltzaile-izena berreskuratzen baduzu, lehendik dauden QR kodea eta esteka berrezarri egingo dira. Ziur zaude? - + Erabiltzaile-izena aldatuz gero, oraingo QR kodea eta esteka berrezarri egingo dira. Ziur zaude? - + Jarraitu Kontaktu %1$d Signalen dago! @@ -4124,8 +4124,10 @@ \"%1$s\" desblokeatu da. - Berrikusi Kideak - Berrikusi Eskaera + + Review members + + Review request Taldean %1$d kide izen bera dute; egiaztatu azpian agertzen diren kideak eta ekintza bat hautatu. Ziur ez bazaude eskaera nork bidali duen, egiaztatu azpian agertzen diren kontaktuak eta ekintza bat hautatu. Ez dago komuna den beste talderik. @@ -6184,13 +6186,13 @@ Informazio gehiago - + Konektatzeko modu berriak - + Berria: telefono-zenbakiaren pribatutasuna, hautazko erabiltzaile-izenak eta estekak. - + Baztertu - + Informazio gehiago @@ -6490,9 +6492,9 @@ Sareko errore bat gertatu da esteka berrezartzen saiatzean. Saiatu berriro geroago. - + An unexpected error occurred while trying to reset your link. Try again later. - + QR kodea eta esteka berrezarri egin dira, eta QR kode eta esteka berriak sortu. Signal-en nirekin txateatzeko, eskaneatu QR kode hau telefonoarekin. @@ -6563,7 +6565,7 @@ Telefono-zenbakia - Idatzi erabiltzaile-izen oso bat, dagokion digitu-parearekin. + Enter a username followed by a dot and its set of numbers. Hurrengoa diff --git a/app/src/main/res/values-fa/strings.xml b/app/src/main/res/values-fa/strings.xml index e6c6261bed..d52d36eb94 100644 --- a/app/src/main/res/values-fa/strings.xml +++ b/app/src/main/res/values-fa/strings.xml @@ -494,8 +494,8 @@ شما می‌توانید برای خودتان در این گفتگو یادداشت اضافه کنید. اگر حساب کاربری شما هرگونه دستگاه پیوند داده شدهٔ جدیدی داشته باشد، یادداشت‌های جدید همگام‌سازی خواهند شد. %1$d عضو گروه نام یکسانی دارند. برای بازنگری ضربه بزنید - درخواست‌ها را با دقت بازنگری کنید - سیگنال مخاطب دیگری را با نام یکسان پیدا کرد. + + This person has the same name as another contact تماس با ما وارسی حالا نه @@ -1064,7 +1064,7 @@ نام کاربری، کد QR و پیوند شما در نمایۀ شما قابل مشاهده نیست. نام کاربری خود را فقط با افراد مورد اعتمادتان به اشتراک بگذارید. - + اکنون افراد می‌توانند با استفاده از نام کاربری اختیاری‌تان به شما پیام بدهند، پس دیگر لازم نیست شماره تلفن خود را به کسی بدهید. نام نمایه نام کاربری درباره @@ -1965,9 +1965,9 @@ آشنا در سیگنال - + تأیید شده - + No direct messages with %1$s %1$s در مخاطبان سیستم شما است @@ -2301,7 +2301,7 @@ نام کاربری نامعتبر است. نام‌های کاربری باید بین %1$d و %2$d نویسه باشند. - نام کاربری به دیگران اجازه می‌دهد بدون نیاز به شماره تلفن تان به شما پیام بدهند. نام کاربری با مجموعه‌ای از ارقام ادغام می‌شود تا کمک کند نشانی شما خصوصی بماند. + Usernames are always paired with a set of numbers. این عدد چیست؟ این ارقام به خصوصی ماندن نام کاربری شما کمک می‌کند تا بتوانید از پیام‌های ناخواسته جلوگیری کنید. نام کاربری خود را فقط با افراد و گروه‌هایی که می‌خواهید با آنها گفتگو کنید به اشتراک بگذارید. اگر نام کاربری را تغییر دهید، مجموعه ارقام جدیدی دریافت خواهید کرد. @@ -2322,9 +2322,9 @@ بازیابی نام کاربری‌تان موجب بازنشانی پیوند و کد QR فعلی شما می‌شود. مطمئن هستید؟ - + تغییر نام کاربری‌تان موجب بازنشانی کد و پیوند QR فعلی شما می‌شود. مطمئن هستید؟ - + ادامه %1$d مخاطب در سیگنال هست! @@ -4124,8 +4124,10 @@ «%1$s» رفع مسدودیت شده است. - بازبینی اعضا - بازبینی درخواست + + Review members + + Review request %1$d عضو گروه نام یکسان دارند، اعضا را در پایین مرور کنید و اقدام لازم را انجام دهید. اگر مطمئن نیستید که فرستندهٔ درخواست چه کسی است، مخاطبین را در پایین مرور کنید و اقدام لازم را انجام دهید. هیچ گروه مشترک دیگری وجود ندارد. @@ -6184,13 +6186,13 @@ اطلاعات بیشتر - + روش‌های جدید برقراری ارتباط - + معرفی حریم شخصی شماره تلفن، نام کاربری انتخابی و پیوندها. - + رد کردن - + اطلاعات بیشتر @@ -6490,9 +6492,9 @@ هنگام بازنشانی پیوند شما یک خطای شبکه رخ داد. بعداً دوباره امتحان کنید. - + An unexpected error occurred while trying to reset your link. Try again later. - + پیوند و کد QR شما بازنشانی شده و پیوند و کد QR جدیدتان ایجاد شده است. برای گفتگو با من در سیگنال، این کد QR را با تلفن خود اسکن کنید. @@ -6563,7 +6565,7 @@ شماره تلفن - یک نام کاربری کامل با دو رقم آن وارد کنید. + Enter a username followed by a dot and its set of numbers. بعدی diff --git a/app/src/main/res/values-fi/strings.xml b/app/src/main/res/values-fi/strings.xml index b923ff9957..ad3adf40e4 100644 --- a/app/src/main/res/values-fi/strings.xml +++ b/app/src/main/res/values-fi/strings.xml @@ -494,8 +494,8 @@ Voit lisätä itsellesi muistiinpanoja tähän keskusteluun. Jos tililläsi on linkitettyjä laitteita, uudet muistiinpanot synkronoidaan. %1$d ryhmän jäsenellä on sama nimi. Tarkista napauttamalla - Tarkista pyynnöt huolellisesti - Molly löysi toisen yhteystiedon samalla nimellä. + + This person has the same name as another contact Ota yhteyttä Vahvista Ei nyt @@ -1064,7 +1064,7 @@ Käyttäjänimi, QR-koodi ja linkki eivät näy profiilissasi. Jaa käyttäjänimesi vain henkilöille, joihin luotat. - + Ihmiset voivat nyt lähettää sinulle viestejä valinnaisella käyttäjänimelläsi, joten sinun ei tarvitse antaa puhelinnumeroasi. Profiilin nimi Käyttäjänimi Tiedot @@ -1965,9 +1965,9 @@ Signal-kontaktit - + Vahvistettu - + No direct messages with %1$s %1$s on järjestelmän yhteystiedoissa @@ -2301,7 +2301,7 @@ Käyttäjänimi on virheellinen. Käyttäjänimen on oltava %1$d–%2$d merkkiä pitkä. - Käyttäjänimien avulla muut voivat lähettää sinulle viestejä ilman puhelinnumeroasi. Käyttäjänimi on liitetty numerosarjaan osoitteesi yksityisyyden suojaamiseksi. + Usernames are always paired with a set of numbers. Mikä tämä numero on? Nämä numerot auttavat suojaamaan käyttäjänimesi yksityisyyttä, jotta voit välttää ei-toivottuja viestejä. Jaa käyttäjänimesi vain niille henkilöille ja ryhmille, joiden kanssa haluat keskustella. Jos vaihdat käyttäjänimeä, saat uuden numerosarjan. @@ -2322,9 +2322,9 @@ Käyttäjänimen palauttaminen palauttaa nykyisen QR-koodisi ja linkkisi oletusasetukseen. Oletko varma? - + Käyttäjänimen vaihtaminen nollaa nykyisen QR-koodisi ja linkkisi. Oletko varma? - + Jatka Signalissa on %1$d kontakti! @@ -4124,8 +4124,10 @@ Henkilön %1$s esto on poistettu. - Tarkista jäsenet - Tarkista pyyntö + + Review members + + Review request Ryhmän %1$d jäsenistä on käyttäjiä, joilla on sama nimi. Tarkista jäsenet alapuolelta ja korjaa ongelma. Jos et ole varma lähettäjän henkilöllisyydestä, tarkista henkilötiedot alta. Ei muita yhteisiä ryhmiä. @@ -6184,13 +6186,13 @@ Lue lisää - + Uusia tapoja pitää yhteyttä - + Esittelyssä puhelinnumeroiden yksityisyys, valinnaiset käyttäjänimet ja linkit. - + Hylkää - + Lue lisää @@ -6490,9 +6492,9 @@ Linkkiä nollatessa tapahtui verkkovirhe. Yritä myöhemmin uudelleen. - + An unexpected error occurred while trying to reset your link. Try again later. - + QR-koodisi ja linkkisi on palautettu oletusasetukseen ja uusi QR-koodi ja linkki on luotu. Skannaa tämä QR-koodi puhelimellasi, niin voit keskustella kanssani Signalissa. @@ -6563,7 +6565,7 @@ Puhelinnumero - Syötä koko käyttäjänimi ja siihen liittyvä numerosarja. + Enter a username followed by a dot and its set of numbers. Seuraava diff --git a/app/src/main/res/values-fr/strings.xml b/app/src/main/res/values-fr/strings.xml index b7a49fbc5a..79bd009e74 100644 --- a/app/src/main/res/values-fr/strings.xml +++ b/app/src/main/res/values-fr/strings.xml @@ -494,8 +494,8 @@ Cette conversation est dédiée à vos notes personnelles. Si des appareils sont associés à votre compte, les nouvelles notes que vous ajoutez ici sont synchronisées sur tous vos appareils. %1$d membres du groupe portent le même nom. Toucher pour examiner - Examinez les demandes avec attention - Molly a trouvé un autre contact avec le même nom. + + This person has the same name as another contact Nous contacter Confirmer Pas maintenant @@ -1064,7 +1064,7 @@ Votre nom d’utilisateur, votre code QR et votre lien ne s’affichent pas dans votre profil. Partagez votre nom d’utilisateur uniquement avec les personnes en qui vous avez confiance. - + Vous pouvez désormais être contacté grâce à votre nom d’utilisateur facultatif et ainsi éviter de partager votre numéro de téléphone. Nom de profil Nom d’utilisateur À propos @@ -1965,9 +1965,9 @@ Contact Signal - + Confirmé - + No direct messages with %1$s %1$s se trouve dans vos contacts système @@ -2301,7 +2301,7 @@ Le nom d’utilisateur est invalide. Les noms d’utilisateur doivent comporter entre %1$d et %2$d caractères. - Le nom d’utilisateur vous permet de recevoir des messages sans communiquer votre numéro de téléphone. Il est associé à une série de chiffres, afin de protéger la confidentialité de votre adresse. + Usernames are always paired with a set of numbers. Qu\'est-ce que ce numéro ? Ces chiffres servent à préserver la confidentialité de votre identité correspondant au nom d\'utilisatuer choisi et ainsi d\'éviter les messages indésirables. Ne partagez votre nom d’utilisateur qu\'avec les personnes et les groupes avec lesquels vous souhaitez échanger. Si vous changez votre nom d’utilisateur, un nouvel ensemble de chiffres vous sera attribué. @@ -2322,9 +2322,9 @@ Récupérer votre nom d’utilisateur entraîne la réinitialisation de votre lien et code QR existants. Êtes-vous sûr de vouloir continuer ? - + Modifier votre nom d’utilisateur entraîne la réinitialisation de votre lien et code QR existants. Êtes-vous sûr de vouloir continuer ? - + Poursuivre %1$d contact est sur Signal ! @@ -4124,8 +4124,10 @@ « %1$s » a été débloqué. - Examiner les membres - Examiner la demande + + Review members + + Review request %1$d membres du groupe portent le même nom. Examinez-les ci-dessous et choisissez l’action appropriée. Si vous n’êtes pas certain de qui la demande provient, examinez les contacts ci-dessous et agissez en conséquence. Aucun autre groupe en commun. @@ -6184,13 +6186,13 @@ En savoir plus - + De nouvelles façons de rester en contact - + Protégez votre numéro de téléphone, choisissez un nom d’utilisateur facultatif et découvrez les liens de conversation. - + Fermer - + En savoir plus @@ -6490,9 +6492,9 @@ Une erreur réseau s’est produite lors de la tentative de réinitialisation de votre lien. Réessayez plus tard. - + An unexpected error occurred while trying to reset your link. Try again later. - + Nous avons réinitialisé votre lien et votre code QR, et en avons généré de nouveaux. Et si on discutait sur Signal ? Scannez ce code QR pour me contacter. @@ -6563,7 +6565,7 @@ Numéro de téléphone - Entrez un nom d’utilisateur complet, avec ses deux chiffres associés. + Enter a username followed by a dot and its set of numbers. Suivant diff --git a/app/src/main/res/values-ga/strings.xml b/app/src/main/res/values-ga/strings.xml index 21d58459a1..2a89710faa 100644 --- a/app/src/main/res/values-ga/strings.xml +++ b/app/src/main/res/values-ga/strings.xml @@ -521,8 +521,8 @@ Is féidir leat nótaí a chur leis duit féin sa chomhrá seo. Má tá aon ghléasanna nasctha le do chuntas, déanfar nótaí nua a shioncronú. Tá an t-ainm céanna ag an líon seo ball: %1$d. Cnag air chun é a athbhreithniú - Déan iarratais a athbhreithniú go cúramach - D\'aimsigh Molly teagmhálaí eile leis an ainm céanna. + + This person has the same name as another contact Déan teagmháil linn Deimhnigh Ní anois @@ -1169,7 +1169,7 @@ Níl d\'ainm úsáideora, cód QR ná nasc infheicthe ar do phróifíl. Ná comhroinn d\'ainm úsáideora ach amháin le daoine a bhfuil muinín agat iontu. - + Is féidir le daoine teachtaireacht a sheoladh chugat anois trí d\'ainm úsáideora roghnach ionas nach gá duit d\'uimhir ghutháin a thabhairt amach. Ainm Próifíle Ainm úsáideora Maidir leis @@ -2187,9 +2187,9 @@ Nasc Signal - + Deimhnithe - + No direct messages with %1$s Tá %1$s i dteagmhálaithe do chórais @@ -2541,7 +2541,7 @@ Níl an t-ainm úsáideora bailí. Ní mór go mbeidh an líon carachtar idir %1$d agus %2$d in ainmneacha úsáideora. - Is féidir le daoine eile ainmneacha úsáideora a úsáid chun teachtaireachtaí a sheoladh chugat; ní bhíonn uimhir ghutháin uathu sa chás sin. Bíonn ainmneacha úsáideora péireáilte le tacar digití chun cabhrú le do sheoladh a choimeád príobháideach. + Usernames are always paired with a set of numbers. Cad í an uimhir seo? Cabhraíonn na digití seo le d\'ainm úsáideora a choimeád príobháideach agus teachtaireachtaí gan iarraidh a sheachaint. Ná comhroinn d\'ainm úsáideora ach le daoine agus le grúpaí ar mhaith leat comhrá a dhéanamh leo. Má athraíonn tú d\'ainm úsáideora gheobhaidh tú tacar nua digití. @@ -2562,9 +2562,9 @@ Athshocrófar do chód QR agus nasc reatha le hathshlánú d\'ainm úsáideora. An bhfuil tú cinnte? - + Athshocrófar an cód QR agus an nasc atá agat cheana féin má athraíonn tú d\'ainm úsáideora. An bhfuil tú cinnte? - + Ar aghaidh Tá %1$d teagmhálaí ar Signal! @@ -4442,8 +4442,10 @@ Bac bainte de \"%1$s\". - Review Members - Review Request + + Review members + + Review request Tá an t-ainm céanna ag an líon seo ball den ghrúpa: %1$d, athbhreithnigh na baill thíos agus déan gníomh. Mura bhfuil tú cinnte faoin duine a sheol an t-iarratas, déan athbhreithniú ar na teagmhálaithe thíos agus déan gníomh. No other groups in common. @@ -6598,13 +6600,13 @@ Tuilleadh faisnéise - + Bealaí nua le nascadh - + Tús eolais ar phríobháideacht ar uimhreacha gutháin, ainmneacha úsáideora roghnacha agus naisc. - + Ruaig - + Tuilleadh faisnéise @@ -6913,9 +6915,9 @@ Tharla earráid líonra agus do nasc á athshocrú. Triail arís níos déanaí. - + An unexpected error occurred while trying to reset your link. Try again later. - + Athshocraíodh do chód QR agus nasc agus cruthaíodh cód QR agus nasc nua. Scan an cód QR seo le do ghuthán chun comhrá a dhéanamh liom ar Signal. @@ -6992,7 +6994,7 @@ Uimhir ghutháin - Cuir isteach ainm úsáideora iomlán agus a dhá dhigit. + Enter a username followed by a dot and its set of numbers. Ar aghaidh diff --git a/app/src/main/res/values-gl/strings.xml b/app/src/main/res/values-gl/strings.xml index d9c026dd73..2adeac29e3 100644 --- a/app/src/main/res/values-gl/strings.xml +++ b/app/src/main/res/values-gl/strings.xml @@ -494,8 +494,8 @@ Podes engadir notas para ti mesmo nesta conversa. Se a túa conta ten máis dispositivos vinculados, as notas tamén se sincronizarán. %1$d membros do grupo teñen o mesmo nome. Toca para revisar - Revisa as solicitudes con atención - Molly atopou outro conctacto co mesmo nome. + + This person has the same name as another contact Contacto Comprobar Agora non @@ -1064,7 +1064,7 @@ O teu nome de usuario, código QR e ligazón non aparecerán no teu perfil. Comparte o teu nome de usuario só coas persoas nas que confíes. - + As persoas poden enviarche unha mensaxe usando o teu nome de usuario, polo que non é necesario que compartas o teu número de teléfono. Nome de perfil Nome de usuario Acerca de @@ -1965,9 +1965,9 @@ Conexións de Signal - + Verificado - + No direct messages with %1$s %1$s está na túa listaxe de contactos do sistema @@ -2301,7 +2301,7 @@ Nome de usuario non válido. Os nomes de usuario deben ter entre %1$d e %2$d caracteres. - Un nome de usuario permite que outras persoas che manden mensaxes sen necesitar o teu número de teléfono. Combínanse cunha serie de cifras para manter a túa información privada. + Usernames are always paired with a set of numbers. Que é este número? Estas cifras manteñen o teu nome de usuario privado para que non recibas mensaxes non desexadas. Comparte o teu usuario só coas persoas e grupos coas que queiras conversar. Se cambias o teu nome de usuario, terás unha nova serie de cifras. @@ -2322,9 +2322,9 @@ Para recuperar o teu nome de usuario restableceranse o teu código QR e ligazón actuais. Queres continuar? - + Cambiar o teu nome de usuario restablecerá o teu código QR e ligazón. Queres continuar? - + Continuar %1$dcontacto está en Signal! @@ -4124,8 +4124,10 @@ Desbloqueouse a «%1$s». - Revisar membros - Revisar solicitude + + Review members + + Review request %1$d membros do grupo teñen o mesmo nome; revísaos e elixe unha acción. Se non estás seguro de quen é a solicitude, revisa os contactos e elixe unha acción. Ningún outro grupo en común. @@ -6184,13 +6186,13 @@ Máis información - + Novas formas de conectarse - + Damos a benvida a unha maior privacidade do número de teléfono, nomes de usuario e ligazóns opcionais. - + Rexeitar - + Máis información @@ -6490,9 +6492,9 @@ Ocorreu un erro de rede mentres restableciamos a túa ligazón. Volver tentar máis tarde. - + An unexpected error occurred while trying to reset your link. Try again later. - + Restablecéronse o teu código QR e a ligazón, e creáronse uns novos. Escanea este código QR co teu teléfono para conversar comigo en Signal. @@ -6563,7 +6565,7 @@ Número de teléfono - Escribe un nome de usuario completo co seu par de números. + Enter a username followed by a dot and its set of numbers. Seguinte diff --git a/app/src/main/res/values-gu/strings.xml b/app/src/main/res/values-gu/strings.xml index f6b61601c5..01e901d60a 100644 --- a/app/src/main/res/values-gu/strings.xml +++ b/app/src/main/res/values-gu/strings.xml @@ -494,8 +494,8 @@ આ ચેટમાં તમે તમારા માટે નોંધ ઉમેરી શકો છો. જો તમારા એકાઉન્ટ સાથે કોઈ લિંક કરેલા ડિવાઇસ હશે તો નવી નોંધને સિંક કરવામાં આવશે. %1$d જૂથ સભ્યોનાં સરખાં નામ છે. રિવ્યુ કરવા માટે ટેપ કરો - વિનંતીઓની કાળજીપૂર્વક રિવ્યુ કરો - Molly ને સરખાં નામનો બીજો સંપર્ક મળ્યો. + + This person has the same name as another contact અમારો સંપર્ક કરો ચકાસો અત્યારે નહીં @@ -1064,7 +1064,7 @@ તમારું યુઝરનેમ, QR કોડ અને લિંક તમારી પ્રોફાઇલ પર દેખાતા નથી. તમારું યુઝરનેમ ફક્ત એવા લોકો સાથે જ શેર કરો જેમના પર તમને વિશ્વાસ હોય. - + લોકો હવે તમારા વૈકલ્પિક યુઝરનેમનો ઉપયોગ કરીને તમને મેસેજ કરી શકે છે જેથી તમારે તમારો ફોન નંબર આપવો ન પડે. પ્રોફાઇલ નામ યુઝરનેમ વિશે @@ -1965,9 +1965,9 @@ Signal કનેક્શન - + ચકાસણી - + No direct messages with %1$s %1$s તમારા સિસ્ટમના સંપર્કોમાં છે @@ -2301,7 +2301,7 @@ યુઝરનેમ અમાન્ય છે. યુઝરનેમ %1$d અને %2$d અક્ષરોની વચ્ચે હોવા જોઈએ. - યુઝરનેમ અન્ય લોકોને તમારા ફોન નંબરની જરૂર વગર તમને મેસેજ કરવા દે છે. તમારા સરનામાને ખાનગી રાખવામાં મદદ કરવા માટે તેમને થોડા અંકો સાથે જોડવામાં આવે છે. + Usernames are always paired with a set of numbers. આ નંબર શું છે? આ અંકો તમારા યુઝરનેમને ખાનગી રાખવામાં મદદ કરે છે જેથી તમે અનિચ્છનીય મેસેજને ટાળી શકો. તમારું યુઝરનેમ ફક્ત એ લોકો અને ગ્રૂપ સાથે જ શેર કરો જેમની સાથે તમે ચેટ કરવું ગમે છે. જો તમે યુઝરનેમ બદલો છો તો તમને નવા અંકો મળશે. @@ -2322,9 +2322,9 @@ તમારું યુઝરનેમ નામ રિકવર કરવાથી તમારો હાલનો QR કોડ અને લિંક ફરીથી સેટ થશે. તમને ખાતરી છે? - + તમારું યુઝરનેમ નામ બદલવાથી તમારો હાલનો QR કોડ અને લિંક ફરીથી સેટ થશે. તમને ખાતરી છે? - + ચાલુ રાખો %1$dસંપર્ક Signal પર છે! @@ -4124,8 +4124,10 @@ \"%1$s\"ને અનબ્લૉક કરવામાં આવ્યા છે. - મેમ્બરની સમીક્ષા કરો - વિનંતીની સમીક્ષા કરો + + Review members + + Review request %1$d ગ્રુપના સભ્યોનું નામ એક જ છે, નીચેના સભ્યોની સમીક્ષા કરો અથવા કરવાનું કાર્યવાહી પસંદ કરો. જો તમને ખાતરી ન હોય કે વિનંતી કોની છે, તો નીચેના સંપર્કોની સમીક્ષા કરો અને પગલાં લો. અન્ય કોઈ ગ્રુપ સામાન્ય નથી. @@ -6184,13 +6186,13 @@ વધુ જાણો - + કનેક્ટ કરવાની નવી રીતો - + પ્રસ્તુત કરીએ છીએ ફોન નંબરની ગોપનીયતા, વૈકલ્પિક યુઝરનેમ અને લિંક. - + કાઢી નાખો - + વધુ જાણો @@ -6490,9 +6492,9 @@ તમારી લિંકને ફરીથી સેટ કરવાનો પ્રયાસ કરતી વખતે નેટવર્ક ભૂલ આવી. પછી ફરી પ્રયાસ કરો. - + An unexpected error occurred while trying to reset your link. Try again later. - + તમારો QR કોડ અને લિંક ફરીથી સેટ કરવામાં આવી છે અને એક નવો QR કોડ અને લિંક બનાવવામાં આવી છે. Signal પર મારી સાથે ચેટ કરવા માટે આ QR કોડને તમારા ફોનથી સ્કેન કરો. @@ -6563,7 +6565,7 @@ ફોન નંબર - યુઝરનેમની પાછળ બે અંકોની જોડી દાખલ કરો. + Enter a username followed by a dot and its set of numbers. આગળ diff --git a/app/src/main/res/values-hi/strings.xml b/app/src/main/res/values-hi/strings.xml index 5b314ae020..bc9439adfb 100644 --- a/app/src/main/res/values-hi/strings.xml +++ b/app/src/main/res/values-hi/strings.xml @@ -494,8 +494,8 @@ आप इस चैट में खुद के लिए नोट्स शामिल कर सकते हैं। यदि आपके अकाउंट के कोई लिंक किए हुए डिवाइस हैं, तो नए नोट्स सिंक किए जाएँगे। %1$d ग्रुप मेंबर्स का एक ही नाम है। समीक्षा के लिए टैप करें - अनुरोधों की सावधानीपूर्वक समीक्षा करें - Molly को एक ही नाम वाला एक और संपर्क मिला। + + This person has the same name as another contact हमसे संपर्क करें सत्यापित करें अभी नहीं @@ -1064,7 +1064,7 @@ आपका यूज़रनेम, QR कोड और लिंक आपके प्रोफाइल पर दिखाई नहीं दे रहे हैं। अपना यूज़रनेम केवल उन लोगों के साथ साझा करें जिन पर आपको भरोसा है। - + लोग अब आपका वैकल्पिक यूज़रनेम इस्तेमाल करके आपको संदेश भेज सकते हैं, ताकि आपको अपना फोन नंबर न देना पड़े। प्रोफ़ाइल नाम यूज़रनेम हमारे बारे में @@ -1965,9 +1965,9 @@ Signal कनेक्शन - + सत्यापित - + No direct messages with %1$s %1$s आपके सिस्टम संपर्कों में है @@ -2301,7 +2301,7 @@ यूज़रनेम अमान्य है। यूज़रनेम %1$d और %2$d वर्णों के बीच होना चाहिए। - यूज़रनेम से अन्य लोग बिना आपके फोन नंबर के, आपको संदेश भेज सकते हैं। वे कुछ अंकों के समूह में होते हैं ताकि आपको अपना पता निजी रखने में मदद मिल सके। + Usernames are always paired with a set of numbers. यह नंबर क्या है? यह अंक आपको अपना यूज़रनेम निजी रखने में मदद करते हैं ताकि आप अवांछित संदेशों से बच सकें। अपना यूज़रनेम केवल उन लोगों और ग्रुप्स के साथ शेयर करें जिनके साथ आप चैट करना चाहते हैं। यदि आप अपना यूज़रनेम बदलते हैं तो आपको अंकों का एक नया सेट मिलेगा। @@ -2322,9 +2322,9 @@ आपके यूज़रनेम को रिकवर करने से आपका मौजूदा QR कोड और लिंक फिर से स्थापित हो जाएगा। क्या आपको यकीन है? - + आपका यूज़रनेम बदलने से आपका मौजूदा QR कोड और लिंक फिर से स्थापित हो जाएगा। क्या आपको यकीन है? - + जारी रखें %1$d संपर्क सिग्नल पर है! @@ -4124,8 +4124,10 @@ \"%1$s\" को अनब्लॉक किया गया है। - सदस्यों की समीक्षा करें - निवेदन की समीक्षा करें + + Review members + + Review request %1$d समूह सदस्यों के एक ही नाम हैं, नीचे दिए गए सदस्यों की समीक्षा करें और कार्रवाई का चुनाव करें। अगर आप इस निवेदन को भेजने वाले के बारे में निश्चित नहीं हों, तो निचे दिए गए संपर्कों की समीक्षा करें और कार्रवाई करें। कोई दूसरा साझा समूह नहीं @@ -6184,13 +6186,13 @@ अधिक जानें - + जुड़ने के नए तरीके - + फ़ोन नंबर गोपनीयता, वैकल्पिक यूज़रनेम और लिंक का परिचय। - + हटाएँ - + अधिक जानें @@ -6490,9 +6492,9 @@ आपके लिंक को फिर से स्थापित करते समय एक नेटवर्क त्रुटि उत्पन्न हुई। बाद में पुन: प्रयास करें। - + An unexpected error occurred while trying to reset your link. Try again later. - + आपका QR कोड और लिंक फिर से स्थापित कर दिया गया है और एक नया QR कोड और लिंक बनाया गया है। Signal पर मुझसे चैट करने के लिए इस QR कोड को अपने फोन से स्कैन करें। @@ -6563,7 +6565,7 @@ फोन नंबर - अंकों के जोड़े के साथ पूरा यूज़रनेम दर्ज करें। + Enter a username followed by a dot and its set of numbers. अगला diff --git a/app/src/main/res/values-hr/strings.xml b/app/src/main/res/values-hr/strings.xml index 4fe3e90764..94c5ec2e51 100644 --- a/app/src/main/res/values-hr/strings.xml +++ b/app/src/main/res/values-hr/strings.xml @@ -512,8 +512,8 @@ U ovom razgovoru možete dodati osobne bilješke. Ako vaš račun ima povezane uređaje, nove će se bilješke sinkronizirati. %1$d člana/ova grupe imaju isto ime. Pritisnite za pregled - Pažljivo pregledajte zahtjeve - Molly je pronašao drugi kontakt s istim imenom. + + This person has the same name as another contact Kontaktirajte nas Potvrdi Ne sada @@ -1134,7 +1134,7 @@ Vaše korisničko ime, QR kôd i poveznica ne prikazuju se na vašem profilu. Dijelite svoje korisničko ime samo s osobama kojima vjerujete. - + Drugi vam sada mogu slati poruke putem vašeg korisničkog imena, koje nije obavezno, tako da više ne morate dijeliti svoj broj telefona. Ime profila Korisničko ime Opis @@ -2113,9 +2113,9 @@ Signal kontakt - + Provjereno - + No direct messages with %1$s %1$s je u kontaktima vašeg sustava @@ -2461,7 +2461,7 @@ Korisničko ime nije važeće. Korisnička imena moraju imati između %1$d i %2$d znakova. - Korisnička imena omogućuju drugima da vam šalju poruke bez potrebe za vašim brojem telefona. Ona su uparena sa skupom znamenki kako bi vaša adresa ostala tajna. + Usernames are always paired with a set of numbers. Čemu služi ovaj broj? Ove znamenke čuvaju privatnost vašeg korisničkog imena kako bi se izbjeglo primanje neželjenih poruka. Podijelite svoje korisničko ime samo s osobama i grupama s kojima želite razgovarati. Ako promijenite korisničko ime, dobit ćete novi skup znamenki. @@ -2482,9 +2482,9 @@ Oporavak vašeg korisničkog imena poništit će vaš trenutni QR kôd i poveznicu. Sigurno želite nastaviti? - + Promjenom korisničkog imena poništit ćete svoj trenutni QR kôd i poveznicu. Sigurno želite nastaviti? - + Nastavi %1$d kontakt je na Signalu! @@ -4336,8 +4336,10 @@ Korisnik \"%1$s\" je odblokiran. - Pregled članova - Pregled zahtjeva + + Review members + + Review request %1$d člana/ova grupe imaju isto ime, pregledajte članove u nastavku i odaberite poduzeti radnju. Ako niste sigurni od koga je zahtjev, pregledajte kontakte u nastavku i poduzmite radnje. Nema drugih zajedničkih grupa. @@ -6460,13 +6462,13 @@ Saznajte više - + Novi načini povezivanja - + Predstavljamo privatnost telefonskog broja, izborna korisnička imena i poveznice. - + Odbaci - + Saznajte više @@ -6772,9 +6774,9 @@ Došlo je do mrežne pogreške prilikom poništavanja poveznice. Pokušajte ponovno kasnije. - + An unexpected error occurred while trying to reset your link. Try again later. - + Vaši prethodni QR kôd i poveznica su poništeni te su stvoreni novi QR kôd i poveznica. Skeniraj ovaj QR kôd svojim uređajem i započni razgovor sa mnom na Signalu. @@ -6849,7 +6851,7 @@ Broj telefona - Unesite puno korisničko ime s pripadajućim parom znamenki. + Enter a username followed by a dot and its set of numbers. Sljedeće diff --git a/app/src/main/res/values-hu/strings.xml b/app/src/main/res/values-hu/strings.xml index 9846af1ae2..939c7e503f 100644 --- a/app/src/main/res/values-hu/strings.xml +++ b/app/src/main/res/values-hu/strings.xml @@ -494,8 +494,8 @@ Ebben a csevegésben magadnak hagyhatsz jegyzeteket. Ha a fiókodat más társított eszközökkel is használod, a jegyzetek azokra is átszinkronizálásra kerülnek. A csoport %1$d tagjának megegyezik a neve. Koppints az áttekintéshez - Gondosan nézd át a kéréseket - A Molly talált egy másik, azonos nevű kontaktot. + + This person has the same name as another contact Kapcsolat Hitelesítés Később @@ -1064,7 +1064,7 @@ A felhasználóneved, a QR-kódod és a hivatkozásod nem látható a profilodban. Csak olyanokkal oszd meg a felhasználónevedet, akikben megbízol. - + Az emberek mostantól üzenetet küldhetnek neked az opcionális felhasználóneveden keresztül, így nem kell megadnod a telefonszámodat. Profilnév Felhasználónév Névjegy @@ -1965,9 +1965,9 @@ Signal Névjegy - + Megerősítve - + No direct messages with %1$s %1$s szerepel a rendszernévjegyeid között @@ -2301,7 +2301,7 @@ A felhasználónév érvénytelen. A felhasználóneveknek %1$d és %2$d db karakter közé kell esniük. - A felhasználónevek segítségével mások üzenetet küldhetnek neked anélkül, hogy szükségük lenne a telefonszámodra. Számjegyekkel vannak párosítva, hogy segítsenek megőrizni a címed privát jellegét. + Usernames are always paired with a set of numbers. Mi ez a szám? Ezek a számok segítenek megőrizni a felhasználóneved privát jellegét, hogy elkerüld a nem kívánt üzeneteket. Csak azokkal az emberekkel és csoportokkal oszd meg a felhasználóneved, akikkel csevegni szeretnél. Ha módosítod a felhasználóneved, új számsort kapsz. @@ -2322,9 +2322,9 @@ A felhasználónév helyreállítása visszaállítja a meglévő QR-kódot és hivatkozást. Biztos vagy benne? - + A felhasználónév módosítása visszaállítja a meglévő QR-kódot és hivatkozást. Biztos vagy benne? - + Tovább %1$d ismerős már elérhető Signalon! @@ -4124,8 +4124,10 @@ „%1$s” letiltása feloldva. - Tagok áttekintése - Kérések áttekintése + + Review members + + Review request %1$d csoporttagnak ugyanaz a neve. Tekintsd át a listájukat, és dönts a továbbiakról! Ha nem vagy benne biztos, hogy kitől is érkezett a kérés, akkor tekintsd át az alábbi kontaktokat döntés előtt! Nincs egyéb közös csoportotok. @@ -6184,13 +6186,13 @@ Tudj meg többet - + Új csatlakozási módok - + Bemutatjuk a telefonszám-védelmet, az opcionális felhasználóneveket és a linkeket. - + Elvetés - + Tudj meg többet @@ -6490,9 +6492,9 @@ Hálózati hiba lépett fel a hivatkozás visszaállítása közben. Próbáld újra később! - + An unexpected error occurred while trying to reset your link. Try again later. - + A QR-kódod és a hivatkozásod visszaállításra került, és egy új QR-kódot és linket hoztunk létre. Olvasd be ezt a QR-kódot a telefonoddal és csevegj velem a Signalban. @@ -6563,7 +6565,7 @@ Telefonszám - Add meg a teljes felhasználónevedet a számjegypárral együtt. + Enter a username followed by a dot and its set of numbers. Tovább diff --git a/app/src/main/res/values-in/strings.xml b/app/src/main/res/values-in/strings.xml index 0d5dff170d..09887512ad 100644 --- a/app/src/main/res/values-in/strings.xml +++ b/app/src/main/res/values-in/strings.xml @@ -485,8 +485,8 @@ Anda dapat menambahkan catatan untuk diri sendiri dalam obrolan ini. Jika akun Anda terhubung ke perangkat lain, catatan baru akan disinkronkan. %1$d anggota grup memiliki nama yang sama. Ketuk untuk meninjau - Tinjau permintaan dengan hati-hati - Molly menemukan kontak lain dengan nama yang sama. + + This person has the same name as another contact Hubungi kami Verifikasi Nanti saja @@ -1029,7 +1029,7 @@ Nama pengguna, kode QR, dan tautan Anda tidak terlihat di profil. Hanya bagikan nama pengguna ke orang yang Anda percayai. - + Orang lain kini bisa mengirimi Anda pesan lewat nama pengguna opsional, sehingga tidak perlu memberikan nomor telepon. Nama profil Nama Pengguna Tentang @@ -1891,9 +1891,9 @@ Koneksi Signal - + Terverifikasi - + No direct messages with %1$s %1$s ada di kontak sistem Anda @@ -2221,7 +2221,7 @@ Nama pengguna tidak valid. Nama pengguna harus terdiri antara %1$d dan %2$d karakter. - Dengan nama pengguna, orang lain dapat mengirimi Anda pesan tanpa memerlukan nomor telepon Anda. Nama pengguna dipasangkan dengan serangkaian angka untuk membantu memastikan alamat Anda tetap privat. + Usernames are always paired with a set of numbers. Nomor apa ini? Angka ini membantu memastikan nama pengguna Anda tetap privat dan mencegah pesan yang tidak diinginkan. Bagikan nama pengguna Anda hanya dengan orang dan grup yang diinginkan. Jika mengganti nama pengguna, Anda akan mendapatkan serangkaian angka baru. @@ -2242,9 +2242,9 @@ Jika nama pengguna Anda dipulihkan, kode QR dan tautan yang ada akan direset. Anda yakin? - + Jika Anda mengubah nama pengguna, tautan dan kode QR yang ada akan direset. Anda yakin? - + Lanjutkan %1$d kontak ada di Signal! @@ -4018,8 +4018,10 @@ Blokir \"%1$s\" telah dibuka. - Tinjau Anggota - Tinjau Permintaan + + Review members + + Review request %1$danggota grup memiliki nama yang sama, tinjau anggota-anggota di bawah dan pilih tindakan. Jika anda tidak yakin dari mana permintaannya berasal, tinjau kontak-kontak dibawah dan ambil tindakan. Tidak ada grup lain yang sama. @@ -6046,13 +6048,13 @@ Pelajari selengkapnya - + Cara baru untuk terhubung - + Memperkenalkan privasi nomor telepon, nama pengguna opsional, dan tautan. - + Tutup - + Pelajari selengkapnya @@ -6349,9 +6351,9 @@ Terjadi kesalahan jaringan saat mencoba mereset tautan. Coba lagi nanti. - + An unexpected error occurred while trying to reset your link. Try again later. - + Kode QR dan tautan Anda telah direset dan kode QR serta tautan baru telah dibuat. Pindai kode QR ini dengan ponsel untuk mengobrol dengan saya di Signal. @@ -6420,7 +6422,7 @@ Nomor telepon - Masukkan nama pengguna lengkap dengan set digit angka pasangannya. + Enter a username followed by a dot and its set of numbers. Berikutnya diff --git a/app/src/main/res/values-it/strings.xml b/app/src/main/res/values-it/strings.xml index 6f52db855b..53a9c7b76c 100644 --- a/app/src/main/res/values-it/strings.xml +++ b/app/src/main/res/values-it/strings.xml @@ -494,8 +494,8 @@ Puoi aggiungere note per te stesso in questa chat. Se il tuo account ha dei dispositivi collegati, le nuove note verranno sincronizzate. %1$d membri del gruppo hanno lo stesso nome. Tocca per controllare - Controlla attentamente le richieste - Molly ha trovato un altro contatto con lo stesso nome. + + This person has the same name as another contact Contattaci Verifica Non ora @@ -1064,7 +1064,7 @@ Il tuo nome utente, codice QR e link non sono visibili sul tuo profilo. Condividi il tuo nome utente solo con le persone di cui ti fidi. - + Da ora le persone possono mandarti messaggi conoscendo solo il tuo nome utente (che è opzionale). Perciò non devi più dare il tuo numero di telefono se non vuoi. Nome profilo Nome utente Info @@ -1965,9 +1965,9 @@ Amicizia di Signal - + Verificato - + No direct messages with %1$s %1$s è tra i contatti del tuo telefono @@ -2301,7 +2301,7 @@ Il nome utente non è valido. I nomi utente devono contenere da %1$d a %2$d caratteri. - Usando un nome utente, una persona può chattare con te senza bisogno di conoscere il tuo numero di telefono. I nomi utente vengono combinati con una serie di numeri per aumentare il livello di privacy. + Usernames are always paired with a set of numbers. Cosa rappresenta questo numero? Questi numeri aiutano a proteggere la privacy del tuo nome utente, così puoi evitare di ricevere messaggi non desiderati. Ti consigliamo di condividere il tuo nome utente solamente con le persone e i gruppi con cui vuoi chattare su Signal. Se cambi il nome utente, riceverai una nuova serie di numeri. @@ -2322,9 +2322,9 @@ Se ripristini il tuo nome utente, il tuo codice QR e link attuali verranno modificati. Vuoi procedere comunque? - + Se cambi il tuo nome utente, il tuo codice QR e il link verranno resettati. Vuoi procedere comunque? - + Continua %1$d contatto è su Signal! @@ -4124,8 +4124,10 @@ L\'utente \"%1$s\" è stato sbloccato. - Controlla membri - Controlla richieste + + Review members + + Review request %1$d membri del gruppo hanno lo stesso nome, controlla i membri di seguito e scegli di agire. Se non sei sicuro della provenienza della richiesta, controlla i contatti di seguito e agisci. Nessun altro gruppo in comune. @@ -6184,13 +6186,13 @@ Scopri di più - + Più privacy, più contatti - + Privacy del numero, nomi utente, codici QR e link: scopri le novità! - + Chiudi - + Scopri di più @@ -6490,9 +6492,9 @@ Si è verificato un errore con la connessione durante il reset del tuo link. Riprova più tardi. - + An unexpected error occurred while trying to reset your link. Try again later. - + Il tuo codice QR e link sono stati resettati e ne abbiamo creati di nuovi. Scansiona questo codice QR con il tuo telefono per chattare con me su Signal. @@ -6563,7 +6565,7 @@ Numero di telefono - Inserisci un nome utente completo con la coppia di cifre corrispondente. + Enter a username followed by a dot and its set of numbers. Avanti diff --git a/app/src/main/res/values-iw/strings.xml b/app/src/main/res/values-iw/strings.xml index f4b68cfc6a..e249f5d5bb 100644 --- a/app/src/main/res/values-iw/strings.xml +++ b/app/src/main/res/values-iw/strings.xml @@ -512,8 +512,8 @@ אפשר להוסיף הערות לעצמך בצ\'אט זה. אם מקושרים לחשבון שלך מכשירים כלשהם, הערות חדשות יסונכרנו. אל %1$d חברי קבוצה יש אותו שם. הקש כדי לסקור - סקור בקשות בזהירות - Molly מצא איש קשר אחר עם אותו שם. + + This person has the same name as another contact צור קשר וודא לא עכשיו @@ -1134,7 +1134,7 @@ שם המשתמש, קוד ה–QR והלינק שלך לא גלויים בפרופיל שלך. כדאי לשתף את שם המשתמש שלך רק עם אנשים שבוטחים בהם. - + אנשים יכולים לשלוח לך הודעות באמצעות שם המשתמש האופציונלי שלך, כך שכבר אין צורך לתת את מספר הטלפון שלך. שם פרופיל שם משתמש אודות @@ -2113,9 +2113,9 @@ חבר/ת Signal - + מוודא - + No direct messages with %1$s %1$s נמצא/ת באנשי הקשר של המערכת שלך @@ -2461,7 +2461,7 @@ שם משתמש לא חוקי. שמות משתמש חייבים להיות בין %1$d לבין %2$d תווים. - שמות משתמש מאפשרים לאחרים לשלוח לך הודעה בלי להזדקק למספר הטלפון שלך. הם מוצמדים לסט של ספרות כדי לעזור לשמור על פרטיות הכתובת שלך. + Usernames are always paired with a set of numbers. מה המספר הזה? הספרות האלה עוזרות לשמור על שם המשתמש שלך פרטי, כדי להימנע מהודעות לא רצויות. זה מאפשר לך לשתף את שם המשתמש שלך רק עם אנשים וקבוצות שמתחשק לך לשוחח איתם. אם משנים את שם המשתמש, מקבלים סט חדש של ספרות. @@ -2482,9 +2482,9 @@ שחזור שם המשתמש שלך יאפס את קוד ה–QR והלינק הקיימים שלך. להמשיך? - + שינוי שם המשתמש שלך יאפס את קוד ה–QR והלינק הקיימים שלך. להמשיך? - + המשך איש קשר %1$d ב־Signal! @@ -4336,8 +4336,10 @@ החסימה של \"%1$s\" בוטלה. - סקור חברי קבוצה - סקור בקשה + + Review members + + Review request אל %1$d חברי קבוצה יש אותו שם, סקור את חברי הקבוצה למטה ובחר לנקוט בפעולה. אם אינך בטוח ממי הבקשה, סקור את חברי הקבוצה למטה ונקוט בפעולה. אין קבוצות אחרות במשותף. @@ -6460,13 +6462,13 @@ למידע נוסף - + דרכים חדשות להתחבר - + מעכשיו פרטיות מספר טלפון, שמות משתמש אופציונליים ולינקים. - + ביטול - + למידע נוסף @@ -6772,9 +6774,9 @@ שגיאת רשת התרחשה בעת הניסיון לאפס את הלינק שלך. יש לנסות שוב מאוחר יותר. - + An unexpected error occurred while trying to reset your link. Try again later. - + קוד ה–QR והלינק שלך אופסו ונוצרו קוד QR ולינק חדשים. אפשר לסרוק את קוד ה–QR הזה עם הטלפון שלך כדי לשוחח איתי ב–Signal. @@ -6849,7 +6851,7 @@ מספר טלפון - יש להזין שם משתמש מלא עם צמד הספרות שלו. + Enter a username followed by a dot and its set of numbers. הבא diff --git a/app/src/main/res/values-ja/strings.xml b/app/src/main/res/values-ja/strings.xml index f798cd4251..315a36591b 100644 --- a/app/src/main/res/values-ja/strings.xml +++ b/app/src/main/res/values-ja/strings.xml @@ -485,8 +485,8 @@ このチャットに自分用のメモを追加できます。新規のメモはリンク済み端末にも同期されます。 %1$d人のグループメンバーが同じ名前です。 タップして確認 - 慎重に申請を確認してください - Mollyは同じ名前で別の連絡先を見つけました。 + + This person has the same name as another contact お問い合わせ 検証する 今はしない @@ -1029,7 +1029,7 @@ ユーザーネーム、QRコード、リンクはプロフィールに表示されません。ユーザーネームは信頼できる人とのみ共有してください。 - + オプションのユーザーネームを使ってメッセージを送れるようになったので、電話番号を教える必要はありません。 プロフィールネーム ユーザーネーム 自己紹介 @@ -1891,9 +1891,9 @@ Signalコネクション - + 検証済み - + No direct messages with %1$s %1$s はシステムの連絡先に含まれています @@ -2221,7 +2221,7 @@ 無効なユーザーネームです。 ユーザーネームは%1$dから%2$d文字にしてください。 - ユーザーネームを使用すると、電話番号なしでメッセージを送れます。ユーザーネームは、一連の数字と対になっているのでアドレスを非公開にすることができます。 + Usernames are always paired with a set of numbers. この数字は何ですか? これらの数字は、ユーザーネームを非公開にし、不要なメッセージを避けるのに役立ちます。ユーザーネームは、チャットをしたい人やグループとだけ共有してください。ユーザーネームを変更すると、新しい数字と対になります。 @@ -2242,9 +2242,9 @@ ユーザーネームを復元すると、これまでのQRコードとリンクがリセットされます。本当に復元しますか? - + ユーザーネームを変更すると、これまでのQRコードとリンクがリセットされます。本当に変更しますか? - + 続行 %1$d件の連絡先がSignalを使用しています! @@ -4018,8 +4018,10 @@ 「%1$s」ブロックは解除されました。 - メンバーを確認してください - 申請の確認 + + Review members + + Review request %1$d人のグループメンバーが同じ名前です。以下のメンバーを確認して、対応してください。 この申請者が誰であるか不確かな場合、以下の連絡先を確認して対応してください。 他の共通のグループはありません @@ -6046,13 +6048,13 @@ 詳しく見る - + つながる新しい選択肢 - + 電話番号保護、オプションのユーザーネーム、リンクについてご紹介します。 - + キャンセル - + 詳しく見る @@ -6349,9 +6351,9 @@ リンクのリセット中にネットワークエラーが発生しました。あとで再度試してください。 - + An unexpected error occurred while trying to reset your link. Try again later. - + QRコードとリンクがリセットされ、新しいQRコードとリンクが作成されました。 このQRコードをお使いの携帯電話でスキャンして、Signalで私とチャットしましょう。 @@ -6420,7 +6422,7 @@ 電話番号 - 完全なユーザーネームと、対応する数字のペアを入力してください。 + Enter a username followed by a dot and its set of numbers. 次へ diff --git a/app/src/main/res/values-ka/strings.xml b/app/src/main/res/values-ka/strings.xml index 0979bb19bb..44ec035e8c 100644 --- a/app/src/main/res/values-ka/strings.xml +++ b/app/src/main/res/values-ka/strings.xml @@ -494,8 +494,8 @@ შეგიძლია ამ ჩატში შენი თავისთვის ჩანიშვნები დაამატო. თუ შენს პროფილს რაიმე მოწყობილობა აქვს მიბმული, ახალი შენიშვნები სინქრონიზდება. ჯგუფში %1$d სეხნიაა. დააჭირე, რათა გადახედო - ყურადღებით გადახედე მოთხოვნებს - Molly-მა სხვა კონტაქტიც იპოვა იმავე სახელით. + + This person has the same name as another contact დაგვიკავშირდი ვერიფიკაცია ახლა არა @@ -1064,7 +1064,7 @@ შენი მომხმარებლის სახელი, QR კოდი და ბმული შენს პროფილზე არ ჩანს. შენი მომხმარებლის სახელი მხოლოდ მათ გაუზიარე, ვისაც ენდობი. - + ხალხს ახლა უკვე შეუძლია შენი ნებაყოფლობითი მომხმარებლის სახელის დახმარებით მოგწეროს, რომ შენი მობილურის ნომრის გაცემა არ დაგჭირდეს. პროფილის სახელი მომხმარებლის სახელი აღწერილობა @@ -1965,9 +1965,9 @@ Signal-ის კონტაქტები - + ვერიფიცირებულია - + No direct messages with %1$s %1$s შენი სისტემის კონტაქტებშია @@ -2301,7 +2301,7 @@ მომხარებლის სახელი არასწორია. მომხმარებლის სახელი უნდა შეიცავდეს %1$d-დან %2$d-მდე სიმბოლოს. - მომხმარებლის სახელი საშუალებას აძლევს სხვებს გამოგიგზავნონ შეტყობინება შენი ტელეფონის ნომრის გარეშე. ისინი დაკავშირებულია ციფრების ნაკრებით, რათა შევძლოთ შენი მისამართის კონფიდენციალურად შენარჩუნება. + Usernames are always paired with a set of numbers. ეს რა ნომერია? ეს ციფრები დაგეხმარება შეინახო შენი მომხმარებლის სახელი კონფიდენციალურად, რათა თავიდან აიცილო არასასურველი შეტყობინებები. შენი მომხმარებლის სახელი მხოლოდ იმ ადამიანებსა და ჯგუფებს გაუზიარე, რომლებთანაც საუბარი გსურს. თუ მომხმარებლის სახელს შეცვლი, ციფრების ახალ კომბინაციას მიიღებ. @@ -2322,9 +2322,9 @@ შენი მომხმარებლის სახელის აღდგენა შენს ამჟამინდელ QR კოდსა და ბმულს შეცვლის. დარწმუნებული ხარ? - + შენი მომხმარებლის სახელის შეცვლა არსებულ QR კოდსა და ბმულს განაახლებს. დარწმუნებული ხარ? - + გაგრძელება %1$d კონტაქტი Signal-ზეა! @@ -4124,8 +4124,10 @@ \"%1$s\" განბლოკილია. - წევრების გადახედვა - მოთხოვნის განხილვა + + Review members + + Review request ჯგუფის %1$d წევრს აქვს იგივე სახელი, გადახედე ქვემოთ მოცემულ წევრებს და აირჩიე მოქმედება. თუ არ ხარ დარწმუნებული, ვისგან არის მოთხოვნა, გადახედე ქვემოთ მოცემულ კონტაქტებს და მიიღე ზომები. არცერთი სხვა საერთო ჯგუფი. @@ -6184,13 +6186,13 @@ გაიგე მეტი - + დაკავშირების ახალი გზები - + წარმოგიდგენთ მობილურის ნომრის კონფიდენციალურობას, მომხმარებლის სახელების ნებაყოფლობითობასა და ბმულებს. - + გაუქმება - + გაიგე მეტი @@ -6490,9 +6492,9 @@ შენი ბმულის ახლიდან დაყენებისას ქსელის ხარვეზი დაფიქსირდა. მოგვიანებით სცადე. - + An unexpected error occurred while trying to reset your link. Try again later. - + შენი QR კოდი და ბმული შეიცვალა და შეიქმნა ახალი QR კოდი და ბმული. Signal-ზე ჩემთან მიმოწერის დასაწყებად შენი მობილურით ეს QR კოდი დაასკანირე @@ -6563,7 +6565,7 @@ ტელეფონის ნომერი - შეიყვანე მომხმარებლის სრული სახელი მისი ორი ციფრის ჩათვლით. + Enter a username followed by a dot and its set of numbers. შემდეგი diff --git a/app/src/main/res/values-kk/strings.xml b/app/src/main/res/values-kk/strings.xml index beeee3d8dc..201c2163ba 100644 --- a/app/src/main/res/values-kk/strings.xml +++ b/app/src/main/res/values-kk/strings.xml @@ -494,8 +494,8 @@ Бұл чатта өзіңізге ескертпелер қоса аласыз. Егер аккаунтыңызда қандай да бір байланыстырылған құрылғы болса, жаңа ескертпелер синхрондалады. %1$d топ мүшесінің аты бірдей. Көру үшін түртіңіз - Өтініштерді мұқият қарап шығыңыз - Molly аты дәл осындай тағы бір адамды тапты. + + This person has the same name as another contact Байланыс мәліметі Тексеру Кейін @@ -1064,7 +1064,7 @@ Профиліңізде пайдаланушы атыңыз, QR кодыңыз және сілтемеңіз көрсетілмейді. Пайдаланушы атыңызды сенімді адамдарға ғана беріңіз. - + Енді адамдар сізге қосымша пайдаланушы атыңызға жаза алады, сондықтан телефон нөміріңізді берудің қажеті жоқ. Профиль атауы Пайдаланушы аты Мағлұмат @@ -1965,9 +1965,9 @@ Signal контактісі - + Тексерілді - + No direct messages with %1$s %1$s сіздің жүйелік контактілеріңізде бар @@ -2301,7 +2301,7 @@ Пайдаланушы аты дұрыс емес. Пайдаланушы аттары %1$d және %2$d таңба аралығында болуы керек. - Басқа адамдарда сіздің телефон нөміріңіз болмаса да, олар сізге пайдаланушы атыңыз арқылы жаза алады. Мекенжайыңыздың құпия болуы үшін, олар цифрлар жинағының көмегімен жұпталған. + Usernames are always paired with a set of numbers. Бұл қандай нөмір? Бұл цифрлар пайдаланушы атыңызды құпия сақтайды, соның арқасында қажетсіз хаттар алмайсыз. Пайдаланушы атыңызды тек сөйлескіңіз келетін адамдармен және топтармен бөлісіңіз. Пайдаланушы атыңызды өзгертсеңіз, сізге жаңа цифрлар жинағы беріледі. @@ -2322,9 +2322,9 @@ Пайдаланушы атыңызды қалпына келтірсеңіз, бұрынғы QR кодыңыз бен сілтемеңіз де қайта орнатылады. Сенімдісіз бе? - + Пайдаланушы атын өзгертсеңіз, ескі QR кодыңыз бен сілтемеңіз қалпына келтіріледі. Сенімдісіз бе? - + Жалғастыру Signal-да %1$d контакт бар! @@ -4124,8 +4124,10 @@ \"%1$s\" блоктан шығарылды. - Мүшелерді қарап шығу - Өтінішті қарап шығу + + Review members + + Review request %1$d топ мүшесінің аттары бірдей, төмендегі топ мүшелерін қарап шығып, тиісті шара қолданыңыз. Бұл өтініштің кімнен келгенін біле алмасаңыз, төмендегі контактілерді қарап шығып, тиісті шара қолданыңыз. Басқа ортақ топтар жоқ. @@ -6184,13 +6186,13 @@ Толық ақпарат - + Байланыс орнатудың жаңа жолдары - + Телефон нөміріне қатысты құпиялылық, қосымша пайдаланушы аттары және сілтемелер. - + Жабу - + Толық ақпарат @@ -6490,9 +6492,9 @@ Сілтемені қалпына келтіріп жатқанда желі қатесі пайда болды. Кейінірек қайталап көріңіз. - + An unexpected error occurred while trying to reset your link. Try again later. - + QR кодыңыз бен сілтемеңіз қалпына келтірілді және жаңа QR коды мен сілтеме жасалды. Телефоныңызбен мына QR кодын сканерлеп, Signal-да менімен чат арқылы сөйлесіңіз. @@ -6563,7 +6565,7 @@ Телефон нөмірі - Толық пайдаланушы атын цифрлар жұбымен енгізіңіз. + Enter a username followed by a dot and its set of numbers. Келесі diff --git a/app/src/main/res/values-km/strings.xml b/app/src/main/res/values-km/strings.xml index 05aabe7567..bbbcca808b 100644 --- a/app/src/main/res/values-km/strings.xml +++ b/app/src/main/res/values-km/strings.xml @@ -485,8 +485,8 @@ អ្នកអាចកត់ត្រាសម្រាប់ខ្លួនឯងនៅក្នុងការជជែកនេះ។ បើគណនីរបស់អ្នកបានភ្ជាប់ទៅឧបករណ៍ណាមួយ កំណត់សម្គាល់ថ្មីៗនឹងត្រូវបានធ្វើសមកាលកម្ម។ %1$d សមាជិកក្រុមមានឈ្មោះដូចគ្នា។ ចុច ដើម្បីមើល - ពិនិត្យការស្នើសុំដោយប្រុងប្រយ័ត្ន - Molly បានរកឃើញឈ្មោះទំនាក់ទំនងផ្សេងទៀត ដែលមានឈ្មោះដូចគ្នា។ + + This person has the same name as another contact ទាក់ទងយើង ផ្ទៀងផ្ទាត់ ពេលក្រោយ @@ -1029,7 +1029,7 @@ ឈ្មោះអ្នកប្រើ កូដ QR និងតំណរបស់អ្នកមិនអាចមើលឃើញនៅលើប្រូហ្វាល់របស់អ្នកទេ។ សូមចែករំលែកឈ្មោះអ្នកប្រើរបស់អ្នកជាមួយមនុស្សដែលអ្នកទុកចិត្តប៉ុណ្ណោះ។ - + ឥឡូវនេះ អ្នកផ្សេងអាចផ្ញើសារមកអ្នក ដោយប្រើប្រាស់ឈ្មោះអ្នកប្រើតាមជម្រើសរបស់អ្នក ដូច្នេះអ្នកមិនចាំបាច់ផ្តល់លេខទូរសព្ទរបស់អ្នកទេ។ ឈ្មោះប្រវត្តិរូប ឈ្មោះអ្នកប្រើ អំពី @@ -1891,9 +1891,9 @@ អ្នកភ្ជាប់ទំនាក់ទំនងក្នុង Signal - + បានផ្ទៀងផ្ទាត់ - + No direct messages with %1$s %1$s ស្ថិតនៅក្នុងប្រព័ន្ធទំនាក់ទំនងរបស់អ្នក @@ -2221,7 +2221,7 @@ ឈ្មោះអ្នកប្រើមិនត្រឹមត្រូវទេ។ ឈ្មោះអ្នកប្រើត្រូវតែនៅចន្លោះតួអក្សរ %1$d និង %2$d។ - ឈ្មោះអ្នកប្រើអនុញ្ញាតឱ្យអ្នកដទៃផ្ញើសារមកអ្នកដោយមិនត្រូវការលេខទូរសព្ទរបស់អ្នក។ ពួកវាត្រូវបានផ្គូផ្គងជាមួយនឹងសំណុំលេខដើម្បីជួយរក្សាអាសយដ្ឋានរបស់អ្នកជាឯកជន។ + Usernames are always paired with a set of numbers. តើលេខនេះគឺជាអ្វីទៅ? លេខទាំងនេះជួយរក្សាឈ្មោះអ្នកប្រើរបស់អ្នកជាឯកជន ដើម្បីឲ្យអ្នកអាចជៀសវាងសារ​ដែលមិនចង់បាន។ សូមចែករំលែកឈ្មោះអ្នកប្រើរបស់អ្នកតែជាមួយមនុស្ស និងក្រុមដែល​អ្នកចង់ជជែកជាមួយប៉ុណ្ណោះ។ ប្រសិនបើអ្នកប្តូរឈ្មោះអ្នកប្រើ អ្នកនឹងទទួលបានសំណុំលេខថ្មី។ @@ -2242,9 +2242,9 @@ ការស្តារយកឈ្មោះអ្នកប្រើរបស់អ្នកមកវិញនឹងកំណត់ឡើងវិញនូវកូដ QR និងតំណដែលមានស្រាប់របស់អ្នក។ តើអ្នកប្រាកដឬទេ? - + ការផ្លាស់ប្តូរឈ្មោះអ្នកប្រើរបស់អ្នកនឹងកំណត់កូដ QR និងតំណដែលមានស្រាប់របស់អ្នកឡើងវិញ។ តើអ្នកប្រាកដឬទេ? - + បន្ត លេខទំនាក់ទំនង%1$dនៅលើ Signal! @@ -4018,8 +4018,10 @@ \"%1$s\" ត្រូវបានឈប់ទប់ស្កាត់។ - ពិនិត្យមើលសមាជិក - ពិនិត្យមើលសំណើរ + + Review members + + Review request សមាជិកក្រុមចំនួន %1$dមានឈ្មោះដូចគ្នា សូមពិនិត្យសមាជិកក្រុមទាំងអស់ខាងក្រោម ហើយចាត់វិធានការ ប្រសិនបើអ្នកមិនច្បាស់ថាសំណើរនេះមកពីណាទេ សូមពិនិត្យលេខទំនាក់ទំនងនៅខាងក្រោមហើយចាត់វិធានការ មិនមានក្រុមដទៃទៀតរួមគ្នាទេ @@ -6046,13 +6048,13 @@ ស្វែងយល់បន្ថែម - + វិធីថ្មីៗដើម្បីភ្ជាប់ - + សូមណែនាំឯកជនភាពនៃលេខទូរសព្ទ ឈ្មោះអ្នកប្រើតាមជម្រើស និងតំណ។ - + បិទ - + ស្វែងយល់បន្ថែម @@ -6349,9 +6351,9 @@ បញ្ហាបណ្តាញមួយបានកើតឡើង ខណៈពេលព្យាយាមកំណត់តំណរបស់អ្នកឡើងវិញ។ សូមព្យាយាមម្តងទៀតនៅពេលក្រោយ។ - + An unexpected error occurred while trying to reset your link. Try again later. - + កូដ QR និងតំណរបស់អ្នកត្រូវបានកំណត់ឡើងវិញ ហើយកូដ QR និងតំណថ្មីត្រូវបានបង្កើតឡើង។ ស្គែនកូដ QR នេះដោយប្រើទូរសព្ទរបស់អ្នក ដើម្បីជជែកជាមួយខ្ញុំនៅលើ Signal។ @@ -6420,7 +6422,7 @@ លេខទូរសព្ទ - បញ្ចូលឈ្មោះអ្នកប្រើពេញលេញ រួចសញ្ញាចុចមួយនិងលេខពីរខ្ទង់។ + Enter a username followed by a dot and its set of numbers. បន្ទាប់ diff --git a/app/src/main/res/values-kn/strings.xml b/app/src/main/res/values-kn/strings.xml index 6ec03efc7e..f83b041ca3 100644 --- a/app/src/main/res/values-kn/strings.xml +++ b/app/src/main/res/values-kn/strings.xml @@ -494,8 +494,8 @@ ನೀವು ಈ ಚಾಟ್‌ನಲ್ಲಿ ನಿಮಗಾಗಿ ಟಿಪ್ಪಣಿಗಳನ್ನು ಸೇರಿಸಬಹುದು. ನಿಮ್ಮ ಖಾತೆಯು ಯಾವುದೇ ಲಿಂಕ್ ಮಾಡಿದ ಸಾಧನಗಳನ್ನು ಹೊಂದಿದ್ದರೆ, ಹೊಸ ಟಿಪ್ಪಣಿಗಳನ್ನು ಸಿಂಕ್ ಮಾಡಲಾಗುವುದು. %1$d ಗುಂಪು ಸದಸ್ಯರು ಒಂದೇ ಹೆಸರನ್ನು ಹೊಂದಿದ್ದಾರೆ. ಪರೀಕ್ಷಿಸಲು ಇಲ್ಲಿ ಒತ್ತಿ - ವಿನಂತಿಗಳನ್ನು ಕಾಳಜಿಯಿಂದ ಪರಿಶೀಲಿಸಿ - Molly ಒಂದೇ ಹೆಸರಿನ ಇನ್ನೊಂದು ಸಂಪರ್ಕವನ್ನು ಕಂಡುಹಿಡಿಯಿತು + + This person has the same name as another contact ನಮ್ಮನ್ನು ಸಂಪರ್ಕಿಸಿ ದೃಢೀಕರಿಸಿ ಈಗಲ್ಲ @@ -1064,7 +1064,7 @@ ನಿಮ್ಮ ಯೂಸರ್‌ನೇಮ್, QR ಕೋಡ್ ಮತ್ತು ಲಿಂಕ್ ನಿಮ್ಮ ಪ್ರೊಫೈಲ್‌ನಲ್ಲಿ ಗೋಚರಿಸುವುದಿಲ್ಲ. ನೀವು ನಂಬುವ ಜನರೊಂದಿಗೆ ಮಾತ್ರ ನಿಮ್ಮ ಯೂಸರ್‌ನೇಮ್‌ ಅನ್ನು ಹಂಚಿಕೊಳ್ಳಿ. - + ನಿಮ್ಮ ಐಚ್ಛಿಕ ಯೂಸರ್‌ನೇಮ್ ಅನ್ನು ಬಳಸಿಕೊಂಡು ಜನರು ಈಗ ನಿಮಗೆ ಮೆಸೇಜ್ ಅನ್ನು ಕಳುಹಿಸಬಹುದು, ಆಗ ನೀವು ನಿಮ್ಮ ಫೋನ್ ಸಂಖ್ಯೆಯನ್ನು ನೀಡಬೇಕಾಗಿಲ್ಲ. ಪ್ರೊಫೈಲ್ ಹೆಸರು ಯೂಸರ್ ನೇಮ್ ಬಗ್ಗೆ @@ -1965,9 +1965,9 @@ Signal ಸಂಪರ್ಕ - + ದೃಢೀಕರಿಸಲಾಗಿದೆ - + No direct messages with %1$s %1$s ಅವರು ನಿಮ್ಮ ಸಿಸ್ಟಂ ಸಂಪರ್ಕಗಳಲ್ಲಿದ್ದಾರೆ @@ -2301,7 +2301,7 @@ ಯೂಸರ್ ನೇಮ್ ಅಮಾನ್ಯವಾಗಿದೆ. ಯೂಸರ್ ನೇಮ್ ಗಳ %1$d ಮತ್ತು %2$d ಅಕ್ಷರಗಳ ನಡುವೆ ಇರಬೇಕು. - ಯೂಸರ್ ನೇಮ್ ಗಳು ಇತರರಿಗೆ ನಿಮ್ಮ ಫೋನ್ ಸಂಖ್ಯೆಯ ಅಗತ್ಯವಿಲ್ಲದೆ ಮೆಸೇಜ್ ಮಾಡಲು ಅನುಮತಿಸುತ್ತದೆ. ನಿಮ್ಮ ವಿಳಾಸವನ್ನು ಗೌಪ್ಯವಾಗಿ ಇರಿಸುವಂತೆ ಅಂಕಿಗಳ ಸೆಟ್‌ನೊಂದಿಗೆ ಅವುಗಳನ್ನು pair ಮಾಡುತ್ತದೆ. + Usernames are always paired with a set of numbers. ಈ ಸಂಖ್ಯೆ ಏನು? ಈ ಅಂಕಿಗಳು ನಿಮ್ಮ ಯೂಸರ್‌ನೇಮ್ ಅನ್ನು ಗೌಪ್ಯವಾಗಿ ಇರಿಸಲು ಸಹಕರಿಸುತ್ತವೆ. ಇದರಿಂದಾಗಿ ನೀವು ಬೇಡದ ಮೆಸೇಜ್‌ಗಳನ್ನು ತಪ್ಪಿಸಬಹುದು. ನಿಮ್ಮ ಯೂಸರ್‌ನೇಮ್ ಅನ್ನು ನೀವು ಚಾಟ್ ಮಾಡಲು ಬಯಸುವ ಜನರು ಮತ್ತು ಗ್ರೂಪ್‌ಗಳೊಂದಿಗೆ ಮಾತ್ರ ಹಂಚಿಕೊಳ್ಳಿ. ನೀವು ಯೂಸರ್‌ನೇಮ್ ಬದಲಾಯಿಸಿದರೆ, ನೀವು ಹೊಸ ಅಂಕಿಗಳ ಸೆಟ್ ಅನ್ನು ಪಡೆಯುತ್ತೀರಿ. @@ -2322,9 +2322,9 @@ ನಿಮ್ಮ ಯೂಸರ್‌ನೇಮ್ ಅನ್ನು ಮರುಪಡೆಯುವುದು, ನಿಮ್ಮ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ QR ಕೋಡ್ ಮತ್ತು ಲಿಂಕ್ ಅನ್ನು ಮರುಹೊಂದಿಸುತ್ತದೆ. ನಿಮಗೆ ಖಾತ್ರಿಯಿದೆಯೇ? - + ನಿಮ್ಮ ಯೂಸರ್‌ನೇಮ್ ಬದಲಾಯಿಸುವುದರಿಂದ ನಿಮ್ಮ ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ QR ಕೋಡ್ ಮತ್ತು ಲಿಂಕ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲಿದೆ. ನಿಮಗೆ ಖಾತ್ರಿಯಿದೆಯೇ? - + ಮುಂದುವರಿಸಿ %1$d ಸಂಪರ್ಕಗಳು Signal ನಲ್ಲಿವೆ! @@ -4124,8 +4124,10 @@ \"%1$s\" ಅವರ ನಿರ್ಬಂಧ ತೆಗೆಯಲಾಗಿದೆ. - ಸದಸ್ಯರನ್ನು ಪರಿಶೀಲಿಸಿ - ವಿನಂತಿಯನ್ನು ಪರಿಶೀಲಿಸಿ + + Review members + + Review request %1$d ಗುಂಪು ಸದಸ್ಯರು ಒಂದೇ ಹೆಸರನ್ನು ಹೊಂದಿದ್ದಾರೆ, ಕೆಳಗಿನ ಸದಸ್ಯರನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಕ್ರಮ ತೆಗೆದುಕೊಳ್ಳಿರಿ. ವಿನಂತಿ ಯಾರೆಂದು ನಿಮಗೆ ಖಚಿತವಿಲ್ಲದಿದ್ದರೆ, ಕೆಳಗಿನ ಸಂಪರ್ಕಗಳನ್ನು ಪರಿಶೀಲಿಸಿ ಮತ್ತು ಕ್ರಮ ತೆಗೆದುಕೊಳ್ಳಿರಿ. ಬೇರೆ ಯಾವುದೇ ಗುಂಪುಗಳು ಸಾಮಾನ್ಯವಾಗಿಲ್ಲ. @@ -6184,13 +6186,13 @@ ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ - + ಸಂಪರ್ಕಿಸಲು ಹೊಸ ಮಾರ್ಗಗಳು - + ಫೋನ್ ಸಂಖ್ಯೆ ಗೌಪ್ಯತೆ, ಐಚ್ಛಿಕ ಯೂಸರ್‌ನೇಮ್‌ಗಳು ಮತ್ತು ಲಿಂಕ್‌ಗಳನ್ನು ಪರಿಚಯಿಸಲಾಗುತ್ತಿದೆ. - + ವಜಾಗೊಳಿಸಿ - + ಇನ್ನಷ್ಟು ತಿಳಿಯಿರಿ @@ -6490,9 +6492,9 @@ ನಿಮ್ಮ ಲಿಂಕ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲು ಪ್ರಯತ್ನಿಸುವಾಗ ನೆಟ್‌ವರ್ಕ್ ದೋಷ ಸಂಭವಿಸಿದೆ. ನಂತರ ಪುನಃ ಪ್ರಯತ್ನಿಸಿ. - + An unexpected error occurred while trying to reset your link. Try again later. - + ನಿಮ್ಮ QR ಕೋಡ್ ಮತ್ತು ಲಿಂಕ್ ಅನ್ನು ಮರುಹೊಂದಿಸಲಾಗಿದೆ ಮತ್ತು ಹೊಸ QR ಕೋಡ್ ಮತ್ತು ಲಿಂಕ್ ಅನ್ನು ರಚಿಸಲಾಗಿದೆ. Signal ನಲ್ಲಿ ನನ್ನೊಂದಿಗೆ ಚಾಟ್ ಮಾಡಲು ನಿಮ್ಮ ಫೋನ್‌ ಮೂಲಕ ಈ QR ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ. @@ -6563,7 +6565,7 @@ ದೂರವಾಣಿ ಸಂಖ್ಯೆ - ಪೂರ್ಣ ಯೂಸರ್‌ನೇಮ್ ಅನ್ನು ಅದರ ಜೋಡಿ ಅಂಕಿಗಳೊಂದಿಗೆ ನಮೂದಿಸಿ. + Enter a username followed by a dot and its set of numbers. ಮುಂದೆ diff --git a/app/src/main/res/values-ko/strings.xml b/app/src/main/res/values-ko/strings.xml index 27541ee03a..7d8a606e16 100644 --- a/app/src/main/res/values-ko/strings.xml +++ b/app/src/main/res/values-ko/strings.xml @@ -485,8 +485,8 @@ 이 대화에는 나를 위한 메모를 남길 수 있습니다. 내 계정에 연결된 기기가 있다면 새 메모가 같이 동기화됩니다. %1$d명의 그룹 멤버가 이름이 같습니다. 탭하여 검토하세요. - 신중하게 요청을 검토하세요. - Molly이 같은 이름의 다른 연락처를 찾았습니다. + + This person has the same name as another contact 문의하기 검증 나중에 @@ -1029,7 +1029,7 @@ 사용자 이름과 QR 코드, 링크가 프로필에 표시되지 않습니다. 신뢰하는 사람과만 사용자 이름을 공유하세요. - + 이제 나에게 메시지를 보낼 때 선택적 사용자 이름을 사용할 수 있으므로 다른 사람과 전화번호를 공유할 필요가 없습니다. 프로필 이름 사용자 이름 정보 @@ -1891,9 +1891,9 @@ Signal 커넥션 - + 검증함 - + No direct messages with %1$s %1$s 님이 내 기기 연락처에 있습니다. @@ -2221,7 +2221,7 @@ 잘못된 사용자 이름입니다. 사용자 이름은 %1$d~%2$d자여야 합니다. - 사용자 이름을 사용하면 다른 사람들이 내 전화번호 없이도 내게 메시지를 보낼 수 있습니다. 사용자 이름은 사용자의 주소를 비공개로 유지할 수 있도록 일련번호와 함께 짝지어 쓰입니다. + Usernames are always paired with a set of numbers. 이 번호는 무엇인가요? 이 일련번호는 사용자 이름을 비공개로 유지하여 원치 않는 메시지를 피할 수 있도록 도와줍니다. 대화를 원하는 사용자 및 그룹과만 사용자 이름을 공유하세요. 사용자 이름을 변경하면 새로운 일련번호가 부여됩니다. @@ -2242,9 +2242,9 @@ 사용자 이름을 복구하면 기존 QR 코드와 링크가 초기화됩니다. 계속할까요? - + 사용자 이름을 변경하면 기존 QR 코드와 링크가 초기화됩니다. 계속할까요? - + 계속 Signal에 연락처가 %1$d개 있습니다! @@ -4018,8 +4018,10 @@ \'%1$s\' 님을 차단 해제했습니다. - 멤버 검토 - 검토 요청 + + Review members + + Review request %1$d명의 그룹 멤버가 같은 이름을 가지고 있습니다. 아래 멤버를 검토한 후 조치를 취하세요. 요청의 출처가 확실하지 않은 경우 아래 연락처를 검토하고 조치를 취하세요. 공통된 다른 그룹이 없습니다. @@ -6046,13 +6048,13 @@ 자세히 알아보기 - + 새로운 연락 방법 - + 전화번호 개인 정보 보호와 선택적 사용자 이름 및 링크를 소개합니다. - + 취소 - + 자세히 알아보기 @@ -6349,9 +6351,9 @@ 링크를 초기화하는 중에 네트워크 오류가 발생했습니다. 나중에 다시 시도하세요. - + An unexpected error occurred while trying to reset your link. Try again later. - + QR 코드와 링크를 초기화하고 새 QR 코드와 링크를 만들었습니다. Signal에서 나와 대화하려면 휴대전화로 이 QR 코드를 스캔하세요. @@ -6420,7 +6422,7 @@ 전화번호 - 전체 사용자 이름과 해당 이름에 짝지어진 숫자를 함께 입력해 주세요. + Enter a username followed by a dot and its set of numbers. 다음 diff --git a/app/src/main/res/values-ky/strings.xml b/app/src/main/res/values-ky/strings.xml index 0cca5af0de..54d92b53d8 100644 --- a/app/src/main/res/values-ky/strings.xml +++ b/app/src/main/res/values-ky/strings.xml @@ -485,8 +485,8 @@ Бул маекте өзүңүзгө бир нерселерди белгилеп жазып алсаңыз болот. Аккаунтуңузга байланган түзмөктөр бар болсо, жазып алган нерселериңиз алардын баарында көрүнөт. Топтун %1$d катышуучусунун ысымдары бирдей. Басып карап көрүңүз - Сурамдарды этияттап караңыз - Molly ысымы окшош дагы бир байланышты тапты. + + This person has the same name as another contact Биз менен байланышыңыз Ооба Азыр эмес @@ -1029,7 +1029,7 @@ Профилиңизде колдонуучу атыңыз, QR кодуңуз жана шилтемеңиз көрүнбөйт. Колдонуучу атыңызды ишенген адамдарыңыз менен гана бөлүшө аласыз. - + Башкалар менен сүйлөшүүдө өзүңүз каалагандай колдонуучу атты колдонуп, телефон номериңизди жашырып койсоңуз болот. Профилдин аталышы Колдонуучунун аты Учкай маалымат @@ -1891,9 +1891,9 @@ Signal байланышы - + Ырасталды - + No direct messages with %1$s %1$s системаңыздагы байланыштардын бири @@ -2221,7 +2221,7 @@ Колдонуучунун аты туура эмес. Колдонуучунун аты %1$d баштап %2$d чейин белгиден турушу керек. - Адамдар сиз менен телефон номериңиз эмес, колдонуучу атыңыз аркылуу жазыша алышат. Дарегиңизди купуя сактоо үчүн колдонуучу атыңызга бир нече сан кошулат. + Usernames are always paired with a set of numbers. Бул эмне деген сан? Бул сандар колдонуучу атыңызды купуя кылып, сизди кереги жок билдирүүлөрдөн сактайт. Колдонуучу атыңызды сүйлөшкүңүз келген адамдарга жана топторго бериңиз. Колдонуучу атыңызды өзгөртсөңүз, бул сандар да өзгөрөт. @@ -2242,9 +2242,9 @@ Колдонуучу атыңызды калыбына келтирсеңиз, учурдагы QR кодуңуз жана шилтемеңиз кайра коюлат. Чын элеби? - + Колдонуучу атыңызды өзгөртсөңүз, учурдагы QR кодуңуз менен шилтемеңиз да өзгөрүлөт. Чын элеби? - + Улантуу Signal\'да %1$dбайланышыңыз бар! @@ -4018,8 +4018,10 @@ \"%1$s\" бөгөттөн чыгарылды. - Мүчөлөрдү карап чыгуу - Өтүнүчтү карап чыгуу + + Review members + + Review request %1$d топ мүчөсүнүн аты бирдей, төмөндөгү мүчөлөрдү карап чыгып, чара көрүүнү тандаңыз. Эгер бул өтүнүч кимден экенин билбесеңиз, төмөнкү мүчөлөрдү карап чыгып, чара көрүңүз. Башка орток топтор жок. @@ -6046,13 +6048,13 @@ Кененирээк маалымат - + Байланышуунун жаңы жолдору - + Телефон номериңиз корголуп, каалагандай колдонуучу аттар менен шилтемелерди колдоносуз. - + Жок - + Кененирээк маалымат @@ -6349,9 +6351,9 @@ Шилтемеңизди кайра коюп жатканда тармакта ката кетти. Бир аздан соң кайталаңыз. - + An unexpected error occurred while trying to reset your link. Try again later. - + QR кодуңуз менен шилтеме кайра коюлуп, жаңы QR код жана шилтеме түзүлдү. Signal\'дан мени менен сүйлөшкүңүз келсе, телефонуңуздагы QR кодду скандаңыз. @@ -6420,7 +6422,7 @@ Телефон номериңиз - Колдонуучунун атын эки саны менен кошо киргизиңиз. + Enter a username followed by a dot and its set of numbers. Кийинки diff --git a/app/src/main/res/values-lt/strings.xml b/app/src/main/res/values-lt/strings.xml index 18dae294b7..34cd83562b 100644 --- a/app/src/main/res/values-lt/strings.xml +++ b/app/src/main/res/values-lt/strings.xml @@ -512,8 +512,8 @@ Šiame pokalbyje gali pridėti sau priminimų. Jei yra su paskyra susietų įrenginių, nauji priminimai bus sinchronizuoti. %1$d grupės nariai(-ių) turi tokį patį vardą. Bakstelėkite norėdami peržiūrėti - Atidžiai peržiūrėkite prašymus - Molly rado kitą adresatą tokiu pačiu vardu. + + This person has the same name as another contact Susisiekite su mumis Patvirtinti Ne dabar @@ -1134,7 +1134,7 @@ Jūsų naudotojo vardas, QR kodas ir nuoroda nematomi jūsų profilyje. Naudotojo vardą bendrinkite tik su žmonėmis, kuriais pasitikite. - + Dabar žmonės gali siųsti jums žinutes naudodami pasirenkamą naudotojo vardą, kad jums nereikėtų nurodyti telefono numerio. Profilio vardas Naudotojo vardas Apie @@ -2113,9 +2113,9 @@ „Signal“ kontaktas - + Patvirtinta(s) - + No direct messages with %1$s %1$s yra jūsų sistemos kontaktuose @@ -2461,7 +2461,7 @@ Naudotojo vardas netinkamas. Naudotojo varduose turi būti nuo %1$d iki %2$d simbolių. - Turėdami jūsų naudotojo vardą žmonės gali siųsti jums žinutes be jūsų telefono numerio. Šis vardas susiejamas su skaitmenų kombinacija, kad būtų išsaugotas jūsų adreso privatumas. + Usernames are always paired with a set of numbers. Kas tai per skaičius? Šie skaitmenys padeda užtikrinti tavo naudotojo vardo privatumą, kad išvengtum nepageidaujamų žinučių. Savo naudotojo vardą pasakyk tik tiems žmonėms ir grupėms, su kuriomis nori bendrauti. Pakeitus naudotojo vardą, suteikiama nauja skaitmenų kombinacija. @@ -2482,9 +2482,9 @@ Kai naudotojo vardas atkuriamas, QR kodas ir nuoroda nustatomi iš naujo. Ar tikrai to norite? - + Pakeitus naudotojo vardą, tavo QR kodas ir nuoroda bus nustatyta iš naujo. Ar tikrai to nori? - + Tęsti %1$d adresatas naudoja Signal! @@ -4336,8 +4336,10 @@ Naudotojas %1$s atblokuotas. - Peržiūrėti narius - Peržiūrėti prašymą + + Review members + + Review request %1$d grupės nariai(-ių) turi tokį patį vardą, peržiūrėkite žemiau esančius narius ir pasirinkite norėdami imtis veiksmų. Jei nesate tikri, nuo ko yra gautas prašymas, peržiūrėkite žemiau esančius adresatus ir imkitės veiksmų. Nėra kitų bendrų grupių. @@ -6460,13 +6462,13 @@ Sužinoti daugiau - + Nauji būdai bendrauti - + Pristatome telefono numerio privatumą, pasirenkamus naudotojų vardus ir nuorodas. - + Atmesti - + Sužinoti daugiau @@ -6772,9 +6774,9 @@ Bandant iš naujo nustatyti tavo nuorodą įvyko tinklo klaida. Pabandyk vėliau. - + An unexpected error occurred while trying to reset your link. Try again later. - + Jūsų QR kodas ir nuoroda nustatyti iš naujo. Sukurtas naujas QR kodas ir nuoroda. Nuskaitykite šį QR kodą telefonu, kad galėtumėte kalbėtis su manimi per „Signal“. @@ -6849,7 +6851,7 @@ Telefono numeris - Įveskite visą naudotojo vardą su skaitmenų pora. + Enter a username followed by a dot and its set of numbers. Kitas diff --git a/app/src/main/res/values-lv/strings.xml b/app/src/main/res/values-lv/strings.xml index 07367a97ff..5df142f1d3 100644 --- a/app/src/main/res/values-lv/strings.xml +++ b/app/src/main/res/values-lv/strings.xml @@ -180,17 +180,17 @@ Bloķēt Bloķēt un pamest - Report and block + Ziņot un bloķēt - Report spam? + Vai ziņot par surogātpastu? - Report spam + Ziņot par surogātpastu - Signal will be notified that this person may be sending spam. Signal can’t see the content of any chats. + Signal saņems ziņu, ka šī persona, iespējams, sūta surogātpastu. Signal pārstāvjiem nav redzams nevienas sarunas saturs. - Signal will be notified that %1$s, who invited you to this group, may be sending spam. Signal can’t see the content of any chats. + Signal saņems ziņu, ka %1$s (persona, kura jūs uzaicināja pievienoties šai grupai), iespējams, sūta surogātpastu. Signal pārstāvjiem nav redzams nevienas sarunas saturs. - Signal will be notified that the person who invited you to this group may be sending spam. Signal can’t see the content of any chats. + Signal saņems ziņu, ka persona, kura jūs uzaicināja pievienoties šai grupai, iespējams, sūta surogātpastu. Signal pārstāvjiem nav redzams nevienas sarunas saturs. Šodien @@ -503,8 +503,8 @@ Šajā sarunā varat pievienot personiskās piezīmes. Ja jūsu kontam ir saistītas ierīces, jaunās piezīmes tiks sinhronizētas. %1$d grupas dalībniekiem ir vienāds vārds. Pieskarties, lai pārskatītu - Pārskatiet pieprasījumus rūpīgi - Molly atrada citu kontaktu ar tādu pašu vārdu. + + This person has the same name as another contact Sazināties ar mums Pārbaudīt Ne tagad @@ -531,54 +531,54 @@ Vairs nav verificēts - Safety tips + Padomi par drošību - Report spam + Ziņot par surogātpastu Bloķēt Apstiprināt - Delete chat + Dzēst sarunu Atbloķēt - Reported spam + Ziņots par surogātpastu - Signal has been be notified that this person may be sending spam. Signal can’t see the content of any chats. + Signal saņēma ziņu, ka šī persona, iespējams, sūta surogātpastu. Signal pārstāvjiem nav redzams nevienas sarunas saturs. - Reported as spam + Atzīmēts kā surogātpasts - Reported as spam and blocked + Atzīmēts kā surogātpasts un bloķēts - You accepted a message request from %1$s. If this was a mistake, you can choose an action below. + Jūs apstiprinājāt saziņas pieprasījumu no %1$s. Ja izdarījāt to nejauši, varat izvēlēties kādu no tālāk norādītajām darbībām. - Safety Tips + Padomi par drošību - Be careful when accepting message requests from people you don’t know. Watch out for: + Rīkojieties piesardzīgi, apstiprinot sazināšanās pieprasījumus no nepazīstamām personām. Lūk, no kā uzmanīties: - Review this request carefully. None of your contacts or people you chat with are in this group. Here are a few things to watch out for: + Rūpīgi pārskatiet šo pieprasījumu. Neviena no jūsu kontaktpersonām vai cilvēkiem, ar kuriem sarunājaties, nav šajā grupā. Lūk, no kā būtu jāuzmanās: - Previous tip + Iepriekšējais padoms - Next tip + Nākamais padoms - Crypto or money scams + Kriptovalūtu vai naudas krāpšana - If someone you don’t know messages about cryptocurrency (like Bitcoin) or an financial opportunity, be careful—it’s likely spam. + Ja nepazīstama persona jums atsūta ziņu par kriptovalūtām (piemēram, Bitcoin) vai par izdevību nopelnīt, uzmanieties — tas, visticamāk, ir surogātpasts. - Vague or irrelevant messages + Neskaidras vai neatbilstošas ziņas - Spammers often start with a simple message like “Hi” to draw you in. If you respond they may engage you further. + Lai piesaistītu jūsu uzmanību, surogātpasta izplatītāji parasti vispirms nosūta īsu ziņu, piemēram \"Čau!\". Ja atbildēsiet, viņi varēs rakstīt tālāk. - Messages with links + Ziņas, kas ietver saites - Be careful of messages from people you don’t know that have links to websites. Never visit links from people you don’t trust. + Uzmanieties no ziņām, ko sūtījušas nepazīstamas personas un kuras satur saites uz vietnēm. Nekad neapmeklējiet saites, ko sūtījušas neuzticamas personas. - Fake businesses and institutions + Viltus uzņēmumi un iestādes - Be careful of businesses or government agencies contacting you. Messages involving tax agencies, couriers, and more can be spam. + Uzmanieties no ziņām, ko sūta uzņēmumi un valdības aģentūras. Ziņas no nodokļu aģentūrām, kurjeriem un tml. var būt surogātpasts. Noņemt filtru @@ -596,9 +596,9 @@ Dzēš - Deleting selected chats… - Deleting selected chat… - Deleting selected chats… + Notiek atlasīto sarunu dzēšana… + Notiek atlasītās sarunas dzēšana… + Notiek atlasīto sarunu dzēšana… %1$d sarunas ir arhivētas @@ -1099,7 +1099,7 @@ Jūsu lietotājvārds, QR kods un saite jūsu profilā nav redzami. Kopīgojiet savu lietotājvārdu tikai ar uzticamiem cilvēkiem. - + Tagad cilvēki var nosūtīt jums ziņas, izmantojot jūsu izvēles lietotājvārdu. Tālruņa numuri vairs nav nepieciešami. Profila nosaukums Lietotājvārds Par @@ -1654,9 +1654,9 @@ Maksājums: %1$s - Reported as spam + Atzīmēts kā surogātpasts - You accepted the message request + Jūs apstiprinājāt sazināšanās pieprasījumu Apstiprināt @@ -1708,7 +1708,7 @@ %1$d citas grupas - Report… + Ziņot… Paroles frāzes nesakrīt! @@ -2039,9 +2039,9 @@ Signal kontaktpersona - + Pārbaudīts - + Jūs un %1$s vēl neesat sazinājušies %1$s ir jūsu kontaktpersona sistēmā @@ -2381,7 +2381,7 @@ Lietotājvārds nav derīgs. Lietotājvārdiem jābūt starp %1$d un %2$d rakstzīmēm. - Lietotājvārdi ļauj citiem lietotājiem nosūtīt jums ziņas, neizmantojot tālruņa numuru. Tie ir sasaistīti ar ciparu virkni, lai saglabātu jūsu adresi slepenībā. + Usernames are always paired with a set of numbers. Ko nozīmē šis numurs? Šie cipari palīdz saglabāt jūsu lietotājvārdu slepenībā un izvairīties no nevēlamām ziņām. Izpaudiet savu lietotājvārdu tikai lietotājiem un grupām, ar kurām vēlaties čatot. Ja mainīsiet lietotājvārdu, saņemsiet jaunu ciparu virkni. @@ -2402,9 +2402,9 @@ Mainot lietotājvārdu, tiks atiestatīts esošais QR kods un saite. Vai tiešām turpināt? - + Mainot lietotājvārdu, tiks atiestatīts esošais QR kods un saite. Vai tiešām to vēlaties? - + Turpināt %1$d kontaktpersona lieto Signal! @@ -2809,7 +2809,7 @@ Jūs esat noņēmis šo personu. Vēlreiz nosūtot ziņojumu, tā tiks pievienota atpakaļ jūsu sarakstam. - Options + Iespējas Atskaņot … Pauzēt @@ -4230,8 +4230,10 @@ \"%1$s\" ir atbloķēts. - Pārskatīt dalībniekus - Pārskatīt pieprasījumu + + Review members + + Review request %1$d grupas dalībniekiem ir vienāds vārds; pārskatiet tālāk norādītos dalībniekus un izvēlieties rīkoties. Ja nezināt, no kā ir pieprasījums, pārskatiet tālāk norādītās kontaktpersonas un rīkojieties. Nav citu kopīgu grupu. @@ -6322,13 +6324,13 @@ Uzzināt vairāk - + Jauni saziņas veidi - + Jaunumi: tālruņu numuru privātums, izvēles lietotāju vārdi un saites. - + Nerādīt - + Uzzināt vairāk @@ -6631,9 +6633,9 @@ Mēģinot atiestatīt jūsu saiti, radās tīkla kļūda. Lūdzu, mēģiniet vēlāk. - + Radās neparedzēta kļūda, kad mēģinājāt atiestatīt savu saiti. Vēlāk mēģiniet vēlreiz. - + Jūsu QR kods un saite tika atiestatīti, un tika izveidots jauns QR kods un saite. Noskenē šo QR kodu ar savu tālruni, lai sarunātos ar mani pakalpojumā Signal. @@ -6706,7 +6708,7 @@ Tālruņa numurs - Ievadiet pilnu lietotājvārdu un tā abus ciparus. + Enter a username followed by a dot and its set of numbers. Tālāk diff --git a/app/src/main/res/values-mk/strings.xml b/app/src/main/res/values-mk/strings.xml index 01f50d99ff..b592394cce 100644 --- a/app/src/main/res/values-mk/strings.xml +++ b/app/src/main/res/values-mk/strings.xml @@ -494,8 +494,8 @@ Можете да додавате белешки за себе во овој разговор. Ако вашата сметка има поврзани уреди, новите белешки ќе се синхронизираат. %1$d членови на групата го имаат истото име. Допрете за преглед - Внимателно прегледајте ги барањата - Molly пронајде друг контакт со истото име. + + This person has the same name as another contact Контактирајте нѐ Провери Не сега @@ -1064,7 +1064,7 @@ Вашето корисничко име, QR код и линк не се видливи на вашиот профил. Споделувајте го вашето корисничко име само со луѓе на кои им верувате. - + Отсега луѓето ќе можат да ви пишуваат користејќи го вашето опционално корисничко име, што значи дека не мора да го споделувате вашиот телефонски број. Име на профил Корисничко име За @@ -1965,9 +1965,9 @@ Signal врска - + Проверено - + No direct messages with %1$s %1$s е во вашите системски контакти @@ -2301,7 +2301,7 @@ Корисничкото име е неважечко. Корисничкото име мора да биде помеѓу %1$d и %2$d знаци. - Корисничките имиња овозможуваат останатите да ви испратат порака без да им треба вашиот телефонски број. Тие се спарени со низа бројки за да се одржи приватноста на вашата адреса. + Usernames are always paired with a set of numbers. Што значи овој број? Со помош на овие бројки вашето корисничко име останува приватно, со што можете да избегнете непосакувани пораки. Споделувајте го вашето корисничко име само со луѓето и групите со кои сакате да разговарате. Ако го смените корисничкото име, ќе добиете нови низа бројки. @@ -2322,9 +2322,9 @@ Менувањето на вашето корисничко име ќе ги ресетира вашите постоечки QR код и линк. Дали сте сигурни? - + Менувањето на вашето корисничко име ќе ги ресетира вашите постоечки QR код и линк. Дали сте сигурни? - + Продолжи %1$d контакт е на Signal! @@ -4124,8 +4124,10 @@ Корисникот „%1$s“ е деблокиран. - Прегледај членови - Прегледај барање + + Review members + + Review request %1$d членови на групата го имаат истото име, прегледајте ги членовите подолу и решете што сакате да направите. Ако не сте сигурни од кого е барањето, прегледајте ги контактите подолу и решете што сакате да направите. Немате други заеднички групи. @@ -6184,13 +6186,13 @@ Дознајте повеќе - + Нови начини за поврзување - + Воведуваме приватност на телефонски број, опционални кориснички имиња и линкови. - + Откажи - + Дознајте повеќе @@ -6490,9 +6492,9 @@ Се јави мрежна грешка додека се обидувавте да го ресетирате вашиот линк. Обидете се повторно подоцна. - + An unexpected error occurred while trying to reset your link. Try again later. - + Вашиот QR код и линк беа ресетирани и создадени се нов QR код и линк. Скенирај го овој QR код со твојот телефон за да разговараме на Signal. @@ -6563,7 +6565,7 @@ Телефонски број - Внесете целосно корисничко име со пар цифри. + Enter a username followed by a dot and its set of numbers. Следно diff --git a/app/src/main/res/values-ml/strings.xml b/app/src/main/res/values-ml/strings.xml index a6d205b336..588ba42022 100644 --- a/app/src/main/res/values-ml/strings.xml +++ b/app/src/main/res/values-ml/strings.xml @@ -494,8 +494,8 @@ ഈ സംഭാഷണത്തിൽ നിങ്ങൾക്കായി കുറിപ്പുകൾ ചേർക്കാൻ കഴിയും. നിങ്ങളുടെ അക്കൗണ്ടിൽ ലിങ്ക് ചെയ്ത ഉപകരണങ്ങളുണ്ടെങ്കിൽ, പുതിയ കുറിപ്പുകൾ സമന്വയിപ്പിക്കും. %1$d ഗ്രൂപ്പ് അംഗങ്ങൾക്ക് ഒരേ പേരാണ്. അവലോകനം ചെയ്യാൻ ടാപ്പുചെയ്യുക - അഭ്യർത്ഥനകൾ ശ്രദ്ധാപൂർവ്വം അവലോകനം ചെയ്യുക - Molly ഇതേ പേരിൽ മറ്റൊരു കോൺ‌ടാക്റ്റ് കണ്ടെത്തി. + + This person has the same name as another contact ഞങ്ങളെ സമീപിക്കുക ഉറപ്പാക്കു ഇപ്പോൾ വേണ്ട @@ -1064,7 +1064,7 @@ നിങ്ങളുടെ ഉപയോക്തൃനാമവും QR കോഡും ലിങ്കും നിങ്ങളുടെ പ്രൊഫൈലിൽ ദൃശ്യമല്ല. നിങ്ങൾക്ക് വിശ്വാസമുള്ള ആളുകളുമായി മാത്രം നിങ്ങളുടെ ഉപയോക്തൃനാമം പങ്കിടുക. - + നിങ്ങളുടെ ഓപ്‌ഷണൽ ഉപയോക്തൃനാമം ഉപയോഗിച്ച് ആളുകൾക്ക് ഇപ്പോൾ നിങ്ങൾക്ക് സന്ദേശമയയ്‌ക്കാൻ കഴിയും, അതിനാൽ നിങ്ങളുടെ ഫോൺ നമ്പർ നൽകേണ്ടതില്ല. പ്രൊഫൈൽ നാമം ഉപയോക്തൃനാമം എന്നെ പറ്റി @@ -1965,9 +1965,9 @@ Signal കണക്ഷൻ - + പരിശോധിച്ചു - + No direct messages with %1$s %1$s നിങ്ങളുടെ സിസ്റ്റം കോൺടാക്റ്റുകളിൽ ഉണ്ട് @@ -2301,7 +2301,7 @@ ഉപയോക്തൃനാമം അസാധുവാണ്. ഉപയോക്തൃനാമങ്ങൾ %1$d മുതൽ %2$d വരെ പ്രതീകങ്ങൾ ആയിരിക്കണം. - നിങ്ങളുടെ ഫോൺ നമ്പറില്ലാതെ നിങ്ങൾക്ക് സന്ദേശം അയയ്ക്കാൻ ഉപയോക്തൃനാമങ്ങൾ മറ്റുള്ളവരെ അനുവദിക്കുന്നു. നിങ്ങളുടെ മേൽവിലാസം സ്വകാര്യമായി സൂക്ഷിക്കുന്നതിന്, അത് ഒരു കൂട്ടം അക്കങ്ങളുമായി ജോടിയാക്കിയിരിക്കുന്നു. + Usernames are always paired with a set of numbers. ഈ നമ്പർ എന്താണ്? അനാവശ്യ സന്ദേശങ്ങൾ ഒഴിവാക്കാൻ നിങ്ങളെ സഹായിക്കുന്നതിന്, ഈ അക്കങ്ങൾ നിങ്ങളുടെ ഉപയോക്തൃനാമം സ്വകാര്യമായി സൂക്ഷിക്കുന്നു. നിങ്ങൾ ചാറ്റ് ചെയ്യാൻ ആഗ്രഹിക്കുന്ന ആളുകളുമായും ഗ്രൂപ്പുകളുമായും മാത്രം നിങ്ങളുടെ ഉപയോക്തൃനാമം പങ്കിടുക. നിങ്ങൾ ഉപയോക്തൃനാമം മാറ്റുകയാണെങ്കിൽ, നിങ്ങൾക്ക് പുതിയ ഒരു കൂട്ടം അക്കങ്ങൾ ലഭിക്കുന്നതാണ്. @@ -2322,9 +2322,9 @@ നിങ്ങളുടെ ഉപയോക്തൃനാമം വീണ്ടെടുക്കുന്നതിലൂടെ നിങ്ങളുടെ നിലവിലുള്ള QR കോഡും ലിങ്കും പുനഃക്രമീകരിക്കും. ഉറപ്പാണോ? - + നിങ്ങളുടെ ഉപയോക്തൃനാമം മാറ്റുന്നത് നിങ്ങളുടെ നിലവിലുള്ള QR കോഡും ലിങ്കും പുനഃക്രമീകരിക്കും. ഉറപ്പാണോ? - + തുടരുക Signal-ൽ‌ %1$d കോൺ‌ടാക്റ്റ് ഉണ്ട്! @@ -4124,8 +4124,10 @@ \"%1$s\" എന്നയാളെ അൺബ്ലോക്ക് ചെയ്തു. - അംഗങ്ങളെ അവലോകനം ചെയ്യുക - അഭ്യർത്ഥന അവലോകനം ചെയ്യുക + + Review members + + Review request %1$d ഗ്രൂപ്പ് അംഗങ്ങൾക്ക് സമാന പേരുണ്ട്, ചുവടെയുള്ള അംഗങ്ങളെ അവലോകനം ചെയ്ത് നടപടിയെടുക്കാൻ തിരഞ്ഞെടുക്കുക. അഭ്യർത്ഥന ആരാണ് നിങ്ങൾക്ക് അയച്ചതെന്ന് ഉറപ്പില്ലെങ്കിൽ, ചുവടെയുള്ള കോൺടാക്റ്റുകൾ അവലോകനം ചെയ്ത് നടപടിയെടുക്കുക. സാമാന്യമായി മറ്റ് ഗ്രൂപ്പുകളൊന്നുമില്ല. @@ -6184,13 +6186,13 @@ കൂടുതലറിയുക - + കണക്റ്റ് ചെയ്യാനുള്ള പുതിയ മാർഗങ്ങൾ - + ഫോൺ നമ്പർ സ്വകാര്യത, ഓപ്ഷണൽ ഉപയോക്തൃനാമങ്ങൾ, ലിങ്കുകൾ എന്നിവ അവതരിപ്പിക്കുന്നു. - + ഒഴിവാക്കുക - + കൂടുതലറിയുക @@ -6490,9 +6492,9 @@ നിങ്ങളുടെ ലിങ്ക് പുനഃക്രമീകരിക്കാൻ ശ്രമിക്കുമ്പോൾ നെറ്റ്‌വർക്ക് പിശകുണ്ടായി. പിന്നീട് വീണ്ടും ശ്രമിക്കുക. - + An unexpected error occurred while trying to reset your link. Try again later. - + നിങ്ങളുടെ QR കോഡും ലിങ്കും പുനഃക്രമീകരിച്ചു, പുതിയൊരു QR കോഡും ലിങ്കും സൃഷ്‌ടിച്ചു. Signal-ൽ ഞാനുമായി ചാറ്റ് ചെയ്യാൻ ഈ QR കോഡ് സ്കാൻ ചെയ്യുക. @@ -6563,7 +6565,7 @@ ഫോൺ നമ്പർ - രണ്ട് അക്കങ്ങൾ അടക്കം ഉപയോക്തൃനാമം പൂർണ്ണമായും നൽകുക. + Enter a username followed by a dot and its set of numbers. അടുത്തത് diff --git a/app/src/main/res/values-mr/strings.xml b/app/src/main/res/values-mr/strings.xml index 1d3b693600..6746da38e5 100644 --- a/app/src/main/res/values-mr/strings.xml +++ b/app/src/main/res/values-mr/strings.xml @@ -494,8 +494,8 @@ या चॅटमध्ये आपण स्वतःसाठी टिपा जोडू शकता. जर आपल्या खात्यामध्ये लिंक केलेली डिव्हाईस असतील, तर नवीन टिपा संकालित केल्या जातील. %1$dगट सदस्यांचे समान नाव आहे. पुनरावलोकन करण्यासाठी टॅप करा - विनंत्यांचे काळजीपूर्वक पुनरावलोकन करा - Molly ला त्याच नावाचा दुसरा संपर्क सापडला. + + This person has the same name as another contact आमच्याशी संपर्क साधा सत्यापित करा आता नाही @@ -1064,7 +1064,7 @@ आपले वापरकर्ता नाव, QR कोड आणि लिंक आपल्या फोनवर दिसत नाहीत. आपण ज्यांच्यावर विश्वास ठेवता फक्त त्याच्यासह आपले वापरकर्ता नाव शेअर करा. - + लोक आपणाला आपले वैकल्पिक वापरकर्ता नाव वापरून आता संदेश करू शकतात ज्यामुळे आपणाला आपला फोन नंबर देण्याची आवश्यकता नाही. प्रोफाईल नाव वापरकर्तानाव आपल्याबद्दल @@ -1965,9 +1965,9 @@ Signal कनेक्शन - + सत्यापित - + No direct messages with %1$s %1$s आपल्या सिस्टिम संपर्कामध्ये आहेत @@ -2301,7 +2301,7 @@ वापरकर्तानाव अवैध आहे. वापरकर्तानाव %1$d आणि %2$d कॅरेक्टर मध्येच असायला हवे. - वापरकर्तानाव आपला फोन नंबर असण्याच्या गरजेशिवाय आपणाला संदेश करु देते. ते आपला पत्ता खाजगी ठेवण्यास मदत करण्यास अंकाच्या सेटसह पेअर्ड केलेले आहेत. + Usernames are always paired with a set of numbers. हा नंबर काय आहे? हे अंक आपले वापरकर्ता नाव गोपनीय ठेवण्यास मदत करतात ज्यामुळे आपण नको असलेले संदेश टाळू शकता. आपणाला चॅट करायला आवडते केवळ त्याच लोक आणि गटांसोबत आपले वापरकर्तानाव शेअर करा. आपण आपले वापरकर्तानाव बदल्यास आपणाला नवीन अंंकांचा संच मिळेल. @@ -2322,9 +2322,9 @@ आपले वापरकर्ता नाव पुर्नप्राप्त करण्याने आपला सध्याचा QR कोड आणि लिंक रिसेट होईल. आपल्याला खात्री आहे? - + आपले वापरकर्ता नाव बदलण्याने आपला अस्तित्वात असलेला QR कोड आणि लिंक रीसेट केली जाईल. आपल्याला खात्री आहे? - + सुरू ठेवा %1$d संपर्क Signal वर आहे! @@ -4124,8 +4124,10 @@ \"%1$s\" अनावरोधित केले गेले आहे. - सदस्यांचे पुनरावलोकन करा - पुनरावलोकन विनंती + + Review members + + Review request %1$d गट सदस्यांचे नाव सारखे आहेत, खाली सदस्यांचे पुनरावलोकन करा आणि काय करायचे ते निवडा. विनंती कोणाकडून आहे याची आपल्याला खात्री नसल्यास, खाली असलेल्या संपर्कांचे पुनरावलोकन करा आणि कारवाई करा. इतर कुठलेही गट समाईक नाहीत @@ -6184,13 +6186,13 @@ अधिक जाणून घ्या - + कनेक्ट होण्याचे नवीन मार्ग - + फोन नंबर गोपनीयता, पर्यायी वापरकर्ता नाव आणि लिंक्स सादर करीत आहोत. - + रद्द करा - + अधिक जाणून घ्या @@ -6490,9 +6492,9 @@ आपली लिंक रीसेट करण्याच्या प्रयत्न करताना एक नेटवर्क त्रुटी उद्भवली. नंतर पुन्हा प्रयत्न करा. - + An unexpected error occurred while trying to reset your link. Try again later. - + आपला QR कोड आणि लिंक रीसेट करण्यात आली आहे आणि एक नवीन QR कोड आणि लिंक तयार करण्यात आली आहे. माझ्यासोबत Signal वर चॅट करण्यासाठी आपल्या फोनसब हा QR कोड स्कॅन करा. @@ -6563,7 +6565,7 @@ फोन नंबर - अंकांच्या जोडीसह पूर्ण वापरकर्तानाव प्रविष्ट करा. + Enter a username followed by a dot and its set of numbers. पुढे diff --git a/app/src/main/res/values-ms/strings.xml b/app/src/main/res/values-ms/strings.xml index d98cff7eb8..caeb6273e8 100644 --- a/app/src/main/res/values-ms/strings.xml +++ b/app/src/main/res/values-ms/strings.xml @@ -485,8 +485,8 @@ Anda boleh menambah nota untuk diri sendiri dalam sembang ini. Sekiranya akaun anda mempunyai peranti yang dipautkan, nota baharu akan disegerakkan. Ahli kumpulan %1$d mempunyai nama yang sama. Tekan untuk review - Review permintaan sebaik-baiknya - Molly menemui contact lain dengan nama yang sama. + + This person has the same name as another contact Hubungi kami Sahkan Bukan sekarang @@ -1029,7 +1029,7 @@ Nama Pengguna, kod QR dan pautan anda tidak kelihatan pada profil anda. Hanya kongsi nama pengguna anda dengan orang yang anda percayai. - + Mereka kini boleh menghantar mesej kepada anda menggunakan nama pengguna pilihan anda, tanpa memberikan nombor telefon anda. Nama profil Nama Pengguna Perihal @@ -1891,9 +1891,9 @@ Hubungan Signal - + Disahkan - + No direct messages with %1$s %1$s berada dalam kenalan sistem anda @@ -2221,7 +2221,7 @@ Nama pengguna tidak sah. Nama pengguna mesti antara %1$d sehingga %2$d aksara. - Nama pengguna membolehkan orang lain menghantar mesej kepada anda tanpa menggunakan nombor telefon. Ia dipasangkan dengan set digit untuk membantu mengekalkan privasi alamat anda. + Usernames are always paired with a set of numbers. Apakah nombor ini? Digit ini membantu mengekalkan privasi nama pengguna anda supaya anda boleh mengelakkan mesej yang tidak diingini. Kongsi nama pengguna anda hanya dengan orang dan kumpulan yang anda mahu bersembang. Jika anda menukar nama pengguna, anda akan menerima set digit baru. @@ -2242,9 +2242,9 @@ Memulihkan nama pengguna anda akan menetapkan semula kod QR dan pautan anda yang sedia ada. Adakah anda pasti? - + Menukar nama pengguna anda akan menetapkan semula kod dan pautan QR anda yang sedia ada. Adakah anda pasti? - + Teruskan %1$d kenalan menggunakan Signal! @@ -4018,8 +4018,10 @@ \"%1$s\" telah dinyahsekat. - Semak Ahli - Semak Permintaan + + Review members + + Review request %1$d ahli kumpulan mempunyai nama yang sama, semak ahli di bawah dan pilih untuk mengambil tindakan. Jika anda tidak pasti tentang penghantar permintaan, semak kenalan di bawah dan ambil tindakan. Tidak ada kumpulan lain yang sama. @@ -6046,13 +6048,13 @@ Ketahui lebih lanjut - + Cara baharu untuk berhubung - + Memperkenalkan privasi nombor telefon, nama pengguna pilihan dan pautan. - + Tolak - + Ketahui lebih lanjut @@ -6349,9 +6351,9 @@ Ralat rangkaian berlaku semasa cuba menetapkan semula pautan anda. Cuba lagi kemudian. - + An unexpected error occurred while trying to reset your link. Try again later. - + Kod QR dan pautan anda telah ditetapkan semula dan kod QR dan pautan baharu telah dibuat. Imbas kod QR ini dengan telefon anda untuk sembang dengan saya di Signal. @@ -6420,7 +6422,7 @@ Nombor telefon - Masukkan nama pengguna dengan pasangan digitnya. + Enter a username followed by a dot and its set of numbers. Seterusnya diff --git a/app/src/main/res/values-my/strings.xml b/app/src/main/res/values-my/strings.xml index bfd3412604..b3ee60cfa3 100644 --- a/app/src/main/res/values-my/strings.xml +++ b/app/src/main/res/values-my/strings.xml @@ -485,8 +485,8 @@ ဤချက်(တ်)တွင် သင်ကိုယ်တိုင်အတွက် မှတ်စုများ ထည့်နိုင်ပါသည်။ သင့်အကောင့်နှင့် ချိတ်ထားသည့် စက်များရှိပါက မှတ်စုအသစ်များကို ချိန်ကိုက်ပါမည်။ %1$dအဖွဲ့ဝင်များသည်တူညီသောနာမည်ရှိသည်။ ပြန်လည်သုံးသပ်ရန်ကိုအသာပုတ်ပါ - တောင်းဆိုမှုများကိုအသေအချာပြန်လည်စစ်ဆေးပါ - Molly သည်ထိုအမည်နှင့်အတူအခြားအဆက်အသွယ်လည်းရှိသည် + + This person has the same name as another contact ကျွန်ုပ်တို့ကိုဆက်သွယ်ရန် စစ်ဆေးအတည်ပြုသည် အခုမဟုတ်သေးပါ။ @@ -1029,7 +1029,7 @@ သင်၏ သုံးစွဲသူအမည်၊ QR ကုဒ်နှင့် လင့်ခ်တို့ကို သင့်ပရိုဖိုင်တွင် မမြင်တွေ့နိုင်ပါ။ သင့်သုံးစွဲသူအမည်ကို သင် ယုံကြည်သူများနှင့်သာ မျှဝေပေးပါ။ - + ယခုအခါ လူအများသည် သင်၏ ရွေးချယ်နိုင်သော သုံးစွဲသူအမည်ကို အသုံးပြုလျက် သင့်ထံ မက်ဆေ့ချ်ပို့နိုင်ပြီဖြစ်၍ သင့်ဖုန်းနံပါတ်ကို မပေးရတော့ပါ။ ပရိုဖိုင်း အမည် သုံးစွဲသူအမည် အကြောင်း @@ -1891,9 +1891,9 @@ Signal အဆက်အသွယ် - + အတည်ပြုပြီး - + No direct messages with %1$s %1$s သည် သင့်စနစ်ထဲရှိ အဆက်အသွယ်များတွင် ရှိပြီးဖြစ်သည် @@ -2221,7 +2221,7 @@ သုံးစွဲသူအမည် မမှန်ကန်ပါ သုံးစွဲသူအမည်များသည် %1$d နှင့် %2$d ကြား အက္ခရာလုံး အရေတွက်ရှိရပါမည် ။ - သုံးစွဲသူအမည်များသည် သင့်ဖုန်းနံပါတ် မလိုဘဲ အခြားသူများအား သင့်ထံ မက်ဆေ့ချ်ပို့နိုင်စေပါသည်။ သင့်လိပ်စာကို သီးသန့်လျှို့ဝှက်ထားရာတွင် အကူအညီဖြစ်စေရန် ၎င်းတို့အား ဂဏန်းအစုံလိုက်ဖြင့် တွဲထားပါသည်။ + Usernames are always paired with a set of numbers. ဤနံပါတ်က ဘာလဲ။ ဤဂဏန်းများသည် သင့်သုံးစွဲသူအမည်ကို သီးသန့်လျှို့ဝှက်ပေးထားသောကြောင့် မလိုချင်သည့် မက်ဆေ့ချ်များ ရရှိခြင်းမှ ရှောင်နိုင်ပါသည်။ သင့်သုံးစွဲသူအမည်ကို သင် ချက်(တ်)လိုသည့် လူများ၊ အဖွဲ့များထံသာ ဝေမျှပါ။ သုံးစွဲသူအမည်ကို ပြောင်းလိုက်ပါက ဂဏန်းတွဲအသစ်တစ်ခုကို ရရှိပါမည်။ @@ -2242,9 +2242,9 @@ သင်၏ သုံးစွဲသူအမည်ကို ပြန်လည်ရယူပါက သင့်မူလ QR ကုဒ်နှင့် လင့်ခ်ကို ပြန်လည်သတ်မှတ်လိုက်ပါမည်။ သေချာပါသလား။ - + သင်၏ သုံးစွဲသူအမည်ကို ပြောင်းပါက သင့်မူလ QR ကုဒ်နှင့် လင့်ခ်ကို ပြန်လည်သတ်မှတ်လိုက်ပါမည်။ သေချာပါသလား။ - + ဆက်လုပ်ရန် အဆက်အသွယ် %1$d ဦးသည် Signal ပေါ်ရှိပါသည်! @@ -4018,8 +4018,10 @@ \"%1$s\" ကို ဘလော့ခ်ဖြေပြီးပါပြီ။ - အဖွဲ့ဝင်များကို ပြန်လည်စစ်ဆေးပါ - တောင်းဆိုမှုကို ပြန်လည်ဆန်းစစ်ပါ + + Review members + + Review request အဖွဲ့ဝင် %1$d ဦးသည် အမည်တူနေပါသည်၊ အောက်ပါအဖွဲ့ဝင်များကို စစ်ဆေးပါ သို့မဟုတ် လုပ်ဆောင်ချက်တစ်ခုလုပ်ရန် ရွေးချယ်ပါ။ မည်သူမှ တောင်းဆိုသည်ကို မသေချာပါက အောက်ပါ အဆက်အသွယ်များကို ပြန်လည်စစ်ဆေးပြီး လုပ်ဆောင်ချက်တစ်ခု ရွေးပါ။ အခြား တူညီသော အဖွဲ့များမရှိပါ @@ -6046,13 +6048,13 @@ ပိုမိုလေ့လာရန် - + ချိတ်ဆက်ရန် နည်းလမ်းသစ်များ - + ဖုန်းနံပါတ် ကိုယ်ပိုင်အချက်အလက် လုံခြုံရေး၊ ရွေးချယ်နိုင်သော သုံးစွဲသူအမည်များနှင့် လင့်ခ်များအကြောင်း မိတ်ဆက်ပေးခြင်း။ - + ပယ်ရန် - + ပိုမိုလေ့လာရန် @@ -6349,9 +6351,9 @@ သင်၏လင့်ခ်ကို ပြန်လည်သတ်မှတ်ရန် ကြိုးစားစဉ် ကွန်ရက်ချို့ယွင်းချက်တစ်ခု ဖြစ်ပွားခဲ့ပါသည်။ နောက်မှ ထပ်ကြိုးစားကြည့်ပါ။ - + An unexpected error occurred while trying to reset your link. Try again later. - + သင့် QR ကုဒ်နှင့် လင့်ခ်ကို ပြန်လည်သတ်မှတ်လိုက်ပြီဖြစ်ပြီး QR ကုဒ်နှင့် လင့်ခ် အသစ်တစ်ခုကို ဖန်တီးလိုက်ပါပြီ။ ကျွန်ုပ်နှင့် Signal တွင် ချက်(တ်)ရန်အတွက် ဤ QR ကုဒ်ကို သင့်ဖုန်းဖြင့် စကန်ဖတ်ပါ။ @@ -6420,7 +6422,7 @@ ဖုန်းနံပါတ် - သုံးစွဲသူအမည် အပြည့်အစုံကို ၎င်း၏ ဂဏန်းနှစ်လုံးတွဲနှင့်အတူ ရိုက်ထည့်ပါ။ + Enter a username followed by a dot and its set of numbers. ဆက်သွားမည် diff --git a/app/src/main/res/values-nb/strings.xml b/app/src/main/res/values-nb/strings.xml index acb2276bc4..4149abfa2a 100644 --- a/app/src/main/res/values-nb/strings.xml +++ b/app/src/main/res/values-nb/strings.xml @@ -494,8 +494,8 @@ Du kan legge til notater for deg selv i denne samtalen. Hvis kontoen din har koblede enheter, blir nye notater synkronisert. %1$d gruppemedlemmer har samme navn. Trykk for å gå gjennom - Gjennomgå forespørsler nøye - Molly fant en annen kontakt med samme navn. + + This person has the same name as another contact Kontakt oss Bekreft Ikke nå @@ -1064,7 +1064,7 @@ Brukernavnet, QR-koden og lenken er ikke synlige i profilen din. Ikke del brukernavnet ditt med personer du ikke stoler på. - + Nå kan andre sende deg meldinger via brukernavnet ditt, slik at du slipper å gi ut telefonnummeret ditt. Profilnavn Brukernavn Om @@ -1965,9 +1965,9 @@ Signal-kontakter - + Bekreftet - + No direct messages with %1$s %1$s står i kontaktlisten på enheten din @@ -2301,7 +2301,7 @@ Brukernavnet er ugyldig. Brukernavn må være mellom %1$d og %2$d tegn. - Brukernavnet gjør det mulig for andre å sende deg meldinger uten telefonnummeret ditt. Det er koblet til en tallrekke for å holde adressen din skjult. + Usernames are always paired with a set of numbers. Hva er dette nummeret? Disse tallene holder brukernavnet ditt skjult slik at du unngår uønskede meldinger. Det kan være lurt å bare dele brukernavnet ditt med personer og grupper du vil chatte med. Du får en ny tallrekke hvis du bytter brukernavnet ditt. @@ -2322,9 +2322,9 @@ Hvis du gjenoppretter brukernavnet, får du også en ny QR-kode og profillenke. Vil du gå videre? - + Hvis du endrer brukernavnet, får du også en ny QR-kode og profillenke. Er du sikker? - + Fortsett %1$d kontakt er på Signal! @@ -4124,8 +4124,10 @@ Blokkeringen av «%1$s» er fjernet. - Gå gjennom medlemmer - Se gjennom forespørsel + + Review members + + Review request %1$d gruppemedlemmer har det samme navnet, gå gjennom medlemmene under og velg handling. Hvis du ikke er sikker på hvem forespørselen er fra, se gjennom kontaktene nedenfor og velg handling. Ingen andre grupper til felles. @@ -6184,13 +6186,13 @@ Les mer - + Nye måter å finne hverandre på - + Vi lanserer brukernavn, lenker og skjult telefonnummer. - + Avbryt - + Les mer @@ -6490,9 +6492,9 @@ En feil oppstod da du forsøkte å tilbakestille lenken. Prøv igjen senere. - + An unexpected error occurred while trying to reset your link. Try again later. - + QR-koden og lenken er tilbakestilt, og vi har opprettet en ny QR-kode og lenke for deg. Skann denne QR-koden for å innlede en samtale med meg på Signal. @@ -6563,7 +6565,7 @@ Telefonnummer - Skriv inn hele brukernavnet, inkludert tallene. + Enter a username followed by a dot and its set of numbers. Neste diff --git a/app/src/main/res/values-nl/strings.xml b/app/src/main/res/values-nl/strings.xml index 084d4f4882..8d04e8922a 100644 --- a/app/src/main/res/values-nl/strings.xml +++ b/app/src/main/res/values-nl/strings.xml @@ -494,8 +494,8 @@ Je kunt in deze chat notities voor jezelf achterlaten. Alle nieuwe notities worden gesynchroniseerd met apparaten die gekoppeld zijn met je account. %1$d groepsleden hebben dezelfde naam. Tik hier om ze te vergelijken - Overweeg dit gespreksverzoek zorgvuldig: - Molly heeft een ander contactpersoon gevonden met dezelfde naam. + + This person has the same name as another contact Neem contact met ons op Verifiëren Niet nu @@ -1064,7 +1064,7 @@ Je gebruikersnaam, QR-code en link zijn niet zichtbaar op je profiel. Deel je gebruikersnaam alleen met mensen die je vertrouwt. - + Mensen kunnen je nu berichten sturen via je optionele gebruikersnaam zodat je je telefoonnummer niet hoeft te geven. Profielnaam Gebruikersnaam Over mij @@ -1965,9 +1965,9 @@ Signal-contact - + Geverifieerd - + No direct messages with %1$s %1$s staat in je systeemcontactenlijst @@ -2301,7 +2301,7 @@ Gebruikersnaam is ongeldig. Gebruikersnamen moeten uit minimaal %1$d en maximaal %2$d karakters bestaan. - Gebruikersnamen zorgen ervoor dat anderen jou berichten kunnen sturen zonder je telefoonnummer nodig te hebben. Ze zijn gekoppeld aan een cijfercombinatie zodat jouw adres privé blijft. + Usernames are always paired with a set of numbers. Wat is dit nummer? Deze cijfers helpen om je gebruikersnaam privé te houden zodat je ongewenste berichten kunt voorkomen. Deel je gebruikersnaam alleen met mensen en groepen waarmee je zou willen chatten. Als je je gebruikersnaam wijzigt, krijg je een nieuwe cijfercombinatie. @@ -2322,9 +2322,9 @@ Wanneer je je gebruikersnaam herstelt, werken je bestaande QR-code en link niet langer en worden deze vernieuwd. Weet je het zeker? - + Wanneer je je gebruikersnaam wijzigt, werken je bestaande QR-code en link niet langer en worden deze vernieuwd. Weet je het zeker? - + Doorgaan %1$d van je contactpersonen is bereikbaar via Signal. @@ -4124,8 +4124,10 @@ %1$s is gedeblokkeerd. - Groepsleden vergelijken - Personen vergelijken + + Review members + + Review request %1$d groepsleden hebben dezelfde naam. Vergelijk deze groepsleden hieronder en neem actie indien je denkt dat een van hen zich probeert voor te doen als de ander. Vergelijk, als je niet zeker bent van wie het gespreksverzoek afkomstig is, de personen hieronder en neem actie indien je denkt dat een van hen zich probeert voor te doen als de ander. Geen andere gemeenschappelijke groepen @@ -6184,13 +6186,13 @@ Meer lezen - + Nieuwe manieren om contact te maken - + Ontdek telefoonnummerprivacy, optionele gebruikersnamen en links. - + Sluiten - + Meer lezen @@ -6490,9 +6492,9 @@ Er is een netwerkfout opgetreden tijdens het vernieuwen van je link. Probeer het later opnieuw. - + An unexpected error occurred while trying to reset your link. Try again later. - + Je QR-code en link zijn vernieuwd, een nieuwe QR-code en link zijn beschikbaar. Scan deze QR-code met je telefoon om met mij te chatten op Signal. @@ -6563,7 +6565,7 @@ Telefoonnummer - Voer een volledige gebruikersnaam met bijbehorende cijfercombinatie in. + Enter a username followed by a dot and its set of numbers. Volgende diff --git a/app/src/main/res/values-pa/strings.xml b/app/src/main/res/values-pa/strings.xml index 60dfdd32dc..a072860233 100644 --- a/app/src/main/res/values-pa/strings.xml +++ b/app/src/main/res/values-pa/strings.xml @@ -494,8 +494,8 @@ ਤੁਸੀਂ ਇਸ ਚੈਟ ਵਿੱਚ ਖੁਦ ਲਈ ਨੋਟ ਸ਼ਾਮਲ ਕਰ ਸਕਦੇ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਆਪਣੇ ਖਾਤੇ ਦੇ ਨਾਲ ਹੋਰ ਡਿਵਾਈਸਾਂ ਨੂੰ ਲਿੰਕ ਕੀਤਾ ਹੋਇਆ ਹੈ, ਤਾਂ ਨਵੇਂ ਨੋਟਸ ਉਹਨਾਂ ਨਾਲ ਵੀ ਸਿੰਕ ਕੀਤੇ ਜਾਣਗੇ। ਗਰੁੱਪ ਦੇ %1$d ਮੈਂਬਰਾਂ ਦਾ ਇੱਕੋ ਨਾਮ ਹੈ। ਸਮੀਖਿਆ ਕਰਨ ਲਈ ਟੈਪ ਕਰੋ - ਬੇਨਤੀਆਂ ਦੀ ਧਿਆਨ ਨਾਲ ਸਮੀਖਿਆ ਕਰੋ - Molly ਨੂੰ ਇਸੇ ਨਾਮ ਨਾਲ ਇੱਕ ਹੋਰ ਸੰਪਰਕ ਮਿਲਿਆ। + + This person has the same name as another contact ਸਾਡੇ ਨਾਲ ਸੰਪਰਕ ਕਰੋ ਤਸਦੀਕ ਕਰੋ ਹੁਣੇ ਨਹੀਂ @@ -1064,7 +1064,7 @@ ਤੁਹਾਡੇ ਵਰਤੋਂਕਾਰ ਨਾਂ, QR ਕੋਡ ਅਤੇ ਲਿੰਕ ਨੂੰ ਤੁਹਾਡੀ ਪ੍ਰੋਫਾਈਲ \'ਤੇ ਦਿਖਾਇਆ ਨਹੀਂ ਜਾਂਦਾ ਹੈ। ਆਪਣਾ ਵਰਤੋਂਕਾਰ ਨਾਂ ਸਿਰਫ਼ ਉਹਨਾਂ ਲੋਕਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ ਜਿਹਨਾਂ ਉੱਤੇ ਤੁਸੀਂ ਭਰੋਸਾ ਕਰਦੇ ਹੋ। - + ਲੋਕ ਹੁਣ ਤੁਹਾਡੇ ਵਿਕਲਪਿਕ ਵਰਤੋਂਕਾਰ ਨਾਂ ਦੀ ਵਰਤੋਂ ਕਰਕੇ ਤੁਹਾਨੂੰ ਸੁਨੇਹਾ ਭੇਜ ਸਕਦੇ ਹਨ ਤਾਂ ਜੋ ਤੁਹਾਨੂੰ ਆਪਣਾ ਫ਼ੋਨ ਨੰਬਰ ਦੇਣ ਦੀ ਲੋੜ ਨਾ ਪਵੇ। ਪ੍ਰੋਫਾਈਲ ਨਾਂ ਵਰਤੋਂਕਾਰ ਨਾਂ ਇਸ ਬਾਰੇ @@ -1965,9 +1965,9 @@ Signal ਕਨੈਕਸ਼ਨ - + ਤਸਦੀਕਸ਼ੁਦਾ - + No direct messages with %1$s %1$s ਤੁਹਾਡੇ ਸਿਸਟਮ ਦੇ ਸੰਪਰਕਾਂ ਵਿੱਚ ਸ਼ਾਮਲ ਹਨ @@ -2301,7 +2301,7 @@ ਵਰਤੋਂਕਾਰ ਨਾਂ ਅਵੈਧ ਹੈ। ਵਰਤੋਂਕਾਰ ਨਾਂ ਦੇ ਵਿੱਚ %1$d ਤੋਂ %2$d ਅੱਖਰ ਹੋਣੇ ਲਾਜ਼ਮੀ ਹਨ। - ਤੁਹਾਡੇ ਫ਼ੋਨ ਨੰਬਰ ਦੀ ਲੋੜ ਪਏ ਬਿਨਾਂ ਲੋਕ ਵਰਤੋਂਕਾਰ ਨਾਂ ਰਾਹੀਂ ਤੁਹਾਨੂੰ ਸੁਨੇਹਾ ਭੇਜ ਸਕਦੇ ਹਨ। ਤੁਹਾਡੇ ਪਤੇ ਨੂੰ ਪ੍ਰਾਈਵੇਟ ਰੱਖਣ ਲਈ ਵਰਤੋਂਕਾਰ ਨਾਂ ਦੇ ਵਿੱਚ ਅੰਕਾਂ ਦਾ ਜੋੜਾ ਵੀ ਸ਼ਾਮਲ ਕੀਤਾ ਜਾਂਦਾ ਹੈ। + Usernames are always paired with a set of numbers. ਇਹ ਨੰਬਰ ਕੀ ਹੈ? ਇਹ ਅੰਕ ਤੁਹਾਡੇ ਵਰਤੋਂਕਾਰ ਨਾਂ ਨੂੰ ਪ੍ਰਾਈਵੇਟ ਰੱਖਣ ਵਿੱਚ ਮਦਦ ਕਰਦੇ ਹਨ ਤਾਂ ਜੋ ਤੁਸੀਂ ਅਣਚਾਹੇ ਸੁਨੇਹਿਆਂ ਤੋਂ ਬਚ ਸਕੋ। ਆਪਣਾ ਵਰਤੋਂਕਾਰ ਨਾਂ ਸਿਰਫ਼ ਉਹਨਾਂ ਲੋਕਾਂ ਅਤੇ ਗਰੁੱਪਾਂ ਨਾਲ ਸਾਂਝਾ ਕਰੋ ਜਿਹਨਾਂ ਨਾਲ ਤੁਸੀਂ ਚੈਟ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ। ਜੇਕਰ ਤੁਸੀਂ ਵਰਤੋਂਕਾਰ ਨਾਂ ਬਦਲਦੇ ਹੋ ਤਾਂ ਅੰਕਾਂ ਨੂੰ ਵੀ ਬਦਲ ਦਿੱਤਾ ਜਾਵੇਗਾ। @@ -2322,9 +2322,9 @@ ਆਪਣੇ ਵਰਤੋਂਕਾਰ ਨਾਂ ਨੂੰ ਰਿਕਵਰ ਕਰਨ ਨਾਲ ਤੁਹਾਡਾ ਮੌਜੂਦਾ QR ਕੋਡ ਅਤੇ ਲਿੰਕ ਰੀਸੈੱਟ ਹੋ ਜਾਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਅਜਿਹਾ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? - + ਆਪਣੇ ਵਰਤੋਂਕਾਰ ਨਾਂ ਨੂੰ ਬਦਲਣ ਨਾਲ ਤੁਹਾਡਾ ਮੌਜੂਦਾ QR ਕੋਡ ਅਤੇ ਲਿੰਕ ਰੀਸੈਟ ਹੋ ਜਾਵੇਗਾ। ਕੀ ਤੁਸੀਂ ਪੱਕਾ ਅਜਿਹਾ ਕਰਨਾ ਚਾਹੁੰਦੇ ਹੋ? - + ਜਾਰੀ ਰੱਖੋ %1$d ਸੰਪਰਕ Signal ਉੱਤੇ ਹੈ! @@ -4124,8 +4124,10 @@ \"%1$s\" ਉੱਤੋਂ ਪਾਬੰਦੀ ਹਟਾ ਦਿੱਤੀ ਗਈ ਹੈ। - ਮੈਂਬਰ ਦੀ ਪੜਤਾਲ - ਬੇਨਤੀ ਦੀ ਸਮੀਖਿਆ ਕਰੋ + + Review members + + Review request %1$d ਗਰੁੱਪ ਮੈਂਬਰਾਂ ਦੇ ਨਾਂ ਇੱਕੋ ਜਿਹੇ ਹਨ, ਹੇਠਲੇ ਮੈਂਬਰਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰੋ ਅਤੇ ਕਾਰਵਾਈ ਦੀ ਚੋਣ ਕਰੋ। ਜੇ ਤੁਹਾਨੂੰ ਇਹ ਪੱਕਾ ਨਹੀਂ ਪਤਾ ਹੈ ਕਿ ਬੇਨਤੀ ਕਿਸ ਤੋਂ ਆਈ ਹੈ, ਤਾਂ ਹੇਠਲੇ ਸੰਪਰਕਾਂ ਦੀ ਸਮੀਖਿਆ ਕਰੋ ਅਤੇ ਕਾਰਵਾਈ ਕਰੋ। ਕੋਈ ਹੋਰ ਗਰੁੱਪ ਸਾਂਝੇ ਨਹੀਂ। @@ -6184,13 +6186,13 @@ ਹੋਰ ਜਾਣੋ - + ਕਨੈਕਟ ਕਰਨ ਦੇ ਨਵੇਂ ਤਰੀਕੇ - + ਪੇਸ਼ ਹੈ ਫ਼ੋਨ ਨੰਬਰ ਦੀ ਪਰਦੇਦਾਰੀ, ਵਿਕਲਪਿਕ ਵਰਤੋਂਕਾਰ ਨਾਂ ਅਤੇ ਲਿੰਕ। - + ਖਾਰਜ ਕਰੋ - + ਹੋਰ ਜਾਣੋ @@ -6490,9 +6492,9 @@ ਤੁਹਾਡੇ ਲਿੰਕ ਨੂੰ ਰੀਸੈੱਟ ਕਰਨ ਦੀ ਕੋਸ਼ਿਸ਼ ਕਰਦੇ ਸਮੇਂ ਨੈੱਟਵਰਕ ਵਿੱਚ ਕੋਈ ਗੜਬੜੀ ਆਈ ਸੀ। ਬਾਅਦ ਵਿੱਚ ਦੁਬਾਰਾ ਕੋਸ਼ਿਸ਼ ਕਰੋ। - + An unexpected error occurred while trying to reset your link. Try again later. - + ਤੁਹਾਡਾ QR ਕੋਡ ਅਤੇ ਲਿੰਕ ਰੀਸੈੱਟ ਕਰ ਦਿੱਤਾ ਗਿਆ ਹੈ ਅਤੇ ਇੱਕ ਨਵਾਂ QR ਕੋਡ ਅਤੇ ਲਿੰਕ ਬਣਾਇਆ ਗਿਆ ਹੈ। Signal ਉੱਤੇ ਮੇਰੇ ਨਾਲ ਚੈਟ ਕਰਨ ਲਈ ਆਪਣੇ ਫ਼ੋਨ ਦੇ ਨਾਲ QR ਕੋਡ ਸਕੈਨ ਕਰੋ। @@ -6563,7 +6565,7 @@ ਫ਼ੋਨ ਨੰਬਰ - ਪੂਰੇ ਵਰਤੋਂਕਾਰ ਨਾਂ ਨੂੰ ਉਸਦੇ ਅੰਕਾਂ ਦੇ ਜੋੜੇ ਦੇ ਨਾਲ ਦਰਜ ਕਰੋ। + Enter a username followed by a dot and its set of numbers. ਅੱਗੇ diff --git a/app/src/main/res/values-pl/strings.xml b/app/src/main/res/values-pl/strings.xml index 8446d52447..7226cef4a5 100644 --- a/app/src/main/res/values-pl/strings.xml +++ b/app/src/main/res/values-pl/strings.xml @@ -512,8 +512,8 @@ W tym czacie możesz dodawać swoje notatki. Jeśli z Twoim kontem są połączone jakieś urządzenia, nowe notatki zostaną zsynchronizowane. %1$d członków grupy ma to samo imię. Stuknij, aby przejrzeć - Przejrzyj uważnie wszystkie prośby - Molly znalazł inny kontakt z tym samym imieniem. + + This person has the same name as another contact Skontaktuj się z nami Zweryfikuj Nie teraz @@ -1134,7 +1134,7 @@ Twoja nazwa użytkownika, kod QR i link nie są widoczne na Twoim profilu. Udostępniaj swoją nazwę użytkownika tylko zaufanym osobom. - + Od teraz użytkownicy mogą wysyłać Ci wiadomości, używając Twojej opcjonalnej nazwy użytkownika. Nie musisz już podawać swojego numeru telefonu. Nazwa profilu Nazwa użytkownika O mnie @@ -2113,9 +2113,9 @@ Kontakt Signal - + Zweryfikowano - + No direct messages with %1$s %1$s znajduje się w kontaktach systemowych @@ -2461,7 +2461,7 @@ Nazwa użytkownika jest niepoprawna. Nazwy użytkowników muszą mieć długość od %1$d do %2$d znaków. - Nazwy użytkowników pozwalają innym na wysyłanie do Ciebie wiadomości bez konieczności podawania numeru telefonu. Są one sparowane z zestawem cyfr, które pomagają zachować prywatność Twojego adresu. + Usernames are always paired with a set of numbers. Co to za liczba? Te cyfry pomagają zachować prywatność Twojej nazwy użytkownika, dzięki czemu unikasz niechcianych wiadomości. Udostępniaj swoją nazwę użytkownika tylko tym osobom i grupom, z którymi chcesz prowadzić czat. Jeśli zmienisz nazwę użytkownika, otrzymasz nowy zestaw cyfr. @@ -2482,9 +2482,9 @@ Odzyskanie nazwy użytkownika spowoduje zresetowanie obecnego kodu QR i linku. Chcesz kontynuować? - + Zmiana nazwy użytkownika spowoduje zresetowanie obecnego kodu QR i linku. Chcesz kontynuować? - + Kontynuuj %1$dkontakt jest w Signal! @@ -4336,8 +4336,10 @@ Odblokowano „%1$s”. - Przejrzyj członków - Przejrzyj prośby + + Review members + + Review request %1$d członków grupy ma takie samo imię, przejrzyj poniższych członków i podejmij działania. Jeśli nie masz pewności, od kogo pochodzi ta prośba, przejrzyj poniższe kontakty i podejmij działania. Brak innych, wspólnych grup. @@ -6460,13 +6462,13 @@ Dowiedz się więcej - + Nowe sposoby na pozostawanie w kontakcie - + Wprowadzamy możliwość ukrycia numeru telefonu, opcjonalną nazwę użytkownika i linki do udostępniania nazw. - + Odrzuć - + Dowiedz się więcej @@ -6772,9 +6774,9 @@ W trakcie próby zresetowania linku wystąpił błąd sieci. Spróbuj ponownie później. - + An unexpected error occurred while trying to reset your link. Try again later. - + Twój kod QR i link zostały zresetowane. Utworzono nowy kod QR i link. Aby rozmawiać ze mną w Signal, zeskanuj kod QR za pomocą swojego telefonu. @@ -6849,7 +6851,7 @@ Numer telefonu - Wprowadź pełną nazwę użytkownika z dwiema cyframi. + Enter a username followed by a dot and its set of numbers. Dalej diff --git a/app/src/main/res/values-pt-rBR/strings.xml b/app/src/main/res/values-pt-rBR/strings.xml index b046d49734..760272bd1e 100644 --- a/app/src/main/res/values-pt-rBR/strings.xml +++ b/app/src/main/res/values-pt-rBR/strings.xml @@ -494,8 +494,8 @@ Você pode adicionar anotações para si mesmo/a nesse chat. Se sua conta estiver vinculada à algum dispositivo, as novas anotações serão sincronizadas. %1$d membros do grupo têm o mesmo nome. Toque para revisar - Analise os pedidos com atenção - O Molly encontrou outro contato com o mesmo nome. + + This person has the same name as another contact Entre em contato Verificar Agora não @@ -1064,7 +1064,7 @@ Seu nome de usuário, QR code e link não estão visíveis em seu perfil. Compartilhe seu nome de usuário somente com pessoas em quem você confia. - + As pessoas agora podem enviar mensagens para você usando seu nome de usuário opcional. Você não precisa mais informar seu número de telefone. Nome de perfil Nome de usuário Sobre mim @@ -1965,9 +1965,9 @@ Contatos do Signal - + Verificado - + No direct messages with %1$s %1$s está nos contatos do seu telefone @@ -2301,7 +2301,7 @@ Nome de usuário inválido. Os nomes de usuário devem conter no mínimo %1$d e no máximo %2$d caracteres. - Os nomes de usuário permitem que outras pessoas enviem mensagens para você sem precisar do seu número de telefone. Eles são pareados com um conjunto de dígitos para ajudar a manter seu endereço privado. + Usernames are always paired with a set of numbers. O que é esse número? Esses dígitos ajudam a manter seu nome de usuário privado para evitar mensagens indesejadas. Compartilhe seu nome de usuário apenas com as pessoas e grupos com os quais gostaria de conversar. Se mudar seu nome de usuário, você receberá um novo conjunto de dígitos. @@ -2322,9 +2322,9 @@ Se você recuperar seu nome de usuário, o QR code e o link existentes também serão alterados. Tem certeza? - + Se você mudar seu nome de usuário, o QR code e o link existentes também serão alterados. Tem certeza? - + Continuar %1$d contato está no Signal! @@ -4124,8 +4124,10 @@ Você desbloqueou \"%1$s\". - Revisar os membros - Analisar o pedido + + Review members + + Review request %1$d membros do grupo têm o mesmo nome. Revise os membros abaixo e decida o que fazer. Se você não tiver certeza de quem é o pedido, revise os contatos abaixo e tome as providências. Nenhum outro grupo em comum. @@ -6184,13 +6186,13 @@ Saiba mais - + Outras formas de se conectar - + Apresentando a privacidade do número de telefone, nomes de usuário e links opcionais. - + Ignorar - + Saiba mais @@ -6490,9 +6492,9 @@ Ocorreu um erro de rede ao tentar redefinir seu link. Tente novamente mais tarde. - + An unexpected error occurred while trying to reset your link. Try again later. - + Seu QR code e link foram redefinidos, e um novo código QR e link foram criados. Escaneie o QR Code com o seu telefone para conversar comigo no Signal. @@ -6563,7 +6565,7 @@ Número de telefone - Digite um nome de usuário completo com seu par de dígitos. + Enter a username followed by a dot and its set of numbers. Próximo diff --git a/app/src/main/res/values-pt/strings.xml b/app/src/main/res/values-pt/strings.xml index bbfd3e2520..17c5a45064 100644 --- a/app/src/main/res/values-pt/strings.xml +++ b/app/src/main/res/values-pt/strings.xml @@ -494,8 +494,8 @@ Pode adicionar notas para si próprio neste chat. Se a sua conta tiver algum dispositivo ligado, as novas notas serão sincronizadas. %1$d membros do grupo têm o mesmo nome. Toque para rever - Revejo os pedidos de forma cuidada - O Molly encontrou outro contacto com o mesmo nome. + + This person has the same name as another contact Contacte-nos Verificar Agora não @@ -1064,7 +1064,7 @@ O seu nome de utilizador, código QR e link não estão visíveis no seu perfil. Partilhe o seu nome de utilizador apenas com pessoas da sua confiança. - + As pessoas podem agora enviar-lhe mensagens usando o seu nome de utilizador opcional, para não ter de fornecer o seu número de telemóvel. Nome de perfil Nome de utilizador Acerca @@ -1965,9 +1965,9 @@ Contacto do Signal - + Verificado - + No direct messages with %1$s %1$s está nos seus contactos do sistema @@ -2301,7 +2301,7 @@ Nome de utilizador inválido. Os nomes de utilizadores devem ter entre %1$d e %2$d caracteres. - Os nomes de utilizador permitem às outras pessoas enviar-lhe mensagens sem precisarem do seu número de telemóvel. Estão emparelhados com um conjunto de dígitos para ajudar a manter o seu endereço privado. + Usernames are always paired with a set of numbers. Que número é este? Estes dígitos ajudam a manter o seu nome de utilizador privado, para que possa evitar mensagens indesejadas. Partilhe o seu nome de utilizador apenas com as pessoas e grupos com quem gostaria de conversar. Se mudar de nome de utilizador, receberá um novo conjunto de dígitos. @@ -2322,9 +2322,9 @@ Recuperar o seu nome de utilizador irá repor o seu código QR e link existentes. Tem a certeza? - + Alterar o seu nome de utilizador irá repor o seu código QR e link existentes. Tem a certeza? - + Continuar %1$d contacto está no Signal! @@ -4124,8 +4124,10 @@ O utilizador \"%1$s\" foi desbloqueado. - Rever membros - Rever pedido + + Review members + + Review request %1$d membros do grupo têm o mesmo nome, reveja os membros abaixo e escolha que ação tomar. Se não tiver a certeza de quem é a solicitação, analise os contactos abaixo e tome uma atitude. Sem outros grupos em comum @@ -6184,13 +6186,13 @@ Saber mais - + Novas formas de se conectar - + Introduzimos a privacidade do número de telefone, nomes de utilizador e ligações opcionais. - + Ignorar - + Saber mais @@ -6490,9 +6492,9 @@ Ocorreu um erro de ligação ao tentar redefinir o seu link. Tente novamente mais tarde. - + An unexpected error occurred while trying to reset your link. Try again later. - + O seu código QR e o seu link foram repostos e foram criados um novo código QR e link. Leia este código QR com o seu telemóvel para falar comigo no Signal. @@ -6563,7 +6565,7 @@ Número de telefone - Introduza um nome de utilizador completo e o seu par de algarismos. + Enter a username followed by a dot and its set of numbers. Seguinte diff --git a/app/src/main/res/values-ro/strings.xml b/app/src/main/res/values-ro/strings.xml index 6e5ee8ddb6..eee6b0909f 100644 --- a/app/src/main/res/values-ro/strings.xml +++ b/app/src/main/res/values-ro/strings.xml @@ -503,8 +503,8 @@ Poți adăuga notițe personale în această conversație. Dacă ai adăugat dispozitive asociate la contul tău, notițele noi vor fi sincronizate. %1$d membri ai grupului au același nume. Atinge pentru examinare - Examinează cu atenție solicitările - Molly a găsit un alt contact cu același nume. + + This person has the same name as another contact Contactează-ne Verifică Nu acum @@ -1099,7 +1099,7 @@ Numele tău de utilizator, codul QR și linkul nu sunt vizibile în profilul tău. Distribuie numele tău de utilizator doar persoanelor de încredere. - + Oamenii îți pot trimite mesaje folosind numele tău de utilizator opțional, astfel încât să nu fie nevoie să dai numărul tău de telefon. Nume profil Nume utilizator Despre @@ -2039,9 +2039,9 @@ Conexiunea Signal - + Verificat - + No direct messages with %1$s %1$s este în contactele tale de sistem @@ -2381,7 +2381,7 @@ Numele de utilizator este invalid. Numele de utilizator trebuie să aibă între %1$d și %2$d caractere. - Numele de utilizator le permite altor persoane să-ți dea mesaj fără să aibă nevoie de numărul tău de telefon. Și face pereche cu un set de cifre care ajută la menținerea adresei tale private. + Usernames are always paired with a set of numbers. Ce este acest număr? Aceste cifre ajută la menținerea confidențialității numelui de utilizator ca să tu să eviți mesajele nedorite. Dă-ți numele de utilizator doar persoanelor și grupurilor cu care vrei să conversezi. Dacă schimbi numele de utilizator vei primi un nou set de cifre. @@ -2402,9 +2402,9 @@ Schimbarea numelui de utilizator va reseta codul tău QR existent și linkul. Ești sigur/ă? - + Schimbarea numelui de utilizator va reseta codul tău QR existent și linkul. Ești sigur? - + Continuă %1$d contact este pe Signal! @@ -4230,8 +4230,10 @@ \"%1$s\" a fost deblocat. - Revizuire Membri - Revizuire Solicitări + + Review members + + Review request %1$d membri ai grupului au același nume, revizuiește membrii de mai jos și ia măsuri. Dacă nu ești sigur de la cine provine solicitarea, consultă persoanele de contact de mai jos și ia măsuri. Nu există alte grupuri în comun. @@ -6322,13 +6324,13 @@ Află mai multe - + Noi moduri de conectare - + Introducerea confidențialității numărului de telefon, nume de utilizator și link-uri opționale. - + Revocare - + Află mai multe @@ -6631,9 +6633,9 @@ A apărut o eroare de rețea la încercarea de a-ți reseta linkul. Încearcă mai târziu. - + An unexpected error occurred while trying to reset your link. Try again later. - + Codul și link-ul QR au fost resetate și au fost create unele noi. Scanează acest cod QR cu telefonul tău pentru a discuta cu mine pe Signal. @@ -6706,7 +6708,7 @@ Număr de telefon - Introdu un nume de utilizator complet cu perechea sa de cifre. + Enter a username followed by a dot and its set of numbers. Următorul diff --git a/app/src/main/res/values-ru/strings.xml b/app/src/main/res/values-ru/strings.xml index 7c907559d5..64cadd2fb4 100644 --- a/app/src/main/res/values-ru/strings.xml +++ b/app/src/main/res/values-ru/strings.xml @@ -512,8 +512,8 @@ Вы можете добавлять заметки для себя в этом чате. Если у вашей учётной записи есть привязанные устройства, то новые заметки будут синхронизированы. %1$d участников группы имеют одинаковое имя. Нажмите, чтобы проверить - Внимательно проверяйте запросы - Molly нашёл другой контакт с тем же именем. + + This person has the same name as another contact Связаться с нами Подтвердить Не сейчас @@ -1134,7 +1134,7 @@ Ваше имя пользователя, QR-код и ссылка не видны в вашем профиле. Делитесь вашим именем пользователя только с теми, кому доверяете. - + Теперь люди могут писать вам сообщения, используя выбранное вами имя пользователя, поэтому вам не нужно делиться вашим номером телефона. Имя профиля Имя пользователя Обо мне @@ -2113,9 +2113,9 @@ Контакт Signal - + Подтверждён - + No direct messages with %1$s %1$s есть в ваших системных контактах @@ -2461,7 +2461,7 @@ Имя пользователя недействительно. Имена пользователей должны содержать от %1$d до %2$d символов. - Имена пользователей позволяют другим пользователям отправлять вам сообщения без вашего номера телефона. Они соединены с набором цифр, чтобы сохранить ваш адрес в тайне. + Usernames are always paired with a set of numbers. Что это за число? Эти цифры помогают сохранить ваше имя пользователя в тайне и избежать нежелательных сообщений. Делитесь своим именем пользователя только с теми людьми и группами, с которыми вы хотели бы общаться. Если вы измените имя пользователя, вы получите новый набор цифр. @@ -2482,9 +2482,9 @@ При восстановлении имени пользователя ваши существующие QR-код и ссылка будут сброшены. Вы уверены? - + При изменении имени пользователя ваши существующие QR-код и ссылка будут сброшены. Вы уверены? - + Продолжить %1$d ваш контакт уже в Signal! @@ -4336,8 +4336,10 @@ «%1$s» разблокирован(-а). - Проверьте участников - Проверьте запрос + + Review members + + Review request %1$d участников группы имеют одинаковое имя. Просмотрите участников ниже и, если необходимо, примите меры. Если вы не уверены, от кого этот запрос, просмотрите участников ниже и примите меры. Нет других общих групп. @@ -6460,13 +6462,13 @@ Узнать больше - + Новые способы связи - + Представляем конфиденциальность телефонных номеров, дополнительные имена пользователя и ссылки. - + Закрыть - + Узнать больше @@ -6772,9 +6774,9 @@ Произошла ошибка сети при попытке сбросить ссылку. Попробуйте ещё раз позже. - + An unexpected error occurred while trying to reset your link. Try again later. - + Ваш QR-код и ссылка были сброшены, и были созданы новый QR-код и ссылка. Просканируйте этот QR-код с помощью вашего телефона, чтобы начать чат со мной в Signal. @@ -6849,7 +6851,7 @@ Номер телефона - Введите полное имя пользователя с парой цифр. + Enter a username followed by a dot and its set of numbers. Далее diff --git a/app/src/main/res/values-sk/strings.xml b/app/src/main/res/values-sk/strings.xml index 1a1679c3f8..ff36661f04 100644 --- a/app/src/main/res/values-sk/strings.xml +++ b/app/src/main/res/values-sk/strings.xml @@ -512,8 +512,8 @@ V tomto čete si môžete pridávať poznámky. Ak máte vo svojom účte nejaké prepojené zariadenia, nové poznámky sa budú synchronizovať. %1$d členovia skupiny majú rovnaké meno. Ťuknite pre kontrolu - Požiadavky pozorne overte - Molly našiel ďalší kontakt s rovnakým menom. + + This person has the same name as another contact Kontaktujte nás Overiť Teraz nie @@ -1134,7 +1134,7 @@ Vaše používateľské meno, QR kód a odkaz sa nezobrazujú vo vašom profile. Svoje používateľské meno zdieľajte iba s ľuďmi, ktorým dôverujete. - + Ľudia vám teraz môžu posielať správy pomocou vášho voliteľného používateľského mena. Svoje telefónne číslo preto nemusíte uvádzať. Názov profilu Používateľské meno Informácie @@ -2113,9 +2113,9 @@ Signal spojenie - + Overený - + No direct messages with %1$s %1$s je vo vašich systémových kontaktoch @@ -2461,7 +2461,7 @@ Používateľské meno je neplatné. Používateľské mená musia obsahovať %1$d až %2$d znakov. - Vytvorením používateľského mena umožníte ostatným, aby vám posielali správy bez nutnosti zadať vaše telefónne číslo. Je spárované so sadou číslic, ktorá zaručuje súkromie vašej adresy. + Usernames are always paired with a set of numbers. Čo znamená toto číslo? Tieto číslice pomáhajú zachovať súkromie vášho používateľského mena, vďaka čomu sa vyhnete neželaným správam. Svoje používateľské meno zdieľajte iba s ľuďmi a skupinami, s ktorými chcete četovať. Ak si používateľské meno zmeníte, bude vám priradená nová sada číslic. @@ -2482,9 +2482,9 @@ Obnovením používateľského mena sa resetuje váš existujúci QR kód a odkaz. Naozaj chcete pokračovať? - + Zmenou používateľského mena sa resetuje váš existujúci QR kód a odkaz. Naozaj chcete pokračovať? - + Pokračovať %1$d váš kontakt začal používať Signal! @@ -4336,8 +4336,10 @@ Používateľ „%1$s“ bol odblokovaný. - Overiť členov - Overiť žiadosť + + Review members + + Review request %1$d členovia skupiny majú rovnaké meno. Overte nižšie zobrazených členov a zvoľte ďalší krok. Ak si nie ste istý/á, od koho je táto žiadosť, overte nižšie zobrazené kontakty a zvoľte úkon. Žiadne ďalšie spoločné skupiny. @@ -6460,13 +6462,13 @@ Zistiť viac - + Nové spôsoby, ako sa spojiť - + Predstavujeme funkciu utajenia telefónneho čísla, voliteľné používateľské mená a odkazy. - + Zrušiť - + Zistiť viac @@ -6772,9 +6774,9 @@ Pri pokuse o resetovanie vášho odkazu sa vyskytla chyba siete. Skúste to znova neskôr. - + An unexpected error occurred while trying to reset your link. Try again later. - + Váš QR kód a odkaz boli resetované a bol vytvorený nový QR kód a odkaz. Naskenujte tento QR kód pomocou telefónu a četujte so mnou v aplikácii Signal. @@ -6849,7 +6851,7 @@ Telefónne číslo - Zadajte celé používateľské meno s párom číslic. + Enter a username followed by a dot and its set of numbers. Ďalej diff --git a/app/src/main/res/values-sl/strings.xml b/app/src/main/res/values-sl/strings.xml index 84e216036f..b0cee7ab9e 100644 --- a/app/src/main/res/values-sl/strings.xml +++ b/app/src/main/res/values-sl/strings.xml @@ -512,8 +512,8 @@ Klepetu je mogoče dodajati opombe, ki so vidne samo vam. Če je vaš račun povezan z drugimi napravami, se bodo te opombe sinhronizirale. %1$d članov_ic skupine ima enako ime. Tapnite za pregled - Pazljivo preglejte prošnje - Molly je našel drug stik z enakim imenom. + + This person has the same name as another contact Kontaktirajte nas Potrdi Ne zdaj @@ -1134,7 +1134,7 @@ Vaše uporabniško ime, QR koda in povezava niso vidni na vašem profilu. Svoje uporabniško ime delite samo z osebami, ki jim zaupate. - + Ljudje vam lahko zdaj pošiljajo sporočila z uporabo vašega neobveznega uporabniškega imena, tako da vam ni treba izdati svoje telefonske številke. Ime profila Uporabniško ime Več @@ -2113,9 +2113,9 @@ Signal povezava - + Potrjeno - + No direct messages with %1$s %1$s je med vašimi sistemskimi stiki @@ -2461,7 +2461,7 @@ Uporabniško ime je neveljavno. Uporabniška imena morajo vsebovati od %1$d in%2$d znakov. - S pomočjo uporabniških imen vam lahko drugi pošljejo sporočilo, brez da bi potrebovali vašo telefonsko številko. Seznanjeni so z nizom številk, ki pomagajo ohranjati zasebnost vašega naslova. + Usernames are always paired with a set of numbers. Kaj je ta številka? Te številke pomagajo ohranjati zasebnost vašega uporabniškega imena, da se lahko izognete neželenim sporočilom. Svoje uporabniško ime delite samo z osebami in skupinami, s katerimi želite klepetati. Če spremenite uporabniška imena, boste prejeli nov nabor številk. @@ -2482,9 +2482,9 @@ Obnovitev vašega uporabniškega imena bo ponastavila vašo obstoječo QR kodo in povezavo. Ste prepričani? - + Če spremenite svoje uporabniško ime, boste ponastavili obstoječo QR kodo in povezavo. Ste prepričani? - + Nadaljuj %1$d stik je na Signalu! @@ -4336,8 +4336,10 @@ \"%1$s\" je bil_a odblokiran_a. - Pregled članov_ic - Pregled prošenj + + Review members + + Review request %1$d članov_ic skupine ima enako ime. Preglejte člane_ice spodaj in ustrezno ukrepajte. Če niste prepričani, čigava je prošnja, preglejte stike spodaj in ustrezno ukrepajte. Ni drugih skupnih skupin. @@ -6460,13 +6462,13 @@ Preberite več - + Novi načini povezovanja - + Predstavljamo zasebnost telefonskih številk, neobvezna uporabniška imena in povezave. - + Prekini - + Preberite več @@ -6772,9 +6774,9 @@ Med poskusom ponastavitve povezave je prišlo do omrežne napake. Poskusite znova kasneje. - + An unexpected error occurred while trying to reset your link. Try again later. - + Vaša QR koda in povezava sta bili ponastavljeni in ustvarjeni sta bili nova QR koda in povezava. S svojim telefonom skeniraj to QR kodo in klepetaj z mano na Signalu. @@ -6849,7 +6851,7 @@ Telefonska številka - Vnesite celotno uporabniško ime s parom številk. + Enter a username followed by a dot and its set of numbers. Naprej diff --git a/app/src/main/res/values-sq/strings.xml b/app/src/main/res/values-sq/strings.xml index 8f9bd10444..5b15c91b33 100644 --- a/app/src/main/res/values-sq/strings.xml +++ b/app/src/main/res/values-sq/strings.xml @@ -494,8 +494,8 @@ Mund të shtosh shënime për veten në këtë bisedë. Nëse llogaria jote ka ndonjë pajisje të lidhur, shënimet e reja do të sinkronizohen. %1$d anëtarë grupi kanë të njëjtin emër. Kliko për të rishikuar - Shqyrtoni me kujdes kërkesat - Molly gjeti një kontakt tjetër me të njëjtin emër. + + This person has the same name as another contact Na kontaktoni Verifikoje Jo tani @@ -1064,7 +1064,7 @@ Emri i përdoruesit, kodi QR dhe lidhja nuk shfaqen në profil. Ndaje emrin e përdoruesit vetëm me njerëzit e besueshëm. - + Njerëzit tani mund të të dërgojnë mesazhe duke përdorur emrin opsional të përdoruesit që të mos kesh nevojë të japësh numrin e telefonit. Emri i profilit Emri i përdoruesit Rreth @@ -1965,9 +1965,9 @@ Kontaktet e Signal - + Verifiikuar - + No direct messages with %1$s %1$s është në kontaktet e sistemit @@ -2301,7 +2301,7 @@ Emri i pavlefshëm përdoruesi. Emrat e përdoruesit duhet të jenë mes %1$d dhe %2$d shenjash. - Emrat e përdoruesve lejojnë që të tjerët të të dërgojnë mesazhe, pa pasur nevojë për numrin tënd të telefonit. Ata binjakëzohen me një bashkësi shifrash për të ruajtur fshehtësinë e adresës tënde. + Usernames are always paired with a set of numbers. Çfarë është ky numër? Këto shifra ndihmojnë të ruash fshehtësinë e emrit tënd të përdoruesit, që të shmangësh mesazhet e padëshiruara. Ndaj emrin e përdoruesit vetëm me personat dhe grupet me të cilat dëshiron të bisedosh. Nëse ndryshon emrin e përdoruesit, atëherë do të marrësh një bashkësi të re shifrash. @@ -2322,9 +2322,9 @@ Rivendosja e emrit të përdoruesit do të rivendosë edhe kodin QR me lidhjen ekzistuese. Je i sigurt? - + Ndryshimi i emrit të përdoruesit do të rivendosë kodin QR dhe lidhjen ekzistuese. Je i sigurt? - + Vazhdo %1$d kontakt është në Signal! @@ -4124,8 +4124,10 @@ \"%1$s\" u zhbllokua. - Shqyrtoni Anëtarë - Shqyrtoni Kërkesë + + Review members + + Review request %1$d anëtarë grupi kanë të njëjtin emër, shqyrtoni anëtarët më poshtë dhe zgjidhni kryerjen e një veprimi. Nëse s\\’jeni i sigurt se prej kujt është kërkesa, shqyrtoni kontaktet më poshtë dhe kryeni një veprim. S\\’ka grupe të tjerë të përbashkët. @@ -6184,13 +6186,13 @@ Mëso më shumë - + Mënyra të reja për t\'u lidhur - + Prezantimi i privatësisë së numrave të telefonit, emrave opsionalë të përdoruesve dhe lidhjeve. - + Kaloje - + Mëso më shumë @@ -6490,9 +6492,9 @@ Ndodhi një gabim në rrjet gjatë përpjekjes për të rivendosur lidhjen tënde. Provo sërish më vonë. - + An unexpected error occurred while trying to reset your link. Try again later. - + Lidhja dhe kodi QR janë rivendosur dhe është krijuar lidhje dhe kod QR i ri. Skano kodin QR nga telefoni për të biseduar me mua në Signal. @@ -6563,7 +6565,7 @@ Numër telefoni - Vendos emrin e plotë të përdoruesit bashkë me grupin e shifrave. + Enter a username followed by a dot and its set of numbers. Tjetër diff --git a/app/src/main/res/values-sr/strings.xml b/app/src/main/res/values-sr/strings.xml index b8ce60f756..7685275e0e 100644 --- a/app/src/main/res/values-sr/strings.xml +++ b/app/src/main/res/values-sr/strings.xml @@ -494,8 +494,8 @@ Можете додати личне белешке у ово ћаскање. Ако на налогу имате повезане уређаје, нове белешке ће бити синхронизоване. %1$d чланова групе имају исти назив. Додирните за преглед - Пажљиво прегледајте захтеве - Услуга Molly је пронашла други контакт са истим називом. + + This person has the same name as another contact Контактирај нас Овери Не сада @@ -1064,7 +1064,7 @@ Ваше корисничко име, QR код и линк нису видљиви на вашем профилу. Корисничко име дајте само са људима којима верујете. - + Људи сада могу да вам шаљу поруке преко вашег опционог корисничког имена, тако да не морате да дајете свој број телефона. Име на профилу Корисничко име О контакту @@ -1965,9 +1965,9 @@ Signal веза - + Верификован корисник - + No direct messages with %1$s %1$s је у вашим системским контактима @@ -2301,7 +2301,7 @@ Корисничко име је неважеће. Корисничко име мора садржати између %1$d и %2$d карактера. - Корисничка имена омогућавају другима да вам шаљу поруке без вашег броја телефона. Она се упарују са бројем који омогућава да ваша адреса остане приватна. + Usernames are always paired with a set of numbers. Šta znači ovaj broj? Овај број омогућава да ваше корисничко име остане приватно како бисте избегли нежељене поруке. Поделите своје корисничко име само са људима и групама са којима бисте желели да ћаскате. Ако промените корисничко име, биће вам додељен нови број. @@ -2322,9 +2322,9 @@ Ако вратите корисничко име, ресетоваће вам се постојећи QR код и линк. Да ли сте сигурни? - + Ако промените корисничко име, ресетоваће вам се постојећи QR код и линк. Да ли сте сигурни? - + Настави %1$d контакт је на Signal-у! @@ -4124,8 +4124,10 @@ Корисник је одблокиран (%1$s). - Прегледајте чланове - Прегледајте захтев + + Review members + + Review request %1$d чланова групе имају исто име, прегледајте чланове у наставку и одаберите акцију. Ако нисте сигурни од кога потиче захтев, прегледајте доње контакте и предузмите мере. Нема других заједничких група @@ -6184,13 +6186,13 @@ Сазнајте више - + Нови начини повезивања - + Представљамо приватност бројева телефона, опциона корисничка имена и линкове. - + Одбаци - + Сазнајте више @@ -6490,9 +6492,9 @@ Дошло је до грешке на мрежи приликом покушаја ресетовања линка. Пробајте поново касније. - + An unexpected error occurred while trying to reset your link. Try again later. - + Ваш QR код и линк су ресетовани и креирани су нови QR код и линк. Скенирај овај QR код телефоном да ћаскаш са мном на Signal-у. @@ -6563,7 +6565,7 @@ Број телефона - Унесите пуно корисничко име заједно са његовим паром цифара. + Enter a username followed by a dot and its set of numbers. Даље diff --git a/app/src/main/res/values-sv/strings.xml b/app/src/main/res/values-sv/strings.xml index 0c07e8ce65..598746318d 100644 --- a/app/src/main/res/values-sv/strings.xml +++ b/app/src/main/res/values-sv/strings.xml @@ -494,8 +494,8 @@ Du kan lägga till anteckningar för dig själv i denna chatt. Om ditt konto har några länkade enheter synkroniseras nya anteckningar. %1$d gruppmedlemmar har samma namn. Tryck för att granska - Granska förfrågningar noggrant - Molly hittade en annan kontakt med samma namn. + + This person has the same name as another contact Kontakta oss Verifiera Inte nu @@ -1064,7 +1064,7 @@ Ditt användarnamn, QR-kod och länk syns inte på din profil. Dela bara ditt användarnamn med personer du litar på. - + Nu går det att skicka meddelanden till dig med ditt valfria användarnamn så att du inte behöver ange ditt telefonnummer. Profilnamn Användarnamn Om @@ -1965,9 +1965,9 @@ Signal-förbindelse - + Verifierat - + No direct messages with %1$s %1$s finns i dina systemkontakter @@ -2301,7 +2301,7 @@ Användarnamnet är ogiltigt. Användarnamn måste vara mellan %1$d och %2$d tecken. - Användarnamn låter andra skicka meddelanden till dig utan att de behöver ditt telefonnummer. De kopplas till en uppsättning siffror för att hålla din adress privat. + Usernames are always paired with a set of numbers. Vad är det här för nummer? De här siffrorna håller ditt användarnamn privat, så du slipper få oönskade meddelanden. Dela endast ditt användarnamn med personer och grupper som du vill ha kontakt med. Du får nya siffror om du byter användarnamn. @@ -2322,9 +2322,9 @@ Om du återställer ditt användarnamn återställs din befintliga QR-kod och länk. Är du säker? - + Om du ändrar ditt användarnamn återställs din befintliga QR-kod och länk. Är du säker? - + Fortsätt %1$d kontakt finns på Signal! @@ -4124,8 +4124,10 @@ \"%1$s\" har avblockerats. - Granska medlemmar - Granska förfrågan + + Review members + + Review request %1$d gruppmedlemmar har samma namn, granska medlemmarna nedan och välj att vidta åtgärder. Om du inte är säker på vem förfrågan kommer från, granska kontakterna nedan och vidta åtgärder. Inga andra grupper gemensamt. @@ -6184,13 +6186,13 @@ Läs mer - + Nya sätt att skapa kontakt - + Vi introducerar sekretess för telefonnummer, valfria användarnamn och länkar. - + Avfärda - + Läs mer @@ -6490,9 +6492,9 @@ Ett nätverksfel uppstod när du försökte återställa länken. Försök igen senare. - + An unexpected error occurred while trying to reset your link. Try again later. - + Din QR-kod och länk har återställts och en ny QR-kod och länk har skapats. Skanna denna QR-kod med din telefon för att chatta med mig på Signal. @@ -6563,7 +6565,7 @@ Telefonnummer - Ange ett fullständigt användarnamn med dess sifferpar. + Enter a username followed by a dot and its set of numbers. Nästa diff --git a/app/src/main/res/values-sw/strings.xml b/app/src/main/res/values-sw/strings.xml index 0471fed459..7ee76ef9b8 100644 --- a/app/src/main/res/values-sw/strings.xml +++ b/app/src/main/res/values-sw/strings.xml @@ -494,8 +494,8 @@ Unaweza kujiongezea vidokezo kwenye gumzo hili. Ikiwa akaunti yako ina vifaa vyovyote vilivyounganishwa, vidokezo vipya vitasawazishwa. Washiriki %1$d wa kikundi wana majina yanayofanana Gusa ili ukague - Kagua maombi kwa uangalifu - Molly imempata mtu mwingine mwenye jina kama hili. + + This person has the same name as another contact Wasiliana nasi Hakikisha Sio sasa @@ -1064,7 +1064,7 @@ Jina lako la mtumiaji, code yako ya QR na kiungo havionekani kwenye wasifu wako. Shiriki jina lako la mtumiaji na watu unaowaamini tu. - + Sasa watu wanaweza kukutumia ujumbe kwa kutumia jina lako la mtumiaji la ziada ili usilazimike kutoa nambari yako ya simu. Jina la wasifu Jina la mtumiaji Kuhusu @@ -1965,9 +1965,9 @@ Signal Connection - + Imethibitishwa - + No direct messages with %1$s %1$s yupo kwenye wawasiliani wako wa simu @@ -2301,7 +2301,7 @@ Jina la mtumiaji si halali. Majina ya watumiaji lazima yawe kati ya vibambo %1$dna %2$d. - Majina ya watumiaji yanawawezesha wengine kutuma ujumbe bila kuhitaji nambari yako ya simu. Yameoanishwa na seti ya tarakimu kukusaidia kuiweka siri anuani yako. + Usernames are always paired with a set of numbers. Hii ni nambari gani? Tarakimu hizi ni usaidizi wa kuliweka jina lako la mtumiaji siri ili uweze kuepuka jumbe usizozihitaji. Shiriki jina lako la mtumiaji na watu na makundi unayopenda kuzungumza nayo tu. Ukibadili jina lako la mtumiaji, utapata seti mpya ya tarakimu. @@ -2322,9 +2322,9 @@ Kurejesha jina lako la mtumiaji kutaweka upya mipangilio ya code ya QR na kiungo kilichopo. Una uhakika? - + Kubadili jina lako la mtumiaji kutaweka upya mipangilio ya msimbo na kiungo cha QR kilichopo. Una uhakika? - + Endelea Anwani %1$diko katika Signal! @@ -4124,8 +4124,10 @@ \"%1$s\" ameondolewa kizuizi. - Kagua Wanachama - Kagua Ombi + + Review members + + Review request Washiriki %1$d wa kikundi wana majina yanayofanana, wakague wanachama hapa chini na uchague kuchukua hatua. Ikiwa hujui ombi hili limetoka kwa nani, kagua waasiliani walio hapa chini na uchukue hatua. Hakuna vikundi vingine mnavyoshiriki pamoja. @@ -6184,13 +6186,13 @@ Jifunze zaidi - + Njia mpya za kufahamiana - + Tunatambulisha faragha ya nambari ya simu, majina ya watumiaji ya hiari na viungo. - + Tupilia mbali - + Jifunze zaidi @@ -6490,9 +6492,9 @@ Hitilafu ya kimtandao imetokea wakati wa kuweka upya kiungo chako. Jaribu tena baadaye. - + An unexpected error occurred while trying to reset your link. Try again later. - + Code yako ya QR na kiungo imewekwa upya na code mpya ya QR na kiungo imeundwa. Skani code hii ya QR kupitia simu yako ili upige gumzo nami kwenye Signal. @@ -6563,7 +6565,7 @@ Nambari ya simu - Andika jina kamili la mtumiaji na nambari yake ya tarakimu. + Enter a username followed by a dot and its set of numbers. Inayofuata diff --git a/app/src/main/res/values-ta/strings.xml b/app/src/main/res/values-ta/strings.xml index 45a9a2bc6f..c69e12e4a5 100644 --- a/app/src/main/res/values-ta/strings.xml +++ b/app/src/main/res/values-ta/strings.xml @@ -494,8 +494,8 @@ இந்த சாட்டில் உங்களுக்கான குறிப்புகளைச் சேர்க்கலாம். உங்கள் கணக்கில் இணைக்கப்பட்ட டிவைஸ்கள் ஏதேனும் இருந்தால், புதிய குறிப்புகள் ஒத்திசைக்கப்படும். %1$dகுழு உறுப்பினர்களுக்கு ஒரே பெயர் உண்டு. மதிப்பாய்வு செய்ய தட்டவும் - கோரிக்கைகளை கவனமாக மதிப்பாய்வு செய்யவும் - அதே பெயருடன் மற்றொரு தொடர்பை Molly கண்டறிந்தது. + + This person has the same name as another contact எங்களை தொடர்பு கொள்ள சரிபார்க்கவும் இப்போது இல்லை @@ -1064,7 +1064,7 @@ உங்கள் பயனர் பெயர், QR குறியீடு மற்றும் இணைப்பு ஆகியவை உங்கள் ப்ரொஃபைலில் தெரியாது. உங்களுக்கு நம்பிக்கையானர்வர்களுடன் மட்டும் உங்கள் பயனர் பெயரைப் பகிரவும். - + உங்கள் விருப்பத் தேர்ந்தெடுப்புக்குரிய பயனர் பெயரைப் பயன்படுத்தி மக்கள் இப்போது உங்களுக்கு மெசேஜ் அனுப்ப முடியும் என்பதால், உங்கள் தொலைபேசி எண்ணை நீங்கள் பகிர வேண்டியதில்லை. ப்ரொஃபைல் பெயர் பயனர் பெயர் பற்றி @@ -1965,9 +1965,9 @@ சிக்னல் இணைப்பு - + சரிபார்க்கப்பட்டது - + No direct messages with %1$s உங்கள் சிஸ்டம் தொடர்புகளில் %1$s உள்ளார் @@ -2301,7 +2301,7 @@ பயனர் பெயர் தவறானது. பயனர் பெயர்கள் %1$d மற்றும் %2$d எழுத்துக்களுக்கு இடையில் இருக்க வேண்டும். - பயனர் பெயர்கள் உங்கள் தொலைபேசி எண் இல்லாமல் மற்றவர்கள் உங்களுக்கு செய்தி அனுப்ப அனுமதிக்கும். உங்கள் முகவரியைத் தனிப்பட்டதாக வைத்திருக்க உதவுவதற்காக இலக்கங்களின் தொகுப்புடன் அவை இணைக்கப்பட்டுள்ளன. + Usernames are always paired with a set of numbers. இந்த எண் என்ன? இந்த இலக்கங்கள் உங்கள் பயனர் பெயரைத் தனிப்பட்டதாக வைத்திருக்க உதவுவதால் நீங்கள் தேவையற்ற செய்திகளைத் தவிர்க்கலாம். நீங்கள் சாட் செய்ய விரும்பும் நபர்கள் மற்றும் குழுக்களுடன் மட்டும் உங்கள் பயனர் பெயரைப் பகிரவும். நீங்கள் பயனர் பெயர்களை மாற்றினால், புதிய இலக்கங்களின் ஒரு தொகுப்பைப் பெறுவீர்கள். @@ -2322,9 +2322,9 @@ உங்கள் பயனர் பெயரை மீட்டமைப்பது உங்கள் தற்போதைய QR குறியீடு மற்றும் இணைப்பை மீட்டமைக்கும். நீங்கள் உறுதியாக உள்ளீர்களா? - + உங்கள் பயனர் பெயரை மாற்றுவது உங்கள் தற்போதைய QR குறியீடு மற்றும் இணைப்பை மீட்டமைக்கும். உறுதியாக உள்ளீர்களா? - + தொடர்க %1$d தொடர்பு Signal-இல் உள்ளார்! @@ -4124,8 +4124,10 @@ \"%1$s\" தடைநீக்கப்பட்டார். - மதிப்பாய்வு உறுப்பினர்கள் - கோரிக்கையை மதிப்பாய்வு செய்யவும் + + Review members + + Review request %1$dகுழு உறுப்பினர்களுக்கு ஒரே பெயர் உள்ளது, கீழே உள்ள உறுப்பினர்களை மதிப்பாய்வு செய்து நடவடிக்கை எடுக்க முடிவு செய்யுங்கள் உங்களுக்கு யார் கோரிக்கையை அனுப்பினார்கள் என்பது உங்களுக்குத் தெரியாவிட்டால், கீழே உள்ள தொடர்புகளை மதிப்பாய்வு செய்து நடவடிக்கை எடுக்கவும். பொதுவான குழுக்கள் இல்லை @@ -6184,13 +6186,13 @@ மேலும் அறிக - + இணைவதற்கான புதிய வழிகள் - + தொலைபேசி எண் தனியுரிமை, விருப்பத் தேர்ந்தெடுப்புக்குரிய பயனர் பெயர்கள் மற்றும் இணைப்புகளை அறிமுகப்படுத்துகிறோம். - + நிராகரி - + மேலும் அறிக @@ -6490,9 +6492,9 @@ உங்கள் இணைப்பை மீட்டமைக்க முயலும்போது நெட்வர்க் பிழை ஏற்பட்டது. பின்னர் மீண்டும் முயலவும். - + An unexpected error occurred while trying to reset your link. Try again later. - + உங்கள் QR குறியீடு மற்றும் இணைப்பு மீட்டமைக்கப்பட்டு புதிய QR குறியீடு மற்றும் இணைப்பு உருவாக்கப்பட்டுள்ளது. என்னுடன் சிக்னலில் சாட் செய்ய இந்த QR குறியீட்டை உங்கள் ஃபோன் மூலம் ஸ்கேன் செய்யவும். @@ -6563,7 +6565,7 @@ தொலைபேசி எண் - முழு பயனர் பெயரை அதன் இரண்டு எண்களுடன் உள்ளிடவும். + Enter a username followed by a dot and its set of numbers. அடுத்து diff --git a/app/src/main/res/values-te/strings.xml b/app/src/main/res/values-te/strings.xml index 5f2e050183..68dd18cfaf 100644 --- a/app/src/main/res/values-te/strings.xml +++ b/app/src/main/res/values-te/strings.xml @@ -494,8 +494,8 @@ ఈ చాట్‌లో మీరు మీ కోసం గమనికలను జోడించవచ్చు. ఒకవేళ మీ ఖాతాలో ఏదైనా లింక్ చేయబడిన పరికరాలు ఉంటే, కొత్త గమనికలు సమకాలీకరించబడతాయి. %1$d సమూహ సభ్యులకు అదే పేరు ఉంది. సమీక్షించడానికి నొక్కండి - అభ్యర్థనలను జాగ్రత్తగా సమీక్షించండి - Molly అదే పేరుతో మరొక పరిచయాన్ని కనుగొంది. + + This person has the same name as another contact మమ్మల్ని సంప్రదించండి నిర్ధారించబడిన ఇప్పుడు కాదు @@ -1064,7 +1064,7 @@ మీ యూజర్‌నేమ్, QR కోడ్ మరియు లింక్ మీ ప్రొఫైల్‌లో కనిపించవు. మీకు నమ్మకం ఉన్న వ్యక్తులతో మాత్రమే మీ యూజర్‌నేమ్‌ను పంచుకోండి. - + మీ ఐచ్ఛిక యూజర్‌నేమ్‌ను ఉపయోగించి వ్యక్తులు ఇప్పుడు మీకు సందేశం పంపగలరు కాబట్టి మీరు మీ ఫోన్ నంబర్‌ను ఇవ్వాల్సిన అవసరం లేదు. ఖాతాదారుని పేరు వినియోగదారుడు గురించి @@ -1965,9 +1965,9 @@ Signal కనెక్షన్ - + నిర్థారించబడింది - + No direct messages with %1$s %1$s మీ సిస్టమ్ కాంటాక్ట్‌లలో ఉన్నారు @@ -2301,7 +2301,7 @@ మీ యూసర్ నేమ్ సరైనది కాదు. వినియోగదారు పేర్లు %1$dమరియు %2$dఅక్షరాల మధ్య ఉండాలి. - యూజర్‌నేమ్‌లు మీ ఫోన్ నంబర్ అవసరం లేకుండానే ఇతరులు మీకు సందేశం పంపడానికి అనుమతిస్తాయి. మీ చిరునామాను గోప్యంగా ఉంచడంలో సహాయం చేయడానికి అవి పలు అంకెలతో జతచేయబడతాయి. + Usernames are always paired with a set of numbers. ఈ నంబర్ ఏమిటి? ఈ అంకెలు మీ యూజర్‌నేమ్‌ను గోప్యంగా ఉంచడానికి సహాయపడతాయి, కాబట్టి మీరు అవాంఛిత సందేశాలను నివారించవచ్చు. మీరు చాట్ చేయాలని ఇష్టపడే వ్యక్తులు మరియు గ్రూపులతో మాత్రమే మీ యూజర్‌నేమ్‌ను పంచుకోండి. మీరు యూజర్‌నేమ్‌లను మార్చితే, మీరు కొత్త అంకెల సమూహాన్ని పొందుతారు. @@ -2322,9 +2322,9 @@ మీ యూజర్‌నేమ్‌ను పునరుద్ధరించడం వలన మీ ప్రస్తుత QR కోడ్ మరియు లింక్ రీసెట్ చేయబడతాయి. ఖచ్చితంగా చేయాలా? - + మీ యూజర్‌నేమ్‌ను మార్చడం వలన మీ ప్రస్తుత QR కోడ్ మరియు లింక్ రీసెట్ చేయబడతాయి. మీరు ఖచ్చితంగా చేయాలని అనుకుంటున్నారా? - + కొనసాగండి %1$d పరిచయం Signal‌లో ఉంది! @@ -4124,8 +4124,10 @@ \"%1$s\" అన్‌బ్లాక్ చేయబడినారు. - సభ్యులను సమీక్షించండి - అభ్యర్థనను సమీక్షించండి + + Review members + + Review request %1$d మంది సమూహ సభ్యులకు ఒకే పేరు ఉంది, దిగువ సభ్యులను సమీక్షించండి మరియు చర్య తీసుకోవడానికి ఎంచుకోండి. అభ్యర్థన ఎవరో మీకు తెలియకపోతే, దిగువ పరిచయాలను సమీక్షించి చర్య తీసుకోండి. ఉమ్మడిగా ఇతర సమూహాలు లేవు. @@ -6184,13 +6186,13 @@ మరింత తెలుసుకోండి - + కనెక్ట్ కావడానికి కొత్త మార్గాలు - + ఫోన్ నంబర్ గోప్యత, ఐచ్ఛిక యూజర్‌నేమ్‌లు మరియు లింక్‌లను పరిచయం చేస్తున్నాము. - + రద్దుచేసే - + మరింత తెలుసుకోండి @@ -6490,9 +6492,9 @@ మీ లింక్‌ను రీసెట్ చేయడానికి ప్రయత్నిస్తున్నప్పుడు నెట్‌వర్క్ లోపం ఏర్పడింది. తరువాత మళ్ళీ ప్రయత్నించండి. - + An unexpected error occurred while trying to reset your link. Try again later. - + మీ QR కోడ్ మరియు లింక్ రీసెట్ చేయబడ్డాయి మరియు కొత్త QR కోడ్ మరియు లింక్ సృష్టించబడ్డాయి. Signal లో నాతో చాట్ చేయడానికి మీ ఫోన్‌తో ఈ QR కోడ్‌ను స్కాన్ చేయండి. @@ -6563,7 +6565,7 @@ ఫోన్ నంబర్ - పూర్తి యూజర్‌నేమ్‌ను దాని అంకెల జతతో ఎంటర్ చేయండి. + Enter a username followed by a dot and its set of numbers. తరువాత diff --git a/app/src/main/res/values-th/strings.xml b/app/src/main/res/values-th/strings.xml index 62d800e4d3..6a0ebd9316 100644 --- a/app/src/main/res/values-th/strings.xml +++ b/app/src/main/res/values-th/strings.xml @@ -485,8 +485,8 @@ คุณสามารถเพิ่มบันทึกถึงตัวเองได้ในแชทนี้ และหากบัญชีของคุณมีอุปกรณ์ที่เชื่อมโยงอยู่ บันทึกใหม่ก็จะถูกซิงค์ด้วยเช่นกัน สมาชิกกลุ่ม %1$d คนมีชื่อเหมือนกัน แตะเพื่อทบทวน - พิจารณาคำขออย่างระวัง - Molly พบผู้ติดต่ออีกรายการที่มีชื่อเหมือนกัน + + This person has the same name as another contact ติดต่อเรา ตรวจยืนยัน ไม่ใช่ตอนนี้ @@ -1029,7 +1029,7 @@ ชื่อผู้ใช้ คิวอาร์โค้ดและลิงก์จะไม่ปรากฏบนโปรไฟล์ของคุณ เราขอแนะนำให้แชร์ชื่อผู้ใช้ของคุณกับคนที่ไว้วางใจเท่านั้น - + ผู้ติดต่อจะสามารถส่งข้อความหาคุณผ่านชื่อผู้ใช้ที่คุณกำหนด วิธีนี้ทำให้คุณไม่จำเป็นต้องบอกหมายเลขโทรศัพท์กับใคร ชื่อโปรไฟล์ ชื่อผู้ใช้ เกี่ยวกับ @@ -1891,9 +1891,9 @@ เครือข่าย Signal - + ตรวจยืนยันแล้ว - + No direct messages with %1$s %1$s อยู่ในรายชื่อผู้ติดต่อของระบบคุณ @@ -2221,7 +2221,7 @@ ชื่อผู้ใช้ไม่ถูกต้อง ชื่อผู้ใช้ต้องมีอักขระ %1$d ถึง %2$d ตัว - ชื่อผู้ใช้จะช่วยให้ผู้ใช้รายอื่นส่งข้อความหาคุณได้โดยไม่จำเป็นต้องมีหมายเลขโทรศัพท์ของคุณ ชื่อผู้ใช้จะถูกผูกเข้ากับกลุ่มตัวเลขเพื่อช่วยรักษาความเป็นส่วนตัวของข้อมูลคุณ + Usernames are always paired with a set of numbers. ตัวเลขนี้คืออะไร ตัวเลขนี้จะช่วยรักษาความเป็นส่วนตัวให้ชื่อผู้ใช้ของคุณ ป้องกันไม่ให้คุณได้รับข้อความที่ไม่พึงประสงค์ เราขอแนะนำให้แชร์ชื่อผู้ใช้ของคุณเฉพาะกับคนและกลุ่มที่คุณอยากติดต่อด้วยเท่านั้น โดยหากเปลี่ยนชื่อผู้ใช้ คุณก็จะได้รับชุดตัวเลขใหม่ @@ -2242,9 +2242,9 @@ การกู้คืนชื่อผู้ใช้จะทำให้คิวอาร์โค้ดและลิงก์ที่มีอยู่เดิมของคุณถูกรีเซ็ต ต้องการดำเนินการต่อหรือไม่ - + การเปลี่ยนชื่อผู้ใช้จะทำให้คิวอาร์โค้ดและลิงก์ที่มีอยู่เดิมของคุณถูกรีเซ็ต ต้องการดำเนินการต่อหรือไม่ - + ดำเนินการต่อ มีผู้ติดต่อ %1$d คนใช้งาน Signal! @@ -4018,8 +4018,10 @@ เลิกบล็อก \"%1$s\" แล้ว - พิจารณาสมาชิกกลุ่ม - พิจารณาคำขอ + + Review members + + Review request สมาชิกในกลุ่ม %1$d คน มีชื่อเหมือนกัน พิจารณาสมาชิกด้านล่างแล้วเลือกตัดสินใจ หากคุณไม่มั่นใจว่าคำขอมาจากใคร คุณสามารถพิจารณาได้จากรายชื่อผู้ติดต่อด้านล่างแล้วเลือกตัดสินใจ ไม่มีกลุ่มอื่นร่วมกัน @@ -6046,13 +6048,13 @@ เรียนรู้เพิ่มเติม - + วิธีใหม่ในการติดต่อสื่อสาร - + ขอแนะนำการรักษาความเป็นส่วนตัวของหมายเลขโทรศัพท์ ตัวเลือกการกำหนดชื่อผู้ใช้และลิงก์เพิ่มเติม - + ปิด - + เรียนรู้เพิ่มเติม @@ -6349,9 +6351,9 @@ เกิดข้อผิดพลาดด้านเครือข่ายขณะพยายามรีเซ็ตลิงก์ของคุณโปรดลองอีกครั้งในภายหลัง - + An unexpected error occurred while trying to reset your link. Try again later. - + รีเซ็ตคิวอาร์โค้ดและลิงก์ของคุณแล้ว และสร้างคิวอาร์โค้ดและลิงก์ใหม่เรียบร้อยแล้ว ใช้มือถือสแกนคิวอาร์โค้ดนี้เพื่อพูดคุยกับฉันบน Signal @@ -6420,7 +6422,7 @@ หมายเลขโทรศัพท์ - ป้อนชื่อผู้ใช้แล้วตามด้วยตัวเลขสองหลักให้ครบถ้วน + Enter a username followed by a dot and its set of numbers. ดำเนินการต่อ diff --git a/app/src/main/res/values-tl/strings.xml b/app/src/main/res/values-tl/strings.xml index 8e7286ba8a..6b609bd658 100644 --- a/app/src/main/res/values-tl/strings.xml +++ b/app/src/main/res/values-tl/strings.xml @@ -180,17 +180,17 @@ I-block I-block at Umalis - Report and block + Iulat at harangin - Report spam? + Gusto mong iulat bilang spam? - Report spam + Iulat bilang spam - Signal will be notified that this person may be sending spam. Signal can’t see the content of any chats. + Aabisuhan ang signal na maaaring nagpapadala ng spam ang taong ito. Hindi nababasa ng Signal ang nilalaman ng anumang mga chat. - Signal will be notified that %1$s, who invited you to this group, may be sending spam. Signal can’t see the content of any chats. + Ang Signal ay aabisuhan na si %1$s, na siyang nag-imbita sa iyo sa grupong ito, ay maaaring nagpapadala ng spam. Hindi nababasa ng Signal ang nilalaman ng anumang chat. - Signal will be notified that the person who invited you to this group may be sending spam. Signal can’t see the content of any chats. + Ang Signal ay aabisuhan na ang taong nag-imbita sa iyo sa grupong ito ay maaaring nagpapadala ng spam. Hindi nababasa ng Signal ang nilalaman ng anumang chat. Ngayong araw @@ -494,8 +494,8 @@ Pwede kang maglagay ng notes para sa sarili mo sa chat na ito. Kung may linked devices ang account mo, isy-sync ang bagong notes. %1$d na group members ay may parehong pangalan. I-tap para ma-review - I-review ang requests nang maigi - Nakakita ang Molly ng isa pang contact na may kaparehong pangalan. + + This person has the same name as another contact Kontakin kami Iberipika Hindi ngayon @@ -522,54 +522,54 @@ Hindi na verified - Safety tips + Tips Para Sa Kaligtasan - Report spam + Iulat bilang spam I-block Tanggapin - Delete chat + Burahin ang chat I-unblock - Reported spam + Naiulat na spam - Signal has been be notified that this person may be sending spam. Signal can’t see the content of any chats. + Naabisuhan na ang Signal na maaaring nagpapadala ng spam ang taong ito. Hindi nababasa ng Signal ang nilalaman ng anumang mga chat. - Reported as spam + Iniulat bilang spam - Reported as spam and blocked + Iniulat bilang spam at hinarang na - You accepted a message request from %1$s. If this was a mistake, you can choose an action below. + Tinanggap mo ang message request mula kay %1$s. Kung nagkamali ka lang, maaari kang pumili ng isang aksyon sa ibaba. - Safety Tips + Tips Para Sa Kaligtasan - Be careful when accepting message requests from people you don’t know. Watch out for: + Mag-ingat sa pagtanggap ng mga message request mula sa mga taong hindi mo kilala. Mag-ingat sa: - Review this request carefully. None of your contacts or people you chat with are in this group. Here are a few things to watch out for: + Araling maigi ang request na ito. Wala sa grupong ito ang sinumang kontak o tao na ka-chat mo. Narito ang ilang bagay na dapat bantayan: - Previous tip + Bumalik sa nakaraang tip - Next tip + Pumunta sa kasunod na tip - Crypto or money scams + Mga scam kaugnay ng crypto o pera - If someone you don’t know messages about cryptocurrency (like Bitcoin) or an financial opportunity, be careful—it’s likely spam. + Kung ang isang hindi mo kakilala ay nag-mensahe tungkol sa cryptocurrency (tulad ng Bitcoin) o tungkol sa isang oportunidad na pinansyal, mag-ingat—malamang scam iyan. - Vague or irrelevant messages + Malabo o walang kaugnayang mga mensahe - Spammers often start with a simple message like “Hi” to draw you in. If you respond they may engage you further. + Ang mga spammer ay madalas na nag-uumpisa sa isang simpleng mensahe tulad ng \"Hi\" para maakit ka. Kapag sumagot ka, maaari ka nilang kausapin pa. - Messages with links + Mga mensahe na may mga link - Be careful of messages from people you don’t know that have links to websites. Never visit links from people you don’t trust. + Mag-ingat sa mga mensahe mula sa mga taong hindi mo kilala na may mga link papunta sa ibang website. Huwag na huwag i-click ang anumang link mula sa taong hindi mo pinagkakatiwalaan. - Fake businesses and institutions + Mga pekeng negosyo at institusyon - Be careful of businesses or government agencies contacting you. Messages involving tax agencies, couriers, and more can be spam. + Mag-ingat sa mga negosyo o ahensya ng gobyerno na nakikipag-ugnayan sa iyo. Maaaring spam ang mga mensaheng may kaugnayan sa mga ahensya ng buwis, courier, at iba pa. I-clear ang filter @@ -585,8 +585,8 @@ Binubura - Deleting selected chat… - Deleting selected chats… + Binubura ang piniling chat… + Binubura ang mga piniling chat… Na-archive na ang chat @@ -1064,7 +1064,7 @@ Hindi makakakita ang iyong username, QR code at link sa profile mo. I-share lamang ang iyong username sa mga taong pinagkakatiwalaan mo. - + Pwede ka na nilang i-message gamit ang optional username mo para hindi mo na ibigay ang iyong phone number. Profile name Username About @@ -1599,9 +1599,9 @@ Payment: %1$s - Reported as spam + Iniulat bilang spam - You accepted the message request + Tinanggap mo ang message request Tanggapin @@ -1649,7 +1649,7 @@ %1$d additional groups - Report… + Iulat… Hindi tugma ang mga passphrase! @@ -1965,9 +1965,9 @@ Signal connection - + Beripikado - + Walang direktang message kay %1$s Si %1$s ay nasa system contacts mo @@ -2301,7 +2301,7 @@ Ang username ay hindi valid. Ang mga username ay kailangang nasa pagitan ng %1$d at %2$d ang bilang ng mga character. - Sa pamamagitan ng usernames, pwede kang i-message ng ibang tao nang hindi nalalaman ang phone number mo. Nakakonekta ito sa isang set ng mga number para tulungan kang mapanatiling private ang address mo. + Usernames are always paired with a set of numbers. Para saan ang number na ito? Ang numbers na ito\'y nakatutulong para mapanatiling private ang username mo at makaiwas ka sa anumang mensaheng hindi mo gustong matanggap. I-share lamang ang iyong username sa mga tao at groups na gusto mong maka-chat. Kung magpapalit ka ng username, magkakaroon ka ng bagong set of digits. @@ -2322,9 +2322,9 @@ Ma-re-reset ang iyong existing QR code at link kapag ni-recover mo ang username mo. Sigurado ka na ba? - + Kapag nagpalit ka ng username, mare-reset ang iyong existing QR code at link. Sigurado ka ba? - + Magpatuloy %1$d kontak ay nasa Signal! @@ -2722,7 +2722,7 @@ Tinanggal mo na ang taong ito, mababalik s\'ya sa list mo kapag nag-message ka ulit sa kanya. - Options + Mga pagpipilian I-play … I-pause @@ -4124,8 +4124,10 @@ In-unblock si \"%1$s\". - I-review ang Members - I-review ang Request + + Review members + + Review request %1$d group members ang may parehong pangalan, i-review ang members sa baba at piliing mag-take action. Kung hindi ka sigurado kung kanino galing ang request na ito, i-review ang contacts sa baba and take action. Walang other groups in common. @@ -6184,13 +6186,13 @@ Matuto pa - + Mga bagong paraan para makipag-connect - + Ipinakikilala ang phone number privacy, optional usernames, at links. - + I-dismiss - + Matuto pa @@ -6490,9 +6492,9 @@ Nagkaroon ng network error habang sinusubukang i-reset ang link mo. Subukan ulit mamaya. - + Nagkaroon ng hindi inaasahang error habang sinusubukang i-reset ang iyong link. Subukan ulit mamaya. - + Ang iyong QR code at link ay reset na at mayroon ka na ring bagong QR code at link. I-scan ang QR code na ito gamit ang phone mo para maka-chat ako sa Signal. @@ -6563,7 +6565,7 @@ Phone number - Maglagay ng username na may kasamang numero. + Enter a username followed by a dot and its set of numbers. Susunod diff --git a/app/src/main/res/values-tr/strings.xml b/app/src/main/res/values-tr/strings.xml index 724118c5ca..4869fa4b75 100644 --- a/app/src/main/res/values-tr/strings.xml +++ b/app/src/main/res/values-tr/strings.xml @@ -46,7 +46,7 @@ Bu işlem Molly ve ileti bildirimlerinin kilidini kalıcı olarak açacaktır. Devre dışı bırak Molly iletilerini ve aramalarını devre dışı bırak? - Sunucudaki kaydınızı silerek Molly iletilerini ve aramalarını devre dışı bırakın. Bu özellikleri gelecekte yeniden kullanabilmeniz için telefon numaranızı tekrar kaydetmeniz gerekir. + Sunucudaki kaydını silerek Molly mesajlarını ve aramalarını devre dışı bırak. Bu özellikleri gelecekte yeniden kullanabilmen için telefon numaranı tekrar kaydetmen gerekir. Sunucuya bağlanırken hata! Kayıt kilidi için PIN gereklidir. PIN\'i devre dışı bırakmak için, lütfen ilk önce kayıt kilidini devre dışı bırakın. PIN oluşturuldu. @@ -494,8 +494,8 @@ Bu sohbette kendine notlar ekleyebilirsin. Eğer hesabına bağlı cihaz bulunuyorsa yeni notlar senkronize edilir. %1$d grup üyesi aynı ada sahip. Gözden geçirmek için dokunun - İstekleri dikkatlice inceleyin - Molly aynı ada sahip başka bir kişi buldu. + + This person has the same name as another contact Bizimle iletişime geçin Doğrula Şimdi değil @@ -626,7 +626,7 @@ %1$saktif - QR kodun ve bağlantın sıfırlandı ve kullanıcı adın %1$s + Kare kodun ve bağlantın sıfırlandı ve kullanıcı adın %1$s Anahtar takas iletisi @@ -1064,7 +1064,7 @@ Kullanıcı adın, kare kodun ve bağlantın profilinde görünmez. Kullanıcı adını yalnızca güvendiğin kişilerle paylaş. - + İnsanlar artık isteğe bağlı kullanıcı adını kullanarak sana mesaj gönderebilir böylece telefon numaranı vermene gerek kalmaz. Profil adı Kullanıcı adı Hakkında @@ -1963,11 +1963,11 @@ - Signal bağlantısı + Signal kişisi - + Doğrulandı - + No direct messages with %1$s %1$s sistem kişilerin arasında @@ -2301,7 +2301,7 @@ Kullanıcı adı geçersiz. Kullanıcı adları %1$d ve %2$d karakter aralığında olmalıdır. - Kullanıcı adları, telefon numarana ihtiyaç duymadan diğer kullanıcıların sana mesaj göndermesini sağlar. Adresini gizli tutmaya yardımcı olmak için, kullanıcı adın bir dizi rakamla eşleştirilir. + Usernames are always paired with a set of numbers. Bu numara kimin? Bu rakamlar, istenmeyen mesajlar almaman için kullanıcı adının gizli kalmasına yardımcı olur. Kullanıcı adını yalnızca sohbet etmek istediğin kişi ve gruplarla paylaş. Kullanıcı adını değiştirdiğinde yeni bir rakam dizisiyle eşleştirilirsin. @@ -2322,9 +2322,9 @@ Kullanıcı adını kurtarmak, mevcut kare kodunu ve bağlantını sıfırlar. Emin misin? - + Kullanıcı adını değiştirmek, mevcut kare kodunu ve bağlantını sıfırlar. Emin misin? - + Devam et %1$d kişi Signal\'e katıldı! @@ -4124,8 +4124,10 @@ \"%1$s\" kişisinin engeli kaldırıldı. - Üyeleri İncelle - İsteği İncele + + Review members + + Review request %1$d grup üyesi aynı ada sahip, aşağıdan inceleyerek tercih yapabilirsiniz. İsteğin kimden geldiğinden emin değilseniz, aşağıdaki kişileri inceleyerek tercih yapabilirsiniz. Başka ortak grup yok. @@ -4174,14 +4176,14 @@ Hesabını sildiğinde: - Telefon numaranızı girin + Telefon numaranı gir Hesabı sil Hesap bilgilerin ve profil resmin silinir Tüm iletilerin silinir Ödemeler hesabından %1$s silinir Ülke kodu belirtilmedi Telefon numarası belirtilmedi - Girmiş olduğunuz numara hesabınızla uyuşmuyor. + Girmiş olduğun telefon numarası hesabınla uyuşmuyor. Hesabını silmek istediğinden emin misin? Bu işlem Signal hesabını silecek ve uygulamayı sıfırlayacak. İşlem tamamlandıktan sonra uygulama kapanır. Yerel veriler silinemedi. Sistemindeki uygulama ayarlarından elle silebilirsin. @@ -4400,7 +4402,7 @@ Hesap Zaman geçtikçe daha az sorulacaktır - Telefon numaranız Signal\'e tekrar kaydedilirken Signal PIN\'i istensin. + Telefon numaran Signal\'e tekrar kaydedilirken Signal PIN\'i istensin. Telefon numarası değiştir Hesap verilerin @@ -4447,10 +4449,10 @@ Raporun yalnızca dışa aktarım sırasında oluşturulur ve Signal tarafından cihazında saklanmaz. - Geçerli telefon numaranızı yeni bir telefon numarasına değiştirmek için bunu kullanın. Bu değişikliği geri alamazsınız.devam etmeden önce, yeni numaranızın SMS veya arama alabildiğinden emin olun. + Geçerli telefon numaranı yeni bir telefon numarasıyla değiştirmek için bunu kullan. Bu değişikliği geri alamazsın.\n\nDevam etmeden önce, yeni numaranın SMS veya arama alabildiğinden emin ol. Devam Et - Telefon numaranız %1$sile değiştirildi. + Telefon numaran %1$s ile değiştirildi Tamam @@ -4460,11 +4462,11 @@ Eski telefon numarası Yeni numaranız Yeni telefon numarası - Girmiş olduğunuz numara hesabınızla uyuşmuyor. + Girmiş olduğun telefon numarası hesabınla uyuşmuyor. Eski numaranızın ülke kodunu belirtmeniz gerekir - Eski telefon numaranızı belirtmeniz gerekir + Eski telefon numaranı belirtmen gerekir Yeni numaranızın ülke kodunu belirtmeniz gerekir - Yeni telefon numaranızı belirtmeniz gerekir + Yeni telefon numaranı belirtmen gerekir Numarayı Değiştir @@ -4473,7 +4475,7 @@ Numarayı değiştir - Telefon numaranızı (%1$s --> %2$s) değiştirmek üzeresiniz.\n\nDevam etmeden önce lütfen aşağıdaki numaranın doğru olduğundan emin olun. + Telefon numaranı (%1$s --> %2$s) değiştirmek üzeresin.\n\nDevam etmeden önce lütfen aşağıdaki numaranın doğru olduğundan emin ol. Numarayı düzenle @@ -5476,7 +5478,7 @@ Bu hikayeyi kimler görüntüleyebilir - Tüm Signal bağlantıları + Tüm Signal kişileri dışında hepsi @@ -5505,15 +5507,15 @@ Hikayeni görebilecek kişilerin tepki ve yanıt vermesine izin ver - Signal Bağlantıları + Signal Kişileri - Signal Bağlantıları, aşağıdaki yöntemlerle güvenmeyi tercih ettiğin kişilerdir: + Signal Kişileri aşağıdaki yöntemlerle güvenmeyi tercih ettiğin kişilerdir: Bir sohbet başlatma Bir mesaj isteğini kabul etmek - Bunları sistem bağlantılarınızda bulundurmak + Bunları sistem kişilerin arasında bulundurmak "Bağlantıların, adını ve fotoğrafını görebilir ve onlardan gizlemediğin sürece \"Hikayem\" kısmındaki gönderileri görüntüleyebilir." @@ -5841,7 +5843,7 @@ Hikayem\'deki gönderilerini kimlerin görebileceğini seç. Ayarlarda istediğin zaman değişiklik yapabilirsin. - Tüm Signal bağlantıları + Tüm Signal kişileri dışında hepsi @@ -6184,13 +6186,13 @@ Daha fazlasını öğren - + Bağlanmanın yeni yolları - + Telefon numarası gizliliği, isteğe bağlı kullanıcı adları ve bağlantılar. - + Kapat - + Daha fazlasını öğren @@ -6480,7 +6482,7 @@ QR kod geçersizdi. - %1$s adlı bir kullanıcı bulunamadı. + %1$s kullanıcı adlı bir kullanıcı bulunamadı. Kullanıcı bulunamadı. @@ -6490,9 +6492,9 @@ Bağlantın sıfırlanırken bir ağ hatası oluştu. Daha sonra tekrar dene. - + An unexpected error occurred while trying to reset your link. Try again later. - + Kare kodun ve bağlantın sıfırlandı ve yeni bir kare kod ve bağlantı oluşturuldu. Benimle Signal\'de sohbet etmek için telefonunla bu kare kodu tara. @@ -6563,7 +6565,7 @@ Telefon numarası - Basamak çiftiyle birlikte tam bir kullanıcı adı gir. + Enter a username followed by a dot and its set of numbers. İleri diff --git a/app/src/main/res/values-ug/strings.xml b/app/src/main/res/values-ug/strings.xml index 06d1dc0aac..c59dd88e1a 100644 --- a/app/src/main/res/values-ug/strings.xml +++ b/app/src/main/res/values-ug/strings.xml @@ -485,8 +485,8 @@ بۇ سۆھبەتتە ئۆزىڭىزگە خاتىرە قوشالايسىز. ئەگەر ھېساباتىڭىزدا ئۇلانغان ئۈسكۈنىلەر بولسا، يېڭى خاتىرىلەر ماسقەدەملىنىدۇ. %1$d گۇرۇپپا ئەزالىرىنىڭمۇ ئوخشاش نامى بار. كۆزدىن كەچۈرۈش ئۈچۈن چېكىڭ - تەلەپلەرنى ئەستايىدىللىق بىلەن تەكشۈرۈڭ - Molly ئوخشاش ئىسىملىك باشقا ئالاقەداشنى تاپتى. + + This person has the same name as another contact بىز بىلەن ئالاقىلىشىڭ دەلىللەش ھازىر ئەمەس @@ -1029,7 +1029,7 @@ ئىشلەتكۈچى نامىڭىز، QR كودىڭىز ۋە ئۇلانمىڭىز ئارخىپىڭىزدا كۆرۈنمەيدۇ. ئىشلەتكۈچى نامىڭىزنى پەقەت سىز ئىشىنىدىغان كىشىلەر بىلەنلا ئورتاقلىشىڭ. - + باشقىلار ئەمدى تاللانما ئىشلەتكۈچى نامىڭىزنى ئىشلىتىپ سىزگە ئۇچۇر يوللىسا بولىدۇ، تېلېفون نومۇرىڭىزنى ئېيتىپ بېرىشنىڭ ھاجىتى يوق. سەپلىمە ئاتى ئىشلەتكۈچى ئىسمى ھەققىدە @@ -1891,9 +1891,9 @@ Signal ئۇلىنىشى - + دەلىللەندى - + No direct messages with %1$s %1$s سىزنىڭ سىستېما ئالاقىداش تىزىملىكىڭىزدە @@ -2221,7 +2221,7 @@ ئىشلەتكۈچى ئىسمى ئىناۋەتسىز ئىشلەتكۈچى ئىسمى%1$d دىن %2$d غىچە ھەرپ ئارىسىدا بولىدۇ. - باشقىلار تېلېفون نومۇرىڭىزنى لازىم قىلماي تۇرۇپلا ئىشلەتكۈچى نامى ئارقىلىق سىزگە ئۇچۇر يوللىيالايدۇ. ئۇلار بىر يۈرۈش رەقەم ئارقىلىق ئۇلانغان بولۇپ، بۇنداق قىلىشنىڭ ئادرېسىڭىزنى مەخپىي تۇتۇشقا پايدىسى بار. + Usernames are always paired with a set of numbers. بۇ نېمە سان؟ بۇ رەقەملەر ئارقىلىق ئىشلەتكۈچى نامىڭىزنى مەخپىي تۇتالايسىز ۋە شۇ ئارقىلىق خالىمىغان ئۇچۇرلاردىن ساقلىنالايسىز. ئىشلەتكۈچى نامىڭىزنى پەقەت سىز پاراڭلاشماقچى بولغان كىشىلەر ۋە گۇرۇپپا بىلەنلا ئورتاقلىشىڭ. ئىشلەتكۈچى نامىڭىزنى ئۆزگەرتسىڭىز، يېڭى بىر يۈرۈش رەقەمگە ئېرىشىسىز. @@ -2242,9 +2242,9 @@ ئىشلەتكۈچى نامىڭىزنى ئەسلىگە كەلتۈرسىڭىز ھازىرقى QR كودىڭىز ۋە ئۇلانمىڭىز قايتىدىن تەڭشىلىدۇ. جەزملەشتۈرەمسىز؟ - + ئىشلەتكۈچى نامىڭىزنى ئۆزگەرتسىڭىز، سىزنىڭ ھازىرقى QR كودىڭىز ۋە ئۇلانمىڭىز قايتىدىن تۈزۈلىدۇ. جەزىملەشتۈرەمسىز؟ - + داۋاملاشتۇرۇش %1$d ئالاقىداش Signal ئىشلىتىدۇ! @@ -4018,8 +4018,10 @@ «%1$s» نى چەكلەش بىكار قىلىندى. - ئەزالارنى تەكشۈر - ئىلتىماسنى تەكشۈر + + Review members + + Review request %1$d گۇرۇپپا ئەزاسىنىڭ ئوخشاش ئىسمى بار ئىكەن. تۆۋەندىكىلەرنى كۆزدىن كەچۈرۈڭ، بىر مەشغۇلات تاللاڭ. ئىلتىماسنىڭ نەدىن كەلگەنلىكىنى جەزملەشتۈرەلمىسىڭىز، ئاستىدىكى ئالاقەداشلارنى كۆزدىن كەچۈرۈڭ ۋە مەشغۇلات قىلىڭ. باشقا ئورتاق گۇرۇپپا يوق @@ -6046,13 +6048,13 @@ تەپسىلاتى - + ئۇلىنىشنىڭ يېڭى ئۇسۇللىرى - + تېلېفون نومۇر مەخپىيەتلىكى، تاللانما ئىشلەتكۈچى نامى ۋە ئۇلانمىسى كىرگۈزۈلدى. - + ئېتىش - + تەپسىلاتى @@ -6349,9 +6351,9 @@ ئۇلانمىڭىزنى يېڭىلاشقا ئۇرۇنغان ۋاقىتتا تور خاتالىقى كۆرۈلدى. سەل تۇرۇپ قايتا سىناڭ. - + An unexpected error occurred while trying to reset your link. Try again later. - + QR كودىڭىز ۋە ئۇلانمىڭىز ئەسلىگە قايتۇرۇلغان بولۇپ، يېڭى QR كودى ۋە ئۇلانمىسى قۇرۇلدى. Signal دا مەن بىلەن پاراڭلىشىش ئۈچۈن تېلېفونىڭىز بىلەن بۇ QR كودنى سىكاننېرلاڭ. @@ -6420,7 +6422,7 @@ تېلېفون نومۇرىڭىز - ئىشلەتكۈچى نامىنى ئۆزىنىڭ ماس نومۇرى بىلەن تولۇق كىرگۈزۈڭ. + Enter a username followed by a dot and its set of numbers. كېيىنكى diff --git a/app/src/main/res/values-uk/strings.xml b/app/src/main/res/values-uk/strings.xml index 5417329a14..6d2f31ca46 100644 --- a/app/src/main/res/values-uk/strings.xml +++ b/app/src/main/res/values-uk/strings.xml @@ -512,8 +512,8 @@ Ви можете додавати нотатки для себе у цьому чаті. Якщо у вас є прив\'язані пристрої — нотатки будуть синхронізовані. %1$d учасників групи мають однакові імена. Натисніть для перегляду - Переглядайте запити уважно - Molly знайшов іншого користувача з цим ім\'ям. + + This person has the same name as another contact Напишіть нам Підтвердження Не зараз @@ -1134,7 +1134,7 @@ Ім\'я користувача, QR-код і посилання не відображаються у вашому профілі. Діліться іменем користувача тільки з людьми, яким довіряєте. - + Тепер вам можуть писати, використовуючи ваше додаткове ім\'я користувача, тож вам не треба ділитися своїм номером телефону. Ім’я профілю Ім\'я користувача Про себе @@ -2113,9 +2113,9 @@ Контакт Signal - + Підтверджено - + No direct messages with %1$s %1$s є в контактах вашого пристрою @@ -2461,7 +2461,7 @@ Невірне ім\'я користувача. Ім\'я користувача складається з символів кількістю від %1$d до %2$d. - Завдяки імені користувача вам зможуть писати люди, які не знають вашого номера телефону. Поряд із іменем є кілька цифр, які захищають конфіденційність вашої адреси. + Usernames are always paired with a set of numbers. Що означають ці цифри? Ці цифри допомагають захистити вас від небажаних повідомлень. Діліться своїм іменем користувача тільки з тими людьми і групами, з якими ви хочете спілкуватися. Якщо змінити ім\'я користувача, цифри також зміняться. @@ -2482,9 +2482,9 @@ Якщо відновити ім\'я користувача, поточні QR-код і посилання буде скинуто. Відновити ім\'я? - + Якщо змінити ім\'я користувача, поточні QR-код і посилання буде скинуто. Змінити ім\'я? - + Продовжити %1$d контакт у Signal! @@ -4336,8 +4336,10 @@ «%1$s» було розблоковано. - Перегляд учасників - Переглянути запит + + Review members + + Review request %1$d учасники групи мають однакові імена, перегляньте учасників нижче та оберіть дію. Якщо ви не впевнені, від кого надійшов запит, перегляньте контакти нижче та прийміть рішення. Інших спільних груп немає. @@ -6460,13 +6462,13 @@ Подробиці - + Нові способи додавання контактів - + Представляємо конфіденційність номера телефону, додаткові імена користувачів і посилання. - + Відхилити - + Подробиці @@ -6772,9 +6774,9 @@ Під час спроби скинути посилання сталася помилка мережі. Спробуйте знову пізніше. - + An unexpected error occurred while trying to reset your link. Try again later. - + Ваші QR-код і посилання було скинуто. Натомість було створено нові. Проскануйте цей QR-код телефоном, щоб написати мені в Signal. @@ -6849,7 +6851,7 @@ Номер телефону - Введіть повне ім\'я користувача і дві цифри. + Enter a username followed by a dot and its set of numbers. Далі diff --git a/app/src/main/res/values-ur/strings.xml b/app/src/main/res/values-ur/strings.xml index 4d2ab905cb..2ea695562a 100644 --- a/app/src/main/res/values-ur/strings.xml +++ b/app/src/main/res/values-ur/strings.xml @@ -494,8 +494,8 @@ آپ اس چیٹ میں خود کے لیے نوٹس شامل کر سکتے ہیں۔ اگر آپ کے اکاؤنٹ میں کوئی لنک کردہ ڈیوائسز موجود ہیں، تو نئے نوٹس ہم وقت ساز ہو جائیں گے۔ %1$d گروپ ممبروں کا ایک ہی نام ہے۔ جائزہ لینے کے لئے ٹیپ کریں - درخواستوں کا بغور جائزہ لیں - Molly کو اسی نام سے دوسرا رابطہ ملا۔ + + This person has the same name as another contact ہم سے رابطہ کریں تصدیق کریں ابھی نہیں @@ -1064,7 +1064,7 @@ آپ کا یوزر نیم، QR کوڈ اور لنک آپ کی پروفائل پر نظر نہیں آتے۔ اپنا یوزر نیم صرف ان لوگوں کے ساتھ شیئر کریں جن پر آپ کو اعتماد ہو۔ - + لوگ اب آپ کے اختیاری یوزر نیم کا استعمال کرتے ہوئے آپ کو میسج کر سکتے ہیں تاکہ آپ کو اپنا فون نمبر دینے کی ضرورت نہ پڑے۔ پروفائل نیم یوزر نیم متعلق @@ -1965,9 +1965,9 @@ Signal کنیکشن - + تصدیق شدہ - + No direct messages with %1$s %1$s آپ کے سسٹم کے روابط میں موجود ہے @@ -2301,7 +2301,7 @@ یوزر نیم غلط ہے. یوزر نیمز %1$dاور%2$d حرف کے درمیان ہونا چاہئے۔ - یوزر نیمز آپ کے فون نمبر کے بغیر دوسروں کو آپ کو میسج کرنے کی اجازت دیتے ہیں۔ انہیں آپ کا پتہ نجی رکھنے کے لیے اعداد کے مجموعے کے ساتھ جوڑا گیا ہے۔ + Usernames are always paired with a set of numbers. یہ نمبر کیا ہے؟ یہ اعداد آپ کا یوزر نیم نجی رکھنے میں مدد کرتے ہیں تاکہ آپ غیر مطلوبہ میسجز سے بچ سکیں۔ اپنا یوزر نیم صرف ان لوگوں اور گروپس کے ساتھ شیئر کریں جن کے ساتھ آپ چیٹ کرنا چاہتے ہیں۔ اگر آپ یوزر نیمز تبدیل کرتے ہیں تو آپ کو اعداد کا نیا مجموعہ ملے گا۔ @@ -2322,9 +2322,9 @@ اپنا یوزر نیم بازیافت کرنے سے آپ کا موجودہ QR کوڈ اور لنک ری سیٹ ہو جائے گا۔ کیا واقعی ایسا چاہتے ہیں؟ - + اپنا یوزر نیم تبدیل کرنے کی صورت میں آپ کا موجودہ QR کوڈ اور لنک ری سیٹ ہو جائے گا۔ کیا واقعی آپ کرنا چاہتے ہیں؟ - + جاری رکھیں %1$d رابطے Signal پر ہیں! @@ -4124,8 +4124,10 @@ \"%1$s\" کو اَن بلاک کر دیا گیا ہے۔ - ممبران کا جائزہ لیں - نظرثانی کی درخواست + + Review members + + Review request %1$dگروپ ممبران کا ایک ہی نام ہے ، ذیل ممبران کا جائزہ لیں اور کارروائی کرنے کا انتخاب کریں۔ اگر آپ کو یقین نہیں ہے کہ درخواست کس کی ہے تو ، نیچے دیئے گئے رابطوں کا جائزہ لیں اور کارروائی کریں۔ کوئی دوسرا گروہ مشترکہ نہیں۔ @@ -6184,13 +6186,13 @@ مزید جانیں - + رابطہ کرنے کے نئے طریقے - + فون نمبر پرائیویسی، اختیاری یوزر نیمز اور لنکس متعارف کروا رہے ہیں۔ - + منسوخ کریں - + مزید جانیں @@ -6490,9 +6492,9 @@ آپ کا لنک ری سیٹ کرتے ہوئے ایک نیٹ ورک نقص پیش آ گیا۔ بعد میں دوبارہ کوشش کریں۔ - + An unexpected error occurred while trying to reset your link. Try again later. - + آپ کا QR کوڈ اور لنک ری سیٹ کر دیا گیا ہے اور ایک نیا QR کوڈ اور لنک بنایا گیا ہے۔ میرے ساتھ Signal پر چیٹ کرنے کے لیے اس QR کوڈ کو اپنے فون سے اسکین کریں۔ @@ -6563,7 +6565,7 @@ فون نمبر - پورا یوزر نیم اس کے ہندسوں کے جوڑے کے ساتھ درج کریں۔ + Enter a username followed by a dot and its set of numbers. اگلا diff --git a/app/src/main/res/values-vi/strings.xml b/app/src/main/res/values-vi/strings.xml index eecba8e00e..4190588bcd 100644 --- a/app/src/main/res/values-vi/strings.xml +++ b/app/src/main/res/values-vi/strings.xml @@ -485,8 +485,8 @@ Bạn có thể thêm ghi chú cho bản thân mình trong cuộc trò chuyện này. Nếu tài khoản của bạn có các thiết bị được liên kết, các ghi chú mới sẽ được đồng bộ. %1$d thành viên nhóm có cùng tên. Nhấn để xem lại - Kiểm tra yêu cầu một cách kĩ lưỡng - Molly tìm thấy một liên hệ cùng tên. + + This person has the same name as another contact Liên hệ với chúng tôi Xác minh Để sau @@ -1029,7 +1029,7 @@ Tên người dùng, mã QR và đường dẫn không hiển thị trên hồ sơ của bạn. Chỉ chia sẻ tên người dùng với người bạn tin tưởng. - + Giờ đây mọi người có thể gửi tin nhắn cho bạn qua tên người dùng tùy chọn của bạn nên bạn không cần cung cấp số điện thoại của mình. Tên hồ sơ Tên người dùng Thông tin @@ -1891,9 +1891,9 @@ Liên hệ Signal - + Đã xác minh - + No direct messages with %1$s %1$s có trong danh bạ của thiết bị @@ -2221,7 +2221,7 @@ Tên người dùng không hợp lệ. Tên người dùng phải nằm trong khoảng từ %1$d đến %2$d ký tự. - Tên người dùng giúp các thành viên khác nhắn tin cho bạn mà không cần có số điện thoại của bạn. Tên người dùng được ghép với một dãy số để giúp giữ bí mật thông tin của bạn. + Usernames are always paired with a set of numbers. Số này là gì? Các số này giúp giữ bí mật tên người dùng của bạn giúp bạn tránh các tin nhắn ngoài ý muốn. Chỉ chia sẻ tên người dùng của bạn với những người hoặc nhóm bạn muốn trò chuyện. Nếu bạn đổi tên người dùng, bạn sẽ nhận được một dãy số mới. @@ -2242,9 +2242,9 @@ Khôi phục lại tên người dùng sẽ đặt lại mã QR và đường dẫn hiện tại của bạn. Bạn có chắc không? - + Thay đổi tên người dùng sẽ đặt lại mã QR và đường dẫn hiện tại của bạn. Bạn có chắc không? - + Tiếp tục %1$d liên hệ của bạn đang sử dụng Signal! @@ -4018,8 +4018,10 @@ \"%1$s\" đã được bỏ chặn. - Xét duyệt Thành viên - Xét duyệt Yêu cầu + + Review members + + Review request %1$d thành viên nhóm có cùng tên, hãy xem các thành viên dưới đây và chọn hành động. Nếu bạn không chắc yêu cầu từ người nào, xem các liên hệ bên dưới và chọn hành động. Không có nhóm chung nào khác. @@ -6046,13 +6048,13 @@ Tìm hiểu thêm - + Cách Mới để Kết Nối - + Giới thiệu về quyền riêng tư cho số điện thoại, tên người dùng và đường dẫn tùy chọn. - + Bỏ qua - + Tìm hiểu thêm @@ -6349,9 +6351,9 @@ Có lỗi kết nối mạng khi đang tiến hành đặt lại đường dẫn. Thử lại sau. - + An unexpected error occurred while trying to reset your link. Try again later. - + Mã QR và đường dẫn của bạn đã được đặt lại, một mã QR và đường dẫn mới đã được tạo. Quét mã QR này bằng điện thoại của bạn để trò chuyện với tôi trên Signal. @@ -6420,7 +6422,7 @@ Số điện thoại - Nhập tên người dùng đầy đủ bao gồm cả dãy số. + Enter a username followed by a dot and its set of numbers. Tiếp diff --git a/app/src/main/res/values-yue/strings.xml b/app/src/main/res/values-yue/strings.xml index a881309318..bc168f8cd6 100644 --- a/app/src/main/res/values-yue/strings.xml +++ b/app/src/main/res/values-yue/strings.xml @@ -485,8 +485,8 @@ 你可以喺聊天入面新增一啲俾自己嘅筆記。如果你嘅帳戶連結咗其他裝置,新嘅筆記會自動同步。 個谷有 %1$d 位成員撞名。 撳一下細閱 - 請求要金睛火眼睇清楚 - Molly 搵到另一位聯絡人,都係同一個名。 + + This person has the same name as another contact 聯絡我哋 驗證 遲啲先啦 @@ -1029,7 +1029,7 @@ 你嘅用戶名稱、二維碼同連結唔會喺個人檔案度顯示。記得淨係好同你信任嘅人分享你嘅用戶名稱呀。 - + 其他人而家可以用你選填嘅用戶名稱傳送訊息俾你,咁你就唔使再俾電話冧把人喇。 個人檔名 用戶名稱 關於 @@ -1891,9 +1891,9 @@ Signal 人脈 - + 驗證咗 - + No direct messages with %1$s %1$s 係你嘅聯絡人 @@ -2221,7 +2221,7 @@ 用戶名稱無效。 用戶名稱一定要係 %1$d 至 %2$d 個字元之間。 - 用戶名稱可以俾其他人唔使用你個電話冧把搜尋,都可以傳送訊息俾你。系統會將用戶名稱同一組數字配對,咁就可以幫你嘅地址保密。 + Usernames are always paired with a set of numbers. 呢個號碼係咩嚟? 呢組數字可以將你嘅用戶名稱保密,以免你受到無謂嘅訊息滋擾。請你淨係同你想同佢通訊嘅聯絡人同埋群組分享你嘅用戶名稱。如果你改咗個用戶名稱,就會收到一組新嘅數字。 @@ -2242,9 +2242,9 @@ 恢復用戶名稱會將你宜家用緊嘅二維碼同連結重設。你係咪確定? - + 更改用戶名稱會將你宜家用緊嘅二維碼同連結重設。你係咪確定? - + 繼續 %1$d 位聯絡人開咗 Signal 喇! @@ -4018,8 +4018,10 @@ 解除封鎖咗「%1$s」。 - 批閱成員 - 批閱請求 + + Review members + + Review request 個谷嘅 %1$d 位成員撞名,請批閱下列成員並視乎情況做要做嘅嘢。 假如您唔肯定係邊個發出請求,請批閱下列嘅聯絡人並去做要做嘅嘢。 無其他有緣相遇嘅谷。 @@ -6046,13 +6048,13 @@ 了解詳情 - + 全新連繫方式 - + 包括電話號碼私隱、可以選填嘅用戶名稱同連結功能。 - + 關閉 - + 了解詳情 @@ -6349,9 +6351,9 @@ 嘗試重設連結時,網路發生錯誤。請你遲啲再試過啦。 - + An unexpected error occurred while trying to reset your link. Try again later. - + 你嘅二維碼同連結已經重設,系統建立咗一個新嘅二維碼同連結。 用電話掃描呢個二維碼,就開始喺 Signal 同我聊天喇。 @@ -6420,7 +6422,7 @@ 電話冧把 - 輸入完整嘅用戶名稱同專屬嘅兩位數字。 + Enter a username followed by a dot and its set of numbers. 下一步 diff --git a/app/src/main/res/values-zh-rCN/strings.xml b/app/src/main/res/values-zh-rCN/strings.xml index 8ae399af2a..59559265c5 100644 --- a/app/src/main/res/values-zh-rCN/strings.xml +++ b/app/src/main/res/values-zh-rCN/strings.xml @@ -180,17 +180,17 @@ 屏蔽 屏蔽并离开 - Report and block + 举报和屏蔽 - Report spam? + 要举报垃圾消息吗? - Report spam + 举报垃圾消息 - Signal will be notified that this person may be sending spam. Signal can’t see the content of any chats. + Signal 将会通知此用户,其可能发送了垃圾消息。Signal 无法看到任何聊天的内容。 - Signal will be notified that %1$s, who invited you to this group, may be sending spam. Signal can’t see the content of any chats. + Signal 将会给邀请您加入群组的%1$s发送通知,告知其可能发送了垃圾消息。Signal 无法看到任何聊天的内容。 - Signal will be notified that the person who invited you to this group may be sending spam. Signal can’t see the content of any chats. + Signal 将会给邀请您加入群组的用户发送通知,告知其可能发送了垃圾消息。Signal 无法看到任何聊天的内容。 今天 @@ -485,8 +485,8 @@ 你可在此对话中给自己做笔记,如果您关联了其它设备,新笔记将同步到其它设备上。 %1$d 位群组成员的名字相同。 点击开始审查 - 请仔细审查请求 - Molly 碰到了一个同名的联系人。 + + This person has the same name as another contact 联系我们 验证 稍后再说 @@ -513,54 +513,54 @@ 验证已失效 - Safety tips + 安全提示 - Report spam + 举报垃圾消息 屏蔽 接受 - Delete chat + 删除聊天 取消屏蔽 - Reported spam + 已举报垃圾消息 - Signal has been be notified that this person may be sending spam. Signal can’t see the content of any chats. + Signal 已通知此用户,其可能发送了垃圾消息。Signal 无法看到任何聊天的内容。 - Reported as spam + 已举报为垃圾消息 - Reported as spam and blocked + 已举报为垃圾消息并屏蔽 - You accepted a message request from %1$s. If this was a mistake, you can choose an action below. + 您接受了来自%1$s的消息请求。如果这是一个误操作,您可以选择以下任意操作。 - Safety Tips + 安全提示 - Be careful when accepting message requests from people you don’t know. Watch out for: + 接受陌生人发来的消息请求时须谨慎。需要当心的是: - Review this request carefully. None of your contacts or people you chat with are in this group. Here are a few things to watch out for: + 请仔细审核此请求。您的联系人或与您聊天的用户均不在此群组中。以下是一些需要注意的事项: - Previous tip + 上一个提示 - Next tip + 下一个提示 - Crypto or money scams + 加密货币或金钱骗局 - If someone you don’t know messages about cryptocurrency (like Bitcoin) or an financial opportunity, be careful—it’s likely spam. + 如有陌生人给您发送有关加密货币(如比特币)或金融投资机会的消息,请当心,这很可能是垃圾消息。 - Vague or irrelevant messages + 模糊或无关消息 - Spammers often start with a simple message like “Hi” to draw you in. If you respond they may engage you further. + 垃圾消息发送者通常会以“您好”这样的简单问候吸引您的注意。当您回应后,他们可能会进一步引诱您。 - Messages with links + 含链接的消息 - Be careful of messages from people you don’t know that have links to websites. Never visit links from people you don’t trust. + 当心陌生人发来的含网站链接的消息。千万不要访问不信任的人发来的链接。 - Fake businesses and institutions + 假冒企业和机构 - Be careful of businesses or government agencies contacting you. Messages involving tax agencies, couriers, and more can be spam. + 请谨慎对待与您联系的企业或政府机构。涉及税务机构、快递公司等的消息有可能是垃圾消息。 清除筛选 @@ -574,7 +574,7 @@ 正在删除 - Deleting selected chats… + 正在删除选定的聊天… %1$d 个聊天已存档 @@ -1029,7 +1029,7 @@ 您的用户名、二维码和链接在个人资料中不显示。请仅将您的用户名分享给您信任的人。 - + 用户现在可以通过您的可选用户名给您发送消息,因此您无需给其他用户分享您的手机号码。 昵称 用户名 关于 @@ -1544,9 +1544,9 @@ 付款:%1$s - Reported as spam + 已举报为垃圾消息 - You accepted the message request + 您接受了消息请求 接受 @@ -1590,7 +1590,7 @@ 更多%1$d个群组 - Report… + 举报… 密码不匹配! @@ -1891,9 +1891,9 @@ Signal 密友 - + 已验证 - + 与%1$s没有私聊消息 %1$s在您的系统通讯录中 @@ -2221,7 +2221,7 @@ 用户名无效。 用户名所含字符数量必须在 %1$d 与 %2$d 之间。 - 用户名可以让其他会员无需您的手机号码也能给您发送消息。系统会将用户名与一组数字配对,从而将您的地址保密。 + Usernames are always paired with a set of numbers. 这个号码是什么? 这些数字可以将您的用户名保密,以免您收到骚扰消息。请仅将您的用户名分享给您想要聊天的对象和群组。如果您更改用户名,您将会收到一组新的数字。 @@ -2242,9 +2242,9 @@ 恢复您的用户名将会重置您现有的二维码和链接。确定要恢复吗? - + 更改用户名将会重置您现有的二维码和链接。确定要更改吗? - + 继续 %1$d 个联系人在使用 Signal! @@ -2635,7 +2635,7 @@ 你已移除该用户,与对方发送消息会将其重新添加到您的列表中。 - Options + 选项 播放 … 暂停 @@ -4018,8 +4018,10 @@ 已取消屏蔽“%1$s”。 - 审查成员 - 审查请求 + + Review members + + Review request %1$d 位群组成员的名字相同,请审查以下成员并采取相应措施。 如果您不确定此请求的来源,请审查以下联系人并采取相应措施。 没有其它共同群组。 @@ -6046,13 +6048,13 @@ 了解详情 - + 联系有新招 - + 我们推出了电话号码隐私、可选用户名和链接功能。 - + 不予考虑 - + 了解详情 @@ -6349,9 +6351,9 @@ 尝试重置您的链接时出现网络错误。请稍后再试。 - + 尝试重置您的链接时出现意外错误。请稍后再试。 - + 您的二维码和链接已重置,新的二维码和链接已创建。 如要在 Signal 上与我聊天,请扫描此二维码吧。 @@ -6420,7 +6422,7 @@ 手机号码 - 请输入搭配数字的完整用户名。 + Enter a username followed by a dot and its set of numbers. 下一步 diff --git a/app/src/main/res/values-zh-rHK/strings.xml b/app/src/main/res/values-zh-rHK/strings.xml index 61552834ca..08dcd1d000 100644 --- a/app/src/main/res/values-zh-rHK/strings.xml +++ b/app/src/main/res/values-zh-rHK/strings.xml @@ -485,8 +485,8 @@ 你可在此聊天中為自己新增筆記。若你的帳戶有任何已連結裝置,新的筆記將會進行同步處理。 %1$d 個群組成員名稱相同。 輕觸以檢閱 - 請仔細檢閱請求 - Molly 找到另一個名稱相同的聯絡人。 + + This person has the same name as another contact 聯絡我們 驗證 現在不要 @@ -1029,7 +1029,7 @@ 你的個人資料不會顯示用戶名稱、二維碼及連結。僅與你信任的人分享你的用戶名稱。 - + 其他人現在可以使用你的自選用戶名稱向你發送訊息,因此你不需提供你的電話號碼。 個人檔案名稱 用戶名稱 關於 @@ -1891,9 +1891,9 @@ Signal 人脈 - + 已驗證 - + No direct messages with %1$s %1$s 在你的系統通訊錄中 @@ -2221,7 +2221,7 @@ 用戶名稱無效。 用戶名稱長度必須介乎 %1$d 和 %2$d 個字元。 - 用戶名稱讓其他人無需透過你的電話號碼,已可向你傳送訊息。系統會將用戶名稱與一組數字配對,從而為你的地址保密。 + Usernames are always paired with a set of numbers. 這個號碼是什麼? 這組數字有助將你的用戶名稱保密,以免你受到無謂的訊息滋擾。請僅向你願意與其通訊的聯絡人和群組分享你的用戶名稱。如要更改用戶名稱,你則會收到一組新的數字。 @@ -2242,9 +2242,9 @@ 恢復用戶名稱將重設你現有的二維碼和連結。你確定嗎? - + 更改用戶名稱將重設你現有的二維碼和連結。你確定嗎? - + 繼續 %1$d 個聯絡人現已使用 Signal! @@ -4018,8 +4018,10 @@ 「%1$s」已被解除封鎖。 - 檢閱成員 - 檢閱請求 + + Review members + + Review request %1$d 個群組成員的名稱相同,請檢閱下列成員並選擇要採取的動作。 若您不確定此請求來自誰人,請檢閱下列聯絡人並採取動作。 無其他共同群組。 @@ -6046,13 +6048,13 @@ 了解更多 - + 新的連結方式 - + 引入電話號碼隱私、自選用戶名稱和連結。 - + 解除 - + 了解更多 @@ -6349,9 +6351,9 @@ 嘗試重設連結時發生網路錯誤。請稍後再試。 - + An unexpected error occurred while trying to reset your link. Try again later. - + 你的二維碼和連結已重設,並且已建立一個新的二維碼及連結。 用你的手機掃描此二維碼,開始與我在 Signal 上聊天。 @@ -6420,7 +6422,7 @@ 電話號碼 - 輸入完整的用戶名稱及其配對數字。 + Enter a username followed by a dot and its set of numbers. 下一步 diff --git a/app/src/main/res/values-zh-rTW/strings.xml b/app/src/main/res/values-zh-rTW/strings.xml index 54db62118c..75409f3fe1 100644 --- a/app/src/main/res/values-zh-rTW/strings.xml +++ b/app/src/main/res/values-zh-rTW/strings.xml @@ -485,8 +485,8 @@ 你可在此聊天中為自己新增筆記。若你的帳戶有任何已連結裝置,新的筆記將會進行同步處理。 %1$d個群組成員有相同的名稱。 點按以查看 - 仔細審核請求 - Molly找到了另一個同名聯絡人。 + + This person has the same name as another contact 與我們聯繫 驗證 稍後 @@ -1029,7 +1029,7 @@ 你的個人資料不會顯示用戶名稱、二維碼及連結。僅與你信任的人分享你的用戶名稱。 - + 其他人現在可以使用你的自選用戶名稱向你發送訊息,因此你不需提供你的電話號碼。 個人資料名稱 使用者名稱 關於 @@ -1891,9 +1891,9 @@ Signal 人脈 - + 已驗證 - + No direct messages with %1$s %1$s 在你的系統聯絡人中 @@ -2221,7 +2221,7 @@ 使用者名稱無效。 使用者名稱長度必須介乎 %1$d 和 %2$d個字元。 - 使用者名稱方便他人無需你的手機號碼,也可傳訊息給你。使用者名稱會與一組數字配對,以妥善保護網路位址的隱私。 + Usernames are always paired with a set of numbers. 這組號碼是什麼? 這組號碼能保障使用者名稱的隱私,以避免你收到不必要的訊息。建議你僅將使用者名稱分享給你想聯繫的對象和群組。若變更使用者名稱,則會再收到一組新的數字。 @@ -2242,9 +2242,9 @@ 恢復用戶名稱將重設你現有的二維碼和連結。你確定嗎? - + 更改用戶名稱將重設你現有的二維碼和連結。你確定嗎? - + 繼續 有%1$d個聯絡人使用Signal @@ -4018,8 +4018,10 @@ \"%1$s\"已經被解封鎖。 - 審查成員 - 審查要求 + + Review members + + Review request %1$d 個群組成員的名字相同,請查看以下成員並選擇採取措施。 如果你不確定請求來自誰,請查看下面的聯絡人並採取措施。 沒有其他共同的群組。 @@ -6046,13 +6048,13 @@ 了解更多 - + 新的連結方式 - + 引入電話號碼隱私、自選用戶名稱和連結。 - + 忽略 - + 了解更多 @@ -6349,9 +6351,9 @@ 嘗試重設連結時發生網路錯誤。請稍後再試。 - + An unexpected error occurred while trying to reset your link. Try again later. - + 你的二維碼和連結已重設,並且已建立一個新的二維碼及連結。 用你的手機掃描此二維碼,開始與我在 Signal 上聊天。 @@ -6420,7 +6422,7 @@ 電話號碼 - 輸入完整的用戶名稱及其配對數字。 + Enter a username followed by a dot and its set of numbers. 下一步 diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 1f3cc6dab6..6fd0ae78fb 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -494,8 +494,8 @@ You can add notes for yourself in this chat. If your account has any linked devices, new notes will be synced. %1$d group members have the same name. Tap to review - Review requests carefully - Molly found another contact with the same name. + + This person has the same name as another contact Contact us Verify Not now @@ -1063,6 +1063,8 @@ Your username, QR code and link aren\'t visible on your profile. Only share your username with people you trust. + + People can now message you using your optional username so you don\'t have to give out your phone number. Profile name Username About @@ -1963,6 +1965,10 @@ Signal connection + + Verified + + No direct messages with %1$s %1$s is in your system contacts @@ -2298,7 +2304,7 @@ Username is invalid. Usernames must be between %1$d and %2$d characters. - Usernames let others message you without needing your phone number. They are paired with a set of digits to help keep your address private. + Usernames are always paired with a set of numbers. What is this number? These digits help keep your username private so you can avoid unwanted messages. Share your username with only the people and groups you\'d like to chat with. If you change usernames you\'ll get a new set of digits. @@ -2318,6 +2324,10 @@ This number can\'t start with 00. Enter a digit between 1–9 Recovering your username will reset your existing QR code and link. Are you sure? + + Changing your username will reset your existing QR code and link. Are you sure? + + Continue %d contact is on Signal! @@ -2522,7 +2532,7 @@ Not now - Set up your username + Set up username Play video @@ -4114,8 +4124,10 @@ \"%1$s\" has been unblocked. - Review Members - Review Request + + Review members + + Review request %1$d group members have the same name, review the members below and choose to take action. If you\'re not sure who the request is from, review the contacts below and take action. No other groups in common. @@ -6173,6 +6185,15 @@ Learn more + + New ways to connect + + Introducing phone number privacy, optional usernames and links. + + Dismiss + + Learn more + Bold @@ -6470,6 +6491,10 @@ You do not have network access. Your link was not reset. Try again later. A network error occurred while trying to reset your link. Try again later. + + An unexpected error occurred while trying to reset your link. Try again later. + + Your QR code and link have been reset and a new QR code and link has been created. Scan this QR code with your phone to chat with me on Signal. @@ -6540,7 +6565,7 @@ Phone number - Enter a full username with its pair of digits. + Enter a username followed by a dot and its set of numbers. Next diff --git a/app/src/test/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt b/app/src/test/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt index f54569b4e7..88db63848a 100644 --- a/app/src/test/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt +++ b/app/src/test/java/org/thoughtcrime/securesms/storage/ContactRecordProcessorTest.kt @@ -283,8 +283,6 @@ class ContactRecordProcessorTest { // GIVEN val subject = ContactRecordProcessor(ACI_A, PNI_A, E164_A, recipientTable) - featureFlags.`when` { FeatureFlags.phoneNumberPrivacy() }.thenReturn(true) - val local = buildRecord( STORAGE_ID_A, record = ContactRecord( @@ -317,8 +315,6 @@ class ContactRecordProcessorTest { // GIVEN val subject = ContactRecordProcessor(ACI_A, PNI_A, E164_A, recipientTable) - featureFlags.`when` { FeatureFlags.phoneNumberPrivacy() }.thenReturn(true) - val local = buildRecord( STORAGE_ID_A, record = ContactRecord( @@ -351,8 +347,6 @@ class ContactRecordProcessorTest { // GIVEN val subject = ContactRecordProcessor(ACI_A, PNI_A, E164_A, recipientTable) - featureFlags.`when` { FeatureFlags.phoneNumberPrivacy() }.thenReturn(true) - val local = buildRecord( STORAGE_ID_A, record = ContactRecord( @@ -380,40 +374,6 @@ class ContactRecordProcessorTest { assertEquals(remote.pni.get(), result.pni.get()) } - @Test - fun `merge, pnpDisabled, pniNotDropped`() { - // GIVEN - val subject = ContactRecordProcessor(ACI_A, PNI_A, E164_A, recipientTable) - - featureFlags.`when` { FeatureFlags.phoneNumberPrivacy() }.thenReturn(false) - - val local = buildRecord( - STORAGE_ID_A, - record = ContactRecord( - aci = ACI_A.toString(), - e164 = E164_A, - pni = PNI_A.toStringWithoutPrefix() - ) - ) - - val remote = buildRecord( - STORAGE_ID_B, - record = ContactRecord( - aci = ACI_A.toString(), - e164 = E164_B, - pni = PNI_B.toStringWithoutPrefix() - ) - ) - - // WHEN - val result = subject.merge(remote, local, TestKeyGenerator(STORAGE_ID_C)) - - // THEN - assertEquals(remote.aci, result.aci) - assertEquals(remote.number.get(), result.number.get()) - assertEquals(true, result.pni.isPresent) - } - private fun buildRecord(id: StorageId = STORAGE_ID_A, record: ContactRecord): SignalContactRecord { return SignalContactRecord(id, record) } diff --git a/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt index ff2cf42032..2be20349a9 100644 --- a/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt +++ b/core-util/src/main/java/org/signal/core/util/SQLiteDatabaseExtensions.kt @@ -114,7 +114,7 @@ fun SupportSQLiteDatabase.delete(tableName: String): DeleteBuilderPart1 { * Deletes all data in the table. */ fun SupportSQLiteDatabase.deleteAll(tableName: String): Int { - return this.delete(tableName, null, null) + return this.delete(tableName, null, emptyArray()) } fun SupportSQLiteDatabase.insertInto(tableName: String): InsertBuilderPart1 { diff --git a/core-util/src/main/java/org/signal/core/util/StringExtensions.kt b/core-util/src/main/java/org/signal/core/util/StringExtensions.kt index 49fe18533c..aa9bf019ab 100644 --- a/core-util/src/main/java/org/signal/core/util/StringExtensions.kt +++ b/core-util/src/main/java/org/signal/core/util/StringExtensions.kt @@ -1,5 +1,8 @@ package org.signal.core.util +import kotlin.contracts.ExperimentalContracts +import kotlin.contracts.contract + /** * Treats the string as a serialized list of tokens and tells you if an item is present in the list. * In addition to exact matches, this handles wildcards at the end of an item. @@ -54,3 +57,11 @@ fun String?.nullIfBlank(): String? { null } } + +@OptIn(ExperimentalContracts::class) +fun CharSequence?.isNotNullOrBlank(): Boolean { + contract { + returns(true) implies (this@isNotNullOrBlank != null) + } + return !this.isNullOrBlank() +} diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java index 0e4980e165..c2c496d8c3 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/SignalServiceAccountManager.java @@ -390,7 +390,6 @@ public String getNewDeviceUuid() throws TimeoutException, IOException { public CdsiV2Service.Response getRegisteredUsersWithCdsi(Set previousE164s, Set newE164s, Map serviceIds, - boolean requireAcis, Optional token, String mrEnclave, Long timeoutMs, @@ -399,7 +398,7 @@ public CdsiV2Service.Response getRegisteredUsersWithCdsi(Set previousE16 { CdsiAuthResponse auth = pushServiceSocket.getCdsiAuth(); CdsiV2Service service = new CdsiV2Service(configuration, mrEnclave); - CdsiV2Service.Request request = new CdsiV2Service.Request(previousE164s, newE164s, serviceIds, requireAcis, token); + CdsiV2Service.Request request = new CdsiV2Service.Request(previousE164s, newE164s, serviceIds, token); Single> single = service.getRegisteredUsers(auth.getUsername(), auth.getPassword(), request, tokenSaver); ServiceResponse serviceResponse; diff --git a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java index e69dc925d4..fafe613183 100644 --- a/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java +++ b/libsignal-service/src/main/java/org/whispersystems/signalservice/api/services/CdsiV2Service.java @@ -101,8 +101,7 @@ private static ClientRequest buildClientRequest(Request request) { .prevE164s(toByteString(previousE164s)) .newE164s(toByteString(newE164s)) .discardE164s(toByteString(removedE164s)) - .aciUakPairs(toByteString(request.serviceIds)) - .returnAcisWithoutUaks(request.requireAcis); + .aciUakPairs(toByteString(request.serviceIds)); if (request.token != null) { builder.token(ByteString.of(request.token)); @@ -155,11 +154,9 @@ public static final class Request { final Map serviceIds; - final boolean requireAcis; - final byte[] token; - public Request(Set previousE164s, Set newE164s, Map serviceIds, boolean requireAcis, Optional token) { + public Request(Set previousE164s, Set newE164s, Map serviceIds, Optional token) { if (previousE164s.size() > 0 && !token.isPresent()) { throw new IllegalArgumentException("You must have a token if you have previousE164s!"); } @@ -168,7 +165,6 @@ public Request(Set previousE164s, Set newE164s, Map