Performed a PR pass to fix up anything obvious - there's still a few things left TODO

This commit is contained in:
alansley 2024-08-26 11:52:41 +10:00
parent 53978f818d
commit 404fb8001c
82 changed files with 147 additions and 1129 deletions

View File

@ -225,7 +225,7 @@ dependencies {
ksp("androidx.hilt:hilt-compiler:$jetpackHiltVersion")
ksp("com.google.dagger:hilt-compiler:$daggerHiltVersion")
ksp "com.github.bumptech.glide:ksp:$glideVersion"
ksp("com.github.bumptech.glide:ksp:$glideVersion")
implementation 'androidx.compose.material3:material3-android:1.2.1'
implementation("com.google.dagger:hilt-android:$daggerHiltVersion")
@ -273,7 +273,6 @@ dependencies {
implementation 'com.github.chrisbanes:PhotoView:2.1.3'
implementation "com.github.bumptech.glide:glide:$glideVersion"
implementation "com.github.bumptech.glide:compose:1.0.0-beta01"
ksp "com.github.bumptech.glide:ksp:$glideVersion"
implementation 'com.makeramen:roundedimageview:2.1.0'
implementation 'com.pnikosis:materialish-progress:1.5'
implementation 'org.greenrobot:eventbus:3.0.0'

View File

@ -268,13 +268,6 @@
android:theme="@style/Theme.Session.DayNight.NoActionBar"
android:launchMode="singleTask"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="org.thoughtcrime.securesms.MediaOverviewActivity"
android:configChanges="touchscreen|keyboard|keyboardHidden|orientation|screenLayout|screenSize"
android:launchMode="singleTask"
android:screenOrientation="portrait"
android:theme="@style/Theme.Session.DayNight.NoActionBar"
android:windowSoftInputMode="stateHidden" />
<activity
android:name="org.thoughtcrime.securesms.DummyActivity"
android:allowTaskReparenting="true"

View File

@ -405,7 +405,6 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im
@SuppressWarnings("CodeBlock2Expr")
@SuppressLint("InlinedApi")
private void saveToDisk() {
Log.w("ACL", "Asked to save to disk!");
MediaItem mediaItem = getCurrentMediaItem();
if (mediaItem == null) return;
@ -487,6 +486,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im
super.onOptionsItemSelected(item);
switch (item.getItemId()) {
// TODO / WARNING: R.id values are NON-CONSTANT in Gradle 8.0+ - what would be the best way to address this?! -AL 2024/08/26
case R.id.media_preview__overview: showOverview(); return true;
case R.id.media_preview__forward: forward(); return true;
case R.id.save: saveToDisk(); return true;
@ -537,15 +537,11 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im
throw new RuntimeException("restartItem = " + restartItem + ", data.second = " + data.second + " leftIsRecent = " + leftIsRecent, e);
}
if (item == 0) {
viewPagerListener.onPageSelected(0);
}
if (item == 0) { viewPagerListener.onPageSelected(0); }
}
@Override
public void onLoaderReset(@NonNull Loader<Pair<Cursor, Integer>> loader) {
}
public void onLoaderReset(@NonNull Loader<Pair<Cursor, Integer>> loader) { /* Do nothing */ }
private class ViewPagerListener implements ViewPager.OnPageChangeListener {
@ -580,13 +576,11 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
/* Do nothing */
}
@Override
public void onPageScrollStateChanged(int state) {
}
public void onPageScrollStateChanged(int state) { /* Do nothing */ }
}
private static class SingleItemPagerAdapter extends MediaItemAdapter {
@ -651,9 +645,7 @@ public class MediaPreviewActivity extends PassphraseRequiredActionBarActivity im
}
@Override
public void pause(int position) {
}
public void pause(int position) { /* Do nothing */ }
@Override
public @Nullable View getPlaybackControls(int position) {

View File

@ -29,12 +29,14 @@ import android.provider.OpenableColumns;
import android.view.MenuItem;
import android.view.View;
import android.widget.ImageView;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.ActionBar;
import androidx.appcompat.widget.Toolbar;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import network.loki.messenger.R;
import org.session.libsession.utilities.Address;
import org.session.libsession.utilities.DistributionTypes;
import org.session.libsession.utilities.ViewUtil;
@ -49,12 +51,6 @@ import org.thoughtcrime.securesms.mms.PartAuthority;
import org.thoughtcrime.securesms.providers.BlobProvider;
import org.thoughtcrime.securesms.util.MediaUtil;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import network.loki.messenger.R;
/**
* An activity to quickly share content with contacts
*
@ -69,7 +65,6 @@ public class ShareActivity extends PassphraseRequiredActionBarActivity
public static final String EXTRA_ADDRESS_MARSHALLED = "address_marshalled";
public static final String EXTRA_DISTRIBUTION_TYPE = "distribution_type";
private ContactSelectionListFragment contactsFragment;
private SearchToolbar searchToolbar;
private ImageView searchAction;

View File

@ -167,7 +167,6 @@ public class AudioSlidePlayer implements SensorEventListener {
}
}
@Override
public void onPlayerError(PlaybackException error) {
Log.w(TAG, "MediaPlayer Error: " + error);
@ -206,9 +205,7 @@ public class AudioSlidePlayer implements SensorEventListener {
this.mediaPlayer.release();
}
if (this.audioAttachmentServer != null) {
this.audioAttachmentServer.stop();
}
if (this.audioAttachmentServer != null) { this.audioAttachmentServer.stop(); }
sensorManager.unregisterListener(AudioSlidePlayer.this);
@ -217,9 +214,7 @@ public class AudioSlidePlayer implements SensorEventListener {
}
public synchronized static void stopAll() {
if (playing.isPresent()) {
playing.get().stop();
}
if (playing.isPresent()) { playing.get().stop(); }
}
public synchronized boolean isReady() {
@ -361,9 +356,8 @@ public class AudioSlidePlayer implements SensorEventListener {
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
public void onAccuracyChanged(Sensor sensor, int accuracy) { /* Do nothing */ }
}
public interface Listener {
void onPlayerStart(@NonNull AudioSlidePlayer player);

View File

@ -44,7 +44,7 @@ public class SwitchPreferenceCompat extends CheckBoxPreference {
// Substitute app name into lockscreen preference summary
if (key.equalsIgnoreCase(LOCK_SCREEN_KEY)) {
Context c = getContext();
CharSequence substitutedSummaryCS = Phrase.from(c, R.string.lockAppDescriptionAndroid)
CharSequence substitutedSummaryCS = Phrase.from(c, R.string.lockAppDescription)
.put(APP_NAME_KEY, c.getString(R.string.app_name))
.format();
this.setSummary(substitutedSummaryCS);

View File

@ -14,7 +14,6 @@ import com.bumptech.glide.RequestManager
class UserView : LinearLayout {
private lateinit var binding: ViewUserBinding
var openGroupThreadID: Long = -1L // FIXME: This is a bit ugly
enum class ActionIndicator {
None,
@ -86,8 +85,6 @@ class UserView : LinearLayout {
}
}
fun unbind() {
binding.profilePictureView.recycle()
}
fun unbind() { binding.profilePictureView.recycle() }
// endregion
}

View File

@ -41,7 +41,6 @@ internal class NewMessageViewModel @Inject constructor(
override fun onChange(value: String) {
loadOnsJob?.cancel()
loadOnsJob = null
_state.update { it.copy(newMessageIdOrOns = value, isTextErrorColor = false, loading = false) }
}

View File

@ -1368,7 +1368,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
return false
} else {
// ..otherwise if the earliest emoji reaction was more than a minute ago we'll
// remove that early reaction to move the timestamp at index 1 into index 0,, add
// remove that early reaction to move the timestamp at index 1 into index 0, add
// our new timestamp and return true to accept the emoji reaction.
emojiRateLimiterQueue.removeFirst()
emojiRateLimiterQueue.addLast(timestamp)
@ -1843,7 +1843,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
// ..otherwise we can attempt to send the attachment(s).
// Note: The only multi-attachment message type is when sending images - all others
// attempt send on initial attachment selection.
// attempt send the attachment immediately upon file selection.
sendAttachments(attachmentManager.buildSlideDeck().asAttachments(), null)
}
@ -1931,8 +1931,8 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
} else {
Permissions.with(this)
.request(Manifest.permission.RECORD_AUDIO)
.withRationaleDialog(getString(R.string.permissionsMicrophoneAccessRequiredAndroid), R.drawable.ic_baseline_mic_48)
.withPermanentDenialDialog(Phrase.from(applicationContext, R.string.permissionsMicrophoneAccessRequiredAndroid)
.withRationaleDialog(getString(R.string.permissionsMicrophoneAccessRequired), R.drawable.ic_baseline_mic_48)
.withPermanentDenialDialog(Phrase.from(applicationContext, R.string.permissionsMicrophoneAccessRequired)
.put(APP_NAME_KEY, getString(R.string.app_name))
.format().toString())
.execute()
@ -2119,7 +2119,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
override fun banUser(messages: Set<MessageRecord>) {
showSessionDialog {
title(R.string.banUser)
// ACL TODO - We need a string for the below `text` element
// ACL TODO - We need a string for the below `text` element - have asked Lucy about this 2024/08/26 -AL
text("This will ban the selected user from this room. It won't ban them from other rooms.")
button(R.string.banUser) { viewModel.banUser(messages.first().individualRecipient); endActionMode() }
cancelButton(::endActionMode)
@ -2129,7 +2129,7 @@ class ConversationActivityV2 : PassphraseRequiredActionBarActivity(), InputBarDe
override fun banAndDeleteAll(messages: Set<MessageRecord>) {
showSessionDialog {
title(R.string.banUser)
// ACL TODO - We need a string for the below `text` element
// ACL TODO - We need a string for the below `text` element - have asked Lucy about this 2024/08/26 -AL
text("This will ban the selected user from this room and delete all messages sent by them. It won't ban them from other rooms or delete the messages they sent there.")
button(R.string.banUser) { viewModel.banAndDeleteAll(messages.first()); endActionMode() }
cancelButton(::endActionMode)

View File

@ -33,7 +33,7 @@ class BlockedDialog(private val recipient: Recipient, private val context: Conte
title(resources.getString(R.string.blockUnblock))
text(spannable)
dangerButton(R.string.blockUnblock,R.string.AccessibilityId_unblockConfirm) { unblock() }
dangerButton(R.string.blockUnblock, R.string.AccessibilityId_unblockConfirm) { unblock() }
cancelButton { dismiss() }
}

View File

@ -634,7 +634,7 @@ open class Storage(
val threadID = getOrCreateThreadIdFor(Address.fromSerialized(groupId))
threadDb.setDate(threadID, formationTimestamp)
// ACL Note: Commenting out this line prevents the timestamp of room creation being added to a new closed group,
// Note: Commenting out this line prevents the timestamp of room creation being added to a new closed group,
// which in turn allows us to show the `groupNoMessages` control message text.
//insertOutgoingInfoMessage(context, groupId, SignalServiceGroup.Type.CREATION, title, members.map { it.serialize() }, admins.map { it.serialize() }, threadID, formationTimestamp)

View File

@ -6,17 +6,15 @@ import android.app.NotificationChannel;
import android.app.NotificationManager;
import android.content.Context;
import android.database.Cursor;
import androidx.annotation.NonNull;
import androidx.core.app.NotificationCompat;
import com.squareup.phrase.Phrase;
import java.io.File;
import net.zetetic.database.sqlcipher.SQLiteConnection;
import net.zetetic.database.sqlcipher.SQLiteDatabase;
import net.zetetic.database.sqlcipher.SQLiteDatabaseHook;
import net.zetetic.database.sqlcipher.SQLiteOpenHelper;
import network.loki.messenger.R;
import org.session.libsession.utilities.TextSecurePreferences;
import org.session.libsignal.utilities.Log;
import org.thoughtcrime.securesms.crypto.DatabaseSecret;
@ -43,13 +41,8 @@ import org.thoughtcrime.securesms.database.SessionContactDatabase;
import org.thoughtcrime.securesms.database.SessionJobDatabase;
import org.thoughtcrime.securesms.database.SmsDatabase;
import org.thoughtcrime.securesms.database.ThreadDatabase;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.util.ConfigurationMessageUtilities;
import java.io.File;
import network.loki.messenger.R;
public class SQLCipherOpenHelper extends SQLiteOpenHelper {
@SuppressWarnings("unused")

View File

@ -156,123 +156,10 @@ class HomeActivity : PassphraseRequiredActionBarActivity(),
private val isFromOnboarding: Boolean get() = intent.getBooleanExtra(FROM_ONBOARDING, false)
private val isNewAccount: Boolean get() = intent.getBooleanExtra(NEW_ACCOUNT, false)
// ACL REMOVE BLOCK START
fun getRelativeTimeLocalized(timestampMS: Long): String {
// Get the current system time
val nowMS = System.currentTimeMillis()
// Calculate the time difference in milliseconds - this value will be negative if it's in the
// future or positive if it's in the past.
val timeDifferenceMS = nowMS - timestampMS
// Choose a desired time resolution based on the time difference.
// Note: We do this against the absolute time difference so this function can still work for
// both future/past times without having separate future/past cases.
val desiredResolution = when (abs(timeDifferenceMS)) {
in 0..DateUtils.MINUTE_IN_MILLIS -> DateUtils.SECOND_IN_MILLIS
in DateUtils.MINUTE_IN_MILLIS..DateUtils.HOUR_IN_MILLIS -> DateUtils.MINUTE_IN_MILLIS
in DateUtils.HOUR_IN_MILLIS..DateUtils.DAY_IN_MILLIS -> DateUtils.HOUR_IN_MILLIS
in DateUtils.DAY_IN_MILLIS..DateUtils.WEEK_IN_MILLIS -> DateUtils.DAY_IN_MILLIS
// We don't do months or years, so if the result is 53 weeks then so be it - also, the
// getRelativeTimeSpanString method's resolution maxes out at weeks!
else -> DateUtils.WEEK_IN_MILLIS
}
// Use DateUtils to get the relative time span string
return DateUtils.getRelativeTimeSpanString(
timestampMS,
nowMS,
desiredResolution,
DateUtils.FORMAT_ABBREV_RELATIVE
// Using either DateUtils.FORMAT_ABBREV_RELATIVE or DateUtils.FORMAT_ABBREV_ALL gives:
// - 1 sec. ago / 2 sec. ago
// - 1 min. ago / 2 min. ago
// - 1 hr. ago / 2 hr. ago
// - Yesterday / 2 days ago
// - August 2 / 2 wk. ago / 14 wk. ago <-- Note: Date running this test is August 9th.
// Using either 0 or DateUtils.FORMAT_ABBREV_TIME gives:
// - 1 second ago / 2 seconds ago
// - 1 minute ago / 2 minutes ago
// - 1 hour ago / 2 hours ago
// - Yesterday / 2 days ago
// - August 2nd / 2 weeks ago / 14 weeks ago <-- Note: Date running this test is August 9th.
).toString()
}
fun testRelativeTimes(op: (Long, Long) -> Long) {
var t = 0L
// 1 and 2 seconds
t = op(System.currentTimeMillis(), 1.seconds.inWholeMilliseconds)
Log.w("ACL", "1s -> ${getRelativeTimeLocalized(t)}")
t = op(System.currentTimeMillis(), 2.seconds.inWholeMilliseconds)
Log.w("ACL", "2s -> ${getRelativeTimeLocalized(t)}")
// 1 and 2 minutes
t = op(System.currentTimeMillis(), 1.minutes.inWholeMilliseconds)
Log.w("ACL", "1m -> ${getRelativeTimeLocalized(t)}")
t = op(System.currentTimeMillis(), 2.minutes.inWholeMilliseconds)
Log.w("ACL", "2m -> ${getRelativeTimeLocalized(t)}")
// 1 and 2 hours
t = op(System.currentTimeMillis(), 1.hours.inWholeMilliseconds)
Log.w("ACL", "1h -> ${getRelativeTimeLocalized(t)}")
t = op(System.currentTimeMillis(), 2.hours.inWholeMilliseconds)
Log.w("ACL", "2h -> ${getRelativeTimeLocalized(t)}")
// 1 and 2 days
t = op(System.currentTimeMillis(), 1.days.inWholeMilliseconds)
Log.w("ACL", "1d -> ${getRelativeTimeLocalized(t)}")
t = op(System.currentTimeMillis(), 2.days.inWholeMilliseconds)
Log.w("ACL", "2d -> ${getRelativeTimeLocalized(t)}")
// 1 week, 2 weeks, and 100 days (14.285 weeks)
t = op(System.currentTimeMillis(), 7.days.inWholeMilliseconds)
Log.w("ACL", "1w -> ${getRelativeTimeLocalized(t)}")
t = op(System.currentTimeMillis(), 14.days.inWholeMilliseconds)
Log.w("ACL", "2w -> ${getRelativeTimeLocalized(t)}")
t = op(System.currentTimeMillis(), 100.days.inWholeMilliseconds)
Log.w("ACL", "100d -> ${getRelativeTimeLocalized(t)}")
}
fun testSystemGeneratedRelativeTimes() {
// Print relative times in the past
var op: (Long, Long) -> Long = Long::minus
testRelativeTimes(op)
// Print relative times in the future
op = Long::plus
testRelativeTimes(op)
}
// ACL REMOVE BLOCK END
// region Lifecycle
override fun onCreate(savedInstanceState: Bundle?, isReady: Boolean) {
super.onCreate(savedInstanceState, isReady)
// ACL REMOVE THIS WHEN UNIT TESTS ARE FIXED
//Locale.setDefault(Locale.FRENCH)
//testSystemGeneratedRelativeTimes()
// Set content view
binding = ActivityHomeBinding.inflate(layoutInflater)
setContentView(binding.root)

View File

@ -53,7 +53,7 @@ class PathActivity : PassphraseRequiredActionBarActivity() {
setContentView(binding.root)
supportActionBar!!.title = resources.getString(R.string.onionRoutingPath)
// Substitute the localised version of "Session" into the layout
// Substitute "Session" into the path description. Note: This is a non-translatable string.
val appName = applicationContext.getString(R.string.app_name)
val txt = Phrase.from(applicationContext, R.string.onionRoutingPathDescription).put(APP_NAME_KEY, appName).format().toString()
binding.pathDescription.text = txt

View File

@ -1,10 +1,5 @@
package org.thoughtcrime.securesms.linkpreview;
import static org.thoughtcrime.securesms.giph.util.InfiniteScrollListener.TAG;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import android.annotation.SuppressLint;
import android.os.Build;
import android.text.Html;
@ -12,15 +7,9 @@ import android.text.SpannableString;
import android.text.TextUtils;
import android.text.style.URLSpan;
import android.text.util.Linkify;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import com.annimon.stream.Stream;
import org.session.libsignal.utilities.Log;
import org.thoughtcrime.securesms.util.DateUtils;
import org.session.libsignal.utilities.guava.Optional;
import org.session.libsession.utilities.Util;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
@ -30,10 +19,10 @@ import java.util.Locale;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import android.text.format.DateFormat;
import okhttp3.HttpUrl;
import org.session.libsession.utilities.Util;
import org.session.libsignal.utilities.Log;
import org.session.libsignal.utilities.guava.Optional;
public final class LinkPreviewUtil {

View File

@ -35,8 +35,8 @@ class FixedTimeBuckets(
@StringRes
fun getBucketText(time: ZonedDateTime): Int? {
return when {
time >= startOfToday -> R.string.BucketedThreadMedia_Today // Should be replaced with call to getLocalisedRelativeDayString
time >= startOfYesterday -> R.string.BucketedThreadMedia_Yesterday // Should be replaced with call to getLocalisedRelativeDayString
time >= startOfToday -> R.string.BucketedThreadMedia_Today
time >= startOfYesterday -> R.string.BucketedThreadMedia_Yesterday
time >= startOfThisWeek -> R.string.attachmentsThisWeek
time >= startOfThisMonth -> R.string.attachmentsThisMonth
else -> null

View File

@ -28,6 +28,8 @@ import android.database.Cursor
import android.os.AsyncTask
import android.os.Build
import android.text.TextUtils
import android.widget.Toast
import androidx.camera.core.impl.utils.ContextUtil.getApplicationContext
import androidx.core.app.ActivityCompat
import androidx.core.app.NotificationCompat
import androidx.core.app.NotificationManagerCompat
@ -45,6 +47,7 @@ import org.session.libsession.messaging.utilities.AccountId
import org.session.libsession.messaging.utilities.SodiumUtilities.blindedKeyPair
import org.session.libsession.utilities.Address.Companion.fromSerialized
import org.session.libsession.utilities.ServiceUtil
import org.session.libsession.utilities.StringSubstitutionConstants.APP_NAME_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.EMOJI_KEY
import org.session.libsession.utilities.TextSecurePreferences.Companion.getLocalNumber
import org.session.libsession.utilities.TextSecurePreferences.Companion.getNotificationPrivacy
@ -67,6 +70,8 @@ import org.thoughtcrime.securesms.database.model.MmsMessageRecord
import org.thoughtcrime.securesms.database.model.ReactionRecord
import org.thoughtcrime.securesms.dependencies.DatabaseComponent.Companion.get
import org.thoughtcrime.securesms.mms.SlideDeck
import org.thoughtcrime.securesms.permissions.Permissions
import org.thoughtcrime.securesms.preferences.ShareLogsDialog
import org.thoughtcrime.securesms.service.KeyCachingService
import org.thoughtcrime.securesms.util.SessionMetaProtocol.canUserReplyToNotification
import org.thoughtcrime.securesms.util.SpanUtil
@ -209,7 +214,6 @@ class DefaultMessageNotifier : MessageNotifier {
return
}
//var notificationState: NotificationState
try {
val notificationState = constructNotificationState(context, telcoCursor)
@ -353,7 +357,7 @@ class DefaultMessageNotifier : MessageNotifier {
val notification = builder.build()
// ACL FIX THIS PROPERLY
// TODO - ACL to fix this properly & will do on 2024-08-26, but just skipping for now so review can start
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
@ -435,7 +439,7 @@ class DefaultMessageNotifier : MessageNotifier {
builder.putStringExtra(LATEST_MESSAGE_ID_TAG, messageIdTag)
// ACL FIX THIS PROPERLY
// TODO - ACL to fix this properly & will do on 2024-08-26, but just skipping for now so review can start
if (ActivityCompat.checkSelfPermission(context, Manifest.permission.POST_NOTIFICATIONS) != PackageManager.PERMISSION_GRANTED) {
// TODO: Consider calling
// ActivityCompat#requestPermissions
@ -463,7 +467,7 @@ class DefaultMessageNotifier : MessageNotifier {
val threadDatabase = get(context).threadDatabase()
val cache: MutableMap<Long, String?> = HashMap()
// CAREFUL: Do not put this loop back as `while ((reader.next.also { record = it }) != null) {` because it breaks with a Null Pointer Exception - you have been warned.
// CAREFUL: Do not put this loop back as `while ((reader.next.also { record = it }) != null) {` because it breaks with a Null Pointer Exception!
var record: MessageRecord? = null
do {
record = reader.next
@ -587,7 +591,6 @@ class DefaultMessageNotifier : MessageNotifier {
if (count == 0) ShortcutBadger.removeCount(context)
else ShortcutBadger.applyCount(context, count)
} catch (t: Throwable) {
// NOTE :: I don't totally trust this thing, so I'm catching everything.
Log.w("MessageNotifier", t)
}
}

View File

@ -18,7 +18,6 @@ import java.util.List;
import network.loki.messenger.R;
import org.session.libsession.messaging.contacts.Contact;
import org.session.libsession.utilities.NotificationPrivacyPreference;
import org.session.libsession.utilities.TextSecurePreferences;
import org.session.libsession.utilities.Util;
import org.session.libsession.utilities.recipients.Recipient;
import org.thoughtcrime.securesms.database.SessionContactDatabase;
@ -41,12 +40,15 @@ public class MultipleRecipientNotificationBuilder extends AbstractNotificationBu
}
public void setMessageCount(int messageCount, int threadCount) {
String txt = Phrase.from(context, R.string.notificationsAndroidSystem)
String txt = Phrase.from(context, R.string.notificationsSystem)
.put(MESSAGE_COUNT_KEY, messageCount)
.put(CONVERSATION_COUNT_KEY, threadCount)
.format().toString();
setSubText(txt);
setContentInfo(String.valueOf(messageCount)); // Note: `setContentInfo` details are only visible in Android API 24 and below - remove when min. API is upgraded.
// Note: `setContentInfo` details are only visible in Android API 24 and below - as our minimum is now API 26 this can be skipped.
//setContentInfo(String.valueOf(messageCount));
setNumber(messageCount);
}

View File

@ -71,7 +71,7 @@ internal fun MessageNotificationsScreen(
NotificationRadioButton(
R.string.notificationsFastMode,
R.string.notificationsFastModeDescriptionAndroid,
R.string.notificationsFastModeDescription,
modifier = Modifier.contentDescription(R.string.AccessibilityId_notificationsFastMode),
tag = R.string.recommended,
checked = state.pushEnabled,

View File

@ -1,41 +0,0 @@
package org.thoughtcrime.securesms.preferences
import android.app.Dialog
import android.content.ClipData
import android.content.ClipboardManager
import android.content.Context
import android.os.Bundle
import android.widget.Toast
import androidx.fragment.app.DialogFragment
import network.loki.messenger.R
import org.session.libsignal.crypto.MnemonicCodec
import org.session.libsignal.utilities.hexEncodedPrivateKey
import org.thoughtcrime.securesms.createSessionDialog
import org.thoughtcrime.securesms.crypto.IdentityKeyUtil
import org.thoughtcrime.securesms.crypto.MnemonicUtilities
class SeedDialog: DialogFragment() {
private val seed by lazy {
val hexEncodedSeed = IdentityKeyUtil.retrieve(requireContext(), IdentityKeyUtil.LOKI_SEED)
?: IdentityKeyUtil.getIdentityKeyPair(requireContext()).hexEncodedPrivateKey // Legacy account
MnemonicCodec { fileName -> MnemonicUtilities.loadFileContents(requireContext(), fileName) }
.encode(hexEncodedSeed, MnemonicCodec.Language.Configuration.english)
}
override fun onCreateDialog(savedInstanceState: Bundle?): Dialog = createSessionDialog {
title(R.string.sessionRecoveryPassword)
text(R.string.recoveryPasswordDescription)
text(seed, R.style.AccountIdTextView)
button(R.string.copy, R.string.AccessibilityId_sessionRecoveryPasswordCopy) { copySeed() }
button(R.string.close) { dismiss() }
}
private fun copySeed() {
val clipboard = requireActivity().getSystemService(Context.CLIPBOARD_SERVICE) as ClipboardManager
val clip = ClipData.newPlainText("Seed", seed)
clipboard.setPrimaryClip(clip)
Toast.makeText(requireContext(), R.string.copied, Toast.LENGTH_SHORT).show()
dismiss()
}
}

View File

@ -15,6 +15,11 @@ import android.widget.Toast
import androidx.fragment.app.DialogFragment
import androidx.lifecycle.lifecycleScope
import com.squareup.phrase.Phrase
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.util.Objects
import java.util.concurrent.TimeUnit
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.Job
@ -29,11 +34,6 @@ import org.thoughtcrime.securesms.ApplicationContext
import org.thoughtcrime.securesms.createSessionDialog
import org.thoughtcrime.securesms.util.FileProviderUtil
import org.thoughtcrime.securesms.util.StreamUtil
import java.io.File
import java.io.FileOutputStream
import java.io.IOException
import java.util.Objects
import java.util.concurrent.TimeUnit
class ShareLogsDialog(private val updateCallback: (Boolean)->Unit): DialogFragment() {

View File

@ -54,7 +54,7 @@ import org.thoughtcrime.securesms.notifications.NotificationChannels;
*
* @author Moxie Marlinspike
*/
//TODO AC: This service does only serve one purpose now - to track the screen lock state and handle the timer.
// TODO: This service does only serve one purpose now - to track the screen lock state and handle the timer.
// We need to refactor it and cleanup from all the old Signal code.
public class KeyCachingService extends Service {
@ -70,7 +70,7 @@ public class KeyCachingService extends Service {
private final IBinder binder = new KeySetBinder();
// AC: This is a temporal drop off replacement for the refactoring time being.
// This is a temporal drop off replacement for the refactoring time being.
// This field only indicates if the app was unlocked or not (null means locked).
private static Object masterSecret = null;

View File

@ -8,21 +8,17 @@ import android.content.Intent;
import android.telephony.TelephonyManager;
import android.text.TextUtils;
import android.widget.Toast;
import com.squareup.phrase.Phrase;
import java.net.URISyntaxException;
import java.net.URLDecoder;
import network.loki.messenger.R;
import org.session.libsession.messaging.messages.visible.VisibleMessage;
import org.session.libsession.messaging.sending_receiving.MessageSender;
import org.session.libsession.snode.SnodeAPI;
import org.session.libsession.utilities.Address;
import org.session.libsignal.utilities.Log;
import org.session.libsession.messaging.sending_receiving.MessageSender;
import org.thoughtcrime.securesms.util.Rfc5724Uri;
import java.net.URISyntaxException;
import java.net.URLDecoder;
public class QuickResponseService extends IntentService {
private static final String TAG = QuickResponseService.class.getSimpleName();

View File

@ -10,12 +10,14 @@ import android.content.Context;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import androidx.annotation.Nullable;
import androidx.core.app.NotificationCompat;
import com.squareup.phrase.Phrase;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import network.loki.messenger.R;
import org.session.libsession.utilities.FileUtils;
import org.session.libsession.utilities.ServiceUtil;
import org.session.libsession.utilities.TextSecurePreferences;
@ -24,13 +26,6 @@ import org.session.libsignal.utilities.Log;
import org.thoughtcrime.securesms.notifications.NotificationChannels;
import org.thoughtcrime.securesms.util.FileProviderUtil;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.security.MessageDigest;
import network.loki.messenger.R;
public class UpdateApkReadyListener extends BroadcastReceiver {
private static final String TAG = UpdateApkReadyListener.class.getSimpleName();

View File

@ -31,7 +31,7 @@ import java.util.Locale
import java.util.concurrent.TimeUnit
// Enums used to get the locale-aware String for one of the three relative days
public enum class RelativeDay { TODAY, YESTERDAY, TOMORROW }
enum class RelativeDay { TODAY, YESTERDAY, TOMORROW }
/**
* Utility methods to help display dates in a nice, easily readable way.
@ -81,30 +81,6 @@ object DateUtils : android.text.format.DateUtils() {
FORMAT_SHOW_DATE).toString()
}
// Method to get the locale-aware String for the word "Now"
// public fun getLocalisedNowString(): String {
// val now = Calendar.getInstance().timeInMillis
// return getRelativeTimeSpanString(now, now,MINUTE_IN_MILLIS, FORMAT_SHOW_TIME).toString()
// }
// THIS DOES NOT WORK
public fun getLocalisedNowString(): String {
val now = Calendar.getInstance().timeInMillis
val relativeTime = getRelativeTimeSpanString(now, now, MINUTE_IN_MILLIS, FORMAT_SHOW_TIME).toString()
// Create a DateFormat instance for the current time
val timeFormat = getTimeInstance(SHORT, Locale.getDefault())
val formattedTime = timeFormat.format(Calendar.getInstance().time)
// Check if the relative time indicates "0 minutes ago" or similar and replace it with the formatted time
return if (relativeTime == "0 minutes ago" || relativeTime == "in 0 minutes") {
formattedTime
} else {
relativeTime
}
}
fun getFormattedDateTime(time: Long, template: String, locale: Locale): String {
val localizedPattern = getLocalizedPattern(template, locale)
return SimpleDateFormat(localizedPattern, locale).format(Date(time))
@ -117,8 +93,9 @@ object DateUtils : android.text.format.DateUtils() {
fun getDisplayFormattedTimeSpanString(c: Context, locale: Locale, timestamp: Long): String {
// If the timestamp is invalid (ie. 0) then assume we're waiting on data and just use the 'Now' copy
return if (timestamp == 0L || isWithin(timestamp, 1, TimeUnit.MINUTES)) {
getLocalisedNowString()
//c.getString(R.string.DateUtils_just_now) // ACL REMOVE WHEN HAPPY
// TODO ACL: We need a string for "Now" because I can't seem to coax a localised version from DateUtils -
// TODO: although anyone seeing is this is more than welcome to try! - 2024-08-26
"Now"
} else if (isToday(timestamp)) {
getFormattedDateTime(timestamp, getHourFormat(c), locale)
} else if (isWithin(timestamp, 6, TimeUnit.DAYS)) {

View File

@ -133,15 +133,9 @@ class SaveAttachmentTask @JvmOverloads constructor(context: Context, count: Int
private fun createOutputUri(context: Context, outputUri: Uri, contentType: String, fileName: String): Uri? {
if (fileName == null)
{
Log.w("ACL", "Filename is null - wtf!")
}
if (fileName != null && fileName.isEmpty())
{
Log.w("ACL", "Filename is empty - wtf!")
}
// TODO: This method may pass an empty string as the filename in Android API 28 and below. This requires
// TODO: follow-up investigation, but has temporarily been worked around, see:
// TODO: https://github.com/oxen-io/session-android/commit/afbb71351a74220c312a09c25cc1c79738453c12
val fileParts: Array<String> = getFileNameParts(fileName)
val base = fileParts[0]

View File

@ -7,7 +7,7 @@
<org.thoughtcrime.securesms.components.SwitchPreferenceCompat
android:key="pref_key_use_fcm"
android:title="@string/useFastMode"
android:summary="@string/notificationsFastModeDescriptionAndroid"
android:summary="@string/notificationsFastModeDescription"
android:defaultValue="false" />
<Preference android:title="@string/notificationsGoToDevice"

View File

@ -9,7 +9,7 @@
android:key="pref_android_screen_lock"
android:defaultValue="false"
android:title="@string/lockApp"
android:summary="@string/lockAppDescriptionAndroid" />
android:summary="@string/lockAppDescription" />
<org.thoughtcrime.securesms.components.SwitchPreferenceCompat
android:defaultValue="@bool/screen_security_default"

View File

@ -20,7 +20,6 @@ import org.session.libsignal.utilities.Log
import org.session.libsession.utilities.StringSubstitutionConstants.COUNT_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.DISAPPEARING_MESSAGES_TYPE_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.GROUP_NAME_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.MEMBERS_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.NAME_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.OTHER_NAME_KEY
import org.session.libsession.utilities.StringSubstitutionConstants.TIME_KEY
@ -65,8 +64,6 @@ object UpdateMessageBuilder {
val newMemberCount = updateData.updatedMembers.size
//val members = updateData.updatedMembers.joinToString(", ", transform = ::getSenderName)
// We previously differentiated between members added by us Vs. members added by someone
// else via checking against `isOutgoing` - but now we use the same strings regardless.
when (newMemberCount) {
@ -132,9 +129,6 @@ object UpdateMessageBuilder {
}
else // b.) Someone else is the person doing the removing of one or more members
{
// ACL TODO: Remove below line when confirmed that we aren't mentioning WHO removed anyone anymore.. or don't if we still are!
//context.getString(R.string.MessageRecord_s_removed_s_from_the_group, senderName, members)
// Note: I don't think we're doing "Alice removed Bob from the group"-type
// messages anymore - just "Bob was removed from the group" - so this block
// is identical to the one above, but I'll leave it like this until I can
@ -190,7 +184,7 @@ object UpdateMessageBuilder {
fun buildExpirationTimerMessage(
context: Context,
duration: Long,
isGroup: Boolean, // ACL TODO: Does this include communities? (i.e., open groups)?
isGroup: Boolean, // Note: isGroup should cover both closed groups AND communities
senderId: String? = null,
isOutgoing: Boolean = false,
timestamp: Long,
@ -228,8 +222,8 @@ object UpdateMessageBuilder {
.put(TIME_KEY, time)
.put(DISAPPEARING_MESSAGES_TYPE_KEY, action)
.format().toString()
} else // 1-on-1 conversation
{
} else {
// 1-on-1 conversation
Phrase.from(context, R.string.disappearingMessagesSetYou)
.put(TIME_KEY, time)
.put(DISAPPEARING_MESSAGES_TYPE_KEY, action)

View File

@ -302,9 +302,8 @@ interface TextSecurePreferences {
const val ALLOW_MESSAGE_REQUESTS = "libsession.ALLOW_MESSAGE_REQUESTS"
// Key name for if we've warned the user that saving attachments will allow other apps to access them.
// Note: This is only a concern on Android API 30+ which does not have the WRITE_EXTERNAL_STORAGE permission
// for us to check against - and we only display this once, or until the user consents to this and continues
// to save the attachment(s).
// Note: We only ever display this once - and when the user has accepted the warning we never show it again
// for the lifetime of the Session installation.
const val HAVE_WARNED_USER_ABOUT_SAVING_ATTACHMENTS = "libsession.HAVE_WARNED_USER_ABOUT_SAVING_ATTACHMENTS"
@JvmStatic

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">أو انضم إلى واحدة من…</string>
<string name="notificationsFastMode">الوضع السريع</string>
<string name="notificationsSlowMode">الوضع البطيء</string>
<string name="notificationsFastModeDescriptionAndroid">سوف يتم إشعارك بالرسائل بشكل موثوق و فوري بإستخدام خوادم جوجل للإشعارات.</string>
<string name="notificationsFastModeDescription">سوف يتم إشعارك بالرسائل بشكل موثوق و فوري بإستخدام خوادم جوجل للإشعارات.</string>
<string name="notificationsSlowModeDescription">سيقوم سيشن بالتحقق من وجود رسائل جديدة بشكل دوري في الخلفية.</string>
<string name="open">اِفتح</string>
<string name="urlCopy">انسخ الرابط</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">أو انضم إلى واحدة من…</string>
<string name="notificationsFastMode">الوضع السريع</string>
<string name="notificationsSlowMode">الوضع البطيء</string>
<string name="notificationsFastModeDescriptionAndroid">سوف يتم إشعارك بالرسائل بشكل موثوق و فوري بإستخدام خوادم جوجل للإشعارات.</string>
<string name="notificationsFastModeDescription">سوف يتم إشعارك بالرسائل بشكل موثوق و فوري بإستخدام خوادم جوجل للإشعارات.</string>
<string name="notificationsSlowModeDescription">سيقوم سيشن بالتحقق من وجود رسائل جديدة بشكل دوري في الخلفية.</string>
<string name="open">اِفتح</string>
<string name="urlCopy">انسخ الرابط</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Və ya bunlardan birinə qoşulun…</string>
<string name="notificationsFastMode">Sürətli rejim</string>
<string name="notificationsSlowMode">Yavaş rejim</string>
<string name="notificationsFastModeDescriptionAndroid">Google-un bildiriş serverlərini istifadə edərək yeni mesajlardan dərhal və etibarlı şəkildə xəbərdar olacaqsınız.</string>
<string name="notificationsFastModeDescription">Google-un bildiriş serverlərini istifadə edərək yeni mesajlardan dərhal və etibarlı şəkildə xəbərdar olacaqsınız.</string>
<string name="notificationsSlowModeDescription">Session, arada arxaplanda yeni mesajları yoxlayacaq.</string>
<string name="open"></string>
<string name="urlCopy">URL-ni kopyala</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Və ya bunlardan birinə qoşulun…</string>
<string name="notificationsFastMode">Sürətli rejim</string>
<string name="notificationsSlowMode">Yavaş rejim</string>
<string name="notificationsFastModeDescriptionAndroid">Google-un bildiriş serverlərini istifadə edərək yeni mesajlardan dərhal və etibarlı şəkildə xəbərdar olacaqsınız.</string>
<string name="notificationsFastModeDescription">Google-un bildiriş serverlərini istifadə edərək yeni mesajlardan dərhal və etibarlı şəkildə xəbərdar olacaqsınız.</string>
<string name="notificationsSlowModeDescription">Session, arada arxaplanda yeni mesajları yoxlayacaq.</string>
<string name="open"></string>
<string name="urlCopy">URL-ni kopyala</string>

View File

@ -188,6 +188,6 @@
<string name="communityJoinOfficial">O uneix-te a alguns d\'aquests…</string>
<string name="notificationsFastMode">Mode ràpid</string>
<string name="notificationsSlowMode">Mode lent</string>
<string name="notificationsFastModeDescriptionAndroid">Es notificaran els missatges de forma immediata i fiable fent servir els servidors de notificació de Google.</string>
<string name="notificationsFastModeDescription">Es notificaran els missatges de forma immediata i fiable fent servir els servidors de notificació de Google.</string>
<string name="notificationsSlowModeDescription">Session ocasionalment comprovarà en pla secundari si hi ha nous missatges.</string>
</resources>

View File

@ -188,6 +188,6 @@
<string name="communityJoinOfficial">O uneix-te a alguns d\'aquests…</string>
<string name="notificationsFastMode">Mode ràpid</string>
<string name="notificationsSlowMode">Mode lent</string>
<string name="notificationsFastModeDescriptionAndroid">Es notificaran els missatges de forma immediata i fiable fent servir els servidors de notificació de Google.</string>
<string name="notificationsFastModeDescription">Es notificaran els missatges de forma immediata i fiable fent servir els servidors de notificació de Google.</string>
<string name="notificationsSlowModeDescription">Session ocasionalment comprovarà en pla secundari si hi ha nous missatges.</string>
</resources>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Nebo se připojte k jedné z těchto…</string>
<string name="notificationsFastMode">Rychlý režim</string>
<string name="notificationsSlowMode">Pomalý režim</string>
<string name="notificationsFastModeDescriptionAndroid">Budete spolehlivě a okamžitě informováni o nových zprávách pomocí oznamovacích serverů Google.</string>
<string name="notificationsFastModeDescription">Budete spolehlivě a okamžitě informováni o nových zprávách pomocí oznamovacích serverů Google.</string>
<string name="notificationsSlowModeDescription">Session občas zkontroluje nové zprávy na pozadí.</string>
<string name="open">Otevřít</string>
<string name="urlCopy">Zkopírovat URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Nebo se připojte k jedné z těchto…</string>
<string name="notificationsFastMode">Rychlý režim</string>
<string name="notificationsSlowMode">Pomalý režim</string>
<string name="notificationsFastModeDescriptionAndroid">Budete spolehlivě a okamžitě informováni o nových zprávách pomocí oznamovacích serverů Google.</string>
<string name="notificationsFastModeDescription">Budete spolehlivě a okamžitě informováni o nových zprávách pomocí oznamovacích serverů Google.</string>
<string name="notificationsSlowModeDescription">Session občas zkontroluje nové zprávy na pozadí.</string>
<string name="open">Otevřít</string>
<string name="urlCopy">Zkopírovat URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Oder tritt diesen bei…</string>
<string name="notificationsFastMode">Schneller Modus</string>
<string name="notificationsSlowMode">Langsamer Modus</string>
<string name="notificationsFastModeDescriptionAndroid">Du wirst über neue Nachrichten zuverlässig und sofort über Google\'s Server benachrichtigt.</string>
<string name="notificationsFastModeDescription">Du wirst über neue Nachrichten zuverlässig und sofort über Google\'s Server benachrichtigt.</string>
<string name="notificationsSlowModeDescription">Session sucht gelegentlich nach neuen Nachrichten im Hintergrund.</string>
<string name="open">Öffnen</string>
<string name="urlCopy">Link kopieren</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Oder tritt diesen bei…</string>
<string name="notificationsFastMode">Schneller Modus</string>
<string name="notificationsSlowMode">Langsamer Modus</string>
<string name="notificationsFastModeDescriptionAndroid">Du wirst über neue Nachrichten zuverlässig und sofort über Google\'s Server benachrichtigt.</string>
<string name="notificationsFastModeDescription">Du wirst über neue Nachrichten zuverlässig und sofort über Google\'s Server benachrichtigt.</string>
<string name="notificationsSlowModeDescription">Session sucht gelegentlich nach neuen Nachrichten im Hintergrund.</string>
<string name="open">Öffnen</string>
<string name="urlCopy">Link kopieren</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Ή συνδεθείτε σε ένα από αυτά…</string>
<string name="notificationsFastMode">Γρήγορη Επιλογή</string>
<string name="notificationsSlowMode">Αργή Επιλογή</string>
<string name="notificationsFastModeDescriptionAndroid">Θα ειδοποιηθείτε για νέα μηνύματα αξιόπιστα και άμεσα χρησιμοποιώντας τους διακομιστές ειδοποιήσεων της Google.</string>
<string name="notificationsFastModeDescription">Θα ειδοποιηθείτε για νέα μηνύματα αξιόπιστα και άμεσα χρησιμοποιώντας τους διακομιστές ειδοποιήσεων της Google.</string>
<string name="notificationsSlowModeDescription">Το Session θα ελέγχει κατά καιρούς για νέα μηνύματα στο παρασκήνιο.</string>
<string name="open">Άνοιγμα</string>
<string name="urlCopy">Αντιγραφή URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Ή συνδεθείτε σε ένα από αυτά…</string>
<string name="notificationsFastMode">Γρήγορη Επιλογή</string>
<string name="notificationsSlowMode">Αργή Επιλογή</string>
<string name="notificationsFastModeDescriptionAndroid">Θα ειδοποιηθείτε για νέα μηνύματα αξιόπιστα και άμεσα χρησιμοποιώντας τους διακομιστές ειδοποιήσεων της Google.</string>
<string name="notificationsFastModeDescription">Θα ειδοποιηθείτε για νέα μηνύματα αξιόπιστα και άμεσα χρησιμοποιώντας τους διακομιστές ειδοποιήσεων της Google.</string>
<string name="notificationsSlowModeDescription">Το Session θα ελέγχει κατά καιρούς για νέα μηνύματα στο παρασκήνιο.</string>
<string name="open">Άνοιγμα</string>
<string name="urlCopy">Αντιγραφή URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">O únete a uno de estos…</string>
<string name="notificationsFastMode">Modo Rápido</string>
<string name="notificationsSlowMode">Modo Lento</string>
<string name="notificationsFastModeDescriptionAndroid">Se le notificará de los nuevos mensajes de forma fiable e inmediata usando los servidores de notificaciones de Google.</string>
<string name="notificationsFastModeDescription">Se le notificará de los nuevos mensajes de forma fiable e inmediata usando los servidores de notificaciones de Google.</string>
<string name="notificationsSlowModeDescription">Session comprobará ocasionalmente si hay nuevos mensajes en segundo plano.</string>
<string name="open">Abrir</string>
<string name="urlCopy">Copiar la dirección URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">O únete a uno de estos…</string>
<string name="notificationsFastMode">Modo Rápido</string>
<string name="notificationsSlowMode">Modo Lento</string>
<string name="notificationsFastModeDescriptionAndroid">Se le notificará de los nuevos mensajes de forma fiable e inmediata usando los servidores de notificaciones de Google.</string>
<string name="notificationsFastModeDescription">Se le notificará de los nuevos mensajes de forma fiable e inmediata usando los servidores de notificaciones de Google.</string>
<string name="notificationsSlowModeDescription">Session comprobará ocasionalmente si hay nuevos mensajes en segundo plano.</string>
<string name="open">Abrir</string>
<string name="urlCopy">Copiar la dirección URL</string>

View File

@ -193,7 +193,7 @@
<string name="messageVoice">پیام صوتی</string>
<string name="communityJoinOfficial">یا به یکی از این‌ها بپیوندید…</string>
<string name="notificationsFastMode">حالت سریع</string>
<string name="notificationsFastModeDescriptionAndroid">با استفاده از سرورهای گوگل، شما به صورت سریع و مطمئن از پیام‌های جدید مطلع می‌شوید.</string>
<string name="notificationsFastModeDescription">با استفاده از سرورهای گوگل، شما به صورت سریع و مطمئن از پیام‌های جدید مطلع می‌شوید.</string>
<string name="notificationsSlowModeDescription">Session هرازگاهی در پس زمینه وجود پیام‌های جدید را بررسی می‌کند.</string>
<string name="open">باز کردن</string>
<string name="urlCopy">کپی URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">یا به یکی از این‌ها بپیوندید…</string>
<string name="notificationsFastMode">حالت سریع</string>
<string name="notificationsSlowMode">حالت آهسته</string>
<string name="notificationsFastModeDescriptionAndroid">شما سریع و مطمئن با استفاده از سرور‌های اطلاع‌رسانی گوگل از پیام‌های جدید مطلع می‌شوید.</string>
<string name="notificationsFastModeDescription">شما سریع و مطمئن با استفاده از سرور‌های اطلاع‌رسانی گوگل از پیام‌های جدید مطلع می‌شوید.</string>
<string name="notificationsSlowModeDescription">نشست هرازگاهی در پس زمینه وجود پیام‌های جدید را بررسی می‌کند.</string>
<string name="open">باز کردن</string>
<string name="urlCopy">کپی URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Tai liity johonkin näistä…</string>
<string name="notificationsFastMode">Nopea tila</string>
<string name="notificationsSlowMode">Hidastila</string>
<string name="notificationsFastModeDescriptionAndroid">Sinulle ilmoitetaan uusista viesteistä luotettavasti ja viivyttelemättä Applen ilmoituspalvelua käyttäen.</string>
<string name="notificationsFastModeDescription">Sinulle ilmoitetaan uusista viesteistä luotettavasti ja viivyttelemättä Applen ilmoituspalvelua käyttäen.</string>
<string name="notificationsSlowModeDescription">Session tarkistaa taustalla ajoittain uudet viestit.</string>
<string name="open">Avaa</string>
<string name="urlCopy">Kopioi URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Tai liity johonkin näistä…</string>
<string name="notificationsFastMode">Nopea tila</string>
<string name="notificationsSlowMode">Hidastila</string>
<string name="notificationsFastModeDescriptionAndroid">Sinulle ilmoitetaan uusista viesteistä luotettavasti ja viivyttelemättä Applen ilmoituspalvelua käyttäen.</string>
<string name="notificationsFastModeDescription">Sinulle ilmoitetaan uusista viesteistä luotettavasti ja viivyttelemättä Applen ilmoituspalvelua käyttäen.</string>
<string name="notificationsSlowModeDescription">Session tarkistaa taustalla ajoittain uudet viestit.</string>
<string name="open">Avaa</string>
<string name="urlCopy">Kopioi URL</string>

View File

@ -202,7 +202,7 @@
<string name="communityJoinOfficial">Ou rejoignez l\'un(e) de ceux-ci…</string>
<string name="notificationsFastMode">Mode rapide</string>
<string name="notificationsSlowMode">Mode lent</string>
<string name="notificationsFastModeDescriptionAndroid">Vous serez averti de nouveaux messages de manière fiable et immédiate en utilisant les serveurs de notification de Google.</string>
<string name="notificationsFastModeDescription">Vous serez averti de nouveaux messages de manière fiable et immédiate en utilisant les serveurs de notification de Google.</string>
<string name="notificationsSlowModeDescription">Session vérifiera occasionnellement la présence de nouveaux messages en tâche de fond.</string>
<string name="open">Ouvrir</string>
<string name="urlCopy">Copier l\'adresse URL</string>

View File

@ -201,7 +201,7 @@
<string name="communityJoinOfficial">Ou rejoignez l\'un(e) de ceux-ci…</string>
<string name="notificationsFastMode">Mode rapide</string>
<string name="notificationsSlowMode">Mode lent</string>
<string name="notificationsFastModeDescriptionAndroid">Vous serez averti de nouveaux messages de manière fiable et immédiate en utilisant les serveurs de notification de Google.</string>
<string name="notificationsFastModeDescription">Vous serez averti de nouveaux messages de manière fiable et immédiate en utilisant les serveurs de notification de Google.</string>
<string name="notificationsSlowModeDescription">Session vérifiera occasionnellement la présence de nouveaux messages en tâche de fond.</string>
<string name="open">Ouvrir</string>
<string name="urlCopy">Copier l\'adresse URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">या इनमें से एक को जोड़ें...</string>
<string name="notificationsFastMode">फास्ट मोड</string>
<string name="notificationsSlowMode">स्लो मोड</string>
<string name="notificationsFastModeDescriptionAndroid">आपको नई सूचनाओं के बारे में google के नोटीफिकेशन servers से तत्काल सूचित किया जाएगा।</string>
<string name="notificationsFastModeDescription">आपको नई सूचनाओं के बारे में google के नोटीफिकेशन servers से तत्काल सूचित किया जाएगा।</string>
<string name="notificationsSlowModeDescription">Session कभी-कभी पृष्ठभूमि में नए संदेशों की जांच करेगा।</string>
<string name="open">खोलें</string>
<string name="urlCopy">यूआरएल कॉपी करें</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">या इनमें से एक को जोड़ें...</string>
<string name="notificationsFastMode">फास्ट मोड</string>
<string name="notificationsSlowMode">स्लो मोड</string>
<string name="notificationsFastModeDescriptionAndroid">आपको नई सूचनाओं के बारे में google के नोटीफिकेशन servers से तत्काल सूचित किया जाएगा।</string>
<string name="notificationsFastModeDescription">आपको नई सूचनाओं के बारे में google के नोटीफिकेशन servers से तत्काल सूचित किया जाएगा।</string>
<string name="notificationsSlowModeDescription">Session कभी-कभी पृष्ठभूमि में नए संदेशों की जांच करेगा।</string>
<string name="open">खोलें</string>
<string name="urlCopy">यूआरएल कॉपी करें</string>

View File

@ -194,7 +194,7 @@
<string name="communityJoinOfficial">Vagy csatlakozz ezekhez…</string>
<string name="notificationsFastMode">Gyorsított mód</string>
<string name="notificationsSlowMode">Lassított mód</string>
<string name="notificationsFastModeDescriptionAndroid">A Google értesítési szerverein keresztül megbízhatóan és azonnal értesítést kapsz az új üzenetekről.</string>
<string name="notificationsFastModeDescription">A Google értesítési szerverein keresztül megbízhatóan és azonnal értesítést kapsz az új üzenetekről.</string>
<string name="notificationsSlowModeDescription">A Session alkalmanként, az új üzeneteket a háttérben fogja ellenőrizni.</string>
<string name="open">Megnyit</string>
<string name="urlCopy">URL másolása</string>

View File

@ -194,7 +194,7 @@
<string name="communityJoinOfficial">Vagy csatlakozz ezekhez…</string>
<string name="notificationsFastMode">Gyorsított mód</string>
<string name="notificationsSlowMode">Lassított mód</string>
<string name="notificationsFastModeDescriptionAndroid">A Google értesítési szerverein keresztül megbízhatóan és azonnal értesítést kapsz az új üzenetekről.</string>
<string name="notificationsFastModeDescription">A Google értesítési szerverein keresztül megbízhatóan és azonnal értesítést kapsz az új üzenetekről.</string>
<string name="notificationsSlowModeDescription">A Session alkalmanként, az új üzeneteket a háttérben fogja ellenőrizni.</string>
<string name="open">Megnyit</string>
<string name="urlCopy">URL másolása</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Կամ միացե՛ք սրանցից մեկին…</string>
<string name="notificationsFastMode">Արագ ռեժիմ</string>
<string name="notificationsSlowMode">Դանդաղ ռեժիմ</string>
<string name="notificationsFastModeDescriptionAndroid">Դուք մշտապես և անմիջապես կտեղեկացվեք նոր հաղորդագրությունների մասին՝ օգտագործելով Google-ի ծանուցումների սերվերները:</string>
<string name="notificationsFastModeDescription">Դուք մշտապես և անմիջապես կտեղեկացվեք նոր հաղորդագրությունների մասին՝ օգտագործելով Google-ի ծանուցումների սերվերները:</string>
<string name="notificationsSlowModeDescription">Session-ը երբեմն, ֆոնային կստուգի նոր հաղորդագրությունների առկայությունը:</string>
<string name="open">Բացել</string>
<string name="urlCopy">Պատճենել հղումը</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Կամ միացե՛ք սրանցից մեկին…</string>
<string name="notificationsFastMode">Արագ ռեժիմ</string>
<string name="notificationsSlowMode">Դանդաղ ռեժիմ</string>
<string name="notificationsFastModeDescriptionAndroid">Դուք մշտապես և անմիջապես կտեղեկացվեք նոր հաղորդագրությունների մասին՝ օգտագործելով Google-ի ծանուցումների սերվերները:</string>
<string name="notificationsFastModeDescription">Դուք մշտապես և անմիջապես կտեղեկացվեք նոր հաղորդագրությունների մասին՝ օգտագործելով Google-ի ծանուցումների սերվերները:</string>
<string name="notificationsSlowModeDescription">Session-ը երբեմն, ֆոնային կստուգի նոր հաղորդագրությունների առկայությունը:</string>
<string name="open">Բացել</string>
<string name="urlCopy">Պատճենել հղումը</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Oppure unisciti a uno di questi…</string>
<string name="notificationsFastMode">Modalità Veloce</string>
<string name="notificationsSlowMode">Modalità Lenta</string>
<string name="notificationsFastModeDescriptionAndroid">Riceverai notifiche di nuovi messaggi in modo affidabile e immediato utilizzando i server di notifica di Google.</string>
<string name="notificationsFastModeDescription">Riceverai notifiche di nuovi messaggi in modo affidabile e immediato utilizzando i server di notifica di Google.</string>
<string name="notificationsSlowModeDescription">Session controllerà di tanto in tanto la presenza di nuovi messaggi in background.</string>
<string name="open">Apri</string>
<string name="urlCopy">Copia l\'URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Oppure unisciti a uno di questi…</string>
<string name="notificationsFastMode">Modalità Veloce</string>
<string name="notificationsSlowMode">Modalità Lenta</string>
<string name="notificationsFastModeDescriptionAndroid">Riceverai notifiche di nuovi messaggi in modo affidabile e immediato utilizzando i server di notifica di Google.</string>
<string name="notificationsFastModeDescription">Riceverai notifiche di nuovi messaggi in modo affidabile e immediato utilizzando i server di notifica di Google.</string>
<string name="notificationsSlowModeDescription">Session controllerà di tanto in tanto la presenza di nuovi messaggi in background.</string>
<string name="open">Apri</string>
<string name="urlCopy">Copia l\'URL</string>

View File

@ -187,7 +187,7 @@
<string name="communityJoinOfficial">Arba prisijunkite prie vienos iš šių…</string>
<string name="notificationsFastMode">Greita veiksena</string>
<string name="notificationsSlowMode">Lėta veiksena</string>
<string name="notificationsFastModeDescriptionAndroid">Jums bus nedelsiant ir patikimai pranešama apie naujas žinutes, naudojant „Google“ pranešimų serverius.</string>
<string name="notificationsFastModeDescription">Jums bus nedelsiant ir patikimai pranešama apie naujas žinutes, naudojant „Google“ pranešimų serverius.</string>
<string name="notificationsSlowModeDescription">Session programėlė retkarčiais fone tikrins, ar yra naujų žinučių.</string>
<string name="open">Atverti</string>
<string name="enable">Įjungti</string>

View File

@ -187,7 +187,7 @@
<string name="communityJoinOfficial">Arba prisijunkite prie vienos iš šių…</string>
<string name="notificationsFastMode">Greita veiksena</string>
<string name="notificationsSlowMode">Lėta veiksena</string>
<string name="notificationsFastModeDescriptionAndroid">Jums bus nedelsiant ir patikimai pranešama apie naujas žinutes, naudojant „Google“ pranešimų serverius.</string>
<string name="notificationsFastModeDescription">Jums bus nedelsiant ir patikimai pranešama apie naujas žinutes, naudojant „Google“ pranešimų serverius.</string>
<string name="notificationsSlowModeDescription">Session programėlė retkarčiais fone tikrins, ar yra naujų žinučių.</string>
<string name="open">Atverti</string>
<string name="enable">Įjungti</string>

View File

@ -123,7 +123,7 @@
<string name="messageVoice">Balss ziņojums</string>
<string name="notificationsFastMode">Ātrais režīms</string>
<string name="notificationsSlowMode">Lēnais režīms</string>
<string name="notificationsFastModeDescriptionAndroid">Jūs saņemsiet paziņojumus par jauniem ziņojumiem droši un nekavējoties, izmantojot Google paziņojumu serverus.</string>
<string name="notificationsFastModeDescription">Jūs saņemsiet paziņojumus par jauniem ziņojumiem droši un nekavējoties, izmantojot Google paziņojumu serverus.</string>
<string name="notificationsSlowModeDescription">Session laiku pa laikam fonā pārbaudīs, vai nav jaunu ziņojumu.</string>
<string name="open">Atvērt</string>
<string name="urlCopy">Nokopēt URL</string>

View File

@ -123,7 +123,7 @@
<string name="messageVoice">Balss ziņojums</string>
<string name="notificationsFastMode">Ātrais režīms</string>
<string name="notificationsSlowMode">Lēnais režīms</string>
<string name="notificationsFastModeDescriptionAndroid">Jūs saņemsiet paziņojumus par jauniem ziņojumiem droši un nekavējoties, izmantojot Google paziņojumu serverus.</string>
<string name="notificationsFastModeDescription">Jūs saņemsiet paziņojumus par jauniem ziņojumiem droši un nekavējoties, izmantojot Google paziņojumu serverus.</string>
<string name="notificationsSlowModeDescription">Session laiku pa laikam fonā pārbaudīs, vai nav jaunu ziņojumu.</string>
<string name="open">Atvērt</string>
<string name="urlCopy">Nokopēt URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Eller bli med i en av disse…</string>
<string name="notificationsFastMode">Rask modus</string>
<string name="notificationsSlowMode">Langsom Modus</string>
<string name="notificationsFastModeDescriptionAndroid">Du vil bli varslet om nye meldinger på en pålitelig måte, og umiddelbart ved hjelp av Googles varslingsservere.</string>
<string name="notificationsFastModeDescription">Du vil bli varslet om nye meldinger på en pålitelig måte, og umiddelbart ved hjelp av Googles varslingsservere.</string>
<string name="notificationsSlowModeDescription">Session vil av og til sjekke nye meldinger i bakgrunnen.</string>
<string name="open">Åpne</string>
<string name="urlCopy">Kopier URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Eller bli med i en av disse…</string>
<string name="notificationsFastMode">Rask modus</string>
<string name="notificationsSlowMode">Langsom Modus</string>
<string name="notificationsFastModeDescriptionAndroid">Du vil bli varslet om nye meldinger på en pålitelig måte, og umiddelbart ved hjelp av Googles varslingsservere.</string>
<string name="notificationsFastModeDescription">Du vil bli varslet om nye meldinger på en pålitelig måte, og umiddelbart ved hjelp av Googles varslingsservere.</string>
<string name="notificationsSlowModeDescription">Session vil av og til sjekke nye meldinger i bakgrunnen.</string>
<string name="open">Åpne</string>
<string name="urlCopy">Kopier URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Of neem deel aan een van deze...</string>
<string name="notificationsFastMode">Snelle modus</string>
<string name="notificationsSlowMode">Langzame modus</string>
<string name="notificationsFastModeDescriptionAndroid">U wordt op een betrouwbare en directe manier op de hoogte gebracht van nieuwe berichten via Googles notificatieservers.</string>
<string name="notificationsFastModeDescription">U wordt op een betrouwbare en directe manier op de hoogte gebracht van nieuwe berichten via Googles notificatieservers.</string>
<string name="notificationsSlowModeDescription">Sessie controleert af en toe op nieuwe berichten op de achtergrond.</string>
<string name="open">Open</string>
<string name="urlCopy">Kopieer URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Of neem deel aan een van deze...</string>
<string name="notificationsFastMode">Snelle modus</string>
<string name="notificationsSlowMode">Langzame modus</string>
<string name="notificationsFastModeDescriptionAndroid">U wordt op een betrouwbare en directe manier op de hoogte gebracht van nieuwe berichten via Googles notificatieservers.</string>
<string name="notificationsFastModeDescription">U wordt op een betrouwbare en directe manier op de hoogte gebracht van nieuwe berichten via Googles notificatieservers.</string>
<string name="notificationsSlowModeDescription">Sessie controleert af en toe op nieuwe berichten op de achtergrond.</string>
<string name="open">Open</string>
<string name="urlCopy">Kopieer URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Lub dołącz do jednego z tych…</string>
<string name="notificationsFastMode">Tryb szybki</string>
<string name="notificationsSlowMode">Tryb wolny</string>
<string name="notificationsFastModeDescriptionAndroid">Zostaniesz natychmiast powiadomiony o nowych wiadomościach w niezawodny sposób przy użyciu serwerów powiadomień Google.</string>
<string name="notificationsFastModeDescription">Zostaniesz natychmiast powiadomiony o nowych wiadomościach w niezawodny sposób przy użyciu serwerów powiadomień Google.</string>
<string name="notificationsSlowModeDescription">Session będzie czasami sprawdzać w tle czy są nowe wiadomości.</string>
<string name="open">Otwórz</string>
<string name="urlCopy">Skopiuj URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Lub dołącz do jednego z tych…</string>
<string name="notificationsFastMode">Tryb szybki</string>
<string name="notificationsSlowMode">Tryb wolny</string>
<string name="notificationsFastModeDescriptionAndroid">Zostaniesz natychmiast powiadomiony o nowych wiadomościach w niezawodny sposób przy użyciu serwerów powiadomień Google.</string>
<string name="notificationsFastModeDescription">Zostaniesz natychmiast powiadomiony o nowych wiadomościach w niezawodny sposób przy użyciu serwerów powiadomień Google.</string>
<string name="notificationsSlowModeDescription">Session będzie czasami sprawdzać w tle czy są nowe wiadomości.</string>
<string name="open">Otwórz</string>
<string name="urlCopy">Skopiuj URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Ou junte-se a um desses…</string>
<string name="notificationsFastMode">Modo Rápido</string>
<string name="notificationsSlowMode">Modo Lento</string>
<string name="notificationsFastModeDescriptionAndroid">Você será notificado de forma confiável e imediata sobre novas mensagens usando os servidores de notificação da Google.</string>
<string name="notificationsFastModeDescription">Você será notificado de forma confiável e imediata sobre novas mensagens usando os servidores de notificação da Google.</string>
<string name="notificationsSlowModeDescription">O session verificará ocasionalmente por novas mensagens em segundo plano.</string>
<string name="open">Abrir</string>
<string name="urlCopy">Copiar URLs</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Ou junte-se a um desses…</string>
<string name="notificationsFastMode">Modo Rápido</string>
<string name="notificationsSlowMode">Modo Lento</string>
<string name="notificationsFastModeDescriptionAndroid">Você será notificado de forma confiável e imediata sobre novas mensagens usando os servidores de notificação da Google.</string>
<string name="notificationsFastModeDescription">Você será notificado de forma confiável e imediata sobre novas mensagens usando os servidores de notificação da Google.</string>
<string name="notificationsSlowModeDescription">O session verificará ocasionalmente por novas mensagens em segundo plano.</string>
<string name="open">Abrir</string>
<string name="urlCopy">Copiar URLs</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Или присоединитесь к одной из этих…</string>
<string name="notificationsFastMode">Ускоренный режим</string>
<string name="notificationsSlowMode">Медленный режим</string>
<string name="notificationsFastModeDescriptionAndroid">Вы будете получать уведомления о новых сообщениях надежно и сразу же с помощью серверов уведомлений Google.</string>
<string name="notificationsFastModeDescription">Вы будете получать уведомления о новых сообщениях надежно и сразу же с помощью серверов уведомлений Google.</string>
<string name="notificationsSlowModeDescription">Session время от времени в фоновом режиме будeт проверять и получать новые сообщения.</string>
<string name="open">Открыть</string>
<string name="urlCopy">Копировать ссылку</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Или присоединитесь к одной из этих…</string>
<string name="notificationsFastMode">Ускоренный режим</string>
<string name="notificationsSlowMode">Медленный режим</string>
<string name="notificationsFastModeDescriptionAndroid">Вы будете получать уведомления о новых сообщениях надежно и сразу же с помощью серверов уведомлений Google.</string>
<string name="notificationsFastModeDescription">Вы будете получать уведомления о новых сообщениях надежно и сразу же с помощью серверов уведомлений Google.</string>
<string name="notificationsSlowModeDescription">Session время от времени в фоновом режиме будeт проверять и получать новые сообщения.</string>
<string name="open">Открыть</string>
<string name="urlCopy">Копировать ссылку</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Eller gå med i en av dessa…</string>
<string name="notificationsFastMode">Snabbläge</string>
<string name="notificationsSlowMode">Långsamt läge</string>
<string name="notificationsFastModeDescriptionAndroid">Du kommer att meddelas om nya meddelanden på ett tillförlitligt sätt och omedelbart genom att använda Googles aviseringsservrar.</string>
<string name="notificationsFastModeDescription">Du kommer att meddelas om nya meddelanden på ett tillförlitligt sätt och omedelbart genom att använda Googles aviseringsservrar.</string>
<string name="notificationsSlowModeDescription">Session kommer då och då att leta efter nya meddelanden i bakgrunden.</string>
<string name="open">Öppna</string>
<string name="urlCopy">&amp;Kopiera webbadress</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Eller gå med i en av dessa…</string>
<string name="notificationsFastMode">Snabbläge</string>
<string name="notificationsSlowMode">Långsamt läge</string>
<string name="notificationsFastModeDescriptionAndroid">Du kommer att meddelas om nya meddelanden på ett tillförlitligt sätt och omedelbart genom att använda Googles aviseringsservrar.</string>
<string name="notificationsFastModeDescription">Du kommer att meddelas om nya meddelanden på ett tillförlitligt sätt och omedelbart genom att använda Googles aviseringsservrar.</string>
<string name="notificationsSlowModeDescription">Session kommer då och då att leta efter nya meddelanden i bakgrunden.</string>
<string name="open">Öppna</string>
<string name="urlCopy">&amp;Kopiera webbadress</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Veya bunlardan birine katılın…</string>
<string name="notificationsFastMode">Hızlı Mod</string>
<string name="notificationsSlowMode">Yavaş Mod</string>
<string name="notificationsFastModeDescriptionAndroid">Google\'ın bildirim sunucularını kullanarak yeni iletilerden güvenilir ve anında haberdar olacaksınız.</string>
<string name="notificationsFastModeDescription">Google\'ın bildirim sunucularını kullanarak yeni iletilerden güvenilir ve anında haberdar olacaksınız.</string>
<string name="notificationsSlowModeDescription">Session ara sıra arka planda yeni mesajları kontrol eder.</string>
<string name="open"></string>
<string name="urlCopy">Bağlantıyı kopyala</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">Veya bunlardan birine katılın…</string>
<string name="notificationsFastMode">Hızlı Mod</string>
<string name="notificationsSlowMode">Yavaş Mod</string>
<string name="notificationsFastModeDescriptionAndroid">Google\'ın bildirim sunucularını kullanarak yeni iletilerden güvenilir ve anında haberdar olacaksınız.</string>
<string name="notificationsFastModeDescription">Google\'ın bildirim sunucularını kullanarak yeni iletilerden güvenilir ve anında haberdar olacaksınız.</string>
<string name="notificationsSlowModeDescription">Session ara sıra arka planda yeni mesajları kontrol eder.</string>
<string name="open"></string>
<string name="urlCopy">Bağlantıyı kopyala</string>

View File

@ -194,7 +194,7 @@
<string name="communityJoinOfficial">Або приєднуйтесь до одного з цих…</string>
<string name="notificationsFastMode">Швидкий режим</string>
<string name="notificationsSlowMode">Медленний режим</string>
<string name="notificationsFastModeDescriptionAndroid">Вас надійно повідомлятимуть про нові сповіщщеня негайно, використовуючи сервери сповіщень Google.</string>
<string name="notificationsFastModeDescription">Вас надійно повідомлятимуть про нові сповіщщеня негайно, використовуючи сервери сповіщень Google.</string>
<string name="notificationsSlowModeDescription">Session буде періодично перевіряти наявність нових повідомлень у фоновому режимі.</string>
<string name="open">Відкрити</string>
<string name="urlCopy">Копіювати URL</string>

View File

@ -194,7 +194,7 @@
<string name="communityJoinOfficial">Або приєднуйтесь до одного з цих…</string>
<string name="notificationsFastMode">Швидкий режим</string>
<string name="notificationsSlowMode">Медленний режим</string>
<string name="notificationsFastModeDescriptionAndroid">Вас надійно повідомлятимуть про нові сповіщщеня негайно, використовуючи сервери сповіщень Google.</string>
<string name="notificationsFastModeDescription">Вас надійно повідомлятимуть про нові сповіщщеня негайно, використовуючи сервери сповіщень Google.</string>
<string name="notificationsSlowModeDescription">Session буде періодично перевіряти наявність нових повідомлень у фоновому режимі.</string>
<string name="open">Відкрити</string>
<string name="urlCopy">Копіювати URL</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">或加入下列群组…</string>
<string name="notificationsFastMode">快速模式</string>
<string name="notificationsSlowMode">慢速模式</string>
<string name="notificationsFastModeDescriptionAndroid">新消息将通过 Google 通知服务器即时可靠地发送</string>
<string name="notificationsFastModeDescription">新消息将通过 Google 通知服务器即时可靠地发送</string>
<string name="notificationsSlowModeDescription">Session 将不时在后台获取新消息</string>
<string name="open">打开</string>
<string name="urlCopy">复制链接</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">或加入這些群組⋯</string>
<string name="notificationsFastMode">快速模式</string>
<string name="notificationsSlowMode">慢速模式</string>
<string name="notificationsFastModeDescriptionAndroid">您將會透過 Google 的通知服務可靠且迅速的收到通知。</string>
<string name="notificationsFastModeDescription">您將會透過 Google 的通知服務可靠且迅速的收到通知。</string>
<string name="notificationsSlowModeDescription">Session 會偶爾在背景執行時檢查新訊息。</string>
<string name="open">開啟</string>
<string name="urlCopy">複製網址</string>

View File

@ -193,7 +193,7 @@
<string name="communityJoinOfficial">或加入下列群组…</string>
<string name="notificationsFastMode">快速模式</string>
<string name="notificationsSlowMode">慢速模式</string>
<string name="notificationsFastModeDescriptionAndroid">新消息将通过 Google 通知服务器即时可靠地发送。</string>
<string name="notificationsFastModeDescription">新消息将通过 Google 通知服务器即时可靠地发送。</string>
<string name="notificationsSlowModeDescription">Session 将不时在后台获取新消息。</string>
<string name="open">打开</string>
<string name="urlCopy">复制链接</string>

View File

@ -1,748 +1,13 @@
<?xml version="1.0" encoding="utf-8"?>
<!--
NOTE: The massive block of commented out strings below are the OG strings project strings - these
have been replaced with a CrowdIn export (hundreds of lines below) - but I'm leaving these in just
in case for the time being while we bed things in. -AL 2024-08-22
-->
<!--<resources>-->
<!-- &lt;!&ndash; Plurals sections &ndash;&gt;-->
<!-- <plurals name="members">-->
<!-- <item quantity="one">%1$d member</item>-->
<!-- <item quantity="other">%1$d members</item>-->
<!-- </plurals>-->
<!-- <plurals name="membersActive">-->
<!-- <item quantity="one">%1$d active member</item>-->
<!-- <item quantity="other">%1$d active members</item>-->
<!-- </plurals>-->
<!-- <plurals name="searchMatches">-->
<!-- <item quantity="one">%1$d of %2$d match</item>-->
<!-- <item quantity="other">%1$d of %2$d matches</item>-->
<!-- </plurals>-->
<!-- <plurals name="messageNewYouveGot">-->
<!-- <item quantity="one">You\'ve got a new message.</item>-->
<!-- <item quantity="other">You\'ve got %1$d new messages.</item>-->
<!-- </plurals>-->
<!-- <plurals name="emojiReactsCountOthers">-->
<!-- <item quantity="one">And %1$d other has reacted %2$s to this message.</item>-->
<!-- <item quantity="other">And %1$d others have reacted %2$s to this message.</item>-->
<!-- </plurals>-->
<!-- &lt;!&ndash; Note: Currently unused and no 'old' string for this as of 2024/08/19 &ndash;&gt;-->
<!-- <plurals name="deleteMessagesFailed">-->
<!-- <item quantity="one">Failed to delete message</item>-->
<!-- <item quantity="other">Failed to delete messages</item>-->
<!-- </plurals>-->
<!-- &lt;!&ndash; Note: Currently unused and no 'old' string for this as of 2024/08/19 &ndash;&gt;-->
<!-- <plurals name="clearDataErrorDescription">-->
<!-- <item quantity="one">Data not deleted by %1$d Service Node. Service Node ID: %2$s.</item>-->
<!-- <item quantity="other">Data not deleted by %1$d Service Nodes. Service Node IDs: %2$s.</item>-->
<!-- </plurals>-->
<!-- &lt;!&ndash;-->
<!-- Need a plural for searches I guess - see: https://discord.com/channels/408081923835953153/1274899391207047269-->
<!-- OLD-->
<!-- • One: {count} of {total_count} match-->
<!-- • Other: {count} of {total_count} matches-->
<!-- NEW-->
<!-- • One: {found_count} of {count} match-->
<!-- • Other: {found_count} of {count} matches-->
<!-- &ndash;&gt;-->
<!-- &lt;!&ndash; ========== STRAGGLERS SECTION ========== &ndash;&gt;-->
<!-- &lt;!&ndash; USED as title on media picker when you go to send an image - this can be either to a specific-->
<!-- Button on the `Set Display Picture` dialog used to instigate choosing a profile picture to set,-->
<!-- sending to a single person, to a closed group, or to a community (in the latter two cases it-->
<!-- will show the group name).-->
<!-- Figma: Unable to locate usage in Figma.-->
<!-- Morgan 2024/07/31: "Added to Crowdin as `attachmentsSendTo` (not yet exported)" - leaving for now until I know the exact string substitution key -AL 2024/08/02-->
<!-- &ndash;&gt;-->
<!-- <string name="MediaPickerActivity_send_to">Send to %s</string>-->
<!-- &lt;!&ndash; ========== END OF STRAGGLERS SECTION ========== &ndash;&gt;-->
<!-- &lt;!&ndash; Strings with modern names and {braced} substitution markers &ndash;&gt;-->
<!-- <string name="about">About</string>-->
<!-- <string name="accept">Accept</string>-->
<!-- <string name="accountIdCopy">Copy Account ID</string>-->
<!-- <string name="accountIdEnter">Enter Account ID</string>-->
<!-- <string name="accountIdErrorInvalid">This Account ID is invalid. Please check and try again.</string>-->
<!-- <string name="accountIdOrOnsEnter">Enter Account ID or ONS</string>-->
<!-- <string name="accountIdOrOnsInvite">Invite Account ID or ONS</string>-->
<!-- <string name="accountIdShare">Hey, I\'ve been using {app_name} to chat with complete privacy and security. Come join me!\n\nMy Account ID is\n{account_id}\n\nDownload it at\n{download_url}</string>-->
<!-- <string name="accountIdYours">Your Account ID</string>-->
<!-- <string name="accountIdYoursDescription">This is your Account ID. Other users can scan it to start a conversation with you.</string>-->
<!-- <string name="actualSize">Actual Size</string>-->
<!-- <string name="add">Add</string>-->
<!-- <string name="adminCannotBeRemoved">Admins cannot be removed.</string>-->
<!-- <string name="adminMorePromotedToAdmin"><b>{name}</b> and <b>{count} others</b> were promoted to Admin.</string>-->
<!-- <string name="adminPromote">Promote Admins</string>-->
<!-- <string name="adminPromoteDescription">Are you sure you want to promote <b>{name}</b> to admin? Admins cannot be removed.</string>-->
<!-- <string name="adminPromoteMoreDescription">Are you sure you want to promote <b>{name}</b> and <b>{count} others</b> to admin? Admins cannot be removed.</string>-->
<!-- <string name="adminPromoteToAdmin">Promote to Admin</string>-->
<!-- <string name="adminPromoteTwoDescription">Are you sure you want to promote <b>{name}</b> and <b>{other_name}</b> to admin? Admins cannot be removed.</string>-->
<!-- <string name="adminPromotedToAdmin"><b>{name}</b> was promoted to Admin.</string>-->
<!-- <string name="adminPromotionFailed">Admin promotion failed</string>-->
<!-- <string name="adminPromotionFailedDescription">Failed to promote {name} in {group_name}</string>-->
<!-- <string name="adminPromotionFailedDescriptionMany">Failed to promote {name} and {count} others in {group_name}</string>-->
<!-- <string name="adminPromotionFailedDescriptionMore">Failed to promote {name} and {other_name} in {group_name}</string>-->
<!-- <string name="adminPromotionSent">Admin promotion sent</string>-->
<!-- <string name="adminRemove">Remove Admins</string>-->
<!-- <string name="adminRemoveAsAdmin">Remove as Admin</string>-->
<!-- <string name="adminRemoveCommunityNone">There are no Admins in this Community.</string>-->
<!-- <string name="adminRemoveFailed">Failed to remove {name} as Admin.</string>-->
<!-- <string name="adminSendingPromotion">Sending admin promotion</string>-->
<!-- <string name="adminSettings">Admin Settings</string>-->
<!-- <string name="adminTwoPromotedToAdmin"><b>{name}</b> and <b>{other_name}</b> were promoted to Admin.</string>-->
<!-- <string name="andMore">+{count}</string>-->
<!-- <string name="anonymous">Anonymous</string>-->
<!-- <string name="app_name" translatable="false">Session</string>-->
<!-- <string name="appearanceAutoDarkMode">Auto dark-mode</string>-->
<!-- <string name="appearanceHideMenuBar">Hide Menu Bar</string>-->
<!-- <string name="appearancePreview1">How are you?</string>-->
<!-- <string name="appearancePreview2">I\'m good thanks, you?</string>-->
<!-- <string name="appearancePreview3">I\'m doing great, thanks.</string>-->
<!-- <string name="appearancePrimaryColor">Primary Color</string>-->
<!-- <string name="appearanceThemes">Themes</string>-->
<!-- <string name="appearanceThemesClassicDark">Classic Dark</string>-->
<!-- <string name="appearanceThemesClassicLight">Classic Light</string>-->
<!-- <string name="appearanceThemesOceanDark">Ocean Dark</string>-->
<!-- <string name="appearanceThemesOceanLight">Ocean Light</string>-->
<!-- <string name="appearanceZoom">Zoom</string>-->
<!-- <string name="attachment">Attachment</string>-->
<!-- <string name="attachmentsAdd">Add attachment</string>-->
<!-- <string name="attachmentsAlbumUnnamed">Unnamed Album</string>-->
<!-- <string name="attachmentsAutoDownload">Auto-download Attachments</string>-->
<!-- <string name="attachmentsAutoDownloadDescription">Automatically download media and files from this chat.</string>-->
<!-- <string name="attachmentsAutoDownloadModalDescription">Would you like to automatically download all files from <b>{conversation_name}</b>?</string>-->
<!-- <string name="attachmentsAutoDownloadModalTitle">Auto Download</string>-->
<!-- <string name="attachmentsClearAll">Clear All Attachments</string>-->
<!-- <string name="attachmentsClearAllDescription">Are you sure you want to clear all attachments? Messages with attachments will also be deleted.</string>-->
<!-- <string name="attachmentsCollapseOptions">Collapse attachment options</string>-->
<!-- <string name="attachmentsCollecting">Collecting attachments...</string>-->
<!-- <string name="attachmentsDownload">Download Attachment</string>-->
<!-- <string name="attachmentsDuration">Duration:</string>-->
<!-- <string name="attachmentsErrorLoad">Error attaching file</string>-->
<!-- <string name="attachmentsErrorNoApp">Can\'t find an app to select media.</string>-->
<!-- <string name="attachmentsErrorNotSupported">This file type is not supported.</string>-->
<!-- <string name="attachmentsErrorNumber">Unable to send more than 32 image and video files at once.</string>-->
<!-- <string name="attachmentsErrorOpen">Unable to open file.</string>-->
<!-- <string name="attachmentsErrorSending">Error sending file</string>-->
<!-- <string name="attachmentsErrorSeparate">Please send files as separate messages.</string>-->
<!-- <string name="attachmentsErrorSize">Files must be less than 10MB</string>-->
<!-- <string name="attachmentsErrorTypes">Cannot attach images and video with other file types. Try sending other files in a separate message.</string>-->
<!-- <string name="attachmentsExpired">Attachment expired</string>-->
<!-- <string name="attachmentsFileId">File ID:</string>-->
<!-- <string name="attachmentsFileSize">File Size:</string>-->
<!-- <string name="attachmentsFileType">File Type:</string>-->
<!-- <string name="attachmentsFilesEmpty">You don\'t have any files in this conversation.</string>-->
<!-- <string name="attachmentsImageErrorMetadata">Unable to remove metadata from file.</string>-->
<!-- <string name="attachmentsMediaEmpty">You don\'t have any media in this conversation.</string>-->
<!-- <string name="attachmentsMediaSaved">Media saved by {name}</string>-->
<!-- <string name="attachmentsNotification">{emoji} Attachment</string>-->
<!-- <string name="attachmentsResolution">Resolution:</string>-->
<!-- <string name="attachmentsSaveError">Unable to save file.</string>-->
<!-- <string name="attachmentsTapToDownload">Tap to download {file_type}</string>-->
<!-- <string name="attachmentsThisMonth">This Month</string>-->
<!-- <string name="attachmentsThisWeek">This Week</string>-->
<!-- <string name="attachmentsWarning">Attachments you save can be accessed by other apps on your device.</string>-->
<!-- <string name="audio">Audio</string>-->
<!-- <string name="audioNoInput">No audio input found</string>-->
<!-- <string name="audioNoOutput">No audio output found</string>-->
<!-- <string name="audioUnableToPlay">Unable to play audio file.</string>-->
<!-- <string name="audioUnableToRecord">Unable to record audio.</string>-->
<!-- <string name="authenticateFailed">Authentication Failed</string>-->
<!-- <string name="authenticateFailedTooManyAttempts">Too many failed authentication attempts. Please try again later.</string>-->
<!-- <string name="authenticateNotAccessed">Authentication could not be accessed.</string>-->
<!-- <string name="authenticateToOpen">Authenticate to open {app_name}.</string>-->
<!-- <string name="back">Back</string>-->
<!-- <string name="banDeleteAll">Ban and Delete All</string>-->
<!-- <string name="banErrorFailed">Ban failed</string>-->
<!-- <string name="banUnbanErrorFailed">Unban failed</string>-->
<!-- <string name="banUnbanUser">Unban User</string>-->
<!-- <string name="banUser">Ban User</string>-->
<!-- <string name="banUserBanned">User banned</string>-->
<!-- <string name="block">Block</string>-->
<!-- <string name="blockBlockedDescription">Unblock this contact to send a message.</string>-->
<!-- <string name="blockBlockedNone">No blocked contacts</string>-->
<!-- <string name="blockBlockedUser">Blocked {name}</string>-->
<!-- <string name="blockDescription">Are you sure you want to block <b>{name}</b>? Blocked users cannot send you message requests, group invites or call you.</string>-->
<!-- <string name="blockUnblock">Unblock</string>-->
<!-- <string name="blockUnblockName">Are you sure you want to unblock {name}?</string>-->
<!-- <string name="blockUnblockNameMultiple">Are you sure you want to unblock {name} and {count} others?</string>-->
<!-- <string name="blockUnblockNameTwo">Are you sure you want to unblock {name} and 1 other?</string>-->
<!-- <string name="blockUnblockedUser">Unblocked {name}</string>-->
<!-- <string name="call">Call</string>-->
<!-- <string name="callsCalledYou">{name} called you</string>-->
<!-- <string name="callsCannotStart">You cannot start a new call. Finish your current call first.</string>-->
<!-- <string name="callsConnecting">Connecting...</string>-->
<!-- <string name="callsEnd">End call</string>-->
<!-- <string name="callsErrorAnswer">Failed to answer call</string>-->
<!-- <string name="callsErrorStart">Failed to start call</string>-->
<!-- <string name="callsInProgress">Call in progress</string>-->
<!-- <string name="callsIncoming">Incoming call from {name}</string>-->
<!-- <string name="callsMissed">Missed Call</string>-->
<!-- <string name="callsMissedCallFrom">Missed call from {name}</string>-->
<!-- <string name="callsNotificationsRequired">Voice and Video Calls require notifications to be enabled in your device system settings. </string>-->
<!-- <string name="callsPermissionsRequired">Call Permissions Required</string>-->
<!-- <string name="callsPermissionsRequiredDescription">You can enable the \"Voice and Video Calls\" permission in Privacy Settings.</string>-->
<!-- <string name="callsReconnecting">Reconnecting…</string>-->
<!-- <string name="callsRinging">Ringing...</string>-->
<!-- <string name="callsSessionCall">{app_name} Call</string>-->
<!-- <string name="callsSettings">Calls (Beta)</string>-->
<!-- <string name="callsVoiceAndVideo">Voice and Video Calls</string>-->
<!-- <string name="callsVoiceAndVideoBeta">Voice and Video Calls (Beta)</string>-->
<!-- <string name="callsVoiceAndVideoModalDescription">Your IP is visible to your call partner and an Oxen Foundation server while using beta calls.</string>-->
<!-- <string name="callsVoiceAndVideoToggleDescription">Enables voice and video calls to and from other users</string>-->
<!-- <string name="callsYouCalled">You called {name}</string>-->
<!-- <string name="callsYouMissedCallPermissions">You missed a call from <b>{name}</b> because you haven\'t enabled <b>Voice and Video Calls</b> in Privacy Settings.</string>-->
<!-- <string name="cameraErrorNotFound">No camera found</string>-->
<!-- <string name="cameraErrorUnavailable">Camera unavailable.</string>-->
<!-- <string name="cameraGrantAccess">Grant Camera Access</string>-->
<!-- <string name="cameraGrantAccessDenied">{app_name} needs camera access to take photos and videos, but it has been permanently denied. Please continue to app settings, select \"Permissions\", and enable \"Camera\".</string>-->
<!-- <string name="cameraGrantAccessDescription">{app_name} needs camera access to take photos and videos, or scan QR codes.</string>-->
<!-- <string name="cameraGrantAccessQr">{app_name} needs camera access to scan QR codes</string>-->
<!-- <string name="cancel">Cancel</string>-->
<!-- <string name="clear">Clear</string>-->
<!-- <string name="clearAll">Clear All</string>-->
<!-- <string name="clearDataAll">Clear All Data</string>-->
<!-- <string name="clearDataAllDescription">This will permanently delete your messages and contacts. Would you like to clear this device only, or delete your data from the network as well?</string>-->
<!-- <string name="clearDataError">Data Not Deleted</string>-->
<!-- <string name="clearDataErrorDescriptionGeneric">An unknown error occurred and your data was not deleted. Do you want to delete your data from just this device instead?</string>-->
<!-- <string name="clearDevice">Clear Device</string>-->
<!-- <string name="clearDeviceAndNetwork">Clear device and network</string>-->
<!-- <string name="clearDeviceAndNetworkConfirm">Are you sure you want to delete your data from the network? If you continue, you will not be able to restore your messages or contacts.</string>-->
<!-- <string name="clearDeviceDescription">Are you sure you want to clear your device?</string>-->
<!-- <string name="clearDeviceOnly">Clear device only</string>-->
<!-- <string name="clearMessages">Clear All Messages</string>-->
<!-- <string name="clearMessagesChatDescription">Are you sure you want to clear all messages from your conversation with <b>{name}</b> from your device?</string>-->
<!-- <string name="clearMessagesCommunity">Are you sure you want to clear all <b>{community_name}</b> messages from your device?</string>-->
<!-- <string name="clearMessagesForEveryone">Clear for everyone</string>-->
<!-- <string name="clearMessagesForMe">Clear for me</string>-->
<!-- <string name="clearMessagesGroupAdminDescription">Are you sure you want to clear all <b>{group_name}</b> messages?</string>-->
<!-- <string name="clearMessagesGroupDescription">Are you sure you want to clear all <b>{group_name}</b> messages from your device?</string>-->
<!-- <string name="clearMessagesNoteToSelfDescription">Are you sure you want to clear all Note to Self messages from your device?</string>-->
<!-- <string name="close">Close</string>-->
<!-- <string name="communityEnterUrl">Enter Community URL</string>-->
<!-- <string name="communityEnterUrlErrorInvalid">Invalid URL</string>-->
<!-- <string name="communityEnterUrlErrorInvalidDescription">Please check the Community URL and try again.</string>-->
<!-- <string name="communityError">Community Error</string>-->
<!-- <string name="communityErrorDescription">Oops, an error occurred. Please try again later.</string>-->
<!-- <string name="communityInvitation">Community Invitation</string>-->
<!-- <string name="communityJoin">Join Community</string>-->
<!-- <string name="communityJoinDescription">Are you sure you want to join {community_name}?</string>-->
<!-- <string name="communityJoinError">Failed to join {community_name}</string>-->
<!-- <string name="communityJoinOfficial">Or join one of these...</string>-->
<!-- <string name="communityJoined">Joined Community</string>-->
<!-- <string name="communityJoinedAlready">You are already a member of this community.</string>-->
<!-- <string name="communityLeave">Leave Community</string>-->
<!-- <string name="communityLeaveError">Failed to leave {community_name}</string>-->
<!-- <string name="communityUnknown">Unknown Community</string>-->
<!-- <string name="communityUrl">Community URL</string>-->
<!-- <string name="communityUrlCopy">Copy Community URL</string>-->
<!-- <string name="confirm">Confirm</string>-->
<!-- <string name="contactContacts">Contacts</string>-->
<!-- <string name="contactDelete">Delete Contact</string>-->
<!-- <string name="contactDeleteDescription">Are you sure you want to delete <b>{name}</b> from your contacts? New messages from <b>{name}</b> will arrive as a message request.</string>-->
<!-- <string name="contactNone">You don\'t have any contacts yet</string>-->
<!-- <string name="contactSelect">Select Contacts</string>-->
<!-- <string name="contactUserDetails">User Details</string>-->
<!-- <string name="conversationsAddToHome">Add to home screen</string>-->
<!-- <string name="conversationsAddedToHome">Added to home screen</string>-->
<!-- <string name="conversationsAudioMessages">Audio Messages</string>-->
<!-- <string name="conversationsAutoplayAudioMessage">Autoplay Audio Messages</string>-->
<!-- <string name="conversationsAutoplayAudioMessageDescription">Autoplay consecutively sent audio messages</string>-->
<!-- <string name="conversationsBlockedContacts">Blocked Contacts</string>-->
<!-- <string name="conversationsCommunities">Communities</string>-->
<!-- <string name="conversationsDelete">Delete Conversation</string>-->
<!-- <string name="conversationsDeleteDescription">Are you sure you want to delete your conversation with <b>{name}</b>? New messages from <b>{name}</b> will start a new conversation.</string>-->
<!-- <string name="conversationsDeleted">Conversation deleted</string>-->
<!-- <string name="conversationsEmpty">There are no messages in {conversation_name}.</string>-->
<!-- <string name="conversationsGroups">Groups</string>-->
<!-- <string name="conversationsMessageTrimming">Message Trimming</string>-->
<!-- <string name="conversationsMessageTrimmingTrimCommunities">Trim Communities</string>-->
<!-- <string name="conversationsMessageTrimmingTrimCommunitiesDescription">Delete messages from Community conversations older than 6 months, and where there are over 2,000 messages.</string>-->
<!-- <string name="conversationsNew">New Conversation</string>-->
<!-- <string name="conversationsNone">You don\'t have any conversations yet</string>-->
<!-- <string name="conversationsSendWithEnterKey">Send with Enter Key</string>-->
<!-- <string name="conversationsSendWithEnterKeyDescription">Tapping the Enter Key will send message instead of starting a new line.</string>-->
<!-- <string name="conversationsSettingsAllMedia">All Media</string>-->
<!-- <string name="conversationsSpellCheck">Spell Check</string>-->
<!-- <string name="conversationsSpellCheckDescription">Enable spell check when typing messages</string>-->
<!-- <string name="conversationsStart">Start Conversation</string>-->
<!-- <string name="copied">Copied</string>-->
<!-- <string name="copy">Copy</string>-->
<!-- <string name="create">Create</string>-->
<!-- <string name="cut">Cut</string>-->
<!-- <string name="databaseErrorGeneric">A database error occurred.\n\nExport your application logs to share for troubleshooting. If this is unsuccessful, reinstall {app_name} and restore your account.\n\nWarning: This will result in loss of all messages, attachments, and account data older than two weeks.</string>-->
<!-- <string name="databaseOptimizing">Optimizing Database</string>-->
<!-- <string name="decline">Decline</string>-->
<!-- <string name="delete">Delete</string>-->
<!-- <string name="deleteAfterGroupFirstReleaseConfigOutdated">Some of your devices are using outdated versions. Syncing may be unreliable until they are updated.</string>-->
<!-- <string name="deleteAfterGroupPR3DeleteMessagesConfirmation">Permanently delete the messages in this conversation?</string>-->
<!-- <string name="deleteAfterLegacyDisappearingMessagesLegacy">Legacy</string>-->
<!-- <string name="deleteAfterLegacyDisappearingMessagesOriginal">Original version of disappearing messages.</string>-->
<!-- <string name="deleteAfterLegacyDisappearingMessagesTheyChangedTimer"><b>{name}</b> set the disappearing message timer to <b>{time}</b></string>-->
<!-- <string name="deleteMessage">Delete Message</string>-->
<!-- <string name="deleteMessageConfirm">Are you sure you want to delete this message?</string>-->
<!-- <string name="deleteMessageDeleted">Message deleted</string>-->
<!-- <string name="deleteMessageDescriptionDevice">Are you sure you want to delete these messages from this device only?</string>-->
<!-- <string name="deleteMessageDescriptionEveryone">Are you sure you want to delete this message for everyone?</string>-->
<!-- <string name="deleteMessageDeviceOnly">Delete on this device only</string>-->
<!-- <string name="deleteMessageEveryone">Delete for everyone</string>-->
<!-- <string name="deleteMessages">Delete Messages</string>-->
<!-- <string name="deleteMessagesConfirm">Are you sure you want to delete these messages?</string>-->
<!-- <string name="deleteMessagesDeleted">Messages deleted</string>-->
<!-- <string name="deleteMessagesDescriptionDevice">Are you sure you want to delete these messages from your device?</string>-->
<!-- <string name="deleteMessagesDescriptionEveryone">Are you sure you want to delete these messages for everyone?</string>-->
<!-- <string name="deleting">Deleting</string>-->
<!-- <string name="developerToolsToggle">Toggle Developer Tools</string>-->
<!-- <string name="disappearingMessages">Disappearing Messages</string>-->
<!-- <string name="disappearingMessagesCountdownBigMobile">Auto-deletes in {time_large}</string>-->
<!-- <string name="disappearingMessagesCountdownBigSmallMobile">Auto-deletes in {time_large} {time_small}</string>-->
<!-- <string name="disappearingMessagesDeleteType">Delete Type</string>-->
<!-- <string name="disappearingMessagesDescription">This setting applies to everyone in this conversation.</string>-->
<!-- <string name="disappearingMessagesDescription1">This setting applies to messages you send in this conversation.</string>-->
<!-- <string name="disappearingMessagesDisappear">Disappear After {disappearing_messages_type} - {time}</string>-->
<!-- <string name="disappearingMessagesDisappearAfterRead">Disappear After Read</string>-->
<!-- <string name="disappearingMessagesDisappearAfterReadDescription">Messages delete after they have been read.</string>-->
<!-- <string name="disappearingMessagesDisappearAfterSend">Disappear After Send</string>-->
<!-- <string name="disappearingMessagesDisappearAfterSendDescription">Messages delete after they have been sent.</string>-->
<!-- <string name="disappearingMessagesFollowSetting">Follow Setting</string>-->
<!-- <string name="disappearingMessagesFollowSettingOff">Set your messages to disappear <b>{time}</b> after they have been <b>{disappearing_messages_type}</b>?</string>-->
<!-- <string name="disappearingMessagesFollowSettingOn">Set your messages to disappear <b>{time}</b> after they have been <b>{disappearing_messages_type}</b>?</string>-->
<!-- <string name="disappearingMessagesLegacy">{name} is using an outdated client. Disappearing messages may not work as expected.</string>-->
<!-- <string name="disappearingMessagesOnlyAdmins">Only group admins can change this setting.</string>-->
<!-- <string name="disappearingMessagesSent">Sent</string>-->
<!-- <string name="disappearingMessagesSet"><b>{name}</b> has set messages to disappear {time} after they have been {disappearing_messages_type}.</string>-->
<!-- <string name="disappearingMessagesSetYou"><b>You</b> set messages to disappear {time} after they have been {disappearing_messages_type}.</string>-->
<!-- <string name="disappearingMessagesTimer">Timer</string>-->
<!-- <string name="disappearingMessagesTurnedOff"><b>{name}</b> has turned disappearing messages off. Messages they send will no longer disappear.</string>-->
<!-- <string name="disappearingMessagesTurnedOffYou"><b>You</b> turned <b>off</b> disappearing messages. Messages you send will no longer disappear.</string>-->
<!-- <string name="disappearingMessagesTypeRead">read</string>-->
<!-- <string name="disappearingMessagesTypeSent">sent</string>-->
<!-- <string name="disappearingMessagesUpdated"><b>{admin_name}</b> updated disappearing message settings.</string>-->
<!-- <string name="disappearingMessagesUpdatedYou"><b>You</b> updated disappearing message settings.</string>-->
<!-- <string name="dismiss">Dismiss</string>-->
<!-- <string name="displayNameDescription">It can be your real name, an alias, or anything else you like — and you can change it at any time.</string>-->
<!-- <string name="displayNameEnter">Enter your display name</string>-->
<!-- <string name="displayNameErrorDescription">Please enter a display name</string>-->
<!-- <string name="displayNameErrorDescriptionShorter">Please enter a shorter display name</string>-->
<!-- <string name="displayNameErrorNew">We were unable to load your display name. Please enter a new display name to continue.</string>-->
<!-- <string name="displayNameNew">Pick a new display name</string>-->
<!-- <string name="displayNamePick">Pick your display name</string>-->
<!-- <string name="displayNameSet">Set Display Name</string>-->
<!-- <string name="document">Document</string>-->
<!-- <string name="done">Done</string>-->
<!-- <string name="download">Download</string>-->
<!-- <string name="downloading">Downloading...</string>-->
<!-- <string name="draft">Draft</string>-->
<!-- <string name="edit">Edit</string>-->
<!-- <string name="emojiAndSymbols">Emoji &amp; Symbols</string>-->
<!-- <string name="emojiCategoryActivities">Activities</string>-->
<!-- <string name="emojiCategoryAnimals">Animals &amp; Nature</string>-->
<!-- <string name="emojiCategoryFlags">Flags</string>-->
<!-- <string name="emojiCategoryFood">Food &amp; Drink</string>-->
<!-- <string name="emojiCategoryObjects">Objects</string>-->
<!-- <string name="emojiCategoryRecentlyUsed">Recently Used</string>-->
<!-- <string name="emojiCategorySmileys">Smileys &amp; People</string>-->
<!-- <string name="emojiCategorySymbols">Symbols</string>-->
<!-- <string name="emojiCategoryTravel">Travel &amp; Places</string>-->
<!-- <string name="emojiReactsCoolDown">Slow down! You\'ve sent too many emoji reacts. Try again soon</string>-->
<!-- <string name="emojiReactsNotification">Reacted to your message {emoji}</string>-->
<!-- <string name="enable">Enable</string>-->
<!-- <string name="errorConnection">Please check your internet connection and try again.</string>-->
<!-- <string name="errorCopyAndQuit">Copy Error and Quit</string>-->
<!-- <string name="errorDatabase">Database Error</string>-->
<!-- <string name="errorUnknown">An unknown error occurred.</string>-->
<!-- <string name="failures">Failures</string>-->
<!-- <string name="file">File</string>-->
<!-- <string name="files">Files</string>-->
<!-- <string name="followSystemSettings">Follow system settings</string>-->
<!-- <string name="from">From:</string>-->
<!-- <string name="fullScreenToggle">Toggle Full Screen</string>-->
<!-- <string name="gif">GIF</string>-->
<!-- <string name="giphyWarning">Giphy</string>-->
<!-- <string name="giphyWarningDescription">{app_name} will connect to Giphy to provide search results. You will not have full metadata protection when sending GIFs.</string>-->
<!-- <string name="groupAddMemberMaximum">Groups have a maximum of 100 members</string>-->
<!-- <string name="groupCreate">Create Group</string>-->
<!-- <string name="groupCreateErrorNoMembers">Please pick at least one other group member.</string>-->
<!-- <string name="groupDelete">Delete Group</string>-->
<!-- <string name="groupDeleteDescription">Are you sure you want to delete <b>{group_name}</b>? This will remove all members and delete all group content.</string>-->
<!-- <string name="groupDescriptionEnter">Enter a group description</string>-->
<!-- <string name="groupDisplayPictureUpdated">Group display picture updated.</string>-->
<!-- <string name="groupEdit">Edit Group</string>-->
<!-- <string name="groupError">Group Error</string>-->
<!-- <string name="groupErrorCreate">Failed to create group. Please check your internet connection and try again.</string>-->
<!-- <string name="groupErrorJoin">Failed to join {group_name}</string>-->
<!-- <string name="groupInformationSet">Set Group Information</string>-->
<!-- <string name="groupInviteDelete">Are you sure you want to delete this group invite?</string>-->
<!-- <string name="groupInviteFailed">Invite failed</string>-->
<!-- <string name="groupInviteFailedMore">Failed to invite {name} and {count} others to {group_name}</string>-->
<!-- <string name="groupInviteFailedTwo">Failed to invite {name} and {other_name} to {group_name}</string>-->
<!-- <string name="groupInviteFailedUser">Failed to invite {name} to {group_name}</string>-->
<!-- <string name="groupInviteSending">Sending invite</string>-->
<!-- <string name="groupInviteSent">Invite sent</string>-->
<!-- <string name="groupInviteVersion">Users must have version {version} or higher to receive invitations</string>-->
<!-- <string name="groupInviteYou"><b>You</b> were invited to join the group.</string>-->
<!-- <string name="groupLeave">Leave Group</string>-->
<!-- <string name="groupLeaveDescription">Are you sure you want to leave {group_name}?</string>-->
<!-- <string name="groupLeaveDescriptionAdmin">Are you sure you want to leave {group_name}? This will deactivate the group for all members.</string>-->
<!-- <string name="groupLeaveErrorFailed">Failed to leave {group_name}</string>-->
<!-- <string name="groupLegacyBanner">Groups have been upgraded, create a new group to upgrade. Old group functionality will be degraded from {date}.</string>-->
<!-- <string name="groupMemberLeft"><b>{name}</b> left the group.</string>-->
<!-- <string name="groupMemberLeftMore"><b>{name}</b> and <b>{count} others</b> left the group.</string>-->
<!-- <string name="groupMemberLeftTwo"><b>{name}</b> and <b>{other_name}</b> left the group.</string>-->
<!-- <string name="groupMemberMoreNew"><b>{name}</b> and <b>{count} others</b> joined the group.</string>-->
<!-- <string name="groupMemberNew"><b>{name}</b> joined the group.</string>-->
<!-- <string name="groupMemberTwoNew"><b>{name}</b> and <b>{other_name}</b> joined the group.</string>-->
<!-- <string name="groupMemberYouLeft"><b>You</b> left the group.</string>-->
<!-- <string name="groupMembers">Group Members</string>-->
<!-- <string name="groupMembersNone">There are no other members in this group.</string>-->
<!-- <string name="groupName">Group Name</string>-->
<!-- <string name="groupNameEnter">Enter a group name</string>-->
<!-- <string name="groupNameEnterPlease">Please enter a group name.</string>-->
<!-- <string name="groupNameEnterShorter">Please enter a shorter group name.</string>-->
<!-- <string name="groupNameNew">Group name is now {group_name}.</string>-->
<!-- <string name="groupNameUpdated">Group name updated.</string>-->
<!-- <string name="groupNoMessages">You have no messages from <b>{group_name}</b>. Send a message to start the conversation!</string>-->
<!-- <string name="groupOnlyAdmin">You are the only admin in <b>{group_name}</b>.\nGroup members and settings cannot be changed without an admin.</string>-->
<!-- <string name="groupPromotedYou"><b>You</b> were promoted to Admin.</string>-->
<!-- <string name="groupRemoveDescription">Would you like to remove <b>{name}</b> from <b>{group_name}</b>?</string>-->
<!-- <string name="groupRemoveMessages">Remove user and their messages</string>-->
<!-- <string name="groupRemoveMoreDescription">Would you like to remove <b>{name}</b> and <b>{count} others</b> from <b>{group_name}</b>?</string>-->
<!-- <string name="groupRemoveTwoDescription">Would you like to remove <b>{name}</b> and <b>{other_name}</b> from <b>{group_name}</b>?</string>-->
<!-- <string name="groupRemoveUserOnly">Remove user</string>-->
<!-- <string name="groupRemoveUsersMessages">Remove users and their messages</string>-->
<!-- <string name="groupRemoveUsersOnly">Remove users</string>-->
<!-- <string name="groupRemoved"><b>{name}</b> was removed from the group.</string>-->
<!-- <string name="groupRemovedMore"><b>{name}</b> and <b>{count}</b> others were removed from the group.</string>-->
<!-- <string name="groupRemovedTwo"><b>{name}</b> and <b>{other_name}</b> were removed from the group.</string>-->
<!-- <string name="groupRemovedYou">You were removed from <b>{group_name}</b>.</string>-->
<!-- <string name="groupSetDisplayPicture">Set Group Display Picture</string>-->
<!-- <string name="groupUnknown">Unknown Group</string>-->
<!-- <string name="groupUpdated">Group updated</string>-->
<!-- <string name="helpFAQ">FAQ</string>-->
<!-- <string name="helpHelpUsTranslateSession">Help us translate {app_name}</string>-->
<!-- <string name="helpReportABug">Report a bug</string>-->
<!-- <string name="helpReportABugDescription">Share some details to help us resolve your issue. Export your logs, then upload the file through {app_name}\'s Help Desk.</string>-->
<!-- <string name="helpReportABugExportLogs">Export Logs</string>-->
<!-- <string name="helpReportABugExportLogsDescription">Export your logs, then upload the file through {app_name}\'s Help Desk.</string>-->
<!-- <string name="helpSupport">Support</string>-->
<!-- <string name="helpWedLoveYourFeedback">We\'d love your feedback</string>-->
<!-- <string name="hide">Hide</string>-->
<!-- <string name="hideOthers">Hide Others</string>-->
<!-- <string name="image">Image</string>-->
<!-- <string name="incognitoKeyboard">Incognito Keyboard</string>-->
<!-- <string name="incognitoKeyboardDescription">Request incognito mode if available. Depending on the keyboard you are using, your keyboard may ignore this request.</string>-->
<!-- <string name="info">Info</string>-->
<!-- <string name="invalidShortcut">Invalid shortcut</string>-->
<!-- <string name="join">Join</string>-->
<!-- <string name="later">Later</string>-->
<!-- <string name="learnMore">Learn More</string>-->
<!-- <string name="leave">Leave</string>-->
<!-- <string name="leaving">Leaving...</string>-->
<!-- <string name="linkPreviews">Link Previews</string>-->
<!-- <string name="linkPreviewsDescription">Show link previews for supported URLs.</string>-->
<!-- <string name="linkPreviewsEnable">Enable Link Previews</string>-->
<!-- <string name="linkPreviewsErrorLoad">Unable to load link preview</string>-->
<!-- <string name="linkPreviewsErrorUnsecure">Preview not loaded for unsecure link</string>-->
<!-- <string name="linkPreviewsFirstDescription">Display previews for URLs you send and receive. This can be useful, however {app_name} must contact linked websites to generate previews. You can always turn off link previews in {app_name}\'s settings.</string>-->
<!-- <string name="linkPreviewsSend">Send Link Previews</string>-->
<!-- <string name="linkPreviewsSendModalDescription">You will not have full metadata protection when sending link previews.</string>-->
<!-- <string name="loadAccount">Load Account</string>-->
<!-- <string name="loadAccountProgressMessage">Loading your account</string>-->
<!-- <string name="lockApp">Lock App</string>-->
<!-- <string name="lockAppDescriptionAndroid">Require fingerprint, PIN, pattern or password to unlock {app_name}.</string>-->
<!-- <string name="lockAppEnablePasscode">You must enable a passcode in your iOS Settings in order to use Screen Lock.</string>-->
<!-- <string name="lockAppLocked">{app_name} is locked</string>-->
<!-- <string name="lockAppQuickResponse">Quick response unavailable when {app_name} is locked!</string>-->
<!-- <string name="lockAppStatus">Lock status</string>-->
<!-- <string name="lockAppUnlock">Tap to unlock</string>-->
<!-- <string name="lockAppUnlocked">{app_name} is unlocked</string>-->
<!-- <string name="max">Max</string>-->
<!-- <string name="media">Media</string>-->
<!-- <string name="membersAddAccountIdOrOns">Add Account ID or ONS</string>-->
<!-- <string name="membersInvite">Invite Contacts</string>-->
<!-- <string name="membersInviteSend">Send Invite</string>-->
<!-- <string name="membersInviteSendMultiple">Send Invites</string>-->
<!-- <string name="membersInviteShareDescription">Would you like to share group message history with <b>{name}</b>?</string>-->
<!-- <string name="membersInviteShareMessageHistory">Share message history</string>-->
<!-- <string name="membersInviteShareMoreDescription">Would you like to share group message history with <b>{name}</b> and <b>{count} others</b>?</string>-->
<!-- <string name="membersInviteShareNewMessagesOnly">Share new messages only</string>-->
<!-- <string name="membersInviteShareTwoDescription">Would you like to share group message history with <b>{name}</b> and <b>{other_name}</b>?</string>-->
<!-- <string name="membersInviteTitle">Invite</string>-->
<!-- <string name="message">Message</string>-->
<!-- <string name="messageEmpty">This message is empty.</string>-->
<!-- <string name="messageErrorDelivery">Message delivery failed</string>-->
<!-- <string name="messageErrorLimit">Message limit reached</string>-->
<!-- <string name="messageErrorOld">Received a message encrypted using an old version of {app_name} that is no longer supported. Please ask the sender to update to the most recent version and resend the message.</string>-->
<!-- <string name="messageErrorOriginal">Original message not found</string>-->
<!-- <string name="messageInfo">Message Info</string>-->
<!-- <string name="messageMarkRead">Mark read</string>-->
<!-- <string name="messageMarkUnread">Mark unread</string>-->
<!-- <string name="messageNew">New Message</string>-->
<!-- <string name="messageNewDescriptionMobile">Start a new conversation by entering your friend\'s Account ID, ONS or scanning their QR code.</string>-->
<!-- <string name="messageNewMessages">New Messages</string>-->
<!-- <string name="messageNewYouveGotA">You\'ve got a new message</string>-->
<!-- <string name="messageNewYouveGotMany">You\'ve got {count} new messages.</string>-->
<!-- <string name="messageReplyingTo">Replying to</string>-->
<!-- <string name="messageRequestGroupInvite"><b>{name}</b> invited you to join <b>{group_name}</b>.</string>-->
<!-- <string name="messageRequestGroupInviteDescription">Sending a message to this group will automatically accept the group invite.</string>-->
<!-- <string name="messageRequestPending">Your message request is currently pending.</string>-->
<!-- <string name="messageRequestPendingDescription">You will be able to send voice messages and attachments once the recipient has approved this message request.</string>-->
<!-- <string name="messageRequestYouHaveAccepted">You have accepted the message request from <b>{name}</b>.</string>-->
<!-- <string name="messageRequestsAcceptDescription">Sending a message to this user will automatically accept their message request and reveal your Account ID.</string>-->
<!-- <string name="messageRequestsAccepted">Your message request has been accepted.</string>-->
<!-- <string name="messageRequestsClearAllExplanation">Are you sure you want to clear all message and group invites?</string>-->
<!-- <string name="messageRequestsCommunities">Community Message Requests</string>-->
<!-- <string name="messageRequestsCommunitiesDescription">Allow message requests from Community conversations.</string>-->
<!-- <string name="messageRequestsDelete">Are you sure you want to delete this message request?</string>-->
<!-- <string name="messageRequestsNew">You have a new message request</string>-->
<!-- <string name="messageRequestsNonePending">No pending message requests</string>-->
<!-- <string name="messageRequestsTurnedOff"><b>{name}</b> has message requests from Community conversations turned off, so you cannot send them a message.</string>-->
<!-- <string name="messageSelect">Select Message</string>-->
<!-- <string name="messageStatusFailedToSend">Failed to send</string>-->
<!-- <string name="messageStatusFailedToSync">Failed to sync</string>-->
<!-- <string name="messageStatusSyncing">Syncing</string>-->
<!-- <string name="messageStatusUploading">Uploading</string>-->
<!-- <string name="messageUnread">Unread messages</string>-->
<!-- <string name="messageVoice">Voice Message</string>-->
<!-- <string name="messageVoiceErrorShort">Hold to record a voice message</string>-->
<!-- <string name="messageVoiceSlideToCancel">Slide to Cancel</string>-->
<!-- <string name="messages">Messages</string>-->
<!-- <string name="minimize">Minimize</string>-->
<!-- <string name="next">Next</string>-->
<!-- <string name="nicknameDescription">Choose a nickname for {name}. This will appear to you in your one-to-one and group conversations.</string>-->
<!-- <string name="nicknameEnter">Enter nickname</string>-->
<!-- <string name="nicknameSet">Set Nickname</string>-->
<!-- <string name="no">No</string>-->
<!-- <string name="noSuggestions">No Suggestions</string>-->
<!-- <string name="none">None</string>-->
<!-- <string name="notNow">Not now</string>-->
<!-- <string name="noteToSelf">Note to Self</string>-->
<!-- <string name="noteToSelfEmpty">You have no messages in Note to Self.</string>-->
<!-- <string name="noteToSelfHide">Hide Note to Self</string>-->
<!-- <string name="noteToSelfHideDescription">Are you sure you want to hide Note to Self?</string>-->
<!-- <string name="notificationsAllMessages">All Messages</string>-->
<!-- <string name="notificationsAndroidSystem">{message_count} new messages in {conversation_count} conversations</string>-->
<!-- <string name="notificationsContent">Notification Content</string>-->
<!-- <string name="notificationsContentDescription">The information shown in notifications.</string>-->
<!-- <string name="notificationsContentShowNameAndContent">Name and Content</string>-->
<!-- <string name="notificationsContentShowNameOnly">Name Only</string>-->
<!-- <string name="notificationsContentShowNoNameOrContent">No Name or Content</string>-->
<!-- <string name="notificationsFastMode">Fast Mode</string>-->
<!-- <string name="notificationsFastModeDescriptionAndroid">You\'ll be notified of new messages reliably and immediately using Google\'s notification Servers.</string>-->
<!-- <string name="notificationsGoToDevice">Go to device notification settings</string>-->
<!-- <string name="notificationsLedColor">LED color</string>-->
<!-- <string name="notificationsMentionsOnly">Mentions Only</string>-->
<!-- <string name="notificationsMessage">Message notifications</string>-->
<!-- <string name="notificationsMostRecent">Most recent from {name}</string>-->
<!-- <string name="notificationsMute">Mute</string>-->
<!-- <string name="notificationsMuteFor">Mute for {time_large}</string>-->
<!-- <string name="notificationsMuteUnmute">Unmute</string>-->
<!-- <string name="notificationsMuted">Muted</string>-->
<!-- <string name="notificationsSlowMode">Slow Mode</string>-->
<!-- <string name="notificationsSlowModeDescription">{app_name} will occasionally check for new messages in the background.</string>-->
<!-- <string name="notificationsSound">Sound</string>-->
<!-- <string name="notificationsSoundDescription">Sound when App is open</string>-->
<!-- <string name="notificationsStrategy">Notification Strategy</string>-->
<!-- <string name="notificationsStyle">Notification Style</string>-->
<!-- <string name="notificationsVibrate">Vibrate</string>-->
<!-- <string name="off">Off</string>-->
<!-- <string name="onboardingAccountCreate">Create account</string>-->
<!-- <string name="onboardingAccountCreated">Account Created</string>-->
<!-- <string name="onboardingAccountExists">I have an account</string>-->
<!-- <string name="onboardingBackAccountCreation">You cannot go back further. In order to cancel your account creation, {app_name} needs to quit.</string>-->
<!-- <string name="onboardingBubbleCreatingAnAccountIsEasy">Creating an account is instant, free, and anonymous</string>-->
<!-- <string name="onboardingBubbleNoPhoneNumber">You don\'t even need a phone number to sign up.</string>-->
<!-- <string name="onboardingBubblePrivacyInYourPocket">Privacy in your pocket.</string>-->
<!-- <string name="onboardingBubbleSessionIsEngineered">{app_name} is engineered to protect your privacy.</string>-->
<!-- <string name="onboardingBubbleWelcomeToSession">Welcome to {app_name}</string>-->
<!-- <string name="onboardingHitThePlusButton">Hit the plus button to start a chat, create a group, or join an official community!</string>-->
<!-- <string name="onboardingMessageNotificationExplanation">There are two ways {app_name} can notify you of new messages.</string>-->
<!-- <string name="onboardingPrivacy">Privacy Policy</string>-->
<!-- <string name="onboardingTos">Terms of Service</string>-->
<!-- <string name="onboardingTosPrivacy">By using this service, you agree to our <b>Terms of Service</b> and <b>Privacy Policy</b></string>-->
<!-- <string name="onionRoutingPath">Path</string>-->
<!-- <string name="onionRoutingPathDescription">{app_name} hides your IP by routing your messages through multiple service nodes in {app_name}\'s decentralized network. This is your current path:</string>-->
<!-- <string name="onionRoutingPathDestination">Destination</string>-->
<!-- <string name="onionRoutingPathEntryNode">Entry Node</string>-->
<!-- <string name="onionRoutingPathServiceNode">Service Node</string>-->
<!-- <string name="onionRoutingPathUnknownCountry">Unknown Country</string>-->
<!-- <string name="onsErrorNotRecognized">We couldn\'t recognize this ONS. Please check it and try again.</string>-->
<!-- <string name="onsErrorUnableToSearch">We were unable to search for this ONS. Please try again later.</string>-->
<!-- <string name="open">Open</string>-->
<!-- <string name="other">Other</string>-->
<!-- <string name="passwordChange">Change Password</string>-->
<!-- <string name="passwordChangeDescription">Change the password required to unlock {app_name}.</string>-->
<!-- <string name="passwordChangedDescription">Your password has been changed. Please keep it safe.</string>-->
<!-- <string name="passwordConfirm">Confirm password</string>-->
<!-- <string name="passwordCreate">Create your password</string>-->
<!-- <string name="passwordCurrentIncorrect">Your current password is incorrect.</string>-->
<!-- <string name="passwordDescription">Require password to unlock {app_name}.</string>-->
<!-- <string name="passwordEnterCurrent">Please enter your current password.</string>-->
<!-- <string name="passwordEnterNew">Please enter your new password</string>-->
<!-- <string name="passwordError">Password must only contain letters, numbers and symbols</string>-->
<!-- <string name="passwordErrorLength">Password must be between 6 and 64 characters long</string>-->
<!-- <string name="passwordErrorMatch">Passwords do not match</string>-->
<!-- <string name="passwordFailed">Failed to set password</string>-->
<!-- <string name="passwordIncorrect">Incorrect password</string>-->
<!-- <string name="passwordRemove">Remove Password</string>-->
<!-- <string name="passwordRemoveDescription">Remove the password required to unlock Session.</string>-->
<!-- <string name="passwordRemovedDescription">Your password has been removed.</string>-->
<!-- <string name="passwordSet">Set Password</string>-->
<!-- <string name="passwordSetDescription">Your password has been set. Please keep it safe.</string>-->
<!-- <string name="paste">Paste</string>-->
<!-- <string name="permissionsAutoUpdate">Auto Update</string>-->
<!-- <string name="permissionsAutoUpdateDescription">Automatically check for updates on startup</string>-->
<!-- <string name="permissionsKeepInSystemTray">Keep in System Tray</string>-->
<!-- <string name="permissionsMicrophone">Microphone</string>-->
<!-- <string name="permissionsMicrophoneAccessRequired">Microphone Access Required</string>-->
<!-- <string name="permissionsMicrophoneAccessRequiredAndroid">{app_name} needs microphone access to send audio messages, but it has been permanently denied. Please continue to app settings, select \"Permissions\", and enable \"Microphone\".</string>-->
<!-- <string name="permissionsMicrophoneDescription">Allow access to microphone</string>-->
<!-- <string name="permissionsRequired">Permission required</string>-->
<!-- <string name="permissionsStorageSaveDenied">{app_name} needs storage access in order to save to external storage, but it has been permanently denied. Please continue to app settings, select \"Permissions\", and enable \"Storage\".</string>-->
<!-- <string name="permissionsStorageSend">{app_name} needs storage access to send photos and videos.</string>-->
<!-- <string name="photo">Photo</string>-->
<!-- <string name="pin">Pin</string>-->
<!-- <string name="pinConversation">Pin Conversation</string>-->
<!-- <string name="pinUnpin">Unpin</string>-->
<!-- <string name="pinUnpinConversation">Unpin Conversation</string>-->
<!-- <string name="preview">Preview</string>-->
<!-- <string name="profile">Profile</string>-->
<!-- <string name="profileDisplayPicture">Display Picture</string>-->
<!-- <string name="profileDisplayPictureRemoveError">Failed to remove display picture.</string>-->
<!-- <string name="profileDisplayPictureSet">Set Display Picture</string>-->
<!-- <string name="profileErrorUpdate">Failed to update profile.</string>-->
<!-- <string name="promote">Promote</string>-->
<!-- <string name="qrCode">QR Code</string>-->
<!-- <string name="qrNotAccountId">This QR code does not contain an Account ID</string>-->
<!-- <string name="qrNotRecoveryPassword">This QR code does not contain a Recovery Password</string>-->
<!-- <string name="qrScan">Scan QR Code</string>-->
<!-- <string name="qrView">View QR</string>-->
<!-- <string name="qrYoursDescription">Friends can message you by scanning your QR code.</string>-->
<!-- <string name="quit">Quit</string>-->
<!-- <string name="read">Read</string>-->
<!-- <string name="readReceipts">Read Receipts</string>-->
<!-- <string name="readReceiptsDescription">Show read receipts for all messages you send and receive.</string>-->
<!-- <string name="received">Received:</string>-->
<!-- <string name="recommended">Recommended</string>-->
<!-- <string name="recoveryPasswordBannerDescription">Save your recovery password to make sure you don\'t lose access to your account.</string>-->
<!-- <string name="recoveryPasswordBannerTitle">Save your recovery password</string>-->
<!-- <string name="recoveryPasswordDescription">Use your recovery password to load your account on new devices. Your account cannot be recovered without your recovery password. Make sure it\'s stored somewhere safe and secure — and don\'t share it with anyone.</string>-->
<!-- <string name="recoveryPasswordEnter">Enter your recovery password</string>-->
<!-- <string name="recoveryPasswordErrorMessageGeneric">Please check your recovery password and try again.</string>-->
<!-- <string name="recoveryPasswordErrorMessageIncorrect">Some of the words in your Recovery Password are incorrect. Please check and try again.</string>-->
<!-- <string name="recoveryPasswordErrorMessageShort">The Recovery Password you entered is not long enough. Please check and try again.</string>-->
<!-- <string name="recoveryPasswordErrorTitle">Incorrect Recovery Password</string>-->
<!-- <string name="recoveryPasswordExplanation">To load your account, enter your recovery password.</string>-->
<!-- <string name="recoveryPasswordHidePermanently">Hide Recovery Password Permanently</string>-->
<!-- <string name="recoveryPasswordHidePermanentlyDescription1">Without your recovery password, you cannot load your account on new devices. We strongly recommend you save your recovery password in a safe and secure place before continuing.</string>-->
<!-- <string name="recoveryPasswordHidePermanentlyDescription2">Are you sure you want to permanently hide your recovery password on this device? This cannot be undone.</string>-->
<!-- <string name="recoveryPasswordHideRecoveryPassword">Hide Recovery Password</string>-->
<!-- <string name="recoveryPasswordHideRecoveryPasswordDescription">Permanently hide your recovery password on this device.</string>-->
<!-- <string name="recoveryPasswordRestoreDescription">Enter your recovery password to load your account. If you haven\'t saved it, you can find it in your app settings.</string>-->
<!-- <string name="recoveryPasswordView">View Password</string>-->
<!-- <string name="recoveryPasswordWarningSendDescription">This is your recovery password. If you send it to someone they\'ll have full access to your account.</string>-->
<!-- <string name="redo">Redo</string>-->
<!-- <string name="remove">Remove</string>-->
<!-- <string name="reply">Reply</string>-->
<!-- <string name="resend">Resend</string>-->
<!-- <string name="resolving">Loading country information...</string>-->
<!-- <string name="restart">Restart</string>-->
<!-- <string name="resync">Resync</string>-->
<!-- <string name="retry">Retry</string>-->
<!-- <string name="save">Save</string>-->
<!-- <string name="saved">Saved</string>-->
<!-- <string name="savedMessages">Saved messages</string>-->
<!-- <string name="saving">Saving...</string>-->
<!-- <string name="scan">Scan</string>-->
<!-- <string name="screenSecurity">Screen Security</string>-->
<!-- <string name="screenshotNotifications">Screenshot Notifications</string>-->
<!-- <string name="screenshotNotificationsDescription">Require a notification when a contact takes a screenshot of a one-to-one chat.</string>-->
<!-- <string name="screenshotTaken"><b>{name}</b> took a screenshot.</string>-->
<!-- <string name="search">Search</string>-->
<!-- <string name="searchContacts">Search Contacts</string>-->
<!-- <string name="searchConversation">Search Conversation</string>-->
<!-- <string name="searchEnter">Please enter your search.</string>-->
<!-- <string name="searchMatchesNone">No results found.</string>-->
<!-- <string name="searchMatchesNoneSpecific">No results found for {query}</string>-->
<!-- <string name="searchMembers">Search Members</string>-->
<!-- <string name="searchSearching">Searching...</string>-->
<!-- <string name="select">Select</string>-->
<!-- <string name="selectAll">Select All</string>-->
<!-- <string name="send">Send</string>-->
<!-- <string name="sending">Sending</string>-->
<!-- <string name="sent">Sent:</string>-->
<!-- <string name="sessionAppearance">Appearance</string>-->
<!-- <string name="sessionClearData">Clear Data</string>-->
<!-- <string name="sessionConversations">Conversations</string>-->
<!-- <string name="sessionHelp">Help</string>-->
<!-- <string name="sessionInviteAFriend">Invite a Friend</string>-->
<!-- <string name="sessionMessageRequests">Message Requests</string>-->
<!-- <string name="sessionNotifications">Notifications</string>-->
<!-- <string name="sessionPermissions">Permissions</string>-->
<!-- <string name="sessionPrivacy">Privacy</string>-->
<!-- <string name="sessionRecoveryPassword">Recovery Password</string>-->
<!-- <string name="sessionSettings">Settings</string>-->
<!-- <string name="set">Set</string>-->
<!-- <string name="settingsRestartDescription">You must restart {app_name} to apply your new settings.</string>-->
<!-- <string name="share">Share</string>-->
<!-- <string name="shareAccountIdDescription">Invite your friend to chat with you on {app_name} by sharing your Account ID with them.</string>-->
<!-- <string name="shareToSession">Share to {app_name}</string>-->
<!-- <string name="show">Show</string>-->
<!-- <string name="showAll">Show All</string>-->
<!-- <string name="showLess">Show Less</string>-->
<!-- <string name="stickers">Stickers</string>-->
<!-- <string name="supportGoTo">Go to Support Page</string>-->
<!-- <string name="theContinue">Continue</string>-->
<!-- <string name="theDefault">Default</string>-->
<!-- <string name="theError">Error</string>-->
<!-- <string name="tryAgain">Try Again</string>-->
<!-- <string name="typingIndicators">Typing Indicators</string>-->
<!-- <string name="typingIndicatorsDescription">See and share typing indicators (...)</string>-->
<!-- <string name="undo">Undo</string>-->
<!-- <string name="unknown">Unknown</string>-->
<!-- <string name="updateApp">App updates</string>-->
<!-- <string name="updateDownloaded">Updated installed, click to restart</string>-->
<!-- <string name="updateError">Cannot Update</string>-->
<!-- <string name="updateNewVersion">A new version of {app_name} is available, tap to update</string>-->
<!-- <string name="updateNewVersionDescription">There is a new version of {app_name} available.</string>-->
<!-- <string name="updateReleaseNotes">Go to Release Notes</string>-->
<!-- <string name="updateSession">{app_name} Update</string>-->
<!-- <string name="updateVersion">Version {version}</string>-->
<!-- <string name="urlCopy">Copy URL</string>-->
<!-- <string name="urlOpen">Open URL</string>-->
<!-- <string name="urlOpenBrowser">This will open in your browser.</string>-->
<!-- <string name="urlOpenDescription">Are you sure you want to open this URL in your browser?\n\n{url}</string>-->
<!-- <string name="useFastMode">Use Fast Mode</string>-->
<!-- <string name="video">Video</string>-->
<!-- <string name="videoErrorPlay">Unable to play video.</string>-->
<!-- <string name="view">View</string>-->
<!-- <string name="waitFewMinutes">This can take a few minutes.</string>-->
<!-- <string name="waitOneMoment">One moment please...</string>-->
<!-- <string name="warning">Warning</string>-->
<!-- <string name="window">Window</string>-->
<!-- <string name="yes">Yes</string>-->
<!-- <string name="you">You</string>-->
<!--</resources>-->
<!--
Crowdin strings circa 2024-08-22
NOTE: Strings with blank lines have manually been replaced with '\n\n' - this will be fixed in the Android export script in the future
-->
<resources>
<!-- We need a non-translatable app_name string because we cannot get the NonTranslatableStringConstants.APP_NAME
value for use in the AndroidManifest to name the app! -->
<string name="app_name" translatable="false">Session</string>
<string name="about">About</string>
<string name="accept">Accept</string>
<string name="accountIDCopy">Copy Account ID</string>
@ -1233,7 +498,7 @@ NOTE: Strings with blank lines have manually been replaced with '\n\n' - this wi
<string name="loadAccountProgressMessage">Loading your account</string>
<string name="loading">Loading...</string>
<string name="lockApp">Lock App</string>
<string name="lockAppDescriptionAndroid">Require fingerprint, PIN, pattern or password to unlock {app_name}.</string>
<string name="lockAppDescription">Require fingerprint, PIN, pattern or password to unlock {app_name}.</string>
<string name="lockAppDescriptionIos">Require Touch ID, Face ID or your passcode to unlock {app_name}.</string>
<string name="lockAppEnablePasscode">You must enable a passcode in your iOS Settings in order to use Screen Lock.</string>
<string name="lockAppLocked">{app_name} is locked</string>
@ -1317,14 +582,14 @@ NOTE: Strings with blank lines have manually been replaced with '\n\n' - this wi
<string name="noteToSelfHide">Hide Note to Self</string>
<string name="noteToSelfHideDescription">Are you sure you want to hide Note to Self?</string>
<string name="notificationsAllMessages">All Messages</string>
<string name="notificationsAndroidSystem">{message_count} new messages in {conversation_count} conversations</string>
<string name="notificationsSystem">{message_count} new messages in {conversation_count} conversations</string>
<string name="notificationsContent">Notification Content</string>
<string name="notificationsContentDescription">The information shown in notifications.</string>
<string name="notificationsContentShowNameAndContent">Name and Content</string>
<string name="notificationsContentShowNameOnly">Name Only</string>
<string name="notificationsContentShowNoNameOrContent">No Name or Content</string>
<string name="notificationsFastMode">Fast Mode</string>
<string name="notificationsFastModeDescriptionAndroid">You\'ll be notified of new messages reliably and immediately using Google\'s notification Servers.</string>
<string name="notificationsFastModeDescription">You\'ll be notified of new messages reliably and immediately using Google\'s notification Servers.</string>
<string name="notificationsFastModeDescriptionIos">You\'ll be notified of new messages reliably and immediately using Apple\'s notification Servers.</string>
<string name="notificationsGoToDevice">Go to device notification settings</string>
<string name="notificationsIosGroup">{name} to {conversation_name}</string>
@ -1402,7 +667,7 @@ NOTE: Strings with blank lines have manually been replaced with '\n\n' - this wi
<string name="permissionsKeepInSystemTrayDescription">{app_name} continues running in the background when you close the window</string>
<string name="permissionsLibrary">{app_name} needs photo library access to continue. You can enable access in the iOS settings.</string>
<string name="permissionsMicrophone">Microphone</string>
<string name="permissionsMicrophoneAccessRequiredAndroid">{app_name} needs microphone access to send audio messages, but it has been permanently denied. Please continue to app settings, select \"Permissions\", and enable \"Microphone\".</string>
<string name="permissionsMicrophoneAccessRequired">{app_name} needs microphone access to send audio messages, but it has been permanently denied. Please continue to app settings, select \"Permissions\", and enable \"Microphone\".</string>
<string name="permissionsMicrophoneDescription">Allow access to microphone</string>
<string name="permissionsRequired">Permission required</string>
<string name="permissionsStorageSave">{app_name} needs storage access to save attachments and media.</string>
@ -1556,8 +821,4 @@ NOTE: Strings with blank lines have manually been replaced with '\n\n' - this wi
<!-- Missing from CrowdIn circa 2024-08-22 -->
<string name="messageStatusUploading">Uploading</string>
<!-- We need a non-translatable app_name string because we cannot get the NonTranslatableStringConstants.APP_NAME
value for use in the AndroidManifest to name the app! -->
<string name="app_name" translatable="false">Session</string>
</resources>